diff --git a/bin/aws-sso-extensions-for-enterprise.ts b/bin/aws-sso-extensions-for-enterprise.ts index 9fbad71..85269c7 100644 --- a/bin/aws-sso-extensions-for-enterprise.ts +++ b/bin/aws-sso-extensions-for-enterprise.ts @@ -4,12 +4,12 @@ import { App, DefaultStackSynthesizer, Tags } from "aws-cdk-lib"; import { readFileSync } from "fs"; import { resolve } from "path"; import { BuildConfig } from "../lib/build/buildConfig"; +import { RegionSwitchBuildConfig } from "../lib/build/regionSwitchBuildConfig"; import { AwsSsoExtensionsForEnterprise } from "../lib/stacks/pipeline/aws-sso-extensions-for-enterprise"; +import { AwsSsoExtensionsRegionSwitchDeploy } from "../lib/stacks/region-switch/aws-sso-extensions-region-switch-deploy"; +import { AwsSsoExtensionsRegionSwitchDiscover } from "../lib/stacks/region-switch/aws-sso-extensions-region-switch-discover"; import yaml = require("js-yaml"); -import { RegionSwitchBuildConfig } from "../lib/build/regionSwitchBuildConfig"; -import { AwsSsoExtensionsRegionSwitchDiscover } from "../lib/stacks/region-switch/aws-sso-extensions-region-switch-discover"; -import { AwsSsoExtensionsRegionSwitchDeploy } from "../lib/stacks/region-switch/aws-sso-extensions-region-switch-deploy"; const app = new App(); function ensureString( @@ -177,6 +177,11 @@ function getConfig() { unparsedEnv["Parameters"], "SupportNestedOU" ), + FunctionLogMode: ensureValidString( + unparsedEnv["Parameters"], + "FunctionLogMode", + ["INFO", "WARN", "DEBUG", "EXCEPTION"] + ), }, }; diff --git a/config/env.yaml b/config/env.yaml index cdd93f8..37606b5 100644 --- a/config/env.yaml +++ b/config/env.yaml @@ -1,7 +1,7 @@ --- App: "aws-sso-extensions-for-enterprise" Environment: "env" -Version: "3.1.5" +Version: "3.1.6" PipelineSettings: BootstrapQualifier: "" # For example: 'ssoutility' @@ -28,3 +28,4 @@ Parameters: ImportCurrentSSOConfiguration: false # Set this to true if you want the solution to do a one-time import of your current AWS SSO permission sets and account assignments. Refer to "Import existing AWS SSO access entitlements for management through the solution" section under "Features" in README.md for details UpgradeFromVersionLessThanV303: false # Should be set to true, if upgrading from solution version 3.0.2/earlier SupportNestedOU: false # Set this to true if your preference is for the solution to support nested OU's as part of account assignments. Refer to "Enterprise friendly account assignment life cycle" and "Automated access change management for root, ou_id and account_tag scopes" sections under "Features" in README.md for details + FunctionLogMode: "Info" # Used for configuring lambda function logging level. Alowed values - ["Debug","Info","Warn","Exception"] diff --git a/lib/build/buildConfig.ts b/lib/build/buildConfig.ts index b7082d6..384bd7b 100644 --- a/lib/build/buildConfig.ts +++ b/lib/build/buildConfig.ts @@ -1,19 +1,18 @@ -/* -Build parameters interface definition -To enable easier sharing between constructs and stacks as well as -synth and deploy validations -*/ - +/** + * Build parameters inteface Used for validating configuration files at + * synthesis time for correctness of data type and data ranges/values + */ export interface BuildConfig { - readonly App: string; - readonly Environment: string; - readonly Version: string; + readonly App: string /** Used as prefix for resource and stack names */; + readonly Environment: string /** Used as prefix for resource and stack names */; + readonly Version: string /** Used for aligning with github version */; readonly PipelineSettings: PipelineSettings; readonly Parameters: Parameters; } +/** Pipeline specific parameters */ export interface PipelineSettings { - readonly BootstrapQualifier: string; + readonly BootstrapQualifier: string /** CDK bootstrap qualifier to deploy the solution */; readonly DeploymentAccountId: string; readonly DeploymentAccountRegion: string; readonly TargetAccountId: string; @@ -21,21 +20,44 @@ export interface PipelineSettings { readonly SSOServiceAccountId: string; readonly SSOServiceAccountRegion: string; readonly OrgMainAccountId: string; - readonly RepoArn: string; - readonly RepoBranchName: string; - readonly SynthCommand: string; + readonly RepoArn: string /** AWS CodeCommit source code repository ARN */; + readonly RepoBranchName: string /** AWS CodeCommit source code repository branch */; + readonly SynthCommand: string /** CDK synthesise command */; } +/** Solution specific parameters */ export interface Parameters { - readonly LinksProvisioningMode: string; - readonly PermissionSetProvisioningMode: string; + readonly LinksProvisioningMode: string /** Account assignments provisioning mode - accepted values are one of ["api", "s3"] */; + readonly PermissionSetProvisioningMode: string /** Permission set provisioning mode - accepted values are one of ["api", "s3"] */; readonly LinkCallerRoleArn: string; + /** + * IAM role arn created in target account with permissions to upload account + * assignments to S3/API interfaces + */ readonly PermissionSetCallerRoleArn: string; - readonly NotificationEmail: string; - readonly AccountAssignmentVisibilityTimeoutHours: number; + /** + * IAM role arn created in target account with permissions to upload + * permission sets to S3/API interfaces + */ + readonly NotificationEmail: string /** Notification email used by solution to send error notifications etc */; + readonly AccountAssignmentVisibilityTimeoutHours: number /** Visibility timeout parameter , used for scaling the solution in large enterprises */; readonly IsAdUsed: boolean; readonly DomainName: string; readonly ImportCurrentSSOConfiguration: boolean; + /** + * Used as switch to do a one-time import of all AWS SSO account assignments + * and permission sets into the solution + */ readonly UpgradeFromVersionLessThanV303: boolean; + /** + * Used as switch to do one-time format upgrade of all the account assignments + * that the solution provisioned and persisted in DynamoDB + */ readonly SupportNestedOU: boolean; + /** + * Used as switch to determine whether OU traversal is parent level only (or) + * full tree traversal + */ + readonly FunctionLogMode: string; + /** Used as switch to set the level of lambda function logging the solution should use */ } diff --git a/lib/build/regionSwitchBuildConfig.ts b/lib/build/regionSwitchBuildConfig.ts index 61bf0c3..41f1d66 100644 --- a/lib/build/regionSwitchBuildConfig.ts +++ b/lib/build/regionSwitchBuildConfig.ts @@ -1,11 +1,10 @@ -/* -Build parameters interface definition -To enable easier sharing between constructs and stacks as well as -synth and deploy validations -*/ +/** + * Build parameters inteface Used for validating configuration files at + * synthesis time for correctness of data type and data ranges/values + */ export interface RegionSwitchBuildConfig { - readonly BootstrapQualifier: string; + readonly BootstrapQualifier: string /** CDK bootstrap qualifier */; readonly SSOServiceAccountId: string; readonly SSOServiceAccountRegion: string; readonly SSOServiceTargetAccountRegion: string; diff --git a/lib/constructs/access-manager.ts b/lib/constructs/access-manager.ts index 2048bd8..3c5caf6 100644 --- a/lib/constructs/access-manager.ts +++ b/lib/constructs/access-manager.ts @@ -1,8 +1,11 @@ -/* -All access granting within the solution artefacts stack is consolidated -here to facilitate easier management and visibility -*/ - +/** + * This construct manages access entitlements between different resources + * created by the solution as part of "Solution-Artefacts" stack in "target" + * account Where feasible, access management is centralised in this construct. + * Exceptions are when the underlying resources cannot be referenced in the + * "Solution-Artefacts" stack, or when managing access entitlements this way + * creates circular dependencies + */ import { PolicyStatement } from "aws-cdk-lib/aws-iam"; import { Construct } from "constructs"; import { FetchCrossStackValues } from "./fetch-cross-stack-values"; @@ -27,7 +30,10 @@ export class AccessManager extends Construct { ) { super(scope, id); - // Link Manager Handler access + /** + * All required access for account assignment provisioning handler + * lib/lambda-functions/application-handlers/linkManager.ts + */ accessManagerProps.FetchCrossStackValues.queuesKey.grantEncryptDecrypt( accessManagerProps.LinkProcessor.linkManagerHandler ); @@ -64,7 +70,10 @@ export class AccessManager extends Construct { }) ); - // Permission Set Topic Handler access + /** + * All required access for permission set provisioning handler + * lib/lambda-functions/application-handlers/permissionSetTopicProcessor.ts + */ accessManagerProps.FetchCrossStackValues.snsTopicsKey.grantEncryptDecrypt( accessManagerProps.PermissionSetProcessor.permissionSetTopicProcessor ); @@ -101,7 +110,10 @@ export class AccessManager extends Construct { }) ); - // SSO Group Handler access + /** + * All required access for self-sustaining flow on AWS SSO group + * creation/deletion lib/lambda-functions/application-handlers/groupsCud.ts + */ accessManagerProps.FetchCrossStackValues.queuesKey.grantEncryptDecrypt( accessManagerProps.SSOGroupProcessor.ssoGroupHandler ); @@ -133,7 +145,10 @@ export class AccessManager extends Construct { }) ); - // SSO User Handler access + /** + * All required access for self-sustaining flow on AWS SSO user + * creation/deletion lib/lambda-functions/application-handlers/usersCud.ts + */ accessManagerProps.FetchCrossStackValues.queuesKey.grantEncryptDecrypt( accessManagerProps.SSOGroupProcessor.ssoUserHandler ); @@ -167,7 +182,10 @@ export class AccessManager extends Construct { }) ); - // Link topic processor access + /** + * All required access for account assignment dispatch handler + * lib/lambda-functions/application-handlers/linkTopicProcessor.ts + */ accessManagerProps.FetchCrossStackValues.queuesKey.grantEncryptDecrypt( accessManagerProps.LinkProcessor.linkTopicProcessor ); @@ -201,7 +219,11 @@ export class AccessManager extends Construct { }) ); - // Org Events Handler Access + /** + * All required access for self-sustaining flow on org events - + * CreateAccount, MoveAccount, account tag operations + * lib/lambda-functions/application-handlers/orgEvents.ts + */ accessManagerProps.FetchCrossStackValues.queuesKey.grantEncryptDecrypt( accessManagerProps.OrgEvents.orgEventsHandler ); @@ -239,7 +261,10 @@ export class AccessManager extends Construct { }) ); - // Permission Set Sync Handler access + /** + * All required access for self-sustaining flow on permission set changes + * lib/lambda-functions/application-handlers/permissionSetSync.ts + */ accessManagerProps.FetchCrossStackValues.queuesKey.grantEncryptDecrypt( accessManagerProps.PermissionSetProcessor.permissionSetSyncHandler ); @@ -271,7 +296,11 @@ export class AccessManager extends Construct { }) ); - //Process Target account SM Listener access + /** + * All required access for account assignment dispatcher on target account + * list discovery + * lib/lambda-functions/application-handlers/processTargetAccountSMListener.ts + */ accessManagerProps.FetchCrossStackValues.queuesKey.grantEncryptDecrypt( accessManagerProps.LinkProcessor.processTargetAccountSMListenerHandler ); diff --git a/lib/constructs/cross-account-role.ts b/lib/constructs/cross-account-role.ts index 6b591a0..a7b57c0 100644 --- a/lib/constructs/cross-account-role.ts +++ b/lib/constructs/cross-account-role.ts @@ -1,18 +1,16 @@ -/* -Cross account role construct that sets -policy document,assume role account details as received in -props and also creates a parameter using the SSMParamWriter -construct and value set to rolearn -*/ +/** + * Custom CDK construct that enables creating AWS IAM Roles that could be + * assumed by cross-account prinicpals. This construct sets the policy document, + * assume role account details as received in props and also creates an AWS SSM + * parameter with cross-account read access (using SSMParamWriter construct) + * with the roleArn value + */ import { AccountPrincipal, PolicyStatement, Role } from "aws-cdk-lib/aws-iam"; import { Construct } from "constructs"; import { BuildConfig } from "../build/buildConfig"; import { SSMParamWriter } from "./ssm-param-writer"; - -function name(buildConfig: BuildConfig, resourcename: string): string { - return buildConfig.Environment + "-" + resourcename; -} +import { name } from "./helpers"; export interface CrossAccountRoleProps { readonly assumeAccountID: string; @@ -31,6 +29,10 @@ export class CrossAccountRole extends Construct { ) { super(scope, id); + /** + * Create cross account role with trust policy set to the assuming account + * ID principal + */ this.role = new Role( this, name(buildConfig, `${crossAccountRoleProps.roleNameKey}-role`), @@ -39,8 +41,13 @@ export class CrossAccountRole extends Construct { } ); + /** Add the required permissions passed in as part of the construct initiation */ this.role.addToPrincipalPolicy(crossAccountRoleProps.policyStatement); + /** + * Write the roleArn parameter into SSM enabling the assuming account ID + * with read permissions (through custom SSMParamWriter construct) + */ new SSMParamWriter( this, name(buildConfig, `${crossAccountRoleProps.roleNameKey}-roleArn`), diff --git a/lib/constructs/fetch-cross-stack-values.ts b/lib/constructs/fetch-cross-stack-values.ts index 9c41295..8d1c3f3 100644 --- a/lib/constructs/fetch-cross-stack-values.ts +++ b/lib/constructs/fetch-cross-stack-values.ts @@ -1,10 +1,9 @@ -/* -Construct to read values from preSolutions -Artefact stack. This is to avoid creating a circular -dependency through CFN exports and instead rely on SSM paramter -store based reads. -Used by solutionArtefacts stack. -*/ +/** + * This construct allows read the non-deterministic values of resources created + * in preSolutions stack. This is to avoid creating circular dependencies + * between preSolutions and Solutions stack through the default CFN exports. We + * circumvent that by relying on AWS SSM parameter store based reads + */ import { ITable, Table } from "aws-cdk-lib/aws-dynamodb"; import { IKey, Key } from "aws-cdk-lib/aws-kms"; @@ -265,8 +264,11 @@ export class FetchCrossStackValues extends Construct { buildConfig, { ParamAccountId: buildConfig.PipelineSettings.OrgMainAccountId, - ParamRegion: "us-east-1", // Organizations discovery can only be done in us-east-1, hence the step functions and related roles are declared in that region - ParamNameKey: "orgListParents-orgapi-roleArn", + ParamRegion: "us-east-1", + /** + * Organizations discovery can only be done in us-east-1, hence the step + * functions and related roles are declared in that region + */ ParamNameKey: "orgListParents-orgapi-roleArn", } ).paramValue; diff --git a/lib/constructs/helpers.ts b/lib/constructs/helpers.ts new file mode 100644 index 0000000..36d05bb --- /dev/null +++ b/lib/constructs/helpers.ts @@ -0,0 +1,14 @@ +/** All helper utilities used by different constructs */ + +import { BuildConfig } from "../build/buildConfig"; + +/** + * Environment specific resource naming function + * + * @param buildConfig + * @param resourcename + * @returns Environment specific resource name + */ +export function name(buildConfig: BuildConfig, resourcename: string): string { + return buildConfig.Environment + "-" + resourcename; +} diff --git a/lib/constructs/import-artefacts.ts b/lib/constructs/import-artefacts.ts index 9c630f9..8406ed6 100644 --- a/lib/constructs/import-artefacts.ts +++ b/lib/constructs/import-artefacts.ts @@ -1,25 +1,21 @@ -/* -Construct to read values from solution Artefact and preSolutions -Artefact stacks. This is to avoid creating a circular -dependency through CFN exports and instead rely on SSM paramter -store based reads. -Used by ssoImportArtefacts-Part2 stack. -*/ +/** + * This construct allows read the non-deterministic values of resources created + * in preSolutions stack. This is to avoid creating circular dependencies + * between preSolutions and ssoImportArtefacts-part2 through the default CFN + * exports. We circumvent that by relying on AWS SSM parameter store based reads + */ import { ITable, Table } from "aws-cdk-lib/aws-dynamodb"; import { IKey, Key } from "aws-cdk-lib/aws-kms"; import * as lambda from "aws-cdk-lib/aws-lambda"; -import { ILayerVersion } from "aws-cdk-lib/aws-lambda"; // Importing external resources in CDK would use interfaces and not base objects +import { ILayerVersion } from "aws-cdk-lib/aws-lambda"; import { Bucket, IBucket } from "aws-cdk-lib/aws-s3"; -import { ITopic, Topic } from "aws-cdk-lib/aws-sns"; // Importing external resources in CDK would use interfaces and not base objects +import { ITopic, Topic } from "aws-cdk-lib/aws-sns"; import { StringParameter } from "aws-cdk-lib/aws-ssm"; import { Construct } from "constructs"; import { BuildConfig } from "../build/buildConfig"; import { SSMParamReader } from "./ssm-param-reader"; - -function name(buildConfig: BuildConfig, resourcename: string): string { - return buildConfig.Environment + "-" + resourcename; -} +import { name } from "./helpers"; export class ImportArtefacts extends Construct { public readonly nodeJsLayer: ILayerVersion; diff --git a/lib/constructs/independent-utlity.ts b/lib/constructs/independent-utlity.ts index cacaad1..8e2c009 100644 --- a/lib/constructs/independent-utlity.ts +++ b/lib/constructs/independent-utlity.ts @@ -1,9 +1,7 @@ -/* -Utility construct in solution artefacts stack -that allows shareable resources and has no dependencies -on other constructs -*/ - +/** + * Construct that creates resources with no inter-dependencies as part of + * preSolutionArtefacts stacks + */ import { Duration } from "aws-cdk-lib"; import { Key } from "aws-cdk-lib/aws-kms"; import { @@ -18,10 +16,7 @@ import { StringParameter } from "aws-cdk-lib/aws-ssm"; import { Construct } from "constructs"; import { BuildConfig } from "../build/buildConfig"; import { SSMParamReader } from "./ssm-param-reader"; - -function name(buildConfig: BuildConfig, resourcename: string): string { - return buildConfig.Environment + "-" + resourcename; -} +import { name } from "./helpers"; export class IndependentUtility extends Construct { public readonly errorNotificationsTopic: Topic; diff --git a/lib/constructs/lambda-layers.ts b/lib/constructs/lambda-layers.ts index e4b5cb5..281c5a4 100644 --- a/lib/constructs/lambda-layers.ts +++ b/lib/constructs/lambda-layers.ts @@ -1,16 +1,11 @@ -/* -Lambda layers construct -*/ +/** Lambda layers construct */ import { Code, LayerVersion, Runtime } from "aws-cdk-lib/aws-lambda"; import { StringParameter } from "aws-cdk-lib/aws-ssm"; import { Construct } from "constructs"; import { join } from "path"; import { BuildConfig } from "../build/buildConfig"; - -function name(buildConfig: BuildConfig, resourcename: string): string { - return buildConfig.Environment + "-" + resourcename; -} +import { name } from "./helpers"; export class LambdaLayers extends Construct { public readonly nodeJsLayer: LayerVersion; diff --git a/lib/constructs/lambda-proxy-api.ts b/lib/constructs/lambda-proxy-api.ts index 462ace6..a488903 100644 --- a/lib/constructs/lambda-proxy-api.ts +++ b/lib/constructs/lambda-proxy-api.ts @@ -1,9 +1,8 @@ -/* -Proxy API construct that sets up -the required access for the API and lambda handler as well -as implementation of CORS override so that a lambda error is -gracefully handled by the proxy API -*/ +/** + * Proxy API construct that sets up the required access for the API and lambda + * handler as well as implementation of CORS override so that a lambda error is + * gracefully handled by the proxy API + */ import { AccessLogFormat, @@ -18,10 +17,7 @@ import { LogGroup, RetentionDays } from "aws-cdk-lib/aws-logs"; import { CfnOutput } from "aws-cdk-lib"; import { Construct } from "constructs"; import { BuildConfig } from "../build/buildConfig"; - -function name(buildConfig: BuildConfig, resourcename: string): string { - return buildConfig.Environment + "-" + resourcename; -} +import { name } from "./helpers"; export interface LambdaProxyAPIProps { apiNameKey: string; diff --git a/lib/constructs/link-crud.ts b/lib/constructs/link-crud.ts index 6666b1c..8e9ca1e 100644 --- a/lib/constructs/link-crud.ts +++ b/lib/constructs/link-crud.ts @@ -1,8 +1,7 @@ -/* -composite construct that sets up all resources -for account assignment CRUD operations and handles both API -and S3 interfaces -*/ +/** + * Composite construct that sets up all resources for account assignment CRUD + * operations and handles both API and S3 interfaces + */ import { CfnOutput, RemovalPolicy } from "aws-cdk-lib"; import { LambdaRestApi } from "aws-cdk-lib/aws-apigateway"; @@ -24,10 +23,7 @@ import { Construct } from "constructs"; import { join } from "path"; import { BuildConfig } from "../build/buildConfig"; import { LambdaProxyAPI } from "./lambda-proxy-api"; - -function name(buildConfig: BuildConfig, resourcename: string): string { - return buildConfig.Environment + "-" + resourcename; -} +import { name } from "./helpers"; export interface LinkCRUDProps { readonly nodeJsLayer: LayerVersion; @@ -168,6 +164,7 @@ export class LinkCRUD extends Construct { AWS_NODEJS_CONNECTION_REUSE_ENABLED: "1", artefactsBucketName: linkCRUDProps.ssoArtefactsBucket.bucketName, linkProcessingTopicArn: this.linkProcessingTopic.topicArn, + functionLogMode: buildConfig.Parameters.FunctionLogMode, }, } ); @@ -220,6 +217,7 @@ export class LinkCRUD extends Construct { errorNotificationsTopicArn: linkCRUDProps.errorNotificationsTopicArn, linkProcessingTopicArn: this.linkProcessingTopic.topicArn, + functionLogMode: buildConfig.Parameters.FunctionLogMode, }, } ); @@ -265,6 +263,7 @@ export class LinkCRUD extends Construct { errorNotificationsTopicArn: linkCRUDProps.errorNotificationsTopicArn, linkProcessingTopicArn: this.linkProcessingTopic.topicArn, + functionLogMode: buildConfig.Parameters.FunctionLogMode, }, } ); diff --git a/lib/constructs/link-processor.ts b/lib/constructs/link-processor.ts index 0ab9ac1..8540d1b 100644 --- a/lib/constructs/link-processor.ts +++ b/lib/constructs/link-processor.ts @@ -1,11 +1,11 @@ -/* -composite construct that sets up all resources -for account assignments creation/deletion -*/ +/** + * Composite construct that sets up all resources for account assignments + * creation/deletion + */ import { Duration } from "aws-cdk-lib"; -import { ITable } from "aws-cdk-lib/aws-dynamodb"; // Importing external resources in CDK would use interfaces and not base objects -import { ILayerVersion, Runtime } from "aws-cdk-lib/aws-lambda"; // Importing external resources in CDK would use interfaces and not base objects +import { ITable } from "aws-cdk-lib/aws-dynamodb"; +import { ILayerVersion, Runtime } from "aws-cdk-lib/aws-lambda"; import { SnsEventSource, SqsEventSource, @@ -16,10 +16,7 @@ import { IQueue } from "aws-cdk-lib/aws-sqs"; import { Construct } from "constructs"; import { join } from "path"; import { BuildConfig } from "../build/buildConfig"; - -function name(buildConfig: BuildConfig, resourcename: string): string { - return buildConfig.Environment + "-" + resourcename; -} +import { name } from "./helpers"; export interface LinkProcessProps { readonly linksTable: ITable; @@ -87,6 +84,7 @@ export class LinkProcessor extends Construct { waiterHandlerSSOAPIRoleArn: linkprocessProps.waiterHandlerSSOAPIRoleArn, ssoRegion: buildConfig.PipelineSettings.SSOServiceAccountRegion, + functionLogMode: buildConfig.Parameters.FunctionLogMode, }, timeout: Duration.minutes(5), //aggressive timeout to accommodate SSO Admin API's workflow based logic, } @@ -130,6 +128,7 @@ export class LinkProcessor extends Construct { linkQueueUrl: linkprocessProps.linkManagerQueue.queueUrl, errorNotificationsTopicArn: linkprocessProps.errorNotificationsTopic.topicArn, + functionLogMode: buildConfig.Parameters.FunctionLogMode, }, } ); @@ -181,6 +180,7 @@ export class LinkProcessor extends Construct { processTargetAccountSMArn: `arn:aws:states:us-east-1:${buildConfig.PipelineSettings.OrgMainAccountId}:stateMachine:${buildConfig.Environment}-processTargetAccountSM`, ssoRegion: buildConfig.PipelineSettings.SSOServiceAccountRegion, supportNestedOU: String(buildConfig.Parameters.SupportNestedOU), + functionLogMode: buildConfig.Parameters.FunctionLogMode, }, } ); diff --git a/lib/constructs/observability-artefacts.ts b/lib/constructs/observability-artefacts.ts index e2f8d99..aba01c2 100644 --- a/lib/constructs/observability-artefacts.ts +++ b/lib/constructs/observability-artefacts.ts @@ -1,14 +1,9 @@ -/* -Construct that sets up all artefacts required for observability -*/ +/** Construct that sets up all artefacts required for observability */ import { CfnQueryDefinition } from "aws-cdk-lib/aws-logs"; import { Construct } from "constructs"; import { BuildConfig } from "../build/buildConfig"; - -function name(buildConfig: BuildConfig, resourcename: string): string { - return buildConfig.Environment + "-" + resourcename; -} +import { name } from "./helpers"; export class ObservabilityArtefacts extends Construct { constructor(scope: Construct, id: string, buildConfig: BuildConfig) { diff --git a/lib/constructs/org-events.ts b/lib/constructs/org-events.ts index d7d1248..25e2830 100644 --- a/lib/constructs/org-events.ts +++ b/lib/constructs/org-events.ts @@ -1,20 +1,14 @@ -/* -composite construct that sets up all resources -for org events handling -*/ +/** Composite construct that sets up all resources for org events handling */ import { Duration } from "aws-cdk-lib"; -import { ILayerVersion, Runtime } from "aws-cdk-lib/aws-lambda"; // Importing external resources in CDK would use interfaces and not base objects +import { ILayerVersion, Runtime } from "aws-cdk-lib/aws-lambda"; import { SnsEventSource } from "aws-cdk-lib/aws-lambda-event-sources"; import { NodejsFunction } from "aws-cdk-lib/aws-lambda-nodejs"; -import { ITopic } from "aws-cdk-lib/aws-sns"; // Importing external resources in CDK would use interfaces and not base objects +import { ITopic } from "aws-cdk-lib/aws-sns"; import { Construct } from "constructs"; import { join } from "path"; import { BuildConfig } from "../build/buildConfig"; - -function name(buildConfig: BuildConfig, resourcename: string): string { - return buildConfig.Environment + "-" + resourcename; -} +import { name } from "./helpers"; export interface OrgEventsProps { readonly linksTableName: string; @@ -82,6 +76,7 @@ export class OrgEvents extends Construct { provisionedLinksTable: orgEventsProps.provisionedlinksTableName, supportNestedOU: String(buildConfig.Parameters.SupportNestedOU), orgListParentsRoleArn: orgEventsProps.orgListParentsRoleArn, + functionLogMode: buildConfig.Parameters.FunctionLogMode, }, timeout: Duration.minutes(5), //aggressive timeout to accommodate for child OU's having many parents } diff --git a/lib/constructs/permission-set-crud.ts b/lib/constructs/permission-set-crud.ts index b242f2e..24cb58e 100644 --- a/lib/constructs/permission-set-crud.ts +++ b/lib/constructs/permission-set-crud.ts @@ -1,8 +1,7 @@ -/* -composite construct that sets up all resources -for permission set CRUD operations and handles both API -and S3 interfaces -*/ +/** + * Composite construct that sets up all resources for permission set CRUD + * operations and handles both API and S3 interfaces + */ import { CfnOutput, RemovalPolicy } from "aws-cdk-lib"; import { LambdaRestApi } from "aws-cdk-lib/aws-apigateway"; @@ -24,11 +23,7 @@ import { Construct } from "constructs"; import { join } from "path"; import { BuildConfig } from "../build/buildConfig"; import { LambdaProxyAPI } from "./lambda-proxy-api"; - -function name(buildConfig: BuildConfig, resourcename: string): string { - return buildConfig.Environment + "-" + resourcename; -} - +import { name } from "./helpers"; export interface PermissionSetCRUDProps { readonly nodeJsLayer: LayerVersion; readonly linksTableName: string; @@ -139,6 +134,7 @@ export class PermissionSetCRUD extends Construct { PermissionSetCRUDProps.ssoArtefactsBucket.bucketName, permissionSetProcessingTopicArn: this.permissionSetProcessingTopic.topicArn, + functionLogMode: buildConfig.Parameters.FunctionLogMode, }, } ); @@ -193,6 +189,7 @@ export class PermissionSetCRUD extends Construct { PermissionSetCRUDProps.errorNotificationsTopicArn, permissionSetProcessingTopicArn: this.permissionSetProcessingTopic.topicArn, + functionLogMode: buildConfig.Parameters.FunctionLogMode, }, } ); @@ -252,6 +249,7 @@ export class PermissionSetCRUD extends Construct { linksTable: PermissionSetCRUDProps.linksTableName, permissionSetProcessingTopicArn: this.permissionSetProcessingTopic.topicArn, + functionLogMode: buildConfig.Parameters.FunctionLogMode, }, } ); diff --git a/lib/constructs/permission-set-processor.ts b/lib/constructs/permission-set-processor.ts index 27eeeea..ba72c15 100644 --- a/lib/constructs/permission-set-processor.ts +++ b/lib/constructs/permission-set-processor.ts @@ -1,25 +1,21 @@ -/* -composite construct that sets up all resources -for permission set life cycle provisioning -*/ +/** + * Composite construct that sets up all resources for permission set life cycle + * provisioning + */ import { Duration } from "aws-cdk-lib"; -import { ITable } from "aws-cdk-lib/aws-dynamodb"; // Importing external resources in CDK would use interfaces and not base objects -import { IKey } from "aws-cdk-lib/aws-kms"; // Importing external resources in CDK would use interfaces and not base objects -import * as lambda from "aws-cdk-lib/aws-lambda"; //Needed to avoid semgrep throwing up https://cwe.mitre.org/data/definitions/95.html +import { ITable } from "aws-cdk-lib/aws-dynamodb"; +import { IKey } from "aws-cdk-lib/aws-kms"; +import { ILayerVersion, Runtime } from "aws-cdk-lib/aws-lambda"; import { SnsEventSource } from "aws-cdk-lib/aws-lambda-event-sources"; import { NodejsFunction } from "aws-cdk-lib/aws-lambda-nodejs"; import { ITopic, Topic } from "aws-cdk-lib/aws-sns"; import { Construct } from "constructs"; import { join } from "path"; import { BuildConfig } from "../build/buildConfig"; - -function name(buildConfig: BuildConfig, resourcename: string): string { - return buildConfig.Environment + "-" + resourcename; -} - +import { name } from "./helpers"; export interface PermissionSetProcessProps { - readonly nodeJsLayer: lambda.ILayerVersion; + readonly nodeJsLayer: ILayerVersion; readonly permissionSetTable: ITable; readonly PermissionSetArnTableName: string; readonly errorNotificationsTopic: ITopic; @@ -62,7 +58,7 @@ export class PermissionSetProcessor extends Construct { name(buildConfig, "permissionSetTopicProcessor"), { functionName: name(buildConfig, "permissionSetTopicProcessor"), - runtime: lambda.Runtime.NODEJS_16_X, + runtime: Runtime.NODEJS_16_X, entry: join( __dirname, "../", @@ -97,6 +93,7 @@ export class PermissionSetProcessor extends Construct { ssoRegion: buildConfig.PipelineSettings.SSOServiceAccountRegion, waiterHandlerSSOAPIRoleArn: permissionSetProcessorProps.waiterHandlerSSOAPIRoleArn, + functionLogMode: buildConfig.Parameters.FunctionLogMode, }, timeout: Duration.minutes(11), //aggressive timeout to accommodate SSO Admin API's workflow based logic } @@ -112,7 +109,7 @@ export class PermissionSetProcessor extends Construct { this, name(buildConfig, "permissionSetSyncHandler"), { - runtime: lambda.Runtime.NODEJS_16_X, + runtime: Runtime.NODEJS_16_X, functionName: name(buildConfig, "permissionSetSyncHandler"), entry: join( __dirname, @@ -154,6 +151,7 @@ export class PermissionSetProcessor extends Construct { processTargetAccountSMArn: `arn:aws:states:us-east-1:${buildConfig.PipelineSettings.OrgMainAccountId}:stateMachine:${buildConfig.Environment}-processTargetAccountSM`, ssoRegion: buildConfig.PipelineSettings.SSOServiceAccountRegion, supportNestedOU: String(buildConfig.Parameters.SupportNestedOU), + functionLogMode: buildConfig.Parameters.FunctionLogMode, }, } ); diff --git a/lib/constructs/preSolution-access-manager.ts b/lib/constructs/preSolution-access-manager.ts index 507a85c..677e287 100644 --- a/lib/constructs/preSolution-access-manager.ts +++ b/lib/constructs/preSolution-access-manager.ts @@ -1,7 +1,7 @@ -/* -All access granting within the preSolution artefacts stack is consolidated -here to facilitate easier management and visibility -*/ +/** + * All access granting within the preSolution artefacts stack is consolidated + * here to facilitate easier management and visibility + */ import { Construct } from "constructs"; import { BuildConfig } from "../build/buildConfig"; diff --git a/lib/constructs/ssm-param-reader.ts b/lib/constructs/ssm-param-reader.ts index 84a0b49..78703f8 100644 --- a/lib/constructs/ssm-param-reader.ts +++ b/lib/constructs/ssm-param-reader.ts @@ -1,7 +1,7 @@ -/* -Custom cloudformation resource construct that -allows cross account/cross region read of SSM parameter value -*/ +/** + * Custom cloudformation resource construct that allows cross account/cross + * region read of SSM parameter value + */ import { PolicyStatement } from "aws-cdk-lib/aws-iam"; import { @@ -12,10 +12,7 @@ import { import { Construct } from "constructs"; import { BuildConfig } from "../build/buildConfig"; import { v4 as uuidv4 } from "uuid"; - -function name(buildConfig: BuildConfig, resourcename: string): string { - return buildConfig.Environment + "-" + resourcename; -} +import { name } from "./helpers"; const generateRandomString = uuidv4().toString().split("-")[0]; diff --git a/lib/constructs/ssm-param-writer.ts b/lib/constructs/ssm-param-writer.ts index 5e67130..732c295 100644 --- a/lib/constructs/ssm-param-writer.ts +++ b/lib/constructs/ssm-param-writer.ts @@ -1,17 +1,13 @@ -/* -Custom SSM writer construct that facilitates -cross account/cross region reading through the SSMParamReader -construct -*/ +/** + * Custom SSM writer construct that facilitates cross account/cross region + * reading through the SSMParamReader construct + */ import { AccountPrincipal, Role } from "aws-cdk-lib/aws-iam"; import { StringParameter } from "aws-cdk-lib/aws-ssm"; import { Construct } from "constructs"; import { BuildConfig } from "../build/buildConfig"; - -function name(buildConfig: BuildConfig, resourcename: string): string { - return buildConfig.Environment + "-" + resourcename; -} +import { name } from "./helpers"; export interface SSMParamWriterProps { readonly ParamNameKey: string; diff --git a/lib/constructs/sso-group-processor.ts b/lib/constructs/sso-group-processor.ts index 307d9bc..975c73f 100644 --- a/lib/constructs/sso-group-processor.ts +++ b/lib/constructs/sso-group-processor.ts @@ -1,18 +1,13 @@ -/* -composite construct that sets up all resources -for SSO event life cycle notifications -*/ -import { ILayerVersion, Runtime } from "aws-cdk-lib/aws-lambda"; // Importing external resources in CDK would use interfaces and not base objects +/** Composite construct that sets up all resources for SSO event life cycle notifications */ + +import { ILayerVersion, Runtime } from "aws-cdk-lib/aws-lambda"; import { SnsEventSource } from "aws-cdk-lib/aws-lambda-event-sources"; import { NodejsFunction } from "aws-cdk-lib/aws-lambda-nodejs"; -import { ITopic } from "aws-cdk-lib/aws-sns"; // Importing external resources in CDK would use interfaces and not base objects +import { ITopic } from "aws-cdk-lib/aws-sns"; import { Construct } from "constructs"; import { join } from "path"; import { BuildConfig } from "../build/buildConfig"; - -function name(buildConfig: BuildConfig, resourcename: string): string { - return buildConfig.Environment + "-" + resourcename; -} +import { name } from "./helpers"; export interface SSOGroupProcessorProps { readonly linksTableName: string; @@ -82,6 +77,7 @@ export class SSOGroupProcessor extends Construct { processTargetAccountSMArn: `arn:aws:states:us-east-1:${buildConfig.PipelineSettings.OrgMainAccountId}:stateMachine:${buildConfig.Environment}-processTargetAccountSM`, ssoRegion: buildConfig.PipelineSettings.SSOServiceAccountRegion, supportNestedOU: String(buildConfig.Parameters.SupportNestedOU), + functionLogMode: buildConfig.Parameters.FunctionLogMode, }, } ); @@ -136,6 +132,7 @@ export class SSOGroupProcessor extends Construct { processTargetAccountSMArn: `arn:aws:states:us-east-1:${buildConfig.PipelineSettings.OrgMainAccountId}:stateMachine:${buildConfig.Environment}-processTargetAccountSM`, ssoRegion: buildConfig.PipelineSettings.SSOServiceAccountRegion, supportNestedOU: String(buildConfig.Parameters.SupportNestedOU), + functionLogMode: buildConfig.Parameters.FunctionLogMode, }, } ); diff --git a/lib/constructs/utility.ts b/lib/constructs/utility.ts index 1c4df10..3ce7661 100644 --- a/lib/constructs/utility.ts +++ b/lib/constructs/utility.ts @@ -1,16 +1,11 @@ -/* -Utility construct in solution artefacts stack -that allows shareable resources -*/ +/** Utility construct in solution artefacts stack that allows shareable resources */ + import { ITopic, Topic } from "aws-cdk-lib/aws-sns"; import { StringParameter } from "aws-cdk-lib/aws-ssm"; import { Construct } from "constructs"; import { BuildConfig } from "../build/buildConfig"; import { SSMParamReader } from "./ssm-param-reader"; - -function name(buildConfig: BuildConfig, resourcename: string): string { - return buildConfig.Environment + "-" + resourcename; -} +import { name } from "./helpers"; export class Utility extends Construct { public readonly orgEventsNotificationsTopic: ITopic; diff --git a/lib/lambda-functions/application-handlers/src/groupsCud.ts b/lib/lambda-functions/application-handlers/src/groupsCud.ts index 5b692e0..3291d60 100644 --- a/lib/lambda-functions/application-handlers/src/groupsCud.ts +++ b/lib/lambda-functions/application-handlers/src/groupsCud.ts @@ -1,41 +1,36 @@ -/* -Objective: Implement SSO group events handler for processing groups -Trigger source: SSO group changes notification topic which in turn - receives event bridge notifications from SSO account - for group changes -- assumes role in SSO account for calling SSO admin API - listInstances -- determine if the event type is create or delete -- determine the group name (SSO uses - different event schemas for this - event depending on the identity store) -- if create/delete - - determine if there are related links - already provisioned by looking up - links table - - if there are related links, then - - for each related link - - determine if permission set referenced - in the link is already provisioned by - looking up permissionsetArn ddb table - - if permission set is already - provisioned, then - - determine if the link type is - account, ou_id, account_tag or root - - if account, post the link - operation details to link manager - FIFO queue - - if ou_id, root, account_tag resolve the - actual accounts and post the link - operation details to org entities state machine in org account - - if permission set is not provisioned, - stop the operation here - - if there are no related links, then - stop the operation here -- Catch all failures in a generic exception block - and post the error details to error notifications topics -*/ +/** + * Objective: Implement SSO group events handler for processing groups Trigger + * source: SSO group changes notification topic which in turn receives event + * bridge notifications from SSO account for group changes + * + * - Assumes role in SSO account for calling SSO admin API - listInstances + * - Determine if the event type is create or delete + * - Determine the group name (SSO uses different event schemas for this event + * depending on the identity store) + * - If create/delete + * + * - Determine if there are related links already provisioned by looking up links table + * - If there are related links, then + * + * - For each related link + * - Determine if permission set referenced in the link is already provisioned by + * looking up permissionsetArn ddb table + * + * - If permission set is already provisioned, then + * + * - Determine if the link type is account, ou_id, account_tag or root + * - If account, post the link operation details to link manager FIFO queue + * - If ou_id, root, account_tag resolve the actual accounts and post the link + * operation + * details to org + * entities state + * machine in org account + * - If permission set is not provisioned, stop the operation here + * - If there are no related links, then stop the operation here + * - Catch all failures in a generic exception block and post the error details to + * error notifications topics + */ -// Environment configuration read const { SSOAPIRoleArn, orgListSMRoleArn, @@ -48,13 +43,25 @@ const { ssoRegion, supportNestedOU, AWS_REGION, + functionLogMode, + AWS_LAMBDA_FUNCTION_NAME, } = process.env; -// SDK and third party client imports -import { DynamoDBClient } from "@aws-sdk/client-dynamodb"; -import { SFNClient } from "@aws-sdk/client-sfn"; -import { PublishCommand, SNSClient } from "@aws-sdk/client-sns"; -import { SendMessageCommand, SQSClient } from "@aws-sdk/client-sqs"; +import { + DynamoDBClient, + DynamoDBServiceException, +} from "@aws-sdk/client-dynamodb"; +import { SFNClient, SFNServiceException } from "@aws-sdk/client-sfn"; +import { + PublishCommand, + SNSClient, + SNSServiceException, +} from "@aws-sdk/client-sns"; +import { + SendMessageCommand, + SQSClient, + SQSServiceException, +} from "@aws-sdk/client-sqs"; import { ListInstancesCommand, ListInstancesCommandOutput, @@ -71,13 +78,18 @@ import { import { SNSEvent } from "aws-lambda"; import { v4 as uuidv4 } from "uuid"; import { - ErrorMessage, + logModes, requestStatus, StateMachinePayload, StaticSSOPayload, } from "../../helpers/src/interfaces"; -import { invokeStepFunction, logger } from "../../helpers/src/utilities"; -// SDK and third party client object initialistaion +import { + constructExceptionMessage, + constructExceptionMessageforLogger, + invokeStepFunction, + logger, +} from "../../helpers/src/utilities"; + const ddbClientObject = new DynamoDBClient({ region: AWS_REGION, maxAttempts: 2, @@ -104,17 +116,36 @@ const sfnClientObject = new SFNClient({ maxAttempts: 2, }); -//Error notification -const errorMessage: ErrorMessage = { - Subject: "Error Processing group trigger based link provisioning operation", -}; +const handlerName = AWS_LAMBDA_FUNCTION_NAME + ""; +const messageSubject = "Exception in AWS SSO group event processing logic"; +let groupNameValue = ""; export const handler = async (event: SNSEvent) => { const requestId = uuidv4().toString(); + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestId, + status: requestStatus.InProgress, + statusMessage: `SSO group event triggered event bridge rule, started processing`, + }, + functionLogMode + ); try { const message = JSON.parse(event.Records[0].Sns.Message); const resolvedInstances: ListInstancesCommandOutput = await ssoAdminClientObject.send(new ListInstancesCommand({})); + logger( + { + handler: handlerName, + logMode: logModes.Debug, + requestId: requestId, + status: requestStatus.InProgress, + statusMessage: `Resolved SSO instance arn`, + }, + functionLogMode + ); const instanceArn = resolvedInstances.Instances?.[0].InstanceArn; const staticSSOPayload: StaticSSOPayload = { InstanceArn: instanceArn + "", @@ -126,9 +157,33 @@ export const handler = async (event: SNSEvent) => { let groupName = ""; if (message.detail.eventName === "CreateGroup") { + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestId, + status: requestStatus.InProgress, + statusMessage: `Determined event is CreateGroup`, + }, + functionLogMode + ); groupId = message.detail.responseElements.group.groupId; - // To handle SSO generating cloudwatch events with different formats - // depending on the identity store being used + logger( + { + handler: handlerName, + logMode: logModes.Debug, + requestId: requestId, + status: requestStatus.InProgress, + relatedData: groupId, + statusMessage: `Set groupID value as read from the event payload`, + }, + functionLogMode + ); + /** + * To handle SSO generating cloudwatch events with different formats + * depending on the identity store being used + */ + if ( Object.prototype.hasOwnProperty.call( message.detail.responseElements.group, @@ -136,6 +191,17 @@ export const handler = async (event: SNSEvent) => { ) ) { groupName = message.detail.responseElements.group.displayName; + logger( + { + handler: handlerName, + logMode: logModes.Debug, + requestId: requestId, + status: requestStatus.InProgress, + relatedData: groupId, + statusMessage: `Event sent displayName value for groupName, using this value - ${groupName}`, + }, + functionLogMode + ); } else if ( Object.prototype.hasOwnProperty.call( message.detail.responseElements.group, @@ -143,20 +209,25 @@ export const handler = async (event: SNSEvent) => { ) ) { groupName = message.detail.responseElements.group.groupName; + logger( + { + handler: handlerName, + logMode: logModes.Debug, + requestId: requestId, + status: requestStatus.InProgress, + relatedData: groupId, + statusMessage: `Event sent groupName value for groupName, using this value - ${groupName}`, + }, + functionLogMode + ); } - - logger({ - handler: "groupsHandler", - logMode: "info", - requestId: requestId, - relatedData: `${groupName}`, - status: requestStatus.InProgress, - statusMessage: `CreateGroup operation - resolved groupName`, - }); - + groupNameValue = groupName; const relatedLinks: QueryCommandOutput = await ddbDocClientObject.send( - // QueryCommand is a pagniated call, however the logic requires - // checking only if the result set is greater than 0 + /** + * QueryCommand is a pagniated call, however the logic requires checking + * only if the result set is greater than 0 + */ + new QueryCommand({ TableName: linkstable, IndexName: "principalName", @@ -165,8 +236,30 @@ export const handler = async (event: SNSEvent) => { ExpressionAttributeValues: { ":principalName": groupName }, }) ); + logger( + { + handler: handlerName, + logMode: logModes.Debug, + requestId: requestId, + status: requestStatus.InProgress, + relatedData: groupId, + statusMessage: `Querying if there are any related account assignments for group ${groupName}`, + }, + functionLogMode + ); if (relatedLinks.Items && relatedLinks.Items?.length !== 0) { + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestId, + status: requestStatus.InProgress, + relatedData: groupId, + statusMessage: `Determined there are ${relatedLinks.Items.length} no of account assignments for group ${groupName}`, + }, + functionLogMode + ); await Promise.all( relatedLinks.Items?.map(async (Item) => { const { awsEntityType, awsEntityData, permissionSetName } = Item; @@ -181,7 +274,31 @@ export const handler = async (event: SNSEvent) => { ); if (permissionSetFetch.Item) { const { permissionSetArn } = permissionSetFetch.Item; + logger( + { + handler: handlerName, + logMode: logModes.Debug, + requestId: requestId, + status: requestStatus.InProgress, + relatedData: groupId, + statusMessage: `Determined permission set ${permissionSetName} for the account assignments is provisioned already with permissionSetArn ${permissionSetArn}`, + }, + functionLogMode + ); + if (awsEntityType === "account") { + logger( + { + handler: handlerName, + logMode: logModes.Debug, + requestId: requestId, + status: requestStatus.InProgress, + relatedData: groupId, + statusMessage: `Determined entity type is account for this account assignment type`, + }, + functionLogMode + ); + await sqsClientObject.send( new SendMessageCommand({ QueueUrl: linkQueueUrl, @@ -200,19 +317,33 @@ export const handler = async (event: SNSEvent) => { MessageGroupId: awsEntityData.slice(-1), }) ); - logger({ - handler: "groupsHandler", - logMode: "info", - relatedData: `${groupName}`, - requestId: requestId, - status: requestStatus.Completed, - statusMessage: `CreateGroup operation - triggered account assignment provisioning operation`, - }); + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestId, + status: requestStatus.InProgress, + relatedData: groupId, + statusMessage: `Sent payload to account assignment queue with account ID ${awsEntityData}, for permissionSetArn ${permissionSetArn} and group ${groupName}`, + }, + functionLogMode + ); } else if ( awsEntityType === "ou_id" || awsEntityType === "root" || awsEntityType === "account_tag" ) { + logger( + { + handler: handlerName, + logMode: logModes.Debug, + requestId: requestId, + status: requestStatus.InProgress, + relatedData: groupId, + statusMessage: `Determined entity type is ${awsEntityType} for this account assignment type`, + }, + functionLogMode + ); const stateMachinePayload: StateMachinePayload = { action: "create", entityType: awsEntityType, @@ -233,68 +364,118 @@ export const handler = async (event: SNSEvent) => { processTargetAccountSMArn + "", sfnClientObject ); - logger({ - handler: "groupsHandler", - logMode: "info", - relatedData: `${groupName}`, - requestId: requestId, - status: requestStatus.Completed, - statusMessage: `CreateGroup operation - triggered step function for org based resolution`, - }); + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestId, + status: requestStatus.InProgress, + relatedData: groupId, + statusMessage: `Invoked state machine for procesing group event with entityType ${awsEntityType} for groupID ${groupId} , permissionSetArn ${permissionSetArn} , targetType ${staticSSOPayload.TargetType} and entityData ${awsEntityData} `, + }, + functionLogMode + ); } } else { - // Permission set for the group-link does not exist - logger({ - handler: "groupsHandler", - logMode: "info", - relatedData: `${groupName}`, - requestId: requestId, - status: requestStatus.Completed, - statusMessage: `CreateGroup operation - permission set referenced in related account assignments not found`, - }); + /** Permission set for the group-link does not exist */ + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestId, + status: requestStatus.Aborted, + relatedData: groupId, + statusMessage: `Determined that permissionSet ${permissionSetName} does not yet exist in the solution, so aborting the operation`, + }, + functionLogMode + ); } }) ); } else { - // No related links for the group being processed - logger({ - handler: "groupsHandler", - logMode: "info", - relatedData: `${groupName}`, - requestId: requestId, - status: requestStatus.Completed, - statusMessage: `CreateGroup operation - no related account assignments found for the group`, - }); + /** No related links for the group being processed */ + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestId, + status: requestStatus.Aborted, + relatedData: groupId, + statusMessage: `Determined that there are no related account assignments for this group, aborting the operation`, + }, + functionLogMode + ); } } else if (message.detail.eventName === "DeleteGroup") { + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestId, + status: requestStatus.Aborted, + statusMessage: `Determined event is DeleteGroup, no actions being done as the group is deletec directly`, + }, + functionLogMode + ); + } + } catch (err) { + if ( + err instanceof DynamoDBServiceException || + err instanceof SFNServiceException || + err instanceof SNSServiceException || + err instanceof SQSServiceException + ) { + await snsClientObject.send( + new PublishCommand({ + TopicArn: errorNotificationsTopicArn, + Subject: messageSubject, + Message: constructExceptionMessage( + requestId, + handlerName, + err.name, + err.message, + groupNameValue + ), + }) + ); logger({ - handler: "groupsHandler", - logMode: "info", - relatedData: `${groupName}`, + handler: handlerName, requestId: requestId, - status: requestStatus.Completed, - statusMessage: `DeleteGroup operation - no actions being done as the group is deleted directly`, + logMode: logModes.Exception, + status: requestStatus.FailedWithException, + statusMessage: constructExceptionMessageforLogger( + requestId, + err.name, + err.message, + groupNameValue + ), + }); + } else { + await snsClientObject.send( + new PublishCommand({ + TopicArn: errorNotificationsTopicArn, + Subject: messageSubject, + Message: constructExceptionMessage( + requestId, + handlerName, + "Unhandled exception", + JSON.stringify(err), + groupNameValue + ), + }) + ); + logger({ + handler: handlerName, + requestId: requestId, + logMode: logModes.Exception, + status: requestStatus.FailedWithException, + statusMessage: constructExceptionMessageforLogger( + requestId, + "Unhandled exception", + JSON.stringify(err), + groupNameValue + ), }); } - } catch (err) { - await snsClientObject.send( - new PublishCommand({ - TopicArn: errorNotificationsTopicArn, - Message: JSON.stringify({ - ...errorMessage, - eventDetail: event, - errorDetails: err, - }), - }) - ); - logger({ - handler: "groupsHandler", - logMode: "error", - requestId: requestId, - status: requestStatus.FailedWithException, - statusMessage: `Groups operation - failed with exception: ${JSON.stringify( - err - )} for eventDetail: ${event}`, - }); } }; diff --git a/lib/lambda-functions/application-handlers/src/linkManager.ts b/lib/lambda-functions/application-handlers/src/linkManager.ts index 9a06b3a..d43213a 100644 --- a/lib/lambda-functions/application-handlers/src/linkManager.ts +++ b/lib/lambda-functions/application-handlers/src/linkManager.ts @@ -1,30 +1,29 @@ -/* -Objective: Implement link provisioning/deprovisioning operations -Trigger source: Link Manager SNS topic -- assumes role in SSO account for calling SSO admin API -- if the targetAccount is payerAccount, the operation is ignored as SSO Admin API does not allow this -- determine if the link action type is create or delete -- if create - - do a lookup into provisioned links table with the - link partition key - - if link already exists, stop the process - - if link does not exist yet, call sso create - account assignment operation - - wait until operation is complete/fail/time out - - if operation is complete , update provisioned links table -- if delete - - do a lookup into provisioned links table with the - link partition key - - if link does not exist, stop the process - - if link exists, call sso delete account - assignment operation - - wait until operation is complete/fail/time out - - if operation is complete, delete item from provisioined links table -- Catch all failures in a generic exception block - and post the error details to error notifications topics -*/ +/** + * Objective: Implement link provisioning/deprovisioning operations Trigger + * source: Link Manager SNS topic + * + * - Assumes role in SSO account for calling SSO admin API + * - If the targetAccount is payerAccount, the operation is ignored as SSO Admin + * API does not allow this + * - Determine if the link action type is create or delete + * - If create + * + * - Do a lookup into provisioned links table with the link partition key + * - If link already exists, stop the process + * - If link does not exist yet, call sso create account assignment operation + * - Wait until operation is complete/fail/time out + * - If operation is complete , update provisioned links table + * - If delete + * + * - Do a lookup into provisioned links table with the link partition key + * - If link does not exist, stop the process + * - If link exists, call sso delete account assignment operation + * - Wait until operation is complete/fail/time out + * - If operation is complete, delete item from provisioined links table + * - Catch all failures in a generic exception block and post the error details to + * error notifications topics + */ -// Environment configuration read const { SSOAPIRoleArn, waiterHandlerSSOAPIRoleArn, @@ -33,11 +32,19 @@ const { errorNotificationsTopicArn, payerAccount, AWS_REGION, + functionLogMode, + AWS_LAMBDA_FUNCTION_NAME, } = process.env; -// SDK and third party client imports -import { DynamoDBClient } from "@aws-sdk/client-dynamodb"; -import { PublishCommand, SNSClient } from "@aws-sdk/client-sns"; +import { + DynamoDBClient, + DynamoDBServiceException, +} from "@aws-sdk/client-dynamodb"; +import { + PublishCommand, + SNSClient, + SNSServiceException, +} from "@aws-sdk/client-sns"; import { CreateAccountAssignmentCommand, CreateAccountAssignmentCommandOutput, @@ -46,6 +53,7 @@ import { ListInstancesCommand, ListInstancesCommandOutput, SSOAdminClient, + SSOAdminServiceException, } from "@aws-sdk/client-sso-admin"; import { fromTemporaryCredentials } from "@aws-sdk/credential-providers"; import { @@ -59,9 +67,13 @@ import { SQSEvent } from "aws-lambda"; import { v4 as uuidv4 } from "uuid"; import { waitUntilAccountAssignmentCreation } from "../../custom-waiters/src/waitUntilAccountAssignmentCreation"; import { waitUntilAccountAssignmentDeletion } from "../../custom-waiters/src/waitUntilAccountAssignmentDeletion"; -import { ErrorMessage, requestStatus } from "../../helpers/src/interfaces"; -import { logger } from "../../helpers/src/utilities"; -// SDK and third party client object initialistaion +import { logModes, requestStatus } from "../../helpers/src/interfaces"; +import { + constructExceptionMessage, + constructExceptionMessageforLogger, + logger, +} from "../../helpers/src/utilities"; + const ddbClientObject = new DynamoDBClient({ region: AWS_REGION, maxAttempts: 2, @@ -87,20 +99,29 @@ const ssoAdminWaiterClientObject = new SSOAdminClient({ maxAttempts: 5 /** Aggressive retry to accommodate large no of account assignment processing */, }); -//Error notification -const errorMessage: ErrorMessage = { - Subject: "Error Processing link provisioning operation", -}; - /** Pre-emptive delay function */ function delay(ms: number) { return new Promise((resolve) => setTimeout(resolve, ms)); } +const handlerName = AWS_LAMBDA_FUNCTION_NAME + ""; +const messageSubject = "Exception in account assignment queue processor"; +let linksKeyValue = ""; + export const handler = async (event: SQSEvent) => { await Promise.all( event.Records.map(async (record) => { const requestId = uuidv4().toString(); + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestId, + status: requestStatus.InProgress, + statusMessage: `Started processing account assignment queue operation`, + }, + functionLogMode + ); try { const message = JSON.parse(record.body); const { ssoParams } = message; @@ -109,20 +130,62 @@ export const handler = async (event: SQSEvent) => { }@${ssoParams.PermissionSetArn.split("/")[1]}@${ ssoParams.PermissionSetArn.split("/")[2] }`; - logger({ - handler: "linkManagerHandler", - logMode: "info", - relatedData: `${provisionedLinksKey}`, - requestId: requestId, - sourceRequestId: message.sourceRequestId, - status: requestStatus.InProgress, - statusMessage: `Link Manager operation in progress`, - }); + linksKeyValue = provisionedLinksKey; + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestId, + relatedData: provisionedLinksKey, + sourceRequestId: message.sourceRequestId, + status: requestStatus.InProgress, + statusMessage: `SSO group event triggered event bridge rule, started processing`, + }, + functionLogMode + ); if (ssoParams.TargetId !== payerAccount) { + logger( + { + handler: handlerName, + logMode: logModes.Debug, + requestId: requestId, + relatedData: provisionedLinksKey, + sourceRequestId: message.sourceRequestId, + status: requestStatus.InProgress, + statusMessage: `Determined that account ID ${ssoParams.TargetId} is not payerAccount`, + }, + functionLogMode + ); const resolvedInstances: ListInstancesCommandOutput = await ssoAdminClientObject.send(new ListInstancesCommand({})); const instanceArn = resolvedInstances.Instances?.[0].InstanceArn + ""; + logger( + { + handler: handlerName, + logMode: logModes.Debug, + requestId: requestId, + relatedData: provisionedLinksKey, + sourceRequestId: message.sourceRequestId, + status: requestStatus.InProgress, + statusMessage: `Resolve SSO instanceArn: ${instanceArn}`, + }, + functionLogMode + ); + if (message.actionType === "create") { + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestId, + relatedData: provisionedLinksKey, + sourceRequestId: message.sourceRequestId, + status: requestStatus.InProgress, + statusMessage: `Processing create account assignment operation`, + }, + functionLogMode + ); + const provisionedLinks: GetCommandOutput = await ddbDocClientObject.send( new GetCommand({ @@ -133,16 +196,18 @@ export const handler = async (event: SQSEvent) => { }) ); if (provisionedLinks.Item) { - // Link already exists, not creating again - logger({ - handler: "linkManagerHandler", - logMode: "info", - relatedData: `${provisionedLinksKey}`, - requestId: requestId, - sourceRequestId: message.sourceRequestId, - status: requestStatus.Completed, - statusMessage: `Link Manager create operation , provisioned link already exists, therefore not provisioning again`, - }); + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestId, + relatedData: provisionedLinksKey, + sourceRequestId: message.sourceRequestId, + status: requestStatus.Completed, + statusMessage: `Provisioned link already exists, not provisioning again`, + }, + functionLogMode + ); } else { const ssoAssignmentOp: CreateAccountAssignmentCommandOutput = await ssoAdminClientObject.send( @@ -150,9 +215,45 @@ export const handler = async (event: SQSEvent) => { ...ssoParams, }) ); + logger( + { + handler: handlerName, + logMode: logModes.Debug, + requestId: requestId, + relatedData: provisionedLinksKey, + sourceRequestId: message.sourceRequestId, + status: requestStatus.InProgress, + statusMessage: `Triggered createAccountAssignment operation, requestID from service ${ssoAssignmentOp.AccountAssignmentCreationStatus?.RequestId}`, + }, + functionLogMode + ); + logger( + { + handler: handlerName, + logMode: logModes.Debug, + requestId: requestId, + relatedData: provisionedLinksKey, + sourceRequestId: message.sourceRequestId, + status: requestStatus.InProgress, + statusMessage: `Triggering pre-emptive delay`, + }, + functionLogMode + ); /** Pre-emptively delay to avoid waitPenalty on waiter */ await delay(15000); + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestId, + relatedData: provisionedLinksKey, + sourceRequestId: message.sourceRequestId, + status: requestStatus.InProgress, + statusMessage: `Pre-emptive delay cycle complete, triggering createAccountAssignment waiter`, + }, + functionLogMode + ); await waitUntilAccountAssignmentCreation( { client: ssoAdminWaiterClientObject, @@ -163,7 +264,20 @@ export const handler = async (event: SQSEvent) => { AccountAssignmentCreationRequestId: ssoAssignmentOp.AccountAssignmentCreationStatus?.RequestId, }, - requestId + requestId, + functionLogMode + "" + ); + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestId, + relatedData: provisionedLinksKey, + sourceRequestId: message.sourceRequestId, + status: requestStatus.InProgress, + statusMessage: `createAccountAssignment waiter returned`, + }, + functionLogMode ); await ddbClientObject.send( new PutCommand({ @@ -175,17 +289,33 @@ export const handler = async (event: SQSEvent) => { }, }) ); - logger({ - handler: "linkManagerHandler", - logMode: "info", - relatedData: `${provisionedLinksKey}`, - requestId: requestId, - sourceRequestId: message.sourceRequestId, - status: requestStatus.Completed, - statusMessage: `Link Manager create operation completed successfully`, - }); + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestId, + relatedData: provisionedLinksKey, + sourceRequestId: message.sourceRequestId, + status: requestStatus.Completed, + statusMessage: `createAccountAssignment operation completed`, + }, + functionLogMode + ); } } else if (message.actionType === "delete") { + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestId, + relatedData: provisionedLinksKey, + sourceRequestId: message.sourceRequestId, + status: requestStatus.InProgress, + statusMessage: `Processing delete account assignment operation`, + }, + functionLogMode + ); + const provisionedLinks: GetCommandOutput = await ddbDocClientObject.send( new GetCommand({ @@ -196,14 +326,63 @@ export const handler = async (event: SQSEvent) => { }) ); if (provisionedLinks.Item) { + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestId, + relatedData: provisionedLinksKey, + sourceRequestId: message.sourceRequestId, + status: requestStatus.InProgress, + statusMessage: `Link currently provisioned, triggering delete account assignment operation`, + }, + functionLogMode + ); + const ssoAssignmentOp: DeleteAccountAssignmentCommandOutput = await ssoAdminClientObject.send( new DeleteAccountAssignmentCommand({ ...ssoParams, }) ); + logger( + { + handler: handlerName, + logMode: logModes.Debug, + requestId: requestId, + relatedData: provisionedLinksKey, + sourceRequestId: message.sourceRequestId, + status: requestStatus.InProgress, + statusMessage: `Triggered deleteAccountAssignment operation, requestID from service ${ssoAssignmentOp.AccountAssignmentDeletionStatus?.RequestId}`, + }, + functionLogMode + ); + logger( + { + handler: handlerName, + logMode: logModes.Debug, + requestId: requestId, + relatedData: provisionedLinksKey, + sourceRequestId: message.sourceRequestId, + status: requestStatus.InProgress, + statusMessage: `Triggering pre-emptive delay`, + }, + functionLogMode + ); /** Pre-emptively delay to avoid waitPenalty on waiter */ await delay(15000); + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestId, + relatedData: provisionedLinksKey, + sourceRequestId: message.sourceRequestId, + status: requestStatus.InProgress, + statusMessage: `Pre-emptive delay cycle complete, triggering deleteAccountAssignment waiter`, + }, + functionLogMode + ); await waitUntilAccountAssignmentDeletion( { client: ssoAdminWaiterClientObject, @@ -214,7 +393,20 @@ export const handler = async (event: SQSEvent) => { AccountAssignmentDeletionRequestId: ssoAssignmentOp.AccountAssignmentDeletionStatus?.RequestId, }, - requestId + requestId, + functionLogMode + "" + ); + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestId, + relatedData: provisionedLinksKey, + sourceRequestId: message.sourceRequestId, + status: requestStatus.InProgress, + statusMessage: `deleteAccountAssignment waiter returned`, + }, + functionLogMode ); await ddbClientObject.send( new DeleteCommand({ @@ -224,20 +416,22 @@ export const handler = async (event: SQSEvent) => { }, }) ); - logger({ - handler: "linkManagerHandler", - logMode: "info", - relatedData: `${provisionedLinksKey}`, - requestId: requestId, - sourceRequestId: message.sourceRequestId, - status: requestStatus.Completed, - statusMessage: `Link Manager delete operation completed successfully`, - }); + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestId, + relatedData: provisionedLinksKey, + sourceRequestId: message.sourceRequestId, + status: requestStatus.Completed, + statusMessage: `deleteAccountAssignment operation completed`, + }, + functionLogMode + ); } else { - // Link does not exist, so not triggering a delete again logger({ handler: "linkManagerHandler", - logMode: "info", + logMode: logModes.Info, relatedData: `${provisionedLinksKey}`, requestId: requestId, sourceRequestId: message.sourceRequestId, @@ -247,37 +441,77 @@ export const handler = async (event: SQSEvent) => { } } } else { - // Ignoring link provisioning/deprovisioning operation for payer account + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestId, + relatedData: provisionedLinksKey, + sourceRequestId: message.sourceRequestId, + status: requestStatus.Completed, + statusMessage: `Provisioned link does not exist, not triggering a delete`, + }, + functionLogMode + ); + } + } catch (err) { + if ( + err instanceof DynamoDBServiceException || + err instanceof SNSServiceException || + err instanceof SSOAdminServiceException + ) { + await snsClientObject.send( + new PublishCommand({ + TopicArn: errorNotificationsTopicArn, + Subject: messageSubject, + Message: constructExceptionMessage( + requestId, + handlerName, + err.name, + err.message, + linksKeyValue + ), + }) + ); logger({ - handler: "linkManagerHandler", - logMode: "info", - relatedData: `${provisionedLinksKey}`, + handler: handlerName, requestId: requestId, - sourceRequestId: message.sourceRequestId, - status: requestStatus.Aborted, - statusMessage: `Link Manager operation aborted as target account is payer account: ${ssoParams.TargetId}`, + logMode: logModes.Exception, + status: requestStatus.FailedWithException, + statusMessage: constructExceptionMessageforLogger( + requestId, + err.name, + err.message, + linksKeyValue + ), + }); + } else { + await snsClientObject.send( + new PublishCommand({ + TopicArn: errorNotificationsTopicArn, + Subject: messageSubject, + Message: constructExceptionMessage( + requestId, + handlerName, + "Unhandled exception", + JSON.stringify(err), + linksKeyValue + ), + }) + ); + logger({ + handler: handlerName, + requestId: requestId, + logMode: logModes.Exception, + status: requestStatus.FailedWithException, + statusMessage: constructExceptionMessageforLogger( + requestId, + "Unhandled exception", + JSON.stringify(err), + linksKeyValue + ), }); } - } catch (err) { - await snsClientObject.send( - new PublishCommand({ - TopicArn: errorNotificationsTopicArn, - Message: JSON.stringify({ - ...errorMessage, - eventDetail: event, - errorDetails: err, - }), - }) - ); - logger({ - handler: "linkManagerHandler", - logMode: "error", - requestId: requestId, - status: requestStatus.FailedWithException, - statusMessage: `Link Manager operation failed with exception: ${JSON.stringify( - err - )} for eventDetail: ${JSON.stringify(record)}`, - }); } }) ); diff --git a/lib/lambda-functions/application-handlers/src/linkTopicProcessor.ts b/lib/lambda-functions/application-handlers/src/linkTopicProcessor.ts index c8044ff..ab72a43 100644 --- a/lib/lambda-functions/application-handlers/src/linkTopicProcessor.ts +++ b/lib/lambda-functions/application-handlers/src/linkTopicProcessor.ts @@ -1,31 +1,32 @@ -/* -Objective: Implement link changes for link processing functionality -Trigger source: links topic notifications -- assumes role in SSO account for calling SSO admin API - listInstances -- For each record in the stream, - - look up in permissionSetArn ddb table if the permission set referenced in the record exists - - if the permission set arn exists, then - - look up in AWS SSO Identity store if the user/group exists - - if the user/group exists - - determine if the operation is create/delete - - determine if link type is account /ou_id/root/account_tag - - if link type is account , - post the link provisioning/deprovisioning operation - to the link manager queue - - if link type is ou_id, root,account_tag - invoke org entities state machine - - if the user/group does not exist - - stop processing as we won't be able to proceed - without the principal Arn - - if the permission set does not exist, - do nothing as we cannot do link - provisioning if the permission set - is not yet provisioned -- Catch all failures in a generic exception block - and post the error details to error notifications topics -*/ +/** + * Objective: Implement link changes for link processing functionality Trigger + * source: links topic notifications + * + * - Assumes role in SSO account for calling SSO admin API - listInstances + * - For each record in the stream, + * + * - Look up in permissionSetArn ddb table if the permission set referenced in the + * record exists + * + * - If the permission set arn exists, then + * + * - Look up in AWS SSO Identity store if the user/group exists + * + * - If the user/group exists + * + * - Determine if the operation is create/delete + * - Determine if link type is account /ou_id/root/account_tag + * - If link type is account , post the link provisioning/deprovisioning operation to the link manager queue + * - If link type is ou_id, root,account_tag invoke org entities state machine + * - If the user/group does not exist + * + * - Stop processing as we won't be able to proceed without the principal Arn + * - If the permission set does not exist, do nothing as we cannot do link + * provisioning if the permission set is not yet provisioned + * - Catch all failures in a generic exception block and post the error details to + * error notifications topics + */ -// Environment configuration read const { SSOAPIRoleArn, ISAPIRoleArn, @@ -40,18 +41,34 @@ const { ssoRegion, supportNestedOU, AWS_REGION, + functionLogMode, + AWS_LAMBDA_FUNCTION_NAME, } = process.env; -// SDK and third party client imports -import { DynamoDBClient } from "@aws-sdk/client-dynamodb"; -import { IdentitystoreClient } from "@aws-sdk/client-identitystore"; -import { SFNClient } from "@aws-sdk/client-sfn"; -import { PublishCommand, SNSClient } from "@aws-sdk/client-sns"; -import { SendMessageCommand, SQSClient } from "@aws-sdk/client-sqs"; +import { + DynamoDBClient, + DynamoDBServiceException, +} from "@aws-sdk/client-dynamodb"; +import { + IdentitystoreClient, + IdentitystoreServiceException, +} from "@aws-sdk/client-identitystore"; +import { SFNClient, SFNServiceException } from "@aws-sdk/client-sfn"; +import { + PublishCommand, + SNSClient, + SNSServiceException, +} from "@aws-sdk/client-sns"; +import { + SendMessageCommand, + SQSClient, + SQSServiceException, +} from "@aws-sdk/client-sqs"; import { ListInstancesCommand, ListInstancesCommandOutput, SSOAdminClient, + SSOAdminServiceException, } from "@aws-sdk/client-sso-admin"; import { fromTemporaryCredentials } from "@aws-sdk/credential-providers"; import { @@ -61,18 +78,19 @@ import { } from "@aws-sdk/lib-dynamodb"; import { SNSEvent } from "aws-lambda"; import { - ErrorMessage, + logModes, requestStatus, StateMachinePayload, StaticSSOPayload, } from "../../helpers/src/interfaces"; import { + constructExceptionMessage, + constructExceptionMessageforLogger, invokeStepFunction, logger, resolvePrincipal, } from "../../helpers/src/utilities"; -// SDK and third party client object initialistaion const ddbClientObject = new DynamoDBClient({ region: AWS_REGION, maxAttempts: 2, @@ -108,41 +126,63 @@ const identityStoreClientObject = new IdentitystoreClient({ maxAttempts: 2, }); -//Error notification -const errorMessage: ErrorMessage = { - Subject: "Error Processing link topic processor", -}; +const handlerName = AWS_LAMBDA_FUNCTION_NAME + ""; +const messageSubject = "Exception in account assignment topic processor"; +let requestIdValue = ""; +let linkDataValue = ""; export const handler = async (event: SNSEvent) => { try { + const message = JSON.parse(event.Records[0].Sns.Message); + const { action, linkData, requestId } = message; + requestIdValue = requestId; + linkDataValue = linkData; + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestId, + status: requestStatus.InProgress, + relatedData: linkData, + statusMessage: `Started account assignment topic processor for action ${action}`, + }, + functionLogMode + ); const resolvedInstances: ListInstancesCommandOutput = await ssoAdminClientObject.send(new ListInstancesCommand({})); - - // Instance Arn needed for SSO admin API's const instanceArn = resolvedInstances.Instances?.[0].InstanceArn; - // Identity store ID needed for SSO Identity Store API's + logger( + { + handler: handlerName, + logMode: logModes.Debug, + requestId: requestId, + status: requestStatus.InProgress, + relatedData: linkData, + statusMessage: `Resolved SSO instance arn ${instanceArn}`, + }, + functionLogMode + ); + const identityStoreId = resolvedInstances.Instances?.[0].IdentityStoreId + ""; - // Because it's a stream handler, there - // could be more than one link updates coming through, hence the proimse all - const message = JSON.parse(event.Records[0].Sns.Message); - const { action, linkData, requestId } = message; - logger({ - handler: "linkTopicProcessor", - logMode: "info", - requestId: requestId, - relatedData: `${linkData}`, - status: requestStatus.InProgress, - statusMessage: `Link topic processor ${action} operation in progress`, - }); - // Deconstruct and get the values for the SSO Admin API operations + logger( + { + handler: handlerName, + logMode: logModes.Debug, + requestId: requestId, + status: requestStatus.InProgress, + relatedData: linkData, + statusMessage: `Resolved identityStoreID ${identityStoreId}`, + }, + functionLogMode + ); const delimeter = "%"; const linkKeyArray = linkData.split(delimeter); const entityType = linkKeyArray?.[0]; const entityValue = linkKeyArray?.[1]; const permissionsetName = linkKeyArray?.[2]; - //const principalName = linkKeyArray?.slice(3, -2).join(delimeter); + const principalName = linkKeyArray?.[3]; const principalType = linkKeyArray?.[4]; @@ -163,11 +203,33 @@ export const handler = async (event: SNSEvent) => { if (permissionSetRecord.Item) { const { permissionSetArn } = permissionSetRecord.Item; - // Compute user/group name based on whether Active Directory is the user store + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestId, + status: requestStatus.InProgress, + relatedData: linkData, + statusMessage: `Determined permission set exists for this account assignment with arn value ${permissionSetArn}`, + }, + functionLogMode + ); + let principalNameToLookUp = principalName; if (adUsed === "true" && domainName !== "") { principalNameToLookUp = `${principalName}@${domainName}`; } + logger( + { + handler: handlerName, + logMode: logModes.Debug, + requestId: requestId, + status: requestStatus.InProgress, + relatedData: linkData, + statusMessage: `Lookup principal name computed ${principalNameToLookUp}`, + }, + functionLogMode + ); const principalId = await resolvePrincipal( identityStoreId, identityStoreClientObject, @@ -176,7 +238,29 @@ export const handler = async (event: SNSEvent) => { ); if (principalId !== "0") { + logger( + { + handler: handlerName, + logMode: logModes.Debug, + requestId: requestId, + status: requestStatus.InProgress, + relatedData: linkData, + statusMessage: `Resolved principal ID ${principalId} for principalName ${principalNameToLookUp} from identity store`, + }, + functionLogMode + ); if (entityType === "account") { + logger( + { + handler: handlerName, + logMode: logModes.Debug, + requestId: requestId, + status: requestStatus.InProgress, + relatedData: linkData, + statusMessage: `Determined entitytype is account`, + }, + functionLogMode + ); await sqsClientObject.send( new SendMessageCommand({ QueueUrl: linkQueueUrl, @@ -195,14 +279,17 @@ export const handler = async (event: SNSEvent) => { MessageGroupId: entityValue.slice(-1), }) ); - logger({ - handler: "linkTopicProcessor", - logMode: "info", - relatedData: `${linkData}`, - requestId: requestId, - status: requestStatus.Completed, - statusMessage: `Link topic processor ${action} operation completed by posting to link manager topic`, - }); + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestId, + status: requestStatus.Completed, + relatedData: linkData, + statusMessage: `Account assignment ${action} operation is posted to account assignment queue`, + }, + functionLogMode + ); } else if ( entityType === "ou_id" || entityType === "root" || @@ -228,55 +315,104 @@ export const handler = async (event: SNSEvent) => { processTargetAccountSMArn + "", sfnClientObject ); - logger({ - handler: "linkTopicProcessor", - logMode: "info", - requestId: requestId, - relatedData: `${linkData}`, - status: requestStatus.Completed, - statusMessage: `Link topic processor ${action} operation completed by posting to step functions state machine`, - }); + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestId, + status: requestStatus.Completed, + relatedData: linkData, + statusMessage: `Account assignment ${action} operation payload triggered process target account state machine for entityType ${entityType}`, + }, + functionLogMode + ); } } else { - // No related principals found for this link - logger({ - handler: "linkTopicProcessor", - logMode: "info", - relatedData: `${linkData}`, - requestId: requestId, - status: requestStatus.Completed, - statusMessage: `Link topic processor ${action} operation completed as no related principals found for this link`, - }); + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestId, + status: requestStatus.Aborted, + relatedData: linkData, + statusMessage: `Account assignment ${action} operation aborted as the principal ${principalNameToLookUp} referenced is not found in identity store`, + }, + functionLogMode + ); } } else { - // Permission set does not exist + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestId, + status: requestStatus.Aborted, + relatedData: linkData, + statusMessage: `Account assignment ${action} operation aborted as the permission set ${permissionsetName} referenced is not yet provisioned`, + }, + functionLogMode + ); + } + } catch (err) { + if ( + err instanceof DynamoDBServiceException || + err instanceof IdentitystoreServiceException || + err instanceof SFNServiceException || + err instanceof SQSServiceException || + err instanceof SSOAdminServiceException || + err instanceof SNSServiceException + ) { + await snsClientObject.send( + new PublishCommand({ + TopicArn: errorNotificationsTopicArn, + Subject: messageSubject, + Message: constructExceptionMessage( + requestIdValue, + handlerName, + err.name, + err.message, + linkDataValue + ), + }) + ); logger({ - handler: "linkTopicProcessor", - logMode: "info", - relatedData: `${linkData}`, - requestId: requestId, - status: requestStatus.Aborted, - statusMessage: `Link topic processor ${action} operation aborted as permissionSet does not yet exist`, + handler: handlerName, + requestId: requestIdValue, + logMode: logModes.Exception, + status: requestStatus.FailedWithException, + statusMessage: constructExceptionMessageforLogger( + requestIdValue, + err.name, + err.message, + linkDataValue + ), + }); + } else { + await snsClientObject.send( + new PublishCommand({ + TopicArn: errorNotificationsTopicArn, + Subject: messageSubject, + Message: constructExceptionMessage( + requestIdValue, + handlerName, + "Unhandled exception", + JSON.stringify(err), + linkDataValue + ), + }) + ); + logger({ + handler: handlerName, + requestId: requestIdValue, + logMode: logModes.Exception, + status: requestStatus.FailedWithException, + statusMessage: constructExceptionMessageforLogger( + requestIdValue, + "Unhandled exception", + JSON.stringify(err), + linkDataValue + ), }); } - } catch (err) { - await snsClientObject.send( - new PublishCommand({ - TopicArn: errorNotificationsTopicArn, - Message: JSON.stringify({ - ...errorMessage, - eventDetail: event, - errorDetails: err, - }), - }) - ); - logger({ - handler: "linkTopicProcessor", - logMode: "error", - status: requestStatus.FailedWithException, - statusMessage: `Link topic processor failed with exception: ${JSON.stringify( - err - )} for eventDetail: ${JSON.stringify(event)}`, - }); } }; diff --git a/lib/lambda-functions/application-handlers/src/orgEvents.ts b/lib/lambda-functions/application-handlers/src/orgEvents.ts index d45a479..363bbf4 100644 --- a/lib/lambda-functions/application-handlers/src/orgEvents.ts +++ b/lib/lambda-functions/application-handlers/src/orgEvents.ts @@ -1,16 +1,15 @@ -/* -Objective: Implement org event notifications -Trigger source: Org event notification topic which in turn - receives event bridge notifications from Org - main account for move account,create account - and account tag type events -- assumes role in SSO account for calling SSO admin API -- determine the type of org event and resolve the - relevant create and delete link operations -- Process the appropriate link operation -- Catch all failures in a generic exception block - and post the error details to error notifications topics -*/ +/** + * Objective: Implement org event notifications Trigger source: Org event + * notification topic which in turn receives event bridge notifications from Org + * main account for move account,create account and account tag type events + * + * - Assumes role in SSO account for calling SSO admin API + * - Determine the type of org event and resolve the relevant create and delete + * link operations + * - Process the appropriate link operation + * - Catch all failures in a generic exception block and post the error details to + * error notifications topics + */ const { permissionSetArnTable, @@ -26,21 +25,38 @@ const { supportNestedOU, orgListParentsRoleArn, AWS_REGION, + functionLogMode, + AWS_LAMBDA_FUNCTION_NAME, } = process.env; -// SDK and third party client imports -import { DynamoDBClient } from "@aws-sdk/client-dynamodb"; -import { IdentitystoreClient } from "@aws-sdk/client-identitystore"; +import { + DynamoDBClient, + DynamoDBServiceException, +} from "@aws-sdk/client-dynamodb"; +import { + IdentitystoreClient, + IdentitystoreServiceException, +} from "@aws-sdk/client-identitystore"; import { ListParentsCommand, OrganizationsClient, + OrganizationsServiceException, } from "@aws-sdk/client-organizations"; -import { PublishCommand, SNSClient } from "@aws-sdk/client-sns"; -import { SendMessageCommand, SQSClient } from "@aws-sdk/client-sqs"; +import { + PublishCommand, + SNSClient, + SNSServiceException, +} from "@aws-sdk/client-sns"; +import { + SendMessageCommand, + SQSClient, + SQSServiceException, +} from "@aws-sdk/client-sqs"; import { ListInstancesCommand, ListInstancesCommandOutput, SSOAdminClient, + SSOAdminServiceException, } from "@aws-sdk/client-sso-admin"; import { fromTemporaryCredentials } from "@aws-sdk/credential-providers"; import { @@ -53,12 +69,17 @@ import { import { SNSEvent } from "aws-lambda"; import { v4 as uuidv4 } from "uuid"; import { - ErrorMessage, + logModes, requestStatus, StaticSSOPayload, } from "../../helpers/src/interfaces"; -import { logger, resolvePrincipal } from "../../helpers/src/utilities"; -// SDK and third party client object initialistaion +import { + constructExceptionMessage, + constructExceptionMessageforLogger, + logger, + resolvePrincipal, +} from "../../helpers/src/utilities"; + const ddbClientObject = new DynamoDBClient({ region: AWS_REGION, maxAttempts: 2, @@ -94,10 +115,10 @@ const organizationsClientObject = new OrganizationsClient({ maxAttempts: 2, }); -//Error notification -const errorMessage: ErrorMessage = { - Subject: "Error Processing Org event based link provisioning operation", -}; +const handlerName = AWS_LAMBDA_FUNCTION_NAME + ""; +const messageSubject = "Exception in org events trigger processing"; +let requestIdValue = ""; +let orgEventDataValue = ""; export const tagBasedDeProvisioning = async ( instanceArn: string, @@ -105,11 +126,31 @@ export const tagBasedDeProvisioning = async ( targetId: string, requestId: string ) => { + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestId, + status: requestStatus.InProgress, + relatedData: passedTagKey, + statusMessage: `Validating if tag based de-provisioining is required for tagKey ${passedTagKey} on accountID ${targetId}`, + }, + functionLogMode + ); const tagKeyLookUpValue = `${passedTagKey}^${targetId}`; + logger( + { + handler: handlerName, + logMode: logModes.Debug, + requestId: requestId, + status: requestStatus.InProgress, + relatedData: passedTagKey, + statusMessage: `Querying if there are related provisioned links for this tagKeylookupValue ${tagKeyLookUpValue}`, + }, + functionLogMode + ); const relatedProvisionedLinks: QueryCommandOutput = await ddbDocClientObject.send( - // QueryCommand is a pagniated call, however the logic requires - // checking only if the result set is greater than 0 new QueryCommand({ TableName: provisionedLinksTable, IndexName: "tagKeyLookUp", @@ -125,6 +166,18 @@ export const tagBasedDeProvisioning = async ( relatedProvisionedLinks.Items && relatedProvisionedLinks.Items.length !== 0 ) { + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestId, + status: requestStatus.InProgress, + relatedData: passedTagKey, + statusMessage: `Determined there are ${relatedProvisionedLinks.Items.length} no of related provisioned links for tagKeyLookUpValue ${tagKeyLookUpValue}`, + }, + functionLogMode + ); + await Promise.all( relatedProvisionedLinks.Items.map(async (Item) => { const parentLinkValue = Item.parentLink.toString(); @@ -152,26 +205,31 @@ export const tagBasedDeProvisioning = async ( MessageGroupId: targetId.slice(-1), }) ); - logger({ - handler: "orgEventsProcessor", - logMode: "info", - requestId: requestId, - relatedData: `${parentLinkValue}`, - status: requestStatus.Completed, - statusMessage: `OrgEvents - proactive deprovisioning due to untag resource posted to link manager topic`, - }); + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestId, + status: requestStatus.Completed, + relatedData: targetId, + statusMessage: `Triggering a deleteAccountAssignment operation as the tag key ${passedTagKey} that provisioned this access is removed from account ${targetId}`, + }, + functionLogMode + ); }) ); } else { - // Ignore if a tag that's not part of the provsionedlinks - // is deleted from the account - logger({ - handler: "orgEventsProcessor", - logMode: "info", - status: requestStatus.Completed, - requestId: requestId, - statusMessage: `OrgEvents - ignoring de-provisioning logic check as the tag created/updated/deleted is not part of provisioned links`, - }); + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestId, + status: requestStatus.Completed, + relatedData: targetId, + statusMessage: `Tag ${passedTagKey} created/updated/deleted is not part of the provisioned account assignments, so ignoring this operation`, + }, + functionLogMode + ); } }; @@ -185,14 +243,34 @@ export const orgEventProvisioning = async ( requestId: string ) => { let tagKeyLookupValue = "none"; + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestId, + status: requestStatus.InProgress, + relatedData: entityData, + statusMessage: `Initiating org events triggered provisioning for entityType ${entityType} , entityData ${entityData} for accountID ${targetId} and action ${actionType}`, + }, + functionLogMode + ); if (entityType === "account_tag") { tagKeyLookupValue = `${entityData.split("^")[0]}^${targetId}`; + logger( + { + handler: handlerName, + logMode: logModes.Debug, + requestId: requestId, + status: requestStatus.InProgress, + relatedData: entityData, + statusMessage: `Updated tagKeyLookUpValue to ${tagKeyLookupValue} as entityType is account_tag`, + }, + functionLogMode + ); } const relatedLinks: QueryCommandOutput = await ddbDocClientObject.send( - // QueryCommand is a pagniated call, however the logic requires - // checking only if the result set is greater than 0 new QueryCommand({ TableName: DdbTable, IndexName: "awsEntityData", @@ -203,6 +281,17 @@ export const orgEventProvisioning = async ( ); if (relatedLinks.Items && relatedLinks.Items?.length !== 0) { + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestId, + status: requestStatus.InProgress, + relatedData: entityData, + statusMessage: `Determined there are ${relatedLinks.Items.length} no of related account assignment operations for entityData ${entityData}`, + }, + functionLogMode + ); await Promise.all( relatedLinks.Items.map(async (Item) => { const { principalType, principalName } = Item; @@ -216,10 +305,32 @@ export const orgEventProvisioning = async ( }) ); if (permissionSetFetch.Item) { - // Compute user/group name based on whether Active Directory is the user store let principalNameToLookUp = principalName; + logger( + { + handler: handlerName, + logMode: logModes.Debug, + requestId: requestId, + status: requestStatus.InProgress, + relatedData: entityData, + statusMessage: `Computed principalNametoLookup as ${principalNameToLookUp}`, + }, + functionLogMode + ); + if (adUsed === "true" && domainName !== "") { principalNameToLookUp = `${principalName}@${domainName}`; + logger( + { + handler: handlerName, + logMode: logModes.Debug, + requestId: requestId, + status: requestStatus.InProgress, + relatedData: entityData, + statusMessage: `Deployment uses AD for SSO identity store, using domainName ${domainName}, computed principalNametoLookup as ${principalNameToLookUp}`, + }, + functionLogMode + ); } const principalId = await resolvePrincipal( identityStoreId, @@ -229,7 +340,17 @@ export const orgEventProvisioning = async ( ); if (principalId !== "0") { - // Resolved the principal ID and proceeding with the operation + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestId, + status: requestStatus.InProgress, + relatedData: entityData, + statusMessage: `For principal ${principalNameToLookUp} , resolved principal ID as ${principalId} from AWS SSO Identity store`, + }, + functionLogMode + ); const staticSSOPayload: StaticSSOPayload = { InstanceArn: instanceArn + "", TargetType: "AWS_ACCOUNT", @@ -253,49 +374,58 @@ export const orgEventProvisioning = async ( MessageGroupId: targetId.slice(-1), }) ); - logger({ - handler: "orgEventsProcessor", - logMode: "info", - relatedData: `${entityData}`, - status: requestStatus.Completed, - requestId: requestId, - statusMessage: `OrgEvents - link provisioned to link manager topic`, - }); + + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestId, + status: requestStatus.Completed, + relatedData: entityData, + statusMessage: `Posted ${actionType} operation to account assignments handler for accountID ${targetId} , permissionSetArn ${permissionSetFetch.Item.permissionSetArn}`, + }, + functionLogMode + ); } else { - // No related principals found for this link - logger({ - handler: "orgEventsProcessor", - logMode: "info", - relatedData: `${entityData}`, - status: requestStatus.Aborted, - requestId: requestId, - statusMessage: `OrgEvents - no related principals found`, - }); + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestId, + status: requestStatus.Completed, + relatedData: entityData, + statusMessage: `Ignoring this org event triggered account assignment operation as related principals are not found`, + }, + functionLogMode + ); } } else { - // No related permission sets found for this link - logger({ - handler: "orgEventsProcessor", - logMode: "info", - relatedData: `${entityData}`, - status: requestStatus.Aborted, - requestId: requestId, - statusMessage: `OrgEvents - no related permission sets found`, - }); + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestId, + status: requestStatus.Completed, + relatedData: entityData, + statusMessage: `Ignoring this org event triggered account assignment operation as related permission sets are not found`, + }, + functionLogMode + ); } }) ); } else if (entityType === "account_tag") { - // We need to determine if an account tag has been - // updated to trigger de-provisioning logic - logger({ - handler: "orgEventsProcessor", - logMode: "info", - relatedData: `${entityData}`, - requestId: requestId, - status: requestStatus.Completed, - statusMessage: `OrgEvents - conducting de-provsioning check for entityData ${entityData} on targetaccount ID ${targetId} as an account tag is now updated`, - }); + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestId, + status: requestStatus.InProgress, + relatedData: entityData, + statusMessage: `Conducting de-provisioning check for entityData ${entityData} on targetaccountID ${targetId} as an account tag is now updated`, + }, + functionLogMode + ); await tagBasedDeProvisioning( instanceArn, entityData.split("^")[0], @@ -309,14 +439,51 @@ export const orgEventProvisioning = async ( export const handler = async (event: SNSEvent) => { const requestId = uuidv4().toString(); + requestIdValue = requestId; try { const message = JSON.parse(event.Records[0].Sns.Message); + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestId, + status: requestStatus.InProgress, + statusMessage: `Initiating org event triggered account assignment operation`, + }, + functionLogMode + ); + const resolvedInstances: ListInstancesCommandOutput = await ssoAdminClientObject.send(new ListInstancesCommand({})); const instanceArn = resolvedInstances.Instances?.[0].InstanceArn + ""; const identityStoreId = resolvedInstances.Instances?.[0].IdentityStoreId + ""; + logger( + { + handler: handlerName, + logMode: logModes.Debug, + requestId: requestId, + status: requestStatus.InProgress, + relatedData: identityStoreId, + statusMessage: `Resolved identityStoreID ${identityStoreId} for instanceArn ${instanceArn}`, + }, + functionLogMode + ); + if (message.detail.eventName === "CreateAccountResult") { + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestId, + status: requestStatus.InProgress, + relatedData: + message.detail.serviceEventDetails.createAccountStatus.accountId, + statusMessage: `Triggered createAccountResult based provisioning logic for accountID ${message.detail.serviceEventDetails.createAccountStatus.accountId} and scope type as root`, + }, + functionLogMode + ); + orgEventDataValue = `createAccount for accountID ${message.detail.serviceEventDetails.createAccountStatus.accountId}`; await orgEventProvisioning( instanceArn, message.detail.serviceEventDetails.createAccountStatus.accountId, @@ -336,27 +503,58 @@ export const handler = async (event: SNSEvent) => { * root If nested OU support is not enabled, then the function would * simply remove and add any related account assignments for the old and new OU's */ - logger({ - handler: "orgEventsProcessor", - logMode: "info", - relatedData: `${message.detail.requestParameters.accountId}`, - status: requestStatus.InProgress, - requestId: requestId, - statusMessage: `OrgEvents - org move, determining the list of OU ID's`, - }); + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestId, + status: requestStatus.InProgress, + relatedData: message.detail.requestParameters.accountId, + statusMessage: `Triggered MoveAccount based provisioning logic for accountID ${message.detail.requestParameters.accountId}`, + }, + functionLogMode + ); + + orgEventDataValue = `moveAccount for account moving from old OU_ID ${message.detail.requestParameters.sourceParentId} to new OU_ID ${message.detail.requestParameters.destinationParentId}`; let oldParentsList: Array = []; let newParentsList: Array = []; oldParentsList.push(message.detail.requestParameters.sourceParentId); newParentsList.push(message.detail.requestParameters.destinationParentId); - if (supportNestedOU === "true") { - logger({ - handler: "orgEventsProcessor", - logMode: "info", - relatedData: `${message.detail.requestParameters.accountId}`, + logger( + { + handler: handlerName, + logMode: logModes.Debug, + requestId: requestId, status: requestStatus.InProgress, + relatedData: message.detail.requestParameters.accountId, + statusMessage: `Compueted old Parents List`, + }, + functionLogMode + ); + logger( + { + handler: handlerName, + logMode: logModes.Debug, requestId: requestId, - statusMessage: `OrgEvents - org move, nestedOU support enabled, traversing through the org tree for delta`, - }); + status: requestStatus.InProgress, + relatedData: message.detail.requestParameters.accountId, + statusMessage: `Compueted new Parents List`, + }, + functionLogMode + ); + + if (supportNestedOU === "true") { + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestId, + status: requestStatus.InProgress, + relatedData: message.detail.requestParameters.accountId, + statusMessage: `Nested OU support enabled, traversing through the org tree for delta`, + }, + functionLogMode + ); /** * Orgs API listParents call only returns the parent up to one level up. * The below code would traverse the tree until it reaches root @@ -366,6 +564,17 @@ export const handler = async (event: SNSEvent) => { .toString() .match(/r-.*/) ) { + logger( + { + handler: handlerName, + logMode: logModes.Debug, + requestId: requestId, + status: requestStatus.InProgress, + relatedData: message.detail.requestParameters.accountId, + statusMessage: `Validated that sourceParent is not a root, so traversing all the result OU's from old parent`, + }, + functionLogMode + ); let loop = true; let previousParentId = message.detail.requestParameters.sourceParentId; @@ -396,6 +605,17 @@ export const handler = async (event: SNSEvent) => { .toString() .match(/r-.*/) ) { + logger( + { + handler: handlerName, + logMode: logModes.Debug, + requestId: requestId, + status: requestStatus.InProgress, + relatedData: message.detail.requestParameters.accountId, + statusMessage: `Validated that destinationParent is not a root, so traversing all the result OU's from new parent`, + }, + functionLogMode + ); let loop = true; let previousParentId = message.detail.requestParameters.destinationParentId; @@ -435,28 +655,45 @@ export const handler = async (event: SNSEvent) => { const parentsToAdd: Array = newParentsList.filter( (parent) => !oldParentsList.includes(parent) ); - logger({ - handler: "orgEventsProcessor", - logMode: "info", - relatedData: `${message.detail.requestParameters.accountId}`, - status: requestStatus.InProgress, - requestId: requestId, - statusMessage: `OrgEvents - account move, list of OU ID's calculated for de-provisioning: ${JSON.stringify( - parentsToRemove - )}`, - }); - logger({ - handler: "orgEventsProcessor", - logMode: "info", - relatedData: `${message.detail.requestParameters.accountId}`, - status: requestStatus.InProgress, - requestId: requestId, - statusMessage: `OrgEvents - account move, list of OU ID's calculated for provisioning: ${JSON.stringify( - parentsToAdd - )}`, - }); + logger( + { + handler: handlerName, + logMode: logModes.Info, + relatedData: message.detail.requestParameters.accountId, + status: requestStatus.InProgress, + requestId: requestId, + statusMessage: `OrgEvents - account move, list of OU ID's calculated for de-provisioning: ${JSON.stringify( + parentsToRemove + )}`, + }, + functionLogMode + ); + logger( + { + handler: handlerName, + logMode: logModes.Info, + relatedData: message.detail.requestParameters.accountId, + status: requestStatus.InProgress, + requestId: requestId, + statusMessage: `OrgEvents - account move, list of OU ID's calculated for provisioning: ${JSON.stringify( + parentsToAdd + )}`, + }, + functionLogMode + ); /** Start processing deletion of any related account assignments for old parents list */ for (const parent of parentsToRemove) { + logger( + { + handler: handlerName, + logMode: logModes.Debug, + relatedData: message.detail.requestParameters.accountId, + status: requestStatus.InProgress, + requestId: requestId, + statusMessage: `Processing delete for any related accountassignment for ou_id ${parent}`, + }, + functionLogMode + ); await orgEventProvisioning( instanceArn, message.detail.requestParameters.accountId, @@ -469,6 +706,17 @@ export const handler = async (event: SNSEvent) => { } /** Start processing addition of any related account assignments for new parents list */ for (const parent of parentsToAdd) { + logger( + { + handler: handlerName, + logMode: logModes.Debug, + relatedData: message.detail.requestParameters.accountId, + status: requestStatus.InProgress, + requestId: requestId, + statusMessage: `Processing add for any related accountassignment for ou_id ${parent}`, + }, + functionLogMode + ); await orgEventProvisioning( instanceArn, message.detail.requestParameters.accountId, @@ -480,39 +728,45 @@ export const handler = async (event: SNSEvent) => { ); } } else if (message["detail-type"] === "Tag Change on Resource") { - // When tag changes are recieved by the lambda - // handler it would contain changed-tag-keys - // and the current set of tag key value pairs - // The logic first determines if a tag is - // deleted (or) created (or) updated on the account - // If a tag key is deleted, the solution looks up - // provisionedLinks table to determine if there were - // any links provisioned with that tag key and if the - // result length is more than 0, trigger de-provisioning - // If a tag key is created/updated, then the solution - // looks up linksTable with entityData and determines if there's - // a link that matches this entityData. If there is a link that - // matches this entityData, the solution triggers provisioning - // logic with the link it retreived. If there's no link that - // matches this entityData, the solutions looks up provisionedlinks - // table to determine if there's an existing link with the tagkey - // If there is a provisioned link existing this indicates that an - // account had a scope tag updates, so the solution triggers - // de-provisioning logic + /** + * // When tag changes are recieved by the lambda // handler it would + * contain changed-tag-keys // and the current set of tag key value pairs + * // The logic first determines if a tag is // deleted (or) created (or) + * updated on the account // If a tag key is deleted, the solution looks + * up // provisionedLinks table to determine if there were // any links + * provisioned with that tag key and if the // result length is more than + * 0, trigger de-provisioning // If a tag key is created/updated, then the + * solution // looks up linksTable with entityData and determines if + * there's // a link that matches this entityData. If there is a link that + * // matches this entityData, the solution triggers provisioning // logic + * with the link it retreived. If there's no link that // matches this + * entityData, the solutions looks up provisionedlinks // table to + * determine if there's an existing link with the tagkey // If there is a + * provisioned link existing this indicates that an // account had a scope + * tag updates, so the solution triggers // de-provisioning logic + */ + const { detail, resources } = message; const { tags } = detail; const changedTagKeys = detail["changed-tag-keys"]; + orgEventDataValue = `tagChange on resource for changedTagKeys ${JSON.stringify( + changedTagKeys + )}`; await Promise.all( changedTagKeys.map(async (changedTagKey: string) => { if (!Object.prototype.hasOwnProperty.call(tags, changedTagKey)) { // Account tag has been deleted - logger({ - handler: "orgEventsProcessor", - logMode: "info", - relatedData: `${changedTagKey}`, - status: requestStatus.Completed, - statusMessage: `OrgEvents - tag change , delta is a delete operation`, - }); + logger( + { + handler: handlerName, + logMode: logModes.Info, + relatedData: changedTagKey, + status: requestStatus.InProgress, + requestId: requestId, + statusMessage: `Determined tag change is a delta operation`, + }, + functionLogMode + ); await tagBasedDeProvisioning( instanceArn, changedTagKey, @@ -523,14 +777,17 @@ export const handler = async (event: SNSEvent) => { Object.prototype.hasOwnProperty.call(tags, changedTagKey) ) { // Account tag is either created/updated - logger({ - handler: "orgEventsProcessor", - logMode: "info", - relatedData: `${changedTagKey}`, - status: requestStatus.Completed, - requestId: requestId, - statusMessage: `OrgEvents - tag change , delta is a create/update operation`, - }); + logger( + { + handler: handlerName, + logMode: logModes.Info, + relatedData: changedTagKey, + status: requestStatus.InProgress, + requestId: requestId, + statusMessage: `Determined tag change is a create/update operation`, + }, + functionLogMode + ); const tagValue = tags[`${changedTagKey}`]; await orgEventProvisioning( instanceArn, @@ -546,24 +803,65 @@ export const handler = async (event: SNSEvent) => { ); } } catch (err) { - await snsClientObject.send( - new PublishCommand({ - TopicArn: errorNotificationsTopicArn, - Message: JSON.stringify({ - ...errorMessage, - eventDetail: event, - errorDetails: err, - }), - }) - ); - logger({ - handler: "orgEventsProcessor", - logMode: "error", - status: requestStatus.FailedWithException, - requestId: requestId, - statusMessage: `org events processor failed with exception: ${JSON.stringify( - err - )} for eventDetail: ${JSON.stringify(event)}`, - }); + if ( + err instanceof DynamoDBServiceException || + err instanceof IdentitystoreServiceException || + err instanceof OrganizationsServiceException || + err instanceof SNSServiceException || + err instanceof SQSServiceException || + err instanceof SSOAdminServiceException + ) { + await snsClientObject.send( + new PublishCommand({ + TopicArn: errorNotificationsTopicArn, + Subject: messageSubject, + Message: constructExceptionMessage( + requestIdValue, + handlerName, + err.name, + err.message, + orgEventDataValue + ), + }) + ); + logger({ + handler: handlerName, + requestId: requestIdValue, + logMode: logModes.Exception, + status: requestStatus.FailedWithException, + statusMessage: constructExceptionMessageforLogger( + requestIdValue, + err.name, + err.message, + orgEventDataValue + ), + }); + } else { + await snsClientObject.send( + new PublishCommand({ + TopicArn: errorNotificationsTopicArn, + Subject: messageSubject, + Message: constructExceptionMessage( + requestIdValue, + handlerName, + "Unhandled exception", + JSON.stringify(err), + orgEventDataValue + ), + }) + ); + logger({ + handler: handlerName, + requestId: requestIdValue, + logMode: logModes.Exception, + status: requestStatus.FailedWithException, + statusMessage: constructExceptionMessageforLogger( + requestIdValue, + "Unhandled exception", + JSON.stringify(err), + orgEventDataValue + ), + }); + } } }; diff --git a/lib/lambda-functions/application-handlers/src/permissionSetSync.ts b/lib/lambda-functions/application-handlers/src/permissionSetSync.ts index f67f749..89233a1 100644 --- a/lib/lambda-functions/application-handlers/src/permissionSetSync.ts +++ b/lib/lambda-functions/application-handlers/src/permissionSetSync.ts @@ -1,17 +1,16 @@ -/* -Objective: Implement permission set sync -Trigger source: Permission set sync notification - which in turn is triggered by permission - set topic handler when it determines that - there is a permission set being created/updated - that has not yet been provisioned -- assumes role in SSO account for calling SSO admin API -- fetches if there are links provisioned already - for the permission set in the links table -- Process the appropriate links -- Catch all failures in a generic exception block - and post the error details to error notifications topics -*/ +/** + * Objective: Implement permission set sync Trigger source: Permission set sync + * notification which in turn is triggered by permission set topic handler when + * it determines that there is a permission set being created/updated that has + * not yet been provisioned + * + * - Assumes role in SSO account for calling SSO admin API + * - Fetches if there are links provisioned already for the permission set in the + * links table + * - Process the appropriate links + * - Catch all failures in a generic exception block and post the error details to + * error notifications topics + */ const { linksTableName, @@ -27,18 +26,34 @@ const { ssoRegion, supportNestedOU, AWS_REGION, + functionLogMode, + AWS_LAMBDA_FUNCTION_NAME, } = process.env; -// SDK and third party client imports -import { DynamoDBClient } from "@aws-sdk/client-dynamodb"; -import { IdentitystoreClient } from "@aws-sdk/client-identitystore"; -import { SFNClient } from "@aws-sdk/client-sfn"; -import { PublishCommand, SNSClient } from "@aws-sdk/client-sns"; -import { SendMessageCommand, SQSClient } from "@aws-sdk/client-sqs"; +import { + DynamoDBClient, + DynamoDBServiceException, +} from "@aws-sdk/client-dynamodb"; +import { + IdentitystoreClient, + IdentitystoreServiceException, +} from "@aws-sdk/client-identitystore"; +import { SFNClient, SFNServiceException } from "@aws-sdk/client-sfn"; +import { + PublishCommand, + SNSClient, + SNSServiceException, +} from "@aws-sdk/client-sns"; +import { + SendMessageCommand, + SQSClient, + SQSServiceException, +} from "@aws-sdk/client-sqs"; import { ListInstancesCommand, ListInstancesCommandOutput, SSOAdminClient, + SSOAdminServiceException, } from "@aws-sdk/client-sso-admin"; import { fromTemporaryCredentials } from "@aws-sdk/credential-providers"; import { @@ -49,18 +64,19 @@ import { import { SNSEvent } from "aws-lambda"; import { v4 as uuidv4 } from "uuid"; import { - ErrorMessage, + logModes, requestStatus, StateMachinePayload, StaticSSOPayload, } from "../../helpers/src/interfaces"; import { + constructExceptionMessage, + constructExceptionMessageforLogger, invokeStepFunction, logger, resolvePrincipal, } from "../../helpers/src/utilities"; -// SDK and third party client object initialistaion const ddbClientObject = new DynamoDBClient({ region: AWS_REGION, maxAttempts: 2, @@ -96,18 +112,26 @@ const sfnClientObject = new SFNClient({ maxAttempts: 2, }); -//Error notification -const errorMessage: ErrorMessage = { - Subject: "Error Processing link stream handler", -}; +const handlerName = AWS_LAMBDA_FUNCTION_NAME + ""; +const messageSubject = "Exception in permission set sync processing"; +let permissionSetName = ""; export const handler = async (event: SNSEvent) => { const requestId = uuidv4().toString(); + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestId, + status: requestStatus.InProgress, + statusMessage: `Initiating permission set sync check logic`, + }, + functionLogMode + ); try { const message = JSON.parse(event.Records[0].Sns.Message); + permissionSetName = message.permission_set_name; const relatedLinks: QueryCommandOutput = await ddbDocClientObject.send( - // QueryCommand is a pagniated call, however the logic requires - // checking only if the result set is greater than 0 new QueryCommand({ TableName: linksTableName, IndexName: "permissionSetName", @@ -118,21 +142,46 @@ export const handler = async (event: SNSEvent) => { }, }) ); - logger({ - handler: "permissionSetSyncHandler", - logMode: "info", - requestId: requestId, - relatedData: `${message.permission_set_name}`, - status: requestStatus.InProgress, - statusMessage: `Permission Set sync - operation started`, - }); + logger( + { + handler: handlerName, + logMode: logModes.Debug, + requestId: requestId, + relatedData: permissionSetName, + status: requestStatus.InProgress, + statusMessage: `Validating if there are related account assignment links for this permission set`, + }, + functionLogMode + ); if (relatedLinks.Items && relatedLinks.Items.length !== 0) { + logger( + { + handler: handlerName, + logMode: logModes.Debug, + requestId: requestId, + relatedData: permissionSetName, + status: requestStatus.InProgress, + statusMessage: `Resolved that there are ${relatedLinks.Items.length} no of account assignments for this permission set`, + }, + functionLogMode + ); const resolvedInstances: ListInstancesCommandOutput = await ssoAdminClientObject.send(new ListInstancesCommand({})); const instanceArn = resolvedInstances.Instances?.[0].InstanceArn + ""; const identityStoreId = resolvedInstances.Instances?.[0].IdentityStoreId + ""; + logger( + { + handler: handlerName, + logMode: logModes.Debug, + requestId: requestId, + relatedData: permissionSetName, + status: requestStatus.InProgress, + statusMessage: `Resolved instanceArn as ${instanceArn} and identityStoreId as ${identityStoreId}`, + }, + functionLogMode + ); await Promise.all( relatedLinks.Items.map(async (Item) => { @@ -140,6 +189,17 @@ export const handler = async (event: SNSEvent) => { if (adUsed === "true" && domainName !== "") { principalNameToLookUp = `${Item.principalName}@${domainName}`; } + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestId, + relatedData: permissionSetName, + status: requestStatus.InProgress, + statusMessage: `Compputed principalName as ${principalNameToLookUp} for looking up in identity store`, + }, + functionLogMode + ); const principalId = await resolvePrincipal( identityStoreId, identityStoreClientObject, @@ -152,7 +212,17 @@ export const handler = async (event: SNSEvent) => { PrincipalType: Item.principalType, }; if (principalId !== "0") { - // Resolved the principal ID and proceeding with the operation + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestId, + relatedData: permissionSetName, + status: requestStatus.InProgress, + statusMessage: `Resolved principalId as ${principalId} for principalName ${principalNameToLookUp}`, + }, + functionLogMode + ); if (Item.awsEntityType === "account") { await sqsClientObject.send( new SendMessageCommand({ @@ -172,14 +242,17 @@ export const handler = async (event: SNSEvent) => { MessageGroupId: Item.awsEntityData.slice(-1), }) ); - logger({ - handler: "permissionSetSyncHandler", - logMode: "info", - relatedData: `${message.permission_set_name}`, - status: requestStatus.Completed, - requestId: requestId, - statusMessage: `Permission Set sync - posted to link manager topic`, - }); + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestId, + relatedData: permissionSetName, + status: requestStatus.Completed, + statusMessage: `Triggered permission set based account assignment create for accountId ${Item.awsEntityData} tagged to principalID ${principalId}`, + }, + functionLogMode + ); } else if ( Item.awsEntityType === "ou_id" || Item.awsEntityType === "root" || @@ -205,59 +278,106 @@ export const handler = async (event: SNSEvent) => { processTargetAccountSMArn + "", sfnClientObject ); - logger({ - handler: "permissionSetSyncHandler", - logMode: "info", - relatedData: `${message.permission_set_name}`, - requestId: requestId, - status: requestStatus.Completed, - statusMessage: `Permission Set sync - posted to step function`, - }); + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestId, + relatedData: permissionSetName, + status: requestStatus.Completed, + statusMessage: `Triggered state machine for non-account assignment create for entityType ${Item.awsEntityType} with entityData ${Item.awsEntityData}`, + }, + functionLogMode + ); } } else { - // No related principalsfound for this link - logger({ - handler: "permissionSetSyncHandler", - logMode: "info", - relatedData: `${message.permission_set_name}`, - requestId: requestId, - status: requestStatus.Completed, - statusMessage: `Permission Set sync - no related principals found`, - }); + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestId, + relatedData: permissionSetName, + status: requestStatus.Completed, + statusMessage: `No related principals found, completing permission set sync operation`, + }, + functionLogMode + ); } }) ); } else { - // Ignoring permission set sync as there are no - // related links already provisioined for this permission set + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestId, + relatedData: permissionSetName, + status: requestStatus.Completed, + statusMessage: `No related account assignments found, completing permission set sync operation`, + }, + functionLogMode + ); + } + } catch (err) { + if ( + err instanceof DynamoDBServiceException || + err instanceof IdentitystoreServiceException || + err instanceof SFNServiceException || + err instanceof SNSServiceException || + err instanceof SQSServiceException || + err instanceof SSOAdminServiceException + ) { + await snsClientObject.send( + new PublishCommand({ + TopicArn: errorNotificationsTopicArn, + Subject: messageSubject, + Message: constructExceptionMessage( + requestId, + handlerName, + err.name, + err.message, + permissionSetName + ), + }) + ); + logger({ + handler: handlerName, + requestId: requestId, + logMode: logModes.Exception, + status: requestStatus.FailedWithException, + statusMessage: constructExceptionMessageforLogger( + requestId, + err.name, + err.message, + permissionSetName + ), + }); + } else { + await snsClientObject.send( + new PublishCommand({ + TopicArn: errorNotificationsTopicArn, + Subject: messageSubject, + Message: constructExceptionMessage( + requestId, + handlerName, + "Unhandled exception", + JSON.stringify(err), + permissionSetName + ), + }) + ); logger({ - handler: "permissionSetSyncHandler", - logMode: "info", - relatedData: `${message.permission_set_name}`, + handler: handlerName, requestId: requestId, - status: requestStatus.Completed, - statusMessage: `Permission Set sync - ignoring operation as there are no related links already provisioined for this permission set`, + logMode: logModes.Exception, + status: requestStatus.FailedWithException, + statusMessage: constructExceptionMessageforLogger( + requestId, + "Unhandled exception", + JSON.stringify(err), + permissionSetName + ), }); } - } catch (err) { - await snsClientObject.send( - new PublishCommand({ - TopicArn: errorNotificationsTopicArn, - Message: JSON.stringify({ - ...errorMessage, - eventDetail: event, - errorDetails: err, - }), - }) - ); - logger({ - handler: "permissionSetSyncHandler", - logMode: "error", - status: requestStatus.FailedWithException, - requestId: requestId, - statusMessage: `permission set sync processor failed with exception: ${JSON.stringify( - err - )} for eventDetail: ${JSON.stringify(event)}`, - }); } }; diff --git a/lib/lambda-functions/application-handlers/src/permissionSetTopicProcessor.ts b/lib/lambda-functions/application-handlers/src/permissionSetTopicProcessor.ts index 34870bc..f7f76a4 100644 --- a/lib/lambda-functions/application-handlers/src/permissionSetTopicProcessor.ts +++ b/lib/lambda-functions/application-handlers/src/permissionSetTopicProcessor.ts @@ -1,41 +1,33 @@ -/* -Objective: Implement permission set CRUD operations -Trigger source: permission set topic notifications -- assumes role in SSO account for calling SSO admin API -- if operation type is insert - - read complete permission set object from - ddb table - - create permission set object with the params - set for session duration, name, relay state - and description - - upsert into permissionsetArn table with the - value received from above - - apply tags to permission set if they exist - - apply managed policies to permission set if they - exit - - if inline policy exists, attach the inline - policy to the permission set -- if operation type is modify - - determine if the delta is any of the following: - managed policies - inline policy - session duration - relay state - tags - - process update permission set if any of the above - fields are changed - - if the changes include managed policy or inline - policy changes, trigger a reprovisioning operation - as well and post the request id to waiter handler -- if operation type is delete - - delete the permission set first - - then delete the permission set arn entry as well -- if operation type is create/delete, post permission set - name, permission set arn, reprovision status to permission - set sync topic -- Catch all failures in a generic exception block - and post the error details to error notifications topics -*/ +/** + * Objective: Implement permission set CRUD operations Trigger source: + * permission set topic notifications + * + * - Assumes role in SSO account for calling SSO admin API + * - If operation type is insert + * + * - Read complete permission set object from ddb table + * - Create permission set object with the params set for session duration, name, + * relay state and description + * - Upsert into permissionsetArn table with the value received from above + * - Apply tags to permission set if they exist + * - Apply managed policies to permission set if they exit + * - If inline policy exists, attach the inline policy to the permission set + * - If operation type is modify + * + * - Determine if the delta is any of the following: managed policies inline + * policy session duration relay state tags + * - Process update permission set if any of the above fields are changed + * - If the changes include managed policy or inline policy changes, trigger a + * reprovisioning operation as well and post the request id to waiter handler + * - If operation type is delete + * + * - Delete the permission set first + * - Then delete the permission set arn entry as well + * - If operation type is create/delete, post permission set name, permission set + * arn, reprovision status to permission set sync topic + * - Catch all failures in a generic exception block and post the error details to + * error notifications topics + */ const { SSOAPIRoleArn, @@ -46,11 +38,19 @@ const { waiterHandlerSSOAPIRoleArn, ssoRegion, AWS_REGION, + functionLogMode, + AWS_LAMBDA_FUNCTION_NAME, } = process.env; -// SDK and third party client imports -import { DynamoDBClient } from "@aws-sdk/client-dynamodb"; -import { PublishCommand, SNSClient } from "@aws-sdk/client-sns"; +import { + DynamoDBClient, + DynamoDBServiceException, +} from "@aws-sdk/client-dynamodb"; +import { + PublishCommand, + SNSClient, + SNSServiceException, +} from "@aws-sdk/client-sns"; import { AttachManagedPolicyToPermissionSetCommand, CreatePermissionSetCommand, @@ -63,6 +63,7 @@ import { ProvisionPermissionSetCommand, PutInlinePolicyToPermissionSetCommand, SSOAdminClient, + SSOAdminServiceException, TagResourceCommand, UntagResourceCommand, UpdatePermissionSetCommand, @@ -78,9 +79,13 @@ import { import { SNSEvent } from "aws-lambda"; import { diff } from "json-diff"; import { waitUntilPermissionSetProvisioned } from "../../custom-waiters/src/waitUntilPermissionSetProvisioned"; -import { ErrorMessage, requestStatus, Tag } from "../../helpers/src/interfaces"; +import { logModes, requestStatus, Tag } from "../../helpers/src/interfaces"; import { serializeDurationToISOFormat } from "../../helpers/src/isoDurationUtility"; -import { logger } from "../../helpers/src/utilities"; +import { + constructExceptionMessage, + constructExceptionMessageforLogger, + logger, +} from "../../helpers/src/utilities"; // SDK and third party client object initialistaion const ddbClientObject = new DynamoDBClient({ @@ -109,19 +114,43 @@ const ssoAdminClientObject = new SSOAdminClient({ }), maxAttempts: 2, }); -//Error notification -const errorMessage: ErrorMessage = { - Subject: "Error Processing Permission Set Provisioning operation", -}; + +const handlerName = AWS_LAMBDA_FUNCTION_NAME + ""; +const messageSubject = "Exception in permission set CRUD processing"; +let requestIdValue = ""; +let permissionSetNameValue = ""; export const handler = async (event: SNSEvent) => { + const message = JSON.parse(event.Records[0].Sns.Message); + requestIdValue = message.requestId; try { - const message = JSON.parse(event.Records[0].Sns.Message); const permissionSetName = message.permissionSetName; - const requestId = message.requestId; + permissionSetNameValue = permissionSetName; + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestIdValue, + relatedData: permissionSetNameValue, + status: requestStatus.InProgress, + statusMessage: `Initiating permission set CRUD logic`, + }, + functionLogMode + ); const resolvedInstances: ListInstancesCommandOutput = await ssoAdminClientObject.send(new ListInstancesCommand({})); const instanceArn = resolvedInstances.Instances?.[0].InstanceArn + ""; + logger( + { + handler: handlerName, + logMode: logModes.Debug, + requestId: requestIdValue, + relatedData: permissionSetNameValue, + status: requestStatus.InProgress, + statusMessage: `Resolved instanceArn as ${instanceArn}`, + }, + functionLogMode + ); let permissionSetArn = ""; let syncPermissionSet = false; let reProvision = false; @@ -133,14 +162,17 @@ export const handler = async (event: SNSEvent) => { let sessionDurationPresent = false; let relayStatePresent = false; - logger({ - handler: "permissionSetTopicProcessor", - logMode: "info", - requestId: requestId, - relatedData: permissionSetName, - status: requestStatus.InProgress, - statusMessage: `PermissionSet topic processor ${message.action} operation in progress`, - }); + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestIdValue, + relatedData: permissionSetNameValue, + status: requestStatus.InProgress, + statusMessage: `Determined permission set operation is of type ${message.action}`, + }, + functionLogMode + ); const fetchPermissionSet: GetCommandOutput = await ddbDocClientObject.send( new GetCommand({ @@ -151,6 +183,17 @@ export const handler = async (event: SNSEvent) => { }) ); if (fetchPermissionSet.Item) { + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestIdValue, + relatedData: permissionSetNameValue, + status: requestStatus.InProgress, + statusMessage: `Determined that permission set exists`, + }, + functionLogMode + ); const currentItem = fetchPermissionSet.Item; if (message.action === "create") { const createOp = await ssoAdminClientObject.send( @@ -162,17 +205,31 @@ export const handler = async (event: SNSEvent) => { : permissionSetName, }) ); - logger({ - handler: "permissionSetTopicProcessor", - logMode: "info", - requestId: requestId, - relatedData: permissionSetName, - status: requestStatus.InProgress, - statusMessage: `PermissionSet create operation - object in AWS SSO`, - }); + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestIdValue, + relatedData: permissionSetNameValue, + status: requestStatus.InProgress, + statusMessage: `Triggered create operation for permissionSet in AWS SSO`, + }, + functionLogMode + ); permissionSetArn = createOp.PermissionSet?.PermissionSetArn?.toString() + ""; + logger( + { + handler: handlerName, + logMode: logModes.Debug, + requestId: requestIdValue, + relatedData: permissionSetNameValue, + status: requestStatus.InProgress, + statusMessage: `createPermissionSet operation returned permissionSetArn as ${permissionSetArn}`, + }, + functionLogMode + ); /** * Update relayState and sessionDuration if they match length greater * than 0 SSO Admin API sets sessionDuration to 60 mins when @@ -199,14 +256,17 @@ export const handler = async (event: SNSEvent) => { }), }) ); - logger({ - handler: "permissionSetTopicProcessor", - logMode: "info", - requestId: requestId, - relatedData: permissionSetName, - status: requestStatus.InProgress, - statusMessage: `PermissionSet create operation - updated relayState and currentSessionDuration`, - }); + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestIdValue, + relatedData: permissionSetNameValue, + status: requestStatus.InProgress, + statusMessage: `Updated relayState and sessionDuration for permissionSet create operation`, + }, + functionLogMode + ); } else if ( currentItem.relayState && currentItem.relayState.length > 0 @@ -218,14 +278,17 @@ export const handler = async (event: SNSEvent) => { RelayState: currentItem.relayState, }) ); - logger({ - handler: "permissionSetTopicProcessor", - logMode: "info", - requestId: requestId, - relatedData: permissionSetName, - status: requestStatus.InProgress, - statusMessage: `PermissionSet create operation - updated relayState`, - }); + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestIdValue, + relatedData: permissionSetNameValue, + status: requestStatus.InProgress, + statusMessage: `Updated relayState for permissionSet create operation`, + }, + functionLogMode + ); } else if ( currentItem.sessionDurationInMinutes && currentItem.sessionDurationInMinutes.length > 0 @@ -239,14 +302,17 @@ export const handler = async (event: SNSEvent) => { }), }) ); - logger({ - handler: "permissionSetTopicProcessor", - logMode: "info", - requestId: requestId, - relatedData: permissionSetName, - status: requestStatus.InProgress, - statusMessage: `PermissionSet update operation - updated currentSessionDuration`, - }); + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestIdValue, + relatedData: permissionSetNameValue, + status: requestStatus.InProgress, + statusMessage: `Updated sessionDuration for permissionSet create operation`, + }, + functionLogMode + ); } } @@ -262,14 +328,17 @@ export const handler = async (event: SNSEvent) => { }, }) ); - logger({ - handler: "permissionSetTopicProcessor", - logMode: "info", - requestId: requestId, - relatedData: permissionSetName, - status: requestStatus.InProgress, - statusMessage: `PermissionSet create operation - arn updated in DDB with arn value: ${permissionSetArn}`, - }); + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestIdValue, + relatedData: permissionSetNameValue, + status: requestStatus.InProgress, + statusMessage: `Updated solution persistence with arn value for permission set create operation`, + }, + functionLogMode + ); if (currentItem.tags.length !== 0) { await ssoAdminClientObject.send( new TagResourceCommand({ @@ -278,14 +347,17 @@ export const handler = async (event: SNSEvent) => { Tags: currentItem.tags, }) ); - logger({ - handler: "permissionSetTopicProcessor", - logMode: "info", - requestId: requestId, - relatedData: permissionSetName, - status: requestStatus.InProgress, - statusMessage: `PermissionSet create operation - tags updated`, - }); + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestIdValue, + relatedData: permissionSetNameValue, + status: requestStatus.InProgress, + statusMessage: `Updated tags for permissionSet create operation`, + }, + functionLogMode + ); } if (currentItem.managedPoliciesArnList.length !== 0) { await Promise.all( @@ -302,14 +374,17 @@ export const handler = async (event: SNSEvent) => { } ) ); - logger({ - handler: "permissionSetTopicProcessor", - logMode: "info", - requestId: requestId, - relatedData: permissionSetName, - status: requestStatus.InProgress, - statusMessage: `PermissionSet create operation - managed Policies attached`, - }); + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestIdValue, + relatedData: permissionSetNameValue, + status: requestStatus.InProgress, + statusMessage: `Managed policies attached for permissionSet create operation`, + }, + functionLogMode + ); } if ("inlinePolicyDocument" in currentItem) { if (Object.keys(currentItem.inlinePolicyDocument).length !== 0) { @@ -321,26 +396,31 @@ export const handler = async (event: SNSEvent) => { createOp.PermissionSet?.PermissionSetArn?.toString(), }) ); - - logger({ - handler: "permissionSetTopicProcessor", - logMode: "info", - requestId: requestId, - relatedData: permissionSetName, - status: requestStatus.InProgress, - statusMessage: `PermissionSet create operation - Inline Policy created`, - }); + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestIdValue, + relatedData: permissionSetNameValue, + status: requestStatus.InProgress, + statusMessage: `Inline policy created for permission set create operation`, + }, + functionLogMode + ); } } syncPermissionSet = true; - logger({ - handler: "permissionSetTopicProcessor", - logMode: "info", - requestId: requestId, - relatedData: permissionSetName, - status: requestStatus.Completed, - statusMessage: `PermissionSet create operation - completed`, - }); + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestIdValue, + relatedData: permissionSetNameValue, + status: requestStatus.Completed, + statusMessage: `permissionSet create operation completed`, + }, + functionLogMode + ); } else if (message.action === "update") { const oldItem = message.oldPermissionSetData; @@ -355,27 +435,32 @@ export const handler = async (event: SNSEvent) => { sortedOldItemManagedPoliciesArnList; currentItem["sortedManagedPoliciesArnList"] = sortedCurrentItemManagedPoliciesArnList; - - logger({ - handler: "permissionSetTopicProcessor", - logMode: "info", - requestId: requestId, - relatedData: permissionSetName, - status: requestStatus.InProgress, - statusMessage: `PermissionSet update operation - Calculating delta`, - }); + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestIdValue, + relatedData: permissionSetNameValue, + status: requestStatus.InProgress, + statusMessage: `calculating delta for permissionSet update operation`, + }, + functionLogMode + ); const diffCalculated = diff(oldItem, currentItem); if (diffCalculated === undefined) { - logger({ - handler: "permissionSetTopicProcessor", - logMode: "info", - requestId: requestId, - relatedData: permissionSetName, - status: requestStatus.Completed, - statusMessage: `PermissionSet update operation - no delta determined, completing update operation`, - }); + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestIdValue, + relatedData: permissionSetNameValue, + status: requestStatus.Completed, + statusMessage: `No delta determined for permissionSet update operation, completing update operation`, + }, + functionLogMode + ); } else { const fetchArn: GetCommandOutput = await ddbDocClientObject.send( new GetCommand({ @@ -386,15 +471,17 @@ export const handler = async (event: SNSEvent) => { }) ); if (fetchArn.Item) { - logger({ - handler: "permissionSetTopicProcessor", - logMode: "info", - requestId: requestId, - relatedData: permissionSetName, - status: requestStatus.InProgress, - statusMessage: `PermissionSet update operation - object and arn found, progressing with delta`, - }); - + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestIdValue, + relatedData: permissionSetNameValue, + status: requestStatus.InProgress, + statusMessage: `objectArn found, progressing with delta for permission Set update operation`, + }, + functionLogMode + ); if ( currentItem.sessionDurationInMinutes && currentItem.sessionDurationInMinutes.length > 0 @@ -434,6 +521,18 @@ export const handler = async (event: SNSEvent) => { keyValue = k.toString(); } switchKey = `${keyValue}-${changeType}`; + logger( + { + handler: handlerName, + logMode: logModes.Debug, + requestId: requestIdValue, + relatedData: permissionSetNameValue, + status: requestStatus.InProgress, + statusMessage: `Determining delta for switchKey ${switchKey} as part of permissionSet update operation`, + }, + functionLogMode + ); + switch (switchKey) { case "sortedManagedPoliciesArnList-add": { const changeSettoAdd: Array = @@ -448,14 +547,18 @@ export const handler = async (event: SNSEvent) => { ); } reProvision = true; - logger({ - handler: "permissionSetTopicProcessor", - logMode: "info", - requestId: requestId, - relatedData: permissionSetName, - status: requestStatus.InProgress, - statusMessage: `PermissionSet update operation - added managed policies`, - }); + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestIdValue, + relatedData: permissionSetNameValue, + status: requestStatus.InProgress, + statusMessage: `added managed policies for permission Set update operation`, + }, + functionLogMode + ); + break; } case "sortedManagedPoliciesArnList-remove": { @@ -471,14 +574,17 @@ export const handler = async (event: SNSEvent) => { ); } reProvision = true; - logger({ - handler: "permissionSetTopicProcessor", - logMode: "info", - requestId: requestId, - relatedData: permissionSetName, - status: requestStatus.InProgress, - statusMessage: `PermissionSet update operation - removed managed policies`, - }); + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestIdValue, + relatedData: permissionSetNameValue, + status: requestStatus.InProgress, + statusMessage: `removed managed policies for permission Set update operation`, + }, + functionLogMode + ); break; } @@ -518,14 +624,17 @@ export const handler = async (event: SNSEvent) => { } reProvision = true; - logger({ - handler: "permissionSetTopicProcessor", - logMode: "info", - requestId: requestId, - relatedData: permissionSetName, - status: requestStatus.InProgress, - statusMessage: `PermissionSet update operation - removed managed policies from changeSet calculated`, - }); + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestIdValue, + relatedData: permissionSetNameValue, + status: requestStatus.InProgress, + statusMessage: `removed managed policies from changeSet calculated for permission Set update operation`, + }, + functionLogMode + ); } if (changeSettoAdd.length > 0) { for (const managedPolicyArn of changeSettoAdd) { @@ -538,14 +647,18 @@ export const handler = async (event: SNSEvent) => { ); } - logger({ - handler: "permissionSetTopicProcessor", - logMode: "info", - requestId: requestId, - relatedData: permissionSetName, - status: requestStatus.InProgress, - statusMessage: `PermissionSet update operation - added managed policies from changeSet calculated`, - }); + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestIdValue, + relatedData: permissionSetNameValue, + status: requestStatus.InProgress, + statusMessage: `added managed policies from changeSet calculated for permission Set update operation`, + }, + functionLogMode + ); + reProvision = true; } break; @@ -562,14 +675,18 @@ export const handler = async (event: SNSEvent) => { ), }) ); - logger({ - handler: "permissionSetTopicProcessor", - logMode: "info", - requestId: requestId, - relatedData: permissionSetName, - status: requestStatus.InProgress, - statusMessage: `PermissionSet update operation - create/updated inline policy document`, - }); + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestIdValue, + relatedData: permissionSetNameValue, + status: requestStatus.InProgress, + statusMessage: `created/updated inline policy document for permission Set update operation`, + }, + functionLogMode + ); + reProvision = true; } break; @@ -581,14 +698,18 @@ export const handler = async (event: SNSEvent) => { PermissionSetArn: permissionSetArn, }) ); - logger({ - handler: "permissionSetTopicProcessor", - logMode: "info", - requestId: requestId, - relatedData: permissionSetName, - status: requestStatus.InProgress, - statusMessage: `PermissionSet update operation - removed inline policy document`, - }); + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestIdValue, + relatedData: permissionSetNameValue, + status: requestStatus.InProgress, + statusMessage: `removed inlinePolicy document for permission Set update operation`, + }, + functionLogMode + ); + reProvision = true; break; } @@ -603,14 +724,18 @@ export const handler = async (event: SNSEvent) => { case "relayState-update": { updatePermissionSetAttributes = true; reProvision = true; - logger({ - handler: "permissionSetTopicProcessor", - logMode: "info", - requestId: requestId, - relatedData: permissionSetName, - status: requestStatus.InProgress, - statusMessage: `PermissionSet update operation - permission set attributes need update`, - }); + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestIdValue, + relatedData: permissionSetNameValue, + status: requestStatus.InProgress, + statusMessage: `set flag for updating permission set attributes as part of permission Set update operation`, + }, + functionLogMode + ); + break; } case "tags-add": { @@ -621,14 +746,18 @@ export const handler = async (event: SNSEvent) => { Tags: currentItem.tags, }) ); - logger({ - handler: "permissionSetTopicProcessor", - logMode: "info", - requestId: requestId, - relatedData: permissionSetName, - status: requestStatus.InProgress, - statusMessage: `PermissionSet update operation - added tags`, - }); + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestIdValue, + relatedData: permissionSetNameValue, + status: requestStatus.InProgress, + statusMessage: `added tags for permission Set update operation`, + }, + functionLogMode + ); + break; } case "tags-update": @@ -649,14 +778,17 @@ export const handler = async (event: SNSEvent) => { TagKeys: tagKeysToRemove, }) ); - logger({ - handler: "permissionSetTopicProcessor", - logMode: "info", - requestId: requestId, - relatedData: permissionSetName, - status: requestStatus.InProgress, - statusMessage: `PermissionSet update operation - removed old tags`, - }); + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestIdValue, + relatedData: permissionSetNameValue, + status: requestStatus.InProgress, + statusMessage: `removed old tags for permission Set update operation`, + }, + functionLogMode + ); } if (switchKey === "tags-update" && currentItem.tags) { await ssoAdminClientObject.send( @@ -666,26 +798,32 @@ export const handler = async (event: SNSEvent) => { Tags: currentItem.tags, }) ); - logger({ - handler: "permissionSetTopicProcessor", - logMode: "info", - requestId: requestId, - relatedData: permissionSetName, - status: requestStatus.InProgress, - statusMessage: `PermissionSet update operation - added new tags`, - }); + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestIdValue, + relatedData: permissionSetNameValue, + status: requestStatus.InProgress, + statusMessage: `added new tags for permission Set update operation`, + }, + functionLogMode + ); } break; } default: { - logger({ - handler: "permissionSetTopicProcessor", - logMode: "error", - requestId: requestId, - relatedData: permissionSetName, - status: requestStatus.FailedWithError, - statusMessage: `PermissionSet update operation - unknown switchKey found: ${switchKey}`, - }); + logger( + { + handler: handlerName, + logMode: logModes.Exception, + requestId: requestIdValue, + relatedData: permissionSetNameValue, + status: requestStatus.FailedWithException, + statusMessage: `unknown switch key found for permissionSet update operation ${switchKey}`, + }, + functionLogMode + ); } } } @@ -699,14 +837,18 @@ export const handler = async (event: SNSEvent) => { Description: currentPermissionSetDescription, }) ); - logger({ - handler: "permissionSetTopicProcessor", - logMode: "info", - requestId: requestId, - relatedData: permissionSetName, - status: requestStatus.InProgress, - statusMessage: `PermissionSet update operation - updated Permission set attributes`, - }); + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestIdValue, + relatedData: permissionSetNameValue, + status: requestStatus.InProgress, + statusMessage: `updated permission set attributes for permission Set update operation`, + }, + functionLogMode + ); + /** * Update relayState and sessionDuration if they match length * greater than 0 SSO Admin API sets sessionDuration to 60 mins @@ -728,14 +870,17 @@ export const handler = async (event: SNSEvent) => { }), }) ); - logger({ - handler: "permissionSetTopicProcessor", - logMode: "info", - requestId: requestId, - relatedData: permissionSetName, - status: requestStatus.InProgress, - statusMessage: `PermissionSet update operation - updated relayState and currentSessionDuration`, - }); + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestIdValue, + relatedData: permissionSetNameValue, + status: requestStatus.InProgress, + statusMessage: `updated relayState and currentSessionDuration for permission Set update operation`, + }, + functionLogMode + ); } else if (relayStatePresent) { await ssoAdminClientObject.send( new UpdatePermissionSetCommand({ @@ -744,14 +889,17 @@ export const handler = async (event: SNSEvent) => { RelayState: currentRelayState, }) ); - logger({ - handler: "permissionSetTopicProcessor", - logMode: "info", - requestId: requestId, - relatedData: permissionSetName, - status: requestStatus.InProgress, - statusMessage: `PermissionSet update operation - updated relayState`, - }); + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestIdValue, + relatedData: permissionSetNameValue, + status: requestStatus.InProgress, + statusMessage: `updated relayState for permission Set update operation`, + }, + functionLogMode + ); } else if (sessionDurationPresent) { await ssoAdminClientObject.send( new UpdatePermissionSetCommand({ @@ -762,14 +910,17 @@ export const handler = async (event: SNSEvent) => { }), }) ); - logger({ - handler: "permissionSetTopicProcessor", - logMode: "info", - requestId: requestId, - relatedData: permissionSetName, - status: requestStatus.InProgress, - statusMessage: `PermissionSet update operation - updated sessionDuration`, - }); + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestIdValue, + relatedData: permissionSetNameValue, + status: requestStatus.InProgress, + statusMessage: `updated sessionDuration for permission Set update operation`, + }, + functionLogMode + ); } } @@ -795,14 +946,18 @@ export const handler = async (event: SNSEvent) => { TargetType: "ALL_PROVISIONED_ACCOUNTS", }) ); - logger({ - handler: "permissionSetTopicProcessor", - logMode: "info", - requestId: requestId, - relatedData: permissionSetName, - status: requestStatus.InProgress, - statusMessage: `PermissionSet update operation - triggered re-Provision and waiting for status`, - }); + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestIdValue, + relatedData: permissionSetNameValue, + status: requestStatus.InProgress, + statusMessage: `triggered re-provisioning for permission Set update operation`, + }, + functionLogMode + ); + await waitUntilPermissionSetProvisioned( { client: ssoAdminWaiterClientObject, @@ -815,14 +970,17 @@ export const handler = async (event: SNSEvent) => { }, permissionSetName ); - logger({ - handler: "permissionSetTopicProcessor", - logMode: "info", - requestId: requestId, - relatedData: permissionSetName, - status: requestStatus.InProgress, - statusMessage: `PermissionSet update operation - received status from re-Provision`, - }); + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestIdValue, + relatedData: permissionSetNameValue, + status: requestStatus.InProgress, + statusMessage: `re-provisioning operation completed for permission Set update operation`, + }, + functionLogMode + ); } } @@ -830,16 +988,30 @@ export const handler = async (event: SNSEvent) => { syncPermissionSet = true; } } - logger({ - handler: "permissionSetTopicProcessor", - logMode: "info", - requestId: requestId, - relatedData: permissionSetName, - status: requestStatus.Completed, - statusMessage: `PermissionSet update operation - complete`, - }); + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestIdValue, + relatedData: permissionSetNameValue, + status: requestStatus.Completed, + statusMessage: `permission Set update operation completed`, + }, + functionLogMode + ); } } else if (message.action === "delete") { + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestIdValue, + relatedData: permissionSetNameValue, + status: requestStatus.InProgress, + statusMessage: `permission Set delete operation started`, + }, + functionLogMode + ); const fetchArn = await ddbDocClientObject.send( new GetCommand({ TableName: Arntable, @@ -872,23 +1044,29 @@ export const handler = async (event: SNSEvent) => { }, }) ); - logger({ - handler: "permissionSetTopicProcessor", - logMode: "info", - requestId: requestId, - relatedData: permissionSetName, - status: requestStatus.Completed, - statusMessage: `PermissionSet delete operation - completed`, - }); + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestIdValue, + relatedData: permissionSetNameValue, + status: requestStatus.Completed, + statusMessage: `permission Set delete operation completed`, + }, + functionLogMode + ); } - logger({ - handler: "permissionSetTopicProcessor", - logMode: "info", - requestId: requestId, - relatedData: permissionSetName, - status: requestStatus.Completed, - statusMessage: `PermissionSet delete operation - no reference found, so not deleting again`, - }); + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestIdValue, + relatedData: permissionSetNameValue, + status: requestStatus.Aborted, + statusMessage: `permission Set delete operation ignored as no reference found`, + }, + functionLogMode + ); } if (syncPermissionSet) { @@ -903,25 +1081,75 @@ export const handler = async (event: SNSEvent) => { ); } } else { + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestIdValue, + relatedData: permissionSetNameValue, + status: requestStatus.Completed, + statusMessage: `permission Set ${message.action} operation completed - no reference found for current Item`, + }, + functionLogMode + ); + } + } catch (err) { + if ( + err instanceof DynamoDBServiceException || + err instanceof SNSServiceException || + err instanceof SSOAdminServiceException + ) { + await snsClientObject.send( + new PublishCommand({ + TopicArn: errorNotificationsTopicArn, + Subject: messageSubject, + Message: constructExceptionMessage( + requestIdValue, + handlerName, + err.name, + err.message, + permissionSetNameValue + ), + }) + ); + logger({ + handler: handlerName, + requestId: requestIdValue, + logMode: logModes.Exception, + status: requestStatus.FailedWithException, + statusMessage: constructExceptionMessageforLogger( + requestIdValue, + err.name, + err.message, + permissionSetNameValue + ), + }); + } else { + await snsClientObject.send( + new PublishCommand({ + TopicArn: errorNotificationsTopicArn, + Subject: messageSubject, + Message: constructExceptionMessage( + requestIdValue, + handlerName, + "Unhandled exception", + JSON.stringify(err), + permissionSetNameValue + ), + }) + ); logger({ - handler: "permissionSetTopicProcessor", - logMode: "info", - requestId: requestId, - relatedData: permissionSetName, - status: requestStatus.Completed, - statusMessage: `PermissionSet ${message.action} operation complete - no reference found for current Item`, + handler: handlerName, + requestId: requestIdValue, + logMode: logModes.Exception, + status: requestStatus.FailedWithException, + statusMessage: constructExceptionMessageforLogger( + requestIdValue, + "Unhandled exception", + JSON.stringify(err), + permissionSetNameValue + ), }); } - } catch (err) { - await snsClientObject.send( - new PublishCommand({ - TopicArn: errorNotificationsTopicArn, - Message: JSON.stringify({ - ...errorMessage, - eventDetail: event, - errorDetails: err, - }), - }) - ); } }; diff --git a/lib/lambda-functions/application-handlers/src/processTargetAccountSMListener.ts b/lib/lambda-functions/application-handlers/src/processTargetAccountSMListener.ts index c5d2d7e..6f97c7f 100644 --- a/lib/lambda-functions/application-handlers/src/processTargetAccountSMListener.ts +++ b/lib/lambda-functions/application-handlers/src/processTargetAccountSMListener.ts @@ -1,42 +1,73 @@ -/* -Objective: Listener for step function outputs from org account -Trigger source: Process Target Account SM topic -- determines if entity_tye is account_tag and if it is, extracts the account id -- prepares the payload required -- posts the payload to link manager topic -- Catch all failures in a generic exception block - and post the error details to error notifications topics -*/ +/** + * Objective: Listener for step function outputs from org account Trigger + * source: Process Target Account SM topic + * + * - Determines if entity_tye is account_tag and if it is, extracts the account id + * - Prepares the payload required + * - Posts the payload to link manager topic + * - Catch all failures in a generic exception block and post the error details to + * error notifications topics + */ -const { errorNotificationsTopicArn, linkQueueUrl, AWS_REGION } = process.env; +const { + errorNotificationsTopicArn, + linkQueueUrl, + AWS_REGION, + functionLogMode, + AWS_LAMBDA_FUNCTION_NAME, +} = process.env; -// SDK and third party client imports -import { PublishCommand, SNSClient } from "@aws-sdk/client-sns"; -import { SQSClient, SendMessageCommand } from "@aws-sdk/client-sqs"; +import { + PublishCommand, + SNSClient, + SNSServiceException, +} from "@aws-sdk/client-sns"; +import { + SendMessageCommand, + SQSClient, + SQSServiceException, +} from "@aws-sdk/client-sqs"; import { SNSEvent } from "aws-lambda"; -import { ErrorMessage, requestStatus } from "../../helpers/src/interfaces"; -import { logger } from "../../helpers/src/utilities"; -// SDK and third party client object initialistaion +import { logModes, requestStatus } from "../../helpers/src/interfaces"; +import { + constructExceptionMessage, + constructExceptionMessageforLogger, + logger, +} from "../../helpers/src/utilities"; + const snsClientObject = new SNSClient({ region: AWS_REGION, maxAttempts: 2 }); const sqsClientObject = new SQSClient({ region: AWS_REGION, maxAttempts: 2 }); -//Error notification -const errorMessage: ErrorMessage = { - Subject: "Error Processing target account listener handler", -}; - +const handlerName = AWS_LAMBDA_FUNCTION_NAME + ""; +const messageSubject = + "Exception in processing state machine invocations for non-account scope type assignments"; +let requestIdValue = ""; +let targetIdValue = ""; export const handler = async (event: SNSEvent) => { + const message = JSON.parse(event.Records[0].Sns.Message); + requestIdValue = message.sourceRequestId; try { - const message = JSON.parse(event.Records[0].Sns.Message); let targetId = ""; let tagKeyValue = "none"; - if (message.entityType === "account_tag") { targetId = message.pretargetId.split("/")[2]; tagKeyValue = `${message.tagKey}^${targetId}`; } else { targetId = message.pretargetId; } + targetIdValue = `${message.action}-${targetId}-${message.principalType}-${message.principalId}`; + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestIdValue, + relatedData: targetIdValue, + status: requestStatus.InProgress, + statusMessage: `Processing SQS payload post for account assignment operation - ${message.action}`, + }, + functionLogMode + ); + await sqsClientObject.send( new SendMessageCommand({ QueueUrl: linkQueueUrl, @@ -57,32 +88,73 @@ export const handler = async (event: SNSEvent) => { MessageGroupId: targetId.slice(-1), }) ); - logger({ - handler: "processTargetAccountSMListener", - logMode: "info", - relatedData: `${targetId}`, - requestId: message.sourceRequestId, - status: requestStatus.InProgress, - statusMessage: `Target account listener posted the link provisioning/de-provisioning operation to link manager topic`, - }); - } catch (err) { - await snsClientObject.send( - new PublishCommand({ - TopicArn: errorNotificationsTopicArn, - Message: JSON.stringify({ - ...errorMessage, - eventDetail: event, - errorDetails: err, - }), - }) + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestIdValue, + relatedData: targetIdValue, + status: requestStatus.InProgress, + statusMessage: `Posted account assignment operation - ${message.action} for targetId ${targetId} and permissionSetArn ${message.permissionSetArn} and principalId ${message.principalId} and principalType ${message.principalType}`, + }, + functionLogMode ); - logger({ - handler: "processTargetAccountSMListener", - logMode: "error", - status: requestStatus.FailedWithException, - statusMessage: `Target account listener failed with exception: ${JSON.stringify( - err - )} for eventDetail: ${JSON.stringify(event)}`, - }); + } catch (err) { + if ( + err instanceof SNSServiceException || + err instanceof SQSServiceException + ) { + await snsClientObject.send( + new PublishCommand({ + TopicArn: errorNotificationsTopicArn, + Subject: messageSubject, + Message: constructExceptionMessage( + requestIdValue, + handlerName, + err.name, + err.message, + targetIdValue + ), + }) + ); + logger({ + handler: handlerName, + requestId: requestIdValue, + logMode: logModes.Exception, + status: requestStatus.FailedWithException, + statusMessage: constructExceptionMessageforLogger( + requestIdValue, + err.name, + err.message, + targetIdValue + ), + }); + } else { + await snsClientObject.send( + new PublishCommand({ + TopicArn: errorNotificationsTopicArn, + Subject: messageSubject, + Message: constructExceptionMessage( + requestIdValue, + handlerName, + "Unhandled exception", + JSON.stringify(err), + targetIdValue + ), + }) + ); + logger({ + handler: handlerName, + requestId: requestIdValue, + logMode: logModes.Exception, + status: requestStatus.FailedWithException, + statusMessage: constructExceptionMessageforLogger( + requestIdValue, + "Unhandled exception", + JSON.stringify(err), + targetIdValue + ), + }); + } } }; diff --git a/lib/lambda-functions/application-handlers/src/usersCud.ts b/lib/lambda-functions/application-handlers/src/usersCud.ts index 89fcfe0..4211fb8 100644 --- a/lib/lambda-functions/application-handlers/src/usersCud.ts +++ b/lib/lambda-functions/application-handlers/src/usersCud.ts @@ -1,15 +1,15 @@ -/* -Objective: Implement SSO user events handler for processing groups -Trigger source: SSO user changes notification topic which in turn - receives event bridge notifications from SSO account - for group changes -- assumes role in SSO account for calling SSO admin API - listInstances -- determine if the event type is create or delete -- determine the user name -- Process the appropriate links -- Catch all failures in a generic exception block - and post the error details to error notifications topics -*/ +/** + * Objective: Implement SSO user events handler for processing groups Trigger + * source: SSO user changes notification topic which in turn receives event + * bridge notifications from SSO account for group changes + * + * - Assumes role in SSO account for calling SSO admin API - listInstances + * - Determine if the event type is create or delete + * - Determine the user name + * - Process the appropriate links + * - Catch all failures in a generic exception block and post the error details to + * error notifications topics + */ // Environment configuration read const { @@ -25,22 +25,36 @@ const { ssoRegion, supportNestedOU, AWS_REGION, + functionLogMode, + AWS_LAMBDA_FUNCTION_NAME, } = process.env; -// SDK and third party client imports -import { DynamoDBClient } from "@aws-sdk/client-dynamodb"; +import { + DynamoDBClient, + DynamoDBServiceException, +} from "@aws-sdk/client-dynamodb"; import { DescribeUserCommand, DescribeUserCommandOutput, IdentitystoreClient, + IdentitystoreServiceException, } from "@aws-sdk/client-identitystore"; -import { SFNClient } from "@aws-sdk/client-sfn"; -import { PublishCommand, SNSClient } from "@aws-sdk/client-sns"; -import { SendMessageCommand, SQSClient } from "@aws-sdk/client-sqs"; +import { SFNClient, SFNServiceException } from "@aws-sdk/client-sfn"; +import { + PublishCommand, + SNSClient, + SNSServiceException, +} from "@aws-sdk/client-sns"; +import { + SendMessageCommand, + SQSClient, + SQSServiceException, +} from "@aws-sdk/client-sqs"; import { ListInstancesCommand, ListInstancesCommandOutput, SSOAdminClient, + SSOAdminServiceException, } from "@aws-sdk/client-sso-admin"; import { fromTemporaryCredentials } from "@aws-sdk/credential-providers"; import { @@ -53,13 +67,18 @@ import { import { SNSEvent } from "aws-lambda"; import { v4 as uuidv4 } from "uuid"; import { - ErrorMessage, + logModes, requestStatus, StateMachinePayload, StaticSSOPayload, } from "../../helpers/src/interfaces"; -import { invokeStepFunction, logger } from "../../helpers/src/utilities"; -// SDK and third party client object initialistaion +import { + constructExceptionMessage, + constructExceptionMessageforLogger, + invokeStepFunction, + logger, +} from "../../helpers/src/utilities"; + const ddbClientObject = new DynamoDBClient({ region: AWS_REGION, maxAttempts: 2, @@ -95,20 +114,43 @@ const sfnClientObject = new SFNClient({ maxAttempts: 2, }); -//Error notification -const errorMessage: ErrorMessage = { - Subject: - "Error Processing user create/delete trigger based link provisioning operation", -}; +const handlerName = AWS_LAMBDA_FUNCTION_NAME + ""; +const messageSubject = "Exception in processing user CRUD triggered processing"; +let eventDetailValue = ""; export const handler = async (event: SNSEvent) => { const requestId = uuidv4().toString(); + const message = JSON.parse(event.Records[0].Sns.Message); + eventDetailValue = `${message.detail.eventName}`; try { - const message = JSON.parse(event.Records[0].Sns.Message); + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestId, + relatedData: eventDetailValue, + status: requestStatus.InProgress, + statusMessage: `Processing user CRUD triggered operaiton ${eventDetailValue}`, + }, + functionLogMode + ); + const resolvedInstances: ListInstancesCommandOutput = await ssoAdminClientObject.send(new ListInstancesCommand({})); const instanceArn = resolvedInstances.Instances?.[0].InstanceArn; const identityStoreId = resolvedInstances.Instances?.[0].IdentityStoreId; + logger( + { + handler: handlerName, + logMode: logModes.Debug, + requestId: requestId, + relatedData: eventDetailValue, + status: requestStatus.InProgress, + statusMessage: `Resolved instanceArn as ${instanceArn} and identityStoreId as ${identityStoreId}`, + }, + functionLogMode + ); + const staticSSOPayload: StaticSSOPayload = { InstanceArn: instanceArn + "", TargetType: "AWS_ACCOUNT", @@ -123,6 +165,19 @@ export const handler = async (event: SNSEvent) => { } else if (message.detail.eventName === "DeleteUser") { userId = message.detail.requestParameters.userId; } + eventDetailValue = `${message.detail.eventName}-${userId}`; + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestId, + relatedData: eventDetailValue, + status: requestStatus.InProgress, + statusMessage: `Determined ${message.detail.eventName} operation is triggered for user ${userId}`, + }, + functionLogMode + ); + const describeUserResult: DescribeUserCommandOutput = await identityStoreClientObject.send( new DescribeUserCommand({ @@ -132,17 +187,32 @@ export const handler = async (event: SNSEvent) => { ); if (describeUserResult) { userName = describeUserResult.UserName + ""; + logger( + { + handler: handlerName, + logMode: logModes.Debug, + requestId: requestId, + relatedData: eventDetailValue, + status: requestStatus.InProgress, + statusMessage: `Determined ${message.detail.eventName} operation is triggered for user ${userId} with userName ${userName}`, + }, + functionLogMode + ); } + eventDetailValue = `${message.detail.eventName}-${userId}-${userName}`; if (message.detail.eventName === "CreateUser") { - logger({ - handler: "userHandler", - logMode: "info", - requestId: requestId, - relatedData: `${userName}`, - status: requestStatus.InProgress, - statusMessage: `CreateUser operation - resolved userName`, - }); + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestId, + relatedData: eventDetailValue, + status: requestStatus.InProgress, + statusMessage: `Triggering logic for ${message.detail.eventName} operation with user ${userId} and user name ${userName}`, + }, + functionLogMode + ); const relatedLinks: QueryCommandOutput = await ddbDocClientObject.send( // QueryCommand is a pagniated call, however the logic requires @@ -157,6 +227,17 @@ export const handler = async (event: SNSEvent) => { ); if (relatedLinks.Items && relatedLinks.Items?.length !== 0) { + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestId, + relatedData: eventDetailValue, + status: requestStatus.InProgress, + statusMessage: `Determined there are ${relatedLinks.Items.length} no of related links that are associated with this eventDetailValue`, + }, + functionLogMode + ); await Promise.all( relatedLinks.Items?.map(async (Item) => { const { awsEntityType, awsEntityData, permissionSetName } = Item; @@ -190,14 +271,17 @@ export const handler = async (event: SNSEvent) => { MessageGroupId: awsEntityData.slice(-1), }) ); - logger({ - handler: "userHandler", - logMode: "info", - relatedData: `${userName}`, - requestId: requestId, - status: requestStatus.Completed, - statusMessage: `CreateUser operation - triggered account assignment provisioning operation`, - }); + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestId, + relatedData: eventDetailValue, + status: requestStatus.Completed, + statusMessage: `Sent create type payload to account assignment processing queue`, + }, + functionLogMode + ); } else if ( awsEntityType === "ou_id" || awsEntityType === "root" || @@ -223,68 +307,121 @@ export const handler = async (event: SNSEvent) => { processTargetAccountSMArn + "", sfnClientObject ); - logger({ - handler: "userHandler", - logMode: "info", - relatedData: `${userName}`, - requestId: requestId, - status: requestStatus.Completed, - statusMessage: `CreateUser operation - triggered step function for org based resolution`, - }); + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestId, + relatedData: eventDetailValue, + status: requestStatus.Completed, + statusMessage: `Sent create type payload to targetAccount state machine for resolving target account assignments`, + }, + functionLogMode + ); } } else { // Permission set for the user-link does not exist - logger({ - handler: "userHandler", - logMode: "info", - relatedData: `${userName}`, - requestId: requestId, - status: requestStatus.Completed, - statusMessage: `CreateUser operation - permission set referenced in related account assignments not found`, - }); + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestId, + relatedData: eventDetailValue, + status: requestStatus.Completed, + statusMessage: `Permission set ${permissionSetName} referenced in the assoicated link does not exist, so completing the operation`, + }, + functionLogMode + ); } }) ); } else { // No related links for the user being processed - logger({ - handler: "userHandler", - logMode: "info", - relatedData: `${userName}`, - requestId: requestId, - status: requestStatus.Completed, - statusMessage: `CreateUser operation - no related account assignments found for the user`, - }); + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestId, + relatedData: eventDetailValue, + status: requestStatus.Completed, + statusMessage: `No related links found, so completing the operation`, + }, + functionLogMode + ); } } else if (message.detail.eventName === "DeleteUser") { + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestId, + relatedData: eventDetailValue, + status: requestStatus.Completed, + statusMessage: `DeleteUser operation - no actions being done as the user is deleted directly`, + }, + functionLogMode + ); + } + } catch (err) { + if ( + err instanceof DynamoDBServiceException || + err instanceof IdentitystoreServiceException || + err instanceof SFNServiceException || + err instanceof SNSServiceException || + err instanceof SQSServiceException || + err instanceof SSOAdminServiceException + ) { + await snsClientObject.send( + new PublishCommand({ + TopicArn: errorNotificationsTopicArn, + Subject: messageSubject, + Message: constructExceptionMessage( + requestId, + handlerName, + err.name, + err.message, + eventDetailValue + ), + }) + ); logger({ - handler: "userHandler", - logMode: "info", - relatedData: `${userName}`, + handler: handlerName, requestId: requestId, - status: requestStatus.Completed, - statusMessage: `DeleteUser operation - no actions being done as the user is deleted directly`, + logMode: logModes.Exception, + status: requestStatus.FailedWithException, + statusMessage: constructExceptionMessageforLogger( + requestId, + err.name, + err.message, + eventDetailValue + ), + }); + } else { + await snsClientObject.send( + new PublishCommand({ + TopicArn: errorNotificationsTopicArn, + Subject: messageSubject, + Message: constructExceptionMessage( + requestId, + handlerName, + "Unhandled exception", + JSON.stringify(err), + eventDetailValue + ), + }) + ); + logger({ + handler: handlerName, + requestId: requestId, + logMode: logModes.Exception, + status: requestStatus.FailedWithException, + statusMessage: constructExceptionMessageforLogger( + requestId, + "Unhandled exception", + JSON.stringify(err), + eventDetailValue + ), }); } - } catch (err) { - await snsClientObject.send( - new PublishCommand({ - TopicArn: errorNotificationsTopicArn, - Message: JSON.stringify({ - ...errorMessage, - eventDetail: event, - errorDetails: err, - }), - }) - ); - logger({ - handler: "userHandler", - logMode: "error", - requestId: requestId, - status: requestStatus.FailedWithException, - statusMessage: `User operation - failed with exception: ${JSON.stringify( - err - )} for eventDetail: ${event}`, - }); } }; diff --git a/lib/lambda-functions/current-config-handlers/src/import-account-assignments.ts b/lib/lambda-functions/current-config-handlers/src/import-account-assignments.ts index 80664bf..0332b13 100644 --- a/lib/lambda-functions/current-config-handlers/src/import-account-assignments.ts +++ b/lib/lambda-functions/current-config-handlers/src/import-account-assignments.ts @@ -1,6 +1,4 @@ -/* -Objective: Import existing account assignments into the solution -*/ +/** Objective: Import existing account assignments into the solution */ // Environment configuration read const { @@ -8,9 +6,18 @@ const { provisionedLinksTableName, artefactsBucketName, AWS_REGION, + functionLogMode, + AWS_LAMBDA_FUNCTION_NAME, } = process.env; -import { DynamoDBClient } from "@aws-sdk/client-dynamodb"; -import { PutObjectCommand, S3Client } from "@aws-sdk/client-s3"; +import { + DynamoDBClient, + DynamoDBServiceException, +} from "@aws-sdk/client-dynamodb"; +import { + PutObjectCommand, + S3Client, + S3ServiceException, +} from "@aws-sdk/client-s3"; import { DynamoDBDocumentClient, GetCommand, @@ -20,8 +27,15 @@ import { // SDK and third party client imports import { SNSEvent } from "aws-lambda"; import { v4 as uuidv4 } from "uuid"; -import { LinkData, requestStatus } from "../../helpers/src/interfaces"; -import { logger } from "../../helpers/src/utilities"; +import { + LinkData, + logModes, + requestStatus, +} from "../../helpers/src/interfaces"; +import { + constructExceptionMessageforLogger, + logger, +} from "../../helpers/src/utilities"; // SDK and third party client object initialistaion const ddbClientObject = new DynamoDBClient({ @@ -31,8 +45,24 @@ const ddbClientObject = new DynamoDBClient({ const ddbDocClientObject = DynamoDBDocumentClient.from(ddbClientObject); const s3clientObject = new S3Client({ region: AWS_REGION, maxAttempts: 2 }); +const handlerName = AWS_LAMBDA_FUNCTION_NAME + ""; +let linkKeyValue = ""; +let sourceRequestIdValue = ""; + export const handler = async (event: SNSEvent) => { const requestId = uuidv4().toString(); + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestId, + relatedData: linkKeyValue, + status: requestStatus.InProgress, + statusMessage: `Started processing account assignment import operation`, + }, + functionLogMode + ); + try { const message = JSON.parse(event.Records[0].Sns.Message); const provisionedLinksKey = `${ @@ -40,16 +70,33 @@ export const handler = async (event: SNSEvent) => { }@${message.provisionedLinksPayload.targetId}@${ message.linkPayload.PermissionSetArn.split("/")[1] }@${message.linkPayload.PermissionSetArn.split("/")[2]}`; - logger({ - handler: "accountAssignmentImporter", - logMode: "info", - requestId: requestId, - relatedData: provisionedLinksKey, - status: requestStatus.InProgress, - sourceRequestId: message.requestId, - statusMessage: `Account assignment import operation in progress`, - }); + linkKeyValue = provisionedLinksKey; + sourceRequestIdValue = message.requestId; + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestId, + sourceRequestId: sourceRequestIdValue, + relatedData: linkKeyValue, + status: requestStatus.InProgress, + statusMessage: `Parsed SNS payload `, + }, + functionLogMode + ); if (message.triggerSource === "CloudFormation") { + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestId, + relatedData: linkKeyValue, + status: requestStatus.InProgress, + sourceRequestId: sourceRequestIdValue, + statusMessage: `Determined operation is for config import`, + }, + functionLogMode + ); const provisionedLinks: GetCommandOutput = await ddbDocClientObject.send( new GetCommand({ TableName: provisionedLinksTableName, @@ -59,16 +106,31 @@ export const handler = async (event: SNSEvent) => { }) ); if (provisionedLinks.Item) { - logger({ - handler: "accountAssignmentImporter", - logMode: "info", - requestId: requestId, - relatedData: provisionedLinksKey, - status: requestStatus.Completed, - sourceRequestId: message.requestId, - statusMessage: `Account assignment import operation complete - link already exists`, - }); + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestId, + relatedData: linkKeyValue, + sourceRequestId: sourceRequestIdValue, + status: requestStatus.Completed, + statusMessage: `Account assignment already exists, not importing again`, + }, + functionLogMode + ); } else { + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestId, + relatedData: linkKeyValue, + sourceRequestId: sourceRequestIdValue, + status: requestStatus.InProgress, + statusMessage: `Determined that the account assignment does not exist yet, updating the solution persistence`, + }, + functionLogMode + ); const linkParams: LinkData = { awsEntityId: `account%${message.linkPayload.awsEntityData}%${message.linkPayload.permissionSetName}%${message.entityName}%${message.entityType}%ssofile`, awsEntityType: "account", @@ -102,35 +164,63 @@ export const handler = async (event: SNSEvent) => { }, }) ); - logger({ - handler: "accountAssignmentImporter", - logMode: "info", - requestId: requestId, - relatedData: provisionedLinksKey, - status: requestStatus.Completed, - sourceRequestId: message.requestId, - statusMessage: `Account assignment import operation complete - link does not exist, so updated solution repository`, - }); + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestId, + relatedData: linkKeyValue, + sourceRequestId: sourceRequestIdValue, + status: requestStatus.Completed, + statusMessage: `Account assignment did not exist, so updated S3 and both provisioned links and links tables in DDB`, + }, + functionLogMode + ); } } else { + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestId, + relatedData: linkKeyValue, + sourceRequestId: sourceRequestIdValue, + status: requestStatus.Aborted, + statusMessage: `Account assignment operation aborted as the operation type is unknown`, + }, + functionLogMode + ); + } + } catch (err) { + if ( + err instanceof DynamoDBServiceException || + err instanceof S3ServiceException + ) { logger({ - handler: "accountAssignmentImporter", - logMode: "info", + handler: handlerName, requestId: requestId, - relatedData: provisionedLinksKey, - status: requestStatus.Completed, - sourceRequestId: message.requestId, - statusMessage: `Account assignment import operation completed as the source trigger does not match`, + logMode: logModes.Exception, + status: requestStatus.FailedWithException, + statusMessage: constructExceptionMessageforLogger( + requestId, + err.name, + err.message, + linkKeyValue + ), + }); + } else { + logger({ + handler: handlerName, + requestId: requestId, + logMode: logModes.Exception, + status: requestStatus.FailedWithException, + statusMessage: constructExceptionMessageforLogger( + requestId, + "Unhandled exception", + JSON.stringify(err), + linkKeyValue + ), }); } - } catch (err) { - logger({ - handler: "accountAssignmentImporter", - logMode: "error", - status: requestStatus.FailedWithException, - statusMessage: `Account assignment import operation failed with exception: ${JSON.stringify( - err - )} for eventDetail: ${JSON.stringify(event)}`, - }); } }; diff --git a/lib/lambda-functions/current-config-handlers/src/import-permission-sets.ts b/lib/lambda-functions/current-config-handlers/src/import-permission-sets.ts index f196789..edba506 100644 --- a/lib/lambda-functions/current-config-handlers/src/import-permission-sets.ts +++ b/lib/lambda-functions/current-config-handlers/src/import-permission-sets.ts @@ -1,6 +1,4 @@ -/* -Objective: Import existing permission sets into the solution -*/ +/** Objective: Import existing permission sets into the solution */ // Environment configuration read const { @@ -10,16 +8,26 @@ const { permissionSetArnTableName, artefactsBucketName, AWS_REGION, + functionLogMode, + AWS_LAMBDA_FUNCTION_NAME, } = process.env; -import { DynamoDBClient } from "@aws-sdk/client-dynamodb"; -import { PutObjectCommand, S3Client } from "@aws-sdk/client-s3"; +import { + DynamoDBClient, + DynamoDBServiceException, +} from "@aws-sdk/client-dynamodb"; +import { + PutObjectCommand, + S3Client, + S3ServiceException, +} from "@aws-sdk/client-s3"; import { ListAccountsForProvisionedPermissionSetCommand, ListInstancesCommand, ListInstancesCommandOutput, ProvisionPermissionSetCommand, SSOAdminClient, + SSOAdminServiceException, } from "@aws-sdk/client-sso-admin"; import { fromTemporaryCredentials } from "@aws-sdk/credential-providers"; import { @@ -33,9 +41,12 @@ import { import { SNSEvent } from "aws-lambda"; import { diff } from "json-diff"; import { v4 as uuidv4 } from "uuid"; -import { requestStatus } from "../../helpers/src/interfaces"; +import { logModes, requestStatus } from "../../helpers/src/interfaces"; import { getMinutesFromISODurationString } from "../../helpers/src/isoDurationUtility"; -import { logger } from "../../helpers/src/utilities"; +import { + constructExceptionMessageforLogger, + logger, +} from "../../helpers/src/utilities"; // SDK and third party client object initialistaion const ddbClientObject = new DynamoDBClient({ @@ -53,6 +64,9 @@ const ssoAdminClientObject = new SSOAdminClient({ maxAttempts: 2, }); const s3clientObject = new S3Client({ region: AWS_REGION, maxAttempts: 2 }); +const handlerName = AWS_LAMBDA_FUNCTION_NAME + ""; +let sourceRequestIdValue = ""; +let permissionSetNameValue = ""; export const handler = async (event: SNSEvent) => { const requestId = uuidv4().toString(); @@ -61,16 +75,20 @@ export const handler = async (event: SNSEvent) => { const permissionSetName = message.describePermissionSet.PermissionSet.Name; const permissionSetArn = message.describePermissionSet.PermissionSet.PermissionSetArn; - logger({ - handler: "permissionSetImporter", - logMode: "info", - requestId: requestId, - relatedData: permissionSetName, - status: requestStatus.InProgress, - sourceRequestId: message.requestId, - statusMessage: `Permission set import operation in progress`, - }); - + sourceRequestIdValue = message.requestId; + permissionSetNameValue = permissionSetName; + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestId, + sourceRequestId: sourceRequestIdValue, + relatedData: permissionSetNameValue, + status: requestStatus.InProgress, + statusMessage: `Permission set import operation in progress`, + }, + functionLogMode + ); // Construct permission set object from the SNS message payload const permissionSetObject = {}; let computedRelayState = ""; @@ -87,6 +105,18 @@ export const handler = async (event: SNSEvent) => { ) { computedRelayState = message.describePermissionSet.PermissionSet.RelayState; + logger( + { + handler: handlerName, + logMode: logModes.Debug, + requestId: requestId, + sourceRequestId: sourceRequestIdValue, + relatedData: permissionSetNameValue, + status: requestStatus.InProgress, + statusMessage: `Determined that the imported permission set has relayState set as ${computedRelayState}`, + }, + functionLogMode + ); } // Session Duration is an optional attribute if ( @@ -98,12 +128,36 @@ export const handler = async (event: SNSEvent) => { computedSessionDurationInMinutes = getMinutesFromISODurationString( message.describePermissionSet.PermissionSet.SessionDuration ); + logger( + { + handler: handlerName, + logMode: logModes.Debug, + requestId: requestId, + sourceRequestId: sourceRequestIdValue, + relatedData: permissionSetNameValue, + status: requestStatus.InProgress, + statusMessage: `Determined that the imported permission set has sessionDuration set as ${computedSessionDurationInMinutes} minutes`, + }, + functionLogMode + ); } // Managed policies is an optional attribute if ( message.listManagedPoliciesInPermissionSet.AttachedManagedPolicies .length > 0 ) { + logger( + { + handler: handlerName, + logMode: logModes.Debug, + requestId: requestId, + sourceRequestId: sourceRequestIdValue, + relatedData: permissionSetNameValue, + status: requestStatus.InProgress, + statusMessage: `Determined that the imported permission set has managed policies set`, + }, + functionLogMode + ); await Promise.all( message.listManagedPoliciesInPermissionSet.AttachedManagedPolicies.map( async (managedPolicy: Record) => { @@ -117,6 +171,18 @@ export const handler = async (event: SNSEvent) => { computedInlinePolicy = JSON.parse( message.getInlinePolicyForPermissionSet.InlinePolicy ); + logger( + { + handler: handlerName, + logMode: logModes.Debug, + requestId: requestId, + sourceRequestId: sourceRequestIdValue, + relatedData: permissionSetNameValue, + status: requestStatus.InProgress, + statusMessage: `Determined that the imported permission set has inline policy set`, + }, + functionLogMode + ); } Object.assign(permissionSetObject, { @@ -129,6 +195,18 @@ export const handler = async (event: SNSEvent) => { }); if (message.triggerSource === "CloudFormation") { + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestId, + sourceRequestId: sourceRequestIdValue, + relatedData: permissionSetNameValue, + status: requestStatus.InProgress, + statusMessage: `Determined that the operation type is current config import`, + }, + functionLogMode + ); const fetchPermissionSet: GetCommandOutput = await ddbDocClientObject.send( new GetCommand({ @@ -147,15 +225,18 @@ export const handler = async (event: SNSEvent) => { }) ); if (fetchPermissionSet.Item && fetchArn.Item) { - logger({ - handler: "permissionSetImporter", - logMode: "info", - requestId: requestId, - relatedData: permissionSetName, - status: requestStatus.InProgress, - sourceRequestId: message.requestId, - statusMessage: `CloudFormation mode - permission set object already present. Now checking if there's a delta`, - }); + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestId, + sourceRequestId: sourceRequestIdValue, + relatedData: permissionSetNameValue, + status: requestStatus.InProgress, + statusMessage: `Validated that permission set already exists, now determining delta`, + }, + functionLogMode + ); const sortedFetchItemManagedPolicies = fetchPermissionSet.Item.managedPoliciesArnList.sort(); @@ -167,15 +248,18 @@ export const handler = async (event: SNSEvent) => { permissionSetObject ); if (diffCalculated === undefined) { - logger({ - handler: "permissionSetImporter", - logMode: "info", - requestId: requestId, - relatedData: permissionSetName, - status: requestStatus.Completed, - sourceRequestId: message.requestId, - statusMessage: `CloudFormation mode - no delta found, completing import operation`, - }); + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestId, + sourceRequestId: sourceRequestIdValue, + relatedData: permissionSetNameValue, + status: requestStatus.Completed, + statusMessage: `No delta found, completing import operation`, + }, + functionLogMode + ); } else { const resolvedInstances: ListInstancesCommandOutput = await ssoAdminClientObject.send(new ListInstancesCommand({})); @@ -196,15 +280,18 @@ export const handler = async (event: SNSEvent) => { ServerSideEncryption: "AES256", }) ); - logger({ - handler: "permissionSetImporter", - logMode: "info", - requestId: requestId, - relatedData: permissionSetName, - status: requestStatus.InProgress, - sourceRequestId: message.requestId, - statusMessage: `CloudFormation mode - delta found, updated solution persistence with new permission set object value`, - }); + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestId, + sourceRequestId: sourceRequestIdValue, + relatedData: permissionSetNameValue, + status: requestStatus.InProgress, + statusMessage: `Delta found, updated solution persistence with new permission set object value`, + }, + functionLogMode + ); const fetchAccountsList = await ssoAdminClientObject.send( new ListAccountsForProvisionedPermissionSetCommand({ InstanceArn: instanceArn, @@ -212,6 +299,18 @@ export const handler = async (event: SNSEvent) => { }) ); if (fetchAccountsList.AccountIds?.length !== 0) { + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestId, + sourceRequestId: sourceRequestIdValue, + relatedData: permissionSetNameValue, + status: requestStatus.InProgress, + statusMessage: `Determined that accounts are already assigned the permission set, triggering a resync`, + }, + functionLogMode + ); await ssoAdminClientObject.send( new ProvisionPermissionSetCommand({ InstanceArn: instanceArn, @@ -219,25 +318,19 @@ export const handler = async (event: SNSEvent) => { TargetType: "ALL_PROVISIONED_ACCOUNTS", }) ); - logger({ - handler: "permissionSetImporter", - logMode: "info", - requestId: requestId, - relatedData: permissionSetName, - status: requestStatus.InProgress, - sourceRequestId: message.requestId, - statusMessage: `CloudFormation mode - delta found, triggered re-provisioning operation on all provisioned accounts`, - }); } - logger({ - handler: "permissionSetImporter", - logMode: "info", - requestId: requestId, - relatedData: permissionSetName, - status: requestStatus.Completed, - sourceRequestId: message.requestId, - statusMessage: `CloudFormation mode - delta found, import operation completed`, - }); + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestId, + sourceRequestId: sourceRequestIdValue, + relatedData: permissionSetNameValue, + status: requestStatus.Completed, + statusMessage: `Delta handling complete, import permission set operation complete`, + }, + functionLogMode + ); } } else { await s3clientObject.send( @@ -268,35 +361,64 @@ export const handler = async (event: SNSEvent) => { }, }) ); - logger({ - handler: "permissionSetImporter", - logMode: "info", - requestId: requestId, - relatedData: permissionSetName, - status: requestStatus.InProgress, - sourceRequestId: message.requestId, - statusMessage: `CloudFormation mode - permission set object not present, import completed`, - }); + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestId, + sourceRequestId: sourceRequestIdValue, + relatedData: permissionSetNameValue, + status: requestStatus.Completed, + statusMessage: `Updated solution persistence, import permission set operation complete`, + }, + functionLogMode + ); } + } else { + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestId, + sourceRequestId: sourceRequestIdValue, + relatedData: permissionSetNameValue, + status: requestStatus.Aborted, + statusMessage: `Unknown operation type, aborting import permission set operation`, + }, + functionLogMode + ); + } + } catch (err) { + if ( + err instanceof DynamoDBServiceException || + err instanceof S3ServiceException || + err instanceof SSOAdminServiceException + ) { + logger({ + handler: handlerName, + requestId: requestId, + logMode: logModes.Exception, + status: requestStatus.FailedWithException, + statusMessage: constructExceptionMessageforLogger( + requestId, + err.name, + err.message, + permissionSetNameValue + ), + }); } else { logger({ - handler: "permissionSetImporter", - logMode: "info", + handler: handlerName, requestId: requestId, - relatedData: permissionSetName, - status: requestStatus.Completed, - sourceRequestId: message.requestId, - statusMessage: `Permission set import operation completed as the source trigger does not match`, + logMode: logModes.Exception, + status: requestStatus.FailedWithException, + statusMessage: constructExceptionMessageforLogger( + requestId, + "Unhandled exception", + JSON.stringify(err), + permissionSetNameValue + ), }); } - } catch (err) { - logger({ - handler: "permissionSetImporter", - logMode: "error", - status: requestStatus.FailedWithException, - statusMessage: `Permission set import operation failed with exception: ${JSON.stringify( - err - )} for eventDetail: ${JSON.stringify(event)}`, - }); } }; diff --git a/lib/lambda-functions/current-config-handlers/src/trigger-parentSM.ts b/lib/lambda-functions/current-config-handlers/src/trigger-parentSM.ts index 2cb2969..c7c1ee9 100644 --- a/lib/lambda-functions/current-config-handlers/src/trigger-parentSM.ts +++ b/lib/lambda-functions/current-config-handlers/src/trigger-parentSM.ts @@ -1,22 +1,33 @@ -/* -Objective: Implement custom resource - that invokes importCurrentConfigSM state machine - in SSO account -Trigger source: Cloudformation custom resource provider - framework -- Invoke the state machine witht the payload -- If the request type is delete, we don't do anything - as this is a invoke type custom resource -*/ +/** + * - + * + * Objective: Implement custom resource that invokes importCurrentConfigSM state + * machine in SSO account Trigger source: Cloudformation custom resource + * provider framework + * + * - Invoke the state machine witht the payload + * - If the request type is delete, we don't do anything as this is a invoke type + * custom resource + */ // Lambda types import // SDK and third party client imports -import { SFNClient, StartExecutionCommand } from "@aws-sdk/client-sfn"; +const { AWS_LAMBDA_FUNCTION_NAME } = process.env; +import { + SFNClient, + StartExecutionCommand, + SFNServiceException, +} from "@aws-sdk/client-sfn"; import { fromTemporaryCredentials } from "@aws-sdk/credential-providers"; import { CloudFormationCustomResourceEvent } from "aws-lambda"; -import { requestStatus } from "../../helpers/src/interfaces"; -import { logger } from "../../helpers/src/utilities"; +import { logModes, requestStatus } from "../../helpers/src/interfaces"; +import { + constructExceptionMessageforLogger, + logger, +} from "../../helpers/src/utilities"; import { v4 as uuidv4 } from "uuid"; +const handlerName = AWS_LAMBDA_FUNCTION_NAME + ""; + export const handler = async (event: CloudFormationCustomResourceEvent) => { const { importCurrentConfigSMArn } = event.ResourceProperties; const requestId = uuidv4().toString(); @@ -59,7 +70,7 @@ export const handler = async (event: CloudFormationCustomResourceEvent) => { ); logger({ handler: "parentInvokeSM", - logMode: "info", + logMode: logModes.Info, relatedData: `${stateMachineExecution.executionArn}`, requestId: requestId, status: requestStatus.InProgress, @@ -71,21 +82,53 @@ export const handler = async (event: CloudFormationCustomResourceEvent) => { stateMachineExecutionArn: stateMachineExecution.executionArn, requestId: requestId, }; - } catch (e) { - logger({ - handler: "parentInvokeSM", - logMode: "error", - requestId: requestId, - relatedData: `${importCurrentConfigSMArn}`, - status: requestStatus.FailedWithException, - statusMessage: `Custom resource creation failed with exception: ${JSON.stringify( - e - )}`, - }); - return { - Status: "FAILED", - PhysicalResourceId: importCurrentConfigSMArn, - Reason: `main handler exception in invokeParentSM: ${e}`, - }; + } catch (err) { + if (err instanceof SFNServiceException) { + logger({ + handler: handlerName, + requestId: requestId, + logMode: logModes.Exception, + status: requestStatus.FailedWithException, + statusMessage: constructExceptionMessageforLogger( + requestId, + err.name, + err.message, + "" + ), + }); + return { + Status: "FAILED", + PhysicalResourceId: importCurrentConfigSMArn, + Reason: constructExceptionMessageforLogger( + requestId, + err.name, + err.message, + "" + ), + }; + } else { + logger({ + handler: handlerName, + requestId: requestId, + logMode: logModes.Exception, + status: requestStatus.FailedWithException, + statusMessage: constructExceptionMessageforLogger( + requestId, + "Unhandled exception", + JSON.stringify(err), + "" + ), + }); + return { + Status: "FAILED", + PhysicalResourceId: importCurrentConfigSMArn, + Reason: constructExceptionMessageforLogger( + requestId, + "Unhandled exception", + JSON.stringify(err), + "" + ), + }; + } } }; diff --git a/lib/lambda-functions/current-config-handlers/src/update-custom-resource.ts b/lib/lambda-functions/current-config-handlers/src/update-custom-resource.ts index c57014a..b8555d7 100644 --- a/lib/lambda-functions/current-config-handlers/src/update-custom-resource.ts +++ b/lib/lambda-functions/current-config-handlers/src/update-custom-resource.ts @@ -1,14 +1,21 @@ -/* -Objective: Update cloudformation with custom resource status -*/ -const { smDescribeRoleArn, ssoRegion, ssoAccountId } = process.env; +/** Objective: Update cloudformation with custom resource status */ +const { smDescribeRoleArn, ssoRegion, ssoAccountId, AWS_LAMBDA_FUNCTION_NAME } = + process.env; // Lambda types import // SDK and third party client imports -import { DescribeExecutionCommand, SFNClient } from "@aws-sdk/client-sfn"; +import { + DescribeExecutionCommand, + SFNClient, + SFNServiceException, +} from "@aws-sdk/client-sfn"; import { fromTemporaryCredentials } from "@aws-sdk/credential-providers"; -import { requestStatus } from "../../helpers/src/interfaces"; -import { logger, StateMachineError } from "../../helpers/src/utilities"; +import { logModes, requestStatus } from "../../helpers/src/interfaces"; +import { + constructExceptionMessageforLogger, + logger, + StateMachineError, +} from "../../helpers/src/utilities"; const sfnClientObject = new SFNClient({ region: ssoRegion, @@ -19,7 +26,7 @@ const sfnClientObject = new SFNClient({ }), maxAttempts: 2, }); - +const handlerName = AWS_LAMBDA_FUNCTION_NAME + ""; /* eslint-disable @typescript-eslint/no-explicit-any */ export const handler = async (event: any) => { //event is of any type and not CloudFormationCustomResource as it does not allow state to be passed between onEvent and isComplete handlers @@ -27,7 +34,7 @@ export const handler = async (event: any) => { try { logger({ handler: "updateCustomResource", - logMode: "info", + logMode: logModes.Info, relatedData: `${stateMachineExecutionArn}`, requestId: requestId, status: requestStatus.InProgress, @@ -43,7 +50,7 @@ export const handler = async (event: any) => { case "RUNNING": { logger({ handler: "updateCustomResource", - logMode: "info", + logMode: logModes.Info, requestId: requestId, relatedData: `${stateMachineExecutionArn}`, status: requestStatus.InProgress, @@ -56,7 +63,7 @@ export const handler = async (event: any) => { case "SUCCEEDED": { logger({ handler: "updateCustomResource", - logMode: "info", + logMode: logModes.Info, requestId: requestId, relatedData: `${stateMachineExecutionArn}`, status: requestStatus.Completed, @@ -69,7 +76,7 @@ export const handler = async (event: any) => { case "FAILED": { logger({ handler: "updateCustomResource", - logMode: "error", + logMode: logModes.Exception, requestId: requestId, relatedData: `${stateMachineExecutionArn}`, status: requestStatus.FailedWithError, @@ -82,7 +89,7 @@ export const handler = async (event: any) => { case "TIMED_OUT": { logger({ handler: "updateCustomResource", - logMode: "error", + logMode: logModes.Exception, requestId: requestId, relatedData: `${stateMachineExecutionArn}`, status: requestStatus.FailedWithError, @@ -95,7 +102,7 @@ export const handler = async (event: any) => { default: { logger({ handler: "updateCustomResource", - logMode: "error", + logMode: logModes.Exception, relatedData: `${stateMachineExecutionArn}`, status: requestStatus.FailedWithError, statusMessage: `Custom resource update - stateMachine with execution arn: ${stateMachineExecutionArn} reached an unknown status. See details in ${ssoAccountId} account, ${ssoRegion} region`, @@ -105,25 +112,37 @@ export const handler = async (event: any) => { }); } } - } catch (e) { - if (e instanceof StateMachineError) { - throw e; + } catch (err) { + if (err instanceof StateMachineError) { + throw err; + } else if (err instanceof SFNServiceException) { + logger({ + handler: handlerName, + requestId: requestId, + logMode: logModes.Exception, + status: requestStatus.FailedWithException, + statusMessage: constructExceptionMessageforLogger( + requestId, + err.name, + err.message, + "" + ), + }); + throw err; } else { logger({ - handler: "updateCustomResource", - logMode: "error", + handler: handlerName, requestId: requestId, - relatedData: `${stateMachineExecutionArn}`, + logMode: logModes.Exception, status: requestStatus.FailedWithException, - statusMessage: `Custom resource update - stateMachine with execution arn: ${stateMachineExecutionArn} failed with exception: ${JSON.stringify( - e - )}`, + statusMessage: constructExceptionMessageforLogger( + requestId, + "Unhandled exception", + JSON.stringify(err), + "" + ), }); - throw new Error( - `Custom resource update - stateMachine with execution arn: ${stateMachineExecutionArn} failed with exception: ${JSON.stringify( - e - )}` - ); + throw err; } } }; diff --git a/lib/lambda-functions/custom-waiters/src/waitUntilAccountAssignmentCreation.ts b/lib/lambda-functions/custom-waiters/src/waitUntilAccountAssignmentCreation.ts index 3bc8c13..3f32cc4 100644 --- a/lib/lambda-functions/custom-waiters/src/waitUntilAccountAssignmentCreation.ts +++ b/lib/lambda-functions/custom-waiters/src/waitUntilAccountAssignmentCreation.ts @@ -1,6 +1,4 @@ -/* -Objective: Custom waiter for account assignment creation -*/ +/** Objective: Custom waiter for account assignment creation */ import { DescribeAccountAssignmentCreationStatusCommand, @@ -8,6 +6,7 @@ import { DescribeAccountAssignmentCreationStatusCommandOutput, SSOAdminClient, StatusValues, + SSOAdminServiceException, } from "@aws-sdk/client-sso-admin"; import { checkExceptions, @@ -16,7 +15,7 @@ import { WaiterResult, WaiterState, } from "@aws-sdk/util-waiter"; -import { requestStatus } from "../../helpers/src/interfaces"; +import { logModes, requestStatus } from "../../helpers/src/interfaces"; import { logger } from "../../helpers/src/utilities"; const checkState = async ( @@ -38,37 +37,60 @@ const checkState = async ( return { state: WaiterState.RETRY, reason }; } } catch (exception) { - reason = exception; - return { state: WaiterState.FAILURE, reason }; + if (exception instanceof SSOAdminServiceException) { + reason = exception.message; + return { state: WaiterState.FAILURE, reason }; + } else { + reason = exception; + return { state: WaiterState.FAILURE, reason }; + } } }; export const waitUntilAccountAssignmentCreation = async ( params: WaiterConfiguration, input: DescribeAccountAssignmentCreationStatusCommandInput, - requestId: string + requestId: string, + functionLogMode: string ): Promise => { - logger({ - handler: "accountAssignmentCreationWaiter", - logMode: "info", - relatedData: `${input.AccountAssignmentCreationRequestId}`, - requestId: requestId, - status: requestStatus.InProgress, - statusMessage: `Waiter invoked for createAccountAssignment Operation`, - }); + logger( + { + handler: "accountAssignmentCreationWaiter", + logMode: logModes.Debug, + requestId: requestId, + relatedData: `${input.AccountAssignmentCreationRequestId}`, + status: requestStatus.InProgress, + statusMessage: `Setting service defaults`, + }, + functionLogMode + ); const serviceDefaults = { minDelay: 60, maxDelay: 120 }; + logger( + { + handler: "accountAssignmentCreationWaiter", + logMode: logModes.Info, + requestId: requestId, + relatedData: `${input.AccountAssignmentCreationRequestId}`, + status: requestStatus.InProgress, + statusMessage: `Invoking waiter for createAccountAssignment operation`, + }, + functionLogMode + ); const result = await createWaiter( { ...serviceDefaults, ...params }, input, checkState ); - logger({ - handler: "accountAssignmentCreationWaiter", - logMode: "info", - relatedData: `${input.AccountAssignmentCreationRequestId}`, - requestId: requestId, - status: requestStatus.Completed, - statusMessage: `Waiter Completed with result: ${JSON.stringify(result)}`, - }); + logger( + { + handler: "accountAssignmentCreationWaiter", + logMode: logModes.Info, + requestId: requestId, + relatedData: `${input.AccountAssignmentCreationRequestId}`, + status: requestStatus.InProgress, + statusMessage: `Waiter completed with result: ${JSON.stringify(result)}`, + }, + functionLogMode + ); return checkExceptions(result); }; diff --git a/lib/lambda-functions/custom-waiters/src/waitUntilAccountAssignmentDeletion.ts b/lib/lambda-functions/custom-waiters/src/waitUntilAccountAssignmentDeletion.ts index 867d864..7095773 100644 --- a/lib/lambda-functions/custom-waiters/src/waitUntilAccountAssignmentDeletion.ts +++ b/lib/lambda-functions/custom-waiters/src/waitUntilAccountAssignmentDeletion.ts @@ -1,12 +1,11 @@ -/* -Objective: Custom waiter for account assignment deletion -*/ +/** Objective: Custom waiter for account assignment deletion */ import { DescribeAccountAssignmentDeletionStatusCommand, DescribeAccountAssignmentDeletionStatusCommandInput, DescribeAccountAssignmentDeletionStatusCommandOutput, SSOAdminClient, StatusValues, + SSOAdminServiceException, } from "@aws-sdk/client-sso-admin"; import { checkExceptions, @@ -15,7 +14,7 @@ import { WaiterResult, WaiterState, } from "@aws-sdk/util-waiter"; -import { requestStatus } from "../../helpers/src/interfaces"; +import { logModes, requestStatus } from "../../helpers/src/interfaces"; import { logger } from "../../helpers/src/utilities"; const checkState = async ( @@ -37,37 +36,60 @@ const checkState = async ( return { state: WaiterState.RETRY, reason }; } } catch (exception) { - reason = exception; - return { state: WaiterState.FAILURE, reason }; + if (exception instanceof SSOAdminServiceException) { + reason = exception.message; + return { state: WaiterState.FAILURE, reason }; + } else { + reason = exception; + return { state: WaiterState.FAILURE, reason }; + } } }; export const waitUntilAccountAssignmentDeletion = async ( params: WaiterConfiguration, input: DescribeAccountAssignmentDeletionStatusCommandInput, - requestId: string + requestId: string, + functionLogMode: string ): Promise => { - logger({ - handler: "accountAssignmentDeletionWaiter", - logMode: "info", - relatedData: `${input.AccountAssignmentDeletionRequestId}`, - requestId: requestId, - status: requestStatus.InProgress, - statusMessage: `Waiter invoked for deleteAccountAssignment Operation`, - }); + logger( + { + handler: "accountAssignmentDeletionWaiter", + logMode: logModes.Debug, + requestId: requestId, + relatedData: `${input.AccountAssignmentDeletionRequestId}`, + status: requestStatus.InProgress, + statusMessage: `Setting service defaults`, + }, + functionLogMode + ); const serviceDefaults = { minDelay: 60, maxDelay: 120 }; + logger( + { + handler: "accountAssignmentDeletionWaiter", + logMode: logModes.Info, + requestId: requestId, + relatedData: `${input.AccountAssignmentDeletionRequestId}`, + status: requestStatus.InProgress, + statusMessage: `Invoking waiter for deleteAccountAssignment operation`, + }, + functionLogMode + ); const result = await createWaiter( { ...serviceDefaults, ...params }, input, checkState ); - logger({ - handler: "accountAssignmentDeletionWaiter", - logMode: "info", - relatedData: `${input.AccountAssignmentDeletionRequestId}`, - requestId: requestId, - status: requestStatus.Completed, - statusMessage: `Waiter Completed with result: ${JSON.stringify(result)}`, - }); + logger( + { + handler: "accountAssignmentDeletionWaiter", + logMode: logModes.Info, + requestId: requestId, + relatedData: `${input.AccountAssignmentDeletionRequestId}`, + status: requestStatus.InProgress, + statusMessage: `Waiter completed with result: ${JSON.stringify(result)}`, + }, + functionLogMode + ); return checkExceptions(result); }; diff --git a/lib/lambda-functions/custom-waiters/src/waitUntilPermissionSetProvisioned.ts b/lib/lambda-functions/custom-waiters/src/waitUntilPermissionSetProvisioned.ts index 26bea78..6fe9846 100644 --- a/lib/lambda-functions/custom-waiters/src/waitUntilPermissionSetProvisioned.ts +++ b/lib/lambda-functions/custom-waiters/src/waitUntilPermissionSetProvisioned.ts @@ -1,6 +1,4 @@ -/* -Objective: Custom waiter for permission set provisioning status -*/ +/** Objective: Custom waiter for permission set provisioning status */ import { DescribePermissionSetProvisioningStatusCommand, DescribePermissionSetProvisioningStatusCommandInput, @@ -15,7 +13,7 @@ import { WaiterResult, WaiterState, } from "@aws-sdk/util-waiter"; -import { requestStatus } from "../../helpers/src/interfaces"; +import { logModes, requestStatus } from "../../helpers/src/interfaces"; import { logger } from "../../helpers/src/utilities"; const checkState = async ( @@ -49,13 +47,13 @@ export const waitUntilPermissionSetProvisioned = async ( ): Promise => { logger({ handler: "permissionSetProvisioningWaiter", - logMode: "info", + logMode: logModes.Info, relatedData: `${input.ProvisionPermissionSetRequestId}`, requestId: requestId, status: requestStatus.InProgress, statusMessage: `Waiter invoked for permissionSetProvisioned Operation`, }); - const serviceDefaults = { minDelay: 1, maxDelay: 5 }; + const serviceDefaults = { minDelay: 60, maxDelay: 120 }; const result = await createWaiter( { ...serviceDefaults, ...params }, input, @@ -63,7 +61,7 @@ export const waitUntilPermissionSetProvisioned = async ( ); logger({ handler: "permissionSetProvisioningWaiter", - logMode: "info", + logMode: logModes.Info, relatedData: `${input.ProvisionPermissionSetRequestId}`, requestId: requestId, status: requestStatus.Completed, diff --git a/lib/lambda-functions/helpers/src/interfaces.ts b/lib/lambda-functions/helpers/src/interfaces.ts index 634cb7f..eb795a3 100644 --- a/lib/lambda-functions/helpers/src/interfaces.ts +++ b/lib/lambda-functions/helpers/src/interfaces.ts @@ -83,8 +83,15 @@ export enum requestStatus { Aborted = "Aborted", } +export enum logModes { + Exception = "Exception", + Info = "Info", + Debug = "Debug", + Warn = "Warn", +} + export interface LogMessage { - readonly logMode: string; + readonly logMode: logModes; readonly handler: string; readonly requestId?: string; readonly status: requestStatus; diff --git a/lib/lambda-functions/helpers/src/utilities.ts b/lib/lambda-functions/helpers/src/utilities.ts index 020fb23..8e723c7 100644 --- a/lib/lambda-functions/helpers/src/utilities.ts +++ b/lib/lambda-functions/helpers/src/utilities.ts @@ -7,7 +7,7 @@ import { } from "@aws-sdk/client-identitystore"; import { SFNClient, StartExecutionCommand } from "@aws-sdk/client-sfn"; import { Readable } from "stream"; -import { LogMessage, StateMachinePayload } from "./interfaces"; +import { LogMessage, logModes, StateMachinePayload } from "./interfaces"; /* eslint-disable @typescript-eslint/no-explicit-any */ export const removeEmpty = (obj: { [x: string]: any }) => { Object.keys(obj).forEach( @@ -60,27 +60,102 @@ export const invokeStepFunction = async ( ); }; -export function logger(logMessage: LogMessage) { - switch (logMessage.logMode) { - case "info": { +/** + * Custom logger utility that serves as factory pattern for writing your own custom logs. + * + * - This utility considers log level of the log message as well as the log level + * of the function. + * - If the function log level is debug, then all debug, info, warn and exception + * logs are processed. + * - If the function log level is info, then all info, warn and exception logs are + * processed. + * - If the function log level is warn, then all warn and exception logs are processed. + * - If the function log level is exception then all exception logs are processed. + * - If no function log level is passed, then all logs are processed + * + * @param logMessage Raw log message + * @param functionLogMode Function logging configuraiton as read from buildConfig + */ +export function logger(logMessage: LogMessage, functionLogMode?: string) { + switch (functionLogMode) { + case logModes.Debug.valueOf(): { + /** Since the function is set at debug log level, all logs are processed */ console.log(JSON.stringify(logMessage)); break; } - case "warn": { - console.warn(JSON.stringify(logMessage)); + case logModes.Info.valueOf(): { + /** + * Since the function is set at info level, only info, warn and exception + * logs are processed + */ + if ( + logMessage.logMode.valueOf() === logModes.Info.valueOf() || + logMessage.logMode.valueOf() === logModes.Warn.valueOf() || + logMessage.logMode.valueOf() === logModes.Exception.valueOf() + ) + console.log(JSON.stringify(logMessage)); break; } - case "error": { - console.error(JSON.stringify(logMessage)); + case logModes.Warn.valueOf(): { + /** + * Since the function is set at warn level, only warn and exception logs + * are processed + */ + if ( + logMessage.logMode.valueOf() === logModes.Warn.valueOf() || + logMessage.logMode.valueOf() === logModes.Exception.valueOf() + ) + console.log(JSON.stringify(logMessage)); + break; + } + case logModes.Exception.valueOf(): { + /** Since the function is set at exception level, only exception logs are processed */ + if (logMessage.logMode.valueOf() === logModes.Exception.valueOf()) + console.log(JSON.stringify(logMessage)); break; } default: { - console.error(JSON.stringify(logMessage)); + console.log(JSON.stringify(logMessage)); break; } } } +export const constructExceptionMessage = ( + handler: string, + name: string, + message: string, + relatedData: string, + requestId: string +) => { + return JSON.stringify( + JSON.parse( + JSON.stringify( + { + requestId: requestId, + handler: handler, + exceptionName: name, + exceptionMessage: message, + relatedData: relatedData, + }, + null, + 2 + ) + ), + null, + 2 + ); +}; + +export const constructExceptionMessageforLogger = ( + requestId: string, + name: string, + message: string, + relatedData: string +) => { + return `For requestID: ${requestId} , exception with exception name -> ${name} occurred. Exception message is -> ${message} . Related data for the exception -> ${relatedData}`; +}; + export class StateMachineError extends Error { constructor(public errorMessage: { message: string }) { super(); diff --git a/lib/lambda-functions/package.json b/lib/lambda-functions/package.json index d8a561f..0c71cec 100644 --- a/lib/lambda-functions/package.json +++ b/lib/lambda-functions/package.json @@ -1,25 +1,25 @@ { "name": "aws-sso-extensions-for-enterprise-layer", - "version": "3.1.5", + "version": "3.1.6", "description": "AWS SSO Permissions Utility Layer", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "keywords": [], "dependencies": { - "@aws-sdk/client-dynamodb": "^3.100.0", - "@aws-sdk/client-identitystore": "^3.100.0", - "@aws-sdk/client-organizations": "^3.100.0", - "@aws-sdk/client-s3": "^3.100.0", - "@aws-sdk/client-sfn": "^3.100.0", - "@aws-sdk/client-sns": "^3.100.0", - "@aws-sdk/client-sqs": "^3.100.0", - "@aws-sdk/client-ssm": "^3.100.0", - "@aws-sdk/client-sso-admin": "^3.100.0", - "@aws-sdk/credential-providers": "^3.100.0", - "@aws-sdk/lib-dynamodb": "^3.100.0", - "@aws-sdk/util-dynamodb": "^3.100.0", - "@aws-sdk/util-waiter": "^3.78.0", + "@aws-sdk/client-dynamodb": "^3.121.0", + "@aws-sdk/client-identitystore": "^3.121.0", + "@aws-sdk/client-organizations": "^3.121.0", + "@aws-sdk/client-s3": "^3.121.0", + "@aws-sdk/client-sfn": "^3.121.0", + "@aws-sdk/client-sns": "^3.121.0", + "@aws-sdk/client-sqs": "^3.121.0", + "@aws-sdk/client-ssm": "^3.121.0", + "@aws-sdk/client-sso-admin": "^3.121.0", + "@aws-sdk/credential-providers": "^3.121.0", + "@aws-sdk/lib-dynamodb": "^3.121.0", + "@aws-sdk/util-dynamodb": "^3.121.0", + "@aws-sdk/util-waiter": "^3.118.1", "ajv": "^8.11.0", "json-diff": "^0.9.0", "uuid": "^8.3.2" diff --git a/lib/lambda-functions/region-switch/src/rs-create-permission-sets.ts b/lib/lambda-functions/region-switch/src/rs-create-permission-sets.ts index 7ee97c2..9b353dd 100644 --- a/lib/lambda-functions/region-switch/src/rs-create-permission-sets.ts +++ b/lib/lambda-functions/region-switch/src/rs-create-permission-sets.ts @@ -22,7 +22,7 @@ import { } from "@aws-sdk/client-sso-admin"; import { unmarshall } from "@aws-sdk/util-dynamodb"; import { v4 as uuidv4 } from "uuid"; -import { requestStatus } from "../../helpers/src/interfaces"; +import { logModes, requestStatus } from "../../helpers/src/interfaces"; import { serializeDurationToISOFormat } from "../../helpers/src/isoDurationUtility"; import { logger } from "../../helpers/src/utilities"; @@ -52,7 +52,7 @@ export const handler = async (event: any) => { logger({ requestId: requestId, handler: "rs-create-permission-set-handler", - logMode: "info", + logMode: logModes.Info, status: requestStatus.InProgress, relatedData: event.PermissionSetObject.permissionSetName.S, }); @@ -143,7 +143,7 @@ export const handler = async (event: any) => { logger({ requestId: requestId, handler: "rs-create-permission-set-handler", - logMode: "error", + logMode: logModes.Exception, status: requestStatus.FailedWithException, statusMessage: `Permission set create operation failed with exception: ${JSON.stringify( err diff --git a/lib/lambda-functions/region-switch/src/rs-import-account-assignments.ts b/lib/lambda-functions/region-switch/src/rs-import-account-assignments.ts index 3418518..4dfef6e 100644 --- a/lib/lambda-functions/region-switch/src/rs-import-account-assignments.ts +++ b/lib/lambda-functions/region-switch/src/rs-import-account-assignments.ts @@ -11,7 +11,11 @@ import { DynamoDBDocumentClient, PutCommand } from "@aws-sdk/lib-dynamodb"; /** SDK and third party client imports */ import { SNSEvent } from "aws-lambda"; import { v4 as uuidv4 } from "uuid"; -import { LinkData, requestStatus } from "../../helpers/src/interfaces"; +import { + LinkData, + logModes, + requestStatus, +} from "../../helpers/src/interfaces"; import { logger } from "../../helpers/src/utilities"; /** @@ -44,7 +48,7 @@ export const handler = async (event: SNSEvent) => { }; logger({ handler: "rs-accountAssignmentImporter", - logMode: "info", + logMode: logModes.Info, requestId: requestId, relatedData: linkParams.awsEntityId, status: requestStatus.InProgress, @@ -62,7 +66,7 @@ export const handler = async (event: SNSEvent) => { ); logger({ handler: "rs-accountAssignmentImporter", - logMode: "info", + logMode: logModes.Info, requestId: requestId, relatedData: linkParams.awsEntityId, status: requestStatus.Completed, @@ -72,7 +76,7 @@ export const handler = async (event: SNSEvent) => { } catch (err) { logger({ handler: "rs-accountAssignmentImporter", - logMode: "error", + logMode: logModes.Exception, status: requestStatus.FailedWithException, statusMessage: `Account assignment import operation failed with exception: ${JSON.stringify( err diff --git a/lib/lambda-functions/region-switch/src/rs-import-permission-sets.ts b/lib/lambda-functions/region-switch/src/rs-import-permission-sets.ts index 3a0424a..06c5265 100644 --- a/lib/lambda-functions/region-switch/src/rs-import-permission-sets.ts +++ b/lib/lambda-functions/region-switch/src/rs-import-permission-sets.ts @@ -13,7 +13,7 @@ import { DynamoDBClient } from "@aws-sdk/client-dynamodb"; import { DynamoDBDocumentClient, PutCommand } from "@aws-sdk/lib-dynamodb"; import { SNSEvent } from "aws-lambda"; import { v4 as uuidv4 } from "uuid"; -import { requestStatus } from "../../helpers/src/interfaces"; +import { logModes, requestStatus } from "../../helpers/src/interfaces"; import { getMinutesFromISODurationString } from "../../helpers/src/isoDurationUtility"; import { logger } from "../../helpers/src/utilities"; @@ -36,7 +36,7 @@ export const handler = async (event: SNSEvent) => { const permissionSetName = message.describePermissionSet.PermissionSet.Name; logger({ handler: "rs-permissionSetImporter", - logMode: "info", + logMode: logModes.Info, requestId: requestId, relatedData: permissionSetName, status: requestStatus.InProgress, @@ -115,7 +115,7 @@ export const handler = async (event: SNSEvent) => { logger({ handler: "rs-permissionSetImporter", - logMode: "info", + logMode: logModes.Info, requestId: requestId, relatedData: permissionSetName, status: requestStatus.Completed, @@ -125,7 +125,7 @@ export const handler = async (event: SNSEvent) => { } catch (err) { logger({ handler: "permissionSetImporter", - logMode: "error", + logMode: logModes.Exception, status: requestStatus.FailedWithException, statusMessage: `Permission set import operation failed with exception: ${JSON.stringify( err diff --git a/lib/lambda-functions/region-switch/src/trigger-deploySM.ts b/lib/lambda-functions/region-switch/src/trigger-deploySM.ts index 7df8fd4..6f99652 100644 --- a/lib/lambda-functions/region-switch/src/trigger-deploySM.ts +++ b/lib/lambda-functions/region-switch/src/trigger-deploySM.ts @@ -12,7 +12,7 @@ const { AWS_REGION } = process.env; import { SFNClient, StartExecutionCommand } from "@aws-sdk/client-sfn"; import { CloudFormationCustomResourceEvent } from "aws-lambda"; import { v4 as uuidv4 } from "uuid"; -import { requestStatus } from "../../helpers/src/interfaces"; +import { logModes, requestStatus } from "../../helpers/src/interfaces"; import { logger } from "../../helpers/src/utilities"; /** * SDK and third party client instantiations done as part of init context for @@ -56,7 +56,7 @@ export const handler = async (event: CloudFormationCustomResourceEvent) => { ); logger({ handler: "deploySM", - logMode: "info", + logMode: logModes.Info, relatedData: `${stateMachineExecution.executionArn}`, requestId: requestId, status: requestStatus.InProgress, @@ -74,7 +74,7 @@ export const handler = async (event: CloudFormationCustomResourceEvent) => { } catch (e) { logger({ handler: "deploySM", - logMode: "error", + logMode: logModes.Exception, requestId: requestId, relatedData: `${deploySMArn}`, status: requestStatus.FailedWithException, diff --git a/lib/lambda-functions/region-switch/src/trigger-parentSM.ts b/lib/lambda-functions/region-switch/src/trigger-parentSM.ts index cbb8511..9f5876e 100644 --- a/lib/lambda-functions/region-switch/src/trigger-parentSM.ts +++ b/lib/lambda-functions/region-switch/src/trigger-parentSM.ts @@ -12,7 +12,7 @@ const { AWS_REGION } = process.env; import { SFNClient, StartExecutionCommand } from "@aws-sdk/client-sfn"; import { CloudFormationCustomResourceEvent } from "aws-lambda"; import { v4 as uuidv4 } from "uuid"; -import { requestStatus } from "../../helpers/src/interfaces"; +import { logModes, requestStatus } from "../../helpers/src/interfaces"; import { logger } from "../../helpers/src/utilities"; /** * SDK and third party client instantiations done as part of init context for @@ -62,7 +62,7 @@ export const handler = async (event: CloudFormationCustomResourceEvent) => { ); logger({ handler: "parentInvokeSM", - logMode: "info", + logMode: logModes.Info, relatedData: `${stateMachineExecution.executionArn}`, requestId: requestId, status: requestStatus.InProgress, @@ -80,7 +80,7 @@ export const handler = async (event: CloudFormationCustomResourceEvent) => { } catch (e) { logger({ handler: "parentInvokeSM", - logMode: "error", + logMode: logModes.Exception, requestId: requestId, relatedData: `${importCurrentConfigSMArn}`, status: requestStatus.FailedWithException, diff --git a/lib/lambda-functions/region-switch/src/update-custom-resource.ts b/lib/lambda-functions/region-switch/src/update-custom-resource.ts index 8ce761a..d5defc3 100644 --- a/lib/lambda-functions/region-switch/src/update-custom-resource.ts +++ b/lib/lambda-functions/region-switch/src/update-custom-resource.ts @@ -9,7 +9,7 @@ const { ssoRegion, ssoAccountId } = process.env; /** SDK and third party client imports */ import { DescribeExecutionCommand, SFNClient } from "@aws-sdk/client-sfn"; -import { requestStatus } from "../../helpers/src/interfaces"; +import { logModes, requestStatus } from "../../helpers/src/interfaces"; import { logger, StateMachineError } from "../../helpers/src/utilities"; /** * SDK and third party client instantiations done as part of init context for @@ -28,7 +28,7 @@ export const handler = async (event: any) => { try { logger({ handler: "updateCustomResource", - logMode: "info", + logMode: logModes.Info, relatedData: `${stateMachineExecutionArn}`, requestId: requestId, status: requestStatus.InProgress, @@ -49,7 +49,7 @@ export const handler = async (event: any) => { case "RUNNING": { logger({ handler: "updateCustomResource", - logMode: "info", + logMode: logModes.Info, requestId: requestId, relatedData: `${stateMachineExecutionArn}`, status: requestStatus.InProgress, @@ -62,7 +62,7 @@ export const handler = async (event: any) => { case "SUCCEEDED": { logger({ handler: "updateCustomResource", - logMode: "info", + logMode: logModes.Info, requestId: requestId, relatedData: `${stateMachineExecutionArn}`, status: requestStatus.Completed, @@ -75,7 +75,7 @@ export const handler = async (event: any) => { case "FAILED": { logger({ handler: "updateCustomResource", - logMode: "error", + logMode: logModes.Exception, requestId: requestId, relatedData: `${stateMachineExecutionArn}`, status: requestStatus.FailedWithError, @@ -88,7 +88,7 @@ export const handler = async (event: any) => { case "TIMED_OUT": { logger({ handler: "updateCustomResource", - logMode: "error", + logMode: logModes.Exception, requestId: requestId, relatedData: `${stateMachineExecutionArn}`, status: requestStatus.FailedWithError, @@ -101,7 +101,7 @@ export const handler = async (event: any) => { default: { logger({ handler: "updateCustomResource", - logMode: "error", + logMode: logModes.Exception, relatedData: `${stateMachineExecutionArn}`, status: requestStatus.FailedWithError, statusMessage: `Custom resource update - stateMachine with execution arn: ${stateMachineExecutionArn} reached an unknown status. See details in ${ssoAccountId} account, ${ssoRegion} region`, @@ -117,7 +117,7 @@ export const handler = async (event: any) => { } else { logger({ handler: "updateCustomResource", - logMode: "error", + logMode: logModes.Exception, requestId: requestId, relatedData: `${stateMachineExecutionArn}`, status: requestStatus.FailedWithException, diff --git a/lib/lambda-functions/upgrade-to-v303/src/triggerV303SM.ts b/lib/lambda-functions/upgrade-to-v303/src/triggerV303SM.ts index 8bac6c3..f1ad731 100644 --- a/lib/lambda-functions/upgrade-to-v303/src/triggerV303SM.ts +++ b/lib/lambda-functions/upgrade-to-v303/src/triggerV303SM.ts @@ -1,13 +1,11 @@ -/* -Objective: Implement custom resource - that invokes upgrade V303 state machine - in target account -Trigger source: Cloudformation custom resource provider - framework -- Invoke the state machine witht the payload -- If the request type is delete, we don't do anything - as this is a invoke type custom resource -*/ +/** + * Objective: Implement custom resource that invokes upgrade V303 state machine + * in target account Trigger source: Cloudformation custom resource provider framework + * + * - Invoke the state machine witht the payload + * - If the request type is delete, we don't do anything as this is a invoke type + * custom resource + */ const { AWS_REGION } = process.env; // Lambda types import @@ -15,7 +13,7 @@ const { AWS_REGION } = process.env; import { SFNClient, StartExecutionCommand } from "@aws-sdk/client-sfn"; import { CloudFormationCustomResourceEvent } from "aws-lambda"; import { v4 as uuidv4 } from "uuid"; -import { requestStatus } from "../../helpers/src/interfaces"; +import { logModes, requestStatus } from "../../helpers/src/interfaces"; import { logger } from "../../helpers/src/utilities"; const sfnClientObject = new SFNClient({ @@ -43,7 +41,7 @@ export const handler = async (event: CloudFormationCustomResourceEvent) => { ); logger({ handler: "upgradeSM", - logMode: "info", + logMode: logModes.Info, relatedData: `${stateMachineExecution.executionArn}`, requestId: requestId, status: requestStatus.InProgress, @@ -58,7 +56,7 @@ export const handler = async (event: CloudFormationCustomResourceEvent) => { } catch (e) { logger({ handler: "upgradeSM", - logMode: "error", + logMode: logModes.Exception, requestId: requestId, relatedData: `${upgradeV303SMArn}`, status: requestStatus.FailedWithException, diff --git a/lib/lambda-functions/upgrade-to-v303/src/update-custom-resource.ts b/lib/lambda-functions/upgrade-to-v303/src/update-custom-resource.ts index ca0433b..9bf0277 100644 --- a/lib/lambda-functions/upgrade-to-v303/src/update-custom-resource.ts +++ b/lib/lambda-functions/upgrade-to-v303/src/update-custom-resource.ts @@ -1,12 +1,10 @@ -/* -Objective: Update cloudformation with custom resource status -*/ +/** Objective: Update cloudformation with custom resource status */ const { AWS_REGION } = process.env; // Lambda types import // SDK and third party client imports import { DescribeExecutionCommand, SFNClient } from "@aws-sdk/client-sfn"; -import { requestStatus } from "../../helpers/src/interfaces"; +import { logModes, requestStatus } from "../../helpers/src/interfaces"; import { logger, StateMachineError } from "../../helpers/src/utilities"; const sfnClientObject = new SFNClient({ @@ -21,7 +19,7 @@ export const handler = async (event: any) => { try { logger({ handler: "updateCustomResource", - logMode: "info", + logMode: logModes.Info, relatedData: `${stateMachineExecutionArn}`, requestId: requestId, status: requestStatus.InProgress, @@ -37,7 +35,7 @@ export const handler = async (event: any) => { case "RUNNING": { logger({ handler: "updateCustomResource", - logMode: "info", + logMode: logModes.Info, requestId: requestId, relatedData: `${stateMachineExecutionArn}`, status: requestStatus.InProgress, @@ -50,7 +48,7 @@ export const handler = async (event: any) => { case "SUCCEEDED": { logger({ handler: "updateCustomResource", - logMode: "info", + logMode: logModes.Info, requestId: requestId, relatedData: `${stateMachineExecutionArn}`, status: requestStatus.Completed, @@ -63,7 +61,7 @@ export const handler = async (event: any) => { case "FAILED": { logger({ handler: "updateCustomResource", - logMode: "error", + logMode: logModes.Exception, requestId: requestId, relatedData: `${stateMachineExecutionArn}`, status: requestStatus.FailedWithError, @@ -76,7 +74,7 @@ export const handler = async (event: any) => { case "TIMED_OUT": { logger({ handler: "updateCustomResource", - logMode: "error", + logMode: logModes.Exception, requestId: requestId, relatedData: `${stateMachineExecutionArn}`, status: requestStatus.FailedWithError, @@ -89,7 +87,7 @@ export const handler = async (event: any) => { default: { logger({ handler: "updateCustomResource", - logMode: "error", + logMode: logModes.Exception, relatedData: `${stateMachineExecutionArn}`, status: requestStatus.FailedWithError, statusMessage: `Custom resource update - stateMachine with execution arn: ${stateMachineExecutionArn} reached an unknown status.`, @@ -105,7 +103,7 @@ export const handler = async (event: any) => { } else { logger({ handler: "updateCustomResource", - logMode: "error", + logMode: logModes.Exception, requestId: requestId, relatedData: `${stateMachineExecutionArn}`, status: requestStatus.FailedWithException, diff --git a/lib/lambda-functions/user-interface-handlers/src/linkApi.ts b/lib/lambda-functions/user-interface-handlers/src/linkApi.ts index 77683b3..808a36f 100644 --- a/lib/lambda-functions/user-interface-handlers/src/linkApi.ts +++ b/lib/lambda-functions/user-interface-handlers/src/linkApi.ts @@ -1,30 +1,41 @@ -/* -Objective: Implement lambda proxy for link importer API -Trigger source: link API -- Schema validation of the payload -- Upsert / delete in links DDB table depending on the operation -*/ +/** + * Objective: Implement lambda proxy for link importer API Trigger source: link API + * + * - Schema validation of the payload + * - Upsert / delete in links DDB table depending on the operation + */ -// Environment configuration read -const { DdbTable, AWS_REGION, artefactsBucketName, linkProcessingTopicArn } = - process.env; +const { + DdbTable, + AWS_REGION, + artefactsBucketName, + linkProcessingTopicArn, + functionLogMode, + AWS_LAMBDA_FUNCTION_NAME, +} = process.env; -// Lambda types import -// SDK and third party client imports -import { DynamoDBClient } from "@aws-sdk/client-dynamodb"; +import { + DynamoDBClient, + DynamoDBServiceException, +} from "@aws-sdk/client-dynamodb"; import { DeleteObjectCommand, PutObjectCommand, S3Client, + S3ServiceException, } from "@aws-sdk/client-s3"; -import { PublishCommand, SNSClient } from "@aws-sdk/client-sns"; +import { + PublishCommand, + SNSClient, + SNSServiceException, +} from "@aws-sdk/client-sns"; import { DeleteCommand, DynamoDBDocumentClient, PutCommand, } from "@aws-sdk/lib-dynamodb"; import { v4 as uuidv4 } from "uuid"; -//Import validator function and dependencies + import Ajv from "ajv"; import { APIGatewayProxyEventV2, APIGatewayProxyResultV2 } from "aws-lambda"; import { readFileSync } from "fs"; @@ -32,15 +43,18 @@ import { join } from "path"; import { LinkData, LinkPayload, + logModes, requestStatus, } from "../../helpers/src/interfaces"; import { imperativeParseJSON, JSONParserError, } from "../../helpers/src/payload-validator"; -import { logger } from "../../helpers/src/utilities"; +import { + constructExceptionMessageforLogger, + logger, +} from "../../helpers/src/utilities"; -// SDK and third party client object initialistaion const ddbClientObject = new DynamoDBClient({ region: AWS_REGION, maxAttempts: 2, @@ -48,7 +62,6 @@ const ddbClientObject = new DynamoDBClient({ const ddbDocClientObject = DynamoDBDocumentClient.from(ddbClientObject); const s3clientObject = new S3Client({ region: AWS_REGION, maxAttempts: 2 }); const snsClientObject = new SNSClient({ region: AWS_REGION, maxAttempts: 2 }); -// Validator object initialisation const ajv = new Ajv({ allErrors: true }); const schemaDefinition = JSON.parse( readFileSync( @@ -59,16 +72,52 @@ const schemaDefinition = JSON.parse( ); const validate = ajv.compile(schemaDefinition); +const handlerName = AWS_LAMBDA_FUNCTION_NAME + ""; +let linkDataValue = ""; export const handler = async ( event: APIGatewayProxyEventV2 ): Promise => { const requestId = uuidv4().toString(); + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestId, + status: requestStatus.InProgress, + statusMessage: `Account assignment create/delete operation started`, + }, + functionLogMode + ); + if (event.body !== null && event.body !== undefined) { try { const payload: LinkPayload = imperativeParseJSON(event.body, validate); + logger( + { + handler: handlerName, + logMode: logModes.Debug, + requestId: requestId, + status: requestStatus.InProgress, + statusMessage: `Account assignment payload successfully parsed`, + }, + functionLogMode + ); const delimeter = "%"; const { linkData } = payload; + linkDataValue = linkData; if (payload.action === "create") { + logger( + { + handler: handlerName, + logMode: logModes.Debug, + requestId: requestId, + status: requestStatus.InProgress, + statusMessage: `Account assignment operation is set as create`, + relatedData: linkDataValue, + }, + functionLogMode + ); + const keyValue = linkData.split(delimeter); const linkParams: LinkData = { awsEntityId: linkData, @@ -80,6 +129,20 @@ export const handler = async ( principalName: keyValue[3], principalType: keyValue[4], }; + logger( + { + handler: handlerName, + logMode: logModes.Debug, + requestId: requestId, + status: requestStatus.InProgress, + statusMessage: `Parsed individual entity details`, + relatedData: linkDataValue, + hasRelatedRequests: + linkParams.awsEntityType === "account" ? false : true, + }, + functionLogMode + ); + await s3clientObject.send( new PutObjectCommand({ Bucket: artefactsBucketName, @@ -87,6 +150,20 @@ export const handler = async ( ServerSideEncryption: "AES256", }) ); + logger( + { + handler: handlerName, + logMode: logModes.Debug, + requestId: requestId, + status: requestStatus.InProgress, + statusMessage: `Processed upsert into S3`, + relatedData: linkDataValue, + hasRelatedRequests: + linkParams.awsEntityType === "account" ? false : true, + }, + functionLogMode + ); + await ddbDocClientObject.send( new PutCommand({ TableName: DdbTable, @@ -95,26 +172,42 @@ export const handler = async ( }, }) ); + logger( + { + handler: handlerName, + logMode: logModes.Debug, + requestId: requestId, + status: requestStatus.InProgress, + statusMessage: `Processed upsert into Dynamo DB`, + relatedData: linkDataValue, + hasRelatedRequests: + linkParams.awsEntityType === "account" ? false : true, + }, + functionLogMode + ); await snsClientObject.send( new PublishCommand({ TopicArn: linkProcessingTopicArn + "", Message: JSON.stringify({ - linkData: linkData, + linkData: linkDataValue, action: "create", requestId: requestId, }), }) ); - logger({ - handler: "userInterface-linkApi", - logMode: "info", - relatedData: linkData, - requestId: requestId, - hasRelatedRequests: - linkParams.awsEntityType === "account" ? false : true, - status: requestStatus.InProgress, - statusMessage: `Account Assignment create operation is being processed`, - }); + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestId, + status: requestStatus.InProgress, + statusMessage: `Account assignment create operation posted to link topic processor`, + relatedData: linkDataValue, + hasRelatedRequests: + linkParams.awsEntityType === "account" ? false : true, + }, + functionLogMode + ); return { statusCode: 200, body: JSON.stringify({ @@ -123,12 +216,38 @@ export const handler = async ( }), }; } else if (payload.action === "delete") { + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestId, + status: requestStatus.InProgress, + statusMessage: `Account assignment operation is set as delete`, + relatedData: linkDataValue, + hasRelatedRequests: + linkData.split(delimeter)[0] === "account" ? false : true, + }, + functionLogMode + ); await s3clientObject.send( new DeleteObjectCommand({ Bucket: artefactsBucketName, Key: `links_data/${linkData}`, }) ); + logger( + { + handler: handlerName, + logMode: logModes.Debug, + requestId: requestId, + status: requestStatus.InProgress, + statusMessage: `Processed upsert into S3`, + relatedData: linkDataValue, + hasRelatedRequests: + linkData.split(delimeter)[0] === "account" ? false : true, + }, + functionLogMode + ); await ddbDocClientObject.send( new DeleteCommand({ TableName: DdbTable, @@ -137,6 +256,19 @@ export const handler = async ( }, }) ); + logger( + { + handler: handlerName, + logMode: logModes.Debug, + requestId: requestId, + status: requestStatus.InProgress, + statusMessage: `Processed upsert into Dynamo DB`, + relatedData: linkDataValue, + hasRelatedRequests: + linkData.split(delimeter)[0] === "account" ? false : true, + }, + functionLogMode + ); await snsClientObject.send( new PublishCommand({ TopicArn: linkProcessingTopicArn + "", @@ -147,16 +279,19 @@ export const handler = async ( }), }) ); - logger({ - handler: "userInterface-linkApi", - logMode: "info", - relatedData: linkData, - requestId: requestId, - hasRelatedRequests: - linkData.split(delimeter)[0] === "account" ? false : true, - status: requestStatus.InProgress, - statusMessage: `Account Assignment delete operation is being processed`, - }); + logger( + { + handler: handlerName, + logMode: logModes.Debug, + requestId: requestId, + status: requestStatus.InProgress, + statusMessage: `Account assignment delete operation posted to link processing topic`, + relatedData: linkDataValue, + hasRelatedRequests: + linkData.split(delimeter)[0] === "account" ? false : true, + }, + functionLogMode + ); return { statusCode: 200, body: JSON.stringify({ @@ -165,15 +300,19 @@ export const handler = async ( }), }; } else { - //TS flow path completion - logger({ - handler: "userInterface-linkApi", - logMode: "error", - relatedData: linkData, - requestId: requestId, - status: requestStatus.FailedWithError, - statusMessage: `Account Assignment operation cannot be processed due to invalid action`, - }); + logger( + { + handler: handlerName, + logMode: logModes.Exception, + requestId: requestId, + status: requestStatus.FailedWithException, + statusMessage: `Account assignment operation could not be completed due to invalid action`, + relatedData: linkDataValue, + hasRelatedRequests: + linkData.split(delimeter)[0] === "account" ? false : true, + }, + functionLogMode + ); return { statusCode: 400, body: JSON.stringify({ @@ -184,48 +323,108 @@ export const handler = async ( } catch (err) { if (err instanceof JSONParserError) { logger({ - handler: "userInterface-linkApi", - logMode: "error", + handler: handlerName, requestId: requestId, + logMode: logModes.Exception, status: requestStatus.FailedWithException, - statusMessage: `Error processing link operation through API interface due to schema errors for: ${JSON.stringify( - err.errors - )}`, + statusMessage: constructExceptionMessageforLogger( + requestId, + "Schema validation exception", + `Provided account does not pass the schema validation`, + JSON.stringify(err.errors) + ), }); return { statusCode: 500, - body: JSON.stringify({ errors: err.errors }), + body: JSON.stringify({ + message: constructExceptionMessageforLogger( + requestId, + "Schema validation exception", + `Provided account does not pass the schema validation`, + JSON.stringify(err.errors) + ), + requestId: requestId, + }), + }; + } else if ( + err instanceof DynamoDBServiceException || + err instanceof SNSServiceException || + err instanceof S3ServiceException + ) { + logger({ + handler: handlerName, + requestId: requestId, + logMode: logModes.Exception, + status: requestStatus.FailedWithException, + statusMessage: constructExceptionMessageforLogger( + requestId, + err.name, + err.message, + linkDataValue + ), + }); + return { + statusCode: 500, + body: JSON.stringify({ + message: constructExceptionMessageforLogger( + requestId, + err.name, + err.message, + linkDataValue + ), + requestId: requestId, + }), }; } else { logger({ - handler: "userInterface-linkApi", - logMode: "error", + handler: handlerName, requestId: requestId, + logMode: logModes.Exception, status: requestStatus.FailedWithException, - statusMessage: `Error processing link operation through API interface due to schema errors for: ${JSON.stringify( - err - )}`, + statusMessage: constructExceptionMessageforLogger( + requestId, + "Unhandled exception", + JSON.stringify(err), + linkDataValue + ), }); return { statusCode: 500, body: JSON.stringify({ - message: `Exception while processing the call ${err}`, + message: constructExceptionMessageforLogger( + requestId, + "Unhandled exception", + JSON.stringify(err), + linkDataValue + ), + requestId: requestId, }), }; } } } else { logger({ - handler: "userInterface-linkApi", - logMode: "error", + handler: handlerName, requestId: requestId, + logMode: logModes.Exception, status: requestStatus.FailedWithException, - statusMessage: `Invalid message body provided`, + statusMessage: constructExceptionMessageforLogger( + requestId, + "Invalid message body exception", + "Message body provided is invalid", + linkDataValue + ), }); return { statusCode: 400, body: JSON.stringify({ - message: "Invalid message body provided", + message: constructExceptionMessageforLogger( + requestId, + "Invalid message body exception", + "Message body provided is invalid", + linkDataValue + ), + requestId: requestId, }), }; } diff --git a/lib/lambda-functions/user-interface-handlers/src/linkCu.ts b/lib/lambda-functions/user-interface-handlers/src/linkCu.ts index b1881f7..b4b8836 100644 --- a/lib/lambda-functions/user-interface-handlers/src/linkCu.ts +++ b/lib/lambda-functions/user-interface-handlers/src/linkCu.ts @@ -1,39 +1,52 @@ -/* -Objective: Implement event notification handler for link objects S3 path -Trigger source: link S3 path object notification for both created and change type events -- Schema validation of the file name -- Upsert in links DDB table parsing the file name -*/ +/** + * Objective: Implement event notification handler for link objects S3 path + * Trigger source: link S3 path object notification for both created and change + * type events + * + * - Schema validation of the file name + * - Upsert in links DDB table parsing the file name + */ -// Environment configuration read const { DdbTable, errorNotificationsTopicArn, AWS_REGION, linkProcessingTopicArn, + functionLogMode, + AWS_LAMBDA_FUNCTION_NAME, } = process.env; -// SDK and third party client imports -import { DynamoDBClient } from "@aws-sdk/client-dynamodb"; -import { PublishCommand, SNSClient } from "@aws-sdk/client-sns"; +import { + DynamoDBClient, + DynamoDBServiceException, +} from "@aws-sdk/client-dynamodb"; +import { + PublishCommand, + SNSClient, + SNSServiceException, +} from "@aws-sdk/client-sns"; import { DynamoDBDocumentClient, PutCommand } from "@aws-sdk/lib-dynamodb"; +import Ajv from "ajv"; import { S3Event, S3EventRecord } from "aws-lambda"; +import { readFileSync } from "fs"; +import { join } from "path"; +import { v4 as uuidv4 } from "uuid"; import { - ErrorMessage, LinkData, LinkS3Payload, + logModes, requestStatus, } from "../../helpers/src/interfaces"; -import { logger } from "../../helpers/src/utilities"; -import Ajv from "ajv"; -import { readFileSync } from "fs"; -import { join } from "path"; -import { v4 as uuidv4 } from "uuid"; import { imperativeParseJSON, JSONParserError, } from "../../helpers/src/payload-validator"; -// SDK and third party client object initialistaion +import { + constructExceptionMessage, + constructExceptionMessageforLogger, + logger, +} from "../../helpers/src/utilities"; + const ddbClientObject = new DynamoDBClient({ region: AWS_REGION, maxAttempts: 2, @@ -41,10 +54,6 @@ const ddbClientObject = new DynamoDBClient({ const ddbDocClientObject = DynamoDBDocumentClient.from(ddbClientObject); const snsClientObject = new SNSClient({ region: AWS_REGION, maxAttempts: 2 }); -//Error notification -const errorMessage: ErrorMessage = { - Subject: "Error Processing Link create/update via S3 Interface", -}; const ajv = new Ajv({ allErrors: true }); const schemaDefinition = JSON.parse( readFileSync( @@ -54,19 +63,45 @@ const schemaDefinition = JSON.parse( .toString() ); const validate = ajv.compile(schemaDefinition); +const handlerName = AWS_LAMBDA_FUNCTION_NAME + ""; +let linkDataValue = ""; +const messageSubject = + "Exception in account assignment create/update operation through S3 interface"; export const handler = async (event: S3Event) => { await Promise.all( event.Records.map(async (record: S3EventRecord) => { const requestId = uuidv4().toString(); + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestId, + status: requestStatus.InProgress, + statusMessage: `Account assignment create/update operation started`, + }, + functionLogMode + ); + try { const fileName = decodeURIComponent(record.s3.object.key.split("/")[1]); - console.log(`fileName received: ${fileName}`); + const payload: LinkS3Payload = imperativeParseJSON( { linkData: fileName }, validate ); + logger( + { + handler: handlerName, + logMode: logModes.Debug, + requestId: requestId, + status: requestStatus.InProgress, + statusMessage: `Account assignment payload successfully parsed`, + }, + functionLogMode + ); const { linkData } = payload; + linkDataValue = linkData; const delimeter = "%"; const keyValue = linkData.split(delimeter); const upsertData: LinkData = { @@ -85,6 +120,19 @@ export const handler = async (event: S3Event) => { }, }) ); + logger( + { + handler: handlerName, + logMode: logModes.Debug, + requestId: requestId, + status: requestStatus.InProgress, + statusMessage: `Successfully processed upsert into Dynamo DB`, + relatedData: linkDataValue, + hasRelatedRequests: + upsertData.awsEntityType === "account" ? false : true, + }, + functionLogMode + ); await snsClientObject.send( new PublishCommand({ TopicArn: linkProcessingTopicArn + "", @@ -95,55 +143,100 @@ export const handler = async (event: S3Event) => { }), }) ); - logger({ - handler: "userInterface-s3CreateUpdate", - logMode: "info", - relatedData: linkData, - requestId: requestId, - status: requestStatus.InProgress, - hasRelatedRequests: - upsertData.awsEntityType === "account" ? false : true, - statusMessage: `Account Assignment create operation is being processed`, - }); + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestId, + status: requestStatus.InProgress, + statusMessage: `Sent payload to account assignment processing topic`, + relatedData: linkDataValue, + hasRelatedRequests: + upsertData.awsEntityType === "account" ? false : true, + }, + functionLogMode + ); } catch (err) { if (err instanceof JSONParserError) { + await snsClientObject.send( + new PublishCommand({ + TopicArn: errorNotificationsTopicArn, + Subject: messageSubject, + Message: constructExceptionMessage( + requestId, + handlerName, + "Schema validation exception", + `Provided account assignment ${linkDataValue} S3 file does not pass the schema validation`, + JSON.stringify(err.errors) + ), + }) + ); logger({ - handler: "userInterface-s3CreateUpdate", - logMode: "error", + handler: handlerName, requestId: requestId, + logMode: logModes.Exception, status: requestStatus.FailedWithException, - statusMessage: `Error processing link operation through S3 interface due to schema errors for: ${JSON.stringify( - err.errors - )}`, + statusMessage: constructExceptionMessageforLogger( + requestId, + "Schema validation exception", + `Provided account assignment ${linkDataValue} S3 file does not pass the schema validation`, + JSON.stringify(err.errors) + ), }); + } else if ( + err instanceof SNSServiceException || + err instanceof DynamoDBServiceException + ) { await snsClientObject.send( new PublishCommand({ TopicArn: errorNotificationsTopicArn, - Message: JSON.stringify({ - errorMessage: `Error processing link operation through S3 interface due to schema errors`, - errors: err.errors, - }), + Subject: messageSubject, + Message: constructExceptionMessage( + requestId, + handlerName, + err.name, + err.message, + linkDataValue + ), }) ); + logger({ + handler: handlerName, + requestId: requestId, + logMode: logModes.Exception, + status: requestStatus.FailedWithException, + statusMessage: constructExceptionMessageforLogger( + requestId, + err.name, + err.message, + linkDataValue + ), + }); } else { await snsClientObject.send( new PublishCommand({ TopicArn: errorNotificationsTopicArn, - Message: JSON.stringify({ - ...errorMessage, - eventDetail: record, - errorDetails: err, - }), + Subject: messageSubject, + Message: constructExceptionMessage( + requestId, + handlerName, + "Unhandled exception", + JSON.stringify(err), + linkDataValue + ), }) ); logger({ - handler: "userInterface-s3CreateUpdate", - logMode: "error", + handler: handlerName, requestId: requestId, + logMode: logModes.Exception, status: requestStatus.FailedWithException, - statusMessage: `Account Assignment create operation failed with error: ${JSON.stringify( - err - )}`, + statusMessage: constructExceptionMessageforLogger( + requestId, + "Unhandled exception", + JSON.stringify(err), + linkDataValue + ), }); } } diff --git a/lib/lambda-functions/user-interface-handlers/src/linkDel.ts b/lib/lambda-functions/user-interface-handlers/src/linkDel.ts index eac9f8d..37ceba1 100644 --- a/lib/lambda-functions/user-interface-handlers/src/linkDel.ts +++ b/lib/lambda-functions/user-interface-handlers/src/linkDel.ts @@ -1,37 +1,50 @@ -/* -Objective: Implement event notification handler for link objects S3 path -Trigger source: link S3 path object notification for removed type events -- Schema validation of the file name -- delete in links DDB table parsing the file name -*/ +/** + * Objective: Implement event notification handler for link objects S3 path + * Trigger source: link S3 path object notification for removed type events + * + * - Schema validation of the file name + * - Delete in links DDB table parsing the file name + */ -// Environment configuration read const { DdbTable, errorNotificationsTopicArn, AWS_REGION, linkProcessingTopicArn, + functionLogMode, + AWS_LAMBDA_FUNCTION_NAME, } = process.env; -import { DynamoDBClient } from "@aws-sdk/client-dynamodb"; -import { PublishCommand, SNSClient } from "@aws-sdk/client-sns"; +import { + DynamoDBClient, + DynamoDBServiceException, +} from "@aws-sdk/client-dynamodb"; +import { + PublishCommand, + SNSClient, + SNSServiceException, +} from "@aws-sdk/client-sns"; import { DeleteCommand, DynamoDBDocumentClient } from "@aws-sdk/lib-dynamodb"; +import Ajv from "ajv"; import { S3Event, S3EventRecord } from "aws-lambda"; +import { readFileSync } from "fs"; +import { join } from "path"; +import { v4 as uuidv4 } from "uuid"; import { - ErrorMessage, LinkS3Payload, + logModes, requestStatus, } from "../../helpers/src/interfaces"; -import { logger } from "../../helpers/src/utilities"; -import Ajv from "ajv"; -import { readFileSync } from "fs"; -import { join } from "path"; -import { v4 as uuidv4 } from "uuid"; import { imperativeParseJSON, JSONParserError, } from "../../helpers/src/payload-validator"; -// SDK and third party client object initialistaion +import { + constructExceptionMessage, + constructExceptionMessageforLogger, + logger, +} from "../../helpers/src/utilities"; + const ddbClientObject = new DynamoDBClient({ region: AWS_REGION, maxAttempts: 2, @@ -39,11 +52,6 @@ const ddbClientObject = new DynamoDBClient({ const ddbDocClientObject = DynamoDBDocumentClient.from(ddbClientObject); const snsClientObject = new SNSClient({ region: AWS_REGION, maxAttempts: 2 }); -//Error notification -const errorMessage: ErrorMessage = { - Subject: "Error Processing Link delete via S3 Interface", -}; - const ajv = new Ajv({ allErrors: true }); const schemaDefinition = JSON.parse( readFileSync( @@ -54,18 +62,44 @@ const schemaDefinition = JSON.parse( ); const validate = ajv.compile(schemaDefinition); +const handlerName = AWS_LAMBDA_FUNCTION_NAME + ""; +let linkDataValue = ""; +const messageSubject = + "Exception in account assignment delete operation through S3 interface"; + export const handler = async (event: S3Event) => { await Promise.all( event.Records.map(async (record: S3EventRecord) => { const requestId = uuidv4().toString(); + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestId, + status: requestStatus.InProgress, + statusMessage: `Account assignment delete operation started`, + }, + functionLogMode + ); try { const fileName = decodeURIComponent(record.s3.object.key.split("/")[1]); - console.log(`fileName received: ${fileName}`); + const payload: LinkS3Payload = imperativeParseJSON( { linkData: fileName }, validate ); + logger( + { + handler: handlerName, + logMode: logModes.Debug, + requestId: requestId, + status: requestStatus.InProgress, + statusMessage: `Account assignment payload successfully parsed`, + }, + functionLogMode + ); const { linkData } = payload; + linkDataValue = linkData; await ddbDocClientObject.send( new DeleteCommand({ TableName: DdbTable, @@ -74,6 +108,19 @@ export const handler = async (event: S3Event) => { }, }) ); + logger( + { + handler: handlerName, + logMode: logModes.Debug, + requestId: requestId, + status: requestStatus.InProgress, + statusMessage: `Successfully processed delete from Dynamo DB`, + relatedData: linkDataValue, + hasRelatedRequests: + linkData.split("%")[0] === "account" ? false : true, + }, + functionLogMode + ); await snsClientObject.send( new PublishCommand({ TopicArn: linkProcessingTopicArn + "", @@ -84,55 +131,100 @@ export const handler = async (event: S3Event) => { }), }) ); - logger({ - handler: "userInterface-s3Delete", - logMode: "info", - relatedData: linkData, - requestId: requestId, - status: requestStatus.InProgress, - hasRelatedRequests: - linkData.split("%")[0] === "account" ? false : true, - statusMessage: `Account Assignment delete operation is being processed`, - }); + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestId, + status: requestStatus.InProgress, + statusMessage: `Sent payload to account assignment processing topic`, + relatedData: linkDataValue, + hasRelatedRequests: + linkData.split("%")[0] === "account" ? false : true, + }, + functionLogMode + ); } catch (err) { if (err instanceof JSONParserError) { + await snsClientObject.send( + new PublishCommand({ + TopicArn: errorNotificationsTopicArn, + Subject: messageSubject, + Message: constructExceptionMessage( + requestId, + handlerName, + "Schema validation exception", + `Provided account assignment ${linkDataValue} S3 file does not pass the schema validation`, + JSON.stringify(err.errors) + ), + }) + ); logger({ - handler: "userInterface-s3Delete", - logMode: "error", + handler: handlerName, requestId: requestId, + logMode: logModes.Exception, status: requestStatus.FailedWithException, - statusMessage: `Error processing link operation through S3 interface due to schema errors for: ${JSON.stringify( - err.errors - )}`, + statusMessage: constructExceptionMessageforLogger( + requestId, + "Schema validation exception", + `Provided account assignment ${linkDataValue} S3 file does not pass the schema validation`, + JSON.stringify(err.errors) + ), }); + } else if ( + err instanceof SNSServiceException || + err instanceof DynamoDBServiceException + ) { await snsClientObject.send( new PublishCommand({ TopicArn: errorNotificationsTopicArn, - Message: JSON.stringify({ - errorMessage: `Error processing link operation through S3 interface due to schema errors`, - errors: err.errors, - }), + Subject: messageSubject, + Message: constructExceptionMessage( + requestId, + handlerName, + err.name, + err.message, + linkDataValue + ), }) ); + logger({ + handler: handlerName, + requestId: requestId, + logMode: logModes.Exception, + status: requestStatus.FailedWithException, + statusMessage: constructExceptionMessageforLogger( + requestId, + err.name, + err.message, + linkDataValue + ), + }); } else { await snsClientObject.send( new PublishCommand({ TopicArn: errorNotificationsTopicArn, - Message: JSON.stringify({ - ...errorMessage, - eventDetail: record, - errorDetails: err, - }), + Subject: messageSubject, + Message: constructExceptionMessage( + requestId, + handlerName, + "Unhandled exception", + JSON.stringify(err), + linkDataValue + ), }) ); logger({ - handler: "userInterface-s3Delete", - logMode: "error", + handler: handlerName, requestId: requestId, + logMode: logModes.Exception, status: requestStatus.FailedWithException, - statusMessage: `Account Assignment delete operation failed with error: ${JSON.stringify( - err - )}`, + statusMessage: constructExceptionMessageforLogger( + requestId, + "Unhandled exception", + JSON.stringify(err), + linkDataValue + ), }); } } diff --git a/lib/lambda-functions/user-interface-handlers/src/permissionSetApi.ts b/lib/lambda-functions/user-interface-handlers/src/permissionSetApi.ts index 31da241..b2801bf 100644 --- a/lib/lambda-functions/user-interface-handlers/src/permissionSetApi.ts +++ b/lib/lambda-functions/user-interface-handlers/src/permissionSetApi.ts @@ -1,28 +1,36 @@ -/* -Objective: Implement lambda proxy for permission set importer API -Trigger source: Permission set API -- Schema validation of the payload -- Upsert / delete in permission sets DDB table depending on the operation -*/ +/** + * Objective: Implement lambda proxy for permission set importer API Trigger + * source: Permission set API + * + * - Schema validation of the payload + * - Upsert / delete in permission sets DDB table depending on the operation + */ -// Environment configuration read const { linksTable, AWS_REGION, artefactsBucketName, DdbTable, permissionSetProcessingTopicArn, + functionLogMode, + AWS_LAMBDA_FUNCTION_NAME, } = process.env; -// Lambda types import -// SDK and third party client imports -import { DynamoDBClient } from "@aws-sdk/client-dynamodb"; +import { + DynamoDBClient, + DynamoDBServiceException, +} from "@aws-sdk/client-dynamodb"; import { DeleteObjectCommand, PutObjectCommand, S3Client, + S3ServiceException, } from "@aws-sdk/client-s3"; -import { PublishCommand, SNSClient } from "@aws-sdk/client-sns"; +import { + PublishCommand, + SNSClient, + SNSServiceException, +} from "@aws-sdk/client-sns"; import { DynamoDBDocumentClient, GetCommand, @@ -31,7 +39,7 @@ import { QueryCommand, QueryCommandOutput, } from "@aws-sdk/lib-dynamodb"; -//Import validator function and dependencies + import Ajv from "ajv"; import { APIGatewayProxyEventV2, APIGatewayProxyResultV2 } from "aws-lambda"; import { readFileSync } from "fs"; @@ -39,16 +47,20 @@ import { join } from "path"; import { CreateUpdatePermissionSetPayload, DeletePermissionSetPayload, + logModes, requestStatus, } from "../../helpers/src/interfaces"; -//Import helper utilities and interfaces + +import { v4 as uuidv4 } from "uuid"; import { imperativeParseJSON, JSONParserError, } from "../../helpers/src/payload-validator"; -import { v4 as uuidv4 } from "uuid"; -import { logger } from "../../helpers/src/utilities"; -// SDK and third party client object initialistaion +import { + constructExceptionMessageforLogger, + logger, +} from "../../helpers/src/utilities"; + const ddbClientObject = new DynamoDBClient({ region: AWS_REGION, maxAttempts: 2, @@ -86,35 +98,101 @@ const deleteSchemaDefinition = JSON.parse( ); const deleteValidate = ajv.compile(deleteSchemaDefinition); +const handlerName = AWS_LAMBDA_FUNCTION_NAME + ""; +let permissionSetName = ""; + export const handler = async ( event: APIGatewayProxyEventV2 ): Promise => { + const requestId = uuidv4().toString(); + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestId, + status: requestStatus.InProgress, + statusMessage: `Permission Set create/update/delete operation started`, + }, + functionLogMode + ); if (event.body !== null && event.body !== undefined) { try { const body = JSON.parse(event.body); - const requestId = uuidv4().toString(); + logger( + { + handler: handlerName, + logMode: logModes.Debug, + requestId: requestId, + status: requestStatus.InProgress, + statusMessage: `Permission set parsed successfully from message body`, + }, + functionLogMode + ); + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestId, + status: requestStatus.InProgress, + statusMessage: `Determined permission set operation is determined to be ${body.action}`, + }, + functionLogMode + ); if (body.action === "create" || body.action === "update") { const payload: CreateUpdatePermissionSetPayload = imperativeParseJSON( event.body, createUpdateValidate ); + logger( + { + handler: handlerName, + logMode: logModes.Debug, + requestId: requestId, + status: requestStatus.InProgress, + statusMessage: `Permission Set validated successfully against the schema definition for create/update operation`, + }, + functionLogMode + ); + permissionSetName = payload.permissionSetData.permissionSetName; await s3clientObject.send( new PutObjectCommand({ Bucket: artefactsBucketName, - Key: `permission_sets/${payload.permissionSetData.permissionSetName}.json`, + Key: `permission_sets/${permissionSetName}.json`, Body: JSON.stringify(payload.permissionSetData), ServerSideEncryption: "AES256", }) ); + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestId, + status: requestStatus.InProgress, + statusMessage: `Permission Set upsert to S3 successful`, + relatedData: permissionSetName, + }, + functionLogMode + ); const fetchPermissionSet: GetCommandOutput = await ddbDocClientObject.send( new GetCommand({ TableName: DdbTable, Key: { - permissionSetName: payload.permissionSetData.permissionSetName, + permissionSetName: permissionSetName, }, }) ); + logger( + { + handler: handlerName, + logMode: logModes.Debug, + requestId: requestId, + status: requestStatus.InProgress, + statusMessage: `Did a fetch on solution persistence to determine if we already know about this permission set`, + relatedData: permissionSetName, + }, + functionLogMode + ); await ddbDocClientObject.send( new PutCommand({ TableName: DdbTable, @@ -123,6 +201,17 @@ export const handler = async ( }, }) ); + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestId, + status: requestStatus.InProgress, + statusMessage: `Permission Set upsert to Dynamo DB successful`, + relatedData: permissionSetName, + }, + functionLogMode + ); if (fetchPermissionSet.Item) { await snsClientObject.send( new PublishCommand({ @@ -130,11 +219,22 @@ export const handler = async ( Message: JSON.stringify({ requestId: requestId, action: "update", - permissionSetName: payload.permissionSetData.permissionSetName, + permissionSetName: permissionSetName, oldPermissionSetData: fetchPermissionSet.Item, }), }) ); + logger( + { + handler: handlerName, + logMode: logModes.Debug, + requestId: requestId, + status: requestStatus.InProgress, + statusMessage: `Determined operation is update, posted the payload with upload action to permissionSetProcessorTopic`, + relatedData: permissionSetName, + }, + functionLogMode + ); } else { await snsClientObject.send( new PublishCommand({ @@ -142,20 +242,34 @@ export const handler = async ( Message: JSON.stringify({ requestId: requestId, action: "create", - permissionSetName: payload.permissionSetData.permissionSetName, + permissionSetName: permissionSetName, }), }) ); + logger( + { + handler: handlerName, + logMode: logModes.Debug, + requestId: requestId, + status: requestStatus.InProgress, + statusMessage: `Determined operation is create, posted the payload with create action to permissionSetProcessorTopic`, + relatedData: permissionSetName, + }, + functionLogMode + ); } - logger({ - handler: "userInterface-permissionSetApi", - logMode: "info", - relatedData: payload.permissionSetData.permissionSetName, - requestId: requestId, - status: requestStatus.InProgress, - statusMessage: `Permission Set ${payload.action} operation is being processed`, - }); + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestId, + status: requestStatus.InProgress, + statusMessage: `Completed processing of permission set payload at the interface level`, + relatedData: permissionSetName, + }, + functionLogMode + ); return { statusCode: 200, body: JSON.stringify({ @@ -168,6 +282,17 @@ export const handler = async ( event.body, deleteValidate ); + logger( + { + handler: handlerName, + logMode: logModes.Debug, + requestId: requestId, + status: requestStatus.InProgress, + statusMessage: `Permission Set validated successfully against the schema definition for delete operation`, + }, + functionLogMode + ); + permissionSetName = payload.permissionSetData.permissionSetName; const relatedLinks: QueryCommandOutput = await ddbDocClientObject.send( // QueryCommand is a pagniated call, however the logic requires // checking only if the result set is greater than 0 @@ -183,16 +308,30 @@ export const handler = async ( }, }) ); + logger( + { + handler: handlerName, + logMode: logModes.Debug, + requestId: requestId, + status: requestStatus.InProgress, + relatedData: permissionSetName, + statusMessage: `Queried if there are any related account assignments`, + }, + functionLogMode + ); if (relatedLinks.Items?.length !== 0) { - logger({ - handler: "userInterface-permissionSetApi", - logMode: "warn", - relatedData: payload.permissionSetData.permissionSetName, - requestId: requestId, - status: requestStatus.Aborted, - statusMessage: `Permission Set ${payload.action} operation aborted as there are existing account assignments referencing the permission set`, - }); + logger( + { + handler: handlerName, + logMode: logModes.Warn, + requestId: requestId, + status: requestStatus.Aborted, + relatedData: permissionSetName, + statusMessage: `Permission set delete operation is aborted as there are existing account assignments referencing this permission set`, + }, + functionLogMode + ); return { statusCode: 400, body: JSON.stringify({ @@ -201,12 +340,34 @@ export const handler = async ( }), }; } else { + logger( + { + handler: handlerName, + logMode: logModes.Debug, + requestId: requestId, + status: requestStatus.InProgress, + relatedData: permissionSetName, + statusMessage: `Determined there are no account assignments referencing this permission set`, + }, + functionLogMode + ); await s3clientObject.send( new DeleteObjectCommand({ Bucket: artefactsBucketName, Key: `permission_sets/${payload.permissionSetData.permissionSetName}.json`, }) ); + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestId, + relatedData: permissionSetName, + status: requestStatus.InProgress, + statusMessage: `Processed delete in S3`, + }, + functionLogMode + ); await snsClientObject.send( new PublishCommand({ TopicArn: permissionSetProcessingTopicArn + "", @@ -217,14 +378,17 @@ export const handler = async ( }), }) ); - logger({ - handler: "userInterface-permissionSetApi", - logMode: "info", - relatedData: payload.permissionSetData.permissionSetName, - requestId: requestId, - status: requestStatus.InProgress, - statusMessage: `Permission Set ${payload.action} operation is being processed`, - }); + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestId, + relatedData: permissionSetName, + status: requestStatus.InProgress, + statusMessage: `Sent delete payload to permissionSet processing topic`, + }, + functionLogMode + ); return { statusCode: 200, body: JSON.stringify({ @@ -234,13 +398,17 @@ export const handler = async ( }; } } else { - logger({ - handler: "userInterface-permissionSetApi", - logMode: "error", - requestId: requestId, - status: requestStatus.FailedWithError, - statusMessage: `Permission Set operation failed due to invalid action - ${body.action}`, - }); + logger( + { + handler: handlerName, + logMode: logModes.Exception, + requestId: requestId, + relatedData: permissionSetName, + status: requestStatus.FailedWithException, + statusMessage: `Permission Set operation failed due to invalid action - ${body.action}`, + }, + functionLogMode + ); return { statusCode: 400, body: JSON.stringify({ @@ -252,45 +420,108 @@ export const handler = async ( } catch (err) { if (err instanceof JSONParserError) { logger({ - handler: "userInterface-permissionSetApi", - logMode: "error", + handler: handlerName, + requestId: requestId, + logMode: logModes.Exception, + status: requestStatus.FailedWithException, + statusMessage: constructExceptionMessageforLogger( + requestId, + "Schema validation exception", + `Provided permission set ${permissionSetName} payload does not pass the schema validation`, + JSON.stringify(err.errors) + ), + }); + return { + statusCode: 500, + body: JSON.stringify({ + message: constructExceptionMessageforLogger( + requestId, + "Schema validation exception", + `Provided permission set ${permissionSetName} payload does not pass the schema validation`, + JSON.stringify(err.errors) + ), + requestId: requestId, + }), + }; + } else if ( + err instanceof S3ServiceException || + err instanceof DynamoDBServiceException || + err instanceof SNSServiceException + ) { + logger({ + handler: handlerName, + requestId: requestId, + logMode: logModes.Exception, status: requestStatus.FailedWithException, - statusMessage: `Permission Set operation failed due to schema validation errors:${JSON.stringify( - err.errors - )}`, + statusMessage: constructExceptionMessageforLogger( + requestId, + err.name, + err.message, + permissionSetName + ), }); return { statusCode: 500, - body: JSON.stringify({ errors: err.errors }), + body: JSON.stringify({ + message: constructExceptionMessageforLogger( + requestId, + err.name, + err.message, + permissionSetName + ), + requestId: requestId, + }), }; } else { logger({ - handler: "userInterface-permissionSetApi", - logMode: "error", + handler: handlerName, + requestId: requestId, + logMode: logModes.Exception, status: requestStatus.FailedWithException, - statusMessage: `Permission Set operation failed due to exception:${JSON.stringify( - err - )}`, + statusMessage: constructExceptionMessageforLogger( + requestId, + "Unhandled exception", + JSON.stringify(err), + permissionSetName + ), }); return { statusCode: 500, body: JSON.stringify({ - message: `Exception while processing the call ${err}`, + requestId: requestId, + message: constructExceptionMessageforLogger( + requestId, + "Unhandled exception", + JSON.stringify(err), + permissionSetName + ), }), }; } } } else { logger({ - handler: "userInterface-permissionSetApi", - logMode: "error", + handler: handlerName, + requestId: requestId, + logMode: logModes.Exception, status: requestStatus.FailedWithException, - statusMessage: `Permission Set operation failed due to invalid message body`, + statusMessage: constructExceptionMessageforLogger( + requestId, + "Invalid message body exception", + "Message body provided is invalid", + permissionSetName + ), }); return { statusCode: 400, body: JSON.stringify({ - message: "Invalid message body provided", + requestId: requestId, + message: constructExceptionMessageforLogger( + requestId, + "Invalid message body exception", + "Message body provided is invalid", + permissionSetName + ), }), }; } diff --git a/lib/lambda-functions/user-interface-handlers/src/permissionSetCu.ts b/lib/lambda-functions/user-interface-handlers/src/permissionSetCu.ts index fd20a62..c629e91 100644 --- a/lib/lambda-functions/user-interface-handlers/src/permissionSetCu.ts +++ b/lib/lambda-functions/user-interface-handlers/src/permissionSetCu.ts @@ -1,45 +1,50 @@ -/* -Objective: Implement event notification handler for permission set objects s3clientObject path -Trigger source: permission set s3clientObject path object notification for -both created and change type events -- Schema validation of the file name -- Upsert in permission set DDB table parsing the file name -*/ +/** + * Objective: Implement event notification handler for permission set objects + * s3clientObject path Trigger source: permission set s3clientObject path object + * notification for both created and change type events + * + * - Schema validation of the file name + * - Upsert in permission set DDB table parsing the file name + */ -// Environment configuration read const { DdbTable, errorNotificationsTopicArn, AWS_REGION, permissionSetProcessingTopicArn, + functionLogMode, + AWS_LAMBDA_FUNCTION_NAME, } = process.env; - -// Lambda and other types import -// SDK and third party client imports -import { DynamoDBClient } from "@aws-sdk/client-dynamodb"; +import { + DynamoDBClient, + DynamoDBServiceException, +} from "@aws-sdk/client-dynamodb"; import { GetObjectCommand, GetObjectCommandOutput, S3Client, + S3ServiceException, } from "@aws-sdk/client-s3"; -import { PublishCommand, SNSClient } from "@aws-sdk/client-sns"; +import { + PublishCommand, + SNSClient, + SNSServiceException, +} from "@aws-sdk/client-sns"; import { DynamoDBDocumentClient, GetCommand, GetCommandOutput, PutCommand, } from "@aws-sdk/lib-dynamodb"; -//Import validator function and dependencies import Ajv from "ajv"; import { S3Event, S3EventRecord } from "aws-lambda"; import { readFileSync } from "fs"; import { join } from "path"; import { Readable } from "stream"; import { v4 as uuidv4 } from "uuid"; -//Import helper utilities and interfaces import { CreateUpdatePermissionSetPayload, - ErrorMessage, + logModes, requestStatus, } from "../../helpers/src/interfaces"; import { @@ -47,11 +52,13 @@ import { JSONParserError, } from "../../helpers/src/payload-validator"; import { + constructExceptionMessage, + constructExceptionMessageforLogger, logger, removeEmpty, streamToString, } from "../../helpers/src/utilities"; -// SDK and third party client object initialistaion + const ddbClientObject = new DynamoDBClient({ region: AWS_REGION, maxAttempts: 2, @@ -60,7 +67,6 @@ const ddbDocClientObject = DynamoDBDocumentClient.from(ddbClientObject); const snsClientObject = new SNSClient({ region: AWS_REGION, maxAttempts: 2 }); const s3clientObject = new S3Client({ region: AWS_REGION, maxAttempts: 2 }); -// Validator object initialisation const ajv = new Ajv({ allErrors: true }); const createUpdateSchemaDefinition = JSON.parse( readFileSync( @@ -75,32 +81,82 @@ const createUpdateSchemaDefinition = JSON.parse( .toString() ); const createUpdateValidate = ajv.compile(createUpdateSchemaDefinition); - -//Error notification -const errorMessage: ErrorMessage = { - Subject: "Error Processing Permission Set create/update via S3 Interface", -}; +const handlerName = AWS_LAMBDA_FUNCTION_NAME + ""; +let permissionSetFileName = ""; +const messageSubject = + "Exception in permission set create/update operation through S3 interface"; export const handler = async (event: S3Event) => { await Promise.all( event.Records.map(async (record: S3EventRecord) => { + const requestId = uuidv4().toString(); + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestId, + status: requestStatus.InProgress, + statusMessage: `Permission Set create/update operation started`, + }, + functionLogMode + ); try { - const requestId = uuidv4().toString(); - // Get original text from object in incoming event const originalText: GetObjectCommandOutput = await s3clientObject.send( new GetObjectCommand({ Bucket: record.s3.bucket.name, Key: record.s3.object.key, }) ); + logger( + { + handler: handlerName, + logMode: logModes.Debug, + requestId: requestId, + status: requestStatus.InProgress, + statusMessage: `Fetched S3 file content from permission_sets location - ${record.s3.bucket.name}/${record.s3.object.key}`, + }, + functionLogMode + ); + permissionSetFileName = record.s3.object.key; const jsonData = JSON.parse( await streamToString(originalText.Body as Readable) ); + logger( + { + handler: handlerName, + logMode: logModes.Debug, + requestId: requestId, + status: requestStatus.InProgress, + statusMessage: `Parsed file content successfuly`, + }, + functionLogMode + ); const payload: CreateUpdatePermissionSetPayload = imperativeParseJSON( jsonData, createUpdateValidate ); + logger( + { + handler: handlerName, + logMode: logModes.Debug, + requestId: requestId, + status: requestStatus.InProgress, + statusMessage: `Completed imperative parsing to handle any malformed/null JSON values`, + }, + functionLogMode + ); const upsertData = removeEmpty(payload); + logger( + { + handler: handlerName, + logMode: logModes.Debug, + requestId: requestId, + status: requestStatus.InProgress, + relatedData: upsertData.permissionSetName, + statusMessage: `Removed empty values from permission set JSON`, + }, + functionLogMode + ); const fetchPermissionSet: GetCommandOutput = await ddbDocClientObject.send( new GetCommand({ @@ -110,6 +166,17 @@ export const handler = async (event: S3Event) => { }, }) ); + logger( + { + handler: handlerName, + logMode: logModes.Debug, + requestId: requestId, + status: requestStatus.InProgress, + relatedData: upsertData.permissionSetName, + statusMessage: `Checked if the permission set already exists in the solution to determine create/update operation`, + }, + functionLogMode + ); await ddbDocClientObject.send( new PutCommand({ TableName: DdbTable, @@ -118,6 +185,17 @@ export const handler = async (event: S3Event) => { }, }) ); + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestId, + status: requestStatus.InProgress, + relatedData: upsertData.permissionSetName, + statusMessage: `Processed upsert operation successfully`, + }, + functionLogMode + ); if (fetchPermissionSet.Item) { await snsClientObject.send( new PublishCommand({ @@ -130,6 +208,17 @@ export const handler = async (event: S3Event) => { }), }) ); + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestId, + status: requestStatus.InProgress, + relatedData: upsertData.permissionSetName, + statusMessage: `Determined the operation is update type, posting to permissionSetProcessor topic`, + }, + functionLogMode + ); } else { await snsClientObject.send( new PublishCommand({ @@ -141,54 +230,100 @@ export const handler = async (event: S3Event) => { }), }) ); + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestId, + status: requestStatus.InProgress, + relatedData: upsertData.permissionSetName, + statusMessage: `Determined the operation is create type, posting to permissionSetProcessor topic`, + }, + functionLogMode + ); } - - logger({ - handler: "userInterface-permissionSetS3CreateUpdate", - logMode: "info", - relatedData: upsertData.permissionSetName, - requestId: requestId, - status: requestStatus.InProgress, - statusMessage: `Permission Set operation is being processed`, - }); } catch (err) { if (err instanceof JSONParserError) { await snsClientObject.send( new PublishCommand({ TopicArn: errorNotificationsTopicArn, - Message: JSON.stringify({ - ...errorMessage, - eventDetail: record, - errorDetails: { errors: err.errors }, - }), + Subject: messageSubject, + Message: constructExceptionMessage( + requestId, + handlerName, + "Schema validation exception", + `Provided permission set ${permissionSetFileName} S3 file does not pass the schema validation`, + JSON.stringify(err.errors) + ), + }) + ); + logger({ + handler: handlerName, + requestId: requestId, + logMode: logModes.Exception, + status: requestStatus.FailedWithException, + statusMessage: constructExceptionMessageforLogger( + requestId, + "Schema validation exception", + `Provided permission set ${permissionSetFileName} S3 file does not pass the schema validation`, + JSON.stringify(err.errors) + ), + }); + } else if ( + err instanceof S3ServiceException || + err instanceof DynamoDBServiceException || + err instanceof SNSServiceException + ) { + await snsClientObject.send( + new PublishCommand({ + TopicArn: errorNotificationsTopicArn, + Subject: messageSubject, + Message: constructExceptionMessage( + requestId, + handlerName, + err.name, + err.message, + permissionSetFileName + ), }) ); logger({ - handler: "userInterface-permissionSetS3CreateUpdate", - logMode: "error", + handler: handlerName, + requestId: requestId, + logMode: logModes.Exception, status: requestStatus.FailedWithException, - statusMessage: `Permission Set operation failed due to schema validation errors:${JSON.stringify( - err.errors - )}`, + statusMessage: constructExceptionMessageforLogger( + requestId, + err.name, + err.message, + permissionSetFileName + ), }); } else { await snsClientObject.send( new PublishCommand({ TopicArn: errorNotificationsTopicArn, - Message: JSON.stringify({ - ...errorMessage, - eventDetail: record, - errorDetails: `Error processing permissionSet create/update via S3 interface with exception: ${err}`, - }), + Subject: messageSubject, + Message: constructExceptionMessage( + requestId, + handlerName, + "Unhandled exception", + JSON.stringify(err), + permissionSetFileName + ), }) ); logger({ - handler: "userInterface-permissionSetS3CreateUpdate", - logMode: "error", + handler: handlerName, + requestId: requestId, + logMode: logModes.Exception, status: requestStatus.FailedWithException, - statusMessage: `Permission Set operation failed due to exception:${JSON.stringify( - err - )}`, + statusMessage: constructExceptionMessageforLogger( + requestId, + "Unhandled exception", + JSON.stringify(err), + permissionSetFileName + ), }); } } diff --git a/lib/lambda-functions/user-interface-handlers/src/permissionSetDel.ts b/lib/lambda-functions/user-interface-handlers/src/permissionSetDel.ts index c2c37d4..ca5e5ee 100644 --- a/lib/lambda-functions/user-interface-handlers/src/permissionSetDel.ts +++ b/lib/lambda-functions/user-interface-handlers/src/permissionSetDel.ts @@ -1,9 +1,11 @@ -/* -Objective: Implement event notification handler for permission set objects S3 path -Trigger source: permission set S3 path object notification for removed type events -- Schema validation of the file name -- delete in permission set DDB table parsing the file name -*/ +/** + * Objective: Implement event notification handler for permission set objects S3 + * path Trigger source: permission set S3 path object notification for removed + * type events + * + * - Schema validation of the file name + * - Delete in permission set DDB table parsing the file name + */ // Environment configuration read const { @@ -11,18 +13,30 @@ const { errorNotificationsTopicArn, AWS_REGION, permissionSetProcessingTopicArn, + functionLogMode, + AWS_LAMBDA_FUNCTION_NAME, } = process.env; -// SDK and third party client imports -import { DynamoDBClient } from "@aws-sdk/client-dynamodb"; -import { PublishCommand, SNSClient } from "@aws-sdk/client-sns"; +import { + DynamoDBClient, + DynamoDBServiceException, +} from "@aws-sdk/client-dynamodb"; +import { + PublishCommand, + SNSClient, + SNSServiceException, +} from "@aws-sdk/client-sns"; import { DynamoDBDocumentClient, QueryCommand } from "@aws-sdk/lib-dynamodb"; import { S3Event, S3EventRecord } from "aws-lambda"; import { v4 as uuidv4 } from "uuid"; -import { ErrorMessage, requestStatus } from "../../helpers/src/interfaces"; +import { logModes, requestStatus } from "../../helpers/src/interfaces"; import { JSONParserError } from "../../helpers/src/payload-validator"; -import { logger } from "../../helpers/src/utilities"; -// SDK and third party client object initialistaion +import { + constructExceptionMessage, + constructExceptionMessageforLogger, + logger, +} from "../../helpers/src/utilities"; + const ddbClientObject = new DynamoDBClient({ region: AWS_REGION, maxAttempts: 2, @@ -30,19 +44,40 @@ const ddbClientObject = new DynamoDBClient({ const ddbDocClientObject = DynamoDBDocumentClient.from(ddbClientObject); const snsClientObject = new SNSClient({ region: AWS_REGION, maxAttempts: 2 }); -const errorMessage: ErrorMessage = { - Subject: "Error Processing Permission Set delete via S3 Interface", -}; +const handlerName = AWS_LAMBDA_FUNCTION_NAME + ""; +let permissionSetFileName = ""; +const messageSubject = + "Exception in permission set delete processing through S3 interface"; export const handler = async (event: S3Event) => { await Promise.all( event.Records.map(async (record: S3EventRecord) => { + const requestId = uuidv4().toString(); try { - const requestId = uuidv4().toString(); + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestId, + status: requestStatus.InProgress, + statusMessage: `Permission Set delete operation started`, + }, + functionLogMode + ); const keyValue = record.s3.object.key.split("/")[1].split(".")[0]; + permissionSetFileName = keyValue; + logger( + { + handler: handlerName, + logMode: logModes.Debug, + requestId: requestId, + status: requestStatus.InProgress, + relatedData: keyValue, + statusMessage: `Split file name with path for fetching permission set name`, + }, + functionLogMode + ); const relatedLinks = await ddbDocClientObject.send( - // QueryCommand is a pagniated call, however the logic requires - // checking only if the result set is greater than 0 new QueryCommand({ TableName: linksTable, IndexName: "permissionSetName", @@ -53,27 +88,56 @@ export const handler = async (event: S3Event) => { ExpressionAttributeValues: { ":permissionSetName": keyValue }, }) ); + logger( + { + handler: handlerName, + logMode: logModes.Debug, + requestId: requestId, + status: requestStatus.InProgress, + relatedData: keyValue, + statusMessage: `Queried if there are any related account assignments using this permission set`, + }, + functionLogMode + ); if (relatedLinks.Items?.length !== 0) { await snsClientObject.send( new PublishCommand({ TopicArn: errorNotificationsTopicArn, - Message: JSON.stringify({ - ...errorMessage, - eventDetail: record, - errorDetails: - "Cannot delete permission set as there are existing links that reference the permission set", - }), + Subject: messageSubject, + Message: constructExceptionMessage( + requestId, + handlerName, + "Constraint violation exception", + "There are related account assignments for this permission set, and cannot be deleted without deleting the account assignments first", + keyValue + ), }) ); logger({ - handler: "userInterface-permissionSetS3Delete", - logMode: "warn", + handler: handlerName, + logMode: logModes.Warn, relatedData: keyValue, requestId: requestId, status: requestStatus.Aborted, - statusMessage: `Permission Set delete operation aborted as there are existing account assignments referencing the permission set`, + statusMessage: constructExceptionMessageforLogger( + handlerName, + "Constraint violation exception", + "There are related account assignments for this permission set, and cannot be deleted without deleting the account assignments first", + keyValue + ), }); } else { + logger( + { + handler: handlerName, + logMode: logModes.Info, + requestId: requestId, + status: requestStatus.InProgress, + relatedData: keyValue, + statusMessage: `No related account assignments found, posting payload to permissionSetProecsstingTopic`, + }, + functionLogMode + ); await snsClientObject.send( new PublishCommand({ TopicArn: permissionSetProcessingTopicArn + "", @@ -84,53 +148,87 @@ export const handler = async (event: S3Event) => { }), }) ); - logger({ - handler: "userInterface-permissionSetS3Delete", - logMode: "info", - relatedData: keyValue, - requestId: requestId, - status: requestStatus.InProgress, - statusMessage: `Permission Set operation is being processed`, - }); } } catch (err) { if (err instanceof JSONParserError) { await snsClientObject.send( new PublishCommand({ TopicArn: errorNotificationsTopicArn, - Message: JSON.stringify({ - ...errorMessage, - eventDetail: record, - errorDetails: { errors: err.errors }, - }), + Subject: messageSubject, + Message: constructExceptionMessage( + requestId, + handlerName, + "Schema validation exception", + `Provided permission set ${permissionSetFileName} S3 file does not pass the schema validation`, + JSON.stringify(err.errors) + ), + }) + ); + + logger({ + handler: handlerName, + logMode: logModes.Exception, + status: requestStatus.FailedWithException, + statusMessage: constructExceptionMessageforLogger( + handlerName, + "Schema validation exception", + `Provided permission set ${permissionSetFileName} S3 file does not pass the schema validation`, + JSON.stringify(err.errors) + ), + }); + } else if ( + err instanceof DynamoDBServiceException || + err instanceof SNSServiceException + ) { + await snsClientObject.send( + new PublishCommand({ + TopicArn: errorNotificationsTopicArn, + Subject: messageSubject, + Message: constructExceptionMessage( + requestId, + handlerName, + err.name, + err.message, + permissionSetFileName + ), }) ); logger({ - handler: "userInterface-permissionSetS3Delete", - logMode: "error", + handler: handlerName, + logMode: logModes.Exception, + requestId: requestId, status: requestStatus.FailedWithException, - statusMessage: `Permission Set operation failed due to schema validation errors:${JSON.stringify( - err.errors - )}`, + statusMessage: constructExceptionMessageforLogger( + handlerName, + err.name, + err.message, + permissionSetFileName + ), }); } else { await snsClientObject.send( new PublishCommand({ TopicArn: errorNotificationsTopicArn, - Message: JSON.stringify({ - ...errorMessage, - eventDetail: record, - errorDetails: `Error processing permissionSet delete via S3 interface with exception: ${err}`, - }), + Subject: messageSubject, + Message: constructExceptionMessage( + requestId, + handlerName, + "Unhandled exception", + JSON.stringify(err), + permissionSetFileName + ), }) ); logger({ - handler: "userInterface-permissionSetS3Delete", - logMode: "error", + handler: handlerName, + logMode: logModes.Exception, status: requestStatus.FailedWithException, - statusMessage: `Permission Set operation failed due to exception:${JSON.stringify( - err - )}`, + statusMessage: constructExceptionMessageforLogger( + handlerName, + "Unhandled exception", + JSON.stringify(err), + permissionSetFileName + ), }); } } diff --git a/lib/lambda-functions/yarn.lock b/lib/lambda-functions/yarn.lock index 96807ff..65d7d7b 100644 --- a/lib/lambda-functions/yarn.lock +++ b/lib/lambda-functions/yarn.lock @@ -87,20 +87,20 @@ "@aws-sdk/util-utf8-browser" "^3.0.0" tslib "^1.11.1" -"@aws-sdk/abort-controller@3.78.0": - version "3.78.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/abort-controller/-/abort-controller-3.78.0.tgz#f2b0f8d63954afe51136254f389a18dd24a8f6f3" - integrity sha512-iz1YLwM2feJUj/y97yO4XmDeTxs+yZ1XJwQgoawKuc8IDBKUutnJNCHL5jL04WUKU7Nrlq+Hr2fCTScFh2z9zg== +"@aws-sdk/abort-controller@3.110.0": + version "3.110.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/abort-controller/-/abort-controller-3.110.0.tgz#15b493b776ec4f7236c6ad6134a6fe87e9dc5292" + integrity sha512-zok/WEVuK7Jh6V9YeA56pNZtxUASon9LTkS7vE65A4UFmNkPGNBCNgoiBcbhWfxwrZ8wtXcQk6rtUut39831mA== dependencies: - "@aws-sdk/types" "3.78.0" + "@aws-sdk/types" "3.110.0" tslib "^2.3.1" -"@aws-sdk/chunked-blob-reader-native@3.58.0": - version "3.58.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/chunked-blob-reader-native/-/chunked-blob-reader-native-3.58.0.tgz#1db413c5c80b32e24f1b62b22e15e9ad74d75cda" - integrity sha512-+D3xnPD5985iphgAqgUerBDs371a2WzzoEVi7eHJUMMsP/gEnSTdSH0HNxsqhYv6CW4EdKtvDAQdAwA1VtCf2A== +"@aws-sdk/chunked-blob-reader-native@3.109.0": + version "3.109.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/chunked-blob-reader-native/-/chunked-blob-reader-native-3.109.0.tgz#4db2ec81faf38fe33cf9dd6f75641afe0826dcfd" + integrity sha512-Ybn3vDZ3CqGyprL2qdF6QZqoqlx8lA3qOJepobjuKKDRw+KgGxjUY4NvWe0R2MdRoduyaDj6uvhIay0S1MOSJQ== dependencies: - "@aws-sdk/util-base64-browser" "3.58.0" + "@aws-sdk/util-base64-browser" "3.109.0" tslib "^2.3.1" "@aws-sdk/chunked-blob-reader@3.55.0": @@ -110,624 +110,636 @@ dependencies: tslib "^2.3.1" -"@aws-sdk/client-cognito-identity@3.100.0": - version "3.100.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.100.0.tgz#ca8ed8991841467c9e807ce138cc15f4609ca4af" - integrity sha512-qW0FygDcZc8oWDMox+bOyetyNydsMzFgHgIuhGA/zpP8KgMZSHys0D3PFb+X/x39WVkkD20/3hNrJ2bf0/s7LA== +"@aws-sdk/client-cognito-identity@3.121.0": + version "3.121.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.121.0.tgz#362d24acd7b22b8abe17ddba409d53e2b7a68b8c" + integrity sha512-g+6XDjGtgehJ89rYtG7mPS+Jl80+WhHzV+arSAJrAsKBB3CnH5eo6kRu6/uBd+uqd9uCdFlIZ46dd8VR8OflpA== dependencies: "@aws-crypto/sha256-browser" "2.0.0" "@aws-crypto/sha256-js" "2.0.0" - "@aws-sdk/client-sts" "3.100.0" - "@aws-sdk/config-resolver" "3.80.0" - "@aws-sdk/credential-provider-node" "3.100.0" - "@aws-sdk/fetch-http-handler" "3.78.0" - "@aws-sdk/hash-node" "3.78.0" - "@aws-sdk/invalid-dependency" "3.78.0" - "@aws-sdk/middleware-content-length" "3.78.0" - "@aws-sdk/middleware-host-header" "3.78.0" - "@aws-sdk/middleware-logger" "3.78.0" - "@aws-sdk/middleware-retry" "3.80.0" - "@aws-sdk/middleware-serde" "3.78.0" - "@aws-sdk/middleware-signing" "3.78.0" - "@aws-sdk/middleware-stack" "3.78.0" - "@aws-sdk/middleware-user-agent" "3.78.0" - "@aws-sdk/node-config-provider" "3.80.0" - "@aws-sdk/node-http-handler" "3.94.0" - "@aws-sdk/protocol-http" "3.78.0" - "@aws-sdk/smithy-client" "3.99.0" - "@aws-sdk/types" "3.78.0" - "@aws-sdk/url-parser" "3.78.0" - "@aws-sdk/util-base64-browser" "3.58.0" + "@aws-sdk/client-sts" "3.121.0" + "@aws-sdk/config-resolver" "3.110.0" + "@aws-sdk/credential-provider-node" "3.121.0" + "@aws-sdk/fetch-http-handler" "3.110.0" + "@aws-sdk/hash-node" "3.110.0" + "@aws-sdk/invalid-dependency" "3.110.0" + "@aws-sdk/middleware-content-length" "3.110.0" + "@aws-sdk/middleware-host-header" "3.110.0" + "@aws-sdk/middleware-logger" "3.110.0" + "@aws-sdk/middleware-recursion-detection" "3.110.0" + "@aws-sdk/middleware-retry" "3.118.1" + "@aws-sdk/middleware-serde" "3.110.0" + "@aws-sdk/middleware-signing" "3.110.0" + "@aws-sdk/middleware-stack" "3.110.0" + "@aws-sdk/middleware-user-agent" "3.110.0" + "@aws-sdk/node-config-provider" "3.110.0" + "@aws-sdk/node-http-handler" "3.118.1" + "@aws-sdk/protocol-http" "3.110.0" + "@aws-sdk/smithy-client" "3.110.0" + "@aws-sdk/types" "3.110.0" + "@aws-sdk/url-parser" "3.110.0" + "@aws-sdk/util-base64-browser" "3.109.0" "@aws-sdk/util-base64-node" "3.55.0" "@aws-sdk/util-body-length-browser" "3.55.0" "@aws-sdk/util-body-length-node" "3.55.0" - "@aws-sdk/util-defaults-mode-browser" "3.99.0" - "@aws-sdk/util-defaults-mode-node" "3.99.0" - "@aws-sdk/util-user-agent-browser" "3.78.0" - "@aws-sdk/util-user-agent-node" "3.80.0" - "@aws-sdk/util-utf8-browser" "3.55.0" - "@aws-sdk/util-utf8-node" "3.55.0" + "@aws-sdk/util-defaults-mode-browser" "3.110.0" + "@aws-sdk/util-defaults-mode-node" "3.110.0" + "@aws-sdk/util-user-agent-browser" "3.110.0" + "@aws-sdk/util-user-agent-node" "3.118.0" + "@aws-sdk/util-utf8-browser" "3.109.0" + "@aws-sdk/util-utf8-node" "3.109.0" tslib "^2.3.1" -"@aws-sdk/client-dynamodb@^3.100.0": - version "3.100.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-dynamodb/-/client-dynamodb-3.100.0.tgz#1cad3f4ddac33c823567188a976f4d061fa3766a" - integrity sha512-0/PDutv4DDEpckH89x0hn6yFJGjtGhV+JnVimMw0dT+f+plWt706RTqPKgLCPftKTEDWncoQlSux+FO7vvXb4Q== +"@aws-sdk/client-dynamodb@^3.121.0": + version "3.121.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-dynamodb/-/client-dynamodb-3.121.0.tgz#72e06b036bf02a2521e1a443a9f8b1be8dcd655d" + integrity sha512-j5JgFagsyAoE7HxRD4Iis7IFmIV1W1fXeRZiQ6f5OwMlvhcnpacXPsVoxZfag4wz58WTuaJXbRiD5k5xxqTYvQ== dependencies: "@aws-crypto/sha256-browser" "2.0.0" "@aws-crypto/sha256-js" "2.0.0" - "@aws-sdk/client-sts" "3.100.0" - "@aws-sdk/config-resolver" "3.80.0" - "@aws-sdk/credential-provider-node" "3.100.0" - "@aws-sdk/fetch-http-handler" "3.78.0" - "@aws-sdk/hash-node" "3.78.0" - "@aws-sdk/invalid-dependency" "3.78.0" - "@aws-sdk/middleware-content-length" "3.78.0" - "@aws-sdk/middleware-endpoint-discovery" "3.80.0" - "@aws-sdk/middleware-host-header" "3.78.0" - "@aws-sdk/middleware-logger" "3.78.0" - "@aws-sdk/middleware-retry" "3.80.0" - "@aws-sdk/middleware-serde" "3.78.0" - "@aws-sdk/middleware-signing" "3.78.0" - "@aws-sdk/middleware-stack" "3.78.0" - "@aws-sdk/middleware-user-agent" "3.78.0" - "@aws-sdk/node-config-provider" "3.80.0" - "@aws-sdk/node-http-handler" "3.94.0" - "@aws-sdk/protocol-http" "3.78.0" - "@aws-sdk/smithy-client" "3.99.0" - "@aws-sdk/types" "3.78.0" - "@aws-sdk/url-parser" "3.78.0" - "@aws-sdk/util-base64-browser" "3.58.0" + "@aws-sdk/client-sts" "3.121.0" + "@aws-sdk/config-resolver" "3.110.0" + "@aws-sdk/credential-provider-node" "3.121.0" + "@aws-sdk/fetch-http-handler" "3.110.0" + "@aws-sdk/hash-node" "3.110.0" + "@aws-sdk/invalid-dependency" "3.110.0" + "@aws-sdk/middleware-content-length" "3.110.0" + "@aws-sdk/middleware-endpoint-discovery" "3.110.0" + "@aws-sdk/middleware-host-header" "3.110.0" + "@aws-sdk/middleware-logger" "3.110.0" + "@aws-sdk/middleware-recursion-detection" "3.110.0" + "@aws-sdk/middleware-retry" "3.118.1" + "@aws-sdk/middleware-serde" "3.110.0" + "@aws-sdk/middleware-signing" "3.110.0" + "@aws-sdk/middleware-stack" "3.110.0" + "@aws-sdk/middleware-user-agent" "3.110.0" + "@aws-sdk/node-config-provider" "3.110.0" + "@aws-sdk/node-http-handler" "3.118.1" + "@aws-sdk/protocol-http" "3.110.0" + "@aws-sdk/smithy-client" "3.110.0" + "@aws-sdk/types" "3.110.0" + "@aws-sdk/url-parser" "3.110.0" + "@aws-sdk/util-base64-browser" "3.109.0" "@aws-sdk/util-base64-node" "3.55.0" "@aws-sdk/util-body-length-browser" "3.55.0" "@aws-sdk/util-body-length-node" "3.55.0" - "@aws-sdk/util-defaults-mode-browser" "3.99.0" - "@aws-sdk/util-defaults-mode-node" "3.99.0" - "@aws-sdk/util-user-agent-browser" "3.78.0" - "@aws-sdk/util-user-agent-node" "3.80.0" - "@aws-sdk/util-utf8-browser" "3.55.0" - "@aws-sdk/util-utf8-node" "3.55.0" - "@aws-sdk/util-waiter" "3.78.0" + "@aws-sdk/util-defaults-mode-browser" "3.110.0" + "@aws-sdk/util-defaults-mode-node" "3.110.0" + "@aws-sdk/util-user-agent-browser" "3.110.0" + "@aws-sdk/util-user-agent-node" "3.118.0" + "@aws-sdk/util-utf8-browser" "3.109.0" + "@aws-sdk/util-utf8-node" "3.109.0" + "@aws-sdk/util-waiter" "3.118.1" tslib "^2.3.1" uuid "^8.3.2" -"@aws-sdk/client-identitystore@^3.100.0": - version "3.100.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-identitystore/-/client-identitystore-3.100.0.tgz#870afb8fa1969c7ee12b4cd055c84561fc94bd35" - integrity sha512-Px/ZgFDIOKHD6ouecmfFsxcVrO0EuO6zjHca3PHBksvwRyMRNVZ9Q1mU+gmwsexYmqsiDfW8pAPCU1aHkLHWMw== +"@aws-sdk/client-identitystore@^3.121.0": + version "3.121.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-identitystore/-/client-identitystore-3.121.0.tgz#7b8437683f307afcfaa94258f587829f159d0930" + integrity sha512-eyu4NOVtsYO+4fUVerWvguQJDI6uB6D7+5g+ZW+rs3Rz5V71PsoOwOI0sNBwIBj/vqygn6a6QUku1ZT1CBFxDQ== dependencies: "@aws-crypto/sha256-browser" "2.0.0" "@aws-crypto/sha256-js" "2.0.0" - "@aws-sdk/client-sts" "3.100.0" - "@aws-sdk/config-resolver" "3.80.0" - "@aws-sdk/credential-provider-node" "3.100.0" - "@aws-sdk/fetch-http-handler" "3.78.0" - "@aws-sdk/hash-node" "3.78.0" - "@aws-sdk/invalid-dependency" "3.78.0" - "@aws-sdk/middleware-content-length" "3.78.0" - "@aws-sdk/middleware-host-header" "3.78.0" - "@aws-sdk/middleware-logger" "3.78.0" - "@aws-sdk/middleware-retry" "3.80.0" - "@aws-sdk/middleware-serde" "3.78.0" - "@aws-sdk/middleware-signing" "3.78.0" - "@aws-sdk/middleware-stack" "3.78.0" - "@aws-sdk/middleware-user-agent" "3.78.0" - "@aws-sdk/node-config-provider" "3.80.0" - "@aws-sdk/node-http-handler" "3.94.0" - "@aws-sdk/protocol-http" "3.78.0" - "@aws-sdk/smithy-client" "3.99.0" - "@aws-sdk/types" "3.78.0" - "@aws-sdk/url-parser" "3.78.0" - "@aws-sdk/util-base64-browser" "3.58.0" + "@aws-sdk/client-sts" "3.121.0" + "@aws-sdk/config-resolver" "3.110.0" + "@aws-sdk/credential-provider-node" "3.121.0" + "@aws-sdk/fetch-http-handler" "3.110.0" + "@aws-sdk/hash-node" "3.110.0" + "@aws-sdk/invalid-dependency" "3.110.0" + "@aws-sdk/middleware-content-length" "3.110.0" + "@aws-sdk/middleware-host-header" "3.110.0" + "@aws-sdk/middleware-logger" "3.110.0" + "@aws-sdk/middleware-recursion-detection" "3.110.0" + "@aws-sdk/middleware-retry" "3.118.1" + "@aws-sdk/middleware-serde" "3.110.0" + "@aws-sdk/middleware-signing" "3.110.0" + "@aws-sdk/middleware-stack" "3.110.0" + "@aws-sdk/middleware-user-agent" "3.110.0" + "@aws-sdk/node-config-provider" "3.110.0" + "@aws-sdk/node-http-handler" "3.118.1" + "@aws-sdk/protocol-http" "3.110.0" + "@aws-sdk/smithy-client" "3.110.0" + "@aws-sdk/types" "3.110.0" + "@aws-sdk/url-parser" "3.110.0" + "@aws-sdk/util-base64-browser" "3.109.0" "@aws-sdk/util-base64-node" "3.55.0" "@aws-sdk/util-body-length-browser" "3.55.0" "@aws-sdk/util-body-length-node" "3.55.0" - "@aws-sdk/util-defaults-mode-browser" "3.99.0" - "@aws-sdk/util-defaults-mode-node" "3.99.0" - "@aws-sdk/util-user-agent-browser" "3.78.0" - "@aws-sdk/util-user-agent-node" "3.80.0" - "@aws-sdk/util-utf8-browser" "3.55.0" - "@aws-sdk/util-utf8-node" "3.55.0" + "@aws-sdk/util-defaults-mode-browser" "3.110.0" + "@aws-sdk/util-defaults-mode-node" "3.110.0" + "@aws-sdk/util-user-agent-browser" "3.110.0" + "@aws-sdk/util-user-agent-node" "3.118.0" + "@aws-sdk/util-utf8-browser" "3.109.0" + "@aws-sdk/util-utf8-node" "3.109.0" tslib "^2.3.1" -"@aws-sdk/client-organizations@^3.100.0": - version "3.100.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-organizations/-/client-organizations-3.100.0.tgz#c2b837b3855927cd87238c86085657d13eaab426" - integrity sha512-PUya9XP1P6dC+4Rqmcn4iYb3ypRh6wnFn54k1VRJ5TUshwB1uG4bwLNXSoopz5Iz0Oel0e3ogMJ/5eD+QsTG3A== +"@aws-sdk/client-organizations@^3.121.0": + version "3.121.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-organizations/-/client-organizations-3.121.0.tgz#f830c2d7cbd3039cc52dcd33c83c79cd0cdd32c5" + integrity sha512-gYJKo9lPs9A/uxnSw8WV9sw2svyfeepMjb5mjoyC3+7F6KVhxIrlI0HitoOIqZDOD4G9NKdED6Pbu4st2AYTZw== dependencies: "@aws-crypto/sha256-browser" "2.0.0" "@aws-crypto/sha256-js" "2.0.0" - "@aws-sdk/client-sts" "3.100.0" - "@aws-sdk/config-resolver" "3.80.0" - "@aws-sdk/credential-provider-node" "3.100.0" - "@aws-sdk/fetch-http-handler" "3.78.0" - "@aws-sdk/hash-node" "3.78.0" - "@aws-sdk/invalid-dependency" "3.78.0" - "@aws-sdk/middleware-content-length" "3.78.0" - "@aws-sdk/middleware-host-header" "3.78.0" - "@aws-sdk/middleware-logger" "3.78.0" - "@aws-sdk/middleware-retry" "3.80.0" - "@aws-sdk/middleware-serde" "3.78.0" - "@aws-sdk/middleware-signing" "3.78.0" - "@aws-sdk/middleware-stack" "3.78.0" - "@aws-sdk/middleware-user-agent" "3.78.0" - "@aws-sdk/node-config-provider" "3.80.0" - "@aws-sdk/node-http-handler" "3.94.0" - "@aws-sdk/protocol-http" "3.78.0" - "@aws-sdk/smithy-client" "3.99.0" - "@aws-sdk/types" "3.78.0" - "@aws-sdk/url-parser" "3.78.0" - "@aws-sdk/util-base64-browser" "3.58.0" + "@aws-sdk/client-sts" "3.121.0" + "@aws-sdk/config-resolver" "3.110.0" + "@aws-sdk/credential-provider-node" "3.121.0" + "@aws-sdk/fetch-http-handler" "3.110.0" + "@aws-sdk/hash-node" "3.110.0" + "@aws-sdk/invalid-dependency" "3.110.0" + "@aws-sdk/middleware-content-length" "3.110.0" + "@aws-sdk/middleware-host-header" "3.110.0" + "@aws-sdk/middleware-logger" "3.110.0" + "@aws-sdk/middleware-recursion-detection" "3.110.0" + "@aws-sdk/middleware-retry" "3.118.1" + "@aws-sdk/middleware-serde" "3.110.0" + "@aws-sdk/middleware-signing" "3.110.0" + "@aws-sdk/middleware-stack" "3.110.0" + "@aws-sdk/middleware-user-agent" "3.110.0" + "@aws-sdk/node-config-provider" "3.110.0" + "@aws-sdk/node-http-handler" "3.118.1" + "@aws-sdk/protocol-http" "3.110.0" + "@aws-sdk/smithy-client" "3.110.0" + "@aws-sdk/types" "3.110.0" + "@aws-sdk/url-parser" "3.110.0" + "@aws-sdk/util-base64-browser" "3.109.0" "@aws-sdk/util-base64-node" "3.55.0" "@aws-sdk/util-body-length-browser" "3.55.0" "@aws-sdk/util-body-length-node" "3.55.0" - "@aws-sdk/util-defaults-mode-browser" "3.99.0" - "@aws-sdk/util-defaults-mode-node" "3.99.0" - "@aws-sdk/util-user-agent-browser" "3.78.0" - "@aws-sdk/util-user-agent-node" "3.80.0" - "@aws-sdk/util-utf8-browser" "3.55.0" - "@aws-sdk/util-utf8-node" "3.55.0" + "@aws-sdk/util-defaults-mode-browser" "3.110.0" + "@aws-sdk/util-defaults-mode-node" "3.110.0" + "@aws-sdk/util-user-agent-browser" "3.110.0" + "@aws-sdk/util-user-agent-node" "3.118.0" + "@aws-sdk/util-utf8-browser" "3.109.0" + "@aws-sdk/util-utf8-node" "3.109.0" tslib "^2.3.1" -"@aws-sdk/client-s3@^3.100.0": - version "3.100.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-s3/-/client-s3-3.100.0.tgz#6cae596da29889848b009e34a4126842038906b0" - integrity sha512-UmgFdJabWtiUS4dWsC3kZ+ZMvH5QUUbDnLS8pT12duwLGt+xlWPn3PUkV8kL6qjG6XePLUgCqFTLjDD4tsTZNg== +"@aws-sdk/client-s3@^3.121.0": + version "3.121.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-s3/-/client-s3-3.121.0.tgz#12394dda433c878f10b0f3339f9637f12ebcb5b1" + integrity sha512-iJDqFCRNZM6+iF4E3zSCXKLDrDFxon8gzM0sK8TCkSSwa8Fhk/M/5OKslP9eKfJ1mzmh27IgFDoNnD5P59LbSQ== dependencies: "@aws-crypto/sha1-browser" "2.0.0" "@aws-crypto/sha256-browser" "2.0.0" "@aws-crypto/sha256-js" "2.0.0" - "@aws-sdk/client-sts" "3.100.0" - "@aws-sdk/config-resolver" "3.80.0" - "@aws-sdk/credential-provider-node" "3.100.0" - "@aws-sdk/eventstream-serde-browser" "3.78.0" - "@aws-sdk/eventstream-serde-config-resolver" "3.78.0" - "@aws-sdk/eventstream-serde-node" "3.78.0" - "@aws-sdk/fetch-http-handler" "3.78.0" - "@aws-sdk/hash-blob-browser" "3.78.0" - "@aws-sdk/hash-node" "3.78.0" - "@aws-sdk/hash-stream-node" "3.78.0" - "@aws-sdk/invalid-dependency" "3.78.0" - "@aws-sdk/md5-js" "3.78.0" - "@aws-sdk/middleware-bucket-endpoint" "3.80.0" - "@aws-sdk/middleware-content-length" "3.78.0" - "@aws-sdk/middleware-expect-continue" "3.78.0" - "@aws-sdk/middleware-flexible-checksums" "3.78.0" - "@aws-sdk/middleware-host-header" "3.78.0" - "@aws-sdk/middleware-location-constraint" "3.78.0" - "@aws-sdk/middleware-logger" "3.78.0" - "@aws-sdk/middleware-retry" "3.80.0" - "@aws-sdk/middleware-sdk-s3" "3.86.0" - "@aws-sdk/middleware-serde" "3.78.0" - "@aws-sdk/middleware-signing" "3.78.0" - "@aws-sdk/middleware-ssec" "3.78.0" - "@aws-sdk/middleware-stack" "3.78.0" - "@aws-sdk/middleware-user-agent" "3.78.0" - "@aws-sdk/node-config-provider" "3.80.0" - "@aws-sdk/node-http-handler" "3.94.0" - "@aws-sdk/protocol-http" "3.78.0" - "@aws-sdk/signature-v4-multi-region" "3.88.0" - "@aws-sdk/smithy-client" "3.99.0" - "@aws-sdk/types" "3.78.0" - "@aws-sdk/url-parser" "3.78.0" - "@aws-sdk/util-base64-browser" "3.58.0" + "@aws-sdk/client-sts" "3.121.0" + "@aws-sdk/config-resolver" "3.110.0" + "@aws-sdk/credential-provider-node" "3.121.0" + "@aws-sdk/eventstream-serde-browser" "3.120.0" + "@aws-sdk/eventstream-serde-config-resolver" "3.110.0" + "@aws-sdk/eventstream-serde-node" "3.120.0" + "@aws-sdk/fetch-http-handler" "3.110.0" + "@aws-sdk/hash-blob-browser" "3.110.0" + "@aws-sdk/hash-node" "3.110.0" + "@aws-sdk/hash-stream-node" "3.110.0" + "@aws-sdk/invalid-dependency" "3.110.0" + "@aws-sdk/md5-js" "3.110.0" + "@aws-sdk/middleware-bucket-endpoint" "3.110.0" + "@aws-sdk/middleware-content-length" "3.110.0" + "@aws-sdk/middleware-expect-continue" "3.113.0" + "@aws-sdk/middleware-flexible-checksums" "3.110.0" + "@aws-sdk/middleware-host-header" "3.110.0" + "@aws-sdk/middleware-location-constraint" "3.110.0" + "@aws-sdk/middleware-logger" "3.110.0" + "@aws-sdk/middleware-recursion-detection" "3.110.0" + "@aws-sdk/middleware-retry" "3.118.1" + "@aws-sdk/middleware-sdk-s3" "3.110.0" + "@aws-sdk/middleware-serde" "3.110.0" + "@aws-sdk/middleware-signing" "3.110.0" + "@aws-sdk/middleware-ssec" "3.110.0" + "@aws-sdk/middleware-stack" "3.110.0" + "@aws-sdk/middleware-user-agent" "3.110.0" + "@aws-sdk/node-config-provider" "3.110.0" + "@aws-sdk/node-http-handler" "3.118.1" + "@aws-sdk/protocol-http" "3.110.0" + "@aws-sdk/signature-v4-multi-region" "3.118.0" + "@aws-sdk/smithy-client" "3.110.0" + "@aws-sdk/types" "3.110.0" + "@aws-sdk/url-parser" "3.110.0" + "@aws-sdk/util-base64-browser" "3.109.0" "@aws-sdk/util-base64-node" "3.55.0" "@aws-sdk/util-body-length-browser" "3.55.0" "@aws-sdk/util-body-length-node" "3.55.0" - "@aws-sdk/util-defaults-mode-browser" "3.99.0" - "@aws-sdk/util-defaults-mode-node" "3.99.0" - "@aws-sdk/util-stream-browser" "3.78.0" - "@aws-sdk/util-stream-node" "3.78.0" - "@aws-sdk/util-user-agent-browser" "3.78.0" - "@aws-sdk/util-user-agent-node" "3.80.0" - "@aws-sdk/util-utf8-browser" "3.55.0" - "@aws-sdk/util-utf8-node" "3.55.0" - "@aws-sdk/util-waiter" "3.78.0" - "@aws-sdk/xml-builder" "3.55.0" + "@aws-sdk/util-defaults-mode-browser" "3.110.0" + "@aws-sdk/util-defaults-mode-node" "3.110.0" + "@aws-sdk/util-stream-browser" "3.110.0" + "@aws-sdk/util-stream-node" "3.110.0" + "@aws-sdk/util-user-agent-browser" "3.110.0" + "@aws-sdk/util-user-agent-node" "3.118.0" + "@aws-sdk/util-utf8-browser" "3.109.0" + "@aws-sdk/util-utf8-node" "3.109.0" + "@aws-sdk/util-waiter" "3.118.1" + "@aws-sdk/xml-builder" "3.109.0" entities "2.2.0" fast-xml-parser "3.19.0" tslib "^2.3.1" -"@aws-sdk/client-sfn@^3.100.0": - version "3.100.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-sfn/-/client-sfn-3.100.0.tgz#b92fa24663b7b14db2997cf8038a99bc8b78335b" - integrity sha512-beR5GBHHda1KhFGxQX5oeaM4g1T1S3Txkg35XYAO3HB4lP4SdfKkEjCaSmzFjQMwdtOysTNFOF7ai1fPOo5Jng== +"@aws-sdk/client-sfn@^3.121.0": + version "3.121.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-sfn/-/client-sfn-3.121.0.tgz#daee64225797e5aa4d26d0329fa42de3cec81879" + integrity sha512-Zm9pyQTvItw6iQg3zls+wD7b7SiWaSDRQqix+gbj8zIcNwcInlhmx9oy7mv9q3yQWcEQFgjgeZP8aIBtcH3z4g== dependencies: "@aws-crypto/sha256-browser" "2.0.0" "@aws-crypto/sha256-js" "2.0.0" - "@aws-sdk/client-sts" "3.100.0" - "@aws-sdk/config-resolver" "3.80.0" - "@aws-sdk/credential-provider-node" "3.100.0" - "@aws-sdk/fetch-http-handler" "3.78.0" - "@aws-sdk/hash-node" "3.78.0" - "@aws-sdk/invalid-dependency" "3.78.0" - "@aws-sdk/middleware-content-length" "3.78.0" - "@aws-sdk/middleware-host-header" "3.78.0" - "@aws-sdk/middleware-logger" "3.78.0" - "@aws-sdk/middleware-retry" "3.80.0" - "@aws-sdk/middleware-serde" "3.78.0" - "@aws-sdk/middleware-signing" "3.78.0" - "@aws-sdk/middleware-stack" "3.78.0" - "@aws-sdk/middleware-user-agent" "3.78.0" - "@aws-sdk/node-config-provider" "3.80.0" - "@aws-sdk/node-http-handler" "3.94.0" - "@aws-sdk/protocol-http" "3.78.0" - "@aws-sdk/smithy-client" "3.99.0" - "@aws-sdk/types" "3.78.0" - "@aws-sdk/url-parser" "3.78.0" - "@aws-sdk/util-base64-browser" "3.58.0" + "@aws-sdk/client-sts" "3.121.0" + "@aws-sdk/config-resolver" "3.110.0" + "@aws-sdk/credential-provider-node" "3.121.0" + "@aws-sdk/fetch-http-handler" "3.110.0" + "@aws-sdk/hash-node" "3.110.0" + "@aws-sdk/invalid-dependency" "3.110.0" + "@aws-sdk/middleware-content-length" "3.110.0" + "@aws-sdk/middleware-host-header" "3.110.0" + "@aws-sdk/middleware-logger" "3.110.0" + "@aws-sdk/middleware-recursion-detection" "3.110.0" + "@aws-sdk/middleware-retry" "3.118.1" + "@aws-sdk/middleware-serde" "3.110.0" + "@aws-sdk/middleware-signing" "3.110.0" + "@aws-sdk/middleware-stack" "3.110.0" + "@aws-sdk/middleware-user-agent" "3.110.0" + "@aws-sdk/node-config-provider" "3.110.0" + "@aws-sdk/node-http-handler" "3.118.1" + "@aws-sdk/protocol-http" "3.110.0" + "@aws-sdk/smithy-client" "3.110.0" + "@aws-sdk/types" "3.110.0" + "@aws-sdk/url-parser" "3.110.0" + "@aws-sdk/util-base64-browser" "3.109.0" "@aws-sdk/util-base64-node" "3.55.0" "@aws-sdk/util-body-length-browser" "3.55.0" "@aws-sdk/util-body-length-node" "3.55.0" - "@aws-sdk/util-defaults-mode-browser" "3.99.0" - "@aws-sdk/util-defaults-mode-node" "3.99.0" - "@aws-sdk/util-user-agent-browser" "3.78.0" - "@aws-sdk/util-user-agent-node" "3.80.0" - "@aws-sdk/util-utf8-browser" "3.55.0" - "@aws-sdk/util-utf8-node" "3.55.0" + "@aws-sdk/util-defaults-mode-browser" "3.110.0" + "@aws-sdk/util-defaults-mode-node" "3.110.0" + "@aws-sdk/util-user-agent-browser" "3.110.0" + "@aws-sdk/util-user-agent-node" "3.118.0" + "@aws-sdk/util-utf8-browser" "3.109.0" + "@aws-sdk/util-utf8-node" "3.109.0" tslib "^2.3.1" -"@aws-sdk/client-sns@^3.100.0": - version "3.100.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-sns/-/client-sns-3.100.0.tgz#d1dde8610dffad25d313460cd53198223cac58c3" - integrity sha512-QqfAXjic8wonh5a6l53+g281nygpxcHFL0Yf0hV7j6+erjYjSMnnEvKG8toX/pMxhrn6KQz8qH5yWecYJwms6g== +"@aws-sdk/client-sns@^3.121.0": + version "3.121.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-sns/-/client-sns-3.121.0.tgz#02fefaee2a5266e7d19cb14c1e77492ac55aef7b" + integrity sha512-Igxk0E1x1jbETS9nVSglnd3eu2xhAN1NIb1xe0h243H04Cqxu2Z31t2S/wHpAWLmQgyr+iJtYHWTqNqDQzQ4CQ== dependencies: "@aws-crypto/sha256-browser" "2.0.0" "@aws-crypto/sha256-js" "2.0.0" - "@aws-sdk/client-sts" "3.100.0" - "@aws-sdk/config-resolver" "3.80.0" - "@aws-sdk/credential-provider-node" "3.100.0" - "@aws-sdk/fetch-http-handler" "3.78.0" - "@aws-sdk/hash-node" "3.78.0" - "@aws-sdk/invalid-dependency" "3.78.0" - "@aws-sdk/middleware-content-length" "3.78.0" - "@aws-sdk/middleware-host-header" "3.78.0" - "@aws-sdk/middleware-logger" "3.78.0" - "@aws-sdk/middleware-retry" "3.80.0" - "@aws-sdk/middleware-serde" "3.78.0" - "@aws-sdk/middleware-signing" "3.78.0" - "@aws-sdk/middleware-stack" "3.78.0" - "@aws-sdk/middleware-user-agent" "3.78.0" - "@aws-sdk/node-config-provider" "3.80.0" - "@aws-sdk/node-http-handler" "3.94.0" - "@aws-sdk/protocol-http" "3.78.0" - "@aws-sdk/smithy-client" "3.99.0" - "@aws-sdk/types" "3.78.0" - "@aws-sdk/url-parser" "3.78.0" - "@aws-sdk/util-base64-browser" "3.58.0" + "@aws-sdk/client-sts" "3.121.0" + "@aws-sdk/config-resolver" "3.110.0" + "@aws-sdk/credential-provider-node" "3.121.0" + "@aws-sdk/fetch-http-handler" "3.110.0" + "@aws-sdk/hash-node" "3.110.0" + "@aws-sdk/invalid-dependency" "3.110.0" + "@aws-sdk/middleware-content-length" "3.110.0" + "@aws-sdk/middleware-host-header" "3.110.0" + "@aws-sdk/middleware-logger" "3.110.0" + "@aws-sdk/middleware-recursion-detection" "3.110.0" + "@aws-sdk/middleware-retry" "3.118.1" + "@aws-sdk/middleware-serde" "3.110.0" + "@aws-sdk/middleware-signing" "3.110.0" + "@aws-sdk/middleware-stack" "3.110.0" + "@aws-sdk/middleware-user-agent" "3.110.0" + "@aws-sdk/node-config-provider" "3.110.0" + "@aws-sdk/node-http-handler" "3.118.1" + "@aws-sdk/protocol-http" "3.110.0" + "@aws-sdk/smithy-client" "3.110.0" + "@aws-sdk/types" "3.110.0" + "@aws-sdk/url-parser" "3.110.0" + "@aws-sdk/util-base64-browser" "3.109.0" "@aws-sdk/util-base64-node" "3.55.0" "@aws-sdk/util-body-length-browser" "3.55.0" "@aws-sdk/util-body-length-node" "3.55.0" - "@aws-sdk/util-defaults-mode-browser" "3.99.0" - "@aws-sdk/util-defaults-mode-node" "3.99.0" - "@aws-sdk/util-user-agent-browser" "3.78.0" - "@aws-sdk/util-user-agent-node" "3.80.0" - "@aws-sdk/util-utf8-browser" "3.55.0" - "@aws-sdk/util-utf8-node" "3.55.0" + "@aws-sdk/util-defaults-mode-browser" "3.110.0" + "@aws-sdk/util-defaults-mode-node" "3.110.0" + "@aws-sdk/util-user-agent-browser" "3.110.0" + "@aws-sdk/util-user-agent-node" "3.118.0" + "@aws-sdk/util-utf8-browser" "3.109.0" + "@aws-sdk/util-utf8-node" "3.109.0" entities "2.2.0" fast-xml-parser "3.19.0" tslib "^2.3.1" -"@aws-sdk/client-sqs@^3.100.0": - version "3.100.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-sqs/-/client-sqs-3.100.0.tgz#ed10ceb7e1d6dc4394eb1490df4a5e25a0555a76" - integrity sha512-U0Fpmh20stzx72jxKc5c7trT59dvsYVeTI4LJ+1Ez0t+JkEwuuygqKwN4O1KTP0tCjovVFHWVMTjHw31JYfemQ== +"@aws-sdk/client-sqs@^3.121.0": + version "3.121.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-sqs/-/client-sqs-3.121.0.tgz#235d2b1cc227c7a8d4f709c67c77bb447d8cfad3" + integrity sha512-O9wYxB5/BxDEHxIUgy90onGG7EKQoNvwtw47yasQN6rfiE87xHItDmOunDT4xnK7nGwTILfmg28MdUDeBdDchQ== dependencies: "@aws-crypto/sha256-browser" "2.0.0" "@aws-crypto/sha256-js" "2.0.0" - "@aws-sdk/client-sts" "3.100.0" - "@aws-sdk/config-resolver" "3.80.0" - "@aws-sdk/credential-provider-node" "3.100.0" - "@aws-sdk/fetch-http-handler" "3.78.0" - "@aws-sdk/hash-node" "3.78.0" - "@aws-sdk/invalid-dependency" "3.78.0" - "@aws-sdk/md5-js" "3.78.0" - "@aws-sdk/middleware-content-length" "3.78.0" - "@aws-sdk/middleware-host-header" "3.78.0" - "@aws-sdk/middleware-logger" "3.78.0" - "@aws-sdk/middleware-retry" "3.80.0" - "@aws-sdk/middleware-sdk-sqs" "3.78.0" - "@aws-sdk/middleware-serde" "3.78.0" - "@aws-sdk/middleware-signing" "3.78.0" - "@aws-sdk/middleware-stack" "3.78.0" - "@aws-sdk/middleware-user-agent" "3.78.0" - "@aws-sdk/node-config-provider" "3.80.0" - "@aws-sdk/node-http-handler" "3.94.0" - "@aws-sdk/protocol-http" "3.78.0" - "@aws-sdk/smithy-client" "3.99.0" - "@aws-sdk/types" "3.78.0" - "@aws-sdk/url-parser" "3.78.0" - "@aws-sdk/util-base64-browser" "3.58.0" + "@aws-sdk/client-sts" "3.121.0" + "@aws-sdk/config-resolver" "3.110.0" + "@aws-sdk/credential-provider-node" "3.121.0" + "@aws-sdk/fetch-http-handler" "3.110.0" + "@aws-sdk/hash-node" "3.110.0" + "@aws-sdk/invalid-dependency" "3.110.0" + "@aws-sdk/md5-js" "3.110.0" + "@aws-sdk/middleware-content-length" "3.110.0" + "@aws-sdk/middleware-host-header" "3.110.0" + "@aws-sdk/middleware-logger" "3.110.0" + "@aws-sdk/middleware-recursion-detection" "3.110.0" + "@aws-sdk/middleware-retry" "3.118.1" + "@aws-sdk/middleware-sdk-sqs" "3.110.0" + "@aws-sdk/middleware-serde" "3.110.0" + "@aws-sdk/middleware-signing" "3.110.0" + "@aws-sdk/middleware-stack" "3.110.0" + "@aws-sdk/middleware-user-agent" "3.110.0" + "@aws-sdk/node-config-provider" "3.110.0" + "@aws-sdk/node-http-handler" "3.118.1" + "@aws-sdk/protocol-http" "3.110.0" + "@aws-sdk/smithy-client" "3.110.0" + "@aws-sdk/types" "3.110.0" + "@aws-sdk/url-parser" "3.110.0" + "@aws-sdk/util-base64-browser" "3.109.0" "@aws-sdk/util-base64-node" "3.55.0" "@aws-sdk/util-body-length-browser" "3.55.0" "@aws-sdk/util-body-length-node" "3.55.0" - "@aws-sdk/util-defaults-mode-browser" "3.99.0" - "@aws-sdk/util-defaults-mode-node" "3.99.0" - "@aws-sdk/util-user-agent-browser" "3.78.0" - "@aws-sdk/util-user-agent-node" "3.80.0" - "@aws-sdk/util-utf8-browser" "3.55.0" - "@aws-sdk/util-utf8-node" "3.55.0" + "@aws-sdk/util-defaults-mode-browser" "3.110.0" + "@aws-sdk/util-defaults-mode-node" "3.110.0" + "@aws-sdk/util-user-agent-browser" "3.110.0" + "@aws-sdk/util-user-agent-node" "3.118.0" + "@aws-sdk/util-utf8-browser" "3.109.0" + "@aws-sdk/util-utf8-node" "3.109.0" entities "2.2.0" fast-xml-parser "3.19.0" tslib "^2.3.1" -"@aws-sdk/client-ssm@^3.100.0": - version "3.100.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-ssm/-/client-ssm-3.100.0.tgz#6a993908bb2ac3f207862acd6ceb2395e2357938" - integrity sha512-dH/XjcUOGQ+lgYs9G3ezv+E8wknx8grKqCGTkC7VjJg/TqRM3O2/J+DZa9TzXWSesoPUqMNGRtMj/G0TjW27wA== +"@aws-sdk/client-ssm@^3.121.0": + version "3.121.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-ssm/-/client-ssm-3.121.0.tgz#4897ba35e1f166a35e43af47b870306afe7c4896" + integrity sha512-c26t40Km9GlJXzjxLwNrMfWnBM14bKBkoi71WNThQbxXiXphb4GOUGoEgyzRirX+XvMchqD8wS8HPvDBjuouhA== dependencies: "@aws-crypto/sha256-browser" "2.0.0" "@aws-crypto/sha256-js" "2.0.0" - "@aws-sdk/client-sts" "3.100.0" - "@aws-sdk/config-resolver" "3.80.0" - "@aws-sdk/credential-provider-node" "3.100.0" - "@aws-sdk/fetch-http-handler" "3.78.0" - "@aws-sdk/hash-node" "3.78.0" - "@aws-sdk/invalid-dependency" "3.78.0" - "@aws-sdk/middleware-content-length" "3.78.0" - "@aws-sdk/middleware-host-header" "3.78.0" - "@aws-sdk/middleware-logger" "3.78.0" - "@aws-sdk/middleware-retry" "3.80.0" - "@aws-sdk/middleware-serde" "3.78.0" - "@aws-sdk/middleware-signing" "3.78.0" - "@aws-sdk/middleware-stack" "3.78.0" - "@aws-sdk/middleware-user-agent" "3.78.0" - "@aws-sdk/node-config-provider" "3.80.0" - "@aws-sdk/node-http-handler" "3.94.0" - "@aws-sdk/protocol-http" "3.78.0" - "@aws-sdk/smithy-client" "3.99.0" - "@aws-sdk/types" "3.78.0" - "@aws-sdk/url-parser" "3.78.0" - "@aws-sdk/util-base64-browser" "3.58.0" + "@aws-sdk/client-sts" "3.121.0" + "@aws-sdk/config-resolver" "3.110.0" + "@aws-sdk/credential-provider-node" "3.121.0" + "@aws-sdk/fetch-http-handler" "3.110.0" + "@aws-sdk/hash-node" "3.110.0" + "@aws-sdk/invalid-dependency" "3.110.0" + "@aws-sdk/middleware-content-length" "3.110.0" + "@aws-sdk/middleware-host-header" "3.110.0" + "@aws-sdk/middleware-logger" "3.110.0" + "@aws-sdk/middleware-recursion-detection" "3.110.0" + "@aws-sdk/middleware-retry" "3.118.1" + "@aws-sdk/middleware-serde" "3.110.0" + "@aws-sdk/middleware-signing" "3.110.0" + "@aws-sdk/middleware-stack" "3.110.0" + "@aws-sdk/middleware-user-agent" "3.110.0" + "@aws-sdk/node-config-provider" "3.110.0" + "@aws-sdk/node-http-handler" "3.118.1" + "@aws-sdk/protocol-http" "3.110.0" + "@aws-sdk/smithy-client" "3.110.0" + "@aws-sdk/types" "3.110.0" + "@aws-sdk/url-parser" "3.110.0" + "@aws-sdk/util-base64-browser" "3.109.0" "@aws-sdk/util-base64-node" "3.55.0" "@aws-sdk/util-body-length-browser" "3.55.0" "@aws-sdk/util-body-length-node" "3.55.0" - "@aws-sdk/util-defaults-mode-browser" "3.99.0" - "@aws-sdk/util-defaults-mode-node" "3.99.0" - "@aws-sdk/util-user-agent-browser" "3.78.0" - "@aws-sdk/util-user-agent-node" "3.80.0" - "@aws-sdk/util-utf8-browser" "3.55.0" - "@aws-sdk/util-utf8-node" "3.55.0" - "@aws-sdk/util-waiter" "3.78.0" + "@aws-sdk/util-defaults-mode-browser" "3.110.0" + "@aws-sdk/util-defaults-mode-node" "3.110.0" + "@aws-sdk/util-user-agent-browser" "3.110.0" + "@aws-sdk/util-user-agent-node" "3.118.0" + "@aws-sdk/util-utf8-browser" "3.109.0" + "@aws-sdk/util-utf8-node" "3.109.0" + "@aws-sdk/util-waiter" "3.118.1" tslib "^2.3.1" uuid "^8.3.2" -"@aws-sdk/client-sso-admin@^3.100.0": - version "3.100.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-sso-admin/-/client-sso-admin-3.100.0.tgz#f8db57315caed7077a5bd2077083a8345ce1edc4" - integrity sha512-9BWnuNHpBYvw43gxWTp4r+T1TcOOYF/8Sr1eZsbVI38wFMbbwGcj0QLaAXzExQaTUMBDNy0JxvQ1Xxi1EBpDqA== +"@aws-sdk/client-sso-admin@^3.121.0": + version "3.121.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-sso-admin/-/client-sso-admin-3.121.0.tgz#81c58bee8a349faa46dd8cf877e3986aee3a642f" + integrity sha512-Kb5N+lsviuR18lNlbO9AUkfJNZcp4homopwDfYG1IFr/zXb1qG3OKL3csVPbOQR6jXnrc4lAGk3UBxBX9D0edw== dependencies: "@aws-crypto/sha256-browser" "2.0.0" "@aws-crypto/sha256-js" "2.0.0" - "@aws-sdk/client-sts" "3.100.0" - "@aws-sdk/config-resolver" "3.80.0" - "@aws-sdk/credential-provider-node" "3.100.0" - "@aws-sdk/fetch-http-handler" "3.78.0" - "@aws-sdk/hash-node" "3.78.0" - "@aws-sdk/invalid-dependency" "3.78.0" - "@aws-sdk/middleware-content-length" "3.78.0" - "@aws-sdk/middleware-host-header" "3.78.0" - "@aws-sdk/middleware-logger" "3.78.0" - "@aws-sdk/middleware-retry" "3.80.0" - "@aws-sdk/middleware-serde" "3.78.0" - "@aws-sdk/middleware-signing" "3.78.0" - "@aws-sdk/middleware-stack" "3.78.0" - "@aws-sdk/middleware-user-agent" "3.78.0" - "@aws-sdk/node-config-provider" "3.80.0" - "@aws-sdk/node-http-handler" "3.94.0" - "@aws-sdk/protocol-http" "3.78.0" - "@aws-sdk/smithy-client" "3.99.0" - "@aws-sdk/types" "3.78.0" - "@aws-sdk/url-parser" "3.78.0" - "@aws-sdk/util-base64-browser" "3.58.0" + "@aws-sdk/client-sts" "3.121.0" + "@aws-sdk/config-resolver" "3.110.0" + "@aws-sdk/credential-provider-node" "3.121.0" + "@aws-sdk/fetch-http-handler" "3.110.0" + "@aws-sdk/hash-node" "3.110.0" + "@aws-sdk/invalid-dependency" "3.110.0" + "@aws-sdk/middleware-content-length" "3.110.0" + "@aws-sdk/middleware-host-header" "3.110.0" + "@aws-sdk/middleware-logger" "3.110.0" + "@aws-sdk/middleware-recursion-detection" "3.110.0" + "@aws-sdk/middleware-retry" "3.118.1" + "@aws-sdk/middleware-serde" "3.110.0" + "@aws-sdk/middleware-signing" "3.110.0" + "@aws-sdk/middleware-stack" "3.110.0" + "@aws-sdk/middleware-user-agent" "3.110.0" + "@aws-sdk/node-config-provider" "3.110.0" + "@aws-sdk/node-http-handler" "3.118.1" + "@aws-sdk/protocol-http" "3.110.0" + "@aws-sdk/smithy-client" "3.110.0" + "@aws-sdk/types" "3.110.0" + "@aws-sdk/url-parser" "3.110.0" + "@aws-sdk/util-base64-browser" "3.109.0" "@aws-sdk/util-base64-node" "3.55.0" "@aws-sdk/util-body-length-browser" "3.55.0" "@aws-sdk/util-body-length-node" "3.55.0" - "@aws-sdk/util-defaults-mode-browser" "3.99.0" - "@aws-sdk/util-defaults-mode-node" "3.99.0" - "@aws-sdk/util-user-agent-browser" "3.78.0" - "@aws-sdk/util-user-agent-node" "3.80.0" - "@aws-sdk/util-utf8-browser" "3.55.0" - "@aws-sdk/util-utf8-node" "3.55.0" + "@aws-sdk/util-defaults-mode-browser" "3.110.0" + "@aws-sdk/util-defaults-mode-node" "3.110.0" + "@aws-sdk/util-user-agent-browser" "3.110.0" + "@aws-sdk/util-user-agent-node" "3.118.0" + "@aws-sdk/util-utf8-browser" "3.109.0" + "@aws-sdk/util-utf8-node" "3.109.0" tslib "^2.3.1" -"@aws-sdk/client-sso@3.100.0": - version "3.100.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-sso/-/client-sso-3.100.0.tgz#50fd953ff77f5f9cc1b67f2b6144016ef7e74112" - integrity sha512-nmBRUO5QfQ2IO8fHb37p8HT3n1ZooPb3sfTQejrpFH9Eq82VEOatIGt6yH3yTQ8+mhbabEhV5aY2wt/0D7wGVA== +"@aws-sdk/client-sso@3.121.0": + version "3.121.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-sso/-/client-sso-3.121.0.tgz#a0d26c03f0a58ffbce85bcc4cd0384f6c090d900" + integrity sha512-uYkeUdNnEla57g4QZT0Cu5ll+m0fUQJPkoTXQI5QKeLH2usVpmrCRbtTWEVTh94Gf2x/HK8Ifu7eO/0PquwwIQ== dependencies: "@aws-crypto/sha256-browser" "2.0.0" "@aws-crypto/sha256-js" "2.0.0" - "@aws-sdk/config-resolver" "3.80.0" - "@aws-sdk/fetch-http-handler" "3.78.0" - "@aws-sdk/hash-node" "3.78.0" - "@aws-sdk/invalid-dependency" "3.78.0" - "@aws-sdk/middleware-content-length" "3.78.0" - "@aws-sdk/middleware-host-header" "3.78.0" - "@aws-sdk/middleware-logger" "3.78.0" - "@aws-sdk/middleware-retry" "3.80.0" - "@aws-sdk/middleware-serde" "3.78.0" - "@aws-sdk/middleware-stack" "3.78.0" - "@aws-sdk/middleware-user-agent" "3.78.0" - "@aws-sdk/node-config-provider" "3.80.0" - "@aws-sdk/node-http-handler" "3.94.0" - "@aws-sdk/protocol-http" "3.78.0" - "@aws-sdk/smithy-client" "3.99.0" - "@aws-sdk/types" "3.78.0" - "@aws-sdk/url-parser" "3.78.0" - "@aws-sdk/util-base64-browser" "3.58.0" + "@aws-sdk/config-resolver" "3.110.0" + "@aws-sdk/fetch-http-handler" "3.110.0" + "@aws-sdk/hash-node" "3.110.0" + "@aws-sdk/invalid-dependency" "3.110.0" + "@aws-sdk/middleware-content-length" "3.110.0" + "@aws-sdk/middleware-host-header" "3.110.0" + "@aws-sdk/middleware-logger" "3.110.0" + "@aws-sdk/middleware-recursion-detection" "3.110.0" + "@aws-sdk/middleware-retry" "3.118.1" + "@aws-sdk/middleware-serde" "3.110.0" + "@aws-sdk/middleware-stack" "3.110.0" + "@aws-sdk/middleware-user-agent" "3.110.0" + "@aws-sdk/node-config-provider" "3.110.0" + "@aws-sdk/node-http-handler" "3.118.1" + "@aws-sdk/protocol-http" "3.110.0" + "@aws-sdk/smithy-client" "3.110.0" + "@aws-sdk/types" "3.110.0" + "@aws-sdk/url-parser" "3.110.0" + "@aws-sdk/util-base64-browser" "3.109.0" "@aws-sdk/util-base64-node" "3.55.0" "@aws-sdk/util-body-length-browser" "3.55.0" "@aws-sdk/util-body-length-node" "3.55.0" - "@aws-sdk/util-defaults-mode-browser" "3.99.0" - "@aws-sdk/util-defaults-mode-node" "3.99.0" - "@aws-sdk/util-user-agent-browser" "3.78.0" - "@aws-sdk/util-user-agent-node" "3.80.0" - "@aws-sdk/util-utf8-browser" "3.55.0" - "@aws-sdk/util-utf8-node" "3.55.0" + "@aws-sdk/util-defaults-mode-browser" "3.110.0" + "@aws-sdk/util-defaults-mode-node" "3.110.0" + "@aws-sdk/util-user-agent-browser" "3.110.0" + "@aws-sdk/util-user-agent-node" "3.118.0" + "@aws-sdk/util-utf8-browser" "3.109.0" + "@aws-sdk/util-utf8-node" "3.109.0" tslib "^2.3.1" -"@aws-sdk/client-sts@3.100.0": - version "3.100.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-sts/-/client-sts-3.100.0.tgz#147b65a91ebfa564ac58aef51e14b0ece8adb26c" - integrity sha512-WHy0e6COf6/LfMsYqG9H4SGaQRDjuckMtwOLtu6cYr4cro3bOU5pNuyEjAdUHCpuhZgiE6gkZozhTlxMJqIuRQ== +"@aws-sdk/client-sts@3.121.0": + version "3.121.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-sts/-/client-sts-3.121.0.tgz#258077598138a102b508519da6551949ea08c37b" + integrity sha512-ZqEcxfeYVeSo/VyXSI4XW4MsWYoRmEdxRLWwI7kgFQxgqwVtfhPmvcaw6CA1atMcSR6waiRSpe9pgpj6gKJvyw== dependencies: "@aws-crypto/sha256-browser" "2.0.0" "@aws-crypto/sha256-js" "2.0.0" - "@aws-sdk/config-resolver" "3.80.0" - "@aws-sdk/credential-provider-node" "3.100.0" - "@aws-sdk/fetch-http-handler" "3.78.0" - "@aws-sdk/hash-node" "3.78.0" - "@aws-sdk/invalid-dependency" "3.78.0" - "@aws-sdk/middleware-content-length" "3.78.0" - "@aws-sdk/middleware-host-header" "3.78.0" - "@aws-sdk/middleware-logger" "3.78.0" - "@aws-sdk/middleware-retry" "3.80.0" - "@aws-sdk/middleware-sdk-sts" "3.78.0" - "@aws-sdk/middleware-serde" "3.78.0" - "@aws-sdk/middleware-signing" "3.78.0" - "@aws-sdk/middleware-stack" "3.78.0" - "@aws-sdk/middleware-user-agent" "3.78.0" - "@aws-sdk/node-config-provider" "3.80.0" - "@aws-sdk/node-http-handler" "3.94.0" - "@aws-sdk/protocol-http" "3.78.0" - "@aws-sdk/smithy-client" "3.99.0" - "@aws-sdk/types" "3.78.0" - "@aws-sdk/url-parser" "3.78.0" - "@aws-sdk/util-base64-browser" "3.58.0" + "@aws-sdk/config-resolver" "3.110.0" + "@aws-sdk/credential-provider-node" "3.121.0" + "@aws-sdk/fetch-http-handler" "3.110.0" + "@aws-sdk/hash-node" "3.110.0" + "@aws-sdk/invalid-dependency" "3.110.0" + "@aws-sdk/middleware-content-length" "3.110.0" + "@aws-sdk/middleware-host-header" "3.110.0" + "@aws-sdk/middleware-logger" "3.110.0" + "@aws-sdk/middleware-recursion-detection" "3.110.0" + "@aws-sdk/middleware-retry" "3.118.1" + "@aws-sdk/middleware-sdk-sts" "3.110.0" + "@aws-sdk/middleware-serde" "3.110.0" + "@aws-sdk/middleware-signing" "3.110.0" + "@aws-sdk/middleware-stack" "3.110.0" + "@aws-sdk/middleware-user-agent" "3.110.0" + "@aws-sdk/node-config-provider" "3.110.0" + "@aws-sdk/node-http-handler" "3.118.1" + "@aws-sdk/protocol-http" "3.110.0" + "@aws-sdk/smithy-client" "3.110.0" + "@aws-sdk/types" "3.110.0" + "@aws-sdk/url-parser" "3.110.0" + "@aws-sdk/util-base64-browser" "3.109.0" "@aws-sdk/util-base64-node" "3.55.0" "@aws-sdk/util-body-length-browser" "3.55.0" "@aws-sdk/util-body-length-node" "3.55.0" - "@aws-sdk/util-defaults-mode-browser" "3.99.0" - "@aws-sdk/util-defaults-mode-node" "3.99.0" - "@aws-sdk/util-user-agent-browser" "3.78.0" - "@aws-sdk/util-user-agent-node" "3.80.0" - "@aws-sdk/util-utf8-browser" "3.55.0" - "@aws-sdk/util-utf8-node" "3.55.0" + "@aws-sdk/util-defaults-mode-browser" "3.110.0" + "@aws-sdk/util-defaults-mode-node" "3.110.0" + "@aws-sdk/util-user-agent-browser" "3.110.0" + "@aws-sdk/util-user-agent-node" "3.118.0" + "@aws-sdk/util-utf8-browser" "3.109.0" + "@aws-sdk/util-utf8-node" "3.109.0" entities "2.2.0" fast-xml-parser "3.19.0" tslib "^2.3.1" -"@aws-sdk/config-resolver@3.80.0": - version "3.80.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/config-resolver/-/config-resolver-3.80.0.tgz#a804aba4d4767402ab15640757c8c8bb2254eec1" - integrity sha512-vFruNKlmhsaC8yjnHmasi1WW/7EELlEuFTj4mqcqNqR4dfraf0maVvpqF1VSR8EstpFMsGYI5dmoWAnnG4PcLQ== +"@aws-sdk/config-resolver@3.110.0": + version "3.110.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/config-resolver/-/config-resolver-3.110.0.tgz#93de506934aa06dd973e5e3dab95b629697372f9" + integrity sha512-7VvtKy4CL63BAktQ2vgsjhWDSXpkXO5YdiI56LQnHztrvSuJBBaxJ7R1p/k0b2tEUhYKUziAIW8EKE/7EGPR4g== dependencies: - "@aws-sdk/signature-v4" "3.78.0" - "@aws-sdk/types" "3.78.0" - "@aws-sdk/util-config-provider" "3.55.0" - "@aws-sdk/util-middleware" "3.78.0" + "@aws-sdk/signature-v4" "3.110.0" + "@aws-sdk/types" "3.110.0" + "@aws-sdk/util-config-provider" "3.109.0" + "@aws-sdk/util-middleware" "3.110.0" tslib "^2.3.1" -"@aws-sdk/credential-provider-cognito-identity@3.100.0": - version "3.100.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.100.0.tgz#3d23c40af7ba58d01e91803e5dc594bf4147062b" - integrity sha512-fJO/XWqvdBPwVNLtUji8tMg7MBrP+G4gGNkH1MVJO4pmzh4Y38/a3ezFWBLbO0n0NctYQaZne0kZM12absPuUQ== +"@aws-sdk/credential-provider-cognito-identity@3.121.0": + version "3.121.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.121.0.tgz#5c4b0ecddc6b3375812c6be0759b8430397813a2" + integrity sha512-Tc7jAXZjnrJ9oWQz/YqjR+/DySM7Kt9+yxaUY0of+lakDucNGquRZ+xfEykyXGMgH2hHG0durT/tB+L7ekqAlQ== dependencies: - "@aws-sdk/client-cognito-identity" "3.100.0" - "@aws-sdk/property-provider" "3.78.0" - "@aws-sdk/types" "3.78.0" + "@aws-sdk/client-cognito-identity" "3.121.0" + "@aws-sdk/property-provider" "3.110.0" + "@aws-sdk/types" "3.110.0" tslib "^2.3.1" -"@aws-sdk/credential-provider-env@3.78.0": - version "3.78.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-env/-/credential-provider-env-3.78.0.tgz#e3013073bab0db313b0505d790aa79a35bd582d9" - integrity sha512-K41VTIzVHm2RyIwtBER8Hte3huUBXdV1WKO+i7olYVgLFmaqcZUNrlyoGDRqZcQ/u4AbxTzBU9jeMIbIfzMOWg== +"@aws-sdk/credential-provider-env@3.110.0": + version "3.110.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-env/-/credential-provider-env-3.110.0.tgz#c95552fc0a3ae857ced0e171e53082cf3c84bc74" + integrity sha512-oFU3IYk/Bl5tdsz1qigtm3I25a9cvXPqlE8VjYjxVDdLujF5zd/4HLbhP4GQWhpEwZmM1ijcSNfLcyywVevTZg== dependencies: - "@aws-sdk/property-provider" "3.78.0" - "@aws-sdk/types" "3.78.0" + "@aws-sdk/property-provider" "3.110.0" + "@aws-sdk/types" "3.110.0" tslib "^2.3.1" -"@aws-sdk/credential-provider-imds@3.81.0": - version "3.81.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-imds/-/credential-provider-imds-3.81.0.tgz#1ffd1219b7fd19eec4d4d4b5b06bda66e3bc210e" - integrity sha512-BHopP+gaovTYj+4tSrwCk8NNCR48gE9CWmpIOLkP9ell0gOL81Qh7aCEiIK0BZBZkccv1s16cYq1MSZZGS7PEQ== +"@aws-sdk/credential-provider-imds@3.110.0": + version "3.110.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-imds/-/credential-provider-imds-3.110.0.tgz#ba4f178ccab65c5760bce38e7f694584dad3fd74" + integrity sha512-atl+7/dAB+8fG9XI2fYyCgXKYDbOzot65VAwis+14bOEUCVp7PCJifBEZ/L8GEq564p+Fa2p1IpV0wuQXxqFUQ== dependencies: - "@aws-sdk/node-config-provider" "3.80.0" - "@aws-sdk/property-provider" "3.78.0" - "@aws-sdk/types" "3.78.0" - "@aws-sdk/url-parser" "3.78.0" + "@aws-sdk/node-config-provider" "3.110.0" + "@aws-sdk/property-provider" "3.110.0" + "@aws-sdk/types" "3.110.0" + "@aws-sdk/url-parser" "3.110.0" tslib "^2.3.1" -"@aws-sdk/credential-provider-ini@3.100.0": - version "3.100.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.100.0.tgz#5da9d935f1632cc0a32a1b5222a692e3dc78c1cb" - integrity sha512-2pCtth/Iv4mATRwb2g1nJdd9TolMyhTnhcskopukFvzp13VS5cgtz0hgYmJNnztTF8lpKJhJaidtKS5JJTWnHg== +"@aws-sdk/credential-provider-ini@3.121.0": + version "3.121.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.121.0.tgz#d87bfafb8671f04dddd1d2d04b64147040e9e3c7" + integrity sha512-wOuGOifwZtTN/prCaG+hO9AtpKjJB/QyRse251+I+inNPg2iSd9rCLfHZdmfL/Zn2XJyfg0ULOl6c/myF5aRDg== dependencies: - "@aws-sdk/credential-provider-env" "3.78.0" - "@aws-sdk/credential-provider-imds" "3.81.0" - "@aws-sdk/credential-provider-sso" "3.100.0" - "@aws-sdk/credential-provider-web-identity" "3.78.0" - "@aws-sdk/property-provider" "3.78.0" - "@aws-sdk/shared-ini-file-loader" "3.80.0" - "@aws-sdk/types" "3.78.0" + "@aws-sdk/credential-provider-env" "3.110.0" + "@aws-sdk/credential-provider-imds" "3.110.0" + "@aws-sdk/credential-provider-sso" "3.121.0" + "@aws-sdk/credential-provider-web-identity" "3.110.0" + "@aws-sdk/property-provider" "3.110.0" + "@aws-sdk/shared-ini-file-loader" "3.110.0" + "@aws-sdk/types" "3.110.0" tslib "^2.3.1" -"@aws-sdk/credential-provider-node@3.100.0": - version "3.100.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-node/-/credential-provider-node-3.100.0.tgz#8a5cab82c2943cf376986865f4d3a734f023eb44" - integrity sha512-PMIPnn/dhv9tlWR0qXnANJpTumujWfhKnLAsV3BUqB1K9IzWqz/zXjCT0jcSUTY8X/VkSuehtBdCKvOOM5mMqg== +"@aws-sdk/credential-provider-node@3.121.0": + version "3.121.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-node/-/credential-provider-node-3.121.0.tgz#a009c4f71fabc6cab1fc4f7fbae4f851403d9da9" + integrity sha512-wY5+oey0eoxkGMTXrZ+tK7FKA91WN8ntBbYBbZL0vktHYCQkBra5fBGV17RNp8ggVkJXAtDdrIjTBEQ/vNrMrQ== dependencies: - "@aws-sdk/credential-provider-env" "3.78.0" - "@aws-sdk/credential-provider-imds" "3.81.0" - "@aws-sdk/credential-provider-ini" "3.100.0" - "@aws-sdk/credential-provider-process" "3.80.0" - "@aws-sdk/credential-provider-sso" "3.100.0" - "@aws-sdk/credential-provider-web-identity" "3.78.0" - "@aws-sdk/property-provider" "3.78.0" - "@aws-sdk/shared-ini-file-loader" "3.80.0" - "@aws-sdk/types" "3.78.0" + "@aws-sdk/credential-provider-env" "3.110.0" + "@aws-sdk/credential-provider-imds" "3.110.0" + "@aws-sdk/credential-provider-ini" "3.121.0" + "@aws-sdk/credential-provider-process" "3.110.0" + "@aws-sdk/credential-provider-sso" "3.121.0" + "@aws-sdk/credential-provider-web-identity" "3.110.0" + "@aws-sdk/property-provider" "3.110.0" + "@aws-sdk/shared-ini-file-loader" "3.110.0" + "@aws-sdk/types" "3.110.0" tslib "^2.3.1" -"@aws-sdk/credential-provider-process@3.80.0": - version "3.80.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-process/-/credential-provider-process-3.80.0.tgz#625577774278f845fe5bd0f311ed53973ec92ede" - integrity sha512-3Ro+kMMyLUJHefOhGc5pOO/ibGcJi8bkj0z/Jtqd5I2Sm1qi7avoztST67/k48KMW1OqPnD/FUqxz5T8B2d+FQ== +"@aws-sdk/credential-provider-process@3.110.0": + version "3.110.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-process/-/credential-provider-process-3.110.0.tgz#1f4543edd532beb4b690e6f3aaf74d00af3be5c4" + integrity sha512-JJcZePvRTfQHYj/+EEY13yItnZH/e8exlARFUjN0L13UrgHpOJtDQBa+YBHXo6MbTFQh+re25z2kzc+zOYSMNQ== dependencies: - "@aws-sdk/property-provider" "3.78.0" - "@aws-sdk/shared-ini-file-loader" "3.80.0" - "@aws-sdk/types" "3.78.0" + "@aws-sdk/property-provider" "3.110.0" + "@aws-sdk/shared-ini-file-loader" "3.110.0" + "@aws-sdk/types" "3.110.0" tslib "^2.3.1" -"@aws-sdk/credential-provider-sso@3.100.0": - version "3.100.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.100.0.tgz#c930bb55565a9f0e580ddb0b9721e6fd9d8eafe7" - integrity sha512-DwJvrh77vBJ1/fS9z0i2QuIvSk4pATA4DH8AEWoQ8LQX97tp3es7gZV5Wu93wFsEyIYC8penz6pNVq5QajMk2A== +"@aws-sdk/credential-provider-sso@3.121.0": + version "3.121.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.121.0.tgz#8bac8420f280fcba0c2dd25af4925173bc979db3" + integrity sha512-c9XmnndZmJdkSBgDpVQCN8fcVTkRrtDWNUBO6TcA0abxGOOteUS7s9YmJKqMuwABzk+WGJ1B2EVC5b0AMzIFYg== dependencies: - "@aws-sdk/client-sso" "3.100.0" - "@aws-sdk/property-provider" "3.78.0" - "@aws-sdk/shared-ini-file-loader" "3.80.0" - "@aws-sdk/types" "3.78.0" + "@aws-sdk/client-sso" "3.121.0" + "@aws-sdk/property-provider" "3.110.0" + "@aws-sdk/shared-ini-file-loader" "3.110.0" + "@aws-sdk/types" "3.110.0" tslib "^2.3.1" -"@aws-sdk/credential-provider-web-identity@3.78.0": - version "3.78.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.78.0.tgz#61cc6c5c065de3d8d34b7633899e3bbfa9a24c9d" - integrity sha512-9/IvqHdJaVqMEABA8xZE3t5YF1S2PepfckVu0Ws9YUglj6oO+2QyVX6aRgMF1xph6781+Yc31TDh8/3eaDja7w== +"@aws-sdk/credential-provider-web-identity@3.110.0": + version "3.110.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.110.0.tgz#236e192826c3856e1f2b8eaa1ad126affd641082" + integrity sha512-e4e5u7v3fsUFZsMcFMhMy1NdJBQpunYcLwpYlszm3OEICwTTekQ+hVvnVRd134doHvzepE4yp9sAop0Cj+IRVQ== dependencies: - "@aws-sdk/property-provider" "3.78.0" - "@aws-sdk/types" "3.78.0" + "@aws-sdk/property-provider" "3.110.0" + "@aws-sdk/types" "3.110.0" tslib "^2.3.1" -"@aws-sdk/credential-providers@^3.100.0": - version "3.100.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-providers/-/credential-providers-3.100.0.tgz#f5d87bf68fb0f3a4ce436be905653f22f10d5723" - integrity sha512-yKFDTX2nUAA509p7E4nNpt0de40m5rz6ZNxWPNA02wYgkD0DtZuRwn/9HwxQVWYcPQg8UKBd6U7yvw/wkXgHYg== +"@aws-sdk/credential-providers@^3.121.0": + version "3.121.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-providers/-/credential-providers-3.121.0.tgz#64c6684917966264a4665f4e67531dfba9456309" + integrity sha512-IB8rfcVGhSLEHxgemDYxqtbDhZAq282oXjv4fctsijFfT55WKSsrQLxzS9iF50xi6NT+JwVzNL/re9XjG4mfaA== dependencies: - "@aws-sdk/client-cognito-identity" "3.100.0" - "@aws-sdk/client-sso" "3.100.0" - "@aws-sdk/client-sts" "3.100.0" - "@aws-sdk/credential-provider-cognito-identity" "3.100.0" - "@aws-sdk/credential-provider-env" "3.78.0" - "@aws-sdk/credential-provider-imds" "3.81.0" - "@aws-sdk/credential-provider-ini" "3.100.0" - "@aws-sdk/credential-provider-node" "3.100.0" - "@aws-sdk/credential-provider-process" "3.80.0" - "@aws-sdk/credential-provider-sso" "3.100.0" - "@aws-sdk/credential-provider-web-identity" "3.78.0" - "@aws-sdk/property-provider" "3.78.0" - "@aws-sdk/shared-ini-file-loader" "3.80.0" - "@aws-sdk/types" "3.78.0" + "@aws-sdk/client-cognito-identity" "3.121.0" + "@aws-sdk/client-sso" "3.121.0" + "@aws-sdk/client-sts" "3.121.0" + "@aws-sdk/credential-provider-cognito-identity" "3.121.0" + "@aws-sdk/credential-provider-env" "3.110.0" + "@aws-sdk/credential-provider-imds" "3.110.0" + "@aws-sdk/credential-provider-ini" "3.121.0" + "@aws-sdk/credential-provider-node" "3.121.0" + "@aws-sdk/credential-provider-process" "3.110.0" + "@aws-sdk/credential-provider-sso" "3.121.0" + "@aws-sdk/credential-provider-web-identity" "3.110.0" + "@aws-sdk/property-provider" "3.110.0" + "@aws-sdk/shared-ini-file-loader" "3.110.0" + "@aws-sdk/types" "3.110.0" tslib "^2.3.1" "@aws-sdk/endpoint-cache@3.55.0": @@ -738,97 +750,95 @@ mnemonist "0.38.3" tslib "^2.3.1" -"@aws-sdk/eventstream-marshaller@3.78.0": - version "3.78.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/eventstream-marshaller/-/eventstream-marshaller-3.78.0.tgz#32df7136d644d0d91a563a9a192b6e2d4df873d0" - integrity sha512-BMbRvLe6wNWQ+NO1pdPw3kGXXEdYV94BxEr3rTkKwr5yHpl8sUb/Va9sJJufUjzggpgE4vYu5nVsrT8ByMYXuA== +"@aws-sdk/eventstream-codec@3.119.0": + version "3.119.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/eventstream-codec/-/eventstream-codec-3.119.0.tgz#6eb5a645a38e0175fa054257addb54757bcf8d62" + integrity sha512-HMHVfsYU2yaJ2NMHe1HUhQnWD3hCabC3xTVcAx5SSAE+afc74xoQTCA6oDI6OoCLL47ISLjcrkpvfYCAZ7wHTw== dependencies: "@aws-crypto/crc32" "2.0.0" - "@aws-sdk/types" "3.78.0" - "@aws-sdk/util-hex-encoding" "3.58.0" + "@aws-sdk/types" "3.110.0" + "@aws-sdk/util-hex-encoding" "3.109.0" tslib "^2.3.1" -"@aws-sdk/eventstream-serde-browser@3.78.0": - version "3.78.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/eventstream-serde-browser/-/eventstream-serde-browser-3.78.0.tgz#27b019f6f17a54e18cd44041b29ef234cc04f545" - integrity sha512-ehQI2iLsj8MMskDRbrPB7SibIdJq6LleBP6ojT+cgrLJRbVXUOxK+3MPHDZVdGYx4ukVg48E1fA2DzVfAp7Emw== +"@aws-sdk/eventstream-serde-browser@3.120.0": + version "3.120.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/eventstream-serde-browser/-/eventstream-serde-browser-3.120.0.tgz#99b898ce852a3ef8633baca4cca42e1303d65fbd" + integrity sha512-+UUq5vey2mJx1NYhq4Gg/jzs5EJE6gW2g91NPcO842891YxZAOmHciFI5kzLKn8PgSKKhbmCL6pq8UqX4N8lRw== dependencies: - "@aws-sdk/eventstream-marshaller" "3.78.0" - "@aws-sdk/eventstream-serde-universal" "3.78.0" - "@aws-sdk/types" "3.78.0" + "@aws-sdk/eventstream-serde-universal" "3.120.0" + "@aws-sdk/types" "3.110.0" tslib "^2.3.1" -"@aws-sdk/eventstream-serde-config-resolver@3.78.0": - version "3.78.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-3.78.0.tgz#ea6d24d763413bc53da6230e06660382ba94a40c" - integrity sha512-iUG0wtZH/L7d6XfipwbhgjBHip0uTm9S27EasCn+g0CunbW6w7rXd7rfMqA+gSLVXPTBYjTMPIwRxrTCdRprwA== +"@aws-sdk/eventstream-serde-config-resolver@3.110.0": + version "3.110.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-3.110.0.tgz#5ec8dee49a595b6079fc52bc4355bc15626bb9de" + integrity sha512-0kyKUU5/46OGe6rgIqbNRJEQhNYwxLdgcJXlBl6q6CdgyQApz6jsAgG0C5xhSLSi4iJijDRriJTowAhkq4AlWQ== dependencies: - "@aws-sdk/types" "3.78.0" + "@aws-sdk/types" "3.110.0" tslib "^2.3.1" -"@aws-sdk/eventstream-serde-node@3.78.0": - version "3.78.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/eventstream-serde-node/-/eventstream-serde-node-3.78.0.tgz#138d99043b11b7cdfd63425b257fae64ec404374" - integrity sha512-H78LLoZEngZBSdk3lRQkAaR3cGsy/3UIjq9AFPeqoPVQtHkzBob1jVfE/5VSVAMhKLxWn8iqhRPS37AvyBGOwQ== +"@aws-sdk/eventstream-serde-node@3.120.0": + version "3.120.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/eventstream-serde-node/-/eventstream-serde-node-3.120.0.tgz#ff5cd01233e84813dce9cb5eda0dcb8efc9b034b" + integrity sha512-+RoUQKzB+MBH6nThLmc/VnmwNMzWxiCD8Z8KbGUG+1ybYqshSwGKObCqDfAIwe+W97xNZpsx4Br7/bcPEY322g== dependencies: - "@aws-sdk/eventstream-marshaller" "3.78.0" - "@aws-sdk/eventstream-serde-universal" "3.78.0" - "@aws-sdk/types" "3.78.0" + "@aws-sdk/eventstream-serde-universal" "3.120.0" + "@aws-sdk/types" "3.110.0" tslib "^2.3.1" -"@aws-sdk/eventstream-serde-universal@3.78.0": - version "3.78.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/eventstream-serde-universal/-/eventstream-serde-universal-3.78.0.tgz#9d7f3caf83cdc89ca7e3cf3a24734b0bbf43c81c" - integrity sha512-PZTLdyF923/1GJuMNtq9VMGd2vEx33HhsGInXvYtulKDSD5SgaTGj+Dz5wYepqL1gUEuXqZjBD71uZgrY/JgRg== +"@aws-sdk/eventstream-serde-universal@3.120.0": + version "3.120.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/eventstream-serde-universal/-/eventstream-serde-universal-3.120.0.tgz#9bc7b7a01f4ed94e2d89622917eb652fe97b94f2" + integrity sha512-2tZ5+3YlQRfsd0xibgVueWegengOMZIZF3ksq+IygWrRwukI9+QfC7oYe29/yttKoz2AipNKNY+JL9MgjHEdmg== dependencies: - "@aws-sdk/eventstream-marshaller" "3.78.0" - "@aws-sdk/types" "3.78.0" + "@aws-sdk/eventstream-codec" "3.119.0" + "@aws-sdk/types" "3.110.0" tslib "^2.3.1" -"@aws-sdk/fetch-http-handler@3.78.0": - version "3.78.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/fetch-http-handler/-/fetch-http-handler-3.78.0.tgz#9cd4a02eaf015b4a5a18552e8c9e8fbfce7219a3" - integrity sha512-cR6r2h2kJ1DNEZSXC6GknQB7OKmy+s9ZNV+g3AsNqkrUmNNOaHpFoSn+m6SC3qaclcGd0eQBpqzSu/TDn23Ihw== +"@aws-sdk/fetch-http-handler@3.110.0": + version "3.110.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/fetch-http-handler/-/fetch-http-handler-3.110.0.tgz#0b6d552659b779c49ba0f99c78a57755864bf1b0" + integrity sha512-vk+K4GeCZL2J2rtvKO+T0Q7i3MDpEGZBMg5K2tj9sMcEQwty0BF0aFnP7Eu2l4/Zif2z1mWuUFM2WcZI6DVnbw== dependencies: - "@aws-sdk/protocol-http" "3.78.0" - "@aws-sdk/querystring-builder" "3.78.0" - "@aws-sdk/types" "3.78.0" - "@aws-sdk/util-base64-browser" "3.58.0" + "@aws-sdk/protocol-http" "3.110.0" + "@aws-sdk/querystring-builder" "3.110.0" + "@aws-sdk/types" "3.110.0" + "@aws-sdk/util-base64-browser" "3.109.0" tslib "^2.3.1" -"@aws-sdk/hash-blob-browser@3.78.0": - version "3.78.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/hash-blob-browser/-/hash-blob-browser-3.78.0.tgz#6f774f58c59bb02749b7239a35be9cf61cc8520e" - integrity sha512-IEkA+t6qJEtEYEZgsqFRRITeZJ3mirw7IHJVHxwb86lpeufTVcbILI59B8/rhbqG+9dk0kWTjYSjC/ZdM+rgHA== +"@aws-sdk/hash-blob-browser@3.110.0": + version "3.110.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/hash-blob-browser/-/hash-blob-browser-3.110.0.tgz#9237d9cd239ed1e964cf567dd4d2891b30984417" + integrity sha512-NkTosjlYwP2dcBXY6yzhNafAK+W2nceheffvWdyGA29+E9YdRjDminXvKc/WAkZUMOW0CaCbD90otOiimAAYyQ== dependencies: "@aws-sdk/chunked-blob-reader" "3.55.0" - "@aws-sdk/chunked-blob-reader-native" "3.58.0" - "@aws-sdk/types" "3.78.0" + "@aws-sdk/chunked-blob-reader-native" "3.109.0" + "@aws-sdk/types" "3.110.0" tslib "^2.3.1" -"@aws-sdk/hash-node@3.78.0": - version "3.78.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/hash-node/-/hash-node-3.78.0.tgz#d03f804a685bc1cea9df3eabf499b2a7659d01fd" - integrity sha512-ev48yXaqZVtMeuKy52LUZPHCyKvkKQ9uiUebqkA+zFxIk+eN8SMPFHmsififIHWuS6ZkXBUSctjH9wmLebH60A== +"@aws-sdk/hash-node@3.110.0": + version "3.110.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/hash-node/-/hash-node-3.110.0.tgz#b225bfd16596b6485c1c610e8fef8de1e40931c4" + integrity sha512-wakl+kP2O8wTGYiQ3InZy+CVfGrIpFfq9fo4zif9PZac0BbUbguUU1dkY34uZiaf+4o2/9MoDYrHU2HYeXKxWw== dependencies: - "@aws-sdk/types" "3.78.0" + "@aws-sdk/types" "3.110.0" "@aws-sdk/util-buffer-from" "3.55.0" tslib "^2.3.1" -"@aws-sdk/hash-stream-node@3.78.0": - version "3.78.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/hash-stream-node/-/hash-stream-node-3.78.0.tgz#7b321a4ab4384bd51f19e626e5dae111b8fac4dd" - integrity sha512-y42Pm0Nk6zf/MI6acLFVFAMya0Ncvy6F6Xu5aYAmwIMIoMI0ctNeyuL/Dikgt8+oyxC+kORw+W9jtzgWj2zY/w== +"@aws-sdk/hash-stream-node@3.110.0": + version "3.110.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/hash-stream-node/-/hash-stream-node-3.110.0.tgz#786304b29d27a8e3814a49fb93208e8231ebca87" + integrity sha512-srlStn+dCnBlQy4oWBz3oFS8vT5Xgxhra91rt9U+vHruCyQ0L1es0J87X4uwy2HRlnIw3daPtVLtxekahEXzKQ== dependencies: - "@aws-sdk/types" "3.78.0" + "@aws-sdk/types" "3.110.0" tslib "^2.3.1" -"@aws-sdk/invalid-dependency@3.78.0": - version "3.78.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/invalid-dependency/-/invalid-dependency-3.78.0.tgz#c4e30871d69894dbf3450023319385110ce95c81" - integrity sha512-zUo+PbeRMN/Mzj6y+6p9qqk/znuFetT1gmpOcZGL9Rp2T+b9WJWd+daq5ktsL10sVCzIt2UvneJRz6b+aU+bfw== +"@aws-sdk/invalid-dependency@3.110.0": + version "3.110.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/invalid-dependency/-/invalid-dependency-3.110.0.tgz#9104dfd40e35b6737dc7ab01f4e79c76c1109c44" + integrity sha512-O8J1InmtJkoiUMbQDtxBfOzgigBp9iSVsNXQrhs2qHh3826cJOfE7NGT3u+NMw73Pk5j2cfmOh1+7k/76IqxOg== dependencies: - "@aws-sdk/types" "3.78.0" + "@aws-sdk/types" "3.110.0" tslib "^2.3.1" "@aws-sdk/is-array-buffer@3.55.0": @@ -838,312 +848,312 @@ dependencies: tslib "^2.3.1" -"@aws-sdk/lib-dynamodb@^3.100.0": - version "3.100.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/lib-dynamodb/-/lib-dynamodb-3.100.0.tgz#979a281b6eced05c8b94d65f8dbbd74f5207ed05" - integrity sha512-uc6Yb9SfxDdIgCV6LnQM3Y5m8aonpnvF2DUd6kU30taNIkL0TS9jnQxVpiUpeFbf6TKtvP2IvdbOI5yG0n2VYg== +"@aws-sdk/lib-dynamodb@^3.121.0": + version "3.121.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/lib-dynamodb/-/lib-dynamodb-3.121.0.tgz#3096bcbecc438f75a8fa5cc91a5c3df57650250e" + integrity sha512-DKW6RkfV0IR7i5cAhSbYf4JGLYCHZyuKa2O3RUUnm4ZMZm1y6ktPeydSxQQn0nMH4glsNHTiZ/EmLT0cnY7ZsQ== dependencies: - "@aws-sdk/util-dynamodb" "3.100.0" + "@aws-sdk/util-dynamodb" "3.121.0" tslib "^2.3.1" -"@aws-sdk/md5-js@3.78.0": - version "3.78.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/md5-js/-/md5-js-3.78.0.tgz#a79357e6518778057b7bcbbd45dcb352be5f8e15" - integrity sha512-vKOXJWJvv6QH6rnqMYEWzwAnMr4hfcmY8+t6BAuTcDpcEVF77e3bwUcaajXi2U0JMuNvnLwuJF3h6kL6aX4l6g== +"@aws-sdk/md5-js@3.110.0": + version "3.110.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/md5-js/-/md5-js-3.110.0.tgz#0a8745cbcaa609452d034e1b0edfa8f0cf45e2ae" + integrity sha512-66gV6CH8O7ymTZMIbGjdUI71K7ErDfudhtN/ULb97kD2TYX4NlFtxNZxx3+iZH1G0H636lWm9hJcU5ELG9B+bw== dependencies: - "@aws-sdk/types" "3.78.0" - "@aws-sdk/util-utf8-browser" "3.55.0" - "@aws-sdk/util-utf8-node" "3.55.0" + "@aws-sdk/types" "3.110.0" + "@aws-sdk/util-utf8-browser" "3.109.0" + "@aws-sdk/util-utf8-node" "3.109.0" tslib "^2.3.1" -"@aws-sdk/middleware-bucket-endpoint@3.80.0": - version "3.80.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.80.0.tgz#0632e94900472eb86d0cfdf521251a1bdefba843" - integrity sha512-FSSx6IgT7xftSlpjxoPKv8XI9nv7EK+OCODo2s3CmElMW1kBRdmQ/ImVuTwvqhdxJEVUeUdgupmC7cqyqgt04w== +"@aws-sdk/middleware-bucket-endpoint@3.110.0": + version "3.110.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.110.0.tgz#76e0dce1d16750340da76736c5737d790db1a95a" + integrity sha512-l1q0KzMRFyGSSc7LZGEh2xhCha1933C8uJE5g23b7dZdklEU5I62l4daELo+TBANcxFzDiRXd6g5mly/T+ZTSg== dependencies: - "@aws-sdk/protocol-http" "3.78.0" - "@aws-sdk/types" "3.78.0" + "@aws-sdk/protocol-http" "3.110.0" + "@aws-sdk/types" "3.110.0" "@aws-sdk/util-arn-parser" "3.55.0" - "@aws-sdk/util-config-provider" "3.55.0" + "@aws-sdk/util-config-provider" "3.109.0" tslib "^2.3.1" -"@aws-sdk/middleware-content-length@3.78.0": - version "3.78.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-content-length/-/middleware-content-length-3.78.0.tgz#57d46be61d1176d4c5fce7ba4b0682798c170208" - integrity sha512-5MpKt6lB9TdFy25/AGrpOjPY0iDHZAKpEHc+jSOJBXLl6xunXA7qHdiYaVqkWodLxy70nIckGNHqQ3drabidkA== +"@aws-sdk/middleware-content-length@3.110.0": + version "3.110.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-content-length/-/middleware-content-length-3.110.0.tgz#f4dc3508952c5fae9740f172d3b76135dd4dba37" + integrity sha512-hKU+zdqfAJQg22LXMVu/z35nNIHrVAKpVKPe9+WYVdL/Z7JKUPK7QymqKGOyDuDbzW6OxyulC1zKGEX12zGmdA== dependencies: - "@aws-sdk/protocol-http" "3.78.0" - "@aws-sdk/types" "3.78.0" + "@aws-sdk/protocol-http" "3.110.0" + "@aws-sdk/types" "3.110.0" tslib "^2.3.1" -"@aws-sdk/middleware-endpoint-discovery@3.80.0": - version "3.80.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-endpoint-discovery/-/middleware-endpoint-discovery-3.80.0.tgz#4a96324020efb24eec75f6207949119c98e097a8" - integrity sha512-73pKz8ossZKisG684raP1dn2u3fQRktWY29oa9Q3cBvRYdyu5UOhwayt2MObgSC8S6NfNdTGC/DGf7+/JRSY7A== +"@aws-sdk/middleware-endpoint-discovery@3.110.0": + version "3.110.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-endpoint-discovery/-/middleware-endpoint-discovery-3.110.0.tgz#3e9e18b4e191bb94e3068bd526fb766b02b4d777" + integrity sha512-GUnNcuEBqD21E8EgevTcaBXJGnH5dp7eDSfWceYJP+iSscFXLzFFOf1I6H0cwvfARVMHVvlFz0tQcojCSHUZig== dependencies: - "@aws-sdk/config-resolver" "3.80.0" + "@aws-sdk/config-resolver" "3.110.0" "@aws-sdk/endpoint-cache" "3.55.0" - "@aws-sdk/protocol-http" "3.78.0" - "@aws-sdk/types" "3.78.0" + "@aws-sdk/protocol-http" "3.110.0" + "@aws-sdk/types" "3.110.0" tslib "^2.3.1" -"@aws-sdk/middleware-expect-continue@3.78.0": - version "3.78.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.78.0.tgz#35df662ecf31a1c8540781154f514615f3ca2c97" - integrity sha512-IXfcSugFV3uNk50VQsN/Cm80iCsUSwcYJ5RzEwy7wXbZ+KM03xWXlbXzqkeTDnS74wLWSw09nKF3rkp1eyfDfg== +"@aws-sdk/middleware-expect-continue@3.113.0": + version "3.113.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.113.0.tgz#0129967f40ef57eec922ef8e126d77b90853a0fe" + integrity sha512-LLtSunCYVWeAhRP+6enn0kYF119WooV6gepMGOWeRCpKXO2iyi8YOx2Mtgc3T8ybiAG/dVlmZoX47Y1HINcuqg== dependencies: - "@aws-sdk/middleware-header-default" "3.78.0" - "@aws-sdk/protocol-http" "3.78.0" - "@aws-sdk/types" "3.78.0" + "@aws-sdk/protocol-http" "3.110.0" + "@aws-sdk/types" "3.110.0" tslib "^2.3.1" -"@aws-sdk/middleware-flexible-checksums@3.78.0": - version "3.78.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.78.0.tgz#9128b0acb5d9df0f0e0ef06cb1d17a44afe650fc" - integrity sha512-1jjxHcB3Le/2Z7BzugXzZnIwKGlUluNm0d1lB4fF2QVq3GHlA6e8uv0rCtqe/3wSsrzV6YzJ8vjioymKSNIjKQ== +"@aws-sdk/middleware-flexible-checksums@3.110.0": + version "3.110.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.110.0.tgz#bbf6009d45b7080e262a7351a86acf083ee22af1" + integrity sha512-Z/v1Da+e1McxrVr1s4jUykp2EXsOHpTxZ4M0X8vNkXCIVSuaMp4UI0P+LQawbDA+j3FaecqqBfWMZ2sHQ8bpoA== dependencies: "@aws-crypto/crc32" "2.0.0" "@aws-crypto/crc32c" "2.0.0" "@aws-sdk/is-array-buffer" "3.55.0" - "@aws-sdk/protocol-http" "3.78.0" - "@aws-sdk/types" "3.78.0" + "@aws-sdk/protocol-http" "3.110.0" + "@aws-sdk/types" "3.110.0" tslib "^2.3.1" -"@aws-sdk/middleware-header-default@3.78.0": - version "3.78.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-header-default/-/middleware-header-default-3.78.0.tgz#911b7f6ce4b4ae45ab032e32768d527ca6ae1d6c" - integrity sha512-USyOIF7ObBVMKbV/8lOBLDNwMAGdOtujd+RO/9dX6OQLceUTKIS1dOfJoYYwRHgengn7ikpDxoyROyspPYYDZQ== +"@aws-sdk/middleware-host-header@3.110.0": + version "3.110.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-host-header/-/middleware-host-header-3.110.0.tgz#a28115e2797b86c2fb583000593b723a51313b92" + integrity sha512-/Cknn1vL2LTlclI0MX2RzmtdPlCJ5palCRXxm/mod1oHwg4oNTKRlUX3LUD+L8g7JuJ4h053Ch9KS/A0vanE5Q== dependencies: - "@aws-sdk/protocol-http" "3.78.0" - "@aws-sdk/types" "3.78.0" + "@aws-sdk/protocol-http" "3.110.0" + "@aws-sdk/types" "3.110.0" tslib "^2.3.1" -"@aws-sdk/middleware-host-header@3.78.0": - version "3.78.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-host-header/-/middleware-host-header-3.78.0.tgz#9130d176c2839bc658aff01bf2a36fee705f0e86" - integrity sha512-1zL8uaDWGmH50c8B8jjz75e0ePj6/3QeZEhjJgTgL6DTdiqvRt32p3t+XWHW+yDI14fZZUYeTklAaLVxqFrHqQ== +"@aws-sdk/middleware-location-constraint@3.110.0": + version "3.110.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.110.0.tgz#0a710ac704cc7c40ca34edf62387d8ac1fdbdaae" + integrity sha512-8ZSo9sqrTMcSp0xEJQ3ypmQpeSMQl1NXXv72khJPweZqDoO0eAbfytwyH4JH4sP0VwVVmuDHdwPXyDZX7I0iQg== dependencies: - "@aws-sdk/protocol-http" "3.78.0" - "@aws-sdk/types" "3.78.0" + "@aws-sdk/types" "3.110.0" tslib "^2.3.1" -"@aws-sdk/middleware-location-constraint@3.78.0": - version "3.78.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.78.0.tgz#f3af44e443a0993e413a787a446bb6693b5b0e7e" - integrity sha512-m626H1WwXYJtwHEkV/2DsLlu1ckWq3j57NzsexZki3qS0nU8HEiDl6YYi+k84vDD4Qpba6EI9AdhzwnvZLXtGw== +"@aws-sdk/middleware-logger@3.110.0": + version "3.110.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-logger/-/middleware-logger-3.110.0.tgz#69eb0b2d0d9833f6fdbe33eb1876254e7cee53ec" + integrity sha512-+pz+a+8dfTnzLj79nHrv3aONMp/N36/erMd+7JXeR84QEosVLrFBUwKA8x5x6O3s1iBbQzRKMYEIuja9xn1BPA== dependencies: - "@aws-sdk/types" "3.78.0" + "@aws-sdk/types" "3.110.0" tslib "^2.3.1" -"@aws-sdk/middleware-logger@3.78.0": - version "3.78.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-logger/-/middleware-logger-3.78.0.tgz#758b84711213b2e78afe0df20bc2d4d70a856da1" - integrity sha512-GBhwxNjhCJUIeQQDaGasX/C23Jay77al2vRyGwmxf8no0DdFsa4J1Ik6/2hhIqkqko+WM4SpCnpZrY4MtnxNvA== +"@aws-sdk/middleware-recursion-detection@3.110.0": + version "3.110.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.110.0.tgz#8daa2bc9f62cbf499d9c615726cf2a51f46e70ff" + integrity sha512-Wav782zd7bcd1e6txRob76CDOdVOaUQ8HXoywiIm/uFrEEUZvhs2mgnXjVUVCMBUehdNgnL99z420aS13JeL/Q== dependencies: - "@aws-sdk/types" "3.78.0" + "@aws-sdk/protocol-http" "3.110.0" + "@aws-sdk/types" "3.110.0" tslib "^2.3.1" -"@aws-sdk/middleware-retry@3.80.0": - version "3.80.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-retry/-/middleware-retry-3.80.0.tgz#d62ebd68ded78bdaf0a8b07bb4cc1c394c99cc8f" - integrity sha512-CTk+tA4+WMUNOcUfR6UQrkhwvPYFpnMsQ1vuHlpLFOGG3nCqywA2hueLMRQmVcDXzP0sGeygce6dzRI9dJB/GA== +"@aws-sdk/middleware-retry@3.118.1": + version "3.118.1" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-retry/-/middleware-retry-3.118.1.tgz#a43799a113c89e76ce676490ecad91af96699fbe" + integrity sha512-Dh0EgO3yPHEaRC6CVrofgAMdUQaG0Kkl466iVFHN5n5kExQvCtvpMHwO9N7kqaq9lXten3yhzboRNLIo98E1Kw== dependencies: - "@aws-sdk/protocol-http" "3.78.0" - "@aws-sdk/service-error-classification" "3.78.0" - "@aws-sdk/types" "3.78.0" - "@aws-sdk/util-middleware" "3.78.0" + "@aws-sdk/protocol-http" "3.110.0" + "@aws-sdk/service-error-classification" "3.110.0" + "@aws-sdk/types" "3.110.0" + "@aws-sdk/util-middleware" "3.110.0" tslib "^2.3.1" uuid "^8.3.2" -"@aws-sdk/middleware-sdk-s3@3.86.0": - version "3.86.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.86.0.tgz#92470446c62eec1cbe502e4f04585194bb5b1ff7" - integrity sha512-1L9q8iJXy/KNyVR8JRs4DZ5SJse6nJPiK4AR8c2xF5FWHdGoFaLcdqpg2/TLB1kpdcfGgNp96uCROxh+IPXtDQ== +"@aws-sdk/middleware-sdk-s3@3.110.0": + version "3.110.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.110.0.tgz#069603d33fbc349661facb0aaa131a95263e1b88" + integrity sha512-/PpZU11dkGldD6yeAccPxFd5nzofLOA3+j25RdIwz2jlJMLl9TeznYRtFH5JhHonP3lsK+IPEnFPwuL6gkBxIQ== dependencies: - "@aws-sdk/protocol-http" "3.78.0" - "@aws-sdk/types" "3.78.0" + "@aws-sdk/middleware-bucket-endpoint" "3.110.0" + "@aws-sdk/protocol-http" "3.110.0" + "@aws-sdk/types" "3.110.0" "@aws-sdk/util-arn-parser" "3.55.0" tslib "^2.3.1" -"@aws-sdk/middleware-sdk-sqs@3.78.0": - version "3.78.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-sdk-sqs/-/middleware-sdk-sqs-3.78.0.tgz#45acc4bb0a47626e6af0270d6fc87ec1ad80f0a8" - integrity sha512-EY1K/qDOxfdFWZHFYmrhxu1N4BOuNnGFh+2XbpHU0nlokMX63aHofnSHGFldoAW5rAy604x5cGn39nP0H+vgOg== +"@aws-sdk/middleware-sdk-sqs@3.110.0": + version "3.110.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-sdk-sqs/-/middleware-sdk-sqs-3.110.0.tgz#d564737ebf71463a5ede08d69f52ae88bc4e07d8" + integrity sha512-eDk5WEv8TM75JyN/SiAAd5+ELO/NQYZ6a1wFrA8EzTq18H3UJImcYWuZq6QU8ZD07E48dlA47JzQg7lClDqnIA== dependencies: - "@aws-sdk/types" "3.78.0" - "@aws-sdk/util-hex-encoding" "3.58.0" + "@aws-sdk/types" "3.110.0" + "@aws-sdk/util-hex-encoding" "3.109.0" tslib "^2.3.1" -"@aws-sdk/middleware-sdk-sts@3.78.0": - version "3.78.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.78.0.tgz#15d91c421380f748b58bb006e1c398cfdf59b290" - integrity sha512-Lu/kN0J0/Kt0ON1hvwNel+y8yvf35licfIgtedHbBCa/ju8qQ9j+uL9Lla6Y5Tqu29yVaye1JxhiIDhscSwrLA== +"@aws-sdk/middleware-sdk-sts@3.110.0": + version "3.110.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.110.0.tgz#8c1e34b72355c5e63495927a01839f210327f0c1" + integrity sha512-EjY/YFdlr5jECde6qIrTIyGBbn/34CKcQGKvmvRd31+3qaClIJLAwNuHfcVzWvCUGbAslsfvdbOpLju33pSQRA== dependencies: - "@aws-sdk/middleware-signing" "3.78.0" - "@aws-sdk/property-provider" "3.78.0" - "@aws-sdk/protocol-http" "3.78.0" - "@aws-sdk/signature-v4" "3.78.0" - "@aws-sdk/types" "3.78.0" + "@aws-sdk/middleware-signing" "3.110.0" + "@aws-sdk/property-provider" "3.110.0" + "@aws-sdk/protocol-http" "3.110.0" + "@aws-sdk/signature-v4" "3.110.0" + "@aws-sdk/types" "3.110.0" tslib "^2.3.1" -"@aws-sdk/middleware-serde@3.78.0": - version "3.78.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-serde/-/middleware-serde-3.78.0.tgz#d1e1a7b9ac58638b973e533ac4c2ca52f413883c" - integrity sha512-4DPsNOxsl1bxRzfo1WXEZjmD7OEi7qGNpxrDWucVe96Fqj2dH08jR8wxvBIVV1e6bAad07IwdPuCGmivNvwRuQ== +"@aws-sdk/middleware-serde@3.110.0": + version "3.110.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-serde/-/middleware-serde-3.110.0.tgz#603dcc1f68d78e9123f9b696150374a8357de6c3" + integrity sha512-brVupxgEAmcZ9cZvdHEH8zncjvGKIiud8pOe4fiimp5NpHmjBLew4jUbnOKNZNAjaidcKUtz//cxtutD6yXEww== dependencies: - "@aws-sdk/types" "3.78.0" + "@aws-sdk/types" "3.110.0" tslib "^2.3.1" -"@aws-sdk/middleware-signing@3.78.0": - version "3.78.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-signing/-/middleware-signing-3.78.0.tgz#2fb41819a9ae0953cf8f428851a57696442469ca" - integrity sha512-OEjJJCNhHHSOprLZ9CzjHIXEKFtPHWP/bG9pMhkV3/6Bmscsgcf8gWHcOnmIrjqX+hT1VALDNpl/RIh0J6/eQw== +"@aws-sdk/middleware-signing@3.110.0": + version "3.110.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-signing/-/middleware-signing-3.110.0.tgz#8faa6acdaedb1c29614fe7ba88a74534db38f3bb" + integrity sha512-y6ZKrGYfgDlFMzWhZmoq5J1UctBgZOUvMmnU9sSeZ020IlEPiOxFMvR0Zu6TcYThp8uy3P0wyjQtGYeTl9Z/kA== dependencies: - "@aws-sdk/property-provider" "3.78.0" - "@aws-sdk/protocol-http" "3.78.0" - "@aws-sdk/signature-v4" "3.78.0" - "@aws-sdk/types" "3.78.0" + "@aws-sdk/property-provider" "3.110.0" + "@aws-sdk/protocol-http" "3.110.0" + "@aws-sdk/signature-v4" "3.110.0" + "@aws-sdk/types" "3.110.0" tslib "^2.3.1" -"@aws-sdk/middleware-ssec@3.78.0": - version "3.78.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-ssec/-/middleware-ssec-3.78.0.tgz#4463c6c6ee26c8b3f2ebc112f7de3ca560ba4f3f" - integrity sha512-3z+UOd95rxvj+iO6WxMjuRNNUMlO6xhXZdBHvQmoiyS+9nMDcNieTu6gfQyLAilVeCh8xU9a0IenJuIYVdJ96g== +"@aws-sdk/middleware-ssec@3.110.0": + version "3.110.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-ssec/-/middleware-ssec-3.110.0.tgz#85020a0e54840e572231407dde6d40a82239d03b" + integrity sha512-Zrm+h+C+MXv2Q+mh8O/zwK2hUYM4kq4I1vx72RPpvyfIk4/F5ZzeA3LSVluISyAW+iNqS8XFvGFrzl2gB8zWsg== dependencies: - "@aws-sdk/types" "3.78.0" + "@aws-sdk/types" "3.110.0" tslib "^2.3.1" -"@aws-sdk/middleware-stack@3.78.0": - version "3.78.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-stack/-/middleware-stack-3.78.0.tgz#e9f42039e500bed23ec74359924ae16e7bf9c77a" - integrity sha512-UoNfRh6eAJN3BJHlG1eb+KeuSe+zARTC2cglroJRyHc2j7GxH2i9FD3IJbj5wvzopJEnQzuY/VCs6STFkqWL1g== +"@aws-sdk/middleware-stack@3.110.0": + version "3.110.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-stack/-/middleware-stack-3.110.0.tgz#5a531c83ec375adf9d7f1bd80b725cebf7b2f01d" + integrity sha512-iaLHw6ctOuGa9UxNueU01Xes+15dR+mqioRpUOUZ9Zx+vhXVpD7C8lnNqhRnYeFXs10/rNIzASgsIrAHTlnlIQ== dependencies: tslib "^2.3.1" -"@aws-sdk/middleware-user-agent@3.78.0": - version "3.78.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.78.0.tgz#e4c7345d26d718de0e84b60ba02b2b08b566fa15" - integrity sha512-wdN5uoq8RxxhLhj0EPeuDSRFuXfUwKeEqRzCKMsYAOC0cAm+PryaP2leo0oTGJ9LUK8REK7zyfFcmtC4oOzlkA== +"@aws-sdk/middleware-user-agent@3.110.0": + version "3.110.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.110.0.tgz#52f32e99ecb641babcd59bb010527d5614e908f4" + integrity sha512-Y6FgiZr99DilYq6AjeaaWcNwVlSQpNGKrILzvV4Tmz03OaBIspe4KL+8EZ2YA/sAu5Lpw80vItdezqDOwGAlnQ== dependencies: - "@aws-sdk/protocol-http" "3.78.0" - "@aws-sdk/types" "3.78.0" + "@aws-sdk/protocol-http" "3.110.0" + "@aws-sdk/types" "3.110.0" tslib "^2.3.1" -"@aws-sdk/node-config-provider@3.80.0": - version "3.80.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/node-config-provider/-/node-config-provider-3.80.0.tgz#dbb02aa48fb1a0acc3201ca73db5bbf1738895b5" - integrity sha512-vyTOMK04huB7n10ZUv0thd2TE6KlY8livOuLqFTMtj99AJ6vyeB5XBNwKnQtJIt/P7CijYgp8KcFvI9fndOmKg== +"@aws-sdk/node-config-provider@3.110.0": + version "3.110.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/node-config-provider/-/node-config-provider-3.110.0.tgz#7d032082b85458ea4959f744d473e328be024359" + integrity sha512-46p4dCPGYctuybTQTwLpjenA1QFHeyJw/OyggGbtUJUy+833+ldnAwcPVML2aXJKUKv3APGI8vq1kaloyNku3Q== dependencies: - "@aws-sdk/property-provider" "3.78.0" - "@aws-sdk/shared-ini-file-loader" "3.80.0" - "@aws-sdk/types" "3.78.0" + "@aws-sdk/property-provider" "3.110.0" + "@aws-sdk/shared-ini-file-loader" "3.110.0" + "@aws-sdk/types" "3.110.0" tslib "^2.3.1" -"@aws-sdk/node-http-handler@3.94.0": - version "3.94.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/node-http-handler/-/node-http-handler-3.94.0.tgz#0bfbfec24f9465afddb876c50fd09ce00dfa4226" - integrity sha512-g9q6k+PS+BrtOzt8jrBWr9D543uB3ZoYZ2JCriwuCwnP4uIHlMf9wAOGcOgqgykfUAPBOLvz2rTwVs3Xl8GUmQ== +"@aws-sdk/node-http-handler@3.118.1": + version "3.118.1" + resolved "https://registry.yarnpkg.com/@aws-sdk/node-http-handler/-/node-http-handler-3.118.1.tgz#8f71c1b4dffae4cbec1151910c2d6fbf7b966706" + integrity sha512-pfWVAUNJEs0UW0KkDqq2/VCz9PIpvg4mYEfCVZ4jR+Rv8F7UezNeM3FrEdHk8dfYShH+OV0hFskHBQJhw1BX2Q== dependencies: - "@aws-sdk/abort-controller" "3.78.0" - "@aws-sdk/protocol-http" "3.78.0" - "@aws-sdk/querystring-builder" "3.78.0" - "@aws-sdk/types" "3.78.0" + "@aws-sdk/abort-controller" "3.110.0" + "@aws-sdk/protocol-http" "3.110.0" + "@aws-sdk/querystring-builder" "3.110.0" + "@aws-sdk/types" "3.110.0" tslib "^2.3.1" -"@aws-sdk/property-provider@3.78.0": - version "3.78.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/property-provider/-/property-provider-3.78.0.tgz#f12341fa87da2b54daac95f623bf7ede1754f8ae" - integrity sha512-PZpLvV0hF6lqg3CSN9YmphrB/t5LVJVWGJLB9d9qm7sJs5ksjTYBb5bY91OQ3zit0F4cqBMU8xt2GQ9J6d4DvQ== +"@aws-sdk/property-provider@3.110.0": + version "3.110.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/property-provider/-/property-provider-3.110.0.tgz#ea60c33a8e243246fc21d478ff009063825b9abd" + integrity sha512-7NkpmYeOkK3mhWBNU+/zSDqwzeaSPH1qrq4L//WV7WS/weYyE/jusQeZoOxVsuZQnQEXHt5O2hKVeUwShl12xA== dependencies: - "@aws-sdk/types" "3.78.0" + "@aws-sdk/types" "3.110.0" tslib "^2.3.1" -"@aws-sdk/protocol-http@3.78.0": - version "3.78.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/protocol-http/-/protocol-http-3.78.0.tgz#8a30db90e3373fe94e2b0007c3cba47b5c9e08bd" - integrity sha512-SQB26MhEK96yDxyXd3UAaxLz1Y/ZvgE4pzv7V3wZiokdEedM0kawHKEn1UQJlqJLEZcQI9QYyysh3rTvHZ3fyg== +"@aws-sdk/protocol-http@3.110.0": + version "3.110.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/protocol-http/-/protocol-http-3.110.0.tgz#ff3cffa5b1eb7c8564a9e9019a8842b429c7f85c" + integrity sha512-qdi2gCbJiyPyLn+afebPNp/5nVCRh1X7t7IRIFl3FHVEC+o54u/ojay/MLZ4M/+X9Fa4Zxsb0Wpp3T0xAHVDBg== dependencies: - "@aws-sdk/types" "3.78.0" + "@aws-sdk/types" "3.110.0" tslib "^2.3.1" -"@aws-sdk/querystring-builder@3.78.0": - version "3.78.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/querystring-builder/-/querystring-builder-3.78.0.tgz#29068c4d1fad056e26f848779a31335469cb0038" - integrity sha512-aib6RW1WAaTQDqVgRU1Ku9idkhm90gJKbCxVaGId+as6QHNUqMChEfK2v+0afuKiPNOs5uWmqvOXI9+Gt+UGDg== +"@aws-sdk/querystring-builder@3.110.0": + version "3.110.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/querystring-builder/-/querystring-builder-3.110.0.tgz#c7f63262e898ab38cdbbbfcd03ddbfde346c9595" + integrity sha512-7V3CDXj519izmbBn9ZE68ymASwGriA+Aq+cb/yHSVtffnvXjPtvONNw7G/5iVblisGLSCUe2hSvpYtcaXozbHw== dependencies: - "@aws-sdk/types" "3.78.0" + "@aws-sdk/types" "3.110.0" "@aws-sdk/util-uri-escape" "3.55.0" tslib "^2.3.1" -"@aws-sdk/querystring-parser@3.78.0": - version "3.78.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/querystring-parser/-/querystring-parser-3.78.0.tgz#4c76fe15ef2e9bbf4c387c83889d1c25d2c3a614" - integrity sha512-csaH8YTyN+KMNczeK6fBS8l7iJaqcQcKOIbpQFg5upX4Ly5A56HJn4sVQhY1LSgfSk4xRsNfMy5mu6BlsIiaXA== +"@aws-sdk/querystring-parser@3.110.0": + version "3.110.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/querystring-parser/-/querystring-parser-3.110.0.tgz#0551efb7aaa867d3b6705f62d798a45247f5f44b" + integrity sha512-//pJHH7hrhdDMZGBPKXKymmC/tJM7gFT0w/qbu/yd3Wm4W2fMB+8gkmj6EZctx7jrsWlfRQuvFejKqEfapur/g== dependencies: - "@aws-sdk/types" "3.78.0" + "@aws-sdk/types" "3.110.0" tslib "^2.3.1" -"@aws-sdk/service-error-classification@3.78.0": - version "3.78.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/service-error-classification/-/service-error-classification-3.78.0.tgz#8d3ac1064e39c180d9b764bb838c7f9de5615281" - integrity sha512-x7Lx8KWctJa01q4Q72Zb4ol9L/era3vy2daASu8l2paHHxsAPBE0PThkvLdUSLZSzlHSVdh3YHESIsT++VsK4w== +"@aws-sdk/service-error-classification@3.110.0": + version "3.110.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/service-error-classification/-/service-error-classification-3.110.0.tgz#09398517d4ad9787bd0d904816bfe0ffd68b1f5f" + integrity sha512-ccgCE0pU/4RmXR6CP3fLAdhPAve7bK/yXBbGzpSHGAQOXqNxYzOsAvQ30Jg6X+qjLHsI/HR2pLIE65z4k6tynw== -"@aws-sdk/shared-ini-file-loader@3.80.0": - version "3.80.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-3.80.0.tgz#e3d1b0532e9a884e52f967717ba2666ca32bbd74" - integrity sha512-3d5EBJjnWWkjLK9skqLLHYbagtFaZZy+3jUTlbTuOKhlOwe8jF7CUM3j6I4JA6yXNcB3w0exDKKHa8w+l+05aA== +"@aws-sdk/shared-ini-file-loader@3.110.0": + version "3.110.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-3.110.0.tgz#f91b66e7084312df2b337cc990c9585e832fc2fc" + integrity sha512-E1ERoqEoG206XNBYWCKLgHkzCbTxdpDEGbsLET2DnvjFsT0s9p2dPvVux3bYl7JVAhyGduE+qcqWk7MzhFCBNQ== dependencies: tslib "^2.3.1" -"@aws-sdk/signature-v4-multi-region@3.88.0": - version "3.88.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.88.0.tgz#7102caacf3d4722dd1fa4dedbe05bef21064edc5" - integrity sha512-RBbyQRpohlIQiuZc5qAvwbXO0Bob9XhHFS/kuLh+DcyeaBp+m+Bt291FX1Ksz2A0Q3ETNM34LFt7kTOBtMvjIQ== +"@aws-sdk/signature-v4-multi-region@3.118.0": + version "3.118.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.118.0.tgz#2a61980dc1857b94b64936c5997ab9dac186f915" + integrity sha512-Uih3SR5d3XBeUtiMFkDERx7jLOZSXvVrhikA9p416FIPWZ5649sQ/esYsDvWBB39nbnYMx/QlsR+imCvh8XlhQ== dependencies: - "@aws-sdk/protocol-http" "3.78.0" - "@aws-sdk/signature-v4" "3.78.0" - "@aws-sdk/types" "3.78.0" + "@aws-sdk/protocol-http" "3.110.0" + "@aws-sdk/signature-v4" "3.110.0" + "@aws-sdk/types" "3.110.0" "@aws-sdk/util-arn-parser" "3.55.0" tslib "^2.3.1" -"@aws-sdk/signature-v4@3.78.0": - version "3.78.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/signature-v4/-/signature-v4-3.78.0.tgz#adb735b9604d4bb8e44d16f1baa87618d576013b" - integrity sha512-eePjRYuzKoi3VMr/lgrUEF1ytLeH4fA/NMCykr/uR6NMo4bSJA59KrFLYSM7SlWLRIyB0UvJqygVEvSxFluyDw== +"@aws-sdk/signature-v4@3.110.0": + version "3.110.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/signature-v4/-/signature-v4-3.110.0.tgz#9dba5d06345fa756b4c23deeec7086f6148a5bf1" + integrity sha512-utxxdllOnmQDhbpipnFAbuQ4c2pwefZ+2hi48jKvQRULQ2PO4nxLmdZm6B0FXaTijbKsyO7GrMik+EZ6mi3ARQ== dependencies: "@aws-sdk/is-array-buffer" "3.55.0" - "@aws-sdk/types" "3.78.0" - "@aws-sdk/util-hex-encoding" "3.58.0" - "@aws-sdk/util-middleware" "3.78.0" + "@aws-sdk/types" "3.110.0" + "@aws-sdk/util-hex-encoding" "3.109.0" + "@aws-sdk/util-middleware" "3.110.0" "@aws-sdk/util-uri-escape" "3.55.0" tslib "^2.3.1" -"@aws-sdk/smithy-client@3.99.0": - version "3.99.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/smithy-client/-/smithy-client-3.99.0.tgz#e9cd92e95983734b88204432a44ee52388af0e1c" - integrity sha512-N9xgCcwbOBZ4/WuROzlErExXV6+vFrFkNJzeBT31/avvrHXjxgxwQlMoXoQCfM8PyRuDuVSfZeoh1iIRfoxidA== +"@aws-sdk/smithy-client@3.110.0": + version "3.110.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/smithy-client/-/smithy-client-3.110.0.tgz#397c0e7ef56ffa058469c641b586978400c09dd7" + integrity sha512-gNLYrmdAe/1hVF2Nv2LF4OkL1A0a1o708pEMZHzql9xP164omRDaLrGDhz9tH7tsJEgLz+Bf4E8nTuISeDwvGg== dependencies: - "@aws-sdk/middleware-stack" "3.78.0" - "@aws-sdk/types" "3.78.0" + "@aws-sdk/middleware-stack" "3.110.0" + "@aws-sdk/types" "3.110.0" tslib "^2.3.1" -"@aws-sdk/types@3.78.0": - version "3.78.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/types/-/types-3.78.0.tgz#51dc80b2142ee20821fb9f476bdca6e541021443" - integrity sha512-I9PTlVNSbwhIgMfmDM5as1tqRIkVZunjVmfogb2WVVPp4CaX0Ll01S0FSMSLL9k6tcQLXqh45pFRjrxCl9WKdQ== +"@aws-sdk/types@3.110.0": + version "3.110.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/types/-/types-3.110.0.tgz#09404533b507925eadf9acf9c4356667048e45bd" + integrity sha512-dLVoqODU3laaqNFPyN1QLtlQnwX4gNPMXptEBIt/iJpuZf66IYJe6WCzVZGt4Zfa1CnUmrlA428AzdcA/KCr2A== "@aws-sdk/types@^3.1.0": version "3.46.0" resolved "https://registry.yarnpkg.com/@aws-sdk/types/-/types-3.46.0.tgz#4f64871a6e32547403e5b3229b66d318909619b3" integrity sha512-yhrkVVyv4RUt3KqDDyEayjBM5dRBtuS486THeqtSghUYNV7M/cW18TA3gdMC0pRGgUqfKrOysdBZjCyPrYNvuA== -"@aws-sdk/url-parser@3.78.0": - version "3.78.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/url-parser/-/url-parser-3.78.0.tgz#8903011fda4b04c1207df099a21eda1304573099" - integrity sha512-iQn2AjECUoJE0Ae9XtgHtGGKvUkvE8hhbktGopdj+zsPBe4WrBN2DgVxlKPPrBonG/YlcL1D7a5EXaujWSlUUw== +"@aws-sdk/url-parser@3.110.0": + version "3.110.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/url-parser/-/url-parser-3.110.0.tgz#87d5c0a6f6d2f29027c747c65d8a2846302bc792" + integrity sha512-tILFB8/Q73yzgO0dErJNnELmmBszd0E6FucwAnG3hfDefjqCBe09Q/1yhu2aARXyRmZa4AKp0sWcdwIWHc8dnA== dependencies: - "@aws-sdk/querystring-parser" "3.78.0" - "@aws-sdk/types" "3.78.0" + "@aws-sdk/querystring-parser" "3.110.0" + "@aws-sdk/types" "3.110.0" tslib "^2.3.1" "@aws-sdk/util-arn-parser@3.55.0": @@ -1153,10 +1163,10 @@ dependencies: tslib "^2.3.1" -"@aws-sdk/util-base64-browser@3.58.0": - version "3.58.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-base64-browser/-/util-base64-browser-3.58.0.tgz#e213f91a5d40dd2d048d340f1ab192ca86c1f40c" - integrity sha512-0ebsXIZNpu/fup9OgsFPnRKfCFbuuI9PPRzvP6twzLxUB0c/aix6Co7LGHFKcRKHZdaykoJMXArf8eHj2Nzv1Q== +"@aws-sdk/util-base64-browser@3.109.0": + version "3.109.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-base64-browser/-/util-base64-browser-3.109.0.tgz#e7faf5c4cbb88bc39b9c1c5a1a79e4c869e9f645" + integrity sha512-lAZ6fyDGiRLaIsKT9qh7P9FGuNyZ4gAbr1YOSQk/5mHtaTuUvxlPptZuInNM/0MPQm6lpcot00D8IWTucn4PbA== dependencies: tslib "^2.3.1" @@ -1190,46 +1200,46 @@ "@aws-sdk/is-array-buffer" "3.55.0" tslib "^2.3.1" -"@aws-sdk/util-config-provider@3.55.0": - version "3.55.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-config-provider/-/util-config-provider-3.55.0.tgz#720c6c0ac1aa8d14be29d1dee25e01eb4925c0ce" - integrity sha512-30dzofQQfx6tp1jVZkZ0DGRsT0wwC15nEysKRiAcjncM64A0Cm6sra77d0os3vbKiKoPCI/lMsFr4o3533+qvQ== +"@aws-sdk/util-config-provider@3.109.0": + version "3.109.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-config-provider/-/util-config-provider-3.109.0.tgz#7828b8894b2b23c289ffc5c106cbced7a5d6ee86" + integrity sha512-GrAZl/aBv0A28LkyNyq8SPJ5fmViCwz80fWLMeWx/6q5AbivuILogjlWwEZSvZ9zrlHOcFC0+AnCa5pQrjaslw== dependencies: tslib "^2.3.1" -"@aws-sdk/util-defaults-mode-browser@3.99.0": - version "3.99.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-defaults-mode-browser/-/util-defaults-mode-browser-3.99.0.tgz#4d5b71279e89a25b9dd1d44ab7631fecbe48c447" - integrity sha512-qSYjUGuN8n7Q/zAi0tzU4BrU389jQosXtjp7eHpLATl0pKGpaHx6rJNwbiNhvBhBEfmSgqsJ09b4gZUpUezHEw== +"@aws-sdk/util-defaults-mode-browser@3.110.0": + version "3.110.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-defaults-mode-browser/-/util-defaults-mode-browser-3.110.0.tgz#b72331874da2c5e8a366cd98828a06fe19b52ae5" + integrity sha512-Y2dcOOD20S3bv/IjUqpdKIiDt6995SXNG5Pu/LeSdXNyLCOIm9rX4gHTxl9fC1KK5M/gR9fGJ362f67WwqEEqw== dependencies: - "@aws-sdk/property-provider" "3.78.0" - "@aws-sdk/types" "3.78.0" + "@aws-sdk/property-provider" "3.110.0" + "@aws-sdk/types" "3.110.0" bowser "^2.11.0" tslib "^2.3.1" -"@aws-sdk/util-defaults-mode-node@3.99.0": - version "3.99.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-defaults-mode-node/-/util-defaults-mode-node-3.99.0.tgz#72f75b02b337bc5bd221ab3504caa4709cf88c8f" - integrity sha512-8TUO0kEnQcgT1gAW9y9oO6a5gKhfEGEUeKidEgbTczEUrjr3aCXIC+p0DI5FJfImwPrTKXra8A22utDM92phWw== +"@aws-sdk/util-defaults-mode-node@3.110.0": + version "3.110.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-defaults-mode-node/-/util-defaults-mode-node-3.110.0.tgz#52b4c84fc7aa06838ea6bb29d216a2d7615b9036" + integrity sha512-Cr3Z5nyrw1KowjbW76xp8hkT/zJtYjAVZ9PS4l84KxIicbVvDOBpxG3yNddkuQcavmlH6G4wH9uM5DcnpKDncg== dependencies: - "@aws-sdk/config-resolver" "3.80.0" - "@aws-sdk/credential-provider-imds" "3.81.0" - "@aws-sdk/node-config-provider" "3.80.0" - "@aws-sdk/property-provider" "3.78.0" - "@aws-sdk/types" "3.78.0" + "@aws-sdk/config-resolver" "3.110.0" + "@aws-sdk/credential-provider-imds" "3.110.0" + "@aws-sdk/node-config-provider" "3.110.0" + "@aws-sdk/property-provider" "3.110.0" + "@aws-sdk/types" "3.110.0" tslib "^2.3.1" -"@aws-sdk/util-dynamodb@3.100.0", "@aws-sdk/util-dynamodb@^3.100.0": - version "3.100.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-dynamodb/-/util-dynamodb-3.100.0.tgz#abc21ca86ecf445aefc93108c2d19ae15c12da42" - integrity sha512-/i8HqHjjSpd1TA6RCJ1c0CtBXXgAi9gEDOUx1raILeZgRO0X/uK72u/N9+MOIeoSF5ZUWa4alJt2P282S2T3Jw== +"@aws-sdk/util-dynamodb@3.121.0", "@aws-sdk/util-dynamodb@^3.121.0": + version "3.121.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-dynamodb/-/util-dynamodb-3.121.0.tgz#8d6a5553b128cd4e7938cb37e099b5e87b3bc280" + integrity sha512-TS6lLCOS5Lb1AAkVH/eLOqdf5VcMh7hsWgbdS3dH7EfCK4sf0gu2WYT6DDuRY8xjmSA7K33qFKhffjZG8oyz3Q== dependencies: tslib "^2.3.1" -"@aws-sdk/util-hex-encoding@3.58.0": - version "3.58.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-hex-encoding/-/util-hex-encoding-3.58.0.tgz#d999eb19329933a94563881540a06d7ac7f515f5" - integrity sha512-Rl+jXUzk/FJkOLYfUVYPhKa2aUmTpeobRP31l8IatQltSzDgLyRHO35f6UEs7Ztn5s1jbu/POatLAZ2WjbgVyg== +"@aws-sdk/util-hex-encoding@3.109.0": + version "3.109.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-hex-encoding/-/util-hex-encoding-3.109.0.tgz#93b20acc27c0a1d7d80f653bf19d3dd01c2ccc65" + integrity sha512-s8CgTNrn3cLkrdiohfxLuOYPCanzvHn/aH5RW6DaMoeQiG5Hl9QUiP/WtdQ9QQx3xvpQFpmvxIaSBwSgFNLQxA== dependencies: tslib "^2.3.1" @@ -1240,27 +1250,27 @@ dependencies: tslib "^2.3.0" -"@aws-sdk/util-middleware@3.78.0": - version "3.78.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-middleware/-/util-middleware-3.78.0.tgz#d907a9b8b7878265cd3e3ee15996bc17de41db11" - integrity sha512-Hi3wv2b0VogO4mzyeEaeU5KgIt4qeo0LXU5gS6oRrG0T7s2FyKbMBkJW3YDh/Y8fNwqArZ+/QQFujpP0PIKwkA== +"@aws-sdk/util-middleware@3.110.0": + version "3.110.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-middleware/-/util-middleware-3.110.0.tgz#00a727273974f54424954235867c1ddb0f6dad56" + integrity sha512-PTVWrI5fA9d5hHJs6RzX2dIS2jRQ3uW073Fm0BePpQeDdZrEk+S5KNwRhUtpN6sdSV45vm6S9rrjZUG51qwGmA== dependencies: tslib "^2.3.1" -"@aws-sdk/util-stream-browser@3.78.0": - version "3.78.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-stream-browser/-/util-stream-browser-3.78.0.tgz#d4578ab9d1ff882f792f3381604c90718310405c" - integrity sha512-EcThf/sJoD4NYTUNO/nehR57lqkOuL6btRoVnm4LGUR8XgQcJ/WMYYgxOMY8E81xXzRFX2ukRHRxL2xmQsbHDw== +"@aws-sdk/util-stream-browser@3.110.0": + version "3.110.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-stream-browser/-/util-stream-browser-3.110.0.tgz#2b39667008b447a95a6b2c1dceaf99dd3807c8b3" + integrity sha512-kAMrHtgrhr6ODRnzt/V+LSDVDvejcbdUp19n4My2vrPwKw3lM65vT+FAPIlGeDQBtOOhmlTbrYM3G3KKnlnHyg== dependencies: - "@aws-sdk/types" "3.78.0" + "@aws-sdk/types" "3.110.0" tslib "^2.3.1" -"@aws-sdk/util-stream-node@3.78.0": - version "3.78.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-stream-node/-/util-stream-node-3.78.0.tgz#37b2f07e4ec3b325d93bd49c7eedf5d891c8d69b" - integrity sha512-CHfX37ioUyamAnlS2p4Nq+4BBjCSlZolFkVyxtVJwzPBBksdvjW67nKG+SShR48RBPJ5LEzbgAaEXNRktCSf6w== +"@aws-sdk/util-stream-node@3.110.0": + version "3.110.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-stream-node/-/util-stream-node-3.110.0.tgz#83089ff4c4b7dd6abaf6a489375cbd44765f4fb0" + integrity sha512-jgkO7aLRpE3EUqU5XUdo0FmlyBVCFHKyHd/jdEN8h9+XMa44rl2QMdOSFQtwaNI4NC8J+OC66u2dQ+8QQnOLig== dependencies: - "@aws-sdk/types" "3.78.0" + "@aws-sdk/types" "3.110.0" tslib "^2.3.1" "@aws-sdk/util-uri-escape@3.55.0": @@ -1270,28 +1280,28 @@ dependencies: tslib "^2.3.1" -"@aws-sdk/util-user-agent-browser@3.78.0": - version "3.78.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.78.0.tgz#12509ed9cc77624da0e0c017099565e37a5038d0" - integrity sha512-diGO/Bf4ggBOEnfD7lrrXaaXOwOXGz0bAJ0HhpizwEMlBld5zfDlWXjNpslh+8+u3EHRjPJQ16KGT6mp/Dm+aw== +"@aws-sdk/util-user-agent-browser@3.110.0": + version "3.110.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.110.0.tgz#e0643e6047aab5137540259a42fbfdc37ae4abee" + integrity sha512-rNdhmHDMV5dNJctqlBWimkZLJRB+x03DB+61pm+SKSFk6gPIVIvc1WNXqDFphkiswT4vA13ZUkGHzt+N4+noQQ== dependencies: - "@aws-sdk/types" "3.78.0" + "@aws-sdk/types" "3.110.0" bowser "^2.11.0" tslib "^2.3.1" -"@aws-sdk/util-user-agent-node@3.80.0": - version "3.80.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.80.0.tgz#269ea0f9bfab4f378af759afa9137936081f010a" - integrity sha512-QV26qIXws1m6sZXg65NS+XrQ5NhAzbDVQLtEVE4nC39UN8fuieP6Uet/gZm9mlLI9hllwvcV7EfgBM3GSC7pZg== +"@aws-sdk/util-user-agent-node@3.118.0": + version "3.118.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.118.0.tgz#5cb8d822ebe46b92101ff547ea373658d18ceb7b" + integrity sha512-7j21HNumxMkeUpgoMX8o3y66k+qMSEkCPCMGnoiiMtgfWX9SY0S/fLwR1nDBw8HI3NthRXfgWdAXUu8K3Kjp6g== dependencies: - "@aws-sdk/node-config-provider" "3.80.0" - "@aws-sdk/types" "3.78.0" + "@aws-sdk/node-config-provider" "3.110.0" + "@aws-sdk/types" "3.110.0" tslib "^2.3.1" -"@aws-sdk/util-utf8-browser@3.55.0": - version "3.55.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.55.0.tgz#a045bf1a93f6e0ff9c846631b168ea55bbb37668" - integrity sha512-ljzqJcyjfJpEVSIAxwtIS8xMRUly84BdjlBXyp6cu4G8TUufgjNS31LWdhyGhgmW5vYBNr+LTz0Kwf6J+ou7Ug== +"@aws-sdk/util-utf8-browser@3.109.0": + version "3.109.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.109.0.tgz#d013272e1981b23a4c84ac06f154db686c0cf84e" + integrity sha512-FmcGSz0v7Bqpl1SE8G1Gc0CtDpug+rvqNCG/szn86JApD/f5x8oByjbEiAyTU2ZH2VevUntx6EW68ulHyH+x+w== dependencies: tslib "^2.3.1" @@ -1302,27 +1312,27 @@ dependencies: tslib "^2.3.0" -"@aws-sdk/util-utf8-node@3.55.0": - version "3.55.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-utf8-node/-/util-utf8-node-3.55.0.tgz#44cf9f9c8624d144afd65ab8a1786e33134add15" - integrity sha512-FsFm7GFaC7j0tlPEm/ri8bU2QCwFW5WKjxUg8lm1oWaxplCpKGUsmcfPJ4sw58GIoyoGu4QXBK60oCWosZYYdQ== +"@aws-sdk/util-utf8-node@3.109.0": + version "3.109.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-utf8-node/-/util-utf8-node-3.109.0.tgz#89e06d916f5b246c7265f59bac742973ac0767ac" + integrity sha512-Ti/ZBdvz2eSTElsucjzNmzpyg2MwfD1rXmxD0hZuIF8bPON/0+sZYnWd5CbDw9kgmhy28dmKue086tbZ1G0iLQ== dependencies: "@aws-sdk/util-buffer-from" "3.55.0" tslib "^2.3.1" -"@aws-sdk/util-waiter@3.78.0", "@aws-sdk/util-waiter@^3.78.0": - version "3.78.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-waiter/-/util-waiter-3.78.0.tgz#5886f3e06ae6df9a12ef7079a6e75c76921ea4da" - integrity sha512-8pWd0XiNOS8AkWQyac8VNEI+gz/cGWlC2TAE2CJp0rOK5XhvlcNBINai4D6TxQ+9foyJXLOI1b8nuXemekoG8A== +"@aws-sdk/util-waiter@3.118.1", "@aws-sdk/util-waiter@^3.118.1": + version "3.118.1" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-waiter/-/util-waiter-3.118.1.tgz#eab970728e14cb31a6705e4daa4863751594bd53" + integrity sha512-mCPTpoNHXdBcGEk/8r90ppCB/DHUis+dZPDBDfCENRqcAYq9TDlTl9VB7jhgRkVUhM0HZGNAbUOaI+212jjPiQ== dependencies: - "@aws-sdk/abort-controller" "3.78.0" - "@aws-sdk/types" "3.78.0" + "@aws-sdk/abort-controller" "3.110.0" + "@aws-sdk/types" "3.110.0" tslib "^2.3.1" -"@aws-sdk/xml-builder@3.55.0": - version "3.55.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/xml-builder/-/xml-builder-3.55.0.tgz#8e14012ab3ed27cf68964abf1326d06c686b3511" - integrity sha512-BH+i5S2FLprmfSeIuGy3UbNtEoJPVjh8arl5+LV3i2KY/+TmrS4yT8JtztDlDxHF0cMtNLZNO0KEPtsACS6SOg== +"@aws-sdk/xml-builder@3.109.0": + version "3.109.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/xml-builder/-/xml-builder-3.109.0.tgz#dd2d3bf59d29a1c2968f477ec16680d47d81d921" + integrity sha512-+aAXynnrqya1Eukz4Gxch4xIXCZolIMWGD4Ll/Q5yXT5uAjGh2HQWd9J0LWE+gYChpWetZbAVYZ3cEJ6F+SpZA== dependencies: tslib "^2.3.1" diff --git a/lib/lambda-layers/nodejs-layer/nodejs/package.json b/lib/lambda-layers/nodejs-layer/nodejs/package.json index d8a561f..0c71cec 100644 --- a/lib/lambda-layers/nodejs-layer/nodejs/package.json +++ b/lib/lambda-layers/nodejs-layer/nodejs/package.json @@ -1,25 +1,25 @@ { "name": "aws-sso-extensions-for-enterprise-layer", - "version": "3.1.5", + "version": "3.1.6", "description": "AWS SSO Permissions Utility Layer", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "keywords": [], "dependencies": { - "@aws-sdk/client-dynamodb": "^3.100.0", - "@aws-sdk/client-identitystore": "^3.100.0", - "@aws-sdk/client-organizations": "^3.100.0", - "@aws-sdk/client-s3": "^3.100.0", - "@aws-sdk/client-sfn": "^3.100.0", - "@aws-sdk/client-sns": "^3.100.0", - "@aws-sdk/client-sqs": "^3.100.0", - "@aws-sdk/client-ssm": "^3.100.0", - "@aws-sdk/client-sso-admin": "^3.100.0", - "@aws-sdk/credential-providers": "^3.100.0", - "@aws-sdk/lib-dynamodb": "^3.100.0", - "@aws-sdk/util-dynamodb": "^3.100.0", - "@aws-sdk/util-waiter": "^3.78.0", + "@aws-sdk/client-dynamodb": "^3.121.0", + "@aws-sdk/client-identitystore": "^3.121.0", + "@aws-sdk/client-organizations": "^3.121.0", + "@aws-sdk/client-s3": "^3.121.0", + "@aws-sdk/client-sfn": "^3.121.0", + "@aws-sdk/client-sns": "^3.121.0", + "@aws-sdk/client-sqs": "^3.121.0", + "@aws-sdk/client-ssm": "^3.121.0", + "@aws-sdk/client-sso-admin": "^3.121.0", + "@aws-sdk/credential-providers": "^3.121.0", + "@aws-sdk/lib-dynamodb": "^3.121.0", + "@aws-sdk/util-dynamodb": "^3.121.0", + "@aws-sdk/util-waiter": "^3.118.1", "ajv": "^8.11.0", "json-diff": "^0.9.0", "uuid": "^8.3.2" diff --git a/lib/lambda-layers/nodejs-layer/nodejs/yarn.lock b/lib/lambda-layers/nodejs-layer/nodejs/yarn.lock index 96807ff..65d7d7b 100644 --- a/lib/lambda-layers/nodejs-layer/nodejs/yarn.lock +++ b/lib/lambda-layers/nodejs-layer/nodejs/yarn.lock @@ -87,20 +87,20 @@ "@aws-sdk/util-utf8-browser" "^3.0.0" tslib "^1.11.1" -"@aws-sdk/abort-controller@3.78.0": - version "3.78.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/abort-controller/-/abort-controller-3.78.0.tgz#f2b0f8d63954afe51136254f389a18dd24a8f6f3" - integrity sha512-iz1YLwM2feJUj/y97yO4XmDeTxs+yZ1XJwQgoawKuc8IDBKUutnJNCHL5jL04WUKU7Nrlq+Hr2fCTScFh2z9zg== +"@aws-sdk/abort-controller@3.110.0": + version "3.110.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/abort-controller/-/abort-controller-3.110.0.tgz#15b493b776ec4f7236c6ad6134a6fe87e9dc5292" + integrity sha512-zok/WEVuK7Jh6V9YeA56pNZtxUASon9LTkS7vE65A4UFmNkPGNBCNgoiBcbhWfxwrZ8wtXcQk6rtUut39831mA== dependencies: - "@aws-sdk/types" "3.78.0" + "@aws-sdk/types" "3.110.0" tslib "^2.3.1" -"@aws-sdk/chunked-blob-reader-native@3.58.0": - version "3.58.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/chunked-blob-reader-native/-/chunked-blob-reader-native-3.58.0.tgz#1db413c5c80b32e24f1b62b22e15e9ad74d75cda" - integrity sha512-+D3xnPD5985iphgAqgUerBDs371a2WzzoEVi7eHJUMMsP/gEnSTdSH0HNxsqhYv6CW4EdKtvDAQdAwA1VtCf2A== +"@aws-sdk/chunked-blob-reader-native@3.109.0": + version "3.109.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/chunked-blob-reader-native/-/chunked-blob-reader-native-3.109.0.tgz#4db2ec81faf38fe33cf9dd6f75641afe0826dcfd" + integrity sha512-Ybn3vDZ3CqGyprL2qdF6QZqoqlx8lA3qOJepobjuKKDRw+KgGxjUY4NvWe0R2MdRoduyaDj6uvhIay0S1MOSJQ== dependencies: - "@aws-sdk/util-base64-browser" "3.58.0" + "@aws-sdk/util-base64-browser" "3.109.0" tslib "^2.3.1" "@aws-sdk/chunked-blob-reader@3.55.0": @@ -110,624 +110,636 @@ dependencies: tslib "^2.3.1" -"@aws-sdk/client-cognito-identity@3.100.0": - version "3.100.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.100.0.tgz#ca8ed8991841467c9e807ce138cc15f4609ca4af" - integrity sha512-qW0FygDcZc8oWDMox+bOyetyNydsMzFgHgIuhGA/zpP8KgMZSHys0D3PFb+X/x39WVkkD20/3hNrJ2bf0/s7LA== +"@aws-sdk/client-cognito-identity@3.121.0": + version "3.121.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-cognito-identity/-/client-cognito-identity-3.121.0.tgz#362d24acd7b22b8abe17ddba409d53e2b7a68b8c" + integrity sha512-g+6XDjGtgehJ89rYtG7mPS+Jl80+WhHzV+arSAJrAsKBB3CnH5eo6kRu6/uBd+uqd9uCdFlIZ46dd8VR8OflpA== dependencies: "@aws-crypto/sha256-browser" "2.0.0" "@aws-crypto/sha256-js" "2.0.0" - "@aws-sdk/client-sts" "3.100.0" - "@aws-sdk/config-resolver" "3.80.0" - "@aws-sdk/credential-provider-node" "3.100.0" - "@aws-sdk/fetch-http-handler" "3.78.0" - "@aws-sdk/hash-node" "3.78.0" - "@aws-sdk/invalid-dependency" "3.78.0" - "@aws-sdk/middleware-content-length" "3.78.0" - "@aws-sdk/middleware-host-header" "3.78.0" - "@aws-sdk/middleware-logger" "3.78.0" - "@aws-sdk/middleware-retry" "3.80.0" - "@aws-sdk/middleware-serde" "3.78.0" - "@aws-sdk/middleware-signing" "3.78.0" - "@aws-sdk/middleware-stack" "3.78.0" - "@aws-sdk/middleware-user-agent" "3.78.0" - "@aws-sdk/node-config-provider" "3.80.0" - "@aws-sdk/node-http-handler" "3.94.0" - "@aws-sdk/protocol-http" "3.78.0" - "@aws-sdk/smithy-client" "3.99.0" - "@aws-sdk/types" "3.78.0" - "@aws-sdk/url-parser" "3.78.0" - "@aws-sdk/util-base64-browser" "3.58.0" + "@aws-sdk/client-sts" "3.121.0" + "@aws-sdk/config-resolver" "3.110.0" + "@aws-sdk/credential-provider-node" "3.121.0" + "@aws-sdk/fetch-http-handler" "3.110.0" + "@aws-sdk/hash-node" "3.110.0" + "@aws-sdk/invalid-dependency" "3.110.0" + "@aws-sdk/middleware-content-length" "3.110.0" + "@aws-sdk/middleware-host-header" "3.110.0" + "@aws-sdk/middleware-logger" "3.110.0" + "@aws-sdk/middleware-recursion-detection" "3.110.0" + "@aws-sdk/middleware-retry" "3.118.1" + "@aws-sdk/middleware-serde" "3.110.0" + "@aws-sdk/middleware-signing" "3.110.0" + "@aws-sdk/middleware-stack" "3.110.0" + "@aws-sdk/middleware-user-agent" "3.110.0" + "@aws-sdk/node-config-provider" "3.110.0" + "@aws-sdk/node-http-handler" "3.118.1" + "@aws-sdk/protocol-http" "3.110.0" + "@aws-sdk/smithy-client" "3.110.0" + "@aws-sdk/types" "3.110.0" + "@aws-sdk/url-parser" "3.110.0" + "@aws-sdk/util-base64-browser" "3.109.0" "@aws-sdk/util-base64-node" "3.55.0" "@aws-sdk/util-body-length-browser" "3.55.0" "@aws-sdk/util-body-length-node" "3.55.0" - "@aws-sdk/util-defaults-mode-browser" "3.99.0" - "@aws-sdk/util-defaults-mode-node" "3.99.0" - "@aws-sdk/util-user-agent-browser" "3.78.0" - "@aws-sdk/util-user-agent-node" "3.80.0" - "@aws-sdk/util-utf8-browser" "3.55.0" - "@aws-sdk/util-utf8-node" "3.55.0" + "@aws-sdk/util-defaults-mode-browser" "3.110.0" + "@aws-sdk/util-defaults-mode-node" "3.110.0" + "@aws-sdk/util-user-agent-browser" "3.110.0" + "@aws-sdk/util-user-agent-node" "3.118.0" + "@aws-sdk/util-utf8-browser" "3.109.0" + "@aws-sdk/util-utf8-node" "3.109.0" tslib "^2.3.1" -"@aws-sdk/client-dynamodb@^3.100.0": - version "3.100.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-dynamodb/-/client-dynamodb-3.100.0.tgz#1cad3f4ddac33c823567188a976f4d061fa3766a" - integrity sha512-0/PDutv4DDEpckH89x0hn6yFJGjtGhV+JnVimMw0dT+f+plWt706RTqPKgLCPftKTEDWncoQlSux+FO7vvXb4Q== +"@aws-sdk/client-dynamodb@^3.121.0": + version "3.121.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-dynamodb/-/client-dynamodb-3.121.0.tgz#72e06b036bf02a2521e1a443a9f8b1be8dcd655d" + integrity sha512-j5JgFagsyAoE7HxRD4Iis7IFmIV1W1fXeRZiQ6f5OwMlvhcnpacXPsVoxZfag4wz58WTuaJXbRiD5k5xxqTYvQ== dependencies: "@aws-crypto/sha256-browser" "2.0.0" "@aws-crypto/sha256-js" "2.0.0" - "@aws-sdk/client-sts" "3.100.0" - "@aws-sdk/config-resolver" "3.80.0" - "@aws-sdk/credential-provider-node" "3.100.0" - "@aws-sdk/fetch-http-handler" "3.78.0" - "@aws-sdk/hash-node" "3.78.0" - "@aws-sdk/invalid-dependency" "3.78.0" - "@aws-sdk/middleware-content-length" "3.78.0" - "@aws-sdk/middleware-endpoint-discovery" "3.80.0" - "@aws-sdk/middleware-host-header" "3.78.0" - "@aws-sdk/middleware-logger" "3.78.0" - "@aws-sdk/middleware-retry" "3.80.0" - "@aws-sdk/middleware-serde" "3.78.0" - "@aws-sdk/middleware-signing" "3.78.0" - "@aws-sdk/middleware-stack" "3.78.0" - "@aws-sdk/middleware-user-agent" "3.78.0" - "@aws-sdk/node-config-provider" "3.80.0" - "@aws-sdk/node-http-handler" "3.94.0" - "@aws-sdk/protocol-http" "3.78.0" - "@aws-sdk/smithy-client" "3.99.0" - "@aws-sdk/types" "3.78.0" - "@aws-sdk/url-parser" "3.78.0" - "@aws-sdk/util-base64-browser" "3.58.0" + "@aws-sdk/client-sts" "3.121.0" + "@aws-sdk/config-resolver" "3.110.0" + "@aws-sdk/credential-provider-node" "3.121.0" + "@aws-sdk/fetch-http-handler" "3.110.0" + "@aws-sdk/hash-node" "3.110.0" + "@aws-sdk/invalid-dependency" "3.110.0" + "@aws-sdk/middleware-content-length" "3.110.0" + "@aws-sdk/middleware-endpoint-discovery" "3.110.0" + "@aws-sdk/middleware-host-header" "3.110.0" + "@aws-sdk/middleware-logger" "3.110.0" + "@aws-sdk/middleware-recursion-detection" "3.110.0" + "@aws-sdk/middleware-retry" "3.118.1" + "@aws-sdk/middleware-serde" "3.110.0" + "@aws-sdk/middleware-signing" "3.110.0" + "@aws-sdk/middleware-stack" "3.110.0" + "@aws-sdk/middleware-user-agent" "3.110.0" + "@aws-sdk/node-config-provider" "3.110.0" + "@aws-sdk/node-http-handler" "3.118.1" + "@aws-sdk/protocol-http" "3.110.0" + "@aws-sdk/smithy-client" "3.110.0" + "@aws-sdk/types" "3.110.0" + "@aws-sdk/url-parser" "3.110.0" + "@aws-sdk/util-base64-browser" "3.109.0" "@aws-sdk/util-base64-node" "3.55.0" "@aws-sdk/util-body-length-browser" "3.55.0" "@aws-sdk/util-body-length-node" "3.55.0" - "@aws-sdk/util-defaults-mode-browser" "3.99.0" - "@aws-sdk/util-defaults-mode-node" "3.99.0" - "@aws-sdk/util-user-agent-browser" "3.78.0" - "@aws-sdk/util-user-agent-node" "3.80.0" - "@aws-sdk/util-utf8-browser" "3.55.0" - "@aws-sdk/util-utf8-node" "3.55.0" - "@aws-sdk/util-waiter" "3.78.0" + "@aws-sdk/util-defaults-mode-browser" "3.110.0" + "@aws-sdk/util-defaults-mode-node" "3.110.0" + "@aws-sdk/util-user-agent-browser" "3.110.0" + "@aws-sdk/util-user-agent-node" "3.118.0" + "@aws-sdk/util-utf8-browser" "3.109.0" + "@aws-sdk/util-utf8-node" "3.109.0" + "@aws-sdk/util-waiter" "3.118.1" tslib "^2.3.1" uuid "^8.3.2" -"@aws-sdk/client-identitystore@^3.100.0": - version "3.100.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-identitystore/-/client-identitystore-3.100.0.tgz#870afb8fa1969c7ee12b4cd055c84561fc94bd35" - integrity sha512-Px/ZgFDIOKHD6ouecmfFsxcVrO0EuO6zjHca3PHBksvwRyMRNVZ9Q1mU+gmwsexYmqsiDfW8pAPCU1aHkLHWMw== +"@aws-sdk/client-identitystore@^3.121.0": + version "3.121.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-identitystore/-/client-identitystore-3.121.0.tgz#7b8437683f307afcfaa94258f587829f159d0930" + integrity sha512-eyu4NOVtsYO+4fUVerWvguQJDI6uB6D7+5g+ZW+rs3Rz5V71PsoOwOI0sNBwIBj/vqygn6a6QUku1ZT1CBFxDQ== dependencies: "@aws-crypto/sha256-browser" "2.0.0" "@aws-crypto/sha256-js" "2.0.0" - "@aws-sdk/client-sts" "3.100.0" - "@aws-sdk/config-resolver" "3.80.0" - "@aws-sdk/credential-provider-node" "3.100.0" - "@aws-sdk/fetch-http-handler" "3.78.0" - "@aws-sdk/hash-node" "3.78.0" - "@aws-sdk/invalid-dependency" "3.78.0" - "@aws-sdk/middleware-content-length" "3.78.0" - "@aws-sdk/middleware-host-header" "3.78.0" - "@aws-sdk/middleware-logger" "3.78.0" - "@aws-sdk/middleware-retry" "3.80.0" - "@aws-sdk/middleware-serde" "3.78.0" - "@aws-sdk/middleware-signing" "3.78.0" - "@aws-sdk/middleware-stack" "3.78.0" - "@aws-sdk/middleware-user-agent" "3.78.0" - "@aws-sdk/node-config-provider" "3.80.0" - "@aws-sdk/node-http-handler" "3.94.0" - "@aws-sdk/protocol-http" "3.78.0" - "@aws-sdk/smithy-client" "3.99.0" - "@aws-sdk/types" "3.78.0" - "@aws-sdk/url-parser" "3.78.0" - "@aws-sdk/util-base64-browser" "3.58.0" + "@aws-sdk/client-sts" "3.121.0" + "@aws-sdk/config-resolver" "3.110.0" + "@aws-sdk/credential-provider-node" "3.121.0" + "@aws-sdk/fetch-http-handler" "3.110.0" + "@aws-sdk/hash-node" "3.110.0" + "@aws-sdk/invalid-dependency" "3.110.0" + "@aws-sdk/middleware-content-length" "3.110.0" + "@aws-sdk/middleware-host-header" "3.110.0" + "@aws-sdk/middleware-logger" "3.110.0" + "@aws-sdk/middleware-recursion-detection" "3.110.0" + "@aws-sdk/middleware-retry" "3.118.1" + "@aws-sdk/middleware-serde" "3.110.0" + "@aws-sdk/middleware-signing" "3.110.0" + "@aws-sdk/middleware-stack" "3.110.0" + "@aws-sdk/middleware-user-agent" "3.110.0" + "@aws-sdk/node-config-provider" "3.110.0" + "@aws-sdk/node-http-handler" "3.118.1" + "@aws-sdk/protocol-http" "3.110.0" + "@aws-sdk/smithy-client" "3.110.0" + "@aws-sdk/types" "3.110.0" + "@aws-sdk/url-parser" "3.110.0" + "@aws-sdk/util-base64-browser" "3.109.0" "@aws-sdk/util-base64-node" "3.55.0" "@aws-sdk/util-body-length-browser" "3.55.0" "@aws-sdk/util-body-length-node" "3.55.0" - "@aws-sdk/util-defaults-mode-browser" "3.99.0" - "@aws-sdk/util-defaults-mode-node" "3.99.0" - "@aws-sdk/util-user-agent-browser" "3.78.0" - "@aws-sdk/util-user-agent-node" "3.80.0" - "@aws-sdk/util-utf8-browser" "3.55.0" - "@aws-sdk/util-utf8-node" "3.55.0" + "@aws-sdk/util-defaults-mode-browser" "3.110.0" + "@aws-sdk/util-defaults-mode-node" "3.110.0" + "@aws-sdk/util-user-agent-browser" "3.110.0" + "@aws-sdk/util-user-agent-node" "3.118.0" + "@aws-sdk/util-utf8-browser" "3.109.0" + "@aws-sdk/util-utf8-node" "3.109.0" tslib "^2.3.1" -"@aws-sdk/client-organizations@^3.100.0": - version "3.100.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-organizations/-/client-organizations-3.100.0.tgz#c2b837b3855927cd87238c86085657d13eaab426" - integrity sha512-PUya9XP1P6dC+4Rqmcn4iYb3ypRh6wnFn54k1VRJ5TUshwB1uG4bwLNXSoopz5Iz0Oel0e3ogMJ/5eD+QsTG3A== +"@aws-sdk/client-organizations@^3.121.0": + version "3.121.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-organizations/-/client-organizations-3.121.0.tgz#f830c2d7cbd3039cc52dcd33c83c79cd0cdd32c5" + integrity sha512-gYJKo9lPs9A/uxnSw8WV9sw2svyfeepMjb5mjoyC3+7F6KVhxIrlI0HitoOIqZDOD4G9NKdED6Pbu4st2AYTZw== dependencies: "@aws-crypto/sha256-browser" "2.0.0" "@aws-crypto/sha256-js" "2.0.0" - "@aws-sdk/client-sts" "3.100.0" - "@aws-sdk/config-resolver" "3.80.0" - "@aws-sdk/credential-provider-node" "3.100.0" - "@aws-sdk/fetch-http-handler" "3.78.0" - "@aws-sdk/hash-node" "3.78.0" - "@aws-sdk/invalid-dependency" "3.78.0" - "@aws-sdk/middleware-content-length" "3.78.0" - "@aws-sdk/middleware-host-header" "3.78.0" - "@aws-sdk/middleware-logger" "3.78.0" - "@aws-sdk/middleware-retry" "3.80.0" - "@aws-sdk/middleware-serde" "3.78.0" - "@aws-sdk/middleware-signing" "3.78.0" - "@aws-sdk/middleware-stack" "3.78.0" - "@aws-sdk/middleware-user-agent" "3.78.0" - "@aws-sdk/node-config-provider" "3.80.0" - "@aws-sdk/node-http-handler" "3.94.0" - "@aws-sdk/protocol-http" "3.78.0" - "@aws-sdk/smithy-client" "3.99.0" - "@aws-sdk/types" "3.78.0" - "@aws-sdk/url-parser" "3.78.0" - "@aws-sdk/util-base64-browser" "3.58.0" + "@aws-sdk/client-sts" "3.121.0" + "@aws-sdk/config-resolver" "3.110.0" + "@aws-sdk/credential-provider-node" "3.121.0" + "@aws-sdk/fetch-http-handler" "3.110.0" + "@aws-sdk/hash-node" "3.110.0" + "@aws-sdk/invalid-dependency" "3.110.0" + "@aws-sdk/middleware-content-length" "3.110.0" + "@aws-sdk/middleware-host-header" "3.110.0" + "@aws-sdk/middleware-logger" "3.110.0" + "@aws-sdk/middleware-recursion-detection" "3.110.0" + "@aws-sdk/middleware-retry" "3.118.1" + "@aws-sdk/middleware-serde" "3.110.0" + "@aws-sdk/middleware-signing" "3.110.0" + "@aws-sdk/middleware-stack" "3.110.0" + "@aws-sdk/middleware-user-agent" "3.110.0" + "@aws-sdk/node-config-provider" "3.110.0" + "@aws-sdk/node-http-handler" "3.118.1" + "@aws-sdk/protocol-http" "3.110.0" + "@aws-sdk/smithy-client" "3.110.0" + "@aws-sdk/types" "3.110.0" + "@aws-sdk/url-parser" "3.110.0" + "@aws-sdk/util-base64-browser" "3.109.0" "@aws-sdk/util-base64-node" "3.55.0" "@aws-sdk/util-body-length-browser" "3.55.0" "@aws-sdk/util-body-length-node" "3.55.0" - "@aws-sdk/util-defaults-mode-browser" "3.99.0" - "@aws-sdk/util-defaults-mode-node" "3.99.0" - "@aws-sdk/util-user-agent-browser" "3.78.0" - "@aws-sdk/util-user-agent-node" "3.80.0" - "@aws-sdk/util-utf8-browser" "3.55.0" - "@aws-sdk/util-utf8-node" "3.55.0" + "@aws-sdk/util-defaults-mode-browser" "3.110.0" + "@aws-sdk/util-defaults-mode-node" "3.110.0" + "@aws-sdk/util-user-agent-browser" "3.110.0" + "@aws-sdk/util-user-agent-node" "3.118.0" + "@aws-sdk/util-utf8-browser" "3.109.0" + "@aws-sdk/util-utf8-node" "3.109.0" tslib "^2.3.1" -"@aws-sdk/client-s3@^3.100.0": - version "3.100.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-s3/-/client-s3-3.100.0.tgz#6cae596da29889848b009e34a4126842038906b0" - integrity sha512-UmgFdJabWtiUS4dWsC3kZ+ZMvH5QUUbDnLS8pT12duwLGt+xlWPn3PUkV8kL6qjG6XePLUgCqFTLjDD4tsTZNg== +"@aws-sdk/client-s3@^3.121.0": + version "3.121.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-s3/-/client-s3-3.121.0.tgz#12394dda433c878f10b0f3339f9637f12ebcb5b1" + integrity sha512-iJDqFCRNZM6+iF4E3zSCXKLDrDFxon8gzM0sK8TCkSSwa8Fhk/M/5OKslP9eKfJ1mzmh27IgFDoNnD5P59LbSQ== dependencies: "@aws-crypto/sha1-browser" "2.0.0" "@aws-crypto/sha256-browser" "2.0.0" "@aws-crypto/sha256-js" "2.0.0" - "@aws-sdk/client-sts" "3.100.0" - "@aws-sdk/config-resolver" "3.80.0" - "@aws-sdk/credential-provider-node" "3.100.0" - "@aws-sdk/eventstream-serde-browser" "3.78.0" - "@aws-sdk/eventstream-serde-config-resolver" "3.78.0" - "@aws-sdk/eventstream-serde-node" "3.78.0" - "@aws-sdk/fetch-http-handler" "3.78.0" - "@aws-sdk/hash-blob-browser" "3.78.0" - "@aws-sdk/hash-node" "3.78.0" - "@aws-sdk/hash-stream-node" "3.78.0" - "@aws-sdk/invalid-dependency" "3.78.0" - "@aws-sdk/md5-js" "3.78.0" - "@aws-sdk/middleware-bucket-endpoint" "3.80.0" - "@aws-sdk/middleware-content-length" "3.78.0" - "@aws-sdk/middleware-expect-continue" "3.78.0" - "@aws-sdk/middleware-flexible-checksums" "3.78.0" - "@aws-sdk/middleware-host-header" "3.78.0" - "@aws-sdk/middleware-location-constraint" "3.78.0" - "@aws-sdk/middleware-logger" "3.78.0" - "@aws-sdk/middleware-retry" "3.80.0" - "@aws-sdk/middleware-sdk-s3" "3.86.0" - "@aws-sdk/middleware-serde" "3.78.0" - "@aws-sdk/middleware-signing" "3.78.0" - "@aws-sdk/middleware-ssec" "3.78.0" - "@aws-sdk/middleware-stack" "3.78.0" - "@aws-sdk/middleware-user-agent" "3.78.0" - "@aws-sdk/node-config-provider" "3.80.0" - "@aws-sdk/node-http-handler" "3.94.0" - "@aws-sdk/protocol-http" "3.78.0" - "@aws-sdk/signature-v4-multi-region" "3.88.0" - "@aws-sdk/smithy-client" "3.99.0" - "@aws-sdk/types" "3.78.0" - "@aws-sdk/url-parser" "3.78.0" - "@aws-sdk/util-base64-browser" "3.58.0" + "@aws-sdk/client-sts" "3.121.0" + "@aws-sdk/config-resolver" "3.110.0" + "@aws-sdk/credential-provider-node" "3.121.0" + "@aws-sdk/eventstream-serde-browser" "3.120.0" + "@aws-sdk/eventstream-serde-config-resolver" "3.110.0" + "@aws-sdk/eventstream-serde-node" "3.120.0" + "@aws-sdk/fetch-http-handler" "3.110.0" + "@aws-sdk/hash-blob-browser" "3.110.0" + "@aws-sdk/hash-node" "3.110.0" + "@aws-sdk/hash-stream-node" "3.110.0" + "@aws-sdk/invalid-dependency" "3.110.0" + "@aws-sdk/md5-js" "3.110.0" + "@aws-sdk/middleware-bucket-endpoint" "3.110.0" + "@aws-sdk/middleware-content-length" "3.110.0" + "@aws-sdk/middleware-expect-continue" "3.113.0" + "@aws-sdk/middleware-flexible-checksums" "3.110.0" + "@aws-sdk/middleware-host-header" "3.110.0" + "@aws-sdk/middleware-location-constraint" "3.110.0" + "@aws-sdk/middleware-logger" "3.110.0" + "@aws-sdk/middleware-recursion-detection" "3.110.0" + "@aws-sdk/middleware-retry" "3.118.1" + "@aws-sdk/middleware-sdk-s3" "3.110.0" + "@aws-sdk/middleware-serde" "3.110.0" + "@aws-sdk/middleware-signing" "3.110.0" + "@aws-sdk/middleware-ssec" "3.110.0" + "@aws-sdk/middleware-stack" "3.110.0" + "@aws-sdk/middleware-user-agent" "3.110.0" + "@aws-sdk/node-config-provider" "3.110.0" + "@aws-sdk/node-http-handler" "3.118.1" + "@aws-sdk/protocol-http" "3.110.0" + "@aws-sdk/signature-v4-multi-region" "3.118.0" + "@aws-sdk/smithy-client" "3.110.0" + "@aws-sdk/types" "3.110.0" + "@aws-sdk/url-parser" "3.110.0" + "@aws-sdk/util-base64-browser" "3.109.0" "@aws-sdk/util-base64-node" "3.55.0" "@aws-sdk/util-body-length-browser" "3.55.0" "@aws-sdk/util-body-length-node" "3.55.0" - "@aws-sdk/util-defaults-mode-browser" "3.99.0" - "@aws-sdk/util-defaults-mode-node" "3.99.0" - "@aws-sdk/util-stream-browser" "3.78.0" - "@aws-sdk/util-stream-node" "3.78.0" - "@aws-sdk/util-user-agent-browser" "3.78.0" - "@aws-sdk/util-user-agent-node" "3.80.0" - "@aws-sdk/util-utf8-browser" "3.55.0" - "@aws-sdk/util-utf8-node" "3.55.0" - "@aws-sdk/util-waiter" "3.78.0" - "@aws-sdk/xml-builder" "3.55.0" + "@aws-sdk/util-defaults-mode-browser" "3.110.0" + "@aws-sdk/util-defaults-mode-node" "3.110.0" + "@aws-sdk/util-stream-browser" "3.110.0" + "@aws-sdk/util-stream-node" "3.110.0" + "@aws-sdk/util-user-agent-browser" "3.110.0" + "@aws-sdk/util-user-agent-node" "3.118.0" + "@aws-sdk/util-utf8-browser" "3.109.0" + "@aws-sdk/util-utf8-node" "3.109.0" + "@aws-sdk/util-waiter" "3.118.1" + "@aws-sdk/xml-builder" "3.109.0" entities "2.2.0" fast-xml-parser "3.19.0" tslib "^2.3.1" -"@aws-sdk/client-sfn@^3.100.0": - version "3.100.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-sfn/-/client-sfn-3.100.0.tgz#b92fa24663b7b14db2997cf8038a99bc8b78335b" - integrity sha512-beR5GBHHda1KhFGxQX5oeaM4g1T1S3Txkg35XYAO3HB4lP4SdfKkEjCaSmzFjQMwdtOysTNFOF7ai1fPOo5Jng== +"@aws-sdk/client-sfn@^3.121.0": + version "3.121.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-sfn/-/client-sfn-3.121.0.tgz#daee64225797e5aa4d26d0329fa42de3cec81879" + integrity sha512-Zm9pyQTvItw6iQg3zls+wD7b7SiWaSDRQqix+gbj8zIcNwcInlhmx9oy7mv9q3yQWcEQFgjgeZP8aIBtcH3z4g== dependencies: "@aws-crypto/sha256-browser" "2.0.0" "@aws-crypto/sha256-js" "2.0.0" - "@aws-sdk/client-sts" "3.100.0" - "@aws-sdk/config-resolver" "3.80.0" - "@aws-sdk/credential-provider-node" "3.100.0" - "@aws-sdk/fetch-http-handler" "3.78.0" - "@aws-sdk/hash-node" "3.78.0" - "@aws-sdk/invalid-dependency" "3.78.0" - "@aws-sdk/middleware-content-length" "3.78.0" - "@aws-sdk/middleware-host-header" "3.78.0" - "@aws-sdk/middleware-logger" "3.78.0" - "@aws-sdk/middleware-retry" "3.80.0" - "@aws-sdk/middleware-serde" "3.78.0" - "@aws-sdk/middleware-signing" "3.78.0" - "@aws-sdk/middleware-stack" "3.78.0" - "@aws-sdk/middleware-user-agent" "3.78.0" - "@aws-sdk/node-config-provider" "3.80.0" - "@aws-sdk/node-http-handler" "3.94.0" - "@aws-sdk/protocol-http" "3.78.0" - "@aws-sdk/smithy-client" "3.99.0" - "@aws-sdk/types" "3.78.0" - "@aws-sdk/url-parser" "3.78.0" - "@aws-sdk/util-base64-browser" "3.58.0" + "@aws-sdk/client-sts" "3.121.0" + "@aws-sdk/config-resolver" "3.110.0" + "@aws-sdk/credential-provider-node" "3.121.0" + "@aws-sdk/fetch-http-handler" "3.110.0" + "@aws-sdk/hash-node" "3.110.0" + "@aws-sdk/invalid-dependency" "3.110.0" + "@aws-sdk/middleware-content-length" "3.110.0" + "@aws-sdk/middleware-host-header" "3.110.0" + "@aws-sdk/middleware-logger" "3.110.0" + "@aws-sdk/middleware-recursion-detection" "3.110.0" + "@aws-sdk/middleware-retry" "3.118.1" + "@aws-sdk/middleware-serde" "3.110.0" + "@aws-sdk/middleware-signing" "3.110.0" + "@aws-sdk/middleware-stack" "3.110.0" + "@aws-sdk/middleware-user-agent" "3.110.0" + "@aws-sdk/node-config-provider" "3.110.0" + "@aws-sdk/node-http-handler" "3.118.1" + "@aws-sdk/protocol-http" "3.110.0" + "@aws-sdk/smithy-client" "3.110.0" + "@aws-sdk/types" "3.110.0" + "@aws-sdk/url-parser" "3.110.0" + "@aws-sdk/util-base64-browser" "3.109.0" "@aws-sdk/util-base64-node" "3.55.0" "@aws-sdk/util-body-length-browser" "3.55.0" "@aws-sdk/util-body-length-node" "3.55.0" - "@aws-sdk/util-defaults-mode-browser" "3.99.0" - "@aws-sdk/util-defaults-mode-node" "3.99.0" - "@aws-sdk/util-user-agent-browser" "3.78.0" - "@aws-sdk/util-user-agent-node" "3.80.0" - "@aws-sdk/util-utf8-browser" "3.55.0" - "@aws-sdk/util-utf8-node" "3.55.0" + "@aws-sdk/util-defaults-mode-browser" "3.110.0" + "@aws-sdk/util-defaults-mode-node" "3.110.0" + "@aws-sdk/util-user-agent-browser" "3.110.0" + "@aws-sdk/util-user-agent-node" "3.118.0" + "@aws-sdk/util-utf8-browser" "3.109.0" + "@aws-sdk/util-utf8-node" "3.109.0" tslib "^2.3.1" -"@aws-sdk/client-sns@^3.100.0": - version "3.100.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-sns/-/client-sns-3.100.0.tgz#d1dde8610dffad25d313460cd53198223cac58c3" - integrity sha512-QqfAXjic8wonh5a6l53+g281nygpxcHFL0Yf0hV7j6+erjYjSMnnEvKG8toX/pMxhrn6KQz8qH5yWecYJwms6g== +"@aws-sdk/client-sns@^3.121.0": + version "3.121.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-sns/-/client-sns-3.121.0.tgz#02fefaee2a5266e7d19cb14c1e77492ac55aef7b" + integrity sha512-Igxk0E1x1jbETS9nVSglnd3eu2xhAN1NIb1xe0h243H04Cqxu2Z31t2S/wHpAWLmQgyr+iJtYHWTqNqDQzQ4CQ== dependencies: "@aws-crypto/sha256-browser" "2.0.0" "@aws-crypto/sha256-js" "2.0.0" - "@aws-sdk/client-sts" "3.100.0" - "@aws-sdk/config-resolver" "3.80.0" - "@aws-sdk/credential-provider-node" "3.100.0" - "@aws-sdk/fetch-http-handler" "3.78.0" - "@aws-sdk/hash-node" "3.78.0" - "@aws-sdk/invalid-dependency" "3.78.0" - "@aws-sdk/middleware-content-length" "3.78.0" - "@aws-sdk/middleware-host-header" "3.78.0" - "@aws-sdk/middleware-logger" "3.78.0" - "@aws-sdk/middleware-retry" "3.80.0" - "@aws-sdk/middleware-serde" "3.78.0" - "@aws-sdk/middleware-signing" "3.78.0" - "@aws-sdk/middleware-stack" "3.78.0" - "@aws-sdk/middleware-user-agent" "3.78.0" - "@aws-sdk/node-config-provider" "3.80.0" - "@aws-sdk/node-http-handler" "3.94.0" - "@aws-sdk/protocol-http" "3.78.0" - "@aws-sdk/smithy-client" "3.99.0" - "@aws-sdk/types" "3.78.0" - "@aws-sdk/url-parser" "3.78.0" - "@aws-sdk/util-base64-browser" "3.58.0" + "@aws-sdk/client-sts" "3.121.0" + "@aws-sdk/config-resolver" "3.110.0" + "@aws-sdk/credential-provider-node" "3.121.0" + "@aws-sdk/fetch-http-handler" "3.110.0" + "@aws-sdk/hash-node" "3.110.0" + "@aws-sdk/invalid-dependency" "3.110.0" + "@aws-sdk/middleware-content-length" "3.110.0" + "@aws-sdk/middleware-host-header" "3.110.0" + "@aws-sdk/middleware-logger" "3.110.0" + "@aws-sdk/middleware-recursion-detection" "3.110.0" + "@aws-sdk/middleware-retry" "3.118.1" + "@aws-sdk/middleware-serde" "3.110.0" + "@aws-sdk/middleware-signing" "3.110.0" + "@aws-sdk/middleware-stack" "3.110.0" + "@aws-sdk/middleware-user-agent" "3.110.0" + "@aws-sdk/node-config-provider" "3.110.0" + "@aws-sdk/node-http-handler" "3.118.1" + "@aws-sdk/protocol-http" "3.110.0" + "@aws-sdk/smithy-client" "3.110.0" + "@aws-sdk/types" "3.110.0" + "@aws-sdk/url-parser" "3.110.0" + "@aws-sdk/util-base64-browser" "3.109.0" "@aws-sdk/util-base64-node" "3.55.0" "@aws-sdk/util-body-length-browser" "3.55.0" "@aws-sdk/util-body-length-node" "3.55.0" - "@aws-sdk/util-defaults-mode-browser" "3.99.0" - "@aws-sdk/util-defaults-mode-node" "3.99.0" - "@aws-sdk/util-user-agent-browser" "3.78.0" - "@aws-sdk/util-user-agent-node" "3.80.0" - "@aws-sdk/util-utf8-browser" "3.55.0" - "@aws-sdk/util-utf8-node" "3.55.0" + "@aws-sdk/util-defaults-mode-browser" "3.110.0" + "@aws-sdk/util-defaults-mode-node" "3.110.0" + "@aws-sdk/util-user-agent-browser" "3.110.0" + "@aws-sdk/util-user-agent-node" "3.118.0" + "@aws-sdk/util-utf8-browser" "3.109.0" + "@aws-sdk/util-utf8-node" "3.109.0" entities "2.2.0" fast-xml-parser "3.19.0" tslib "^2.3.1" -"@aws-sdk/client-sqs@^3.100.0": - version "3.100.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-sqs/-/client-sqs-3.100.0.tgz#ed10ceb7e1d6dc4394eb1490df4a5e25a0555a76" - integrity sha512-U0Fpmh20stzx72jxKc5c7trT59dvsYVeTI4LJ+1Ez0t+JkEwuuygqKwN4O1KTP0tCjovVFHWVMTjHw31JYfemQ== +"@aws-sdk/client-sqs@^3.121.0": + version "3.121.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-sqs/-/client-sqs-3.121.0.tgz#235d2b1cc227c7a8d4f709c67c77bb447d8cfad3" + integrity sha512-O9wYxB5/BxDEHxIUgy90onGG7EKQoNvwtw47yasQN6rfiE87xHItDmOunDT4xnK7nGwTILfmg28MdUDeBdDchQ== dependencies: "@aws-crypto/sha256-browser" "2.0.0" "@aws-crypto/sha256-js" "2.0.0" - "@aws-sdk/client-sts" "3.100.0" - "@aws-sdk/config-resolver" "3.80.0" - "@aws-sdk/credential-provider-node" "3.100.0" - "@aws-sdk/fetch-http-handler" "3.78.0" - "@aws-sdk/hash-node" "3.78.0" - "@aws-sdk/invalid-dependency" "3.78.0" - "@aws-sdk/md5-js" "3.78.0" - "@aws-sdk/middleware-content-length" "3.78.0" - "@aws-sdk/middleware-host-header" "3.78.0" - "@aws-sdk/middleware-logger" "3.78.0" - "@aws-sdk/middleware-retry" "3.80.0" - "@aws-sdk/middleware-sdk-sqs" "3.78.0" - "@aws-sdk/middleware-serde" "3.78.0" - "@aws-sdk/middleware-signing" "3.78.0" - "@aws-sdk/middleware-stack" "3.78.0" - "@aws-sdk/middleware-user-agent" "3.78.0" - "@aws-sdk/node-config-provider" "3.80.0" - "@aws-sdk/node-http-handler" "3.94.0" - "@aws-sdk/protocol-http" "3.78.0" - "@aws-sdk/smithy-client" "3.99.0" - "@aws-sdk/types" "3.78.0" - "@aws-sdk/url-parser" "3.78.0" - "@aws-sdk/util-base64-browser" "3.58.0" + "@aws-sdk/client-sts" "3.121.0" + "@aws-sdk/config-resolver" "3.110.0" + "@aws-sdk/credential-provider-node" "3.121.0" + "@aws-sdk/fetch-http-handler" "3.110.0" + "@aws-sdk/hash-node" "3.110.0" + "@aws-sdk/invalid-dependency" "3.110.0" + "@aws-sdk/md5-js" "3.110.0" + "@aws-sdk/middleware-content-length" "3.110.0" + "@aws-sdk/middleware-host-header" "3.110.0" + "@aws-sdk/middleware-logger" "3.110.0" + "@aws-sdk/middleware-recursion-detection" "3.110.0" + "@aws-sdk/middleware-retry" "3.118.1" + "@aws-sdk/middleware-sdk-sqs" "3.110.0" + "@aws-sdk/middleware-serde" "3.110.0" + "@aws-sdk/middleware-signing" "3.110.0" + "@aws-sdk/middleware-stack" "3.110.0" + "@aws-sdk/middleware-user-agent" "3.110.0" + "@aws-sdk/node-config-provider" "3.110.0" + "@aws-sdk/node-http-handler" "3.118.1" + "@aws-sdk/protocol-http" "3.110.0" + "@aws-sdk/smithy-client" "3.110.0" + "@aws-sdk/types" "3.110.0" + "@aws-sdk/url-parser" "3.110.0" + "@aws-sdk/util-base64-browser" "3.109.0" "@aws-sdk/util-base64-node" "3.55.0" "@aws-sdk/util-body-length-browser" "3.55.0" "@aws-sdk/util-body-length-node" "3.55.0" - "@aws-sdk/util-defaults-mode-browser" "3.99.0" - "@aws-sdk/util-defaults-mode-node" "3.99.0" - "@aws-sdk/util-user-agent-browser" "3.78.0" - "@aws-sdk/util-user-agent-node" "3.80.0" - "@aws-sdk/util-utf8-browser" "3.55.0" - "@aws-sdk/util-utf8-node" "3.55.0" + "@aws-sdk/util-defaults-mode-browser" "3.110.0" + "@aws-sdk/util-defaults-mode-node" "3.110.0" + "@aws-sdk/util-user-agent-browser" "3.110.0" + "@aws-sdk/util-user-agent-node" "3.118.0" + "@aws-sdk/util-utf8-browser" "3.109.0" + "@aws-sdk/util-utf8-node" "3.109.0" entities "2.2.0" fast-xml-parser "3.19.0" tslib "^2.3.1" -"@aws-sdk/client-ssm@^3.100.0": - version "3.100.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-ssm/-/client-ssm-3.100.0.tgz#6a993908bb2ac3f207862acd6ceb2395e2357938" - integrity sha512-dH/XjcUOGQ+lgYs9G3ezv+E8wknx8grKqCGTkC7VjJg/TqRM3O2/J+DZa9TzXWSesoPUqMNGRtMj/G0TjW27wA== +"@aws-sdk/client-ssm@^3.121.0": + version "3.121.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-ssm/-/client-ssm-3.121.0.tgz#4897ba35e1f166a35e43af47b870306afe7c4896" + integrity sha512-c26t40Km9GlJXzjxLwNrMfWnBM14bKBkoi71WNThQbxXiXphb4GOUGoEgyzRirX+XvMchqD8wS8HPvDBjuouhA== dependencies: "@aws-crypto/sha256-browser" "2.0.0" "@aws-crypto/sha256-js" "2.0.0" - "@aws-sdk/client-sts" "3.100.0" - "@aws-sdk/config-resolver" "3.80.0" - "@aws-sdk/credential-provider-node" "3.100.0" - "@aws-sdk/fetch-http-handler" "3.78.0" - "@aws-sdk/hash-node" "3.78.0" - "@aws-sdk/invalid-dependency" "3.78.0" - "@aws-sdk/middleware-content-length" "3.78.0" - "@aws-sdk/middleware-host-header" "3.78.0" - "@aws-sdk/middleware-logger" "3.78.0" - "@aws-sdk/middleware-retry" "3.80.0" - "@aws-sdk/middleware-serde" "3.78.0" - "@aws-sdk/middleware-signing" "3.78.0" - "@aws-sdk/middleware-stack" "3.78.0" - "@aws-sdk/middleware-user-agent" "3.78.0" - "@aws-sdk/node-config-provider" "3.80.0" - "@aws-sdk/node-http-handler" "3.94.0" - "@aws-sdk/protocol-http" "3.78.0" - "@aws-sdk/smithy-client" "3.99.0" - "@aws-sdk/types" "3.78.0" - "@aws-sdk/url-parser" "3.78.0" - "@aws-sdk/util-base64-browser" "3.58.0" + "@aws-sdk/client-sts" "3.121.0" + "@aws-sdk/config-resolver" "3.110.0" + "@aws-sdk/credential-provider-node" "3.121.0" + "@aws-sdk/fetch-http-handler" "3.110.0" + "@aws-sdk/hash-node" "3.110.0" + "@aws-sdk/invalid-dependency" "3.110.0" + "@aws-sdk/middleware-content-length" "3.110.0" + "@aws-sdk/middleware-host-header" "3.110.0" + "@aws-sdk/middleware-logger" "3.110.0" + "@aws-sdk/middleware-recursion-detection" "3.110.0" + "@aws-sdk/middleware-retry" "3.118.1" + "@aws-sdk/middleware-serde" "3.110.0" + "@aws-sdk/middleware-signing" "3.110.0" + "@aws-sdk/middleware-stack" "3.110.0" + "@aws-sdk/middleware-user-agent" "3.110.0" + "@aws-sdk/node-config-provider" "3.110.0" + "@aws-sdk/node-http-handler" "3.118.1" + "@aws-sdk/protocol-http" "3.110.0" + "@aws-sdk/smithy-client" "3.110.0" + "@aws-sdk/types" "3.110.0" + "@aws-sdk/url-parser" "3.110.0" + "@aws-sdk/util-base64-browser" "3.109.0" "@aws-sdk/util-base64-node" "3.55.0" "@aws-sdk/util-body-length-browser" "3.55.0" "@aws-sdk/util-body-length-node" "3.55.0" - "@aws-sdk/util-defaults-mode-browser" "3.99.0" - "@aws-sdk/util-defaults-mode-node" "3.99.0" - "@aws-sdk/util-user-agent-browser" "3.78.0" - "@aws-sdk/util-user-agent-node" "3.80.0" - "@aws-sdk/util-utf8-browser" "3.55.0" - "@aws-sdk/util-utf8-node" "3.55.0" - "@aws-sdk/util-waiter" "3.78.0" + "@aws-sdk/util-defaults-mode-browser" "3.110.0" + "@aws-sdk/util-defaults-mode-node" "3.110.0" + "@aws-sdk/util-user-agent-browser" "3.110.0" + "@aws-sdk/util-user-agent-node" "3.118.0" + "@aws-sdk/util-utf8-browser" "3.109.0" + "@aws-sdk/util-utf8-node" "3.109.0" + "@aws-sdk/util-waiter" "3.118.1" tslib "^2.3.1" uuid "^8.3.2" -"@aws-sdk/client-sso-admin@^3.100.0": - version "3.100.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-sso-admin/-/client-sso-admin-3.100.0.tgz#f8db57315caed7077a5bd2077083a8345ce1edc4" - integrity sha512-9BWnuNHpBYvw43gxWTp4r+T1TcOOYF/8Sr1eZsbVI38wFMbbwGcj0QLaAXzExQaTUMBDNy0JxvQ1Xxi1EBpDqA== +"@aws-sdk/client-sso-admin@^3.121.0": + version "3.121.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-sso-admin/-/client-sso-admin-3.121.0.tgz#81c58bee8a349faa46dd8cf877e3986aee3a642f" + integrity sha512-Kb5N+lsviuR18lNlbO9AUkfJNZcp4homopwDfYG1IFr/zXb1qG3OKL3csVPbOQR6jXnrc4lAGk3UBxBX9D0edw== dependencies: "@aws-crypto/sha256-browser" "2.0.0" "@aws-crypto/sha256-js" "2.0.0" - "@aws-sdk/client-sts" "3.100.0" - "@aws-sdk/config-resolver" "3.80.0" - "@aws-sdk/credential-provider-node" "3.100.0" - "@aws-sdk/fetch-http-handler" "3.78.0" - "@aws-sdk/hash-node" "3.78.0" - "@aws-sdk/invalid-dependency" "3.78.0" - "@aws-sdk/middleware-content-length" "3.78.0" - "@aws-sdk/middleware-host-header" "3.78.0" - "@aws-sdk/middleware-logger" "3.78.0" - "@aws-sdk/middleware-retry" "3.80.0" - "@aws-sdk/middleware-serde" "3.78.0" - "@aws-sdk/middleware-signing" "3.78.0" - "@aws-sdk/middleware-stack" "3.78.0" - "@aws-sdk/middleware-user-agent" "3.78.0" - "@aws-sdk/node-config-provider" "3.80.0" - "@aws-sdk/node-http-handler" "3.94.0" - "@aws-sdk/protocol-http" "3.78.0" - "@aws-sdk/smithy-client" "3.99.0" - "@aws-sdk/types" "3.78.0" - "@aws-sdk/url-parser" "3.78.0" - "@aws-sdk/util-base64-browser" "3.58.0" + "@aws-sdk/client-sts" "3.121.0" + "@aws-sdk/config-resolver" "3.110.0" + "@aws-sdk/credential-provider-node" "3.121.0" + "@aws-sdk/fetch-http-handler" "3.110.0" + "@aws-sdk/hash-node" "3.110.0" + "@aws-sdk/invalid-dependency" "3.110.0" + "@aws-sdk/middleware-content-length" "3.110.0" + "@aws-sdk/middleware-host-header" "3.110.0" + "@aws-sdk/middleware-logger" "3.110.0" + "@aws-sdk/middleware-recursion-detection" "3.110.0" + "@aws-sdk/middleware-retry" "3.118.1" + "@aws-sdk/middleware-serde" "3.110.0" + "@aws-sdk/middleware-signing" "3.110.0" + "@aws-sdk/middleware-stack" "3.110.0" + "@aws-sdk/middleware-user-agent" "3.110.0" + "@aws-sdk/node-config-provider" "3.110.0" + "@aws-sdk/node-http-handler" "3.118.1" + "@aws-sdk/protocol-http" "3.110.0" + "@aws-sdk/smithy-client" "3.110.0" + "@aws-sdk/types" "3.110.0" + "@aws-sdk/url-parser" "3.110.0" + "@aws-sdk/util-base64-browser" "3.109.0" "@aws-sdk/util-base64-node" "3.55.0" "@aws-sdk/util-body-length-browser" "3.55.0" "@aws-sdk/util-body-length-node" "3.55.0" - "@aws-sdk/util-defaults-mode-browser" "3.99.0" - "@aws-sdk/util-defaults-mode-node" "3.99.0" - "@aws-sdk/util-user-agent-browser" "3.78.0" - "@aws-sdk/util-user-agent-node" "3.80.0" - "@aws-sdk/util-utf8-browser" "3.55.0" - "@aws-sdk/util-utf8-node" "3.55.0" + "@aws-sdk/util-defaults-mode-browser" "3.110.0" + "@aws-sdk/util-defaults-mode-node" "3.110.0" + "@aws-sdk/util-user-agent-browser" "3.110.0" + "@aws-sdk/util-user-agent-node" "3.118.0" + "@aws-sdk/util-utf8-browser" "3.109.0" + "@aws-sdk/util-utf8-node" "3.109.0" tslib "^2.3.1" -"@aws-sdk/client-sso@3.100.0": - version "3.100.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-sso/-/client-sso-3.100.0.tgz#50fd953ff77f5f9cc1b67f2b6144016ef7e74112" - integrity sha512-nmBRUO5QfQ2IO8fHb37p8HT3n1ZooPb3sfTQejrpFH9Eq82VEOatIGt6yH3yTQ8+mhbabEhV5aY2wt/0D7wGVA== +"@aws-sdk/client-sso@3.121.0": + version "3.121.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-sso/-/client-sso-3.121.0.tgz#a0d26c03f0a58ffbce85bcc4cd0384f6c090d900" + integrity sha512-uYkeUdNnEla57g4QZT0Cu5ll+m0fUQJPkoTXQI5QKeLH2usVpmrCRbtTWEVTh94Gf2x/HK8Ifu7eO/0PquwwIQ== dependencies: "@aws-crypto/sha256-browser" "2.0.0" "@aws-crypto/sha256-js" "2.0.0" - "@aws-sdk/config-resolver" "3.80.0" - "@aws-sdk/fetch-http-handler" "3.78.0" - "@aws-sdk/hash-node" "3.78.0" - "@aws-sdk/invalid-dependency" "3.78.0" - "@aws-sdk/middleware-content-length" "3.78.0" - "@aws-sdk/middleware-host-header" "3.78.0" - "@aws-sdk/middleware-logger" "3.78.0" - "@aws-sdk/middleware-retry" "3.80.0" - "@aws-sdk/middleware-serde" "3.78.0" - "@aws-sdk/middleware-stack" "3.78.0" - "@aws-sdk/middleware-user-agent" "3.78.0" - "@aws-sdk/node-config-provider" "3.80.0" - "@aws-sdk/node-http-handler" "3.94.0" - "@aws-sdk/protocol-http" "3.78.0" - "@aws-sdk/smithy-client" "3.99.0" - "@aws-sdk/types" "3.78.0" - "@aws-sdk/url-parser" "3.78.0" - "@aws-sdk/util-base64-browser" "3.58.0" + "@aws-sdk/config-resolver" "3.110.0" + "@aws-sdk/fetch-http-handler" "3.110.0" + "@aws-sdk/hash-node" "3.110.0" + "@aws-sdk/invalid-dependency" "3.110.0" + "@aws-sdk/middleware-content-length" "3.110.0" + "@aws-sdk/middleware-host-header" "3.110.0" + "@aws-sdk/middleware-logger" "3.110.0" + "@aws-sdk/middleware-recursion-detection" "3.110.0" + "@aws-sdk/middleware-retry" "3.118.1" + "@aws-sdk/middleware-serde" "3.110.0" + "@aws-sdk/middleware-stack" "3.110.0" + "@aws-sdk/middleware-user-agent" "3.110.0" + "@aws-sdk/node-config-provider" "3.110.0" + "@aws-sdk/node-http-handler" "3.118.1" + "@aws-sdk/protocol-http" "3.110.0" + "@aws-sdk/smithy-client" "3.110.0" + "@aws-sdk/types" "3.110.0" + "@aws-sdk/url-parser" "3.110.0" + "@aws-sdk/util-base64-browser" "3.109.0" "@aws-sdk/util-base64-node" "3.55.0" "@aws-sdk/util-body-length-browser" "3.55.0" "@aws-sdk/util-body-length-node" "3.55.0" - "@aws-sdk/util-defaults-mode-browser" "3.99.0" - "@aws-sdk/util-defaults-mode-node" "3.99.0" - "@aws-sdk/util-user-agent-browser" "3.78.0" - "@aws-sdk/util-user-agent-node" "3.80.0" - "@aws-sdk/util-utf8-browser" "3.55.0" - "@aws-sdk/util-utf8-node" "3.55.0" + "@aws-sdk/util-defaults-mode-browser" "3.110.0" + "@aws-sdk/util-defaults-mode-node" "3.110.0" + "@aws-sdk/util-user-agent-browser" "3.110.0" + "@aws-sdk/util-user-agent-node" "3.118.0" + "@aws-sdk/util-utf8-browser" "3.109.0" + "@aws-sdk/util-utf8-node" "3.109.0" tslib "^2.3.1" -"@aws-sdk/client-sts@3.100.0": - version "3.100.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/client-sts/-/client-sts-3.100.0.tgz#147b65a91ebfa564ac58aef51e14b0ece8adb26c" - integrity sha512-WHy0e6COf6/LfMsYqG9H4SGaQRDjuckMtwOLtu6cYr4cro3bOU5pNuyEjAdUHCpuhZgiE6gkZozhTlxMJqIuRQ== +"@aws-sdk/client-sts@3.121.0": + version "3.121.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/client-sts/-/client-sts-3.121.0.tgz#258077598138a102b508519da6551949ea08c37b" + integrity sha512-ZqEcxfeYVeSo/VyXSI4XW4MsWYoRmEdxRLWwI7kgFQxgqwVtfhPmvcaw6CA1atMcSR6waiRSpe9pgpj6gKJvyw== dependencies: "@aws-crypto/sha256-browser" "2.0.0" "@aws-crypto/sha256-js" "2.0.0" - "@aws-sdk/config-resolver" "3.80.0" - "@aws-sdk/credential-provider-node" "3.100.0" - "@aws-sdk/fetch-http-handler" "3.78.0" - "@aws-sdk/hash-node" "3.78.0" - "@aws-sdk/invalid-dependency" "3.78.0" - "@aws-sdk/middleware-content-length" "3.78.0" - "@aws-sdk/middleware-host-header" "3.78.0" - "@aws-sdk/middleware-logger" "3.78.0" - "@aws-sdk/middleware-retry" "3.80.0" - "@aws-sdk/middleware-sdk-sts" "3.78.0" - "@aws-sdk/middleware-serde" "3.78.0" - "@aws-sdk/middleware-signing" "3.78.0" - "@aws-sdk/middleware-stack" "3.78.0" - "@aws-sdk/middleware-user-agent" "3.78.0" - "@aws-sdk/node-config-provider" "3.80.0" - "@aws-sdk/node-http-handler" "3.94.0" - "@aws-sdk/protocol-http" "3.78.0" - "@aws-sdk/smithy-client" "3.99.0" - "@aws-sdk/types" "3.78.0" - "@aws-sdk/url-parser" "3.78.0" - "@aws-sdk/util-base64-browser" "3.58.0" + "@aws-sdk/config-resolver" "3.110.0" + "@aws-sdk/credential-provider-node" "3.121.0" + "@aws-sdk/fetch-http-handler" "3.110.0" + "@aws-sdk/hash-node" "3.110.0" + "@aws-sdk/invalid-dependency" "3.110.0" + "@aws-sdk/middleware-content-length" "3.110.0" + "@aws-sdk/middleware-host-header" "3.110.0" + "@aws-sdk/middleware-logger" "3.110.0" + "@aws-sdk/middleware-recursion-detection" "3.110.0" + "@aws-sdk/middleware-retry" "3.118.1" + "@aws-sdk/middleware-sdk-sts" "3.110.0" + "@aws-sdk/middleware-serde" "3.110.0" + "@aws-sdk/middleware-signing" "3.110.0" + "@aws-sdk/middleware-stack" "3.110.0" + "@aws-sdk/middleware-user-agent" "3.110.0" + "@aws-sdk/node-config-provider" "3.110.0" + "@aws-sdk/node-http-handler" "3.118.1" + "@aws-sdk/protocol-http" "3.110.0" + "@aws-sdk/smithy-client" "3.110.0" + "@aws-sdk/types" "3.110.0" + "@aws-sdk/url-parser" "3.110.0" + "@aws-sdk/util-base64-browser" "3.109.0" "@aws-sdk/util-base64-node" "3.55.0" "@aws-sdk/util-body-length-browser" "3.55.0" "@aws-sdk/util-body-length-node" "3.55.0" - "@aws-sdk/util-defaults-mode-browser" "3.99.0" - "@aws-sdk/util-defaults-mode-node" "3.99.0" - "@aws-sdk/util-user-agent-browser" "3.78.0" - "@aws-sdk/util-user-agent-node" "3.80.0" - "@aws-sdk/util-utf8-browser" "3.55.0" - "@aws-sdk/util-utf8-node" "3.55.0" + "@aws-sdk/util-defaults-mode-browser" "3.110.0" + "@aws-sdk/util-defaults-mode-node" "3.110.0" + "@aws-sdk/util-user-agent-browser" "3.110.0" + "@aws-sdk/util-user-agent-node" "3.118.0" + "@aws-sdk/util-utf8-browser" "3.109.0" + "@aws-sdk/util-utf8-node" "3.109.0" entities "2.2.0" fast-xml-parser "3.19.0" tslib "^2.3.1" -"@aws-sdk/config-resolver@3.80.0": - version "3.80.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/config-resolver/-/config-resolver-3.80.0.tgz#a804aba4d4767402ab15640757c8c8bb2254eec1" - integrity sha512-vFruNKlmhsaC8yjnHmasi1WW/7EELlEuFTj4mqcqNqR4dfraf0maVvpqF1VSR8EstpFMsGYI5dmoWAnnG4PcLQ== +"@aws-sdk/config-resolver@3.110.0": + version "3.110.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/config-resolver/-/config-resolver-3.110.0.tgz#93de506934aa06dd973e5e3dab95b629697372f9" + integrity sha512-7VvtKy4CL63BAktQ2vgsjhWDSXpkXO5YdiI56LQnHztrvSuJBBaxJ7R1p/k0b2tEUhYKUziAIW8EKE/7EGPR4g== dependencies: - "@aws-sdk/signature-v4" "3.78.0" - "@aws-sdk/types" "3.78.0" - "@aws-sdk/util-config-provider" "3.55.0" - "@aws-sdk/util-middleware" "3.78.0" + "@aws-sdk/signature-v4" "3.110.0" + "@aws-sdk/types" "3.110.0" + "@aws-sdk/util-config-provider" "3.109.0" + "@aws-sdk/util-middleware" "3.110.0" tslib "^2.3.1" -"@aws-sdk/credential-provider-cognito-identity@3.100.0": - version "3.100.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.100.0.tgz#3d23c40af7ba58d01e91803e5dc594bf4147062b" - integrity sha512-fJO/XWqvdBPwVNLtUji8tMg7MBrP+G4gGNkH1MVJO4pmzh4Y38/a3ezFWBLbO0n0NctYQaZne0kZM12absPuUQ== +"@aws-sdk/credential-provider-cognito-identity@3.121.0": + version "3.121.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-cognito-identity/-/credential-provider-cognito-identity-3.121.0.tgz#5c4b0ecddc6b3375812c6be0759b8430397813a2" + integrity sha512-Tc7jAXZjnrJ9oWQz/YqjR+/DySM7Kt9+yxaUY0of+lakDucNGquRZ+xfEykyXGMgH2hHG0durT/tB+L7ekqAlQ== dependencies: - "@aws-sdk/client-cognito-identity" "3.100.0" - "@aws-sdk/property-provider" "3.78.0" - "@aws-sdk/types" "3.78.0" + "@aws-sdk/client-cognito-identity" "3.121.0" + "@aws-sdk/property-provider" "3.110.0" + "@aws-sdk/types" "3.110.0" tslib "^2.3.1" -"@aws-sdk/credential-provider-env@3.78.0": - version "3.78.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-env/-/credential-provider-env-3.78.0.tgz#e3013073bab0db313b0505d790aa79a35bd582d9" - integrity sha512-K41VTIzVHm2RyIwtBER8Hte3huUBXdV1WKO+i7olYVgLFmaqcZUNrlyoGDRqZcQ/u4AbxTzBU9jeMIbIfzMOWg== +"@aws-sdk/credential-provider-env@3.110.0": + version "3.110.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-env/-/credential-provider-env-3.110.0.tgz#c95552fc0a3ae857ced0e171e53082cf3c84bc74" + integrity sha512-oFU3IYk/Bl5tdsz1qigtm3I25a9cvXPqlE8VjYjxVDdLujF5zd/4HLbhP4GQWhpEwZmM1ijcSNfLcyywVevTZg== dependencies: - "@aws-sdk/property-provider" "3.78.0" - "@aws-sdk/types" "3.78.0" + "@aws-sdk/property-provider" "3.110.0" + "@aws-sdk/types" "3.110.0" tslib "^2.3.1" -"@aws-sdk/credential-provider-imds@3.81.0": - version "3.81.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-imds/-/credential-provider-imds-3.81.0.tgz#1ffd1219b7fd19eec4d4d4b5b06bda66e3bc210e" - integrity sha512-BHopP+gaovTYj+4tSrwCk8NNCR48gE9CWmpIOLkP9ell0gOL81Qh7aCEiIK0BZBZkccv1s16cYq1MSZZGS7PEQ== +"@aws-sdk/credential-provider-imds@3.110.0": + version "3.110.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-imds/-/credential-provider-imds-3.110.0.tgz#ba4f178ccab65c5760bce38e7f694584dad3fd74" + integrity sha512-atl+7/dAB+8fG9XI2fYyCgXKYDbOzot65VAwis+14bOEUCVp7PCJifBEZ/L8GEq564p+Fa2p1IpV0wuQXxqFUQ== dependencies: - "@aws-sdk/node-config-provider" "3.80.0" - "@aws-sdk/property-provider" "3.78.0" - "@aws-sdk/types" "3.78.0" - "@aws-sdk/url-parser" "3.78.0" + "@aws-sdk/node-config-provider" "3.110.0" + "@aws-sdk/property-provider" "3.110.0" + "@aws-sdk/types" "3.110.0" + "@aws-sdk/url-parser" "3.110.0" tslib "^2.3.1" -"@aws-sdk/credential-provider-ini@3.100.0": - version "3.100.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.100.0.tgz#5da9d935f1632cc0a32a1b5222a692e3dc78c1cb" - integrity sha512-2pCtth/Iv4mATRwb2g1nJdd9TolMyhTnhcskopukFvzp13VS5cgtz0hgYmJNnztTF8lpKJhJaidtKS5JJTWnHg== +"@aws-sdk/credential-provider-ini@3.121.0": + version "3.121.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.121.0.tgz#d87bfafb8671f04dddd1d2d04b64147040e9e3c7" + integrity sha512-wOuGOifwZtTN/prCaG+hO9AtpKjJB/QyRse251+I+inNPg2iSd9rCLfHZdmfL/Zn2XJyfg0ULOl6c/myF5aRDg== dependencies: - "@aws-sdk/credential-provider-env" "3.78.0" - "@aws-sdk/credential-provider-imds" "3.81.0" - "@aws-sdk/credential-provider-sso" "3.100.0" - "@aws-sdk/credential-provider-web-identity" "3.78.0" - "@aws-sdk/property-provider" "3.78.0" - "@aws-sdk/shared-ini-file-loader" "3.80.0" - "@aws-sdk/types" "3.78.0" + "@aws-sdk/credential-provider-env" "3.110.0" + "@aws-sdk/credential-provider-imds" "3.110.0" + "@aws-sdk/credential-provider-sso" "3.121.0" + "@aws-sdk/credential-provider-web-identity" "3.110.0" + "@aws-sdk/property-provider" "3.110.0" + "@aws-sdk/shared-ini-file-loader" "3.110.0" + "@aws-sdk/types" "3.110.0" tslib "^2.3.1" -"@aws-sdk/credential-provider-node@3.100.0": - version "3.100.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-node/-/credential-provider-node-3.100.0.tgz#8a5cab82c2943cf376986865f4d3a734f023eb44" - integrity sha512-PMIPnn/dhv9tlWR0qXnANJpTumujWfhKnLAsV3BUqB1K9IzWqz/zXjCT0jcSUTY8X/VkSuehtBdCKvOOM5mMqg== +"@aws-sdk/credential-provider-node@3.121.0": + version "3.121.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-node/-/credential-provider-node-3.121.0.tgz#a009c4f71fabc6cab1fc4f7fbae4f851403d9da9" + integrity sha512-wY5+oey0eoxkGMTXrZ+tK7FKA91WN8ntBbYBbZL0vktHYCQkBra5fBGV17RNp8ggVkJXAtDdrIjTBEQ/vNrMrQ== dependencies: - "@aws-sdk/credential-provider-env" "3.78.0" - "@aws-sdk/credential-provider-imds" "3.81.0" - "@aws-sdk/credential-provider-ini" "3.100.0" - "@aws-sdk/credential-provider-process" "3.80.0" - "@aws-sdk/credential-provider-sso" "3.100.0" - "@aws-sdk/credential-provider-web-identity" "3.78.0" - "@aws-sdk/property-provider" "3.78.0" - "@aws-sdk/shared-ini-file-loader" "3.80.0" - "@aws-sdk/types" "3.78.0" + "@aws-sdk/credential-provider-env" "3.110.0" + "@aws-sdk/credential-provider-imds" "3.110.0" + "@aws-sdk/credential-provider-ini" "3.121.0" + "@aws-sdk/credential-provider-process" "3.110.0" + "@aws-sdk/credential-provider-sso" "3.121.0" + "@aws-sdk/credential-provider-web-identity" "3.110.0" + "@aws-sdk/property-provider" "3.110.0" + "@aws-sdk/shared-ini-file-loader" "3.110.0" + "@aws-sdk/types" "3.110.0" tslib "^2.3.1" -"@aws-sdk/credential-provider-process@3.80.0": - version "3.80.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-process/-/credential-provider-process-3.80.0.tgz#625577774278f845fe5bd0f311ed53973ec92ede" - integrity sha512-3Ro+kMMyLUJHefOhGc5pOO/ibGcJi8bkj0z/Jtqd5I2Sm1qi7avoztST67/k48KMW1OqPnD/FUqxz5T8B2d+FQ== +"@aws-sdk/credential-provider-process@3.110.0": + version "3.110.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-process/-/credential-provider-process-3.110.0.tgz#1f4543edd532beb4b690e6f3aaf74d00af3be5c4" + integrity sha512-JJcZePvRTfQHYj/+EEY13yItnZH/e8exlARFUjN0L13UrgHpOJtDQBa+YBHXo6MbTFQh+re25z2kzc+zOYSMNQ== dependencies: - "@aws-sdk/property-provider" "3.78.0" - "@aws-sdk/shared-ini-file-loader" "3.80.0" - "@aws-sdk/types" "3.78.0" + "@aws-sdk/property-provider" "3.110.0" + "@aws-sdk/shared-ini-file-loader" "3.110.0" + "@aws-sdk/types" "3.110.0" tslib "^2.3.1" -"@aws-sdk/credential-provider-sso@3.100.0": - version "3.100.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.100.0.tgz#c930bb55565a9f0e580ddb0b9721e6fd9d8eafe7" - integrity sha512-DwJvrh77vBJ1/fS9z0i2QuIvSk4pATA4DH8AEWoQ8LQX97tp3es7gZV5Wu93wFsEyIYC8penz6pNVq5QajMk2A== +"@aws-sdk/credential-provider-sso@3.121.0": + version "3.121.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.121.0.tgz#8bac8420f280fcba0c2dd25af4925173bc979db3" + integrity sha512-c9XmnndZmJdkSBgDpVQCN8fcVTkRrtDWNUBO6TcA0abxGOOteUS7s9YmJKqMuwABzk+WGJ1B2EVC5b0AMzIFYg== dependencies: - "@aws-sdk/client-sso" "3.100.0" - "@aws-sdk/property-provider" "3.78.0" - "@aws-sdk/shared-ini-file-loader" "3.80.0" - "@aws-sdk/types" "3.78.0" + "@aws-sdk/client-sso" "3.121.0" + "@aws-sdk/property-provider" "3.110.0" + "@aws-sdk/shared-ini-file-loader" "3.110.0" + "@aws-sdk/types" "3.110.0" tslib "^2.3.1" -"@aws-sdk/credential-provider-web-identity@3.78.0": - version "3.78.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.78.0.tgz#61cc6c5c065de3d8d34b7633899e3bbfa9a24c9d" - integrity sha512-9/IvqHdJaVqMEABA8xZE3t5YF1S2PepfckVu0Ws9YUglj6oO+2QyVX6aRgMF1xph6781+Yc31TDh8/3eaDja7w== +"@aws-sdk/credential-provider-web-identity@3.110.0": + version "3.110.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.110.0.tgz#236e192826c3856e1f2b8eaa1ad126affd641082" + integrity sha512-e4e5u7v3fsUFZsMcFMhMy1NdJBQpunYcLwpYlszm3OEICwTTekQ+hVvnVRd134doHvzepE4yp9sAop0Cj+IRVQ== dependencies: - "@aws-sdk/property-provider" "3.78.0" - "@aws-sdk/types" "3.78.0" + "@aws-sdk/property-provider" "3.110.0" + "@aws-sdk/types" "3.110.0" tslib "^2.3.1" -"@aws-sdk/credential-providers@^3.100.0": - version "3.100.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/credential-providers/-/credential-providers-3.100.0.tgz#f5d87bf68fb0f3a4ce436be905653f22f10d5723" - integrity sha512-yKFDTX2nUAA509p7E4nNpt0de40m5rz6ZNxWPNA02wYgkD0DtZuRwn/9HwxQVWYcPQg8UKBd6U7yvw/wkXgHYg== +"@aws-sdk/credential-providers@^3.121.0": + version "3.121.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/credential-providers/-/credential-providers-3.121.0.tgz#64c6684917966264a4665f4e67531dfba9456309" + integrity sha512-IB8rfcVGhSLEHxgemDYxqtbDhZAq282oXjv4fctsijFfT55WKSsrQLxzS9iF50xi6NT+JwVzNL/re9XjG4mfaA== dependencies: - "@aws-sdk/client-cognito-identity" "3.100.0" - "@aws-sdk/client-sso" "3.100.0" - "@aws-sdk/client-sts" "3.100.0" - "@aws-sdk/credential-provider-cognito-identity" "3.100.0" - "@aws-sdk/credential-provider-env" "3.78.0" - "@aws-sdk/credential-provider-imds" "3.81.0" - "@aws-sdk/credential-provider-ini" "3.100.0" - "@aws-sdk/credential-provider-node" "3.100.0" - "@aws-sdk/credential-provider-process" "3.80.0" - "@aws-sdk/credential-provider-sso" "3.100.0" - "@aws-sdk/credential-provider-web-identity" "3.78.0" - "@aws-sdk/property-provider" "3.78.0" - "@aws-sdk/shared-ini-file-loader" "3.80.0" - "@aws-sdk/types" "3.78.0" + "@aws-sdk/client-cognito-identity" "3.121.0" + "@aws-sdk/client-sso" "3.121.0" + "@aws-sdk/client-sts" "3.121.0" + "@aws-sdk/credential-provider-cognito-identity" "3.121.0" + "@aws-sdk/credential-provider-env" "3.110.0" + "@aws-sdk/credential-provider-imds" "3.110.0" + "@aws-sdk/credential-provider-ini" "3.121.0" + "@aws-sdk/credential-provider-node" "3.121.0" + "@aws-sdk/credential-provider-process" "3.110.0" + "@aws-sdk/credential-provider-sso" "3.121.0" + "@aws-sdk/credential-provider-web-identity" "3.110.0" + "@aws-sdk/property-provider" "3.110.0" + "@aws-sdk/shared-ini-file-loader" "3.110.0" + "@aws-sdk/types" "3.110.0" tslib "^2.3.1" "@aws-sdk/endpoint-cache@3.55.0": @@ -738,97 +750,95 @@ mnemonist "0.38.3" tslib "^2.3.1" -"@aws-sdk/eventstream-marshaller@3.78.0": - version "3.78.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/eventstream-marshaller/-/eventstream-marshaller-3.78.0.tgz#32df7136d644d0d91a563a9a192b6e2d4df873d0" - integrity sha512-BMbRvLe6wNWQ+NO1pdPw3kGXXEdYV94BxEr3rTkKwr5yHpl8sUb/Va9sJJufUjzggpgE4vYu5nVsrT8ByMYXuA== +"@aws-sdk/eventstream-codec@3.119.0": + version "3.119.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/eventstream-codec/-/eventstream-codec-3.119.0.tgz#6eb5a645a38e0175fa054257addb54757bcf8d62" + integrity sha512-HMHVfsYU2yaJ2NMHe1HUhQnWD3hCabC3xTVcAx5SSAE+afc74xoQTCA6oDI6OoCLL47ISLjcrkpvfYCAZ7wHTw== dependencies: "@aws-crypto/crc32" "2.0.0" - "@aws-sdk/types" "3.78.0" - "@aws-sdk/util-hex-encoding" "3.58.0" + "@aws-sdk/types" "3.110.0" + "@aws-sdk/util-hex-encoding" "3.109.0" tslib "^2.3.1" -"@aws-sdk/eventstream-serde-browser@3.78.0": - version "3.78.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/eventstream-serde-browser/-/eventstream-serde-browser-3.78.0.tgz#27b019f6f17a54e18cd44041b29ef234cc04f545" - integrity sha512-ehQI2iLsj8MMskDRbrPB7SibIdJq6LleBP6ojT+cgrLJRbVXUOxK+3MPHDZVdGYx4ukVg48E1fA2DzVfAp7Emw== +"@aws-sdk/eventstream-serde-browser@3.120.0": + version "3.120.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/eventstream-serde-browser/-/eventstream-serde-browser-3.120.0.tgz#99b898ce852a3ef8633baca4cca42e1303d65fbd" + integrity sha512-+UUq5vey2mJx1NYhq4Gg/jzs5EJE6gW2g91NPcO842891YxZAOmHciFI5kzLKn8PgSKKhbmCL6pq8UqX4N8lRw== dependencies: - "@aws-sdk/eventstream-marshaller" "3.78.0" - "@aws-sdk/eventstream-serde-universal" "3.78.0" - "@aws-sdk/types" "3.78.0" + "@aws-sdk/eventstream-serde-universal" "3.120.0" + "@aws-sdk/types" "3.110.0" tslib "^2.3.1" -"@aws-sdk/eventstream-serde-config-resolver@3.78.0": - version "3.78.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-3.78.0.tgz#ea6d24d763413bc53da6230e06660382ba94a40c" - integrity sha512-iUG0wtZH/L7d6XfipwbhgjBHip0uTm9S27EasCn+g0CunbW6w7rXd7rfMqA+gSLVXPTBYjTMPIwRxrTCdRprwA== +"@aws-sdk/eventstream-serde-config-resolver@3.110.0": + version "3.110.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-3.110.0.tgz#5ec8dee49a595b6079fc52bc4355bc15626bb9de" + integrity sha512-0kyKUU5/46OGe6rgIqbNRJEQhNYwxLdgcJXlBl6q6CdgyQApz6jsAgG0C5xhSLSi4iJijDRriJTowAhkq4AlWQ== dependencies: - "@aws-sdk/types" "3.78.0" + "@aws-sdk/types" "3.110.0" tslib "^2.3.1" -"@aws-sdk/eventstream-serde-node@3.78.0": - version "3.78.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/eventstream-serde-node/-/eventstream-serde-node-3.78.0.tgz#138d99043b11b7cdfd63425b257fae64ec404374" - integrity sha512-H78LLoZEngZBSdk3lRQkAaR3cGsy/3UIjq9AFPeqoPVQtHkzBob1jVfE/5VSVAMhKLxWn8iqhRPS37AvyBGOwQ== +"@aws-sdk/eventstream-serde-node@3.120.0": + version "3.120.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/eventstream-serde-node/-/eventstream-serde-node-3.120.0.tgz#ff5cd01233e84813dce9cb5eda0dcb8efc9b034b" + integrity sha512-+RoUQKzB+MBH6nThLmc/VnmwNMzWxiCD8Z8KbGUG+1ybYqshSwGKObCqDfAIwe+W97xNZpsx4Br7/bcPEY322g== dependencies: - "@aws-sdk/eventstream-marshaller" "3.78.0" - "@aws-sdk/eventstream-serde-universal" "3.78.0" - "@aws-sdk/types" "3.78.0" + "@aws-sdk/eventstream-serde-universal" "3.120.0" + "@aws-sdk/types" "3.110.0" tslib "^2.3.1" -"@aws-sdk/eventstream-serde-universal@3.78.0": - version "3.78.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/eventstream-serde-universal/-/eventstream-serde-universal-3.78.0.tgz#9d7f3caf83cdc89ca7e3cf3a24734b0bbf43c81c" - integrity sha512-PZTLdyF923/1GJuMNtq9VMGd2vEx33HhsGInXvYtulKDSD5SgaTGj+Dz5wYepqL1gUEuXqZjBD71uZgrY/JgRg== +"@aws-sdk/eventstream-serde-universal@3.120.0": + version "3.120.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/eventstream-serde-universal/-/eventstream-serde-universal-3.120.0.tgz#9bc7b7a01f4ed94e2d89622917eb652fe97b94f2" + integrity sha512-2tZ5+3YlQRfsd0xibgVueWegengOMZIZF3ksq+IygWrRwukI9+QfC7oYe29/yttKoz2AipNKNY+JL9MgjHEdmg== dependencies: - "@aws-sdk/eventstream-marshaller" "3.78.0" - "@aws-sdk/types" "3.78.0" + "@aws-sdk/eventstream-codec" "3.119.0" + "@aws-sdk/types" "3.110.0" tslib "^2.3.1" -"@aws-sdk/fetch-http-handler@3.78.0": - version "3.78.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/fetch-http-handler/-/fetch-http-handler-3.78.0.tgz#9cd4a02eaf015b4a5a18552e8c9e8fbfce7219a3" - integrity sha512-cR6r2h2kJ1DNEZSXC6GknQB7OKmy+s9ZNV+g3AsNqkrUmNNOaHpFoSn+m6SC3qaclcGd0eQBpqzSu/TDn23Ihw== +"@aws-sdk/fetch-http-handler@3.110.0": + version "3.110.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/fetch-http-handler/-/fetch-http-handler-3.110.0.tgz#0b6d552659b779c49ba0f99c78a57755864bf1b0" + integrity sha512-vk+K4GeCZL2J2rtvKO+T0Q7i3MDpEGZBMg5K2tj9sMcEQwty0BF0aFnP7Eu2l4/Zif2z1mWuUFM2WcZI6DVnbw== dependencies: - "@aws-sdk/protocol-http" "3.78.0" - "@aws-sdk/querystring-builder" "3.78.0" - "@aws-sdk/types" "3.78.0" - "@aws-sdk/util-base64-browser" "3.58.0" + "@aws-sdk/protocol-http" "3.110.0" + "@aws-sdk/querystring-builder" "3.110.0" + "@aws-sdk/types" "3.110.0" + "@aws-sdk/util-base64-browser" "3.109.0" tslib "^2.3.1" -"@aws-sdk/hash-blob-browser@3.78.0": - version "3.78.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/hash-blob-browser/-/hash-blob-browser-3.78.0.tgz#6f774f58c59bb02749b7239a35be9cf61cc8520e" - integrity sha512-IEkA+t6qJEtEYEZgsqFRRITeZJ3mirw7IHJVHxwb86lpeufTVcbILI59B8/rhbqG+9dk0kWTjYSjC/ZdM+rgHA== +"@aws-sdk/hash-blob-browser@3.110.0": + version "3.110.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/hash-blob-browser/-/hash-blob-browser-3.110.0.tgz#9237d9cd239ed1e964cf567dd4d2891b30984417" + integrity sha512-NkTosjlYwP2dcBXY6yzhNafAK+W2nceheffvWdyGA29+E9YdRjDminXvKc/WAkZUMOW0CaCbD90otOiimAAYyQ== dependencies: "@aws-sdk/chunked-blob-reader" "3.55.0" - "@aws-sdk/chunked-blob-reader-native" "3.58.0" - "@aws-sdk/types" "3.78.0" + "@aws-sdk/chunked-blob-reader-native" "3.109.0" + "@aws-sdk/types" "3.110.0" tslib "^2.3.1" -"@aws-sdk/hash-node@3.78.0": - version "3.78.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/hash-node/-/hash-node-3.78.0.tgz#d03f804a685bc1cea9df3eabf499b2a7659d01fd" - integrity sha512-ev48yXaqZVtMeuKy52LUZPHCyKvkKQ9uiUebqkA+zFxIk+eN8SMPFHmsififIHWuS6ZkXBUSctjH9wmLebH60A== +"@aws-sdk/hash-node@3.110.0": + version "3.110.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/hash-node/-/hash-node-3.110.0.tgz#b225bfd16596b6485c1c610e8fef8de1e40931c4" + integrity sha512-wakl+kP2O8wTGYiQ3InZy+CVfGrIpFfq9fo4zif9PZac0BbUbguUU1dkY34uZiaf+4o2/9MoDYrHU2HYeXKxWw== dependencies: - "@aws-sdk/types" "3.78.0" + "@aws-sdk/types" "3.110.0" "@aws-sdk/util-buffer-from" "3.55.0" tslib "^2.3.1" -"@aws-sdk/hash-stream-node@3.78.0": - version "3.78.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/hash-stream-node/-/hash-stream-node-3.78.0.tgz#7b321a4ab4384bd51f19e626e5dae111b8fac4dd" - integrity sha512-y42Pm0Nk6zf/MI6acLFVFAMya0Ncvy6F6Xu5aYAmwIMIoMI0ctNeyuL/Dikgt8+oyxC+kORw+W9jtzgWj2zY/w== +"@aws-sdk/hash-stream-node@3.110.0": + version "3.110.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/hash-stream-node/-/hash-stream-node-3.110.0.tgz#786304b29d27a8e3814a49fb93208e8231ebca87" + integrity sha512-srlStn+dCnBlQy4oWBz3oFS8vT5Xgxhra91rt9U+vHruCyQ0L1es0J87X4uwy2HRlnIw3daPtVLtxekahEXzKQ== dependencies: - "@aws-sdk/types" "3.78.0" + "@aws-sdk/types" "3.110.0" tslib "^2.3.1" -"@aws-sdk/invalid-dependency@3.78.0": - version "3.78.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/invalid-dependency/-/invalid-dependency-3.78.0.tgz#c4e30871d69894dbf3450023319385110ce95c81" - integrity sha512-zUo+PbeRMN/Mzj6y+6p9qqk/znuFetT1gmpOcZGL9Rp2T+b9WJWd+daq5ktsL10sVCzIt2UvneJRz6b+aU+bfw== +"@aws-sdk/invalid-dependency@3.110.0": + version "3.110.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/invalid-dependency/-/invalid-dependency-3.110.0.tgz#9104dfd40e35b6737dc7ab01f4e79c76c1109c44" + integrity sha512-O8J1InmtJkoiUMbQDtxBfOzgigBp9iSVsNXQrhs2qHh3826cJOfE7NGT3u+NMw73Pk5j2cfmOh1+7k/76IqxOg== dependencies: - "@aws-sdk/types" "3.78.0" + "@aws-sdk/types" "3.110.0" tslib "^2.3.1" "@aws-sdk/is-array-buffer@3.55.0": @@ -838,312 +848,312 @@ dependencies: tslib "^2.3.1" -"@aws-sdk/lib-dynamodb@^3.100.0": - version "3.100.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/lib-dynamodb/-/lib-dynamodb-3.100.0.tgz#979a281b6eced05c8b94d65f8dbbd74f5207ed05" - integrity sha512-uc6Yb9SfxDdIgCV6LnQM3Y5m8aonpnvF2DUd6kU30taNIkL0TS9jnQxVpiUpeFbf6TKtvP2IvdbOI5yG0n2VYg== +"@aws-sdk/lib-dynamodb@^3.121.0": + version "3.121.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/lib-dynamodb/-/lib-dynamodb-3.121.0.tgz#3096bcbecc438f75a8fa5cc91a5c3df57650250e" + integrity sha512-DKW6RkfV0IR7i5cAhSbYf4JGLYCHZyuKa2O3RUUnm4ZMZm1y6ktPeydSxQQn0nMH4glsNHTiZ/EmLT0cnY7ZsQ== dependencies: - "@aws-sdk/util-dynamodb" "3.100.0" + "@aws-sdk/util-dynamodb" "3.121.0" tslib "^2.3.1" -"@aws-sdk/md5-js@3.78.0": - version "3.78.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/md5-js/-/md5-js-3.78.0.tgz#a79357e6518778057b7bcbbd45dcb352be5f8e15" - integrity sha512-vKOXJWJvv6QH6rnqMYEWzwAnMr4hfcmY8+t6BAuTcDpcEVF77e3bwUcaajXi2U0JMuNvnLwuJF3h6kL6aX4l6g== +"@aws-sdk/md5-js@3.110.0": + version "3.110.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/md5-js/-/md5-js-3.110.0.tgz#0a8745cbcaa609452d034e1b0edfa8f0cf45e2ae" + integrity sha512-66gV6CH8O7ymTZMIbGjdUI71K7ErDfudhtN/ULb97kD2TYX4NlFtxNZxx3+iZH1G0H636lWm9hJcU5ELG9B+bw== dependencies: - "@aws-sdk/types" "3.78.0" - "@aws-sdk/util-utf8-browser" "3.55.0" - "@aws-sdk/util-utf8-node" "3.55.0" + "@aws-sdk/types" "3.110.0" + "@aws-sdk/util-utf8-browser" "3.109.0" + "@aws-sdk/util-utf8-node" "3.109.0" tslib "^2.3.1" -"@aws-sdk/middleware-bucket-endpoint@3.80.0": - version "3.80.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.80.0.tgz#0632e94900472eb86d0cfdf521251a1bdefba843" - integrity sha512-FSSx6IgT7xftSlpjxoPKv8XI9nv7EK+OCODo2s3CmElMW1kBRdmQ/ImVuTwvqhdxJEVUeUdgupmC7cqyqgt04w== +"@aws-sdk/middleware-bucket-endpoint@3.110.0": + version "3.110.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.110.0.tgz#76e0dce1d16750340da76736c5737d790db1a95a" + integrity sha512-l1q0KzMRFyGSSc7LZGEh2xhCha1933C8uJE5g23b7dZdklEU5I62l4daELo+TBANcxFzDiRXd6g5mly/T+ZTSg== dependencies: - "@aws-sdk/protocol-http" "3.78.0" - "@aws-sdk/types" "3.78.0" + "@aws-sdk/protocol-http" "3.110.0" + "@aws-sdk/types" "3.110.0" "@aws-sdk/util-arn-parser" "3.55.0" - "@aws-sdk/util-config-provider" "3.55.0" + "@aws-sdk/util-config-provider" "3.109.0" tslib "^2.3.1" -"@aws-sdk/middleware-content-length@3.78.0": - version "3.78.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-content-length/-/middleware-content-length-3.78.0.tgz#57d46be61d1176d4c5fce7ba4b0682798c170208" - integrity sha512-5MpKt6lB9TdFy25/AGrpOjPY0iDHZAKpEHc+jSOJBXLl6xunXA7qHdiYaVqkWodLxy70nIckGNHqQ3drabidkA== +"@aws-sdk/middleware-content-length@3.110.0": + version "3.110.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-content-length/-/middleware-content-length-3.110.0.tgz#f4dc3508952c5fae9740f172d3b76135dd4dba37" + integrity sha512-hKU+zdqfAJQg22LXMVu/z35nNIHrVAKpVKPe9+WYVdL/Z7JKUPK7QymqKGOyDuDbzW6OxyulC1zKGEX12zGmdA== dependencies: - "@aws-sdk/protocol-http" "3.78.0" - "@aws-sdk/types" "3.78.0" + "@aws-sdk/protocol-http" "3.110.0" + "@aws-sdk/types" "3.110.0" tslib "^2.3.1" -"@aws-sdk/middleware-endpoint-discovery@3.80.0": - version "3.80.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-endpoint-discovery/-/middleware-endpoint-discovery-3.80.0.tgz#4a96324020efb24eec75f6207949119c98e097a8" - integrity sha512-73pKz8ossZKisG684raP1dn2u3fQRktWY29oa9Q3cBvRYdyu5UOhwayt2MObgSC8S6NfNdTGC/DGf7+/JRSY7A== +"@aws-sdk/middleware-endpoint-discovery@3.110.0": + version "3.110.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-endpoint-discovery/-/middleware-endpoint-discovery-3.110.0.tgz#3e9e18b4e191bb94e3068bd526fb766b02b4d777" + integrity sha512-GUnNcuEBqD21E8EgevTcaBXJGnH5dp7eDSfWceYJP+iSscFXLzFFOf1I6H0cwvfARVMHVvlFz0tQcojCSHUZig== dependencies: - "@aws-sdk/config-resolver" "3.80.0" + "@aws-sdk/config-resolver" "3.110.0" "@aws-sdk/endpoint-cache" "3.55.0" - "@aws-sdk/protocol-http" "3.78.0" - "@aws-sdk/types" "3.78.0" + "@aws-sdk/protocol-http" "3.110.0" + "@aws-sdk/types" "3.110.0" tslib "^2.3.1" -"@aws-sdk/middleware-expect-continue@3.78.0": - version "3.78.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.78.0.tgz#35df662ecf31a1c8540781154f514615f3ca2c97" - integrity sha512-IXfcSugFV3uNk50VQsN/Cm80iCsUSwcYJ5RzEwy7wXbZ+KM03xWXlbXzqkeTDnS74wLWSw09nKF3rkp1eyfDfg== +"@aws-sdk/middleware-expect-continue@3.113.0": + version "3.113.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.113.0.tgz#0129967f40ef57eec922ef8e126d77b90853a0fe" + integrity sha512-LLtSunCYVWeAhRP+6enn0kYF119WooV6gepMGOWeRCpKXO2iyi8YOx2Mtgc3T8ybiAG/dVlmZoX47Y1HINcuqg== dependencies: - "@aws-sdk/middleware-header-default" "3.78.0" - "@aws-sdk/protocol-http" "3.78.0" - "@aws-sdk/types" "3.78.0" + "@aws-sdk/protocol-http" "3.110.0" + "@aws-sdk/types" "3.110.0" tslib "^2.3.1" -"@aws-sdk/middleware-flexible-checksums@3.78.0": - version "3.78.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.78.0.tgz#9128b0acb5d9df0f0e0ef06cb1d17a44afe650fc" - integrity sha512-1jjxHcB3Le/2Z7BzugXzZnIwKGlUluNm0d1lB4fF2QVq3GHlA6e8uv0rCtqe/3wSsrzV6YzJ8vjioymKSNIjKQ== +"@aws-sdk/middleware-flexible-checksums@3.110.0": + version "3.110.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.110.0.tgz#bbf6009d45b7080e262a7351a86acf083ee22af1" + integrity sha512-Z/v1Da+e1McxrVr1s4jUykp2EXsOHpTxZ4M0X8vNkXCIVSuaMp4UI0P+LQawbDA+j3FaecqqBfWMZ2sHQ8bpoA== dependencies: "@aws-crypto/crc32" "2.0.0" "@aws-crypto/crc32c" "2.0.0" "@aws-sdk/is-array-buffer" "3.55.0" - "@aws-sdk/protocol-http" "3.78.0" - "@aws-sdk/types" "3.78.0" + "@aws-sdk/protocol-http" "3.110.0" + "@aws-sdk/types" "3.110.0" tslib "^2.3.1" -"@aws-sdk/middleware-header-default@3.78.0": - version "3.78.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-header-default/-/middleware-header-default-3.78.0.tgz#911b7f6ce4b4ae45ab032e32768d527ca6ae1d6c" - integrity sha512-USyOIF7ObBVMKbV/8lOBLDNwMAGdOtujd+RO/9dX6OQLceUTKIS1dOfJoYYwRHgengn7ikpDxoyROyspPYYDZQ== +"@aws-sdk/middleware-host-header@3.110.0": + version "3.110.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-host-header/-/middleware-host-header-3.110.0.tgz#a28115e2797b86c2fb583000593b723a51313b92" + integrity sha512-/Cknn1vL2LTlclI0MX2RzmtdPlCJ5palCRXxm/mod1oHwg4oNTKRlUX3LUD+L8g7JuJ4h053Ch9KS/A0vanE5Q== dependencies: - "@aws-sdk/protocol-http" "3.78.0" - "@aws-sdk/types" "3.78.0" + "@aws-sdk/protocol-http" "3.110.0" + "@aws-sdk/types" "3.110.0" tslib "^2.3.1" -"@aws-sdk/middleware-host-header@3.78.0": - version "3.78.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-host-header/-/middleware-host-header-3.78.0.tgz#9130d176c2839bc658aff01bf2a36fee705f0e86" - integrity sha512-1zL8uaDWGmH50c8B8jjz75e0ePj6/3QeZEhjJgTgL6DTdiqvRt32p3t+XWHW+yDI14fZZUYeTklAaLVxqFrHqQ== +"@aws-sdk/middleware-location-constraint@3.110.0": + version "3.110.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.110.0.tgz#0a710ac704cc7c40ca34edf62387d8ac1fdbdaae" + integrity sha512-8ZSo9sqrTMcSp0xEJQ3ypmQpeSMQl1NXXv72khJPweZqDoO0eAbfytwyH4JH4sP0VwVVmuDHdwPXyDZX7I0iQg== dependencies: - "@aws-sdk/protocol-http" "3.78.0" - "@aws-sdk/types" "3.78.0" + "@aws-sdk/types" "3.110.0" tslib "^2.3.1" -"@aws-sdk/middleware-location-constraint@3.78.0": - version "3.78.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.78.0.tgz#f3af44e443a0993e413a787a446bb6693b5b0e7e" - integrity sha512-m626H1WwXYJtwHEkV/2DsLlu1ckWq3j57NzsexZki3qS0nU8HEiDl6YYi+k84vDD4Qpba6EI9AdhzwnvZLXtGw== +"@aws-sdk/middleware-logger@3.110.0": + version "3.110.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-logger/-/middleware-logger-3.110.0.tgz#69eb0b2d0d9833f6fdbe33eb1876254e7cee53ec" + integrity sha512-+pz+a+8dfTnzLj79nHrv3aONMp/N36/erMd+7JXeR84QEosVLrFBUwKA8x5x6O3s1iBbQzRKMYEIuja9xn1BPA== dependencies: - "@aws-sdk/types" "3.78.0" + "@aws-sdk/types" "3.110.0" tslib "^2.3.1" -"@aws-sdk/middleware-logger@3.78.0": - version "3.78.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-logger/-/middleware-logger-3.78.0.tgz#758b84711213b2e78afe0df20bc2d4d70a856da1" - integrity sha512-GBhwxNjhCJUIeQQDaGasX/C23Jay77al2vRyGwmxf8no0DdFsa4J1Ik6/2hhIqkqko+WM4SpCnpZrY4MtnxNvA== +"@aws-sdk/middleware-recursion-detection@3.110.0": + version "3.110.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.110.0.tgz#8daa2bc9f62cbf499d9c615726cf2a51f46e70ff" + integrity sha512-Wav782zd7bcd1e6txRob76CDOdVOaUQ8HXoywiIm/uFrEEUZvhs2mgnXjVUVCMBUehdNgnL99z420aS13JeL/Q== dependencies: - "@aws-sdk/types" "3.78.0" + "@aws-sdk/protocol-http" "3.110.0" + "@aws-sdk/types" "3.110.0" tslib "^2.3.1" -"@aws-sdk/middleware-retry@3.80.0": - version "3.80.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-retry/-/middleware-retry-3.80.0.tgz#d62ebd68ded78bdaf0a8b07bb4cc1c394c99cc8f" - integrity sha512-CTk+tA4+WMUNOcUfR6UQrkhwvPYFpnMsQ1vuHlpLFOGG3nCqywA2hueLMRQmVcDXzP0sGeygce6dzRI9dJB/GA== +"@aws-sdk/middleware-retry@3.118.1": + version "3.118.1" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-retry/-/middleware-retry-3.118.1.tgz#a43799a113c89e76ce676490ecad91af96699fbe" + integrity sha512-Dh0EgO3yPHEaRC6CVrofgAMdUQaG0Kkl466iVFHN5n5kExQvCtvpMHwO9N7kqaq9lXten3yhzboRNLIo98E1Kw== dependencies: - "@aws-sdk/protocol-http" "3.78.0" - "@aws-sdk/service-error-classification" "3.78.0" - "@aws-sdk/types" "3.78.0" - "@aws-sdk/util-middleware" "3.78.0" + "@aws-sdk/protocol-http" "3.110.0" + "@aws-sdk/service-error-classification" "3.110.0" + "@aws-sdk/types" "3.110.0" + "@aws-sdk/util-middleware" "3.110.0" tslib "^2.3.1" uuid "^8.3.2" -"@aws-sdk/middleware-sdk-s3@3.86.0": - version "3.86.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.86.0.tgz#92470446c62eec1cbe502e4f04585194bb5b1ff7" - integrity sha512-1L9q8iJXy/KNyVR8JRs4DZ5SJse6nJPiK4AR8c2xF5FWHdGoFaLcdqpg2/TLB1kpdcfGgNp96uCROxh+IPXtDQ== +"@aws-sdk/middleware-sdk-s3@3.110.0": + version "3.110.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.110.0.tgz#069603d33fbc349661facb0aaa131a95263e1b88" + integrity sha512-/PpZU11dkGldD6yeAccPxFd5nzofLOA3+j25RdIwz2jlJMLl9TeznYRtFH5JhHonP3lsK+IPEnFPwuL6gkBxIQ== dependencies: - "@aws-sdk/protocol-http" "3.78.0" - "@aws-sdk/types" "3.78.0" + "@aws-sdk/middleware-bucket-endpoint" "3.110.0" + "@aws-sdk/protocol-http" "3.110.0" + "@aws-sdk/types" "3.110.0" "@aws-sdk/util-arn-parser" "3.55.0" tslib "^2.3.1" -"@aws-sdk/middleware-sdk-sqs@3.78.0": - version "3.78.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-sdk-sqs/-/middleware-sdk-sqs-3.78.0.tgz#45acc4bb0a47626e6af0270d6fc87ec1ad80f0a8" - integrity sha512-EY1K/qDOxfdFWZHFYmrhxu1N4BOuNnGFh+2XbpHU0nlokMX63aHofnSHGFldoAW5rAy604x5cGn39nP0H+vgOg== +"@aws-sdk/middleware-sdk-sqs@3.110.0": + version "3.110.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-sdk-sqs/-/middleware-sdk-sqs-3.110.0.tgz#d564737ebf71463a5ede08d69f52ae88bc4e07d8" + integrity sha512-eDk5WEv8TM75JyN/SiAAd5+ELO/NQYZ6a1wFrA8EzTq18H3UJImcYWuZq6QU8ZD07E48dlA47JzQg7lClDqnIA== dependencies: - "@aws-sdk/types" "3.78.0" - "@aws-sdk/util-hex-encoding" "3.58.0" + "@aws-sdk/types" "3.110.0" + "@aws-sdk/util-hex-encoding" "3.109.0" tslib "^2.3.1" -"@aws-sdk/middleware-sdk-sts@3.78.0": - version "3.78.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.78.0.tgz#15d91c421380f748b58bb006e1c398cfdf59b290" - integrity sha512-Lu/kN0J0/Kt0ON1hvwNel+y8yvf35licfIgtedHbBCa/ju8qQ9j+uL9Lla6Y5Tqu29yVaye1JxhiIDhscSwrLA== +"@aws-sdk/middleware-sdk-sts@3.110.0": + version "3.110.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.110.0.tgz#8c1e34b72355c5e63495927a01839f210327f0c1" + integrity sha512-EjY/YFdlr5jECde6qIrTIyGBbn/34CKcQGKvmvRd31+3qaClIJLAwNuHfcVzWvCUGbAslsfvdbOpLju33pSQRA== dependencies: - "@aws-sdk/middleware-signing" "3.78.0" - "@aws-sdk/property-provider" "3.78.0" - "@aws-sdk/protocol-http" "3.78.0" - "@aws-sdk/signature-v4" "3.78.0" - "@aws-sdk/types" "3.78.0" + "@aws-sdk/middleware-signing" "3.110.0" + "@aws-sdk/property-provider" "3.110.0" + "@aws-sdk/protocol-http" "3.110.0" + "@aws-sdk/signature-v4" "3.110.0" + "@aws-sdk/types" "3.110.0" tslib "^2.3.1" -"@aws-sdk/middleware-serde@3.78.0": - version "3.78.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-serde/-/middleware-serde-3.78.0.tgz#d1e1a7b9ac58638b973e533ac4c2ca52f413883c" - integrity sha512-4DPsNOxsl1bxRzfo1WXEZjmD7OEi7qGNpxrDWucVe96Fqj2dH08jR8wxvBIVV1e6bAad07IwdPuCGmivNvwRuQ== +"@aws-sdk/middleware-serde@3.110.0": + version "3.110.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-serde/-/middleware-serde-3.110.0.tgz#603dcc1f68d78e9123f9b696150374a8357de6c3" + integrity sha512-brVupxgEAmcZ9cZvdHEH8zncjvGKIiud8pOe4fiimp5NpHmjBLew4jUbnOKNZNAjaidcKUtz//cxtutD6yXEww== dependencies: - "@aws-sdk/types" "3.78.0" + "@aws-sdk/types" "3.110.0" tslib "^2.3.1" -"@aws-sdk/middleware-signing@3.78.0": - version "3.78.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-signing/-/middleware-signing-3.78.0.tgz#2fb41819a9ae0953cf8f428851a57696442469ca" - integrity sha512-OEjJJCNhHHSOprLZ9CzjHIXEKFtPHWP/bG9pMhkV3/6Bmscsgcf8gWHcOnmIrjqX+hT1VALDNpl/RIh0J6/eQw== +"@aws-sdk/middleware-signing@3.110.0": + version "3.110.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-signing/-/middleware-signing-3.110.0.tgz#8faa6acdaedb1c29614fe7ba88a74534db38f3bb" + integrity sha512-y6ZKrGYfgDlFMzWhZmoq5J1UctBgZOUvMmnU9sSeZ020IlEPiOxFMvR0Zu6TcYThp8uy3P0wyjQtGYeTl9Z/kA== dependencies: - "@aws-sdk/property-provider" "3.78.0" - "@aws-sdk/protocol-http" "3.78.0" - "@aws-sdk/signature-v4" "3.78.0" - "@aws-sdk/types" "3.78.0" + "@aws-sdk/property-provider" "3.110.0" + "@aws-sdk/protocol-http" "3.110.0" + "@aws-sdk/signature-v4" "3.110.0" + "@aws-sdk/types" "3.110.0" tslib "^2.3.1" -"@aws-sdk/middleware-ssec@3.78.0": - version "3.78.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-ssec/-/middleware-ssec-3.78.0.tgz#4463c6c6ee26c8b3f2ebc112f7de3ca560ba4f3f" - integrity sha512-3z+UOd95rxvj+iO6WxMjuRNNUMlO6xhXZdBHvQmoiyS+9nMDcNieTu6gfQyLAilVeCh8xU9a0IenJuIYVdJ96g== +"@aws-sdk/middleware-ssec@3.110.0": + version "3.110.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-ssec/-/middleware-ssec-3.110.0.tgz#85020a0e54840e572231407dde6d40a82239d03b" + integrity sha512-Zrm+h+C+MXv2Q+mh8O/zwK2hUYM4kq4I1vx72RPpvyfIk4/F5ZzeA3LSVluISyAW+iNqS8XFvGFrzl2gB8zWsg== dependencies: - "@aws-sdk/types" "3.78.0" + "@aws-sdk/types" "3.110.0" tslib "^2.3.1" -"@aws-sdk/middleware-stack@3.78.0": - version "3.78.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-stack/-/middleware-stack-3.78.0.tgz#e9f42039e500bed23ec74359924ae16e7bf9c77a" - integrity sha512-UoNfRh6eAJN3BJHlG1eb+KeuSe+zARTC2cglroJRyHc2j7GxH2i9FD3IJbj5wvzopJEnQzuY/VCs6STFkqWL1g== +"@aws-sdk/middleware-stack@3.110.0": + version "3.110.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-stack/-/middleware-stack-3.110.0.tgz#5a531c83ec375adf9d7f1bd80b725cebf7b2f01d" + integrity sha512-iaLHw6ctOuGa9UxNueU01Xes+15dR+mqioRpUOUZ9Zx+vhXVpD7C8lnNqhRnYeFXs10/rNIzASgsIrAHTlnlIQ== dependencies: tslib "^2.3.1" -"@aws-sdk/middleware-user-agent@3.78.0": - version "3.78.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.78.0.tgz#e4c7345d26d718de0e84b60ba02b2b08b566fa15" - integrity sha512-wdN5uoq8RxxhLhj0EPeuDSRFuXfUwKeEqRzCKMsYAOC0cAm+PryaP2leo0oTGJ9LUK8REK7zyfFcmtC4oOzlkA== +"@aws-sdk/middleware-user-agent@3.110.0": + version "3.110.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.110.0.tgz#52f32e99ecb641babcd59bb010527d5614e908f4" + integrity sha512-Y6FgiZr99DilYq6AjeaaWcNwVlSQpNGKrILzvV4Tmz03OaBIspe4KL+8EZ2YA/sAu5Lpw80vItdezqDOwGAlnQ== dependencies: - "@aws-sdk/protocol-http" "3.78.0" - "@aws-sdk/types" "3.78.0" + "@aws-sdk/protocol-http" "3.110.0" + "@aws-sdk/types" "3.110.0" tslib "^2.3.1" -"@aws-sdk/node-config-provider@3.80.0": - version "3.80.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/node-config-provider/-/node-config-provider-3.80.0.tgz#dbb02aa48fb1a0acc3201ca73db5bbf1738895b5" - integrity sha512-vyTOMK04huB7n10ZUv0thd2TE6KlY8livOuLqFTMtj99AJ6vyeB5XBNwKnQtJIt/P7CijYgp8KcFvI9fndOmKg== +"@aws-sdk/node-config-provider@3.110.0": + version "3.110.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/node-config-provider/-/node-config-provider-3.110.0.tgz#7d032082b85458ea4959f744d473e328be024359" + integrity sha512-46p4dCPGYctuybTQTwLpjenA1QFHeyJw/OyggGbtUJUy+833+ldnAwcPVML2aXJKUKv3APGI8vq1kaloyNku3Q== dependencies: - "@aws-sdk/property-provider" "3.78.0" - "@aws-sdk/shared-ini-file-loader" "3.80.0" - "@aws-sdk/types" "3.78.0" + "@aws-sdk/property-provider" "3.110.0" + "@aws-sdk/shared-ini-file-loader" "3.110.0" + "@aws-sdk/types" "3.110.0" tslib "^2.3.1" -"@aws-sdk/node-http-handler@3.94.0": - version "3.94.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/node-http-handler/-/node-http-handler-3.94.0.tgz#0bfbfec24f9465afddb876c50fd09ce00dfa4226" - integrity sha512-g9q6k+PS+BrtOzt8jrBWr9D543uB3ZoYZ2JCriwuCwnP4uIHlMf9wAOGcOgqgykfUAPBOLvz2rTwVs3Xl8GUmQ== +"@aws-sdk/node-http-handler@3.118.1": + version "3.118.1" + resolved "https://registry.yarnpkg.com/@aws-sdk/node-http-handler/-/node-http-handler-3.118.1.tgz#8f71c1b4dffae4cbec1151910c2d6fbf7b966706" + integrity sha512-pfWVAUNJEs0UW0KkDqq2/VCz9PIpvg4mYEfCVZ4jR+Rv8F7UezNeM3FrEdHk8dfYShH+OV0hFskHBQJhw1BX2Q== dependencies: - "@aws-sdk/abort-controller" "3.78.0" - "@aws-sdk/protocol-http" "3.78.0" - "@aws-sdk/querystring-builder" "3.78.0" - "@aws-sdk/types" "3.78.0" + "@aws-sdk/abort-controller" "3.110.0" + "@aws-sdk/protocol-http" "3.110.0" + "@aws-sdk/querystring-builder" "3.110.0" + "@aws-sdk/types" "3.110.0" tslib "^2.3.1" -"@aws-sdk/property-provider@3.78.0": - version "3.78.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/property-provider/-/property-provider-3.78.0.tgz#f12341fa87da2b54daac95f623bf7ede1754f8ae" - integrity sha512-PZpLvV0hF6lqg3CSN9YmphrB/t5LVJVWGJLB9d9qm7sJs5ksjTYBb5bY91OQ3zit0F4cqBMU8xt2GQ9J6d4DvQ== +"@aws-sdk/property-provider@3.110.0": + version "3.110.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/property-provider/-/property-provider-3.110.0.tgz#ea60c33a8e243246fc21d478ff009063825b9abd" + integrity sha512-7NkpmYeOkK3mhWBNU+/zSDqwzeaSPH1qrq4L//WV7WS/weYyE/jusQeZoOxVsuZQnQEXHt5O2hKVeUwShl12xA== dependencies: - "@aws-sdk/types" "3.78.0" + "@aws-sdk/types" "3.110.0" tslib "^2.3.1" -"@aws-sdk/protocol-http@3.78.0": - version "3.78.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/protocol-http/-/protocol-http-3.78.0.tgz#8a30db90e3373fe94e2b0007c3cba47b5c9e08bd" - integrity sha512-SQB26MhEK96yDxyXd3UAaxLz1Y/ZvgE4pzv7V3wZiokdEedM0kawHKEn1UQJlqJLEZcQI9QYyysh3rTvHZ3fyg== +"@aws-sdk/protocol-http@3.110.0": + version "3.110.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/protocol-http/-/protocol-http-3.110.0.tgz#ff3cffa5b1eb7c8564a9e9019a8842b429c7f85c" + integrity sha512-qdi2gCbJiyPyLn+afebPNp/5nVCRh1X7t7IRIFl3FHVEC+o54u/ojay/MLZ4M/+X9Fa4Zxsb0Wpp3T0xAHVDBg== dependencies: - "@aws-sdk/types" "3.78.0" + "@aws-sdk/types" "3.110.0" tslib "^2.3.1" -"@aws-sdk/querystring-builder@3.78.0": - version "3.78.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/querystring-builder/-/querystring-builder-3.78.0.tgz#29068c4d1fad056e26f848779a31335469cb0038" - integrity sha512-aib6RW1WAaTQDqVgRU1Ku9idkhm90gJKbCxVaGId+as6QHNUqMChEfK2v+0afuKiPNOs5uWmqvOXI9+Gt+UGDg== +"@aws-sdk/querystring-builder@3.110.0": + version "3.110.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/querystring-builder/-/querystring-builder-3.110.0.tgz#c7f63262e898ab38cdbbbfcd03ddbfde346c9595" + integrity sha512-7V3CDXj519izmbBn9ZE68ymASwGriA+Aq+cb/yHSVtffnvXjPtvONNw7G/5iVblisGLSCUe2hSvpYtcaXozbHw== dependencies: - "@aws-sdk/types" "3.78.0" + "@aws-sdk/types" "3.110.0" "@aws-sdk/util-uri-escape" "3.55.0" tslib "^2.3.1" -"@aws-sdk/querystring-parser@3.78.0": - version "3.78.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/querystring-parser/-/querystring-parser-3.78.0.tgz#4c76fe15ef2e9bbf4c387c83889d1c25d2c3a614" - integrity sha512-csaH8YTyN+KMNczeK6fBS8l7iJaqcQcKOIbpQFg5upX4Ly5A56HJn4sVQhY1LSgfSk4xRsNfMy5mu6BlsIiaXA== +"@aws-sdk/querystring-parser@3.110.0": + version "3.110.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/querystring-parser/-/querystring-parser-3.110.0.tgz#0551efb7aaa867d3b6705f62d798a45247f5f44b" + integrity sha512-//pJHH7hrhdDMZGBPKXKymmC/tJM7gFT0w/qbu/yd3Wm4W2fMB+8gkmj6EZctx7jrsWlfRQuvFejKqEfapur/g== dependencies: - "@aws-sdk/types" "3.78.0" + "@aws-sdk/types" "3.110.0" tslib "^2.3.1" -"@aws-sdk/service-error-classification@3.78.0": - version "3.78.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/service-error-classification/-/service-error-classification-3.78.0.tgz#8d3ac1064e39c180d9b764bb838c7f9de5615281" - integrity sha512-x7Lx8KWctJa01q4Q72Zb4ol9L/era3vy2daASu8l2paHHxsAPBE0PThkvLdUSLZSzlHSVdh3YHESIsT++VsK4w== +"@aws-sdk/service-error-classification@3.110.0": + version "3.110.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/service-error-classification/-/service-error-classification-3.110.0.tgz#09398517d4ad9787bd0d904816bfe0ffd68b1f5f" + integrity sha512-ccgCE0pU/4RmXR6CP3fLAdhPAve7bK/yXBbGzpSHGAQOXqNxYzOsAvQ30Jg6X+qjLHsI/HR2pLIE65z4k6tynw== -"@aws-sdk/shared-ini-file-loader@3.80.0": - version "3.80.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-3.80.0.tgz#e3d1b0532e9a884e52f967717ba2666ca32bbd74" - integrity sha512-3d5EBJjnWWkjLK9skqLLHYbagtFaZZy+3jUTlbTuOKhlOwe8jF7CUM3j6I4JA6yXNcB3w0exDKKHa8w+l+05aA== +"@aws-sdk/shared-ini-file-loader@3.110.0": + version "3.110.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-3.110.0.tgz#f91b66e7084312df2b337cc990c9585e832fc2fc" + integrity sha512-E1ERoqEoG206XNBYWCKLgHkzCbTxdpDEGbsLET2DnvjFsT0s9p2dPvVux3bYl7JVAhyGduE+qcqWk7MzhFCBNQ== dependencies: tslib "^2.3.1" -"@aws-sdk/signature-v4-multi-region@3.88.0": - version "3.88.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.88.0.tgz#7102caacf3d4722dd1fa4dedbe05bef21064edc5" - integrity sha512-RBbyQRpohlIQiuZc5qAvwbXO0Bob9XhHFS/kuLh+DcyeaBp+m+Bt291FX1Ksz2A0Q3ETNM34LFt7kTOBtMvjIQ== +"@aws-sdk/signature-v4-multi-region@3.118.0": + version "3.118.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.118.0.tgz#2a61980dc1857b94b64936c5997ab9dac186f915" + integrity sha512-Uih3SR5d3XBeUtiMFkDERx7jLOZSXvVrhikA9p416FIPWZ5649sQ/esYsDvWBB39nbnYMx/QlsR+imCvh8XlhQ== dependencies: - "@aws-sdk/protocol-http" "3.78.0" - "@aws-sdk/signature-v4" "3.78.0" - "@aws-sdk/types" "3.78.0" + "@aws-sdk/protocol-http" "3.110.0" + "@aws-sdk/signature-v4" "3.110.0" + "@aws-sdk/types" "3.110.0" "@aws-sdk/util-arn-parser" "3.55.0" tslib "^2.3.1" -"@aws-sdk/signature-v4@3.78.0": - version "3.78.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/signature-v4/-/signature-v4-3.78.0.tgz#adb735b9604d4bb8e44d16f1baa87618d576013b" - integrity sha512-eePjRYuzKoi3VMr/lgrUEF1ytLeH4fA/NMCykr/uR6NMo4bSJA59KrFLYSM7SlWLRIyB0UvJqygVEvSxFluyDw== +"@aws-sdk/signature-v4@3.110.0": + version "3.110.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/signature-v4/-/signature-v4-3.110.0.tgz#9dba5d06345fa756b4c23deeec7086f6148a5bf1" + integrity sha512-utxxdllOnmQDhbpipnFAbuQ4c2pwefZ+2hi48jKvQRULQ2PO4nxLmdZm6B0FXaTijbKsyO7GrMik+EZ6mi3ARQ== dependencies: "@aws-sdk/is-array-buffer" "3.55.0" - "@aws-sdk/types" "3.78.0" - "@aws-sdk/util-hex-encoding" "3.58.0" - "@aws-sdk/util-middleware" "3.78.0" + "@aws-sdk/types" "3.110.0" + "@aws-sdk/util-hex-encoding" "3.109.0" + "@aws-sdk/util-middleware" "3.110.0" "@aws-sdk/util-uri-escape" "3.55.0" tslib "^2.3.1" -"@aws-sdk/smithy-client@3.99.0": - version "3.99.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/smithy-client/-/smithy-client-3.99.0.tgz#e9cd92e95983734b88204432a44ee52388af0e1c" - integrity sha512-N9xgCcwbOBZ4/WuROzlErExXV6+vFrFkNJzeBT31/avvrHXjxgxwQlMoXoQCfM8PyRuDuVSfZeoh1iIRfoxidA== +"@aws-sdk/smithy-client@3.110.0": + version "3.110.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/smithy-client/-/smithy-client-3.110.0.tgz#397c0e7ef56ffa058469c641b586978400c09dd7" + integrity sha512-gNLYrmdAe/1hVF2Nv2LF4OkL1A0a1o708pEMZHzql9xP164omRDaLrGDhz9tH7tsJEgLz+Bf4E8nTuISeDwvGg== dependencies: - "@aws-sdk/middleware-stack" "3.78.0" - "@aws-sdk/types" "3.78.0" + "@aws-sdk/middleware-stack" "3.110.0" + "@aws-sdk/types" "3.110.0" tslib "^2.3.1" -"@aws-sdk/types@3.78.0": - version "3.78.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/types/-/types-3.78.0.tgz#51dc80b2142ee20821fb9f476bdca6e541021443" - integrity sha512-I9PTlVNSbwhIgMfmDM5as1tqRIkVZunjVmfogb2WVVPp4CaX0Ll01S0FSMSLL9k6tcQLXqh45pFRjrxCl9WKdQ== +"@aws-sdk/types@3.110.0": + version "3.110.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/types/-/types-3.110.0.tgz#09404533b507925eadf9acf9c4356667048e45bd" + integrity sha512-dLVoqODU3laaqNFPyN1QLtlQnwX4gNPMXptEBIt/iJpuZf66IYJe6WCzVZGt4Zfa1CnUmrlA428AzdcA/KCr2A== "@aws-sdk/types@^3.1.0": version "3.46.0" resolved "https://registry.yarnpkg.com/@aws-sdk/types/-/types-3.46.0.tgz#4f64871a6e32547403e5b3229b66d318909619b3" integrity sha512-yhrkVVyv4RUt3KqDDyEayjBM5dRBtuS486THeqtSghUYNV7M/cW18TA3gdMC0pRGgUqfKrOysdBZjCyPrYNvuA== -"@aws-sdk/url-parser@3.78.0": - version "3.78.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/url-parser/-/url-parser-3.78.0.tgz#8903011fda4b04c1207df099a21eda1304573099" - integrity sha512-iQn2AjECUoJE0Ae9XtgHtGGKvUkvE8hhbktGopdj+zsPBe4WrBN2DgVxlKPPrBonG/YlcL1D7a5EXaujWSlUUw== +"@aws-sdk/url-parser@3.110.0": + version "3.110.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/url-parser/-/url-parser-3.110.0.tgz#87d5c0a6f6d2f29027c747c65d8a2846302bc792" + integrity sha512-tILFB8/Q73yzgO0dErJNnELmmBszd0E6FucwAnG3hfDefjqCBe09Q/1yhu2aARXyRmZa4AKp0sWcdwIWHc8dnA== dependencies: - "@aws-sdk/querystring-parser" "3.78.0" - "@aws-sdk/types" "3.78.0" + "@aws-sdk/querystring-parser" "3.110.0" + "@aws-sdk/types" "3.110.0" tslib "^2.3.1" "@aws-sdk/util-arn-parser@3.55.0": @@ -1153,10 +1163,10 @@ dependencies: tslib "^2.3.1" -"@aws-sdk/util-base64-browser@3.58.0": - version "3.58.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-base64-browser/-/util-base64-browser-3.58.0.tgz#e213f91a5d40dd2d048d340f1ab192ca86c1f40c" - integrity sha512-0ebsXIZNpu/fup9OgsFPnRKfCFbuuI9PPRzvP6twzLxUB0c/aix6Co7LGHFKcRKHZdaykoJMXArf8eHj2Nzv1Q== +"@aws-sdk/util-base64-browser@3.109.0": + version "3.109.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-base64-browser/-/util-base64-browser-3.109.0.tgz#e7faf5c4cbb88bc39b9c1c5a1a79e4c869e9f645" + integrity sha512-lAZ6fyDGiRLaIsKT9qh7P9FGuNyZ4gAbr1YOSQk/5mHtaTuUvxlPptZuInNM/0MPQm6lpcot00D8IWTucn4PbA== dependencies: tslib "^2.3.1" @@ -1190,46 +1200,46 @@ "@aws-sdk/is-array-buffer" "3.55.0" tslib "^2.3.1" -"@aws-sdk/util-config-provider@3.55.0": - version "3.55.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-config-provider/-/util-config-provider-3.55.0.tgz#720c6c0ac1aa8d14be29d1dee25e01eb4925c0ce" - integrity sha512-30dzofQQfx6tp1jVZkZ0DGRsT0wwC15nEysKRiAcjncM64A0Cm6sra77d0os3vbKiKoPCI/lMsFr4o3533+qvQ== +"@aws-sdk/util-config-provider@3.109.0": + version "3.109.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-config-provider/-/util-config-provider-3.109.0.tgz#7828b8894b2b23c289ffc5c106cbced7a5d6ee86" + integrity sha512-GrAZl/aBv0A28LkyNyq8SPJ5fmViCwz80fWLMeWx/6q5AbivuILogjlWwEZSvZ9zrlHOcFC0+AnCa5pQrjaslw== dependencies: tslib "^2.3.1" -"@aws-sdk/util-defaults-mode-browser@3.99.0": - version "3.99.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-defaults-mode-browser/-/util-defaults-mode-browser-3.99.0.tgz#4d5b71279e89a25b9dd1d44ab7631fecbe48c447" - integrity sha512-qSYjUGuN8n7Q/zAi0tzU4BrU389jQosXtjp7eHpLATl0pKGpaHx6rJNwbiNhvBhBEfmSgqsJ09b4gZUpUezHEw== +"@aws-sdk/util-defaults-mode-browser@3.110.0": + version "3.110.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-defaults-mode-browser/-/util-defaults-mode-browser-3.110.0.tgz#b72331874da2c5e8a366cd98828a06fe19b52ae5" + integrity sha512-Y2dcOOD20S3bv/IjUqpdKIiDt6995SXNG5Pu/LeSdXNyLCOIm9rX4gHTxl9fC1KK5M/gR9fGJ362f67WwqEEqw== dependencies: - "@aws-sdk/property-provider" "3.78.0" - "@aws-sdk/types" "3.78.0" + "@aws-sdk/property-provider" "3.110.0" + "@aws-sdk/types" "3.110.0" bowser "^2.11.0" tslib "^2.3.1" -"@aws-sdk/util-defaults-mode-node@3.99.0": - version "3.99.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-defaults-mode-node/-/util-defaults-mode-node-3.99.0.tgz#72f75b02b337bc5bd221ab3504caa4709cf88c8f" - integrity sha512-8TUO0kEnQcgT1gAW9y9oO6a5gKhfEGEUeKidEgbTczEUrjr3aCXIC+p0DI5FJfImwPrTKXra8A22utDM92phWw== +"@aws-sdk/util-defaults-mode-node@3.110.0": + version "3.110.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-defaults-mode-node/-/util-defaults-mode-node-3.110.0.tgz#52b4c84fc7aa06838ea6bb29d216a2d7615b9036" + integrity sha512-Cr3Z5nyrw1KowjbW76xp8hkT/zJtYjAVZ9PS4l84KxIicbVvDOBpxG3yNddkuQcavmlH6G4wH9uM5DcnpKDncg== dependencies: - "@aws-sdk/config-resolver" "3.80.0" - "@aws-sdk/credential-provider-imds" "3.81.0" - "@aws-sdk/node-config-provider" "3.80.0" - "@aws-sdk/property-provider" "3.78.0" - "@aws-sdk/types" "3.78.0" + "@aws-sdk/config-resolver" "3.110.0" + "@aws-sdk/credential-provider-imds" "3.110.0" + "@aws-sdk/node-config-provider" "3.110.0" + "@aws-sdk/property-provider" "3.110.0" + "@aws-sdk/types" "3.110.0" tslib "^2.3.1" -"@aws-sdk/util-dynamodb@3.100.0", "@aws-sdk/util-dynamodb@^3.100.0": - version "3.100.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-dynamodb/-/util-dynamodb-3.100.0.tgz#abc21ca86ecf445aefc93108c2d19ae15c12da42" - integrity sha512-/i8HqHjjSpd1TA6RCJ1c0CtBXXgAi9gEDOUx1raILeZgRO0X/uK72u/N9+MOIeoSF5ZUWa4alJt2P282S2T3Jw== +"@aws-sdk/util-dynamodb@3.121.0", "@aws-sdk/util-dynamodb@^3.121.0": + version "3.121.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-dynamodb/-/util-dynamodb-3.121.0.tgz#8d6a5553b128cd4e7938cb37e099b5e87b3bc280" + integrity sha512-TS6lLCOS5Lb1AAkVH/eLOqdf5VcMh7hsWgbdS3dH7EfCK4sf0gu2WYT6DDuRY8xjmSA7K33qFKhffjZG8oyz3Q== dependencies: tslib "^2.3.1" -"@aws-sdk/util-hex-encoding@3.58.0": - version "3.58.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-hex-encoding/-/util-hex-encoding-3.58.0.tgz#d999eb19329933a94563881540a06d7ac7f515f5" - integrity sha512-Rl+jXUzk/FJkOLYfUVYPhKa2aUmTpeobRP31l8IatQltSzDgLyRHO35f6UEs7Ztn5s1jbu/POatLAZ2WjbgVyg== +"@aws-sdk/util-hex-encoding@3.109.0": + version "3.109.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-hex-encoding/-/util-hex-encoding-3.109.0.tgz#93b20acc27c0a1d7d80f653bf19d3dd01c2ccc65" + integrity sha512-s8CgTNrn3cLkrdiohfxLuOYPCanzvHn/aH5RW6DaMoeQiG5Hl9QUiP/WtdQ9QQx3xvpQFpmvxIaSBwSgFNLQxA== dependencies: tslib "^2.3.1" @@ -1240,27 +1250,27 @@ dependencies: tslib "^2.3.0" -"@aws-sdk/util-middleware@3.78.0": - version "3.78.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-middleware/-/util-middleware-3.78.0.tgz#d907a9b8b7878265cd3e3ee15996bc17de41db11" - integrity sha512-Hi3wv2b0VogO4mzyeEaeU5KgIt4qeo0LXU5gS6oRrG0T7s2FyKbMBkJW3YDh/Y8fNwqArZ+/QQFujpP0PIKwkA== +"@aws-sdk/util-middleware@3.110.0": + version "3.110.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-middleware/-/util-middleware-3.110.0.tgz#00a727273974f54424954235867c1ddb0f6dad56" + integrity sha512-PTVWrI5fA9d5hHJs6RzX2dIS2jRQ3uW073Fm0BePpQeDdZrEk+S5KNwRhUtpN6sdSV45vm6S9rrjZUG51qwGmA== dependencies: tslib "^2.3.1" -"@aws-sdk/util-stream-browser@3.78.0": - version "3.78.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-stream-browser/-/util-stream-browser-3.78.0.tgz#d4578ab9d1ff882f792f3381604c90718310405c" - integrity sha512-EcThf/sJoD4NYTUNO/nehR57lqkOuL6btRoVnm4LGUR8XgQcJ/WMYYgxOMY8E81xXzRFX2ukRHRxL2xmQsbHDw== +"@aws-sdk/util-stream-browser@3.110.0": + version "3.110.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-stream-browser/-/util-stream-browser-3.110.0.tgz#2b39667008b447a95a6b2c1dceaf99dd3807c8b3" + integrity sha512-kAMrHtgrhr6ODRnzt/V+LSDVDvejcbdUp19n4My2vrPwKw3lM65vT+FAPIlGeDQBtOOhmlTbrYM3G3KKnlnHyg== dependencies: - "@aws-sdk/types" "3.78.0" + "@aws-sdk/types" "3.110.0" tslib "^2.3.1" -"@aws-sdk/util-stream-node@3.78.0": - version "3.78.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-stream-node/-/util-stream-node-3.78.0.tgz#37b2f07e4ec3b325d93bd49c7eedf5d891c8d69b" - integrity sha512-CHfX37ioUyamAnlS2p4Nq+4BBjCSlZolFkVyxtVJwzPBBksdvjW67nKG+SShR48RBPJ5LEzbgAaEXNRktCSf6w== +"@aws-sdk/util-stream-node@3.110.0": + version "3.110.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-stream-node/-/util-stream-node-3.110.0.tgz#83089ff4c4b7dd6abaf6a489375cbd44765f4fb0" + integrity sha512-jgkO7aLRpE3EUqU5XUdo0FmlyBVCFHKyHd/jdEN8h9+XMa44rl2QMdOSFQtwaNI4NC8J+OC66u2dQ+8QQnOLig== dependencies: - "@aws-sdk/types" "3.78.0" + "@aws-sdk/types" "3.110.0" tslib "^2.3.1" "@aws-sdk/util-uri-escape@3.55.0": @@ -1270,28 +1280,28 @@ dependencies: tslib "^2.3.1" -"@aws-sdk/util-user-agent-browser@3.78.0": - version "3.78.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.78.0.tgz#12509ed9cc77624da0e0c017099565e37a5038d0" - integrity sha512-diGO/Bf4ggBOEnfD7lrrXaaXOwOXGz0bAJ0HhpizwEMlBld5zfDlWXjNpslh+8+u3EHRjPJQ16KGT6mp/Dm+aw== +"@aws-sdk/util-user-agent-browser@3.110.0": + version "3.110.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.110.0.tgz#e0643e6047aab5137540259a42fbfdc37ae4abee" + integrity sha512-rNdhmHDMV5dNJctqlBWimkZLJRB+x03DB+61pm+SKSFk6gPIVIvc1WNXqDFphkiswT4vA13ZUkGHzt+N4+noQQ== dependencies: - "@aws-sdk/types" "3.78.0" + "@aws-sdk/types" "3.110.0" bowser "^2.11.0" tslib "^2.3.1" -"@aws-sdk/util-user-agent-node@3.80.0": - version "3.80.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.80.0.tgz#269ea0f9bfab4f378af759afa9137936081f010a" - integrity sha512-QV26qIXws1m6sZXg65NS+XrQ5NhAzbDVQLtEVE4nC39UN8fuieP6Uet/gZm9mlLI9hllwvcV7EfgBM3GSC7pZg== +"@aws-sdk/util-user-agent-node@3.118.0": + version "3.118.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.118.0.tgz#5cb8d822ebe46b92101ff547ea373658d18ceb7b" + integrity sha512-7j21HNumxMkeUpgoMX8o3y66k+qMSEkCPCMGnoiiMtgfWX9SY0S/fLwR1nDBw8HI3NthRXfgWdAXUu8K3Kjp6g== dependencies: - "@aws-sdk/node-config-provider" "3.80.0" - "@aws-sdk/types" "3.78.0" + "@aws-sdk/node-config-provider" "3.110.0" + "@aws-sdk/types" "3.110.0" tslib "^2.3.1" -"@aws-sdk/util-utf8-browser@3.55.0": - version "3.55.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.55.0.tgz#a045bf1a93f6e0ff9c846631b168ea55bbb37668" - integrity sha512-ljzqJcyjfJpEVSIAxwtIS8xMRUly84BdjlBXyp6cu4G8TUufgjNS31LWdhyGhgmW5vYBNr+LTz0Kwf6J+ou7Ug== +"@aws-sdk/util-utf8-browser@3.109.0": + version "3.109.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.109.0.tgz#d013272e1981b23a4c84ac06f154db686c0cf84e" + integrity sha512-FmcGSz0v7Bqpl1SE8G1Gc0CtDpug+rvqNCG/szn86JApD/f5x8oByjbEiAyTU2ZH2VevUntx6EW68ulHyH+x+w== dependencies: tslib "^2.3.1" @@ -1302,27 +1312,27 @@ dependencies: tslib "^2.3.0" -"@aws-sdk/util-utf8-node@3.55.0": - version "3.55.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-utf8-node/-/util-utf8-node-3.55.0.tgz#44cf9f9c8624d144afd65ab8a1786e33134add15" - integrity sha512-FsFm7GFaC7j0tlPEm/ri8bU2QCwFW5WKjxUg8lm1oWaxplCpKGUsmcfPJ4sw58GIoyoGu4QXBK60oCWosZYYdQ== +"@aws-sdk/util-utf8-node@3.109.0": + version "3.109.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-utf8-node/-/util-utf8-node-3.109.0.tgz#89e06d916f5b246c7265f59bac742973ac0767ac" + integrity sha512-Ti/ZBdvz2eSTElsucjzNmzpyg2MwfD1rXmxD0hZuIF8bPON/0+sZYnWd5CbDw9kgmhy28dmKue086tbZ1G0iLQ== dependencies: "@aws-sdk/util-buffer-from" "3.55.0" tslib "^2.3.1" -"@aws-sdk/util-waiter@3.78.0", "@aws-sdk/util-waiter@^3.78.0": - version "3.78.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/util-waiter/-/util-waiter-3.78.0.tgz#5886f3e06ae6df9a12ef7079a6e75c76921ea4da" - integrity sha512-8pWd0XiNOS8AkWQyac8VNEI+gz/cGWlC2TAE2CJp0rOK5XhvlcNBINai4D6TxQ+9foyJXLOI1b8nuXemekoG8A== +"@aws-sdk/util-waiter@3.118.1", "@aws-sdk/util-waiter@^3.118.1": + version "3.118.1" + resolved "https://registry.yarnpkg.com/@aws-sdk/util-waiter/-/util-waiter-3.118.1.tgz#eab970728e14cb31a6705e4daa4863751594bd53" + integrity sha512-mCPTpoNHXdBcGEk/8r90ppCB/DHUis+dZPDBDfCENRqcAYq9TDlTl9VB7jhgRkVUhM0HZGNAbUOaI+212jjPiQ== dependencies: - "@aws-sdk/abort-controller" "3.78.0" - "@aws-sdk/types" "3.78.0" + "@aws-sdk/abort-controller" "3.110.0" + "@aws-sdk/types" "3.110.0" tslib "^2.3.1" -"@aws-sdk/xml-builder@3.55.0": - version "3.55.0" - resolved "https://registry.yarnpkg.com/@aws-sdk/xml-builder/-/xml-builder-3.55.0.tgz#8e14012ab3ed27cf68964abf1326d06c686b3511" - integrity sha512-BH+i5S2FLprmfSeIuGy3UbNtEoJPVjh8arl5+LV3i2KY/+TmrS4yT8JtztDlDxHF0cMtNLZNO0KEPtsACS6SOg== +"@aws-sdk/xml-builder@3.109.0": + version "3.109.0" + resolved "https://registry.yarnpkg.com/@aws-sdk/xml-builder/-/xml-builder-3.109.0.tgz#dd2d3bf59d29a1c2968f477ec16680d47d81d921" + integrity sha512-+aAXynnrqya1Eukz4Gxch4xIXCZolIMWGD4Ll/Q5yXT5uAjGh2HQWd9J0LWE+gYChpWetZbAVYZ3cEJ6F+SpZA== dependencies: tslib "^2.3.1" diff --git a/lib/stacks/pipeline/aws-sso-extensions-for-enterprise.ts b/lib/stacks/pipeline/aws-sso-extensions-for-enterprise.ts index a890a02..0cb11bf 100644 --- a/lib/stacks/pipeline/aws-sso-extensions-for-enterprise.ts +++ b/lib/stacks/pipeline/aws-sso-extensions-for-enterprise.ts @@ -1,6 +1,4 @@ -/* -Main pipeline stack i.e. entry point of the application -*/ +/** Main pipeline stack i.e. entry point of the application */ import { Repository } from "aws-cdk-lib/aws-codecommit"; import { Stack, StackProps, Tags } from "aws-cdk-lib"; diff --git a/lib/stacks/pipeline/pipeline-stages.ts b/lib/stacks/pipeline/pipeline-stages.ts index 5fe9306..408fd37 100644 --- a/lib/stacks/pipeline/pipeline-stages.ts +++ b/lib/stacks/pipeline/pipeline-stages.ts @@ -1,6 +1,4 @@ -/* -Pipeline stages abstraction -*/ +/** Pipeline stages abstraction */ import { DefaultStackSynthesizer, Stage, StageProps } from "aws-cdk-lib"; import { Construct } from "constructs"; diff --git a/lib/stacks/pipelineStageStacks/org-events-processor.ts b/lib/stacks/pipelineStageStacks/org-events-processor.ts index ed1cbb3..bb4fa03 100644 --- a/lib/stacks/pipelineStageStacks/org-events-processor.ts +++ b/lib/stacks/pipelineStageStacks/org-events-processor.ts @@ -1,6 +1,4 @@ -/* -Deploys even bridge rules for org events in Org Main account -*/ +/** Deploys even bridge rules for org events in Org Main account */ import { Rule, RuleTargetInput } from "aws-cdk-lib/aws-events"; import { SnsTopic } from "aws-cdk-lib/aws-events-targets"; import { diff --git a/lib/stacks/pipelineStageStacks/pre-solution-artefacts.ts b/lib/stacks/pipelineStageStacks/pre-solution-artefacts.ts index 9a0b2f3..ea57b22 100644 --- a/lib/stacks/pipelineStageStacks/pre-solution-artefacts.ts +++ b/lib/stacks/pipelineStageStacks/pre-solution-artefacts.ts @@ -1,8 +1,7 @@ -/* -Deploys Core solution components -The stack itself does not have any direct resource deployment -and abstracts all resource deployments to the constructs -*/ +/** + * Deploys Core solution components The stack itself does not have any direct + * resource deployment and abstracts all resource deployments to the constructs + */ import { Stack, StackProps } from "aws-cdk-lib"; import { Construct } from "constructs"; import { BuildConfig } from "../../build/buildConfig"; diff --git a/lib/stacks/pipelineStageStacks/solution-artefacts.ts b/lib/stacks/pipelineStageStacks/solution-artefacts.ts index 964dd36..8393e10 100644 --- a/lib/stacks/pipelineStageStacks/solution-artefacts.ts +++ b/lib/stacks/pipelineStageStacks/solution-artefacts.ts @@ -1,8 +1,7 @@ -/* -Deploys Core solution components -The stack itself does not have any direct resource deployment -and abstracts all resource deployments to the constructs -*/ +/** + * Deploys Core solution components The stack itself does not have any direct + * resource deployment and abstracts all resource deployments to the constructs + */ import { Stack, StackProps } from "aws-cdk-lib"; import { Construct } from "constructs"; import { BuildConfig } from "../../build/buildConfig"; diff --git a/lib/stacks/pipelineStageStacks/sso-api-roles.ts b/lib/stacks/pipelineStageStacks/sso-api-roles.ts index c34d79a..e6e35fa 100644 --- a/lib/stacks/pipelineStageStacks/sso-api-roles.ts +++ b/lib/stacks/pipelineStageStacks/sso-api-roles.ts @@ -1,6 +1,7 @@ -/* -Deploys roles in SSO account that allow SSO admin API, Identity Store api access from target account -*/ +/** + * Deploys roles in SSO account that allow SSO admin API, Identity Store api + * access from target account + */ import { PolicyStatement } from "aws-cdk-lib/aws-iam"; import { Stack, StackProps } from "aws-cdk-lib"; import { Construct } from "constructs"; diff --git a/lib/stacks/pipelineStageStacks/sso-events-processor.ts b/lib/stacks/pipelineStageStacks/sso-events-processor.ts index fe66bf0..2365fc6 100644 --- a/lib/stacks/pipelineStageStacks/sso-events-processor.ts +++ b/lib/stacks/pipelineStageStacks/sso-events-processor.ts @@ -1,6 +1,4 @@ -/* -Deploys event bridge rules for SSO events in SSO account -*/ +/** Deploys event bridge rules for SSO events in SSO account */ import { Rule, RuleTargetInput } from "aws-cdk-lib/aws-events"; import { SnsTopic } from "aws-cdk-lib/aws-events-targets"; import { diff --git a/lib/stacks/pipelineStageStacks/sso-import-artefacts-part1.ts b/lib/stacks/pipelineStageStacks/sso-import-artefacts-part1.ts index a9836ec..6d591a0 100644 --- a/lib/stacks/pipelineStageStacks/sso-import-artefacts-part1.ts +++ b/lib/stacks/pipelineStageStacks/sso-import-artefacts-part1.ts @@ -1,8 +1,7 @@ -/* -Deploys part 1 of artefacts required for importing -current AWS SSO configuration i.e. permission sets and -account assignments in SSO account -*/ +/** + * Deploys part 1 of artefacts required for importing current AWS SSO + * configuration i.e. permission sets and account assignments in SSO account + */ import { Stack, StackProps } from "aws-cdk-lib"; import { AccountPrincipal, diff --git a/lib/stacks/pipelineStageStacks/sso-import-artefacts-part2.ts b/lib/stacks/pipelineStageStacks/sso-import-artefacts-part2.ts index f686e46..6385336 100644 --- a/lib/stacks/pipelineStageStacks/sso-import-artefacts-part2.ts +++ b/lib/stacks/pipelineStageStacks/sso-import-artefacts-part2.ts @@ -1,8 +1,7 @@ -/* -Deploys part 2 of artefacts required for importing -current AWS SSO configuration i.e. permission sets and -account assignments in target account -*/ +/** + * Deploys part 2 of artefacts required for importing current AWS SSO + * configuration i.e. permission sets and account assignments in target account + */ import { CustomResource, Duration, Stack, StackProps } from "aws-cdk-lib"; import { PolicyStatement } from "aws-cdk-lib/aws-iam"; import * as lambda from "aws-cdk-lib/aws-lambda"; @@ -64,6 +63,7 @@ export class SSOImportArtefactsPart2 extends Stack { deployImportArtefacts.importedProvisionedLinksTable.tableName, artefactsBucketName: deployImportArtefacts.importedSsoArtefactsBucket.bucketName, + functionLogMode: buildConfig.Parameters.FunctionLogMode, }, } ); @@ -125,6 +125,7 @@ export class SSOImportArtefactsPart2 extends Stack { ssoRegion: buildConfig.PipelineSettings.SSOServiceAccountRegion, artefactsBucketName: deployImportArtefacts.importedSsoArtefactsBucket.bucketName, + functionLogMode: buildConfig.Parameters.FunctionLogMode, }, } ); @@ -187,6 +188,7 @@ export class SSOImportArtefactsPart2 extends Stack { deployImportArtefacts.currentConfigSMDescribeRoleArn, ssoAccountId: buildConfig.PipelineSettings.SSOServiceAccountId, ssoRegion: buildConfig.PipelineSettings.SSOServiceAccountRegion, + functionLogMode: buildConfig.Parameters.FunctionLogMode, }, } ); @@ -228,6 +230,9 @@ export class SSOImportArtefactsPart2 extends Stack { "uuid", ], minify: true, + environment: { + functionLogMode: buildConfig.Parameters.FunctionLogMode, + }, }, } ); @@ -263,6 +268,7 @@ export class SSOImportArtefactsPart2 extends Stack { deployImportArtefacts.permissionSetImportTopic.topicArn, temporaryPermissionSetTableName: `${buildConfig.Environment}-temp-PermissionSets`, ssoRegion: buildConfig.PipelineSettings.SSOServiceAccountRegion, + functionLogMode: buildConfig.Parameters.FunctionLogMode, }, } ); diff --git a/lib/stacks/pipelineStageStacks/upgrade-to-v303.ts b/lib/stacks/pipelineStageStacks/upgrade-to-v303.ts index 0fd56f2..7148839 100644 --- a/lib/stacks/pipelineStageStacks/upgrade-to-v303.ts +++ b/lib/stacks/pipelineStageStacks/upgrade-to-v303.ts @@ -1,8 +1,7 @@ -/* -Deploys a custom resource that would upgrade -account assignment data from old format i.e. dot based delimiter -to new format i.e. percent symbol -*/ +/** + * Deploys a custom resource that would upgrade account assignment data from old + * format i.e. dot based delimiter to new format i.e. percent symbol + */ import { CustomResource, Duration, Stack, StackProps } from "aws-cdk-lib"; import { Table } from "aws-cdk-lib/aws-dynamodb"; import { PolicyStatement, Role, ServicePrincipal } from "aws-cdk-lib/aws-iam"; @@ -186,6 +185,9 @@ export class UpgradeToV303 extends Stack { externalModules: ["@aws-sdk/client-sfn", "uuid"], minify: true, }, + environment: { + functionLogMode: buildConfig.Parameters.FunctionLogMode, + }, } ); @@ -216,6 +218,9 @@ export class UpgradeToV303 extends Stack { externalModules: ["@aws-sdk/client-sfn", "uuid"], minify: true, }, + environment: { + functionLogMode: buildConfig.Parameters.FunctionLogMode, + }, } ); diff --git a/package.json b/package.json index 45e559f..0a61b34 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "aws-sso-extensions-for-enterprise", - "version": "3.1.5", + "version": "3.1.6", "bin": { "aws-sso-extensions-for-enterprise": "bin/aws-sso-extensions-for-enterprise.js" }, @@ -25,29 +25,29 @@ "postinstall": "yarn install --cwd ./lib/lambda-functions --frozen-lockfile" }, "devDependencies": { - "@types/aws-lambda": "^8.10.98", - "@types/jest": "^28.1.0", + "@types/aws-lambda": "^8.10.101", + "@types/jest": "^28.1.4", "@types/js-yaml": "^4.0.5", - "@types/node": "^17.0.39", + "@types/node": "^18.0.3", "@types/uuid": "^8.3.4", - "@typescript-eslint/eslint-plugin": "^5.27.0", - "@typescript-eslint/parser": "^5.27.0", - "aws-cdk": "^2.27.0", - "esbuild": "^0.14.42", - "eslint": "^8.17.0", + "@typescript-eslint/eslint-plugin": "^5.30.5", + "@typescript-eslint/parser": "^5.30.5", + "aws-cdk": "^2.31.1", + "esbuild": "^0.14.48", + "eslint": "^8.19.0", "eslint-plugin-import": "^2.26.0", "eslint-plugin-security": "^1.5.0", - "jest": "^28.1.0", - "prettier": "^2.6.2", + "jest": "^28.1.2", + "prettier": "^2.7.1", "prettier-plugin-jsdoc": "^0.3.38", - "ts-jest": "^28.0.4", - "ts-node": "^10.8.1", - "typescript": "^4.7.3", + "ts-jest": "^28.0.5", + "ts-node": "^10.8.2", + "typescript": "^4.7.4", "uuid": "^8.3.2" }, "dependencies": { - "aws-cdk-lib": "^2.27.0", - "constructs": "^10.1.26", + "aws-cdk-lib": "^2.31.1", + "constructs": "^10.1.43", "js-yaml": "^4.1.0", "source-map-support": "^0.5.21" } diff --git a/test/aws-sso-extensions-for-enterprise.ts b/test/aws-sso-extensions-for-enterprise.ts index f9b14c2..85b6cc9 100644 --- a/test/aws-sso-extensions-for-enterprise.ts +++ b/test/aws-sso-extensions-for-enterprise.ts @@ -173,6 +173,11 @@ test("Empty Stack", () => { unparsedEnv["Parameters"], "SupportNestedOU" ), + FunctionLogMode: ensureValidString( + unparsedEnv["Parameters"], + "FunctionLogMode", + ["INFO", "WARN", "DEBUG", "EXCEPTION"] + ), }, }; } diff --git a/yarn.lock b/yarn.lock index 5a5cd77..93837b8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -462,28 +462,28 @@ resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== -"@jest/console@^28.1.0": - version "28.1.0" - resolved "https://registry.yarnpkg.com/@jest/console/-/console-28.1.0.tgz#db78222c3d3b0c1db82f1b9de51094c2aaff2176" - integrity sha512-tscn3dlJFGay47kb4qVruQg/XWlmvU0xp3EJOjzzY+sBaI+YgwKcvAmTcyYU7xEiLLIY5HCdWRooAL8dqkFlDA== +"@jest/console@^28.1.1": + version "28.1.1" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-28.1.1.tgz#305f8ca50b6e70413839f54c0e002b60a0f2fd7d" + integrity sha512-0RiUocPVFEm3WRMOStIHbRWllG6iW6E3/gUPnf4lkrVFyXIIDeCe+vlKeYyFOMhB2EPE6FLFCNADSOOQMaqvyA== dependencies: - "@jest/types" "^28.1.0" + "@jest/types" "^28.1.1" "@types/node" "*" chalk "^4.0.0" - jest-message-util "^28.1.0" - jest-util "^28.1.0" + jest-message-util "^28.1.1" + jest-util "^28.1.1" slash "^3.0.0" -"@jest/core@^28.1.0": - version "28.1.0" - resolved "https://registry.yarnpkg.com/@jest/core/-/core-28.1.0.tgz#784a1e6ce5358b46fcbdcfbbd93b1b713ed4ea80" - integrity sha512-/2PTt0ywhjZ4NwNO4bUqD9IVJfmFVhVKGlhvSpmEfUCuxYf/3NHcKmRFI+I71lYzbTT3wMuYpETDCTHo81gC/g== +"@jest/core@^28.1.2": + version "28.1.2" + resolved "https://registry.yarnpkg.com/@jest/core/-/core-28.1.2.tgz#eac519b9acbd154313854b8823a47b5c645f785a" + integrity sha512-Xo4E+Sb/nZODMGOPt2G3cMmCBqL4/W2Ijwr7/mrXlq4jdJwcFQ/9KrrJZT2adQRk2otVBXXOz1GRQ4Z5iOgvRQ== dependencies: - "@jest/console" "^28.1.0" - "@jest/reporters" "^28.1.0" - "@jest/test-result" "^28.1.0" - "@jest/transform" "^28.1.0" - "@jest/types" "^28.1.0" + "@jest/console" "^28.1.1" + "@jest/reporters" "^28.1.2" + "@jest/test-result" "^28.1.1" + "@jest/transform" "^28.1.2" + "@jest/types" "^28.1.1" "@types/node" "*" ansi-escapes "^4.2.1" chalk "^4.0.0" @@ -491,81 +491,81 @@ exit "^0.1.2" graceful-fs "^4.2.9" jest-changed-files "^28.0.2" - jest-config "^28.1.0" - jest-haste-map "^28.1.0" - jest-message-util "^28.1.0" + jest-config "^28.1.2" + jest-haste-map "^28.1.1" + jest-message-util "^28.1.1" jest-regex-util "^28.0.2" - jest-resolve "^28.1.0" - jest-resolve-dependencies "^28.1.0" - jest-runner "^28.1.0" - jest-runtime "^28.1.0" - jest-snapshot "^28.1.0" - jest-util "^28.1.0" - jest-validate "^28.1.0" - jest-watcher "^28.1.0" + jest-resolve "^28.1.1" + jest-resolve-dependencies "^28.1.2" + jest-runner "^28.1.2" + jest-runtime "^28.1.2" + jest-snapshot "^28.1.2" + jest-util "^28.1.1" + jest-validate "^28.1.1" + jest-watcher "^28.1.1" micromatch "^4.0.4" - pretty-format "^28.1.0" + pretty-format "^28.1.1" rimraf "^3.0.0" slash "^3.0.0" strip-ansi "^6.0.0" -"@jest/environment@^28.1.0": - version "28.1.0" - resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-28.1.0.tgz#dedf7d59ec341b9292fcf459fd0ed819eb2e228a" - integrity sha512-S44WGSxkRngzHslhV6RoAExekfF7Qhwa6R5+IYFa81mpcj0YgdBnRSmvHe3SNwOt64yXaE5GG8Y2xM28ii5ssA== +"@jest/environment@^28.1.2": + version "28.1.2" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-28.1.2.tgz#94a052c0c5f9f8c8e6d13ea6da78dbc5d7d9b85b" + integrity sha512-I0CR1RUMmOzd0tRpz10oUfaChBWs+/Hrvn5xYhMEF/ZqrDaaeHwS8yDBqEWCrEnkH2g+WE/6g90oBv3nKpcm8Q== dependencies: - "@jest/fake-timers" "^28.1.0" - "@jest/types" "^28.1.0" + "@jest/fake-timers" "^28.1.2" + "@jest/types" "^28.1.1" "@types/node" "*" - jest-mock "^28.1.0" + jest-mock "^28.1.1" -"@jest/expect-utils@^28.1.0": - version "28.1.0" - resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-28.1.0.tgz#a5cde811195515a9809b96748ae8bcc331a3538a" - integrity sha512-5BrG48dpC0sB80wpeIX5FU6kolDJI4K0n5BM9a5V38MGx0pyRvUBSS0u2aNTdDzmOrCjhOg8pGs6a20ivYkdmw== +"@jest/expect-utils@^28.1.1": + version "28.1.1" + resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-28.1.1.tgz#d84c346025b9f6f3886d02c48a6177e2b0360587" + integrity sha512-n/ghlvdhCdMI/hTcnn4qV57kQuV9OTsZzH1TTCVARANKhl6hXJqLKUkwX69ftMGpsbpt96SsDD8n8LD2d9+FRw== dependencies: jest-get-type "^28.0.2" -"@jest/expect@^28.1.0": - version "28.1.0" - resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-28.1.0.tgz#2e5a31db692597070932366a1602b5157f0f217c" - integrity sha512-be9ETznPLaHOmeJqzYNIXv1ADEzENuQonIoobzThOYPuK/6GhrWNIJDVTgBLCrz3Am73PyEU2urQClZp0hLTtA== +"@jest/expect@^28.1.2": + version "28.1.2" + resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-28.1.2.tgz#0b25acedff46e1e1e5606285306c8a399c12534f" + integrity sha512-HBzyZBeFBiOelNbBKN0pilWbbrGvwDUwAqMC46NVJmWm8AVkuE58NbG1s7DR4cxFt4U5cVLxofAoHxgvC5MyOw== dependencies: - expect "^28.1.0" - jest-snapshot "^28.1.0" + expect "^28.1.1" + jest-snapshot "^28.1.2" -"@jest/fake-timers@^28.1.0": - version "28.1.0" - resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-28.1.0.tgz#ea77878aabd5c5d50e1fc53e76d3226101e33064" - integrity sha512-Xqsf/6VLeAAq78+GNPzI7FZQRf5cCHj1qgQxCjws9n8rKw8r1UYoeaALwBvyuzOkpU3c1I6emeMySPa96rxtIg== +"@jest/fake-timers@^28.1.2": + version "28.1.2" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-28.1.2.tgz#d49e8ee4e02ba85a6e844a52a5e7c59c23e3b76f" + integrity sha512-xSYEI7Y0D5FbZN2LsCUj/EKRR1zfQYmGuAUVh6xTqhx7V5JhjgMcK5Pa0iR6WIk0GXiHDe0Ke4A+yERKE9saqg== dependencies: - "@jest/types" "^28.1.0" - "@sinonjs/fake-timers" "^9.1.1" + "@jest/types" "^28.1.1" + "@sinonjs/fake-timers" "^9.1.2" "@types/node" "*" - jest-message-util "^28.1.0" - jest-mock "^28.1.0" - jest-util "^28.1.0" + jest-message-util "^28.1.1" + jest-mock "^28.1.1" + jest-util "^28.1.1" -"@jest/globals@^28.1.0": - version "28.1.0" - resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-28.1.0.tgz#a4427d2eb11763002ff58e24de56b84ba79eb793" - integrity sha512-3m7sTg52OTQR6dPhsEQSxAvU+LOBbMivZBwOvKEZ+Rb+GyxVnXi9HKgOTYkx/S99T8yvh17U4tNNJPIEQmtwYw== +"@jest/globals@^28.1.2": + version "28.1.2" + resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-28.1.2.tgz#92fab296e337c7309c25e4202fb724f62249d83f" + integrity sha512-cz0lkJVDOtDaYhvT3Fv2U1B6FtBnV+OpEyJCzTHM1fdoTsU4QNLAt/H4RkiwEUU+dL4g/MFsoTuHeT2pvbo4Hg== dependencies: - "@jest/environment" "^28.1.0" - "@jest/expect" "^28.1.0" - "@jest/types" "^28.1.0" + "@jest/environment" "^28.1.2" + "@jest/expect" "^28.1.2" + "@jest/types" "^28.1.1" -"@jest/reporters@^28.1.0": - version "28.1.0" - resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-28.1.0.tgz#5183a28b9b593b6000fa9b89b031c7216b58a9a0" - integrity sha512-qxbFfqap/5QlSpIizH9c/bFCDKsQlM4uAKSOvZrP+nIdrjqre3FmKzpTtYyhsaVcOSNK7TTt2kjm+4BJIjysFA== +"@jest/reporters@^28.1.2": + version "28.1.2" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-28.1.2.tgz#0327be4ce4d0d9ae49e7908656f89669d0c2a260" + integrity sha512-/whGLhiwAqeCTmQEouSigUZJPVl7sW8V26EiboImL+UyXznnr1a03/YZ2BX8OlFw0n+Zlwu+EZAITZtaeRTxyA== dependencies: "@bcoe/v8-coverage" "^0.2.3" - "@jest/console" "^28.1.0" - "@jest/test-result" "^28.1.0" - "@jest/transform" "^28.1.0" - "@jest/types" "^28.1.0" - "@jridgewell/trace-mapping" "^0.3.7" + "@jest/console" "^28.1.1" + "@jest/test-result" "^28.1.1" + "@jest/transform" "^28.1.2" + "@jest/types" "^28.1.1" + "@jridgewell/trace-mapping" "^0.3.13" "@types/node" "*" chalk "^4.0.0" collect-v8-coverage "^1.0.0" @@ -577,13 +577,14 @@ istanbul-lib-report "^3.0.0" istanbul-lib-source-maps "^4.0.0" istanbul-reports "^3.1.3" - jest-util "^28.1.0" - jest-worker "^28.1.0" + jest-message-util "^28.1.1" + jest-util "^28.1.1" + jest-worker "^28.1.1" slash "^3.0.0" string-length "^4.0.1" strip-ansi "^6.0.0" terminal-link "^2.0.0" - v8-to-istanbul "^9.0.0" + v8-to-istanbul "^9.0.1" "@jest/schemas@^28.0.2": version "28.0.2" @@ -592,51 +593,51 @@ dependencies: "@sinclair/typebox" "^0.23.3" -"@jest/source-map@^28.0.2": - version "28.0.2" - resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-28.0.2.tgz#914546f4410b67b1d42c262a1da7e0406b52dc90" - integrity sha512-Y9dxC8ZpN3kImkk0LkK5XCEneYMAXlZ8m5bflmSL5vrwyeUpJfentacCUg6fOb8NOpOO7hz2+l37MV77T6BFPw== +"@jest/source-map@^28.1.2": + version "28.1.2" + resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-28.1.2.tgz#7fe832b172b497d6663cdff6c13b0a920e139e24" + integrity sha512-cV8Lx3BeStJb8ipPHnqVw/IM2VCMWO3crWZzYodSIkxXnRcXJipCdx1JCK0K5MsJJouZQTH73mzf4vgxRaH9ww== dependencies: - "@jridgewell/trace-mapping" "^0.3.7" + "@jridgewell/trace-mapping" "^0.3.13" callsites "^3.0.0" graceful-fs "^4.2.9" -"@jest/test-result@^28.1.0": - version "28.1.0" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-28.1.0.tgz#fd149dee123510dd2fcadbbf5f0020f98ad7f12c" - integrity sha512-sBBFIyoPzrZho3N+80P35A5oAkSKlGfsEFfXFWuPGBsW40UAjCkGakZhn4UQK4iQlW2vgCDMRDOob9FGKV8YoQ== +"@jest/test-result@^28.1.1": + version "28.1.1" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-28.1.1.tgz#c6f18d1bbb01aa88925dd687872a75f8414b317a" + integrity sha512-hPmkugBktqL6rRzwWAtp1JtYT4VHwv8OQ+9lE5Gymj6dHzubI/oJHMUpPOt8NrdVWSrz9S7bHjJUmv2ggFoUNQ== dependencies: - "@jest/console" "^28.1.0" - "@jest/types" "^28.1.0" + "@jest/console" "^28.1.1" + "@jest/types" "^28.1.1" "@types/istanbul-lib-coverage" "^2.0.0" collect-v8-coverage "^1.0.0" -"@jest/test-sequencer@^28.1.0": - version "28.1.0" - resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-28.1.0.tgz#ce7294bbe986415b9a30e218c7e705e6ebf2cdf2" - integrity sha512-tZCEiVWlWNTs/2iK9yi6o3AlMfbbYgV4uuZInSVdzZ7ftpHZhCMuhvk2HLYhCZzLgPFQ9MnM1YaxMnh3TILFiQ== +"@jest/test-sequencer@^28.1.1": + version "28.1.1" + resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-28.1.1.tgz#f594ee2331df75000afe0d1ae3237630ecec732e" + integrity sha512-nuL+dNSVMcWB7OOtgb0EGH5AjO4UBCt68SLP08rwmC+iRhyuJWS9MtZ/MpipxFwKAlHFftbMsydXqWre8B0+XA== dependencies: - "@jest/test-result" "^28.1.0" + "@jest/test-result" "^28.1.1" graceful-fs "^4.2.9" - jest-haste-map "^28.1.0" + jest-haste-map "^28.1.1" slash "^3.0.0" -"@jest/transform@^28.1.0": - version "28.1.0" - resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-28.1.0.tgz#224a3c9ba4cc98e2ff996c0a89a2d59db15c74ce" - integrity sha512-omy2xe5WxlAfqmsTjTPxw+iXRTRnf+NtX0ToG+4S0tABeb4KsKmPUHq5UBuwunHg3tJRwgEQhEp0M/8oiatLEA== +"@jest/transform@^28.1.2": + version "28.1.2" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-28.1.2.tgz#b367962c53fd53821269bde050ce373e111327c1" + integrity sha512-3o+lKF6iweLeJFHBlMJysdaPbpoMmtbHEFsjzSv37HIq/wWt5ijTeO2Yf7MO5yyczCopD507cNwNLeX8Y/CuIg== dependencies: "@babel/core" "^7.11.6" - "@jest/types" "^28.1.0" - "@jridgewell/trace-mapping" "^0.3.7" + "@jest/types" "^28.1.1" + "@jridgewell/trace-mapping" "^0.3.13" babel-plugin-istanbul "^6.1.1" chalk "^4.0.0" convert-source-map "^1.4.0" fast-json-stable-stringify "^2.0.0" graceful-fs "^4.2.9" - jest-haste-map "^28.1.0" + jest-haste-map "^28.1.1" jest-regex-util "^28.0.2" - jest-util "^28.1.0" + jest-util "^28.1.1" micromatch "^4.0.4" pirates "^4.0.4" slash "^3.0.0" @@ -654,6 +655,18 @@ "@types/yargs" "^17.0.8" chalk "^4.0.0" +"@jest/types@^28.1.1": + version "28.1.1" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-28.1.1.tgz#d059bbc80e6da6eda9f081f293299348bd78ee0b" + integrity sha512-vRXVqSg1VhDnB8bWcmvLzmg0Bt9CRKVgHPXqYwvWMX3TvAjeO+nRuK6+VdTKCtWOvYlmkF/HqNAL/z+N3B53Kw== + dependencies: + "@jest/schemas" "^28.0.2" + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^17.0.8" + chalk "^4.0.0" + "@jridgewell/gen-mapping@^0.3.0": version "0.3.1" resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.1.tgz#cf92a983c83466b8c0ce9124fadeaf09f7c66ea9" @@ -694,7 +707,15 @@ "@jridgewell/resolve-uri" "^3.0.3" "@jridgewell/sourcemap-codec" "^1.4.10" -"@jridgewell/trace-mapping@^0.3.7", "@jridgewell/trace-mapping@^0.3.9": +"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.13": + version "0.3.14" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.14.tgz#b231a081d8f66796e475ad588a1ef473112701ed" + integrity sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@jridgewell/trace-mapping@^0.3.9": version "0.3.13" resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.13.tgz#dcfe3e95f224c8fe97a87a5235defec999aa92ea" integrity sha512-o1xbKhp9qnIAoHJSWd6KlCZfqslL4valSF81H8ImioOAxluWYWOpWkpyktY2vnt4tbrX9XYaxovq6cgowaJp2w== @@ -735,7 +756,7 @@ dependencies: type-detect "4.0.8" -"@sinonjs/fake-timers@^9.1.1": +"@sinonjs/fake-timers@^9.1.2": version "9.1.2" resolved "https://registry.yarnpkg.com/@sinonjs/fake-timers/-/fake-timers-9.1.2.tgz#4eaab737fab77332ab132d396a3c0d364bd0ea8c" integrity sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw== @@ -762,10 +783,10 @@ resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.2.tgz#423c77877d0569db20e1fc80885ac4118314010e" integrity sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA== -"@types/aws-lambda@^8.10.98": - version "8.10.98" - resolved "https://registry.yarnpkg.com/@types/aws-lambda/-/aws-lambda-8.10.98.tgz#2936975c19529011b8b5c08850d42157711c690d" - integrity sha512-dJ/R9qamtI2nNpxhNwPBTwsfYwbcCWsYBJxhpgGyMLCD0HxKpORcMpPpSrFP/FIceNEYfnS3R5EfjSZJmX2oJg== +"@types/aws-lambda@^8.10.101": + version "8.10.101" + resolved "https://registry.yarnpkg.com/@types/aws-lambda/-/aws-lambda-8.10.101.tgz#35d85783a834e04604d49e85dc7ee6e2820e8939" + integrity sha512-84geGyVc0H9P9aGbcg/vkDh5akJq0bEf3tizHNR2d1gcm0wsp9IZ/SW6rPxvgjJFi3OeVxDc8WTKCAjoZbogzg== "@types/babel__core@^7.1.14": version "7.1.18" @@ -833,13 +854,13 @@ dependencies: "@types/istanbul-lib-report" "*" -"@types/jest@^28.1.0": - version "28.1.0" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-28.1.0.tgz#6107d7f8cf46d994e4de23e11f873d61bafe5573" - integrity sha512-ITfF6JJIl9zbEi2k6NmhNE/BiDqfsI/ceqfvdaWaPbcrCpYyyRq4KtDQIWh6vQUru6SqwppODiom/Zhid+np6A== +"@types/jest@^28.1.4": + version "28.1.4" + resolved "https://registry.yarnpkg.com/@types/jest/-/jest-28.1.4.tgz#a11ee6c8fd0b52c19c9c18138b78bbcc201dad5a" + integrity sha512-telv6G5N7zRJiLcI3Rs3o+ipZ28EnE+7EvF0pSrt2pZOMnAVI/f+6/LucDxOvcBcTeTL3JMF744BbVQAVBUQRA== dependencies: - jest-matcher-utils "^27.0.0" - pretty-format "^27.0.0" + jest-matcher-utils "^28.0.0" + pretty-format "^28.0.0" "@types/js-yaml@^4.0.5": version "4.0.5" @@ -873,10 +894,10 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.8.tgz#50d680c8a8a78fe30abe6906453b21ad8ab0ad7b" integrity sha512-YofkM6fGv4gDJq78g4j0mMuGMkZVxZDgtU0JRdx6FgiJDG+0fY0GKVolOV8WqVmEhLCXkQRjwDdKyPxJp/uucg== -"@types/node@^17.0.39": - version "17.0.39" - resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.39.tgz#3652d82e2a16b4ea679d5ea3143b816c91b7e113" - integrity sha512-JDU3YLlnPK3WDao6/DlXLOgSNpG13ct+CwIO17V8q0/9fWJyeMJJ/VyZ1lv8kDprihvZMydzVwf0tQOqGiY2Nw== +"@types/node@^18.0.3": + version "18.0.3" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.0.3.tgz#463fc47f13ec0688a33aec75d078a0541a447199" + integrity sha512-HzNRZtp4eepNitP+BD6k2L6DROIDG4Q0fm4x+dwfsr6LGmROENnok75VGw40628xf+iR24WeMFcHuuBDUAzzsQ== "@types/prettier@^2.1.5": version "2.4.4" @@ -910,14 +931,14 @@ dependencies: "@types/yargs-parser" "*" -"@typescript-eslint/eslint-plugin@^5.27.0": - version "5.27.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.27.0.tgz#23d82a4f21aaafd8f69dbab7e716323bb6695cc8" - integrity sha512-DDrIA7GXtmHXr1VCcx9HivA39eprYBIFxbQEHI6NyraRDxCGpxAFiYQAT/1Y0vh1C+o2vfBiy4IuPoXxtTZCAQ== +"@typescript-eslint/eslint-plugin@^5.30.5": + version "5.30.5" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.30.5.tgz#e9a0afd6eb3b1d663db91cf1e7bc7584d394503d" + integrity sha512-lftkqRoBvc28VFXEoRgyZuztyVUQ04JvUnATSPtIRFAccbXTWL6DEtXGYMcbg998kXw1NLUJm7rTQ9eUt+q6Ig== dependencies: - "@typescript-eslint/scope-manager" "5.27.0" - "@typescript-eslint/type-utils" "5.27.0" - "@typescript-eslint/utils" "5.27.0" + "@typescript-eslint/scope-manager" "5.30.5" + "@typescript-eslint/type-utils" "5.30.5" + "@typescript-eslint/utils" "5.30.5" debug "^4.3.4" functional-red-black-tree "^1.0.1" ignore "^5.2.0" @@ -925,69 +946,69 @@ semver "^7.3.7" tsutils "^3.21.0" -"@typescript-eslint/parser@^5.27.0": - version "5.27.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.27.0.tgz#62bb091ed5cf9c7e126e80021bb563dcf36b6b12" - integrity sha512-8oGjQF46c52l7fMiPPvX4It3u3V3JipssqDfHQ2hcR0AeR8Zge+OYyKUCm5b70X72N1qXt0qgHenwN6Gc2SXZA== +"@typescript-eslint/parser@^5.30.5": + version "5.30.5" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.30.5.tgz#f667c34e4e4c299d98281246c9b1e68c03a92522" + integrity sha512-zj251pcPXI8GO9NDKWWmygP6+UjwWmrdf9qMW/L/uQJBM/0XbU2inxe5io/234y/RCvwpKEYjZ6c1YrXERkK4Q== dependencies: - "@typescript-eslint/scope-manager" "5.27.0" - "@typescript-eslint/types" "5.27.0" - "@typescript-eslint/typescript-estree" "5.27.0" + "@typescript-eslint/scope-manager" "5.30.5" + "@typescript-eslint/types" "5.30.5" + "@typescript-eslint/typescript-estree" "5.30.5" debug "^4.3.4" -"@typescript-eslint/scope-manager@5.27.0": - version "5.27.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.27.0.tgz#a272178f613050ed62f51f69aae1e19e870a8bbb" - integrity sha512-VnykheBQ/sHd1Vt0LJ1JLrMH1GzHO+SzX6VTXuStISIsvRiurue/eRkTqSrG0CexHQgKG8shyJfR4o5VYioB9g== +"@typescript-eslint/scope-manager@5.30.5": + version "5.30.5" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.30.5.tgz#7f90b9d6800552c856a5f3644f5e55dd1469d964" + integrity sha512-NJ6F+YHHFT/30isRe2UTmIGGAiXKckCyMnIV58cE3JkHmaD6e5zyEYm5hBDv0Wbin+IC0T1FWJpD3YqHUG/Ydg== dependencies: - "@typescript-eslint/types" "5.27.0" - "@typescript-eslint/visitor-keys" "5.27.0" + "@typescript-eslint/types" "5.30.5" + "@typescript-eslint/visitor-keys" "5.30.5" -"@typescript-eslint/type-utils@5.27.0": - version "5.27.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.27.0.tgz#36fd95f6747412251d79c795b586ba766cf0974b" - integrity sha512-vpTvRRchaf628Hb/Xzfek+85o//zEUotr1SmexKvTfs7czXfYjXVT/a5yDbpzLBX1rhbqxjDdr1Gyo0x1Fc64g== +"@typescript-eslint/type-utils@5.30.5": + version "5.30.5" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.30.5.tgz#7a9656f360b4b1daea635c4621dab053d08bf8a9" + integrity sha512-k9+ejlv1GgwN1nN7XjVtyCgE0BTzhzT1YsQF0rv4Vfj2U9xnslBgMYYvcEYAFVdvhuEscELJsB7lDkN7WusErw== dependencies: - "@typescript-eslint/utils" "5.27.0" + "@typescript-eslint/utils" "5.30.5" debug "^4.3.4" tsutils "^3.21.0" -"@typescript-eslint/types@5.27.0": - version "5.27.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.27.0.tgz#c3f44b9dda6177a9554f94a74745ca495ba9c001" - integrity sha512-lY6C7oGm9a/GWhmUDOs3xAVRz4ty/XKlQ2fOLr8GAIryGn0+UBOoJDWyHer3UgrHkenorwvBnphhP+zPmzmw0A== +"@typescript-eslint/types@5.30.5": + version "5.30.5" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.30.5.tgz#36a0c05a72af3623cdf9ee8b81ea743b7de75a98" + integrity sha512-kZ80w/M2AvsbRvOr3PjaNh6qEW1LFqs2pLdo2s5R38B2HYXG8Z0PP48/4+j1QHJFL3ssHIbJ4odPRS8PlHrFfw== -"@typescript-eslint/typescript-estree@5.27.0": - version "5.27.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.27.0.tgz#7965f5b553c634c5354a47dcce0b40b94611e995" - integrity sha512-QywPMFvgZ+MHSLRofLI7BDL+UczFFHyj0vF5ibeChDAJgdTV8k4xgEwF0geFhVlPc1p8r70eYewzpo6ps+9LJQ== +"@typescript-eslint/typescript-estree@5.30.5": + version "5.30.5" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.30.5.tgz#c520e4eba20551c4ec76af8d344a42eb6c9767bb" + integrity sha512-qGTc7QZC801kbYjAr4AgdOfnokpwStqyhSbiQvqGBLixniAKyH+ib2qXIVo4P9NgGzwyfD9I0nlJN7D91E1VpQ== dependencies: - "@typescript-eslint/types" "5.27.0" - "@typescript-eslint/visitor-keys" "5.27.0" + "@typescript-eslint/types" "5.30.5" + "@typescript-eslint/visitor-keys" "5.30.5" debug "^4.3.4" globby "^11.1.0" is-glob "^4.0.3" semver "^7.3.7" tsutils "^3.21.0" -"@typescript-eslint/utils@5.27.0": - version "5.27.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.27.0.tgz#d0021cbf686467a6a9499bd0589e19665f9f7e71" - integrity sha512-nZvCrkIJppym7cIbP3pOwIkAefXOmfGPnCM0LQfzNaKxJHI6VjI8NC662uoiPlaf5f6ymkTy9C3NQXev2mdXmA== +"@typescript-eslint/utils@5.30.5": + version "5.30.5" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.30.5.tgz#3999cbd06baad31b9e60d084f20714d1b2776765" + integrity sha512-o4SSUH9IkuA7AYIfAvatldovurqTAHrfzPApOZvdUq01hHojZojCFXx06D/aFpKCgWbMPRdJBWAC3sWp3itwTA== dependencies: "@types/json-schema" "^7.0.9" - "@typescript-eslint/scope-manager" "5.27.0" - "@typescript-eslint/types" "5.27.0" - "@typescript-eslint/typescript-estree" "5.27.0" + "@typescript-eslint/scope-manager" "5.30.5" + "@typescript-eslint/types" "5.30.5" + "@typescript-eslint/typescript-estree" "5.30.5" eslint-scope "^5.1.1" eslint-utils "^3.0.0" -"@typescript-eslint/visitor-keys@5.27.0": - version "5.27.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.27.0.tgz#97aa9a5d2f3df8215e6d3b77f9d214a24db269bd" - integrity sha512-46cYrteA2MrIAjv9ai44OQDUoCZyHeGIc4lsjCUX2WT6r4C+kidz1bNiR4017wHOPUythYeH+Sc7/cFP97KEAA== +"@typescript-eslint/visitor-keys@5.30.5": + version "5.30.5" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.30.5.tgz#d4bb969202019d5d5d849a0aaedc7370cc044b14" + integrity sha512-D+xtGo9HUMELzWIUqcQc0p2PO4NyvTrgIOK/VnSH083+8sq0tiLozNRKuLarwHYGRuA6TVBQSuuLwJUDWd3aaA== dependencies: - "@typescript-eslint/types" "5.27.0" + "@typescript-eslint/types" "5.30.5" eslint-visitor-keys "^3.3.0" acorn-jsx@^5.3.2: @@ -1106,37 +1127,37 @@ at-least-node@^1.0.0: resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== -aws-cdk-lib@^2.27.0: - version "2.27.0" - resolved "https://registry.yarnpkg.com/aws-cdk-lib/-/aws-cdk-lib-2.27.0.tgz#cfc068618485b07a913f8bc3b8beea9b2d4ca767" - integrity sha512-CsTy/+RIBMvP9LlZjkQakkKPpwU50+HAMCMaGOcyIHADDQdXobGcZXTO+Tq00sH2DoQjPV1ZhhBim5z3k/2KXw== +aws-cdk-lib@^2.31.1: + version "2.31.1" + resolved "https://registry.yarnpkg.com/aws-cdk-lib/-/aws-cdk-lib-2.31.1.tgz#97b8a21f14b44875d9424e00758b79c7ec2f765f" + integrity sha512-1IFgMxr1PpX90KFzTRZKVwfY+qP/UzLsrNgfylvqveOKy3R6qtGAhAx186+Zy2nx+wYoy+hVz89CZSItGDapMA== dependencies: "@balena/dockerignore" "^1.0.2" case "1.6.3" fs-extra "^9.1.0" ignore "^5.2.0" - jsonschema "^1.4.0" + jsonschema "^1.4.1" minimatch "^3.1.2" punycode "^2.1.1" semver "^7.3.7" yaml "1.10.2" -aws-cdk@^2.27.0: - version "2.27.0" - resolved "https://registry.yarnpkg.com/aws-cdk/-/aws-cdk-2.27.0.tgz#e4830b68b5262f43181607a73e4f870afe28744b" - integrity sha512-TAKSP4ViFqj+jktFwJl4IE4jZbQCsH32t7L/VcGY71VZV9VqvuzkjF4gGx+hrES+A/dFBtLmPXsumyJu5y0elQ== +aws-cdk@^2.31.1: + version "2.31.1" + resolved "https://registry.yarnpkg.com/aws-cdk/-/aws-cdk-2.31.1.tgz#8ab6d6fb9405baa6c8f6e9f009a66d4cf692a43e" + integrity sha512-iET6uQkkllhidC7EsmC8+q8iHGe8o/JCZiEWAdsU4WvZRFuh0ckktQphYf9l/gKgO9x4hthvcEWbMlnjrmzXsw== optionalDependencies: fsevents "2.3.2" -babel-jest@^28.1.0: - version "28.1.0" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-28.1.0.tgz#95a67f8e2e7c0042e7b3ad3951b8af41a533b5ea" - integrity sha512-zNKk0yhDZ6QUwfxh9k07GII6siNGMJWVUU49gmFj5gfdqDKLqa2RArXOF2CODp4Dr7dLxN2cvAV+667dGJ4b4w== +babel-jest@^28.1.2: + version "28.1.2" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-28.1.2.tgz#2b37fb81439f14d34d8b2cc4a4bd7efabf9acbfe" + integrity sha512-pfmoo6sh4L/+5/G2OOfQrGJgvH7fTa1oChnuYH2G/6gA+JwDvO8PELwvwnofKBMNrQsam0Wy/Rw+QSrBNewq2Q== dependencies: - "@jest/transform" "^28.1.0" + "@jest/transform" "^28.1.2" "@types/babel__core" "^7.1.14" babel-plugin-istanbul "^6.1.1" - babel-preset-jest "^28.0.2" + babel-preset-jest "^28.1.1" chalk "^4.0.0" graceful-fs "^4.2.9" slash "^3.0.0" @@ -1152,10 +1173,10 @@ babel-plugin-istanbul@^6.1.1: istanbul-lib-instrument "^5.0.4" test-exclude "^6.0.0" -babel-plugin-jest-hoist@^28.0.2: - version "28.0.2" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-28.0.2.tgz#9307d03a633be6fc4b1a6bc5c3a87e22bd01dd3b" - integrity sha512-Kizhn/ZL+68ZQHxSnHyuvJv8IchXD62KQxV77TBDV/xoBFBOfgRAk97GNs6hXdTTCiVES9nB2I6+7MXXrk5llQ== +babel-plugin-jest-hoist@^28.1.1: + version "28.1.1" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-28.1.1.tgz#5e055cdcc47894f28341f87f5e35aad2df680b11" + integrity sha512-NovGCy5Hn25uMJSAU8FaHqzs13cFoOI4lhIujiepssjCKRsAo3TA734RDWSGxuFTsUJXerYOqQQodlxgmtqbzw== dependencies: "@babel/template" "^7.3.3" "@babel/types" "^7.3.3" @@ -1180,12 +1201,12 @@ babel-preset-current-node-syntax@^1.0.0: "@babel/plugin-syntax-optional-chaining" "^7.8.3" "@babel/plugin-syntax-top-level-await" "^7.8.3" -babel-preset-jest@^28.0.2: - version "28.0.2" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-28.0.2.tgz#d8210fe4e46c1017e9fa13d7794b166e93aa9f89" - integrity sha512-sYzXIdgIXXroJTFeB3S6sNDWtlJ2dllCdTEsnZ65ACrMojj3hVNFRmnJ1HZtomGi+Be7aqpY/HJ92fr8OhKVkQ== +babel-preset-jest@^28.1.1: + version "28.1.1" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-28.1.1.tgz#5b6e5e69f963eb2d70f739c607b8f723c0ee75e4" + integrity sha512-FCq9Oud0ReTeWtcneYf/48981aTfXYuB9gbU4rBNNJVBSQ6ssv7E6v/qvbBxtOWwZFXjLZwpg+W3q7J6vhH25g== dependencies: - babel-plugin-jest-hoist "^28.0.2" + babel-plugin-jest-hoist "^28.1.1" babel-preset-current-node-syntax "^1.0.0" balanced-match@^1.0.0: @@ -1382,10 +1403,10 @@ concat-map@0.0.1: resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= -constructs@^10.1.26: - version "10.1.26" - resolved "https://registry.yarnpkg.com/constructs/-/constructs-10.1.26.tgz#a3d1e7bfd45c0d1ed9728ce38a82cb3e932f6518" - integrity sha512-Pvkez/igQ9lQLBNFr0FIHzJ4761XpchLV06lLQH2c0kCA10WqGrKBFOgEchT7260VrNVQQ1uBo7R0szphKYvZw== +constructs@^10.1.43: + version "10.1.43" + resolved "https://registry.yarnpkg.com/constructs/-/constructs-10.1.43.tgz#33d3021ba6bfbbbc244932d4626abcaff740cc1f" + integrity sha512-I7CEsYPmcsTpmf+tT3DZq5klCzk2d0Gb6X67P5XxYq0an4+JiWrf8/LCIHV3xqOhnGLAbM/aGZ3bigUNTWeliA== convert-source-map@^1.4.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: version "1.8.0" @@ -1475,15 +1496,10 @@ detect-newline@^3.0.0: resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== -diff-sequences@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-27.5.1.tgz#eaecc0d327fd68c8d9672a1e64ab8dccb2ef5327" - integrity sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ== - -diff-sequences@^28.0.2: - version "28.0.2" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-28.0.2.tgz#40f8d4ffa081acbd8902ba35c798458d0ff1af41" - integrity sha512-YtEoNynLDFCRznv/XDalsKGSZDoj0U5kLnXvY0JSq3nBboRrZXjD81+eSiwi+nzcZDwedMmcowcxNwwgFW23mQ== +diff-sequences@^28.1.1: + version "28.1.1" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-28.1.1.tgz#9989dc731266dc2903457a70e996f3a041913ac6" + integrity sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw== diff@^4.0.1: version "4.0.2" @@ -1578,131 +1594,131 @@ es-to-primitive@^1.2.1: is-date-object "^1.0.1" is-symbol "^1.0.2" -esbuild-android-64@0.14.42: - version "0.14.42" - resolved "https://registry.yarnpkg.com/esbuild-android-64/-/esbuild-android-64-0.14.42.tgz#d7ab3d44d3671218d22bce52f65642b12908d954" - integrity sha512-P4Y36VUtRhK/zivqGVMqhptSrFILAGlYp0Z8r9UQqHJ3iWztRCNWnlBzD9HRx0DbueXikzOiwyOri+ojAFfW6A== - -esbuild-android-arm64@0.14.42: - version "0.14.42" - resolved "https://registry.yarnpkg.com/esbuild-android-arm64/-/esbuild-android-arm64-0.14.42.tgz#45336d8bec49abddb3a022996a23373f45a57c27" - integrity sha512-0cOqCubq+RWScPqvtQdjXG3Czb3AWI2CaKw3HeXry2eoA2rrPr85HF7IpdU26UWdBXgPYtlTN1LUiuXbboROhg== - -esbuild-darwin-64@0.14.42: - version "0.14.42" - resolved "https://registry.yarnpkg.com/esbuild-darwin-64/-/esbuild-darwin-64-0.14.42.tgz#6dff5e44cd70a88c33323e2f5fb598e40c68a9e0" - integrity sha512-ipiBdCA3ZjYgRfRLdQwP82rTiv/YVMtW36hTvAN5ZKAIfxBOyPXY7Cejp3bMXWgzKD8B6O+zoMzh01GZsCuEIA== - -esbuild-darwin-arm64@0.14.42: - version "0.14.42" - resolved "https://registry.yarnpkg.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.42.tgz#2c7313e1b12d2fa5b889c03213d682fb92ca8c4f" - integrity sha512-bU2tHRqTPOaoH/4m0zYHbFWpiYDmaA0gt90/3BMEFaM0PqVK/a6MA2V/ypV5PO0v8QxN6gH5hBPY4YJ2lopXgA== - -esbuild-freebsd-64@0.14.42: - version "0.14.42" - resolved "https://registry.yarnpkg.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.42.tgz#ad1c5a564a7e473b8ce95ee7f76618d05d6daffc" - integrity sha512-75h1+22Ivy07+QvxHyhVqOdekupiTZVLN1PMwCDonAqyXd8TVNJfIRFrdL8QmSJrOJJ5h8H1I9ETyl2L8LQDaw== - -esbuild-freebsd-arm64@0.14.42: - version "0.14.42" - resolved "https://registry.yarnpkg.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.42.tgz#4bdb480234144f944f1930829bace7561135ddc7" - integrity sha512-W6Jebeu5TTDQMJUJVarEzRU9LlKpNkPBbjqSu+GUPTHDCly5zZEQq9uHkmHHl7OKm+mQ2zFySN83nmfCeZCyNA== - -esbuild-linux-32@0.14.42: - version "0.14.42" - resolved "https://registry.yarnpkg.com/esbuild-linux-32/-/esbuild-linux-32-0.14.42.tgz#ef18fd19f067e9d2b5f677d6b82fa81519f5a8c2" - integrity sha512-Ooy/Bj+mJ1z4jlWcK5Dl6SlPlCgQB9zg1UrTCeY8XagvuWZ4qGPyYEWGkT94HUsRi2hKsXvcs6ThTOjBaJSMfg== - -esbuild-linux-64@0.14.42: - version "0.14.42" - resolved "https://registry.yarnpkg.com/esbuild-linux-64/-/esbuild-linux-64-0.14.42.tgz#d84e7333b1c1b22cf8b5b9dbb5dd9b2ecb34b79f" - integrity sha512-2L0HbzQfbTuemUWfVqNIjOfaTRt9zsvjnme6lnr7/MO9toz/MJ5tZhjqrG6uDWDxhsaHI2/nsDgrv8uEEN2eoA== - -esbuild-linux-arm64@0.14.42: - version "0.14.42" - resolved "https://registry.yarnpkg.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.42.tgz#dc19e282f8c4ffbaa470c02a4d171e4ae0180cca" - integrity sha512-c3Ug3e9JpVr8jAcfbhirtpBauLxzYPpycjWulD71CF6ZSY26tvzmXMJYooQ2YKqDY4e/fPu5K8bm7MiXMnyxuA== - -esbuild-linux-arm@0.14.42: - version "0.14.42" - resolved "https://registry.yarnpkg.com/esbuild-linux-arm/-/esbuild-linux-arm-0.14.42.tgz#d49870e63e2242b8156bf473f2ee5154226be328" - integrity sha512-STq69yzCMhdRaWnh29UYrLSr/qaWMm/KqwaRF1pMEK7kDiagaXhSL1zQGXbYv94GuGY/zAwzK98+6idCMUOOCg== - -esbuild-linux-mips64le@0.14.42: - version "0.14.42" - resolved "https://registry.yarnpkg.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.42.tgz#f4e6ff9bf8a6f175470498826f48d093b054fc22" - integrity sha512-QuvpHGbYlkyXWf2cGm51LBCHx6eUakjaSrRpUqhPwjh/uvNUYvLmz2LgPTTPwCqaKt0iwL+OGVL0tXA5aDbAbg== - -esbuild-linux-ppc64le@0.14.42: - version "0.14.42" - resolved "https://registry.yarnpkg.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.42.tgz#ac9c66fc80ba9f8fda15a4cc08f4e55f6c0aed63" - integrity sha512-8ohIVIWDbDT+i7lCx44YCyIRrOW1MYlks9fxTo0ME2LS/fxxdoJBwHWzaDYhjvf8kNpA+MInZvyOEAGoVDrMHg== - -esbuild-linux-riscv64@0.14.42: - version "0.14.42" - resolved "https://registry.yarnpkg.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.42.tgz#21e0ae492a3a9bf4eecbfc916339a66e204256d0" - integrity sha512-DzDqK3TuoXktPyG1Lwx7vhaF49Onv3eR61KwQyxYo4y5UKTpL3NmuarHSIaSVlTFDDpcIajCDwz5/uwKLLgKiQ== - -esbuild-linux-s390x@0.14.42: - version "0.14.42" - resolved "https://registry.yarnpkg.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.42.tgz#06d40b957250ffd9a2183bfdfc9a03d6fd21b3e8" - integrity sha512-YFRhPCxl8nb//Wn6SiS5pmtplBi4z9yC2gLrYoYI/tvwuB1jldir9r7JwAGy1Ck4D7sE7wBN9GFtUUX/DLdcEQ== - -esbuild-netbsd-64@0.14.42: - version "0.14.42" - resolved "https://registry.yarnpkg.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.42.tgz#185664f05f10914f14ed43bd9e22b7de584267f7" - integrity sha512-QYSD2k+oT9dqB/4eEM9c+7KyNYsIPgzYOSrmfNGDIyJrbT1d+CFVKvnKahDKNJLfOYj8N4MgyFaU9/Ytc6w5Vw== - -esbuild-openbsd-64@0.14.42: - version "0.14.42" - resolved "https://registry.yarnpkg.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.42.tgz#c29006f659eb4e55283044bbbd4eb4054fae8839" - integrity sha512-M2meNVIKWsm2HMY7+TU9AxM7ZVwI9havdsw6m/6EzdXysyCFFSoaTQ/Jg03izjCsK17FsVRHqRe26Llj6x0MNA== - -esbuild-sunos-64@0.14.42: - version "0.14.42" - resolved "https://registry.yarnpkg.com/esbuild-sunos-64/-/esbuild-sunos-64-0.14.42.tgz#aa9eec112cd1e7105e7bb37000eca7d460083f8f" - integrity sha512-uXV8TAZEw36DkgW8Ak3MpSJs1ofBb3Smkc/6pZ29sCAN1KzCAQzsje4sUwugf+FVicrHvlamCOlFZIXgct+iqQ== - -esbuild-windows-32@0.14.42: - version "0.14.42" - resolved "https://registry.yarnpkg.com/esbuild-windows-32/-/esbuild-windows-32-0.14.42.tgz#c3fc450853c61a74dacc5679de301db23b73e61e" - integrity sha512-4iw/8qWmRICWi9ZOnJJf9sYt6wmtp3hsN4TdI5NqgjfOkBVMxNdM9Vt3626G1Rda9ya2Q0hjQRD9W1o+m6Lz6g== - -esbuild-windows-64@0.14.42: - version "0.14.42" - resolved "https://registry.yarnpkg.com/esbuild-windows-64/-/esbuild-windows-64-0.14.42.tgz#b877aa37ff47d9fcf0ccb1ca6a24b31475a5e555" - integrity sha512-j3cdK+Y3+a5H0wHKmLGTJcq0+/2mMBHPWkItR3vytp/aUGD/ua/t2BLdfBIzbNN9nLCRL9sywCRpOpFMx3CxzA== - -esbuild-windows-arm64@0.14.42: - version "0.14.42" - resolved "https://registry.yarnpkg.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.42.tgz#79da8744626f24bc016dc40d016950b5a4a2bac5" - integrity sha512-+lRAARnF+hf8J0mN27ujO+VbhPbDqJ8rCcJKye4y7YZLV6C4n3pTRThAb388k/zqF5uM0lS5O201u0OqoWSicw== - -esbuild@^0.14.42: - version "0.14.42" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.14.42.tgz#98587df0b024d5f6341b12a1d735a2bff55e1836" - integrity sha512-V0uPZotCEHokJdNqyozH6qsaQXqmZEOiZWrXnds/zaH/0SyrIayRXWRB98CENO73MIZ9T3HBIOsmds5twWtmgw== +esbuild-android-64@0.14.48: + version "0.14.48" + resolved "https://registry.yarnpkg.com/esbuild-android-64/-/esbuild-android-64-0.14.48.tgz#7e6394a0e517f738641385aaf553c7e4fb6d1ae3" + integrity sha512-3aMjboap/kqwCUpGWIjsk20TtxVoKck8/4Tu19rubh7t5Ra0Yrpg30Mt1QXXlipOazrEceGeWurXKeFJgkPOUg== + +esbuild-android-arm64@0.14.48: + version "0.14.48" + resolved "https://registry.yarnpkg.com/esbuild-android-arm64/-/esbuild-android-arm64-0.14.48.tgz#6877566be0f82dd5a43030c0007d06ece7f7c02f" + integrity sha512-vptI3K0wGALiDq+EvRuZotZrJqkYkN5282iAfcffjI5lmGG9G1ta/CIVauhY42MBXwEgDJkweiDcDMRLzBZC4g== + +esbuild-darwin-64@0.14.48: + version "0.14.48" + resolved "https://registry.yarnpkg.com/esbuild-darwin-64/-/esbuild-darwin-64-0.14.48.tgz#ea3caddb707d88f844b1aa1dea5ff3b0a71ef1fd" + integrity sha512-gGQZa4+hab2Va/Zww94YbshLuWteyKGD3+EsVon8EWTWhnHFRm5N9NbALNbwi/7hQ/hM1Zm4FuHg+k6BLsl5UA== + +esbuild-darwin-arm64@0.14.48: + version "0.14.48" + resolved "https://registry.yarnpkg.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.48.tgz#4e5eaab54df66cc319b76a2ac0e8af4e6f0d9c2f" + integrity sha512-bFjnNEXjhZT+IZ8RvRGNJthLWNHV5JkCtuOFOnjvo5pC0sk2/QVk0Qc06g2PV3J0TcU6kaPC3RN9yy9w2PSLEA== + +esbuild-freebsd-64@0.14.48: + version "0.14.48" + resolved "https://registry.yarnpkg.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.48.tgz#47b5abc7426eae66861490ffbb380acc67af5b15" + integrity sha512-1NOlwRxmOsnPcWOGTB10JKAkYSb2nue0oM1AfHWunW/mv3wERfJmnYlGzL3UAOIUXZqW8GeA2mv+QGwq7DToqA== + +esbuild-freebsd-arm64@0.14.48: + version "0.14.48" + resolved "https://registry.yarnpkg.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.48.tgz#e8c54c8637cd44feed967ea12338b0a4da3a7b11" + integrity sha512-gXqKdO8wabVcYtluAbikDH2jhXp+Klq5oCD5qbVyUG6tFiGhrC9oczKq3vIrrtwcxDQqK6+HDYK8Zrd4bCA9Gw== + +esbuild-linux-32@0.14.48: + version "0.14.48" + resolved "https://registry.yarnpkg.com/esbuild-linux-32/-/esbuild-linux-32-0.14.48.tgz#229cf3246de2b7937c3ac13fac622d4d7a1344c5" + integrity sha512-ghGyDfS289z/LReZQUuuKq9KlTiTspxL8SITBFQFAFRA/IkIvDpnZnCAKTCjGXAmUqroMQfKJXMxyjJA69c/nQ== + +esbuild-linux-64@0.14.48: + version "0.14.48" + resolved "https://registry.yarnpkg.com/esbuild-linux-64/-/esbuild-linux-64-0.14.48.tgz#7c0e7226c02c42aacc5656c36977493dc1e96c4f" + integrity sha512-vni3p/gppLMVZLghI7oMqbOZdGmLbbKR23XFARKnszCIBpEMEDxOMNIKPmMItQrmH/iJrL1z8Jt2nynY0bE1ug== + +esbuild-linux-arm64@0.14.48: + version "0.14.48" + resolved "https://registry.yarnpkg.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.48.tgz#0af1eda474b5c6cc0cace8235b74d0cb8fcf57a7" + integrity sha512-3CFsOlpoxlKPRevEHq8aAntgYGYkE1N9yRYAcPyng/p4Wyx0tPR5SBYsxLKcgPB9mR8chHEhtWYz6EZ+H199Zw== + +esbuild-linux-arm@0.14.48: + version "0.14.48" + resolved "https://registry.yarnpkg.com/esbuild-linux-arm/-/esbuild-linux-arm-0.14.48.tgz#de4d1fa6b77cdcd00e2bb43dd0801e4680f0ab52" + integrity sha512-+VfSV7Akh1XUiDNXgqgY1cUP1i2vjI+BmlyXRfVz5AfV3jbpde8JTs5Q9sYgaoq5cWfuKfoZB/QkGOI+QcL1Tw== + +esbuild-linux-mips64le@0.14.48: + version "0.14.48" + resolved "https://registry.yarnpkg.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.48.tgz#822c1778495f7868e990d4da47ad7281df28fd15" + integrity sha512-cs0uOiRlPp6ymknDnjajCgvDMSsLw5mST2UXh+ZIrXTj2Ifyf2aAP3Iw4DiqgnyYLV2O/v/yWBJx+WfmKEpNLA== + +esbuild-linux-ppc64le@0.14.48: + version "0.14.48" + resolved "https://registry.yarnpkg.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.48.tgz#55de0a9ec4a48fedfe82a63e083164d001709447" + integrity sha512-+2F0vJMkuI0Wie/wcSPDCqXvSFEELH7Jubxb7mpWrA/4NpT+/byjxDz0gG6R1WJoeDefcrMfpBx4GFNN1JQorQ== + +esbuild-linux-riscv64@0.14.48: + version "0.14.48" + resolved "https://registry.yarnpkg.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.48.tgz#cd2b7381880b2f4b21a5a598fb673492120f18a5" + integrity sha512-BmaK/GfEE+5F2/QDrIXteFGKnVHGxlnK9MjdVKMTfvtmudjY3k2t8NtlY4qemKSizc+QwyombGWTBDc76rxePA== + +esbuild-linux-s390x@0.14.48: + version "0.14.48" + resolved "https://registry.yarnpkg.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.48.tgz#4b319eca2a5c64637fc7397ffbd9671719cdb6bf" + integrity sha512-tndw/0B9jiCL+KWKo0TSMaUm5UWBLsfCKVdbfMlb3d5LeV9WbijZ8Ordia8SAYv38VSJWOEt6eDCdOx8LqkC4g== + +esbuild-netbsd-64@0.14.48: + version "0.14.48" + resolved "https://registry.yarnpkg.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.48.tgz#c27cde8b5cb55dcc227943a18ab078fb98d0adbf" + integrity sha512-V9hgXfwf/T901Lr1wkOfoevtyNkrxmMcRHyticybBUHookznipMOHoF41Al68QBsqBxnITCEpjjd4yAos7z9Tw== + +esbuild-openbsd-64@0.14.48: + version "0.14.48" + resolved "https://registry.yarnpkg.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.48.tgz#af5ab2d1cb41f09064bba9465fc8bf1309150df1" + integrity sha512-+IHf4JcbnnBl4T52egorXMatil/za0awqzg2Vy6FBgPcBpisDWT2sVz/tNdrK9kAqj+GZG/jZdrOkj7wsrNTKA== + +esbuild-sunos-64@0.14.48: + version "0.14.48" + resolved "https://registry.yarnpkg.com/esbuild-sunos-64/-/esbuild-sunos-64-0.14.48.tgz#db3ae20526055cf6fd5c4582676233814603ac54" + integrity sha512-77m8bsr5wOpOWbGi9KSqDphcq6dFeJyun8TA+12JW/GAjyfTwVtOnN8DOt6DSPUfEV+ltVMNqtXUeTeMAxl5KA== + +esbuild-windows-32@0.14.48: + version "0.14.48" + resolved "https://registry.yarnpkg.com/esbuild-windows-32/-/esbuild-windows-32-0.14.48.tgz#021ffceb0a3f83078262870da88a912293c57475" + integrity sha512-EPgRuTPP8vK9maxpTGDe5lSoIBHGKO/AuxDncg5O3NkrPeLNdvvK8oywB0zGaAZXxYWfNNSHskvvDgmfVTguhg== + +esbuild-windows-64@0.14.48: + version "0.14.48" + resolved "https://registry.yarnpkg.com/esbuild-windows-64/-/esbuild-windows-64-0.14.48.tgz#a4d3407b580f9faac51f61eec095fa985fb3fee4" + integrity sha512-YmpXjdT1q0b8ictSdGwH3M8VCoqPpK1/UArze3X199w6u8hUx3V8BhAi1WjbsfDYRBanVVtduAhh2sirImtAvA== + +esbuild-windows-arm64@0.14.48: + version "0.14.48" + resolved "https://registry.yarnpkg.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.48.tgz#762c0562127d8b09bfb70a3c816460742dd82880" + integrity sha512-HHaOMCsCXp0rz5BT2crTka6MPWVno121NKApsGs/OIW5QC0ggC69YMGs1aJct9/9FSUF4A1xNE/cLvgB5svR4g== + +esbuild@^0.14.48: + version "0.14.48" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.14.48.tgz#da5d8d25cd2d940c45ea0cfecdca727f7aee2b85" + integrity sha512-w6N1Yn5MtqK2U1/WZTX9ZqUVb8IOLZkZ5AdHkT6x3cHDMVsYWC7WPdiLmx19w3i4Rwzy5LqsEMtVihG3e4rFzA== optionalDependencies: - esbuild-android-64 "0.14.42" - esbuild-android-arm64 "0.14.42" - esbuild-darwin-64 "0.14.42" - esbuild-darwin-arm64 "0.14.42" - esbuild-freebsd-64 "0.14.42" - esbuild-freebsd-arm64 "0.14.42" - esbuild-linux-32 "0.14.42" - esbuild-linux-64 "0.14.42" - esbuild-linux-arm "0.14.42" - esbuild-linux-arm64 "0.14.42" - esbuild-linux-mips64le "0.14.42" - esbuild-linux-ppc64le "0.14.42" - esbuild-linux-riscv64 "0.14.42" - esbuild-linux-s390x "0.14.42" - esbuild-netbsd-64 "0.14.42" - esbuild-openbsd-64 "0.14.42" - esbuild-sunos-64 "0.14.42" - esbuild-windows-32 "0.14.42" - esbuild-windows-64 "0.14.42" - esbuild-windows-arm64 "0.14.42" + esbuild-android-64 "0.14.48" + esbuild-android-arm64 "0.14.48" + esbuild-darwin-64 "0.14.48" + esbuild-darwin-arm64 "0.14.48" + esbuild-freebsd-64 "0.14.48" + esbuild-freebsd-arm64 "0.14.48" + esbuild-linux-32 "0.14.48" + esbuild-linux-64 "0.14.48" + esbuild-linux-arm "0.14.48" + esbuild-linux-arm64 "0.14.48" + esbuild-linux-mips64le "0.14.48" + esbuild-linux-ppc64le "0.14.48" + esbuild-linux-riscv64 "0.14.48" + esbuild-linux-s390x "0.14.48" + esbuild-netbsd-64 "0.14.48" + esbuild-openbsd-64 "0.14.48" + esbuild-sunos-64 "0.14.48" + esbuild-windows-32 "0.14.48" + esbuild-windows-64 "0.14.48" + esbuild-windows-arm64 "0.14.48" escalade@^3.1.1: version "3.1.1" @@ -1799,10 +1815,10 @@ eslint-visitor-keys@^3.3.0: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826" integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA== -eslint@^8.17.0: - version "8.17.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.17.0.tgz#1cfc4b6b6912f77d24b874ca1506b0fe09328c21" - integrity sha512-gq0m0BTJfci60Fz4nczYxNAlED+sMcihltndR8t9t1evnU/azx53x3t2UHXC/uRjcbvRw/XctpaNygSTcQD+Iw== +eslint@^8.19.0: + version "8.19.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.19.0.tgz#7342a3cbc4fbc5c106a1eefe0fd0b50b6b1a7d28" + integrity sha512-SXOPj3x9VKvPe81TjjUJCYlV4oJjQw68Uek+AM0X4p+33dj2HY5bpTZOgnQHcG2eAm1mtCU9uNMnJi7exU/kYw== dependencies: "@eslint/eslintrc" "^1.3.0" "@humanwhocodes/config-array" "^0.9.2" @@ -1903,16 +1919,16 @@ exit@^0.1.2: resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw= -expect@^28.1.0: - version "28.1.0" - resolved "https://registry.yarnpkg.com/expect/-/expect-28.1.0.tgz#10e8da64c0850eb8c39a480199f14537f46e8360" - integrity sha512-qFXKl8Pmxk8TBGfaFKRtcQjfXEnKAs+dmlxdwvukJZorwrAabT7M3h8oLOG01I2utEhkmUTi17CHaPBovZsKdw== +expect@^28.1.1: + version "28.1.1" + resolved "https://registry.yarnpkg.com/expect/-/expect-28.1.1.tgz#ca6fff65f6517cf7220c2e805a49c19aea30b420" + integrity sha512-/AANEwGL0tWBwzLNOvO0yUdy2D52jVdNXppOqswC49sxMN2cPWsGCQdzuIf9tj6hHoBQzNvx75JUYuQAckPo3w== dependencies: - "@jest/expect-utils" "^28.1.0" + "@jest/expect-utils" "^28.1.1" jest-get-type "^28.0.2" - jest-matcher-utils "^28.1.0" - jest-message-util "^28.1.0" - jest-util "^28.1.0" + jest-matcher-utils "^28.1.1" + jest-message-util "^28.1.1" + jest-util "^28.1.1" fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" @@ -2389,205 +2405,180 @@ jest-changed-files@^28.0.2: execa "^5.0.0" throat "^6.0.1" -jest-circus@^28.1.0: - version "28.1.0" - resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-28.1.0.tgz#e229f590911bd54d60efaf076f7acd9360296dae" - integrity sha512-rNYfqfLC0L0zQKRKsg4n4J+W1A2fbyGH7Ss/kDIocp9KXD9iaL111glsLu7+Z7FHuZxwzInMDXq+N1ZIBkI/TQ== +jest-circus@^28.1.2: + version "28.1.2" + resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-28.1.2.tgz#0d5a5623eccb244efe87d1edc365696e4fcf80ce" + integrity sha512-E2vdPIJG5/69EMpslFhaA46WkcrN74LI5V/cSJ59L7uS8UNoXbzTxmwhpi9XrIL3zqvMt5T0pl5k2l2u2GwBNQ== dependencies: - "@jest/environment" "^28.1.0" - "@jest/expect" "^28.1.0" - "@jest/test-result" "^28.1.0" - "@jest/types" "^28.1.0" + "@jest/environment" "^28.1.2" + "@jest/expect" "^28.1.2" + "@jest/test-result" "^28.1.1" + "@jest/types" "^28.1.1" "@types/node" "*" chalk "^4.0.0" co "^4.6.0" dedent "^0.7.0" is-generator-fn "^2.0.0" - jest-each "^28.1.0" - jest-matcher-utils "^28.1.0" - jest-message-util "^28.1.0" - jest-runtime "^28.1.0" - jest-snapshot "^28.1.0" - jest-util "^28.1.0" - pretty-format "^28.1.0" + jest-each "^28.1.1" + jest-matcher-utils "^28.1.1" + jest-message-util "^28.1.1" + jest-runtime "^28.1.2" + jest-snapshot "^28.1.2" + jest-util "^28.1.1" + pretty-format "^28.1.1" slash "^3.0.0" stack-utils "^2.0.3" throat "^6.0.1" -jest-cli@^28.1.0: - version "28.1.0" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-28.1.0.tgz#cd1d8adb9630102d5ba04a22895f63decdd7ac1f" - integrity sha512-fDJRt6WPRriHrBsvvgb93OxgajHHsJbk4jZxiPqmZbMDRcHskfJBBfTyjFko0jjfprP544hOktdSi9HVgl4VUQ== +jest-cli@^28.1.2: + version "28.1.2" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-28.1.2.tgz#b89012e5bad14135e71b1628b85475d3773a1bbc" + integrity sha512-l6eoi5Do/IJUXAFL9qRmDiFpBeEJAnjJb1dcd9i/VWfVWbp3mJhuH50dNtX67Ali4Ecvt4eBkWb4hXhPHkAZTw== dependencies: - "@jest/core" "^28.1.0" - "@jest/test-result" "^28.1.0" - "@jest/types" "^28.1.0" + "@jest/core" "^28.1.2" + "@jest/test-result" "^28.1.1" + "@jest/types" "^28.1.1" chalk "^4.0.0" exit "^0.1.2" graceful-fs "^4.2.9" import-local "^3.0.2" - jest-config "^28.1.0" - jest-util "^28.1.0" - jest-validate "^28.1.0" + jest-config "^28.1.2" + jest-util "^28.1.1" + jest-validate "^28.1.1" prompts "^2.0.1" yargs "^17.3.1" -jest-config@^28.1.0: - version "28.1.0" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-28.1.0.tgz#fca22ca0760e746fe1ce1f9406f6b307ab818501" - integrity sha512-aOV80E9LeWrmflp7hfZNn/zGA4QKv/xsn2w8QCBP0t0+YqObuCWTSgNbHJ0j9YsTuCO08ZR/wsvlxqqHX20iUA== +jest-config@^28.1.2: + version "28.1.2" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-28.1.2.tgz#ba00ad30caf62286c86e7c1099e915218a0ac8c6" + integrity sha512-g6EfeRqddVbjPVBVY4JWpUY4IvQoFRIZcv4V36QkqzE0IGhEC/VkugFeBMAeUE7PRgC8KJF0yvJNDeQRbamEVA== dependencies: "@babel/core" "^7.11.6" - "@jest/test-sequencer" "^28.1.0" - "@jest/types" "^28.1.0" - babel-jest "^28.1.0" + "@jest/test-sequencer" "^28.1.1" + "@jest/types" "^28.1.1" + babel-jest "^28.1.2" chalk "^4.0.0" ci-info "^3.2.0" deepmerge "^4.2.2" glob "^7.1.3" graceful-fs "^4.2.9" - jest-circus "^28.1.0" - jest-environment-node "^28.1.0" + jest-circus "^28.1.2" + jest-environment-node "^28.1.2" jest-get-type "^28.0.2" jest-regex-util "^28.0.2" - jest-resolve "^28.1.0" - jest-runner "^28.1.0" - jest-util "^28.1.0" - jest-validate "^28.1.0" + jest-resolve "^28.1.1" + jest-runner "^28.1.2" + jest-util "^28.1.1" + jest-validate "^28.1.1" micromatch "^4.0.4" parse-json "^5.2.0" - pretty-format "^28.1.0" + pretty-format "^28.1.1" slash "^3.0.0" strip-json-comments "^3.1.1" -jest-diff@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-27.5.1.tgz#a07f5011ac9e6643cf8a95a462b7b1ecf6680def" - integrity sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw== - dependencies: - chalk "^4.0.0" - diff-sequences "^27.5.1" - jest-get-type "^27.5.1" - pretty-format "^27.5.1" - -jest-diff@^28.1.0: - version "28.1.0" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-28.1.0.tgz#77686fef899ec1873dbfbf9330e37dd429703269" - integrity sha512-8eFd3U3OkIKRtlasXfiAQfbovgFgRDb0Ngcs2E+FMeBZ4rUezqIaGjuyggJBp+llosQXNEWofk/Sz4Hr5gMUhA== +jest-diff@^28.1.1: + version "28.1.1" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-28.1.1.tgz#1a3eedfd81ae79810931c63a1d0f201b9120106c" + integrity sha512-/MUUxeR2fHbqHoMMiffe/Afm+U8U4olFRJ0hiVG2lZatPJcnGxx292ustVu7bULhjV65IYMxRdploAKLbcrsyg== dependencies: chalk "^4.0.0" - diff-sequences "^28.0.2" + diff-sequences "^28.1.1" jest-get-type "^28.0.2" - pretty-format "^28.1.0" + pretty-format "^28.1.1" -jest-docblock@^28.0.2: - version "28.0.2" - resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-28.0.2.tgz#3cab8abea53275c9d670cdca814fc89fba1298c2" - integrity sha512-FH10WWw5NxLoeSdQlJwu+MTiv60aXV/t8KEwIRGEv74WARE1cXIqh1vGdy2CraHuWOOrnzTWj/azQKqW4fO7xg== +jest-docblock@^28.1.1: + version "28.1.1" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-28.1.1.tgz#6f515c3bf841516d82ecd57a62eed9204c2f42a8" + integrity sha512-3wayBVNiOYx0cwAbl9rwm5kKFP8yHH3d/fkEaL02NPTkDojPtheGB7HZSFY4wzX+DxyrvhXz0KSCVksmCknCuA== dependencies: detect-newline "^3.0.0" -jest-each@^28.1.0: - version "28.1.0" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-28.1.0.tgz#54ae66d6a0a5b1913e9a87588d26c2687c39458b" - integrity sha512-a/XX02xF5NTspceMpHujmOexvJ4GftpYXqr6HhhmKmExtMXsyIN/fvanQlt/BcgFoRKN4OCXxLQKth9/n6OPFg== +jest-each@^28.1.1: + version "28.1.1" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-28.1.1.tgz#ba5238dacf4f31d9fe23ddc2c44c01e7c23885c4" + integrity sha512-A042rqh17ZvEhRceDMi784ppoXR7MWGDEKTXEZXb4svt0eShMZvijGxzKsx+yIjeE8QYmHPrnHiTSQVhN4nqaw== dependencies: - "@jest/types" "^28.1.0" + "@jest/types" "^28.1.1" chalk "^4.0.0" jest-get-type "^28.0.2" - jest-util "^28.1.0" - pretty-format "^28.1.0" + jest-util "^28.1.1" + pretty-format "^28.1.1" -jest-environment-node@^28.1.0: - version "28.1.0" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-28.1.0.tgz#6ed2150aa31babba0c488c5b4f4d813a585c68e6" - integrity sha512-gBLZNiyrPw9CSMlTXF1yJhaBgWDPVvH0Pq6bOEwGMXaYNzhzhw2kA/OijNF8egbCgDS0/veRv97249x2CX+udQ== +jest-environment-node@^28.1.2: + version "28.1.2" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-28.1.2.tgz#3e2eb47f6d173b0648d5f7c717cb1c26651d5c8a" + integrity sha512-oYsZz9Qw27XKmOgTtnl0jW7VplJkN2oeof+SwAwKFQacq3CLlG9u4kTGuuLWfvu3J7bVutWlrbEQMOCL/jughw== dependencies: - "@jest/environment" "^28.1.0" - "@jest/fake-timers" "^28.1.0" - "@jest/types" "^28.1.0" + "@jest/environment" "^28.1.2" + "@jest/fake-timers" "^28.1.2" + "@jest/types" "^28.1.1" "@types/node" "*" - jest-mock "^28.1.0" - jest-util "^28.1.0" - -jest-get-type@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-27.5.1.tgz#3cd613c507b0f7ace013df407a1c1cd578bcb4f1" - integrity sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw== + jest-mock "^28.1.1" + jest-util "^28.1.1" jest-get-type@^28.0.2: version "28.0.2" resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-28.0.2.tgz#34622e628e4fdcd793d46db8a242227901fcf203" integrity sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA== -jest-haste-map@^28.1.0: - version "28.1.0" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-28.1.0.tgz#6c1ee2daf1c20a3e03dbd8e5b35c4d73d2349cf0" - integrity sha512-xyZ9sXV8PtKi6NCrJlmq53PyNVHzxmcfXNVvIRHpHmh1j/HChC4pwKgyjj7Z9us19JMw8PpQTJsFWOsIfT93Dw== +jest-haste-map@^28.1.1: + version "28.1.1" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-28.1.1.tgz#471685f1acd365a9394745bb97c8fc16289adca3" + integrity sha512-ZrRSE2o3Ezh7sb1KmeLEZRZ4mgufbrMwolcFHNRSjKZhpLa8TdooXOOFlSwoUzlbVs1t0l7upVRW2K7RWGHzbQ== dependencies: - "@jest/types" "^28.1.0" + "@jest/types" "^28.1.1" "@types/graceful-fs" "^4.1.3" "@types/node" "*" anymatch "^3.0.3" fb-watchman "^2.0.0" graceful-fs "^4.2.9" jest-regex-util "^28.0.2" - jest-util "^28.1.0" - jest-worker "^28.1.0" + jest-util "^28.1.1" + jest-worker "^28.1.1" micromatch "^4.0.4" - walker "^1.0.7" + walker "^1.0.8" optionalDependencies: fsevents "^2.3.2" -jest-leak-detector@^28.1.0: - version "28.1.0" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-28.1.0.tgz#b65167776a8787443214d6f3f54935a4c73c8a45" - integrity sha512-uIJDQbxwEL2AMMs2xjhZl2hw8s77c3wrPaQ9v6tXJLGaaQ+4QrNJH5vuw7hA7w/uGT/iJ42a83opAqxGHeyRIA== +jest-leak-detector@^28.1.1: + version "28.1.1" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-28.1.1.tgz#537f37afd610a4b3f4cab15e06baf60484548efb" + integrity sha512-4jvs8V8kLbAaotE+wFR7vfUGf603cwYtFf1/PYEsyX2BAjSzj8hQSVTP6OWzseTl0xL6dyHuKs2JAks7Pfubmw== dependencies: jest-get-type "^28.0.2" - pretty-format "^28.1.0" - -jest-matcher-utils@^27.0.0: - version "27.5.1" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz#9c0cdbda8245bc22d2331729d1091308b40cf8ab" - integrity sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw== - dependencies: - chalk "^4.0.0" - jest-diff "^27.5.1" - jest-get-type "^27.5.1" - pretty-format "^27.5.1" + pretty-format "^28.1.1" -jest-matcher-utils@^28.1.0: - version "28.1.0" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-28.1.0.tgz#2ae398806668eeabd293c61712227cb94b250ccf" - integrity sha512-onnax0n2uTLRQFKAjC7TuaxibrPSvZgKTcSCnNUz/tOjJ9UhxNm7ZmPpoQavmTDUjXvUQ8KesWk2/VdrxIFzTQ== +jest-matcher-utils@^28.0.0, jest-matcher-utils@^28.1.1: + version "28.1.1" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-28.1.1.tgz#a7c4653c2b782ec96796eb3088060720f1e29304" + integrity sha512-NPJPRWrbmR2nAJ+1nmnfcKKzSwgfaciCCrYZzVnNoxVoyusYWIjkBMNvu0RHJe7dNj4hH3uZOPZsQA+xAYWqsw== dependencies: chalk "^4.0.0" - jest-diff "^28.1.0" + jest-diff "^28.1.1" jest-get-type "^28.0.2" - pretty-format "^28.1.0" + pretty-format "^28.1.1" -jest-message-util@^28.1.0: - version "28.1.0" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-28.1.0.tgz#7e8f0b9049e948e7b94c2a52731166774ba7d0af" - integrity sha512-RpA8mpaJ/B2HphDMiDlrAZdDytkmwFqgjDZovM21F35lHGeUeCvYmm6W+sbQ0ydaLpg5bFAUuWG1cjqOl8vqrw== +jest-message-util@^28.1.1: + version "28.1.1" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-28.1.1.tgz#60aa0b475cfc08c8a9363ed2fb9108514dd9ab89" + integrity sha512-xoDOOT66fLfmTRiqkoLIU7v42mal/SqwDKvfmfiWAdJMSJiU+ozgluO7KbvoAgiwIrrGZsV7viETjc8GNrA/IQ== dependencies: "@babel/code-frame" "^7.12.13" - "@jest/types" "^28.1.0" + "@jest/types" "^28.1.1" "@types/stack-utils" "^2.0.0" chalk "^4.0.0" graceful-fs "^4.2.9" micromatch "^4.0.4" - pretty-format "^28.1.0" + pretty-format "^28.1.1" slash "^3.0.0" stack-utils "^2.0.3" -jest-mock@^28.1.0: - version "28.1.0" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-28.1.0.tgz#ccc7cc12a9b330b3182db0c651edc90d163ff73e" - integrity sha512-H7BrhggNn77WhdL7O1apG0Q/iwl0Bdd5E1ydhCJzL3oBLh/UYxAwR3EJLsBZ9XA3ZU4PA3UNw4tQjduBTCTmLw== +jest-mock@^28.1.1: + version "28.1.1" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-28.1.1.tgz#37903d269427fa1ef5b2447be874e1c62a39a371" + integrity sha512-bDCb0FjfsmKweAvE09dZT59IMkzgN0fYBH6t5S45NoJfd2DHkS3ySG2K+hucortryhO3fVuXdlxWcbtIuV/Skw== dependencies: - "@jest/types" "^28.1.0" + "@jest/types" "^28.1.1" "@types/node" "*" jest-pnp-resolver@^1.2.2: @@ -2600,114 +2591,114 @@ jest-regex-util@^28.0.2: resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-28.0.2.tgz#afdc377a3b25fb6e80825adcf76c854e5bf47ead" integrity sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw== -jest-resolve-dependencies@^28.1.0: - version "28.1.0" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-28.1.0.tgz#167becb8bee6e20b5ef4a3a728ec67aef6b0b79b" - integrity sha512-Ue1VYoSZquPwEvng7Uefw8RmZR+me/1kr30H2jMINjGeHgeO/JgrR6wxj2ofkJ7KSAA11W3cOrhNCbj5Dqqd9g== +jest-resolve-dependencies@^28.1.2: + version "28.1.2" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-28.1.2.tgz#ca528858e0c6642d5a1dda8fc7cda10230c275bc" + integrity sha512-OXw4vbOZuyRTBi3tapWBqdyodU+T33ww5cPZORuTWkg+Y8lmsxQlVu3MWtJh6NMlKRTHQetF96yGPv01Ye7Mbg== dependencies: jest-regex-util "^28.0.2" - jest-snapshot "^28.1.0" + jest-snapshot "^28.1.2" -jest-resolve@^28.1.0: - version "28.1.0" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-28.1.0.tgz#b1f32748a6cee7d1779c7ef639c0a87078de3d35" - integrity sha512-vvfN7+tPNnnhDvISuzD1P+CRVP8cK0FHXRwPAcdDaQv4zgvwvag2n55/h5VjYcM5UJG7L4TwE5tZlzcI0X2Lhw== +jest-resolve@^28.1.1: + version "28.1.1" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-28.1.1.tgz#bc2eaf384abdcc1aaf3ba7c50d1adf01e59095e5" + integrity sha512-/d1UbyUkf9nvsgdBildLe6LAD4DalgkgZcKd0nZ8XUGPyA/7fsnaQIlKVnDiuUXv/IeZhPEDrRJubVSulxrShA== dependencies: chalk "^4.0.0" graceful-fs "^4.2.9" - jest-haste-map "^28.1.0" + jest-haste-map "^28.1.1" jest-pnp-resolver "^1.2.2" - jest-util "^28.1.0" - jest-validate "^28.1.0" + jest-util "^28.1.1" + jest-validate "^28.1.1" resolve "^1.20.0" resolve.exports "^1.1.0" slash "^3.0.0" -jest-runner@^28.1.0: - version "28.1.0" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-28.1.0.tgz#aefe2a1e618a69baa0b24a50edc54fdd7e728eaa" - integrity sha512-FBpmuh1HB2dsLklAlRdOxNTTHKFR6G1Qmd80pVDvwbZXTriqjWqjei5DKFC1UlM732KjYcE6yuCdiF0WUCOS2w== +jest-runner@^28.1.2: + version "28.1.2" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-28.1.2.tgz#f293409592a62234285a71237e38499a3554e350" + integrity sha512-6/k3DlAsAEr5VcptCMdhtRhOoYClZQmxnVMZvZ/quvPGRpN7OBQYPIC32tWSgOnbgqLXNs5RAniC+nkdFZpD4A== dependencies: - "@jest/console" "^28.1.0" - "@jest/environment" "^28.1.0" - "@jest/test-result" "^28.1.0" - "@jest/transform" "^28.1.0" - "@jest/types" "^28.1.0" + "@jest/console" "^28.1.1" + "@jest/environment" "^28.1.2" + "@jest/test-result" "^28.1.1" + "@jest/transform" "^28.1.2" + "@jest/types" "^28.1.1" "@types/node" "*" chalk "^4.0.0" emittery "^0.10.2" graceful-fs "^4.2.9" - jest-docblock "^28.0.2" - jest-environment-node "^28.1.0" - jest-haste-map "^28.1.0" - jest-leak-detector "^28.1.0" - jest-message-util "^28.1.0" - jest-resolve "^28.1.0" - jest-runtime "^28.1.0" - jest-util "^28.1.0" - jest-watcher "^28.1.0" - jest-worker "^28.1.0" + jest-docblock "^28.1.1" + jest-environment-node "^28.1.2" + jest-haste-map "^28.1.1" + jest-leak-detector "^28.1.1" + jest-message-util "^28.1.1" + jest-resolve "^28.1.1" + jest-runtime "^28.1.2" + jest-util "^28.1.1" + jest-watcher "^28.1.1" + jest-worker "^28.1.1" source-map-support "0.5.13" throat "^6.0.1" -jest-runtime@^28.1.0: - version "28.1.0" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-28.1.0.tgz#4847dcb2a4eb4b0f9eaf41306897e51fb1665631" - integrity sha512-wNYDiwhdH/TV3agaIyVF0lsJ33MhyujOe+lNTUiolqKt8pchy1Hq4+tDMGbtD5P/oNLA3zYrpx73T9dMTOCAcg== - dependencies: - "@jest/environment" "^28.1.0" - "@jest/fake-timers" "^28.1.0" - "@jest/globals" "^28.1.0" - "@jest/source-map" "^28.0.2" - "@jest/test-result" "^28.1.0" - "@jest/transform" "^28.1.0" - "@jest/types" "^28.1.0" +jest-runtime@^28.1.2: + version "28.1.2" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-28.1.2.tgz#d68f34f814a848555a345ceda23289f14d59a688" + integrity sha512-i4w93OsWzLOeMXSi9epmakb2+3z0AchZtUQVF1hesBmcQQy4vtaql5YdVe9KexdJaVRyPDw8DoBR0j3lYsZVYw== + dependencies: + "@jest/environment" "^28.1.2" + "@jest/fake-timers" "^28.1.2" + "@jest/globals" "^28.1.2" + "@jest/source-map" "^28.1.2" + "@jest/test-result" "^28.1.1" + "@jest/transform" "^28.1.2" + "@jest/types" "^28.1.1" chalk "^4.0.0" cjs-module-lexer "^1.0.0" collect-v8-coverage "^1.0.0" execa "^5.0.0" glob "^7.1.3" graceful-fs "^4.2.9" - jest-haste-map "^28.1.0" - jest-message-util "^28.1.0" - jest-mock "^28.1.0" + jest-haste-map "^28.1.1" + jest-message-util "^28.1.1" + jest-mock "^28.1.1" jest-regex-util "^28.0.2" - jest-resolve "^28.1.0" - jest-snapshot "^28.1.0" - jest-util "^28.1.0" + jest-resolve "^28.1.1" + jest-snapshot "^28.1.2" + jest-util "^28.1.1" slash "^3.0.0" strip-bom "^4.0.0" -jest-snapshot@^28.1.0: - version "28.1.0" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-28.1.0.tgz#4b74fa8816707dd10fe9d551c2c258e5a67b53b6" - integrity sha512-ex49M2ZrZsUyQLpLGxQtDbahvgBjlLPgklkqGM0hq/F7W/f8DyqZxVHjdy19QKBm4O93eDp+H5S23EiTbbUmHw== +jest-snapshot@^28.1.2: + version "28.1.2" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-28.1.2.tgz#93d31b87b11b384f5946fe0767541496135f8d52" + integrity sha512-wzrieFttZYfLvrCVRJxX+jwML2YTArOUqFpCoSVy1QUapx+LlV9uLbV/mMEhYj4t7aMeE9aSQFHSvV/oNoDAMA== dependencies: "@babel/core" "^7.11.6" "@babel/generator" "^7.7.2" "@babel/plugin-syntax-typescript" "^7.7.2" "@babel/traverse" "^7.7.2" "@babel/types" "^7.3.3" - "@jest/expect-utils" "^28.1.0" - "@jest/transform" "^28.1.0" - "@jest/types" "^28.1.0" + "@jest/expect-utils" "^28.1.1" + "@jest/transform" "^28.1.2" + "@jest/types" "^28.1.1" "@types/babel__traverse" "^7.0.6" "@types/prettier" "^2.1.5" babel-preset-current-node-syntax "^1.0.0" chalk "^4.0.0" - expect "^28.1.0" + expect "^28.1.1" graceful-fs "^4.2.9" - jest-diff "^28.1.0" + jest-diff "^28.1.1" jest-get-type "^28.0.2" - jest-haste-map "^28.1.0" - jest-matcher-utils "^28.1.0" - jest-message-util "^28.1.0" - jest-util "^28.1.0" + jest-haste-map "^28.1.1" + jest-matcher-utils "^28.1.1" + jest-message-util "^28.1.1" + jest-util "^28.1.1" natural-compare "^1.4.0" - pretty-format "^28.1.0" + pretty-format "^28.1.1" semver "^7.3.5" -jest-util@^28.0.0, jest-util@^28.1.0: +jest-util@^28.0.0: version "28.1.0" resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-28.1.0.tgz#d54eb83ad77e1dd441408738c5a5043642823be5" integrity sha512-qYdCKD77k4Hwkose2YBEqQk7PzUf/NSE+rutzceduFveQREeH6b+89Dc9+wjX9dAwHcgdx4yedGA3FQlU/qCTA== @@ -2719,49 +2710,62 @@ jest-util@^28.0.0, jest-util@^28.1.0: graceful-fs "^4.2.9" picomatch "^2.2.3" -jest-validate@^28.1.0: - version "28.1.0" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-28.1.0.tgz#8a6821f48432aba9f830c26e28226ad77b9a0e18" - integrity sha512-Lly7CJYih3vQBfjLeANGgBSBJ7pEa18cxpQfQEq2go2xyEzehnHfQTjoUia8xUv4x4J80XKFIDwJJThXtRFQXQ== +jest-util@^28.1.1: + version "28.1.1" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-28.1.1.tgz#ff39e436a1aca397c0ab998db5a51ae2b7080d05" + integrity sha512-FktOu7ca1DZSyhPAxgxB6hfh2+9zMoJ7aEQA759Z6p45NuO8mWcqujH+UdHlCm/V6JTWwDztM2ITCzU1ijJAfw== dependencies: - "@jest/types" "^28.1.0" + "@jest/types" "^28.1.1" + "@types/node" "*" + chalk "^4.0.0" + ci-info "^3.2.0" + graceful-fs "^4.2.9" + picomatch "^2.2.3" + +jest-validate@^28.1.1: + version "28.1.1" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-28.1.1.tgz#59b7b339b3c85b5144bd0c06ad3600f503a4acc8" + integrity sha512-Kpf6gcClqFCIZ4ti5++XemYJWUPCFUW+N2gknn+KgnDf549iLul3cBuKVe1YcWRlaF8tZV8eJCap0eECOEE3Ug== + dependencies: + "@jest/types" "^28.1.1" camelcase "^6.2.0" chalk "^4.0.0" jest-get-type "^28.0.2" leven "^3.1.0" - pretty-format "^28.1.0" + pretty-format "^28.1.1" -jest-watcher@^28.1.0: - version "28.1.0" - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-28.1.0.tgz#aaa7b4164a4e77eeb5f7d7b25ede5e7b4e9c9aaf" - integrity sha512-tNHMtfLE8Njcr2IRS+5rXYA4BhU90gAOwI9frTGOqd+jX0P/Au/JfRSNqsf5nUTcWdbVYuLxS1KjnzILSoR5hA== +jest-watcher@^28.1.1: + version "28.1.1" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-28.1.1.tgz#533597fb3bfefd52b5cd115cd916cffd237fb60c" + integrity sha512-RQIpeZ8EIJMxbQrXpJQYIIlubBnB9imEHsxxE41f54ZwcqWLysL/A0ZcdMirf+XsMn3xfphVQVV4EW0/p7i7Ug== dependencies: - "@jest/test-result" "^28.1.0" - "@jest/types" "^28.1.0" + "@jest/test-result" "^28.1.1" + "@jest/types" "^28.1.1" "@types/node" "*" ansi-escapes "^4.2.1" chalk "^4.0.0" emittery "^0.10.2" - jest-util "^28.1.0" + jest-util "^28.1.1" string-length "^4.0.1" -jest-worker@^28.1.0: - version "28.1.0" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-28.1.0.tgz#ced54757a035e87591e1208253a6e3aac1a855e5" - integrity sha512-ZHwM6mNwaWBR52Snff8ZvsCTqQsvhCxP/bT1I6T6DAnb6ygkshsyLQIMxFwHpYxht0HOoqt23JlC01viI7T03A== +jest-worker@^28.1.1: + version "28.1.1" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-28.1.1.tgz#3480c73247171dfd01eda77200f0063ab6a3bf28" + integrity sha512-Au7slXB08C6h+xbJPp7VIb6U0XX5Kc9uel/WFc6/rcTzGiaVCBRngBExSYuXSLFPULPSYU3cJ3ybS988lNFQhQ== dependencies: "@types/node" "*" merge-stream "^2.0.0" supports-color "^8.0.0" -jest@^28.1.0: - version "28.1.0" - resolved "https://registry.yarnpkg.com/jest/-/jest-28.1.0.tgz#f420e41c8f2395b9a30445a97189ebb57593d831" - integrity sha512-TZR+tHxopPhzw3c3560IJXZWLNHgpcz1Zh0w5A65vynLGNcg/5pZ+VildAd7+XGOu6jd58XMY/HNn0IkZIXVXg== +jest@^28.1.2: + version "28.1.2" + resolved "https://registry.yarnpkg.com/jest/-/jest-28.1.2.tgz#451ff24081ce31ca00b07b60c61add13aa96f8eb" + integrity sha512-Tuf05DwLeCh2cfWCQbcz9UxldoDyiR1E9Igaei5khjonKncYdc6LDfynKCEWozK0oLE3GD+xKAo2u8x/0s6GOg== dependencies: - "@jest/core" "^28.1.0" + "@jest/core" "^28.1.2" + "@jest/types" "^28.1.1" import-local "^3.0.2" - jest-cli "^28.1.0" + jest-cli "^28.1.2" js-tokens@^4.0.0: version "4.0.0" @@ -2831,10 +2835,10 @@ jsonfile@^6.0.1: optionalDependencies: graceful-fs "^4.1.6" -jsonschema@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/jsonschema/-/jsonschema-1.4.0.tgz#1afa34c4bc22190d8e42271ec17ac8b3404f87b2" - integrity sha512-/YgW6pRMr6M7C+4o8kS+B/2myEpHCrxO4PEWnqJNBFMjn7EWXqlQ4tGwL6xTHeRplwuZmcAncdvfOad1nT2yMw== +jsonschema@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/jsonschema/-/jsonschema-1.4.1.tgz#cc4c3f0077fb4542982973d8a083b6b34f482dab" + integrity sha512-S6cATIPVv1z0IlxdN+zUk5EPjkGCdnhN4wVSBlvoUO1tOLJootbo9CquNJmbIh4yikWHiUedhRYrNPn1arpEmQ== kleur@^3.0.3: version "3.0.3" @@ -3403,24 +3407,15 @@ prettier-plugin-jsdoc@^0.3.38: comment-parser "^1.3.1" mdast-util-from-markdown "^1.2.0" -prettier@^2.6.2: - version "2.6.2" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.6.2.tgz#e26d71a18a74c3d0f0597f55f01fb6c06c206032" - integrity sha512-PkUpF+qoXTqhOeWL9fu7As8LXsIUZ1WYaJiY/a7McAQzxjk82OF0tibkFXVCDImZtWxbvojFjerkiLb0/q8mew== - -pretty-format@^27.0.0, pretty-format@^27.5.1: - version "27.5.1" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-27.5.1.tgz#2181879fdea51a7a5851fb39d920faa63f01d88e" - integrity sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ== - dependencies: - ansi-regex "^5.0.1" - ansi-styles "^5.0.0" - react-is "^17.0.1" +prettier@^2.7.1: + version "2.7.1" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.7.1.tgz#e235806850d057f97bb08368a4f7d899f7760c64" + integrity sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g== -pretty-format@^28.1.0: - version "28.1.0" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-28.1.0.tgz#8f5836c6a0dfdb834730577ec18029052191af55" - integrity sha512-79Z4wWOYCdvQkEoEuSlBhHJqWeZ8D8YRPiPctJFCtvuaClGpiwiQYSCUOE6IEKUbbFukKOTFIUAXE8N4EQTo1Q== +pretty-format@^28.0.0, pretty-format@^28.1.1: + version "28.1.1" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-28.1.1.tgz#f731530394e0f7fcd95aba6b43c50e02d86b95cb" + integrity sha512-wwJbVTGFHeucr5Jw2bQ9P+VYHyLdAqedFLEkdQUVaBF/eiidDwH5OpilINq4mEfhbCjLnirt6HTTDhv1HaTIQw== dependencies: "@jest/schemas" "^28.0.2" ansi-regex "^5.0.1" @@ -3445,11 +3440,6 @@ queue-microtask@^1.2.2: resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== -react-is@^17.0.1: - version "17.0.2" - resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" - integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== - react-is@^18.0.0: version "18.1.0" resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.1.0.tgz#61aaed3096d30eacf2a2127118b5b41387d32a67" @@ -3779,10 +3769,10 @@ to-regex-range@^5.0.1: dependencies: is-number "^7.0.0" -ts-jest@^28.0.4: - version "28.0.4" - resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-28.0.4.tgz#0ab705a60fc4b9f3506f35e26edfa9e9c915c31b" - integrity sha512-S6uRDDdCJBvnZqyGjB4VCnwbQrbgdL8WPeP4jevVSpYsBaeGRQAIS08o3Svav2Ex+oXwLgJ/m7F24TNq62kA1A== +ts-jest@^28.0.5: + version "28.0.5" + resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-28.0.5.tgz#31776f768fba6dfc8c061d488840ed0c8eeac8b9" + integrity sha512-Sx9FyP9pCY7pUzQpy4FgRZf2bhHY3za576HMKJFs+OnQ9jS96Du5vNsDKkyedQkik+sEabbKAnCliv9BEsHZgQ== dependencies: bs-logger "0.x" fast-json-stable-stringify "2.x" @@ -3791,12 +3781,12 @@ ts-jest@^28.0.4: lodash.memoize "4.x" make-error "1.x" semver "7.x" - yargs-parser "^20.x" + yargs-parser "^21.0.1" -ts-node@^10.8.1: - version "10.8.1" - resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.8.1.tgz#ea2bd3459011b52699d7e88daa55a45a1af4f066" - integrity sha512-Wwsnao4DQoJsN034wePSg5nZiw4YKXf56mPIAeD6wVmiv+RytNSWqc2f3fKvcUoV+Yn2+yocD71VOfQHbmVX4g== +ts-node@^10.8.2: + version "10.8.2" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.8.2.tgz#3185b75228cef116bf82ffe8762594f54b2a23f2" + integrity sha512-LYdGnoGddf1D6v8REPtIH+5iq/gTDuZqv2/UJUU7tKjuEU8xVZorBM+buCGNjj+pGEud+sOoM4CX3/YzINpENA== dependencies: "@cspotcode/source-map-support" "^0.8.0" "@tsconfig/node10" "^1.0.7" @@ -3856,10 +3846,10 @@ type-fest@^0.21.3: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== -typescript@^4.7.3: - version "4.7.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.7.3.tgz#8364b502d5257b540f9de4c40be84c98e23a129d" - integrity sha512-WOkT3XYvrpXx4vMMqlD+8R8R37fZkjyLGlxavMc4iB8lrl8L0DeTcHbYgw/v0N/z9wAFsgBhcsF0ruoySS22mA== +typescript@^4.7.4: + version "4.7.4" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.7.4.tgz#1a88596d1cf47d59507a1bcdfb5b9dfe4d488235" + integrity sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ== unbox-primitive@^1.0.1: version "1.0.1" @@ -3915,16 +3905,16 @@ v8-compile-cache@^2.0.3: resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== -v8-to-istanbul@^9.0.0: - version "9.0.0" - resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.0.0.tgz#be0dae58719fc53cb97e5c7ac1d7e6d4f5b19511" - integrity sha512-HcvgY/xaRm7isYmyx+lFKA4uQmfUbN0J4M0nNItvzTvH/iQ9kW5j/t4YSR+Ge323/lrgDAWJoF46tzGQHwBHFw== +v8-to-istanbul@^9.0.1: + version "9.0.1" + resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.0.1.tgz#b6f994b0b5d4ef255e17a0d17dc444a9f5132fa4" + integrity sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w== dependencies: - "@jridgewell/trace-mapping" "^0.3.7" + "@jridgewell/trace-mapping" "^0.3.12" "@types/istanbul-lib-coverage" "^2.0.1" convert-source-map "^1.6.0" -walker@^1.0.7: +walker@^1.0.8: version "1.0.8" resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.8.tgz#bd498db477afe573dc04185f011d3ab8a8d7653f" integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== @@ -3991,12 +3981,7 @@ yaml@1.10.2: resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b" integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== -yargs-parser@^20.x: - version "20.2.9" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" - integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== - -yargs-parser@^21.0.0: +yargs-parser@^21.0.0, yargs-parser@^21.0.1: version "21.0.1" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.0.1.tgz#0267f286c877a4f0f728fceb6f8a3e4cb95c6e35" integrity sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg==