diff --git a/.github/scripts/release_patch_package_json.js b/.github/scripts/release_patch_package_json.js index 51fd432124..68d23adcc5 100644 --- a/.github/scripts/release_patch_package_json.js +++ b/.github/scripts/release_patch_package_json.js @@ -18,7 +18,7 @@ if (process.argv.length < 3) { const basePath = resolve(process.argv[2]); const packageJsonPath = join(basePath, 'package.json'); const alphaPackages = ['@aws-lambda-powertools/idempotency']; -const betaPackages = ['@aws-lambda-powertools/parameters']; +const betaPackages = []; (() => { try { diff --git a/.github/workflows/reusable_deploy_layer_stack.yml b/.github/workflows/reusable_deploy_layer_stack.yml index 72b9d63d44..86b0f5afb6 100644 --- a/.github/workflows/reusable_deploy_layer_stack.yml +++ b/.github/workflows/reusable_deploy_layer_stack.yml @@ -77,7 +77,7 @@ jobs: with: name: ${{ inputs.artifact-name }} - name: Unzip artifact - run: unzip cdk.out.zip + run: unzip -o cdk.out.zip - name: Deploy Layer run: npm run cdk -w layers -- deploy --app cdk.out --context region=${{ matrix.region }} 'LayerPublisherStack' --require-approval never --verbose --outputs-file cdk-outputs.json - name: Store latest Layer ARN diff --git a/CHANGELOG.md b/CHANGELOG.md index 3cca5de210..916fbb03dd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [1.11.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v1.10.0...v1.11.0) (2023-06-29) + +### Features + +- **idempotency:** preserve original error when wrapping into `IdempotencyPersistenceLayerError` ([#1552](https://github.com/aws-powertools/powertools-lambda-typescript/issues/1552)) ([866837d](https://github.com/aws-powertools/powertools-lambda-typescript/commit/866837daf34563698709612351c45769e02daf16)) + # [1.10.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v1.9.0...v1.10.0) (2023-06-23) ### Bug Fixes diff --git a/README.md b/README.md index 1e5fc60bf3..03746c86a5 100644 --- a/README.md +++ b/README.md @@ -34,7 +34,7 @@ You can use the library in both TypeScript and JavaScript code bases. * **[Tracer](https://docs.powertools.aws.dev/lambda-typescript/latest/core/tracer/)** - Utilities to trace Lambda function handlers, and both synchronous and asynchronous functions * **[Logger](https://docs.powertools.aws.dev/lambda-typescript/latest/core/logger/)** - Structured logging made easier, and a middleware to enrich log items with key details of the Lambda context * **[Metrics](https://docs.powertools.aws.dev/lambda-typescript/latest/core/metrics/)** - Custom Metrics created asynchronously via CloudWatch Embedded Metric Format (EMF) -* **[Parameters (beta)](https://docs.powertools.aws.dev/lambda-typescript/latest/utilities/parameters/)** - High-level functions to retrieve one or more parameters from AWS SSM Parameter Store, AWS Secrets Manager, AWS AppConfig, and Amazon DynamoDB +* **[Parameters](https://docs.powertools.aws.dev/lambda-typescript/latest/utilities/parameters/)** - High-level functions to retrieve one or more parameters from AWS SSM Parameter Store, AWS Secrets Manager, AWS AppConfig, and Amazon DynamoDB * **[Idempotency (beta)](https://docs.powertools.aws.dev/lambda-typescript/latest/utilities/idempotency/)** - Class method decorator, Middy middleware, and function wrapper to make your Lambda functions idempotent and prevent duplicate execution based on payload content ## Getting started diff --git a/docs/index.md b/docs/index.md index 751799e719..4e6a4fc41b 100644 --- a/docs/index.md +++ b/docs/index.md @@ -26,7 +26,7 @@ You can use Powertools for AWS Lambda (TypeScript) in both TypeScript and JavaSc You can install Powertools for AWS Lambda (TypeScript) using one of the following options: -* **Lambda Layer**: [**arn:aws:lambda:{region}:094274105915:layer:AWSLambdaPowertoolsTypeScript:12**](#){: .copyMe}:clipboard: +* **Lambda Layer**: [**arn:aws:lambda:{region}:094274105915:layer:AWSLambdaPowertoolsTypeScript:13**](#){: .copyMe}:clipboard: * **npm**: [`npm install @aws-lambda-powertools/tracer @aws-lambda-powertools/metrics @aws-lambda-powertools/logger`](#){: .copyMe}:clipboard: ### Lambda Layer @@ -41,31 +41,31 @@ You can include Powertools for AWS Lambda (TypeScript) Lambda Layer using [AWS L | Region | Layer ARN | | ---------------- | ------------------------------------------------------------------------------------------------------------ | - | `us-east-1` | [arn:aws:lambda:us-east-1:094274105915:layer:AWSLambdaPowertoolsTypeScript:12](#){: .copyMe}:clipboard: | - | `us-east-2` | [arn:aws:lambda:us-east-2:094274105915:layer:AWSLambdaPowertoolsTypeScript:12](#){: .copyMe}:clipboard: | - | `us-west-1` | [arn:aws:lambda:us-west-1:094274105915:layer:AWSLambdaPowertoolsTypeScript:12](#){: .copyMe}:clipboard: | - | `us-west-2` | [arn:aws:lambda:us-west-2:094274105915:layer:AWSLambdaPowertoolsTypeScript:12](#){: .copyMe}:clipboard: | - | `ap-south-1` | [arn:aws:lambda:ap-south-1:094274105915:layer:AWSLambdaPowertoolsTypeScript:12](#){: .copyMe}:clipboard: | - | `ap-east-1` | [arn:aws:lambda:ap-east-1:094274105915:layer:AWSLambdaPowertoolsTypeScript:12](#){: .copyMe}:clipboard: | - | `ap-northeast-1` | [arn:aws:lambda:ap-northeast-1:094274105915:layer:AWSLambdaPowertoolsTypeScript:12](#){: .copyMe}:clipboard: | - | `ap-northeast-2` | [arn:aws:lambda:ap-northeast-2:094274105915:layer:AWSLambdaPowertoolsTypeScript:12](#){: .copyMe}:clipboard: | - | `ap-northeast-3` | [arn:aws:lambda:ap-northeast-3:094274105915:layer:AWSLambdaPowertoolsTypeScript:12](#){: .copyMe}:clipboard: | - | `ap-southeast-1` | [arn:aws:lambda:ap-southeast-1:094274105915:layer:AWSLambdaPowertoolsTypeScript:12](#){: .copyMe}:clipboard: | - | `ap-southeast-2` | [arn:aws:lambda:ap-southeast-2:094274105915:layer:AWSLambdaPowertoolsTypeScript:12](#){: .copyMe}:clipboard: | - | `ap-southeast-3` | [arn:aws:lambda:ap-southeast-3:094274105915:layer:AWSLambdaPowertoolsTypeScript:12](#){: .copyMe}:clipboard: | - | `ap-southeast-4` | [arn:aws:lambda:ap-southeast-4:094274105915:layer:AWSLambdaPowertoolsTypeScript:12](#){: .copyMe}:clipboard: | - | `eu-central-1` | [arn:aws:lambda:eu-central-1:094274105915:layer:AWSLambdaPowertoolsTypeScript:12](#){: .copyMe}:clipboard: | - | `eu-central-2` | [arn:aws:lambda:eu-central-1:094274105915:layer:AWSLambdaPowertoolsTypeScript:12](#){: .copyMe}:clipboard: | - | `eu-west-1` | [arn:aws:lambda:eu-west-1:094274105915:layer:AWSLambdaPowertoolsTypeScript:12](#){: .copyMe}:clipboard: | - | `eu-west-2` | [arn:aws:lambda:eu-west-2:094274105915:layer:AWSLambdaPowertoolsTypeScript:12](#){: .copyMe}:clipboard: | - | `eu-west-3` | [arn:aws:lambda:eu-west-3:094274105915:layer:AWSLambdaPowertoolsTypeScript:12](#){: .copyMe}:clipboard: | - | `eu-north-1` | [arn:aws:lambda:eu-north-1:094274105915:layer:AWSLambdaPowertoolsTypeScript:12](#){: .copyMe}:clipboard: | - | `eu-south-1` | [arn:aws:lambda:eu-south-1:094274105915:layer:AWSLambdaPowertoolsTypeScript:12](#){: .copyMe}:clipboard: | - | `eu-south-2` | [arn:aws:lambda:eu-south-2:094274105915:layer:AWSLambdaPowertoolsTypeScript:12](#){: .copyMe}:clipboard: | - | `ca-central-1` | [arn:aws:lambda:ca-central-1:094274105915:layer:AWSLambdaPowertoolsTypeScript:12](#){: .copyMe}:clipboard: | - | `sa-east-1` | [arn:aws:lambda:sa-east-1:094274105915:layer:AWSLambdaPowertoolsTypeScript:12](#){: .copyMe}:clipboard: | - | `af-south-1` | [arn:aws:lambda:af-south-1:094274105915:layer:AWSLambdaPowertoolsTypeScript:12](#){: .copyMe}:clipboard: | - | `me-south-1` | [arn:aws:lambda:me-south-1:094274105915:layer:AWSLambdaPowertoolsTypeScript:12](#){: .copyMe}:clipboard: | + | `us-east-1` | [arn:aws:lambda:us-east-1:094274105915:layer:AWSLambdaPowertoolsTypeScript:13](#){: .copyMe}:clipboard: | + | `us-east-2` | [arn:aws:lambda:us-east-2:094274105915:layer:AWSLambdaPowertoolsTypeScript:13](#){: .copyMe}:clipboard: | + | `us-west-1` | [arn:aws:lambda:us-west-1:094274105915:layer:AWSLambdaPowertoolsTypeScript:13](#){: .copyMe}:clipboard: | + | `us-west-2` | [arn:aws:lambda:us-west-2:094274105915:layer:AWSLambdaPowertoolsTypeScript:13](#){: .copyMe}:clipboard: | + | `ap-south-1` | [arn:aws:lambda:ap-south-1:094274105915:layer:AWSLambdaPowertoolsTypeScript:13](#){: .copyMe}:clipboard: | + | `ap-east-1` | [arn:aws:lambda:ap-east-1:094274105915:layer:AWSLambdaPowertoolsTypeScript:13](#){: .copyMe}:clipboard: | + | `ap-northeast-1` | [arn:aws:lambda:ap-northeast-1:094274105915:layer:AWSLambdaPowertoolsTypeScript:13](#){: .copyMe}:clipboard: | + | `ap-northeast-2` | [arn:aws:lambda:ap-northeast-2:094274105915:layer:AWSLambdaPowertoolsTypeScript:13](#){: .copyMe}:clipboard: | + | `ap-northeast-3` | [arn:aws:lambda:ap-northeast-3:094274105915:layer:AWSLambdaPowertoolsTypeScript:13](#){: .copyMe}:clipboard: | + | `ap-southeast-1` | [arn:aws:lambda:ap-southeast-1:094274105915:layer:AWSLambdaPowertoolsTypeScript:13](#){: .copyMe}:clipboard: | + | `ap-southeast-2` | [arn:aws:lambda:ap-southeast-2:094274105915:layer:AWSLambdaPowertoolsTypeScript:13](#){: .copyMe}:clipboard: | + | `ap-southeast-3` | [arn:aws:lambda:ap-southeast-3:094274105915:layer:AWSLambdaPowertoolsTypeScript:13](#){: .copyMe}:clipboard: | + | `ap-southeast-4` | [arn:aws:lambda:ap-southeast-4:094274105915:layer:AWSLambdaPowertoolsTypeScript:13](#){: .copyMe}:clipboard: | + | `eu-central-1` | [arn:aws:lambda:eu-central-1:094274105915:layer:AWSLambdaPowertoolsTypeScript:13](#){: .copyMe}:clipboard: | + | `eu-central-2` | [arn:aws:lambda:eu-central-1:094274105915:layer:AWSLambdaPowertoolsTypeScript:13](#){: .copyMe}:clipboard: | + | `eu-west-1` | [arn:aws:lambda:eu-west-1:094274105915:layer:AWSLambdaPowertoolsTypeScript:13](#){: .copyMe}:clipboard: | + | `eu-west-2` | [arn:aws:lambda:eu-west-2:094274105915:layer:AWSLambdaPowertoolsTypeScript:13](#){: .copyMe}:clipboard: | + | `eu-west-3` | [arn:aws:lambda:eu-west-3:094274105915:layer:AWSLambdaPowertoolsTypeScript:13](#){: .copyMe}:clipboard: | + | `eu-north-1` | [arn:aws:lambda:eu-north-1:094274105915:layer:AWSLambdaPowertoolsTypeScript:13](#){: .copyMe}:clipboard: | + | `eu-south-1` | [arn:aws:lambda:eu-south-1:094274105915:layer:AWSLambdaPowertoolsTypeScript:13](#){: .copyMe}:clipboard: | + | `eu-south-2` | [arn:aws:lambda:eu-south-2:094274105915:layer:AWSLambdaPowertoolsTypeScript:13](#){: .copyMe}:clipboard: | + | `ca-central-1` | [arn:aws:lambda:ca-central-1:094274105915:layer:AWSLambdaPowertoolsTypeScript:13](#){: .copyMe}:clipboard: | + | `sa-east-1` | [arn:aws:lambda:sa-east-1:094274105915:layer:AWSLambdaPowertoolsTypeScript:13](#){: .copyMe}:clipboard: | + | `af-south-1` | [arn:aws:lambda:af-south-1:094274105915:layer:AWSLambdaPowertoolsTypeScript:13](#){: .copyMe}:clipboard: | + | `me-south-1` | [arn:aws:lambda:me-south-1:094274105915:layer:AWSLambdaPowertoolsTypeScript:13](#){: .copyMe}:clipboard: | ??? note "Click to expand and copy code snippets for popular frameworks" @@ -76,7 +76,7 @@ You can include Powertools for AWS Lambda (TypeScript) Lambda Layer using [AWS L Type: AWS::Serverless::Function Properties: Layers: - - !Sub arn:aws:lambda:${AWS::Region}:094274105915:layer:AWSLambdaPowertoolsTypeScript:12 + - !Sub arn:aws:lambda:${AWS::Region}:094274105915:layer:AWSLambdaPowertoolsTypeScript:13 ``` If you use `esbuild` to bundle your code, make sure to exclude `@aws-lambda-powertools` from being bundled since the packages will be already present the Layer: @@ -107,7 +107,7 @@ You can include Powertools for AWS Lambda (TypeScript) Lambda Layer using [AWS L hello: handler: lambda_function.lambda_handler layers: - - arn:aws:lambda:${aws::region}:094274105915:layer:AWSLambdaPowertoolsTypeScript:12 + - arn:aws:lambda:${aws::region}:094274105915:layer:AWSLambdaPowertoolsTypeScript:13 ``` If you use `esbuild` to bundle your code, make sure to exclude `@aws-lambda-powertools` from being bundled since the packages will be already present the Layer: @@ -139,7 +139,7 @@ You can include Powertools for AWS Lambda (TypeScript) Lambda Layer using [AWS L const powertoolsLayer = lambda.LayerVersion.fromLayerVersionArn( this, 'PowertoolsLayer', - `arn:aws:lambda:${cdk.Stack.of(this).region}:094274105915:layer:AWSLambdaPowertoolsTypeScript:12` + `arn:aws:lambda:${cdk.Stack.of(this).region}:094274105915:layer:AWSLambdaPowertoolsTypeScript:13` ); new lambda.Function(this, 'Function', { @@ -191,7 +191,7 @@ You can include Powertools for AWS Lambda (TypeScript) Lambda Layer using [AWS L role = ... handler = "index.handler" runtime = "nodejs16.x" - layers = ["arn:aws:lambda:{aws::region}:094274105915:layer:AWSLambdaPowertoolsTypeScript:12"] + layers = ["arn:aws:lambda:{aws::region}:094274105915:layer:AWSLambdaPowertoolsTypeScript:13"] source_code_hash = filebase64sha256("lambda_function_payload.zip") } ``` @@ -209,7 +209,7 @@ You can include Powertools for AWS Lambda (TypeScript) Lambda Layer using [AWS L const lambdaFunction = new aws.lambda.Function('function', { layers: [ - pulumi.interpolate`arn:aws:lambda:${aws.getRegionOutput().name}:094274105915:layer:AWSLambdaPowertoolsTypeScript:12` + pulumi.interpolate`arn:aws:lambda:${aws.getRegionOutput().name}:094274105915:layer:AWSLambdaPowertoolsTypeScript:13` ], code: new pulumi.asset.FileArchive('lambda_function_payload.zip'), tracingConfig: { @@ -233,7 +233,7 @@ You can include Powertools for AWS Lambda (TypeScript) Lambda Layer using [AWS L ? Do you want to configure advanced settings? Yes ... ? Do you want to enable Lambda layers for this function? Yes - ? Enter up to 5 existing Lambda layer ARNs (comma-separated): arn:aws:lambda:{aws::region}:094274105915:layer:AWSLambdaPowertoolsTypeScript:12 + ? Enter up to 5 existing Lambda layer ARNs (comma-separated): arn:aws:lambda:{aws::region}:094274105915:layer:AWSLambdaPowertoolsTypeScript:13 ❯ amplify push -y # Updating an existing function and add the layer @@ -243,7 +243,7 @@ You can include Powertools for AWS Lambda (TypeScript) Lambda Layer using [AWS L - Name: ? Which setting do you want to update? Lambda layers configuration ? Do you want to enable Lambda layers for this function? Yes - ? Enter up to 5 existing Lambda layer ARNs (comma-separated): arn:aws:lambda:{aws::region}:094274105915:layer:AWSLambdaPowertoolsTypeScript:12 + ? Enter up to 5 existing Lambda layer ARNs (comma-separated): arn:aws:lambda:{aws::region}:094274105915:layer:AWSLambdaPowertoolsTypeScript:13 ? Do you want to edit the local lambda function now? No ``` @@ -253,7 +253,7 @@ You can include Powertools for AWS Lambda (TypeScript) Lambda Layer using [AWS L Change {region} to your AWS region, e.g. `eu-west-1` ```bash title="AWS CLI" - aws lambda get-layer-version-by-arn --arn arn:aws:lambda:{aws::region}:094274105915:layer:AWSLambdaPowertoolsTypeScript:12 --region {region} + aws lambda get-layer-version-by-arn --arn arn:aws:lambda:{aws::region}:094274105915:layer:AWSLambdaPowertoolsTypeScript:13 --region {region} ``` The pre-signed URL to download this Lambda Layer will be within `Location` key. @@ -325,6 +325,7 @@ The following companies, among others, use Powertools: * [Bailey Nelson](https://www.baileynelson.com.au){target="_blank"} * [Perfect Post](https://www.perfectpost.fr){target="_blank"} * [Sennder](https://sennder.com/){target="_blank"} +* [Certible](https://www.certible.com/){target="_blank"} ### Sharing your work diff --git a/docs/javascript/extra.js b/docs/javascript/extra.js index f6e6680bbb..5cbe967089 100644 --- a/docs/javascript/extra.js +++ b/docs/javascript/extra.js @@ -10,7 +10,7 @@ const awsconfig = { }; const RUNTIME = "typescript" -const BASE_ORIGIN = "awslabs.github.io" +const BASE_ORIGIN = "docs.powertools.aws.dev" function copyToClipboard(e) { e.preventDefault() diff --git a/docs/media/logos/certible.svg b/docs/media/logos/certible.svg new file mode 100644 index 0000000000..4ba237f3d1 --- /dev/null +++ b/docs/media/logos/certible.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/snippets/package.json b/docs/snippets/package.json index 235eb6fdca..0ce221ad60 100644 --- a/docs/snippets/package.json +++ b/docs/snippets/package.json @@ -27,14 +27,15 @@ }, "homepage": "https://github.com/aws-powertools/powertools-lambda-typescript#readme", "devDependencies": { - "@aws-sdk/client-appconfigdata": "^3.245.0", - "@aws-sdk/client-dynamodb": "^3.245.0", - "@aws-sdk/client-secrets-manager": "^3.250.0", - "@aws-sdk/client-ssm": "^3.245.0", - "@aws-sdk/util-dynamodb": "^3.245.0", - "aws-sdk": "^2.1354.0", - "aws-sdk-client-mock": "^2.0.1", - "aws-sdk-client-mock-jest": "^2.0.1", - "axios": "^1.2.4" + "@aws-sdk/client-appconfigdata": "^3.360.0", + "@aws-sdk/client-dynamodb": "^3.360.0", + "@aws-sdk/client-secrets-manager": "^3.360.0", + "@aws-sdk/client-ssm": "^3.360.0", + "@aws-sdk/util-dynamodb": "^3.360.0", + "aws-sdk": "^2.1405.0", + "aws-sdk-client-mock": "^2.2.0", + "aws-sdk-client-mock-jest": "^2.2.0", + "axios": "^1.2.4", + "hashi-vault-js": "^0.4.13" } -} \ No newline at end of file +} diff --git a/docs/snippets/parameters/customProviderVault.ts b/docs/snippets/parameters/customProviderVault.ts new file mode 100644 index 0000000000..9fea8f22aa --- /dev/null +++ b/docs/snippets/parameters/customProviderVault.ts @@ -0,0 +1,116 @@ +import { Logger } from '@aws-lambda-powertools/logger'; +import { BaseProvider } from '@aws-lambda-powertools/parameters/base'; +import Vault from 'hashi-vault-js'; +import { isErrorResponse } from './customProviderVaultTypes'; +import type { + HashiCorpVaultProviderOptions, + HashiCorpVaultGetOptions, +} from './customProviderVaultTypes'; + +class HashiCorpVaultProvider extends BaseProvider { + public client: Vault; + readonly #token: string; + readonly #logger: Logger; + + /** + * It initializes the HashiCorpVaultProvider class. + * + * @param {HashiCorpVaultProviderOptions} config - The configuration object. + */ + public constructor(config: HashiCorpVaultProviderOptions) { + super(); + + const { url, token, clientConfig, vaultClient } = config; + if (vaultClient) { + if (vaultClient instanceof Vault) { + this.client = vaultClient; + } else { + throw Error('Not a valid Vault client provided'); + } + } else { + const config: Vault.VaultConfig = { + baseUrl: url, + ...(clientConfig ?? { + timeout: 10000, + rootPath: '', + }), + }; + this.client = new Vault(config); + } + this.#token = token; + this.#logger = new Logger({ + serviceName: 'HashiCorpVaultProvider', + }); + } + + /** + * Retrieve a secret from HashiCorp Vault. + * + * You can customize the retrieval of the secret by passing options to the function: + * * `maxAge` - The maximum age of the value in cache before fetching a new one (in seconds) (default: 5) + * * `forceFetch` - Whether to always fetch a new value from the store regardless if already available in cache + * * `sdkOptions` - Extra options to pass to the HashiCorp Vault SDK, e.g. `mount` or `version` + * + * @param {string} name - The name of the secret + * @param {HashiCorpVaultGetOptions} options - Options to customize the retrieval of the secret + */ + public async get( + name: string, + options?: HashiCorpVaultGetOptions + ): Promise | undefined> { + return super.get(name, options) as Promise< + Record | undefined + >; + } + + /** + * Retrieving multiple parameter values is not supported with HashiCorp Vault. + */ + public async getMultiple(path: string, _options?: unknown): Promise { + await super.getMultiple(path); + } + + /** + * Retrieve a secret from HashiCorp Vault. + * + * @param {string} name - The name of the secret + * @param {HashiCorpVaultGetOptions} options - Options to customize the retrieval of the secret + */ + protected async _get( + name: string, + options?: HashiCorpVaultGetOptions + ): Promise> { + const mount = options?.sdkOptions?.mount ?? 'secret'; + const version = options?.sdkOptions?.version; + + const response = await this.client.readKVSecret( + this.#token, + name, + version, + mount + ); + + if (isErrorResponse(response)) { + this.#logger.error('An error occurred', { + error: response.vaultHelpMessage, + }); + throw response; + } else { + return response.data; + } + } + + /** + * Retrieving multiple parameter values from HashiCorp Vault is not supported. + * + * @throws Not Implemented Error. + */ + protected async _getMultiple( + _path: string, + _options?: unknown + ): Promise { + throw new Error('Method not implemented.'); + } +} + +export { HashiCorpVaultProvider }; diff --git a/docs/snippets/parameters/customProviderVaultTypes.ts b/docs/snippets/parameters/customProviderVaultTypes.ts new file mode 100644 index 0000000000..09845d3cbd --- /dev/null +++ b/docs/snippets/parameters/customProviderVaultTypes.ts @@ -0,0 +1,97 @@ +import { GetOptionsInterface } from '@aws-lambda-powertools/parameters/base/types'; +import type Vault from 'hashi-vault-js'; + +/** + * Base interface for HashiCorpVaultProviderOptions. + * @interface + */ +interface HashiCorpVaultProviderOptionsBase { + /** + * Indicate the server name/IP, port and API version for the Vault instance, all paths are relative to this one. + * @example 'https://vault.example.com:8200/v1' + */ + url: string; + /** + * The Vault token to use for authentication. + */ + token: string; +} + +/** + * Interface for HashiCorpVaultProviderOptions with clientConfig property. + * @interface + */ +interface HashiCorpVaultProviderOptionsWithClientConfig + extends HashiCorpVaultProviderOptionsBase { + /** + * Optional configuration to pass during client initialization to customize the `hashi-vault-js` client. + */ + clientConfig?: Omit; + /** + * This property should never be passed. + */ + vaultClient?: never; +} + +/** + * Interface for HashiCorpVaultProviderOptions with vaultClient property. + * + * @interface + */ +interface HashiCorpVaultProviderOptionsWithClientInstance + extends HashiCorpVaultProviderOptionsBase { + /** + * Optional `hashi-vault-js` client to pass during HashiCorpVaultProvider class instantiation. If not provided, a new client will be created. + */ + vaultClient?: Vault; + /** + * This property should never be passed. + */ + clientConfig: never; +} + +/** + * Options for the HashiCorpVaultProvider class constructor. + * + * @param {string} url - Indicate the server name/IP, port and API version for the Vault instance, all paths are relative to this one. + * @param {string} token - The Vault token to use for authentication. + * @param {Vault.VaultConfig} [clientConfig] - Optional configuration to pass during client initialization, e.g. timeout. Mutually exclusive with vaultClient. + * @param {Vault} [vaultClient] - Optional `hashi-vault-js` client to pass during HashiCorpVaultProvider class instantiation. Mutually exclusive with clientConfig. + */ +type HashiCorpVaultProviderOptions = + | HashiCorpVaultProviderOptionsWithClientConfig + | HashiCorpVaultProviderOptionsWithClientInstance; + +type HashiCorpVaultReadKVSecretOptions = { + /** + * The mount point of the secret engine to use. Defaults to `secret`. + * @example 'kv' + */ + mount?: string; + /** + * The version of the secret to retrieve. Defaults to `undefined`. + * @example 1 + */ + version?: number; +}; + +interface HashiCorpVaultGetOptions extends GetOptionsInterface { + /** + * The Parameters utility does not support transforming `Record` values as returned by the HashiCorp Vault SDK. + */ + transform?: never; + sdkOptions?: HashiCorpVaultReadKVSecretOptions; +} + +/** + * Typeguard that discriminates the type of the response and excludes the ErrorResponse type. + * + * @param object The response object to discriminate + */ +export const isErrorResponse = ( + object: Vault.ReadKVSecretResponse +): object is Vault.ErrorResponse => { + return 'isVaultError' in object; +}; + +export type { HashiCorpVaultProviderOptions, HashiCorpVaultGetOptions }; diff --git a/docs/snippets/parameters/customProviderVaultUsage.ts b/docs/snippets/parameters/customProviderVaultUsage.ts new file mode 100644 index 0000000000..203724b69e --- /dev/null +++ b/docs/snippets/parameters/customProviderVaultUsage.ts @@ -0,0 +1,12 @@ +import { HashiCorpVaultProvider } from './customProviderVault'; + +const secretsProvider = new HashiCorpVaultProvider({ + url: 'https://vault.example.com:8200/v1', + token: 'my-token', +}); + +export const handler = async (): Promise => { + // Retrieve a secret from HashiCorp Vault + const secret = await secretsProvider.get('my-secret'); + console.log(secret); +}; diff --git a/docs/utilities/parameters.md b/docs/utilities/parameters.md index 79a3fb2cfe..75c3363ef9 100644 --- a/docs/utilities/parameters.md +++ b/docs/utilities/parameters.md @@ -3,9 +3,6 @@ title: Parameters description: Utility --- -???+ warning - **This utility is currently released as beta developer preview** and is intended strictly for feedback and testing purposes **and not for production workloads**.. The version and all future versions tagged with the `-beta` suffix should be treated as not stable. Up until before the [General Availability release](https://github.com/aws-powertools/powertools-lambda-typescript/milestone/10) we might introduce significant breaking changes and improvements in response to customers feedback. - The Parameters utility provides high-level functions to retrieve one or multiple parameter values from [AWS Systems Manager Parameter Store](https://docs.aws.amazon.com/systems-manager/latest/userguide/systems-manager-parameter-store.html){target="_blank"}, [AWS Secrets Manager](https://docs.aws.amazon.com/secretsmanager/latest/userguide/intro.html){target="_blank"}, [AWS AppConfig](https://docs.aws.amazon.com/appconfig/latest/userguide/what-is-appconfig.html){target="_blank"}, [Amazon DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Introduction.html){target="_blank"}, or your own parameter store. ## Key features @@ -275,6 +272,29 @@ DynamoDB provider can be customized at initialization to match your table struct --8<-- "docs/snippets/parameters/dynamoDBProviderCustomizeTable.ts" ``` +### Create your own provider + +You can create your own custom parameter store provider by extending the `BaseProvider` class, and implementing the `get()` and `getMultiple()` methods, as well as its respective `_get()` and `_getMultiple()` private methods to retrieve a single, or multiple parameters from your custom store. + +All caching logic is handled by the `BaseProvider`, and provided that the return types of your store are compatible with the ones used in the `BaseProvider`, all transformations will also work as expected. + +Here's an example of implementing a custom parameter store using an external service like HashiCorp Vault, a widely popular key-value secret storage. + +=== "Provider implementation" + ```typescript + --8<-- "docs/snippets/parameters/customProviderVault.ts" + ``` + +=== "Provider types" + ```typescript + --8<-- "docs/snippets/parameters/customProviderVaultTypes.ts" + ``` + +=== "Provider usage" + ```typescript + --8<-- "docs/snippets/parameters/customProviderVaultUsage.ts" + ``` + ### Deserializing values with transform parameter For parameters stored in JSON or Base64 format, you can use the `transform` argument for deserialization. diff --git a/examples/cdk/CHANGELOG.md b/examples/cdk/CHANGELOG.md index 3ebb386921..bccc27fff6 100644 --- a/examples/cdk/CHANGELOG.md +++ b/examples/cdk/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [1.11.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v1.10.0...v1.11.0) (2023-06-29) + +**Note:** Version bump only for package cdk-sample + # [1.10.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v1.9.0...v1.10.0) (2023-06-23) **Note:** Version bump only for package cdk-sample diff --git a/examples/cdk/package.json b/examples/cdk/package.json index 6ca74f1f32..431a888c38 100644 --- a/examples/cdk/package.json +++ b/examples/cdk/package.json @@ -1,6 +1,6 @@ { "name": "cdk-sample", - "version": "1.10.0", + "version": "1.11.0", "author": { "name": "Amazon Web Services", "url": "https://aws.amazon.com" @@ -25,10 +25,10 @@ "*.js": "npm run lint-fix" }, "devDependencies": { - "@aws-lambda-powertools/logger": "^1.10.0", - "@aws-lambda-powertools/metrics": "^1.10.0", - "@aws-lambda-powertools/tracer": "^1.10.0", - "@aws-sdk/lib-dynamodb": "^3.231.0", + "@aws-lambda-powertools/logger": "^1.11.0", + "@aws-lambda-powertools/metrics": "^1.11.0", + "@aws-lambda-powertools/tracer": "^1.11.0", + "@aws-sdk/lib-dynamodb": "^3.360.0", "@types/aws-lambda": "^8.10.109", "@types/jest": "^29.2.4", "@types/node": "18.11.17", diff --git a/examples/sam/CHANGELOG.md b/examples/sam/CHANGELOG.md index cc94693ed0..d532527373 100644 --- a/examples/sam/CHANGELOG.md +++ b/examples/sam/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [1.11.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v1.10.0...v1.11.0) (2023-06-29) + +**Note:** Version bump only for package sam-example + # [1.10.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v1.9.0...v1.10.0) (2023-06-23) **Note:** Version bump only for package sam-example diff --git a/examples/sam/package.json b/examples/sam/package.json index 426bec3fb0..8ea457e34e 100644 --- a/examples/sam/package.json +++ b/examples/sam/package.json @@ -1,6 +1,6 @@ { "name": "sam-example", - "version": "1.10.0", + "version": "1.11.0", "author": { "name": "Amazon Web Services", "url": "https://aws.amazon.com" @@ -37,11 +37,11 @@ "typescript": "^4.9.4" }, "dependencies": { - "@aws-lambda-powertools/logger": "^1.10.0", - "@aws-lambda-powertools/metrics": "^1.10.0", - "@aws-lambda-powertools/tracer": "^1.10.0", - "@aws-sdk/client-dynamodb": "^3.231.0", - "@aws-sdk/lib-dynamodb": "^3.231.0", + "@aws-lambda-powertools/logger": "^1.11.0", + "@aws-lambda-powertools/metrics": "^1.11.0", + "@aws-lambda-powertools/tracer": "^1.11.0", + "@aws-sdk/client-dynamodb": "^3.360.0", + "@aws-sdk/lib-dynamodb": "^3.360.0", "@middy/core": "^3.6.2", "phin": "^3.7.0" } diff --git a/layers/CHANGELOG.md b/layers/CHANGELOG.md index 2f375aa505..6bf943b6ba 100644 --- a/layers/CHANGELOG.md +++ b/layers/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [1.11.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v1.10.0...v1.11.0) (2023-06-29) + +**Note:** Version bump only for package layers + # [1.10.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v1.9.0...v1.10.0) (2023-06-23) **Note:** Version bump only for package layers diff --git a/layers/package.json b/layers/package.json index 8b88fc0e02..bec43d142a 100644 --- a/layers/package.json +++ b/layers/package.json @@ -1,6 +1,6 @@ { "name": "layers", - "version": "1.10.0", + "version": "1.11.0", "bin": { "layer": "bin/layers.js" }, diff --git a/lerna.json b/lerna.json index 19e7bf9d05..03a17affa5 100644 --- a/lerna.json +++ b/lerna.json @@ -10,7 +10,7 @@ "examples/sam", "layers" ], - "version": "1.10.0", + "version": "1.11.0", "npmClient": "npm", "message": "chore(release): %s [skip ci]" } diff --git a/package-lock.json b/package-lock.json index fd6e4550dc..f259fcb6a3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -67,31 +67,224 @@ "version": "1.9.0", "license": "MIT-0", "devDependencies": { - "@aws-sdk/client-appconfigdata": "^3.245.0", - "@aws-sdk/client-dynamodb": "^3.245.0", - "@aws-sdk/client-secrets-manager": "^3.250.0", - "@aws-sdk/client-ssm": "^3.245.0", - "@aws-sdk/util-dynamodb": "^3.245.0", - "aws-sdk": "^2.1354.0", - "aws-sdk-client-mock": "^2.0.1", - "aws-sdk-client-mock-jest": "^2.0.1", - "axios": "^1.2.4" + "@aws-sdk/client-appconfigdata": "^3.360.0", + "@aws-sdk/client-dynamodb": "^3.360.0", + "@aws-sdk/client-secrets-manager": "^3.360.0", + "@aws-sdk/client-ssm": "^3.360.0", + "@aws-sdk/util-dynamodb": "^3.360.0", + "aws-sdk": "^2.1405.0", + "aws-sdk-client-mock": "^2.2.0", + "aws-sdk-client-mock-jest": "^2.2.0", + "axios": "^1.2.4", + "hashi-vault-js": "^0.4.13" + } + }, + "docs/snippets/node_modules/@jest/expect-utils": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-28.1.3.tgz", + "integrity": "sha512-wvbi9LUrHJLn3NlDW6wF2hvIMtd4JUl2QNVrjq+IBSHirgfrR3o9RnVtxzdEGO2n9JyIWwHnLfby5KzqBGg2YA==", + "dev": true, + "dependencies": { + "jest-get-type": "^28.0.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" } }, - "docs/snippets/node_modules/@aws-sdk/util-dynamodb": { - "version": "3.245.0", + "docs/snippets/node_modules/@jest/schemas": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-28.1.3.tgz", + "integrity": "sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg==", "dev": true, - "license": "Apache-2.0", "dependencies": { - "tslib": "^2.3.1" + "@sinclair/typebox": "^0.24.1" }, "engines": { - "node": ">=14.0.0" + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "docs/snippets/node_modules/@jest/types": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", + "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", + "dev": true, + "dependencies": { + "@jest/schemas": "^28.1.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "docs/snippets/node_modules/@types/jest": { + "version": "28.1.8", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-28.1.8.tgz", + "integrity": "sha512-8TJkV++s7B6XqnDrzR1m/TT0A0h948Pnl/097veySPN67VRAgQ4gZ7n2KfJo2rVq6njQjdxU3GCCyDvAeuHoiw==", + "dev": true, + "dependencies": { + "expect": "^28.0.0", + "pretty-format": "^28.0.0" + } + }, + "docs/snippets/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "docs/snippets/node_modules/aws-sdk-client-mock": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/aws-sdk-client-mock/-/aws-sdk-client-mock-2.2.0.tgz", + "integrity": "sha512-Kq2N+6gHRDedbrgTA0NMMfyN1XDWEA5Kbpm9/M/cenSxoNjfvQBOtBawI1lQe5h4UziLl///E7u17K9PBoHEKA==", + "dev": true, + "dependencies": { + "@types/sinon": "^10.0.10", + "sinon": "^14.0.2", + "tslib": "^2.1.0" + } + }, + "docs/snippets/node_modules/aws-sdk-client-mock-jest": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/aws-sdk-client-mock-jest/-/aws-sdk-client-mock-jest-2.2.0.tgz", + "integrity": "sha512-lpPapmCjTe70qhXYFIjUL9cdA75YmtC0surig3QSr2Y5doaG1e4fuXlgkNeH6V873rlwu9TWCG2MFOr4rHuMfg==", + "dev": true, + "dependencies": { + "@types/jest": "^28.1.3", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "aws-sdk-client-mock": "2.2.0" + } + }, + "docs/snippets/node_modules/diff-sequences": { + "version": "28.1.1", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-28.1.1.tgz", + "integrity": "sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw==", + "dev": true, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "docs/snippets/node_modules/expect": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/expect/-/expect-28.1.3.tgz", + "integrity": "sha512-eEh0xn8HlsuOBxFgIss+2mX85VAS4Qy3OSkjV7rlBWljtA4oWH37glVGyOZSZvErDT/yBywZdPGwCXuTvSG85g==", + "dev": true, + "dependencies": { + "@jest/expect-utils": "^28.1.3", + "jest-get-type": "^28.0.2", + "jest-matcher-utils": "^28.1.3", + "jest-message-util": "^28.1.3", + "jest-util": "^28.1.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "docs/snippets/node_modules/jest-diff": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-28.1.3.tgz", + "integrity": "sha512-8RqP1B/OXzjjTWkqMX67iqgwBVJRgCyKD3L9nq+6ZqJMdvjE8RgHktqZ6jNrkdMT+dJuYNI3rhQpxaz7drJHfw==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^28.1.1", + "jest-get-type": "^28.0.2", + "pretty-format": "^28.1.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "docs/snippets/node_modules/jest-get-type": { + "version": "28.0.2", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-28.0.2.tgz", + "integrity": "sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA==", + "dev": true, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "docs/snippets/node_modules/jest-matcher-utils": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-28.1.3.tgz", + "integrity": "sha512-kQeJ7qHemKfbzKoGjHHrRKH6atgxMk8Enkk2iPQ3XwO6oE/KYD8lMYOziCkeSB9G4adPM4nR1DE8Tf5JeWH6Bw==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^28.1.3", + "jest-get-type": "^28.0.2", + "pretty-format": "^28.1.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "docs/snippets/node_modules/jest-message-util": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-28.1.3.tgz", + "integrity": "sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^28.1.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^28.1.3", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "docs/snippets/node_modules/jest-util": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz", + "integrity": "sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==", + "dev": true, + "dependencies": { + "@jest/types": "^28.1.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "docs/snippets/node_modules/pretty-format": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.3.tgz", + "integrity": "sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==", + "dev": true, + "dependencies": { + "@jest/schemas": "^28.1.3", + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" } }, "examples/cdk": { "name": "cdk-sample", - "version": "1.10.0", + "version": "1.11.0", "license": "MIT-0", "dependencies": { "@middy/core": "^3.6.2", @@ -104,10 +297,10 @@ "cdk-app": "bin/cdk-app.js" }, "devDependencies": { - "@aws-lambda-powertools/logger": "^1.10.0", - "@aws-lambda-powertools/metrics": "^1.10.0", - "@aws-lambda-powertools/tracer": "^1.10.0", - "@aws-sdk/lib-dynamodb": "^3.231.0", + "@aws-lambda-powertools/logger": "^1.11.0", + "@aws-lambda-powertools/metrics": "^1.11.0", + "@aws-lambda-powertools/tracer": "^1.11.0", + "@aws-sdk/lib-dynamodb": "^3.360.0", "@types/aws-lambda": "^8.10.109", "@types/jest": "^29.2.4", "@types/node": "18.11.17", @@ -141,14 +334,14 @@ }, "examples/sam": { "name": "sam-example", - "version": "1.10.0", + "version": "1.11.0", "license": "MIT-0", "dependencies": { - "@aws-lambda-powertools/logger": "^1.10.0", - "@aws-lambda-powertools/metrics": "^1.10.0", - "@aws-lambda-powertools/tracer": "^1.10.0", - "@aws-sdk/client-dynamodb": "^3.231.0", - "@aws-sdk/lib-dynamodb": "^3.231.0", + "@aws-lambda-powertools/logger": "^1.11.0", + "@aws-lambda-powertools/metrics": "^1.11.0", + "@aws-lambda-powertools/tracer": "^1.11.0", + "@aws-sdk/client-dynamodb": "^3.360.0", + "@aws-sdk/lib-dynamodb": "^3.360.0", "@middy/core": "^3.6.2", "phin": "^3.7.0" }, @@ -176,7 +369,7 @@ "dev": true }, "layers": { - "version": "1.10.0", + "version": "1.11.0", "license": "MIT-0", "bin": { "layer": "bin/layers.js" @@ -470,11 +663,11 @@ "link": true }, "node_modules/@aws-sdk/abort-controller": { - "version": "3.347.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/abort-controller/-/abort-controller-3.347.0.tgz", - "integrity": "sha512-P/2qE6ntYEmYG4Ez535nJWZbXqgbkJx8CMz7ChEuEg3Gp3dvVYEKg+iEUEvlqQ2U5dWP5J3ehw5po9t86IsVPQ==", + "version": "3.357.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/abort-controller/-/abort-controller-3.357.0.tgz", + "integrity": "sha512-nQYDJon87quPwt2JZJwUN2GFKJnvE5kWb6tZP4xb5biSGUKBqDQo06oYed7yokatCuCMouIXV462aN0fWODtOw==", "dependencies": { - "@aws-sdk/types": "3.347.0", + "@aws-sdk/types": "3.357.0", "tslib": "^2.5.0" }, "engines": { @@ -482,43 +675,44 @@ } }, "node_modules/@aws-sdk/client-appconfigdata": { - "version": "3.350.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-appconfigdata/-/client-appconfigdata-3.350.0.tgz", - "integrity": "sha512-W7cCLReujKPGCwtkDd2V0eQIvSTtsX6NW+KiN8wnvQp66je8hu4g2RWxW52CoCfptjVb6R1e9WM+RKBacsXekA==", + "version": "3.360.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-appconfigdata/-/client-appconfigdata-3.360.0.tgz", + "integrity": "sha512-ezGTbUwuBWphG1eCOrZ8XuBljoAt2aOxNQmZvND9E4xQQEJK+594Q6+QzNsugAqKM+DYdw6r28MSbTM2gSUCuw==", "dev": true, "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/client-sts": "3.350.0", - "@aws-sdk/config-resolver": "3.347.0", - "@aws-sdk/credential-provider-node": "3.350.0", - "@aws-sdk/fetch-http-handler": "3.347.0", - "@aws-sdk/hash-node": "3.347.0", - "@aws-sdk/invalid-dependency": "3.347.0", - "@aws-sdk/middleware-content-length": "3.347.0", - "@aws-sdk/middleware-endpoint": "3.347.0", - "@aws-sdk/middleware-host-header": "3.347.0", - "@aws-sdk/middleware-logger": "3.347.0", - "@aws-sdk/middleware-recursion-detection": "3.347.0", - "@aws-sdk/middleware-retry": "3.347.0", - "@aws-sdk/middleware-serde": "3.347.0", - "@aws-sdk/middleware-signing": "3.347.0", - "@aws-sdk/middleware-stack": "3.347.0", - "@aws-sdk/middleware-user-agent": "3.347.0", - "@aws-sdk/node-config-provider": "3.347.0", - "@aws-sdk/node-http-handler": "3.350.0", - "@aws-sdk/smithy-client": "3.347.0", - "@aws-sdk/types": "3.347.0", - "@aws-sdk/url-parser": "3.347.0", + "@aws-sdk/client-sts": "3.360.0", + "@aws-sdk/config-resolver": "3.357.0", + "@aws-sdk/credential-provider-node": "3.360.0", + "@aws-sdk/fetch-http-handler": "3.357.0", + "@aws-sdk/hash-node": "3.357.0", + "@aws-sdk/invalid-dependency": "3.357.0", + "@aws-sdk/middleware-content-length": "3.357.0", + "@aws-sdk/middleware-endpoint": "3.357.0", + "@aws-sdk/middleware-host-header": "3.357.0", + "@aws-sdk/middleware-logger": "3.357.0", + "@aws-sdk/middleware-recursion-detection": "3.357.0", + "@aws-sdk/middleware-retry": "3.357.0", + "@aws-sdk/middleware-serde": "3.357.0", + "@aws-sdk/middleware-signing": "3.357.0", + "@aws-sdk/middleware-stack": "3.357.0", + "@aws-sdk/middleware-user-agent": "3.357.0", + "@aws-sdk/node-config-provider": "3.357.0", + "@aws-sdk/node-http-handler": "3.360.0", + "@aws-sdk/smithy-client": "3.360.0", + "@aws-sdk/types": "3.357.0", + "@aws-sdk/url-parser": "3.357.0", "@aws-sdk/util-base64": "3.310.0", "@aws-sdk/util-body-length-browser": "3.310.0", "@aws-sdk/util-body-length-node": "3.310.0", - "@aws-sdk/util-defaults-mode-browser": "3.347.0", - "@aws-sdk/util-defaults-mode-node": "3.347.0", - "@aws-sdk/util-endpoints": "3.347.0", - "@aws-sdk/util-retry": "3.347.0", - "@aws-sdk/util-user-agent-browser": "3.347.0", - "@aws-sdk/util-user-agent-node": "3.347.0", + "@aws-sdk/util-defaults-mode-browser": "3.360.0", + "@aws-sdk/util-defaults-mode-node": "3.360.0", + "@aws-sdk/util-endpoints": "3.357.0", + "@aws-sdk/util-retry": "3.357.0", + "@aws-sdk/util-stream": "3.360.0", + "@aws-sdk/util-user-agent-browser": "3.357.0", + "@aws-sdk/util-user-agent-node": "3.357.0", "@aws-sdk/util-utf8": "3.310.0", "@smithy/protocol-http": "^1.0.1", "@smithy/types": "^1.0.0", @@ -529,48 +723,48 @@ } }, "node_modules/@aws-sdk/client-cloudwatch": { - "version": "3.350.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-cloudwatch/-/client-cloudwatch-3.350.0.tgz", - "integrity": "sha512-9Mpf+fdEkqJznoGBkLTr8gEpkwJjD7d96J+bSpeIXlTeldWDzmzpYLjnedMIxlIiGEWNymrLmh2wVD0z1+M31w==", + "version": "3.360.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cloudwatch/-/client-cloudwatch-3.360.0.tgz", + "integrity": "sha512-4Vvlq2ahaUWYUs8P0sp+6bqCjiydwszLqwRzqA9dPwRbPtITEwP+tdREAiqVXSRSRv2y5VcmZUMHjixpIpflGg==", "dev": true, "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/client-sts": "3.350.0", - "@aws-sdk/config-resolver": "3.347.0", - "@aws-sdk/credential-provider-node": "3.350.0", - "@aws-sdk/fetch-http-handler": "3.347.0", - "@aws-sdk/hash-node": "3.347.0", - "@aws-sdk/invalid-dependency": "3.347.0", - "@aws-sdk/middleware-content-length": "3.347.0", - "@aws-sdk/middleware-endpoint": "3.347.0", - "@aws-sdk/middleware-host-header": "3.347.0", - "@aws-sdk/middleware-logger": "3.347.0", - "@aws-sdk/middleware-recursion-detection": "3.347.0", - "@aws-sdk/middleware-retry": "3.347.0", - "@aws-sdk/middleware-serde": "3.347.0", - "@aws-sdk/middleware-signing": "3.347.0", - "@aws-sdk/middleware-stack": "3.347.0", - "@aws-sdk/middleware-user-agent": "3.347.0", - "@aws-sdk/node-config-provider": "3.347.0", - "@aws-sdk/node-http-handler": "3.350.0", - "@aws-sdk/smithy-client": "3.347.0", - "@aws-sdk/types": "3.347.0", - "@aws-sdk/url-parser": "3.347.0", + "@aws-sdk/client-sts": "3.360.0", + "@aws-sdk/config-resolver": "3.357.0", + "@aws-sdk/credential-provider-node": "3.360.0", + "@aws-sdk/fetch-http-handler": "3.357.0", + "@aws-sdk/hash-node": "3.357.0", + "@aws-sdk/invalid-dependency": "3.357.0", + "@aws-sdk/middleware-content-length": "3.357.0", + "@aws-sdk/middleware-endpoint": "3.357.0", + "@aws-sdk/middleware-host-header": "3.357.0", + "@aws-sdk/middleware-logger": "3.357.0", + "@aws-sdk/middleware-recursion-detection": "3.357.0", + "@aws-sdk/middleware-retry": "3.357.0", + "@aws-sdk/middleware-serde": "3.357.0", + "@aws-sdk/middleware-signing": "3.357.0", + "@aws-sdk/middleware-stack": "3.357.0", + "@aws-sdk/middleware-user-agent": "3.357.0", + "@aws-sdk/node-config-provider": "3.357.0", + "@aws-sdk/node-http-handler": "3.360.0", + "@aws-sdk/smithy-client": "3.360.0", + "@aws-sdk/types": "3.357.0", + "@aws-sdk/url-parser": "3.357.0", "@aws-sdk/util-base64": "3.310.0", "@aws-sdk/util-body-length-browser": "3.310.0", "@aws-sdk/util-body-length-node": "3.310.0", - "@aws-sdk/util-defaults-mode-browser": "3.347.0", - "@aws-sdk/util-defaults-mode-node": "3.347.0", - "@aws-sdk/util-endpoints": "3.347.0", - "@aws-sdk/util-retry": "3.347.0", - "@aws-sdk/util-user-agent-browser": "3.347.0", - "@aws-sdk/util-user-agent-node": "3.347.0", + "@aws-sdk/util-defaults-mode-browser": "3.360.0", + "@aws-sdk/util-defaults-mode-node": "3.360.0", + "@aws-sdk/util-endpoints": "3.357.0", + "@aws-sdk/util-retry": "3.357.0", + "@aws-sdk/util-user-agent-browser": "3.357.0", + "@aws-sdk/util-user-agent-node": "3.357.0", "@aws-sdk/util-utf8": "3.310.0", - "@aws-sdk/util-waiter": "3.347.0", + "@aws-sdk/util-waiter": "3.357.0", "@smithy/protocol-http": "^1.0.1", "@smithy/types": "^1.0.0", - "fast-xml-parser": "4.2.4", + "fast-xml-parser": "4.2.5", "tslib": "^2.5.0" }, "engines": { @@ -578,45 +772,45 @@ } }, "node_modules/@aws-sdk/client-dynamodb": { - "version": "3.351.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-dynamodb/-/client-dynamodb-3.351.0.tgz", - "integrity": "sha512-mnPtMqfv642x+HuJ6ZuG+8KsNf3BfvOinR0FjtU17mgDiYOz9IzSkxfcQxryfJxYbbrtC1fHrit5Ii4BNiDcxQ==", + "version": "3.360.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-dynamodb/-/client-dynamodb-3.360.0.tgz", + "integrity": "sha512-iaLlb4mmZHQjPz7ZyCBUFBvC8XUezzStzjn9ketemJLoWwnMgzmAse3I5ULkya4jyiaocwVvczZVfyOlHgDayQ==", "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/client-sts": "3.350.0", - "@aws-sdk/config-resolver": "3.347.0", - "@aws-sdk/credential-provider-node": "3.350.0", - "@aws-sdk/fetch-http-handler": "3.347.0", - "@aws-sdk/hash-node": "3.347.0", - "@aws-sdk/invalid-dependency": "3.347.0", - "@aws-sdk/middleware-content-length": "3.347.0", - "@aws-sdk/middleware-endpoint": "3.347.0", - "@aws-sdk/middleware-endpoint-discovery": "3.347.0", - "@aws-sdk/middleware-host-header": "3.347.0", - "@aws-sdk/middleware-logger": "3.347.0", - "@aws-sdk/middleware-recursion-detection": "3.347.0", - "@aws-sdk/middleware-retry": "3.347.0", - "@aws-sdk/middleware-serde": "3.347.0", - "@aws-sdk/middleware-signing": "3.347.0", - "@aws-sdk/middleware-stack": "3.347.0", - "@aws-sdk/middleware-user-agent": "3.347.0", - "@aws-sdk/node-config-provider": "3.347.0", - "@aws-sdk/node-http-handler": "3.350.0", - "@aws-sdk/smithy-client": "3.347.0", - "@aws-sdk/types": "3.347.0", - "@aws-sdk/url-parser": "3.347.0", + "@aws-sdk/client-sts": "3.360.0", + "@aws-sdk/config-resolver": "3.357.0", + "@aws-sdk/credential-provider-node": "3.360.0", + "@aws-sdk/fetch-http-handler": "3.357.0", + "@aws-sdk/hash-node": "3.357.0", + "@aws-sdk/invalid-dependency": "3.357.0", + "@aws-sdk/middleware-content-length": "3.357.0", + "@aws-sdk/middleware-endpoint": "3.357.0", + "@aws-sdk/middleware-endpoint-discovery": "3.357.0", + "@aws-sdk/middleware-host-header": "3.357.0", + "@aws-sdk/middleware-logger": "3.357.0", + "@aws-sdk/middleware-recursion-detection": "3.357.0", + "@aws-sdk/middleware-retry": "3.357.0", + "@aws-sdk/middleware-serde": "3.357.0", + "@aws-sdk/middleware-signing": "3.357.0", + "@aws-sdk/middleware-stack": "3.357.0", + "@aws-sdk/middleware-user-agent": "3.357.0", + "@aws-sdk/node-config-provider": "3.357.0", + "@aws-sdk/node-http-handler": "3.360.0", + "@aws-sdk/smithy-client": "3.360.0", + "@aws-sdk/types": "3.357.0", + "@aws-sdk/url-parser": "3.357.0", "@aws-sdk/util-base64": "3.310.0", "@aws-sdk/util-body-length-browser": "3.310.0", "@aws-sdk/util-body-length-node": "3.310.0", - "@aws-sdk/util-defaults-mode-browser": "3.347.0", - "@aws-sdk/util-defaults-mode-node": "3.347.0", - "@aws-sdk/util-endpoints": "3.347.0", - "@aws-sdk/util-retry": "3.347.0", - "@aws-sdk/util-user-agent-browser": "3.347.0", - "@aws-sdk/util-user-agent-node": "3.347.0", + "@aws-sdk/util-defaults-mode-browser": "3.360.0", + "@aws-sdk/util-defaults-mode-node": "3.360.0", + "@aws-sdk/util-endpoints": "3.357.0", + "@aws-sdk/util-retry": "3.357.0", + "@aws-sdk/util-user-agent-browser": "3.357.0", + "@aws-sdk/util-user-agent-node": "3.357.0", "@aws-sdk/util-utf8": "3.310.0", - "@aws-sdk/util-waiter": "3.347.0", + "@aws-sdk/util-waiter": "3.357.0", "@smithy/protocol-http": "^1.0.1", "@smithy/types": "^1.0.0", "tslib": "^2.5.0", @@ -634,48 +828,49 @@ } }, "node_modules/@aws-sdk/client-lambda": { - "version": "3.350.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-lambda/-/client-lambda-3.350.0.tgz", - "integrity": "sha512-/3RNUHwsOacmzM/ZHxzKsA9QmYOAWmbA/IYkZ/qMN7Xti6HQ8cIqVnfBIKcKJsC4BUAz31szCf5ULf/mgjPhQw==", + "version": "3.360.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-lambda/-/client-lambda-3.360.0.tgz", + "integrity": "sha512-FndD1IL7birajJz21m6pjCb4CSlF/mKJTEIaSCKPgN9WqrNL/sUZV5LzLOVVlGho0RdwLqdzAFhUBiQI/PSz4A==", "dev": true, "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/client-sts": "3.350.0", - "@aws-sdk/config-resolver": "3.347.0", - "@aws-sdk/credential-provider-node": "3.350.0", - "@aws-sdk/eventstream-serde-browser": "3.347.0", - "@aws-sdk/eventstream-serde-config-resolver": "3.347.0", - "@aws-sdk/eventstream-serde-node": "3.347.0", - "@aws-sdk/fetch-http-handler": "3.347.0", - "@aws-sdk/hash-node": "3.347.0", - "@aws-sdk/invalid-dependency": "3.347.0", - "@aws-sdk/middleware-content-length": "3.347.0", - "@aws-sdk/middleware-endpoint": "3.347.0", - "@aws-sdk/middleware-host-header": "3.347.0", - "@aws-sdk/middleware-logger": "3.347.0", - "@aws-sdk/middleware-recursion-detection": "3.347.0", - "@aws-sdk/middleware-retry": "3.347.0", - "@aws-sdk/middleware-serde": "3.347.0", - "@aws-sdk/middleware-signing": "3.347.0", - "@aws-sdk/middleware-stack": "3.347.0", - "@aws-sdk/middleware-user-agent": "3.347.0", - "@aws-sdk/node-config-provider": "3.347.0", - "@aws-sdk/node-http-handler": "3.350.0", - "@aws-sdk/smithy-client": "3.347.0", - "@aws-sdk/types": "3.347.0", - "@aws-sdk/url-parser": "3.347.0", + "@aws-sdk/client-sts": "3.360.0", + "@aws-sdk/config-resolver": "3.357.0", + "@aws-sdk/credential-provider-node": "3.360.0", + "@aws-sdk/eventstream-serde-browser": "3.357.0", + "@aws-sdk/eventstream-serde-config-resolver": "3.357.0", + "@aws-sdk/eventstream-serde-node": "3.357.0", + "@aws-sdk/fetch-http-handler": "3.357.0", + "@aws-sdk/hash-node": "3.357.0", + "@aws-sdk/invalid-dependency": "3.357.0", + "@aws-sdk/middleware-content-length": "3.357.0", + "@aws-sdk/middleware-endpoint": "3.357.0", + "@aws-sdk/middleware-host-header": "3.357.0", + "@aws-sdk/middleware-logger": "3.357.0", + "@aws-sdk/middleware-recursion-detection": "3.357.0", + "@aws-sdk/middleware-retry": "3.357.0", + "@aws-sdk/middleware-serde": "3.357.0", + "@aws-sdk/middleware-signing": "3.357.0", + "@aws-sdk/middleware-stack": "3.357.0", + "@aws-sdk/middleware-user-agent": "3.357.0", + "@aws-sdk/node-config-provider": "3.357.0", + "@aws-sdk/node-http-handler": "3.360.0", + "@aws-sdk/smithy-client": "3.360.0", + "@aws-sdk/types": "3.357.0", + "@aws-sdk/url-parser": "3.357.0", "@aws-sdk/util-base64": "3.310.0", "@aws-sdk/util-body-length-browser": "3.310.0", "@aws-sdk/util-body-length-node": "3.310.0", - "@aws-sdk/util-defaults-mode-browser": "3.347.0", - "@aws-sdk/util-defaults-mode-node": "3.347.0", - "@aws-sdk/util-endpoints": "3.347.0", - "@aws-sdk/util-retry": "3.347.0", - "@aws-sdk/util-user-agent-browser": "3.347.0", - "@aws-sdk/util-user-agent-node": "3.347.0", + "@aws-sdk/util-defaults-mode-browser": "3.360.0", + "@aws-sdk/util-defaults-mode-node": "3.360.0", + "@aws-sdk/util-endpoints": "3.357.0", + "@aws-sdk/util-retry": "3.357.0", + "@aws-sdk/util-stream": "3.360.0", + "@aws-sdk/util-user-agent-browser": "3.357.0", + "@aws-sdk/util-user-agent-node": "3.357.0", "@aws-sdk/util-utf8": "3.310.0", - "@aws-sdk/util-waiter": "3.347.0", + "@aws-sdk/util-waiter": "3.357.0", "@smithy/protocol-http": "^1.0.1", "@smithy/types": "^1.0.0", "tslib": "^2.5.0" @@ -685,43 +880,43 @@ } }, "node_modules/@aws-sdk/client-secrets-manager": { - "version": "3.350.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-secrets-manager/-/client-secrets-manager-3.350.0.tgz", - "integrity": "sha512-p0H25+XJB734l3JEqWt5XMatTEIBvR50rm+xIBVVH/4Ui6OSR+OO2gQejmsAy9yAp3eJgy9lF9Kva8E6Z2fcxg==", + "version": "3.360.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-secrets-manager/-/client-secrets-manager-3.360.0.tgz", + "integrity": "sha512-HfgOGsneJwQHkWSfzC2reuCo9lBZ4hOF1oYCwVSbzOD/cvOm6pxND7gqacJOTrOc+wUUW0Sj+HdaLj8KbmljVg==", "dev": true, "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/client-sts": "3.350.0", - "@aws-sdk/config-resolver": "3.347.0", - "@aws-sdk/credential-provider-node": "3.350.0", - "@aws-sdk/fetch-http-handler": "3.347.0", - "@aws-sdk/hash-node": "3.347.0", - "@aws-sdk/invalid-dependency": "3.347.0", - "@aws-sdk/middleware-content-length": "3.347.0", - "@aws-sdk/middleware-endpoint": "3.347.0", - "@aws-sdk/middleware-host-header": "3.347.0", - "@aws-sdk/middleware-logger": "3.347.0", - "@aws-sdk/middleware-recursion-detection": "3.347.0", - "@aws-sdk/middleware-retry": "3.347.0", - "@aws-sdk/middleware-serde": "3.347.0", - "@aws-sdk/middleware-signing": "3.347.0", - "@aws-sdk/middleware-stack": "3.347.0", - "@aws-sdk/middleware-user-agent": "3.347.0", - "@aws-sdk/node-config-provider": "3.347.0", - "@aws-sdk/node-http-handler": "3.350.0", - "@aws-sdk/smithy-client": "3.347.0", - "@aws-sdk/types": "3.347.0", - "@aws-sdk/url-parser": "3.347.0", + "@aws-sdk/client-sts": "3.360.0", + "@aws-sdk/config-resolver": "3.357.0", + "@aws-sdk/credential-provider-node": "3.360.0", + "@aws-sdk/fetch-http-handler": "3.357.0", + "@aws-sdk/hash-node": "3.357.0", + "@aws-sdk/invalid-dependency": "3.357.0", + "@aws-sdk/middleware-content-length": "3.357.0", + "@aws-sdk/middleware-endpoint": "3.357.0", + "@aws-sdk/middleware-host-header": "3.357.0", + "@aws-sdk/middleware-logger": "3.357.0", + "@aws-sdk/middleware-recursion-detection": "3.357.0", + "@aws-sdk/middleware-retry": "3.357.0", + "@aws-sdk/middleware-serde": "3.357.0", + "@aws-sdk/middleware-signing": "3.357.0", + "@aws-sdk/middleware-stack": "3.357.0", + "@aws-sdk/middleware-user-agent": "3.357.0", + "@aws-sdk/node-config-provider": "3.357.0", + "@aws-sdk/node-http-handler": "3.360.0", + "@aws-sdk/smithy-client": "3.360.0", + "@aws-sdk/types": "3.357.0", + "@aws-sdk/url-parser": "3.357.0", "@aws-sdk/util-base64": "3.310.0", "@aws-sdk/util-body-length-browser": "3.310.0", "@aws-sdk/util-body-length-node": "3.310.0", - "@aws-sdk/util-defaults-mode-browser": "3.347.0", - "@aws-sdk/util-defaults-mode-node": "3.347.0", - "@aws-sdk/util-endpoints": "3.347.0", - "@aws-sdk/util-retry": "3.347.0", - "@aws-sdk/util-user-agent-browser": "3.347.0", - "@aws-sdk/util-user-agent-node": "3.347.0", + "@aws-sdk/util-defaults-mode-browser": "3.360.0", + "@aws-sdk/util-defaults-mode-node": "3.360.0", + "@aws-sdk/util-endpoints": "3.357.0", + "@aws-sdk/util-retry": "3.357.0", + "@aws-sdk/util-user-agent-browser": "3.357.0", + "@aws-sdk/util-user-agent-node": "3.357.0", "@aws-sdk/util-utf8": "3.310.0", "@smithy/protocol-http": "^1.0.1", "@smithy/types": "^1.0.0", @@ -741,45 +936,45 @@ } }, "node_modules/@aws-sdk/client-ssm": { - "version": "3.350.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-ssm/-/client-ssm-3.350.0.tgz", - "integrity": "sha512-Gs0fweUE+LYUy2/1kqsTwsyEswuyNDCq/eU4iRoU1WkOvNIGtqjTV8Rbh/0Og1CwlxUPPjaeQiQWpiofGvmbQQ==", + "version": "3.360.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-ssm/-/client-ssm-3.360.0.tgz", + "integrity": "sha512-VpykmgTlXeoCpOZFuvRuanJTJHa0OGrN84t2/07xAY1oxii0O+/ZH7/lcENpJAm9CJH1a/64smE/vVW4d0TFiw==", "dev": true, "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/client-sts": "3.350.0", - "@aws-sdk/config-resolver": "3.347.0", - "@aws-sdk/credential-provider-node": "3.350.0", - "@aws-sdk/fetch-http-handler": "3.347.0", - "@aws-sdk/hash-node": "3.347.0", - "@aws-sdk/invalid-dependency": "3.347.0", - "@aws-sdk/middleware-content-length": "3.347.0", - "@aws-sdk/middleware-endpoint": "3.347.0", - "@aws-sdk/middleware-host-header": "3.347.0", - "@aws-sdk/middleware-logger": "3.347.0", - "@aws-sdk/middleware-recursion-detection": "3.347.0", - "@aws-sdk/middleware-retry": "3.347.0", - "@aws-sdk/middleware-serde": "3.347.0", - "@aws-sdk/middleware-signing": "3.347.0", - "@aws-sdk/middleware-stack": "3.347.0", - "@aws-sdk/middleware-user-agent": "3.347.0", - "@aws-sdk/node-config-provider": "3.347.0", - "@aws-sdk/node-http-handler": "3.350.0", - "@aws-sdk/smithy-client": "3.347.0", - "@aws-sdk/types": "3.347.0", - "@aws-sdk/url-parser": "3.347.0", + "@aws-sdk/client-sts": "3.360.0", + "@aws-sdk/config-resolver": "3.357.0", + "@aws-sdk/credential-provider-node": "3.360.0", + "@aws-sdk/fetch-http-handler": "3.357.0", + "@aws-sdk/hash-node": "3.357.0", + "@aws-sdk/invalid-dependency": "3.357.0", + "@aws-sdk/middleware-content-length": "3.357.0", + "@aws-sdk/middleware-endpoint": "3.357.0", + "@aws-sdk/middleware-host-header": "3.357.0", + "@aws-sdk/middleware-logger": "3.357.0", + "@aws-sdk/middleware-recursion-detection": "3.357.0", + "@aws-sdk/middleware-retry": "3.357.0", + "@aws-sdk/middleware-serde": "3.357.0", + "@aws-sdk/middleware-signing": "3.357.0", + "@aws-sdk/middleware-stack": "3.357.0", + "@aws-sdk/middleware-user-agent": "3.357.0", + "@aws-sdk/node-config-provider": "3.357.0", + "@aws-sdk/node-http-handler": "3.360.0", + "@aws-sdk/smithy-client": "3.360.0", + "@aws-sdk/types": "3.357.0", + "@aws-sdk/url-parser": "3.357.0", "@aws-sdk/util-base64": "3.310.0", "@aws-sdk/util-body-length-browser": "3.310.0", "@aws-sdk/util-body-length-node": "3.310.0", - "@aws-sdk/util-defaults-mode-browser": "3.347.0", - "@aws-sdk/util-defaults-mode-node": "3.347.0", - "@aws-sdk/util-endpoints": "3.347.0", - "@aws-sdk/util-retry": "3.347.0", - "@aws-sdk/util-user-agent-browser": "3.347.0", - "@aws-sdk/util-user-agent-node": "3.347.0", + "@aws-sdk/util-defaults-mode-browser": "3.360.0", + "@aws-sdk/util-defaults-mode-node": "3.360.0", + "@aws-sdk/util-endpoints": "3.357.0", + "@aws-sdk/util-retry": "3.357.0", + "@aws-sdk/util-user-agent-browser": "3.357.0", + "@aws-sdk/util-user-agent-node": "3.357.0", "@aws-sdk/util-utf8": "3.310.0", - "@aws-sdk/util-waiter": "3.347.0", + "@aws-sdk/util-waiter": "3.357.0", "@smithy/protocol-http": "^1.0.1", "@smithy/types": "^1.0.0", "tslib": "^2.5.0", @@ -798,39 +993,39 @@ } }, "node_modules/@aws-sdk/client-sso": { - "version": "3.350.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.350.0.tgz", - "integrity": "sha512-2vpiv6SEjmQGK3ZueGzvTMG6NenjWp0CHjmda71d1Iqr+tZ2UlfC35+3ioU8JP+jiXLL+y9r+SCer3IC8N/i+Q==", + "version": "3.360.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.360.0.tgz", + "integrity": "sha512-0f6eG+6XFbDxrma5xxNGg/FJxh/OHC6h8AkfNms9Lv1gBoQSagpcTor+ax0z9F6lypOjaelX6k4DpeKAp4PZeA==", "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/config-resolver": "3.347.0", - "@aws-sdk/fetch-http-handler": "3.347.0", - "@aws-sdk/hash-node": "3.347.0", - "@aws-sdk/invalid-dependency": "3.347.0", - "@aws-sdk/middleware-content-length": "3.347.0", - "@aws-sdk/middleware-endpoint": "3.347.0", - "@aws-sdk/middleware-host-header": "3.347.0", - "@aws-sdk/middleware-logger": "3.347.0", - "@aws-sdk/middleware-recursion-detection": "3.347.0", - "@aws-sdk/middleware-retry": "3.347.0", - "@aws-sdk/middleware-serde": "3.347.0", - "@aws-sdk/middleware-stack": "3.347.0", - "@aws-sdk/middleware-user-agent": "3.347.0", - "@aws-sdk/node-config-provider": "3.347.0", - "@aws-sdk/node-http-handler": "3.350.0", - "@aws-sdk/smithy-client": "3.347.0", - "@aws-sdk/types": "3.347.0", - "@aws-sdk/url-parser": "3.347.0", + "@aws-sdk/config-resolver": "3.357.0", + "@aws-sdk/fetch-http-handler": "3.357.0", + "@aws-sdk/hash-node": "3.357.0", + "@aws-sdk/invalid-dependency": "3.357.0", + "@aws-sdk/middleware-content-length": "3.357.0", + "@aws-sdk/middleware-endpoint": "3.357.0", + "@aws-sdk/middleware-host-header": "3.357.0", + "@aws-sdk/middleware-logger": "3.357.0", + "@aws-sdk/middleware-recursion-detection": "3.357.0", + "@aws-sdk/middleware-retry": "3.357.0", + "@aws-sdk/middleware-serde": "3.357.0", + "@aws-sdk/middleware-stack": "3.357.0", + "@aws-sdk/middleware-user-agent": "3.357.0", + "@aws-sdk/node-config-provider": "3.357.0", + "@aws-sdk/node-http-handler": "3.360.0", + "@aws-sdk/smithy-client": "3.360.0", + "@aws-sdk/types": "3.357.0", + "@aws-sdk/url-parser": "3.357.0", "@aws-sdk/util-base64": "3.310.0", "@aws-sdk/util-body-length-browser": "3.310.0", "@aws-sdk/util-body-length-node": "3.310.0", - "@aws-sdk/util-defaults-mode-browser": "3.347.0", - "@aws-sdk/util-defaults-mode-node": "3.347.0", - "@aws-sdk/util-endpoints": "3.347.0", - "@aws-sdk/util-retry": "3.347.0", - "@aws-sdk/util-user-agent-browser": "3.347.0", - "@aws-sdk/util-user-agent-node": "3.347.0", + "@aws-sdk/util-defaults-mode-browser": "3.360.0", + "@aws-sdk/util-defaults-mode-node": "3.360.0", + "@aws-sdk/util-endpoints": "3.357.0", + "@aws-sdk/util-retry": "3.357.0", + "@aws-sdk/util-user-agent-browser": "3.357.0", + "@aws-sdk/util-user-agent-node": "3.357.0", "@aws-sdk/util-utf8": "3.310.0", "@smithy/protocol-http": "^1.0.1", "@smithy/types": "^1.0.0", @@ -841,39 +1036,39 @@ } }, "node_modules/@aws-sdk/client-sso-oidc": { - "version": "3.350.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.350.0.tgz", - "integrity": "sha512-v3UrWIglg9PPzGXqhyGB/qPZ8ifiGM9r4LV8vve1TpiKsUdf1Khtx1eB8yqjNO0vIsYUF+j1C23QT1qAN2DcEA==", + "version": "3.360.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.360.0.tgz", + "integrity": "sha512-czIpPt75fS3gH3vgFz76+WTaKcvPxC/DnPuqVyHdihMmP0UuwGPU9jn+Xx9RdUw7Yay3+rJRe3AYgBn4Xb220g==", "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/config-resolver": "3.347.0", - "@aws-sdk/fetch-http-handler": "3.347.0", - "@aws-sdk/hash-node": "3.347.0", - "@aws-sdk/invalid-dependency": "3.347.0", - "@aws-sdk/middleware-content-length": "3.347.0", - "@aws-sdk/middleware-endpoint": "3.347.0", - "@aws-sdk/middleware-host-header": "3.347.0", - "@aws-sdk/middleware-logger": "3.347.0", - "@aws-sdk/middleware-recursion-detection": "3.347.0", - "@aws-sdk/middleware-retry": "3.347.0", - "@aws-sdk/middleware-serde": "3.347.0", - "@aws-sdk/middleware-stack": "3.347.0", - "@aws-sdk/middleware-user-agent": "3.347.0", - "@aws-sdk/node-config-provider": "3.347.0", - "@aws-sdk/node-http-handler": "3.350.0", - "@aws-sdk/smithy-client": "3.347.0", - "@aws-sdk/types": "3.347.0", - "@aws-sdk/url-parser": "3.347.0", + "@aws-sdk/config-resolver": "3.357.0", + "@aws-sdk/fetch-http-handler": "3.357.0", + "@aws-sdk/hash-node": "3.357.0", + "@aws-sdk/invalid-dependency": "3.357.0", + "@aws-sdk/middleware-content-length": "3.357.0", + "@aws-sdk/middleware-endpoint": "3.357.0", + "@aws-sdk/middleware-host-header": "3.357.0", + "@aws-sdk/middleware-logger": "3.357.0", + "@aws-sdk/middleware-recursion-detection": "3.357.0", + "@aws-sdk/middleware-retry": "3.357.0", + "@aws-sdk/middleware-serde": "3.357.0", + "@aws-sdk/middleware-stack": "3.357.0", + "@aws-sdk/middleware-user-agent": "3.357.0", + "@aws-sdk/node-config-provider": "3.357.0", + "@aws-sdk/node-http-handler": "3.360.0", + "@aws-sdk/smithy-client": "3.360.0", + "@aws-sdk/types": "3.357.0", + "@aws-sdk/url-parser": "3.357.0", "@aws-sdk/util-base64": "3.310.0", "@aws-sdk/util-body-length-browser": "3.310.0", "@aws-sdk/util-body-length-node": "3.310.0", - "@aws-sdk/util-defaults-mode-browser": "3.347.0", - "@aws-sdk/util-defaults-mode-node": "3.347.0", - "@aws-sdk/util-endpoints": "3.347.0", - "@aws-sdk/util-retry": "3.347.0", - "@aws-sdk/util-user-agent-browser": "3.347.0", - "@aws-sdk/util-user-agent-node": "3.347.0", + "@aws-sdk/util-defaults-mode-browser": "3.360.0", + "@aws-sdk/util-defaults-mode-node": "3.360.0", + "@aws-sdk/util-endpoints": "3.357.0", + "@aws-sdk/util-retry": "3.357.0", + "@aws-sdk/util-user-agent-browser": "3.357.0", + "@aws-sdk/util-user-agent-node": "3.357.0", "@aws-sdk/util-utf8": "3.310.0", "@smithy/protocol-http": "^1.0.1", "@smithy/types": "^1.0.0", @@ -884,46 +1079,46 @@ } }, "node_modules/@aws-sdk/client-sts": { - "version": "3.350.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.350.0.tgz", - "integrity": "sha512-s8RsJ6upWQgeUt8GdV3j3ZeTS7BQXedk77RhZ7wzvVwAjO9wow4uS7Iyic4kS3Y/6d26s0MO2vP4bR6HW6U6ZQ==", + "version": "3.360.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.360.0.tgz", + "integrity": "sha512-ORRwSdwlSYGHfhQCXKtr1eJeTjI14l5IZRJbRDgXs46y4/GQj/rt/2Q6WGjVMfM1ZRRiEII2/vK7mU7IJcWkFw==", "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/config-resolver": "3.347.0", - "@aws-sdk/credential-provider-node": "3.350.0", - "@aws-sdk/fetch-http-handler": "3.347.0", - "@aws-sdk/hash-node": "3.347.0", - "@aws-sdk/invalid-dependency": "3.347.0", - "@aws-sdk/middleware-content-length": "3.347.0", - "@aws-sdk/middleware-endpoint": "3.347.0", - "@aws-sdk/middleware-host-header": "3.347.0", - "@aws-sdk/middleware-logger": "3.347.0", - "@aws-sdk/middleware-recursion-detection": "3.347.0", - "@aws-sdk/middleware-retry": "3.347.0", - "@aws-sdk/middleware-sdk-sts": "3.347.0", - "@aws-sdk/middleware-serde": "3.347.0", - "@aws-sdk/middleware-signing": "3.347.0", - "@aws-sdk/middleware-stack": "3.347.0", - "@aws-sdk/middleware-user-agent": "3.347.0", - "@aws-sdk/node-config-provider": "3.347.0", - "@aws-sdk/node-http-handler": "3.350.0", - "@aws-sdk/smithy-client": "3.347.0", - "@aws-sdk/types": "3.347.0", - "@aws-sdk/url-parser": "3.347.0", + "@aws-sdk/config-resolver": "3.357.0", + "@aws-sdk/credential-provider-node": "3.360.0", + "@aws-sdk/fetch-http-handler": "3.357.0", + "@aws-sdk/hash-node": "3.357.0", + "@aws-sdk/invalid-dependency": "3.357.0", + "@aws-sdk/middleware-content-length": "3.357.0", + "@aws-sdk/middleware-endpoint": "3.357.0", + "@aws-sdk/middleware-host-header": "3.357.0", + "@aws-sdk/middleware-logger": "3.357.0", + "@aws-sdk/middleware-recursion-detection": "3.357.0", + "@aws-sdk/middleware-retry": "3.357.0", + "@aws-sdk/middleware-sdk-sts": "3.357.0", + "@aws-sdk/middleware-serde": "3.357.0", + "@aws-sdk/middleware-signing": "3.357.0", + "@aws-sdk/middleware-stack": "3.357.0", + "@aws-sdk/middleware-user-agent": "3.357.0", + "@aws-sdk/node-config-provider": "3.357.0", + "@aws-sdk/node-http-handler": "3.360.0", + "@aws-sdk/smithy-client": "3.360.0", + "@aws-sdk/types": "3.357.0", + "@aws-sdk/url-parser": "3.357.0", "@aws-sdk/util-base64": "3.310.0", "@aws-sdk/util-body-length-browser": "3.310.0", "@aws-sdk/util-body-length-node": "3.310.0", - "@aws-sdk/util-defaults-mode-browser": "3.347.0", - "@aws-sdk/util-defaults-mode-node": "3.347.0", - "@aws-sdk/util-endpoints": "3.347.0", - "@aws-sdk/util-retry": "3.347.0", - "@aws-sdk/util-user-agent-browser": "3.347.0", - "@aws-sdk/util-user-agent-node": "3.347.0", + "@aws-sdk/util-defaults-mode-browser": "3.360.0", + "@aws-sdk/util-defaults-mode-node": "3.360.0", + "@aws-sdk/util-endpoints": "3.357.0", + "@aws-sdk/util-retry": "3.357.0", + "@aws-sdk/util-user-agent-browser": "3.357.0", + "@aws-sdk/util-user-agent-node": "3.357.0", "@aws-sdk/util-utf8": "3.310.0", "@smithy/protocol-http": "^1.0.1", "@smithy/types": "^1.0.0", - "fast-xml-parser": "4.2.4", + "fast-xml-parser": "4.2.5", "tslib": "^2.5.0" }, "engines": { @@ -931,43 +1126,43 @@ } }, "node_modules/@aws-sdk/client-xray": { - "version": "3.350.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-xray/-/client-xray-3.350.0.tgz", - "integrity": "sha512-dbkfSnjZtl+PXjBQ1POajXx4sYnElfPq9uXwlPrm0k+u7xVywRZyazHq6CQV4dKR2cSKxxfcHe1yjGEW+3YjDQ==", + "version": "3.360.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-xray/-/client-xray-3.360.0.tgz", + "integrity": "sha512-PGUb0oWkPEt1KzSEaHrbo8apStt0+3oXStJmAFGKfzLNvtYoEmz1iNzLjmwMgmRnoBYWCJELyM/luZzJr2LJfg==", "dev": true, "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/client-sts": "3.350.0", - "@aws-sdk/config-resolver": "3.347.0", - "@aws-sdk/credential-provider-node": "3.350.0", - "@aws-sdk/fetch-http-handler": "3.347.0", - "@aws-sdk/hash-node": "3.347.0", - "@aws-sdk/invalid-dependency": "3.347.0", - "@aws-sdk/middleware-content-length": "3.347.0", - "@aws-sdk/middleware-endpoint": "3.347.0", - "@aws-sdk/middleware-host-header": "3.347.0", - "@aws-sdk/middleware-logger": "3.347.0", - "@aws-sdk/middleware-recursion-detection": "3.347.0", - "@aws-sdk/middleware-retry": "3.347.0", - "@aws-sdk/middleware-serde": "3.347.0", - "@aws-sdk/middleware-signing": "3.347.0", - "@aws-sdk/middleware-stack": "3.347.0", - "@aws-sdk/middleware-user-agent": "3.347.0", - "@aws-sdk/node-config-provider": "3.347.0", - "@aws-sdk/node-http-handler": "3.350.0", - "@aws-sdk/smithy-client": "3.347.0", - "@aws-sdk/types": "3.347.0", - "@aws-sdk/url-parser": "3.347.0", + "@aws-sdk/client-sts": "3.360.0", + "@aws-sdk/config-resolver": "3.357.0", + "@aws-sdk/credential-provider-node": "3.360.0", + "@aws-sdk/fetch-http-handler": "3.357.0", + "@aws-sdk/hash-node": "3.357.0", + "@aws-sdk/invalid-dependency": "3.357.0", + "@aws-sdk/middleware-content-length": "3.357.0", + "@aws-sdk/middleware-endpoint": "3.357.0", + "@aws-sdk/middleware-host-header": "3.357.0", + "@aws-sdk/middleware-logger": "3.357.0", + "@aws-sdk/middleware-recursion-detection": "3.357.0", + "@aws-sdk/middleware-retry": "3.357.0", + "@aws-sdk/middleware-serde": "3.357.0", + "@aws-sdk/middleware-signing": "3.357.0", + "@aws-sdk/middleware-stack": "3.357.0", + "@aws-sdk/middleware-user-agent": "3.357.0", + "@aws-sdk/node-config-provider": "3.357.0", + "@aws-sdk/node-http-handler": "3.360.0", + "@aws-sdk/smithy-client": "3.360.0", + "@aws-sdk/types": "3.357.0", + "@aws-sdk/url-parser": "3.357.0", "@aws-sdk/util-base64": "3.310.0", "@aws-sdk/util-body-length-browser": "3.310.0", "@aws-sdk/util-body-length-node": "3.310.0", - "@aws-sdk/util-defaults-mode-browser": "3.347.0", - "@aws-sdk/util-defaults-mode-node": "3.347.0", - "@aws-sdk/util-endpoints": "3.347.0", - "@aws-sdk/util-retry": "3.347.0", - "@aws-sdk/util-user-agent-browser": "3.347.0", - "@aws-sdk/util-user-agent-node": "3.347.0", + "@aws-sdk/util-defaults-mode-browser": "3.360.0", + "@aws-sdk/util-defaults-mode-node": "3.360.0", + "@aws-sdk/util-endpoints": "3.357.0", + "@aws-sdk/util-retry": "3.357.0", + "@aws-sdk/util-user-agent-browser": "3.357.0", + "@aws-sdk/util-user-agent-node": "3.357.0", "@aws-sdk/util-utf8": "3.310.0", "@smithy/protocol-http": "^1.0.1", "@smithy/types": "^1.0.0", @@ -978,13 +1173,13 @@ } }, "node_modules/@aws-sdk/config-resolver": { - "version": "3.347.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/config-resolver/-/config-resolver-3.347.0.tgz", - "integrity": "sha512-2ja+Sf/VnUO7IQ3nKbDQ5aumYKKJUaTm/BuVJ29wNho8wYHfuf7wHZV0pDTkB8RF5SH7IpHap7zpZAj39Iq+EA==", + "version": "3.357.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/config-resolver/-/config-resolver-3.357.0.tgz", + "integrity": "sha512-cukfg0nX7Tzx/xFyH5F4Eyb8DA1ITCGtSQv4vnEjgUop+bkzckuGLKEeBcBhyZY+aw+2C9CVwIHwIMhRm0ul5w==", "dependencies": { - "@aws-sdk/types": "3.347.0", + "@aws-sdk/types": "3.357.0", "@aws-sdk/util-config-provider": "3.310.0", - "@aws-sdk/util-middleware": "3.347.0", + "@aws-sdk/util-middleware": "3.357.0", "tslib": "^2.5.0" }, "engines": { @@ -992,12 +1187,12 @@ } }, "node_modules/@aws-sdk/credential-provider-env": { - "version": "3.347.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.347.0.tgz", - "integrity": "sha512-UnEM+LKGpXKzw/1WvYEQsC6Wj9PupYZdQOE+e2Dgy2dqk/pVFy4WueRtFXYDT2B41ppv3drdXUuKZRIDVqIgNQ==", + "version": "3.357.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.357.0.tgz", + "integrity": "sha512-UOecwfqvXgJVqhfWSZ2S44v2Nq2oceW0PQVQp0JAa9opc2rxSVIfyOhPr0yMoPmpyNcP22rgeg6ce70KULYwiA==", "dependencies": { - "@aws-sdk/property-provider": "3.347.0", - "@aws-sdk/types": "3.347.0", + "@aws-sdk/property-provider": "3.357.0", + "@aws-sdk/types": "3.357.0", "tslib": "^2.5.0" }, "engines": { @@ -1005,14 +1200,14 @@ } }, "node_modules/@aws-sdk/credential-provider-imds": { - "version": "3.347.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-imds/-/credential-provider-imds-3.347.0.tgz", - "integrity": "sha512-7scCy/DCDRLIhlqTxff97LQWDnRwRXji3bxxMg+xWOTTaJe7PWx+etGSbBWaL42vsBHFShQjSLvJryEgoBktpw==", - "dependencies": { - "@aws-sdk/node-config-provider": "3.347.0", - "@aws-sdk/property-provider": "3.347.0", - "@aws-sdk/types": "3.347.0", - "@aws-sdk/url-parser": "3.347.0", + "version": "3.357.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-imds/-/credential-provider-imds-3.357.0.tgz", + "integrity": "sha512-upw/bfsl7/WydT6gM0lBuR4Ipp4fzYm/E3ObFr0Mg5OkgVPt5ZJE+eeFTvwCpDdBSTKs4JfrK6/iEK8A23Q1jQ==", + "dependencies": { + "@aws-sdk/node-config-provider": "3.357.0", + "@aws-sdk/property-provider": "3.357.0", + "@aws-sdk/types": "3.357.0", + "@aws-sdk/url-parser": "3.357.0", "tslib": "^2.5.0" }, "engines": { @@ -1020,18 +1215,18 @@ } }, "node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.350.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.350.0.tgz", - "integrity": "sha512-mGGU0PpnG0VDNKSuGi083U1egjprrU9/XoRtgf+iYvAKXRR/0XA4pGW5c7zpHY7m4iLhBuRj6N4oxQsH9cMtWg==", - "dependencies": { - "@aws-sdk/credential-provider-env": "3.347.0", - "@aws-sdk/credential-provider-imds": "3.347.0", - "@aws-sdk/credential-provider-process": "3.347.0", - "@aws-sdk/credential-provider-sso": "3.350.0", - "@aws-sdk/credential-provider-web-identity": "3.347.0", - "@aws-sdk/property-provider": "3.347.0", - "@aws-sdk/shared-ini-file-loader": "3.347.0", - "@aws-sdk/types": "3.347.0", + "version": "3.360.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.360.0.tgz", + "integrity": "sha512-pWuLTq+yjSFssPGhDJ8oxvZsu7/F1KissGRt65G4qrfxHhoiMRcLF1GtFJueDQpitZ1i3mZXHVn/OSv4LPQ1Lw==", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.357.0", + "@aws-sdk/credential-provider-imds": "3.357.0", + "@aws-sdk/credential-provider-process": "3.357.0", + "@aws-sdk/credential-provider-sso": "3.360.0", + "@aws-sdk/credential-provider-web-identity": "3.357.0", + "@aws-sdk/property-provider": "3.357.0", + "@aws-sdk/shared-ini-file-loader": "3.357.0", + "@aws-sdk/types": "3.357.0", "tslib": "^2.5.0" }, "engines": { @@ -1039,19 +1234,19 @@ } }, "node_modules/@aws-sdk/credential-provider-node": { - "version": "3.350.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.350.0.tgz", - "integrity": "sha512-xmqwCFwj/CZPx6AKHNb24Kpr0eHW9VISt9r+SfgH8PaYg5cNyX1pKmMbQCket5ov+WvHEQtOK7aBafak7dhauA==", - "dependencies": { - "@aws-sdk/credential-provider-env": "3.347.0", - "@aws-sdk/credential-provider-imds": "3.347.0", - "@aws-sdk/credential-provider-ini": "3.350.0", - "@aws-sdk/credential-provider-process": "3.347.0", - "@aws-sdk/credential-provider-sso": "3.350.0", - "@aws-sdk/credential-provider-web-identity": "3.347.0", - "@aws-sdk/property-provider": "3.347.0", - "@aws-sdk/shared-ini-file-loader": "3.347.0", - "@aws-sdk/types": "3.347.0", + "version": "3.360.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.360.0.tgz", + "integrity": "sha512-j4Lu5vXkdzz/L6fGKKxnL0vcwAGHlwFHjTg9nRagMn1lvaVjtktXeM30duHTBQq9i+ejdFxpVNWYrmHGaWPNdg==", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.357.0", + "@aws-sdk/credential-provider-imds": "3.357.0", + "@aws-sdk/credential-provider-ini": "3.360.0", + "@aws-sdk/credential-provider-process": "3.357.0", + "@aws-sdk/credential-provider-sso": "3.360.0", + "@aws-sdk/credential-provider-web-identity": "3.357.0", + "@aws-sdk/property-provider": "3.357.0", + "@aws-sdk/shared-ini-file-loader": "3.357.0", + "@aws-sdk/types": "3.357.0", "tslib": "^2.5.0" }, "engines": { @@ -1059,13 +1254,13 @@ } }, "node_modules/@aws-sdk/credential-provider-process": { - "version": "3.347.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.347.0.tgz", - "integrity": "sha512-yl1z4MsaBdXd4GQ2halIvYds23S67kElyOwz7g8kaQ4kHj+UoYWxz3JVW/DGusM6XmQ9/F67utBrUVA0uhQYyw==", + "version": "3.357.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.357.0.tgz", + "integrity": "sha512-qFWWilFPsc2hR7O0KIhwcE78w+pVIK+uQR6MQMfdRyxUndgiuCorJwVjedc3yZtmnoELHF34j+m8whTBXv9E7Q==", "dependencies": { - "@aws-sdk/property-provider": "3.347.0", - "@aws-sdk/shared-ini-file-loader": "3.347.0", - "@aws-sdk/types": "3.347.0", + "@aws-sdk/property-provider": "3.357.0", + "@aws-sdk/shared-ini-file-loader": "3.357.0", + "@aws-sdk/types": "3.357.0", "tslib": "^2.5.0" }, "engines": { @@ -1073,15 +1268,15 @@ } }, "node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.350.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.350.0.tgz", - "integrity": "sha512-u/3kv+PJeVawzBtWBei+IX1/z50mwhpPe3VrKSTns4CPUw8b5sqIYWkAaw5hxm0td69+xcL98RzIJsEpJc4QSQ==", - "dependencies": { - "@aws-sdk/client-sso": "3.350.0", - "@aws-sdk/property-provider": "3.347.0", - "@aws-sdk/shared-ini-file-loader": "3.347.0", - "@aws-sdk/token-providers": "3.350.0", - "@aws-sdk/types": "3.347.0", + "version": "3.360.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.360.0.tgz", + "integrity": "sha512-kW0FR8AbMQrJxADxIqYSjHVN2RXwHmA5DzogYm1AjOkYRMN9JHDVOMQP2K2M6FCynZqTYsKW5lzjPOjS0fu8Dw==", + "dependencies": { + "@aws-sdk/client-sso": "3.360.0", + "@aws-sdk/property-provider": "3.357.0", + "@aws-sdk/shared-ini-file-loader": "3.357.0", + "@aws-sdk/token-providers": "3.360.0", + "@aws-sdk/types": "3.357.0", "tslib": "^2.5.0" }, "engines": { @@ -1089,12 +1284,12 @@ } }, "node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.347.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.347.0.tgz", - "integrity": "sha512-DxoTlVK8lXjS1zVphtz/Ab+jkN/IZor9d6pP2GjJHNoAIIzXfRwwj5C8vr4eTayx/5VJ7GRP91J8GJ2cKly8Qw==", + "version": "3.357.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.357.0.tgz", + "integrity": "sha512-0KRRAFrXy5HJe2vqnCWCoCS+fQw7IoIj3KQsuURJMW4F+ifisxCgEsh3brJ2LQlN4ElWTRJhlrDHNZ/pd61D4w==", "dependencies": { - "@aws-sdk/property-provider": "3.347.0", - "@aws-sdk/types": "3.347.0", + "@aws-sdk/property-provider": "3.357.0", + "@aws-sdk/types": "3.357.0", "tslib": "^2.5.0" }, "engines": { @@ -1114,24 +1309,24 @@ } }, "node_modules/@aws-sdk/eventstream-codec": { - "version": "3.347.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-codec/-/eventstream-codec-3.347.0.tgz", - "integrity": "sha512-61q+SyspjsaQ4sdgjizMyRgVph2CiW4aAtfpoH69EJFJfTxTR/OqnZ9Jx/3YiYi0ksrvDenJddYodfWWJqD8/w==", + "version": "3.357.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-codec/-/eventstream-codec-3.357.0.tgz", + "integrity": "sha512-bqenTHG6GH6aCk/Il+ooWXVVAZuc8lOgVEy9bE2hI49oVqT8zSuXxQB+w1WWyZoAOPcelsjayB1wfPub8VDBxQ==", "dependencies": { "@aws-crypto/crc32": "3.0.0", - "@aws-sdk/types": "3.347.0", + "@aws-sdk/types": "3.357.0", "@aws-sdk/util-hex-encoding": "3.310.0", "tslib": "^2.5.0" } }, "node_modules/@aws-sdk/eventstream-serde-browser": { - "version": "3.347.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-serde-browser/-/eventstream-serde-browser-3.347.0.tgz", - "integrity": "sha512-9BLVTHWgpiTo/hl+k7qt7E9iYu43zVwJN+4TEwA9ZZB3p12068t1Hay6HgCcgJC3+LWMtw/OhvypV6vQAG4UBg==", + "version": "3.357.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-serde-browser/-/eventstream-serde-browser-3.357.0.tgz", + "integrity": "sha512-hBabtmwuspVHGSKnUccDiSIbg+IVoBThx6wYt6i4edbWAITHF3ADVKXy7icV400CAyG0XTZgxjE6FKpiDxj9rQ==", "dev": true, "dependencies": { - "@aws-sdk/eventstream-serde-universal": "3.347.0", - "@aws-sdk/types": "3.347.0", + "@aws-sdk/eventstream-serde-universal": "3.357.0", + "@aws-sdk/types": "3.357.0", "tslib": "^2.5.0" }, "engines": { @@ -1139,12 +1334,12 @@ } }, "node_modules/@aws-sdk/eventstream-serde-config-resolver": { - "version": "3.347.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-3.347.0.tgz", - "integrity": "sha512-RcXQbNVq0PFmDqfn6+MnjCUWbbobcYVxpimaF6pMDav04o6Mcle+G2Hrefp5NlFr/lZbHW2eUKYsp1sXPaxVlQ==", + "version": "3.357.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-3.357.0.tgz", + "integrity": "sha512-E6rwk+1KFXhKmJ+v7JW5Uyyda1yN5XRVupCnCrtFsHFmhVGQxFacoUZIee3bfuCpC58dLSyESggxGpUd3XOSsw==", "dev": true, "dependencies": { - "@aws-sdk/types": "3.347.0", + "@aws-sdk/types": "3.357.0", "tslib": "^2.5.0" }, "engines": { @@ -1152,13 +1347,13 @@ } }, "node_modules/@aws-sdk/eventstream-serde-node": { - "version": "3.347.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-serde-node/-/eventstream-serde-node-3.347.0.tgz", - "integrity": "sha512-pgQCWH0PkHjcHs04JE7FoGAD3Ww45ffV8Op0MSLUhg9OpGa6EDoO3EOpWi9l/TALtH4f0KRV35PVyUyHJ/wEkA==", + "version": "3.357.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-serde-node/-/eventstream-serde-node-3.357.0.tgz", + "integrity": "sha512-boXDy+JWcPfHc9OIKV6I4Bh2XrLcg+eac+/LldNZFcDIB33/gHIM2CJw8u565Iebdz1NKEkP/QPPZbk2y+abPA==", "dev": true, "dependencies": { - "@aws-sdk/eventstream-serde-universal": "3.347.0", - "@aws-sdk/types": "3.347.0", + "@aws-sdk/eventstream-serde-universal": "3.357.0", + "@aws-sdk/types": "3.357.0", "tslib": "^2.5.0" }, "engines": { @@ -1166,13 +1361,13 @@ } }, "node_modules/@aws-sdk/eventstream-serde-universal": { - "version": "3.347.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-serde-universal/-/eventstream-serde-universal-3.347.0.tgz", - "integrity": "sha512-4wWj6bz6lOyDIO/dCCjwaLwRz648xzQQnf89R29sLoEqvAPP5XOB7HL+uFaQ/f5tPNh49gL6huNFSVwDm62n4Q==", + "version": "3.357.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/eventstream-serde-universal/-/eventstream-serde-universal-3.357.0.tgz", + "integrity": "sha512-9/Wcdxx38XQAturqOAGYNCaLOzFVnW+xwxd4af9eNOfZfZ5PP5PRKBIpvKDsN26e3l4f3GodHx7MS1WB7BBc2w==", "dev": true, "dependencies": { - "@aws-sdk/eventstream-codec": "3.347.0", - "@aws-sdk/types": "3.347.0", + "@aws-sdk/eventstream-codec": "3.357.0", + "@aws-sdk/types": "3.357.0", "tslib": "^2.5.0" }, "engines": { @@ -1180,23 +1375,23 @@ } }, "node_modules/@aws-sdk/fetch-http-handler": { - "version": "3.347.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/fetch-http-handler/-/fetch-http-handler-3.347.0.tgz", - "integrity": "sha512-sQ5P7ivY8//7wdxfA76LT1sF6V2Tyyz1qF6xXf9sihPN5Q1Y65c+SKpMzXyFSPqWZ82+SQQuDliYZouVyS6kQQ==", + "version": "3.357.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/fetch-http-handler/-/fetch-http-handler-3.357.0.tgz", + "integrity": "sha512-5sPloTO8y8fAnS/6/Sfp/aVoL9zuhzkLdWBORNzMazdynVNEzWKWCPZ27RQpgkaCDHiXjqUY4kfuFXAGkvFfDQ==", "dependencies": { - "@aws-sdk/protocol-http": "3.347.0", - "@aws-sdk/querystring-builder": "3.347.0", - "@aws-sdk/types": "3.347.0", + "@aws-sdk/protocol-http": "3.357.0", + "@aws-sdk/querystring-builder": "3.357.0", + "@aws-sdk/types": "3.357.0", "@aws-sdk/util-base64": "3.310.0", "tslib": "^2.5.0" } }, "node_modules/@aws-sdk/hash-node": { - "version": "3.347.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/hash-node/-/hash-node-3.347.0.tgz", - "integrity": "sha512-96+ml/4EaUaVpzBdOLGOxdoXOjkPgkoJp/0i1fxOJEvl8wdAQSwc3IugVK9wZkCxy2DlENtgOe6DfIOhfffm/g==", + "version": "3.357.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/hash-node/-/hash-node-3.357.0.tgz", + "integrity": "sha512-fq3LS9AxHKb7dTZkm6iM1TrGk6XOTZz96iEZPME1+vjiSEXGWuebHt87q92n+KozVGRypn9MId3lHOPBBjygNQ==", "dependencies": { - "@aws-sdk/types": "3.347.0", + "@aws-sdk/types": "3.357.0", "@aws-sdk/util-buffer-from": "3.310.0", "@aws-sdk/util-utf8": "3.310.0", "tslib": "^2.5.0" @@ -1229,11 +1424,11 @@ } }, "node_modules/@aws-sdk/invalid-dependency": { - "version": "3.347.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/invalid-dependency/-/invalid-dependency-3.347.0.tgz", - "integrity": "sha512-8imQcwLwqZ/wTJXZqzXT9pGLIksTRckhGLZaXT60tiBOPKuerTsus2L59UstLs5LP8TKaVZKFFSsjRIn9dQdmQ==", + "version": "3.357.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/invalid-dependency/-/invalid-dependency-3.357.0.tgz", + "integrity": "sha512-HnCYZczf0VdyxMVMMxmA3QJAyyPSFbcMtZzgKbxVTWTG7GKpQe0psWZu/7O2Nk31mKg6vEUdiP1FylqLBsgMOA==", "dependencies": { - "@aws-sdk/types": "3.347.0", + "@aws-sdk/types": "3.357.0", "tslib": "^2.5.0" } }, @@ -1248,11 +1443,12 @@ } }, "node_modules/@aws-sdk/lib-dynamodb": { - "version": "3.235.0", - "license": "Apache-2.0", + "version": "3.360.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/lib-dynamodb/-/lib-dynamodb-3.360.0.tgz", + "integrity": "sha512-OBbagM2zx+T2csfFU9ZaK7qMR9LDFVqUwIIsIfu6GsR0gSqzGmozOycW8S1HPPvxOvHUh8ObJT4F2/KSc7pjpg==", "dependencies": { - "@aws-sdk/util-dynamodb": "3.235.0", - "tslib": "^2.3.1" + "@aws-sdk/util-dynamodb": "3.360.0", + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" @@ -1264,12 +1460,12 @@ } }, "node_modules/@aws-sdk/middleware-content-length": { - "version": "3.347.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-content-length/-/middleware-content-length-3.347.0.tgz", - "integrity": "sha512-i4qtWTDImMaDUtwKQPbaZpXsReiwiBomM1cWymCU4bhz81HL01oIxOxOBuiM+3NlDoCSPr3KI6txZSz/8cqXCQ==", + "version": "3.357.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-content-length/-/middleware-content-length-3.357.0.tgz", + "integrity": "sha512-zQOFEyzOXAgN4M54tYNWGxKxnyzY0WwYDTFzh9riJRmxN1hTEKHUKmze4nILIf5rkQmOG4kTf1qmfazjkvZAhw==", "dependencies": { - "@aws-sdk/protocol-http": "3.347.0", - "@aws-sdk/types": "3.347.0", + "@aws-sdk/protocol-http": "3.357.0", + "@aws-sdk/types": "3.357.0", "tslib": "^2.5.0" }, "engines": { @@ -1277,14 +1473,14 @@ } }, "node_modules/@aws-sdk/middleware-endpoint": { - "version": "3.347.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-endpoint/-/middleware-endpoint-3.347.0.tgz", - "integrity": "sha512-unF0c6dMaUL1ffU+37Ugty43DgMnzPWXr/Jup/8GbK5fzzWT5NQq6dj9KHPubMbWeEjQbmczvhv25JuJdK8gNQ==", - "dependencies": { - "@aws-sdk/middleware-serde": "3.347.0", - "@aws-sdk/types": "3.347.0", - "@aws-sdk/url-parser": "3.347.0", - "@aws-sdk/util-middleware": "3.347.0", + "version": "3.357.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-endpoint/-/middleware-endpoint-3.357.0.tgz", + "integrity": "sha512-ScJi0SL8X/Lyi0Fp5blg0QN/Z6PoRwV/ZJXd8dQkXSznkbSvJHfqPP0xk/w3GcQ1TKsu5YEPfeYy8ejcq+7Pgg==", + "dependencies": { + "@aws-sdk/middleware-serde": "3.357.0", + "@aws-sdk/types": "3.357.0", + "@aws-sdk/url-parser": "3.357.0", + "@aws-sdk/util-middleware": "3.357.0", "tslib": "^2.5.0" }, "engines": { @@ -1292,13 +1488,13 @@ } }, "node_modules/@aws-sdk/middleware-endpoint-discovery": { - "version": "3.347.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-endpoint-discovery/-/middleware-endpoint-discovery-3.347.0.tgz", - "integrity": "sha512-QmsZA2JoOjyoSPEZMb8WW8pD0ljK+/wFDsA1JcS4jJfzM5UOM7dpClBZ7WLI4eBZWGDHrcRMFIDyPF51LjHpug==", + "version": "3.357.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-endpoint-discovery/-/middleware-endpoint-discovery-3.357.0.tgz", + "integrity": "sha512-oWv3Js/iEMQb0Ob3bHQs7P2Z2Fwg1fNiKYEX4ScsavX6wPD2Y8/LKgrovgt0PreW+UHuuILSKccLBT3/fWiPBw==", "dependencies": { "@aws-sdk/endpoint-cache": "3.310.0", - "@aws-sdk/protocol-http": "3.347.0", - "@aws-sdk/types": "3.347.0", + "@aws-sdk/protocol-http": "3.357.0", + "@aws-sdk/types": "3.357.0", "tslib": "^2.5.0" }, "engines": { @@ -1306,12 +1502,12 @@ } }, "node_modules/@aws-sdk/middleware-host-header": { - "version": "3.347.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.347.0.tgz", - "integrity": "sha512-kpKmR9OvMlnReqp5sKcJkozbj1wmlblbVSbnQAIkzeQj2xD5dnVR3Nn2ogQKxSmU1Fv7dEroBtrruJ1o3fY38A==", + "version": "3.357.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.357.0.tgz", + "integrity": "sha512-HuGLcP7JP1qJ5wGT9GSlEknDaTSnOzHY4T6IPFuvFjAy3PvY5siQNm6+VRqdVS+n6/kzpL3JP5sAVM3aoxHT6Q==", "dependencies": { - "@aws-sdk/protocol-http": "3.347.0", - "@aws-sdk/types": "3.347.0", + "@aws-sdk/protocol-http": "3.357.0", + "@aws-sdk/types": "3.357.0", "tslib": "^2.5.0" }, "engines": { @@ -1319,11 +1515,11 @@ } }, "node_modules/@aws-sdk/middleware-logger": { - "version": "3.347.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.347.0.tgz", - "integrity": "sha512-NYC+Id5UCkVn+3P1t/YtmHt75uED06vwaKyxDy0UmB2K66PZLVtwWbLpVWrhbroaw1bvUHYcRyQ9NIfnVcXQjA==", + "version": "3.357.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.357.0.tgz", + "integrity": "sha512-dncT3tr+lZ9+duZo52rASgO6AKVwRcsc2/T93gmaYVrJqI6WWAwQ7yML5s72l9ZjQ5LZ+4jjrgtlufavAS0eCg==", "dependencies": { - "@aws-sdk/types": "3.347.0", + "@aws-sdk/types": "3.357.0", "tslib": "^2.5.0" }, "engines": { @@ -1331,12 +1527,12 @@ } }, "node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.347.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.347.0.tgz", - "integrity": "sha512-qfnSvkFKCAMjMHR31NdsT0gv5Sq/ZHTUD4yQsSLpbVQ6iYAS834lrzXt41iyEHt57Y514uG7F/Xfvude3u4icQ==", + "version": "3.357.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.357.0.tgz", + "integrity": "sha512-AXC54IeDS3jC1dbbkYHML4STvBPcKZ4IJTWdjEK1RCOgqXd0Ze1cE1e21wyj1tM6prF03zLyvpBd+3TS++nqfA==", "dependencies": { - "@aws-sdk/protocol-http": "3.347.0", - "@aws-sdk/types": "3.347.0", + "@aws-sdk/protocol-http": "3.357.0", + "@aws-sdk/types": "3.357.0", "tslib": "^2.5.0" }, "engines": { @@ -1344,15 +1540,15 @@ } }, "node_modules/@aws-sdk/middleware-retry": { - "version": "3.347.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-retry/-/middleware-retry-3.347.0.tgz", - "integrity": "sha512-CpdM+8dCSbX96agy4FCzOfzDmhNnGBM/pxrgIVLm5nkYTLuXp/d7ubpFEUHULr+4hCd5wakHotMt7yO29NFaVw==", - "dependencies": { - "@aws-sdk/protocol-http": "3.347.0", - "@aws-sdk/service-error-classification": "3.347.0", - "@aws-sdk/types": "3.347.0", - "@aws-sdk/util-middleware": "3.347.0", - "@aws-sdk/util-retry": "3.347.0", + "version": "3.357.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-retry/-/middleware-retry-3.357.0.tgz", + "integrity": "sha512-ZCbXCYv3nglQqwREYxxpclrnR9MYPAnHlLcC8e9PbApqxGnaZdhoywxoqbgqT3hf/RM7kput4vEHDl1fyymcRQ==", + "dependencies": { + "@aws-sdk/protocol-http": "3.357.0", + "@aws-sdk/service-error-classification": "3.357.0", + "@aws-sdk/types": "3.357.0", + "@aws-sdk/util-middleware": "3.357.0", + "@aws-sdk/util-retry": "3.357.0", "tslib": "^2.5.0", "uuid": "^8.3.2" }, @@ -1369,12 +1565,12 @@ } }, "node_modules/@aws-sdk/middleware-sdk-sts": { - "version": "3.347.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.347.0.tgz", - "integrity": "sha512-38LJ0bkIoVF3W97x6Jyyou72YV9Cfbml4OaDEdnrCOo0EssNZM5d7RhjMvQDwww7/3OBY/BzeOcZKfJlkYUXGw==", + "version": "3.357.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.357.0.tgz", + "integrity": "sha512-Ng2VjLrPiL02QOcs1qs9jG2boO4Gn+v3VIbOJLG4zXcfbSq55iIWtlmr2ljfw9vP5aLhWtcODfmKHS5Bp+019Q==", "dependencies": { - "@aws-sdk/middleware-signing": "3.347.0", - "@aws-sdk/types": "3.347.0", + "@aws-sdk/middleware-signing": "3.357.0", + "@aws-sdk/types": "3.357.0", "tslib": "^2.5.0" }, "engines": { @@ -1382,11 +1578,11 @@ } }, "node_modules/@aws-sdk/middleware-serde": { - "version": "3.347.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-serde/-/middleware-serde-3.347.0.tgz", - "integrity": "sha512-x5Foi7jRbVJXDu9bHfyCbhYDH5pKK+31MmsSJ3k8rY8keXLBxm2XEEg/AIoV9/TUF9EeVvZ7F1/RmMpJnWQsEg==", + "version": "3.357.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-serde/-/middleware-serde-3.357.0.tgz", + "integrity": "sha512-bGI4kYuuEsFjlANbyJLyy4AovETnyf/SukgLOG7Qjbua+ZGuzvRhMsk21mBKKGrnsTO4PmtieJo6xClThGAN8g==", "dependencies": { - "@aws-sdk/types": "3.347.0", + "@aws-sdk/types": "3.357.0", "tslib": "^2.5.0" }, "engines": { @@ -1394,15 +1590,15 @@ } }, "node_modules/@aws-sdk/middleware-signing": { - "version": "3.347.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.347.0.tgz", - "integrity": "sha512-zVBF/4MGKnvhAE/J+oAL/VAehiyv+trs2dqSQXwHou9j8eA8Vm8HS2NdOwpkZQchIxTuwFlqSusDuPEdYFbvGw==", - "dependencies": { - "@aws-sdk/property-provider": "3.347.0", - "@aws-sdk/protocol-http": "3.347.0", - "@aws-sdk/signature-v4": "3.347.0", - "@aws-sdk/types": "3.347.0", - "@aws-sdk/util-middleware": "3.347.0", + "version": "3.357.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-signing/-/middleware-signing-3.357.0.tgz", + "integrity": "sha512-yB9ewEqI6Fw1OrmKFrUypbCqN5ijk06UGPochybamMuPxxkwMT3bnrm7eezsCA+TZbJyKhpffpyobwuv+xGNrA==", + "dependencies": { + "@aws-sdk/property-provider": "3.357.0", + "@aws-sdk/protocol-http": "3.357.0", + "@aws-sdk/signature-v4": "3.357.0", + "@aws-sdk/types": "3.357.0", + "@aws-sdk/util-middleware": "3.357.0", "tslib": "^2.5.0" }, "engines": { @@ -1410,9 +1606,9 @@ } }, "node_modules/@aws-sdk/middleware-stack": { - "version": "3.347.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-stack/-/middleware-stack-3.347.0.tgz", - "integrity": "sha512-Izidg4rqtYMcKuvn2UzgEpPLSmyd8ub9+LQ2oIzG3mpIzCBITq7wp40jN1iNkMg+X6KEnX9vdMJIYZsPYMCYuQ==", + "version": "3.357.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-stack/-/middleware-stack-3.357.0.tgz", + "integrity": "sha512-nNV+jfwGwmbOGZujAY/U8AW3EbVlxa9DJDLz3TPp/39o6Vu5KEzHJyDDNreo2k9V/TMvV+nOzHafufgPdagv7w==", "dependencies": { "tslib": "^2.5.0" }, @@ -1421,13 +1617,13 @@ } }, "node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.347.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.347.0.tgz", - "integrity": "sha512-wJbGN3OE1/daVCrwk49whhIr9E0j1N4gWwN/wi4WuyYIA+5lMUfVp0aGIOvZR+878DxuFz2hQ4XcZVT4K2WvQw==", + "version": "3.357.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.357.0.tgz", + "integrity": "sha512-M/CsAXjGblZS4rEbMb0Dn9IXbfq4EjVaTHBfvuILU/dKRppWvjnm2lRtqCZ+LIT3ATbAjA3/dY7dWsjxQWwijA==", "dependencies": { - "@aws-sdk/protocol-http": "3.347.0", - "@aws-sdk/types": "3.347.0", - "@aws-sdk/util-endpoints": "3.347.0", + "@aws-sdk/protocol-http": "3.357.0", + "@aws-sdk/types": "3.357.0", + "@aws-sdk/util-endpoints": "3.357.0", "tslib": "^2.5.0" }, "engines": { @@ -1435,13 +1631,13 @@ } }, "node_modules/@aws-sdk/node-config-provider": { - "version": "3.347.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/node-config-provider/-/node-config-provider-3.347.0.tgz", - "integrity": "sha512-faU93d3+5uTTUcotGgMXF+sJVFjrKh+ufW+CzYKT4yUHammyaIab/IbTPWy2hIolcEGtuPeVoxXw8TXbkh/tuw==", + "version": "3.357.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/node-config-provider/-/node-config-provider-3.357.0.tgz", + "integrity": "sha512-kwBIzKCaW3UWqLdELhy7TcN8itNMOjbzga530nalFILMvn2IxrkdKQhNgxGBXy6QK6kCOtH6OmcrG3/oZkLwig==", "dependencies": { - "@aws-sdk/property-provider": "3.347.0", - "@aws-sdk/shared-ini-file-loader": "3.347.0", - "@aws-sdk/types": "3.347.0", + "@aws-sdk/property-provider": "3.357.0", + "@aws-sdk/shared-ini-file-loader": "3.357.0", + "@aws-sdk/types": "3.357.0", "tslib": "^2.5.0" }, "engines": { @@ -1449,14 +1645,14 @@ } }, "node_modules/@aws-sdk/node-http-handler": { - "version": "3.350.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/node-http-handler/-/node-http-handler-3.350.0.tgz", - "integrity": "sha512-oD96GAlmpzYilCdC8wwyURM5lNfNHZCjm/kxBkQulHKa2kRbIrnD9GfDqdCkWA5cTpjh1NzGLT4D6e6UFDjt9w==", - "dependencies": { - "@aws-sdk/abort-controller": "3.347.0", - "@aws-sdk/protocol-http": "3.347.0", - "@aws-sdk/querystring-builder": "3.347.0", - "@aws-sdk/types": "3.347.0", + "version": "3.360.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/node-http-handler/-/node-http-handler-3.360.0.tgz", + "integrity": "sha512-oMsXdMmNwHpUbebETO44bq0N4SocEMGfPjYNUTRs8md7ita5fuFd2qFuvf+ZRt6iVcGWluIqmF8DidD+b7d+TA==", + "dependencies": { + "@aws-sdk/abort-controller": "3.357.0", + "@aws-sdk/protocol-http": "3.357.0", + "@aws-sdk/querystring-builder": "3.357.0", + "@aws-sdk/types": "3.357.0", "tslib": "^2.5.0" }, "engines": { @@ -1464,11 +1660,11 @@ } }, "node_modules/@aws-sdk/property-provider": { - "version": "3.347.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/property-provider/-/property-provider-3.347.0.tgz", - "integrity": "sha512-t3nJ8CYPLKAF2v9nIHOHOlF0CviQbTvbFc2L4a+A+EVd/rM4PzL3+3n8ZJsr0h7f6uD04+b5YRFgKgnaqLXlEg==", + "version": "3.357.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/property-provider/-/property-provider-3.357.0.tgz", + "integrity": "sha512-im4W0u8WaYxG7J7ko4Xl3OEzK3Mrm1Rz6/txTGe6hTIHlyUISu1ekOQJXK6XYPqNMn8v1G3BiQREoRXUEJFbHg==", "dependencies": { - "@aws-sdk/types": "3.347.0", + "@aws-sdk/types": "3.357.0", "tslib": "^2.5.0" }, "engines": { @@ -1476,11 +1672,11 @@ } }, "node_modules/@aws-sdk/protocol-http": { - "version": "3.347.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/protocol-http/-/protocol-http-3.347.0.tgz", - "integrity": "sha512-2YdBhc02Wvy03YjhGwUxF0UQgrPWEy8Iq75pfS42N+/0B/+eWX1aQgfjFxIpLg7YSjT5eKtYOQGlYd4MFTgj9g==", + "version": "3.357.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/protocol-http/-/protocol-http-3.357.0.tgz", + "integrity": "sha512-w1JHiI50VEea7duDeAspUiKJmmdIQblvRyjVMOqWA6FIQAyDVuEiPX7/MdQr0ScxhtRQxHbP0I4MFyl7ctRQvA==", "dependencies": { - "@aws-sdk/types": "3.347.0", + "@aws-sdk/types": "3.357.0", "tslib": "^2.5.0" }, "engines": { @@ -1488,11 +1684,11 @@ } }, "node_modules/@aws-sdk/querystring-builder": { - "version": "3.347.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-builder/-/querystring-builder-3.347.0.tgz", - "integrity": "sha512-phtKTe6FXoV02MoPkIVV6owXI8Mwr5IBN3bPoxhcPvJG2AjEmnetSIrhb8kwc4oNhlwfZwH6Jo5ARW/VEWbZtg==", + "version": "3.357.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-builder/-/querystring-builder-3.357.0.tgz", + "integrity": "sha512-aQcicqB6Y2cNaXPPwunz612a01SMiQQPsdz632F/3Lzn0ua82BJKobHOtaiTUlmVJ5Q4/EAeNfwZgL7tTUNtDQ==", "dependencies": { - "@aws-sdk/types": "3.347.0", + "@aws-sdk/types": "3.357.0", "@aws-sdk/util-uri-escape": "3.310.0", "tslib": "^2.5.0" }, @@ -1501,11 +1697,11 @@ } }, "node_modules/@aws-sdk/querystring-parser": { - "version": "3.347.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-parser/-/querystring-parser-3.347.0.tgz", - "integrity": "sha512-5VXOhfZz78T2W7SuXf2avfjKglx1VZgZgp9Zfhrt/Rq+MTu2D+PZc5zmJHhYigD7x83jLSLogpuInQpFMA9LgA==", + "version": "3.357.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/querystring-parser/-/querystring-parser-3.357.0.tgz", + "integrity": "sha512-Svvq+atRNP9s2VxiklcUNgCzmt3T5kfs7X2C+yjmxHvOQTPjLNaNGbfC/vhjOK7aoXw0h+lBac48r5ymx1PbQA==", "dependencies": { - "@aws-sdk/types": "3.347.0", + "@aws-sdk/types": "3.357.0", "tslib": "^2.5.0" }, "engines": { @@ -1513,19 +1709,19 @@ } }, "node_modules/@aws-sdk/service-error-classification": { - "version": "3.347.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/service-error-classification/-/service-error-classification-3.347.0.tgz", - "integrity": "sha512-xZ3MqSY81Oy2gh5g0fCtooAbahqh9VhsF8vcKjVX8+XPbGC8y+kej82+MsMg4gYL8gRFB9u4hgYbNgIS6JTAvg==", + "version": "3.357.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/service-error-classification/-/service-error-classification-3.357.0.tgz", + "integrity": "sha512-VuXeL4g5vKO9HjgCZlxmH8Uv1FcqUSjmbPpQkbNtYIDck6u0qzM0rG+n0/1EjyQbPSr3MhW/pkWs5nx2Nljlyg==", "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/shared-ini-file-loader": { - "version": "3.347.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-3.347.0.tgz", - "integrity": "sha512-Xw+zAZQVLb+xMNHChXQ29tzzLqm3AEHsD8JJnlkeFjeMnWQtXdUfOARl5s8NzAppcKQNlVe2gPzjaKjoy2jz1Q==", + "version": "3.357.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/shared-ini-file-loader/-/shared-ini-file-loader-3.357.0.tgz", + "integrity": "sha512-ceyqM4XxQe0Plb/oQAD2t1UOV2Iy4PFe1oAGM8dfJzYrRKu7zvMwru7/WaB3NYq+/mIY6RU+jjhRmjQ3GySVqA==", "dependencies": { - "@aws-sdk/types": "3.347.0", + "@aws-sdk/types": "3.357.0", "tslib": "^2.5.0" }, "engines": { @@ -1533,15 +1729,15 @@ } }, "node_modules/@aws-sdk/signature-v4": { - "version": "3.347.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4/-/signature-v4-3.347.0.tgz", - "integrity": "sha512-58Uq1do+VsTHYkP11dTK+DF53fguoNNJL9rHRWhzP+OcYv3/mBMLoS2WPz/x9FO5mBg4ESFsug0I6mXbd36tjw==", + "version": "3.357.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4/-/signature-v4-3.357.0.tgz", + "integrity": "sha512-itt4/Jh9FqnzK30qIjXFBvM4J7zN4S/AAqsRMnaX7U4f/MV+1YxQHmzimpdMnsCXXs2jqFqKVRu6DewxJ3nbxg==", "dependencies": { - "@aws-sdk/eventstream-codec": "3.347.0", + "@aws-sdk/eventstream-codec": "3.357.0", "@aws-sdk/is-array-buffer": "3.310.0", - "@aws-sdk/types": "3.347.0", + "@aws-sdk/types": "3.357.0", "@aws-sdk/util-hex-encoding": "3.310.0", - "@aws-sdk/util-middleware": "3.347.0", + "@aws-sdk/util-middleware": "3.357.0", "@aws-sdk/util-uri-escape": "3.310.0", "@aws-sdk/util-utf8": "3.310.0", "tslib": "^2.5.0" @@ -1562,12 +1758,14 @@ } }, "node_modules/@aws-sdk/smithy-client": { - "version": "3.347.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/smithy-client/-/smithy-client-3.347.0.tgz", - "integrity": "sha512-PaGTDsJLGK0sTjA6YdYQzILRlPRN3uVFyqeBUkfltXssvUzkm8z2t1lz2H4VyJLAhwnG5ZuZTNEV/2mcWrU7JQ==", + "version": "3.360.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/smithy-client/-/smithy-client-3.360.0.tgz", + "integrity": "sha512-R7wbT2SkgWNEAxMekOTNcPcvBszabW2+qHjrcelbbVJNjx/2yK+MbpZI4WRSncByQMeeoW+aSUP+JgsbpiOWfw==", "dependencies": { - "@aws-sdk/middleware-stack": "3.347.0", - "@aws-sdk/types": "3.347.0", + "@aws-sdk/middleware-stack": "3.357.0", + "@aws-sdk/types": "3.357.0", + "@aws-sdk/util-stream": "3.360.0", + "@smithy/types": "^1.0.0", "tslib": "^2.5.0" }, "engines": { @@ -1575,14 +1773,14 @@ } }, "node_modules/@aws-sdk/token-providers": { - "version": "3.350.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.350.0.tgz", - "integrity": "sha512-VIfVMV5An1VQQ6bOKQTHPsRFHD3/YRGOPk9lDTVJGOK0G1DIFYd/10ZaLQ86rCWLck2lGhjxsOen2N2n6MtA0A==", - "dependencies": { - "@aws-sdk/client-sso-oidc": "3.350.0", - "@aws-sdk/property-provider": "3.347.0", - "@aws-sdk/shared-ini-file-loader": "3.347.0", - "@aws-sdk/types": "3.347.0", + "version": "3.360.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.360.0.tgz", + "integrity": "sha512-gtnCmn2NL7uSwadqQPeU74Wo7Wf1NMJtui+KSWPYpc3joRZqIYj0kL5w0IT2S9tPQwCFerWVfhkvRkSGJ4nZ/g==", + "dependencies": { + "@aws-sdk/client-sso-oidc": "3.360.0", + "@aws-sdk/property-provider": "3.357.0", + "@aws-sdk/shared-ini-file-loader": "3.357.0", + "@aws-sdk/types": "3.357.0", "tslib": "^2.5.0" }, "engines": { @@ -1590,9 +1788,9 @@ } }, "node_modules/@aws-sdk/types": { - "version": "3.347.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.347.0.tgz", - "integrity": "sha512-GkCMy79mdjU9OTIe5KT58fI/6uqdf8UmMdWqVHmFJ+UpEzOci7L/uw4sOXWo7xpPzLs6cJ7s5ouGZW4GRPmHFA==", + "version": "3.357.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.357.0.tgz", + "integrity": "sha512-/riCRaXg3p71BeWnShrai0y0QTdXcouPSM0Cn1olZbzTf7s71aLEewrc96qFrL70XhY4XvnxMpqQh+r43XIL3g==", "dependencies": { "tslib": "^2.5.0" }, @@ -1601,12 +1799,12 @@ } }, "node_modules/@aws-sdk/url-parser": { - "version": "3.347.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/url-parser/-/url-parser-3.347.0.tgz", - "integrity": "sha512-lhrnVjxdV7hl+yCnJfDZOaVLSqKjxN20MIOiijRiqaWGLGEAiSqBreMhL89X1WKCifxAs4zZf9YB9SbdziRpAA==", + "version": "3.357.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/url-parser/-/url-parser-3.357.0.tgz", + "integrity": "sha512-fAaU6cFsaAba01lCRsRJiYR/LfXvX2wudyEyutBVglE4dWSoSeu3QJNxImIzTBULfbiFhz59++NQ1JUVx88IVg==", "dependencies": { - "@aws-sdk/querystring-parser": "3.347.0", - "@aws-sdk/types": "3.347.0", + "@aws-sdk/querystring-parser": "3.357.0", + "@aws-sdk/types": "3.357.0", "tslib": "^2.5.0" } }, @@ -1624,7 +1822,9 @@ }, "node_modules/@aws-sdk/util-base64-node": { "version": "3.209.0", - "license": "Apache-2.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-base64-node/-/util-base64-node-3.209.0.tgz", + "integrity": "sha512-U6pjb6uF/BameQLmzoSrqeiTxu5otwwGV7fO+TyE/3SJm/lyIsBaO+wr0qsoK0ae1VqggR+KCsUG13pWhdltpw==", + "deprecated": "The package @aws-sdk/util-base64-node has been renamed to @aws-sdk/util-base64. Please install the renamed package.", "dependencies": { "@aws-sdk/util-buffer-from": "3.208.0", "tslib": "^2.3.1" @@ -1698,12 +1898,12 @@ } }, "node_modules/@aws-sdk/util-defaults-mode-browser": { - "version": "3.347.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-browser/-/util-defaults-mode-browser-3.347.0.tgz", - "integrity": "sha512-+JHFA4reWnW/nMWwrLKqL2Lm/biw/Dzi/Ix54DAkRZ08C462jMKVnUlzAI+TfxQE3YLm99EIa0G7jiEA+p81Qw==", + "version": "3.360.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-browser/-/util-defaults-mode-browser-3.360.0.tgz", + "integrity": "sha512-/GR8VlK9xo1Q5WbVYuNaZ+XfoCFdWNb4z4mpoEgvEgBH4R0GjqiAqLftUA8Ykq1tJuDAKPYVzUNzK8DC0pt7/g==", "dependencies": { - "@aws-sdk/property-provider": "3.347.0", - "@aws-sdk/types": "3.347.0", + "@aws-sdk/property-provider": "3.357.0", + "@aws-sdk/types": "3.357.0", "bowser": "^2.11.0", "tslib": "^2.5.0" }, @@ -1712,15 +1912,15 @@ } }, "node_modules/@aws-sdk/util-defaults-mode-node": { - "version": "3.347.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-node/-/util-defaults-mode-node-3.347.0.tgz", - "integrity": "sha512-A8BzIVhAAZE5WEukoAN2kYebzTc99ZgncbwOmgCCbvdaYlk5tzguR/s+uoT4G0JgQGol/4hAMuJEl7elNgU6RQ==", - "dependencies": { - "@aws-sdk/config-resolver": "3.347.0", - "@aws-sdk/credential-provider-imds": "3.347.0", - "@aws-sdk/node-config-provider": "3.347.0", - "@aws-sdk/property-provider": "3.347.0", - "@aws-sdk/types": "3.347.0", + "version": "3.360.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-defaults-mode-node/-/util-defaults-mode-node-3.360.0.tgz", + "integrity": "sha512-gR3Ctqpyl7SgStDJ1Jlq6qQDuw/rS9AgbAXx+s3wsmm3fm8lHKkXkDPYVvNDqd6dVXRO6q8MRx00lwkGI4qrpQ==", + "dependencies": { + "@aws-sdk/config-resolver": "3.357.0", + "@aws-sdk/credential-provider-imds": "3.357.0", + "@aws-sdk/node-config-provider": "3.357.0", + "@aws-sdk/property-provider": "3.357.0", + "@aws-sdk/types": "3.357.0", "tslib": "^2.5.0" }, "engines": { @@ -1728,21 +1928,22 @@ } }, "node_modules/@aws-sdk/util-dynamodb": { - "version": "3.235.0", - "license": "Apache-2.0", + "version": "3.360.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-dynamodb/-/util-dynamodb-3.360.0.tgz", + "integrity": "sha512-/XParSr/dZHo/t/GFLwYN0i/WjU9PZFmnC6xsDMzQGCItSVrEk9IU13xxh490Bpo1im15Pl0MU6JzvkPMhl+rQ==", "dependencies": { - "tslib": "^2.3.1" + "tslib": "^2.5.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/util-endpoints": { - "version": "3.347.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.347.0.tgz", - "integrity": "sha512-/WUkirizeNAqwVj0zkcrqdQ9pUm1HY5kU+qy7xTR0OebkuJauglkmSTMD+56L1JPunWqHhlwCMVRaz5eaJdSEQ==", + "version": "3.357.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.357.0.tgz", + "integrity": "sha512-XHKyS5JClT9su9hDif715jpZiWHQF9gKZXER8tW0gOizU3R9cyWc9EsJ2BRhFNhi7nt/JF/CLUEc5qDx3ETbUw==", "dependencies": { - "@aws-sdk/types": "3.347.0", + "@aws-sdk/types": "3.357.0", "tslib": "^2.5.0" }, "engines": { @@ -1772,9 +1973,9 @@ } }, "node_modules/@aws-sdk/util-middleware": { - "version": "3.347.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-middleware/-/util-middleware-3.347.0.tgz", - "integrity": "sha512-8owqUA3ePufeYTUvlzdJ7Z0miLorTwx+rNol5lourGQZ9JXsVMo23+yGA7nOlFuXSGkoKpMOtn6S0BT2bcfeiw==", + "version": "3.357.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-middleware/-/util-middleware-3.357.0.tgz", + "integrity": "sha512-pV1krjZs7BdahZBfsCJMatE8kcor7GFsBOWrQgQDm9T0We5b5xPpOO2vxAD0RytBpY8Ky2ELs/+qXMv7l5fWIA==", "dependencies": { "tslib": "^2.5.0" }, @@ -1783,17 +1984,58 @@ } }, "node_modules/@aws-sdk/util-retry": { - "version": "3.347.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-retry/-/util-retry-3.347.0.tgz", - "integrity": "sha512-NxnQA0/FHFxriQAeEgBonA43Q9/VPFQa8cfJDuT2A1YZruMasgjcltoZszi1dvoIRWSZsFTW42eY2gdOd0nffQ==", + "version": "3.357.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-retry/-/util-retry-3.357.0.tgz", + "integrity": "sha512-SUqYJE9msbuOVq+vnUy+t0LH7XuYNFz66dSF8q6tedsbJK4j8tgya0I1Ct3m06ynGrXDJMaj39I7AXCyW9bjtw==", "dependencies": { - "@aws-sdk/service-error-classification": "3.347.0", + "@aws-sdk/service-error-classification": "3.357.0", "tslib": "^2.5.0" }, "engines": { "node": ">= 14.0.0" } }, + "node_modules/@aws-sdk/util-stream": { + "version": "3.360.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-stream/-/util-stream-3.360.0.tgz", + "integrity": "sha512-t3naBfNesXwLis29pzSfLx2ifCn2180GiPjRaIsQP14IiVCBOeT1xaU6Dpyk7WeR/jW4cu7wGl+kbeyfNF6QmQ==", + "dependencies": { + "@aws-sdk/fetch-http-handler": "3.357.0", + "@aws-sdk/node-http-handler": "3.360.0", + "@aws-sdk/types": "3.357.0", + "@aws-sdk/util-base64": "3.310.0", + "@aws-sdk/util-buffer-from": "3.310.0", + "@aws-sdk/util-hex-encoding": "3.310.0", + "@aws-sdk/util-utf8": "3.310.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-stream/node_modules/@aws-sdk/is-array-buffer": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/is-array-buffer/-/is-array-buffer-3.310.0.tgz", + "integrity": "sha512-urnbcCR+h9NWUnmOtet/s4ghvzsidFmspfhYaHAmSRdy9yDjdjBJMFjjsn85A1ODUktztm+cVncXjQ38WCMjMQ==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-stream/node_modules/@aws-sdk/util-buffer-from": { + "version": "3.310.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-buffer-from/-/util-buffer-from-3.310.0.tgz", + "integrity": "sha512-i6LVeXFtGih5Zs8enLrt+ExXY92QV25jtEnTKHsmlFqFAuL3VBeod6boeMXkN2p9lbSVVQ1sAOOYZOHYbYkntw==", + "dependencies": { + "@aws-sdk/is-array-buffer": "3.310.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/@aws-sdk/util-uri-escape": { "version": "3.310.0", "resolved": "https://registry.npmjs.org/@aws-sdk/util-uri-escape/-/util-uri-escape-3.310.0.tgz", @@ -1806,22 +2048,22 @@ } }, "node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.347.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.347.0.tgz", - "integrity": "sha512-ydxtsKVtQefgbk1Dku1q7pMkjDYThauG9/8mQkZUAVik55OUZw71Zzr3XO8J8RKvQG8lmhPXuAQ0FKAyycc0RA==", + "version": "3.357.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.357.0.tgz", + "integrity": "sha512-JHaWlNIUkPNvXkqeDOrqFzAlAgdwZK5mZw7FQnCRvf8tdSogpGZSkuyb9Z6rLD9gC40Srbc2nepO1cFpeMsDkA==", "dependencies": { - "@aws-sdk/types": "3.347.0", + "@aws-sdk/types": "3.357.0", "bowser": "^2.11.0", "tslib": "^2.5.0" } }, "node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.347.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.347.0.tgz", - "integrity": "sha512-6X0b9qGsbD1s80PmbaB6v1/ZtLfSx6fjRX8caM7NN0y/ObuLoX8LhYnW6WlB2f1+xb4EjaCNgpP/zCf98MXosw==", + "version": "3.357.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.357.0.tgz", + "integrity": "sha512-RdpQoaJWQvcS99TVgSbT451iGrlH4qpWUWFA9U1IRhxOSsmC1hz8ME7xc8nci9SREx/ZlfT3ai6LpoAzAtIEMA==", "dependencies": { - "@aws-sdk/node-config-provider": "3.347.0", - "@aws-sdk/types": "3.347.0", + "@aws-sdk/node-config-provider": "3.357.0", + "@aws-sdk/types": "3.357.0", "tslib": "^2.5.0" }, "engines": { @@ -1855,6 +2097,19 @@ "tslib": "^2.3.1" } }, + "node_modules/@aws-sdk/util-utf8-node": { + "version": "3.259.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-utf8-node/-/util-utf8-node-3.259.0.tgz", + "integrity": "sha512-2sbGdmrkODKeJb6kbEOKpX8cYtS9IO16XRAtINcN7sInWfspAITDofrabf0i0tFQF0hsJtbC5dyJRn87w0gYIQ==", + "dev": true, + "dependencies": { + "@aws-sdk/util-buffer-from": "3.208.0", + "tslib": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/@aws-sdk/util-utf8/node_modules/@aws-sdk/is-array-buffer": { "version": "3.310.0", "license": "Apache-2.0", @@ -1877,12 +2132,12 @@ } }, "node_modules/@aws-sdk/util-waiter": { - "version": "3.347.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-waiter/-/util-waiter-3.347.0.tgz", - "integrity": "sha512-3ze/0PkwkzUzLncukx93tZgGL0JX9NaP8DxTi6WzflnL/TEul5Z63PCruRNK0om17iZYAWKrf8q2mFoHYb4grA==", + "version": "3.357.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-waiter/-/util-waiter-3.357.0.tgz", + "integrity": "sha512-jQQGA5G8bm0JP5C4U85VzMpkFHdeeT7fOSUncXLG9Sh8Ambzi4XTud8m5/dA7aNJkvPwZeIF9QdgWCOzpkp1xA==", "dependencies": { - "@aws-sdk/abort-controller": "3.347.0", - "@aws-sdk/types": "3.347.0", + "@aws-sdk/abort-controller": "3.357.0", + "@aws-sdk/types": "3.357.0", "tslib": "^2.5.0" }, "engines": { @@ -6148,9 +6403,9 @@ } }, "node_modules/aws-sdk": { - "version": "2.1358.0", - "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1358.0.tgz", - "integrity": "sha512-ZolqFlnm0mDNgub7FGrVi7r5A1rw+58zZziKhlis3IxOtIpHdx4BQU5pH4htAMuD0Ct557p/dC/wmnZH/1Rc9Q==", + "version": "2.1405.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1405.0.tgz", + "integrity": "sha512-NVVZpRmr+KoBq5xFbB+ivCMDPGx8g1XOZVcswXotZZZIQVdDdHixrkZDqOrZ/p1hJ0eylGc7VQ8mkR7DVryXlQ==", "dev": true, "dependencies": { "buffer": "4.9.2", @@ -6168,242 +6423,55 @@ "node": ">= 10.0.0" } }, - "node_modules/aws-sdk-client-mock": { - "version": "2.0.1", + "node_modules/aws-sdk/node_modules/uuid": { + "version": "8.0.0", "dev": true, "license": "MIT", - "dependencies": { - "@types/sinon": "^10.0.10", - "sinon": "^14.0.2", - "tslib": "^2.1.0" + "bin": { + "uuid": "dist/bin/uuid" } }, - "node_modules/aws-sdk-client-mock-jest": { - "version": "2.0.1", - "dev": true, - "license": "MIT", + "node_modules/aws-xray-sdk-core": { + "version": "3.4.1", + "license": "Apache-2.0", "dependencies": { - "@types/jest": "^28.1.3", - "tslib": "^2.1.0" + "@aws-sdk/service-error-classification": "^3.4.1", + "@aws-sdk/types": "^3.4.1", + "@types/cls-hooked": "^4.3.3", + "atomic-batcher": "^1.0.2", + "cls-hooked": "^4.2.2", + "semver": "^5.3.0" }, - "peerDependencies": { - "aws-sdk-client-mock": "2.0.1" + "engines": { + "node": ">= 14.x" } }, - "node_modules/aws-sdk-client-mock-jest/node_modules/@jest/expect-utils": { - "version": "28.1.3", + "node_modules/aws-xray-sdk-core/node_modules/semver": { + "version": "5.7.1", + "license": "ISC", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/axios": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.4.0.tgz", + "integrity": "sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==", "dev": true, - "license": "MIT", "dependencies": { - "jest-get-type": "^28.0.2" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" } }, - "node_modules/aws-sdk-client-mock-jest/node_modules/@jest/schemas": { - "version": "28.1.3", + "node_modules/axios/node_modules/form-data": { + "version": "4.0.0", "dev": true, "license": "MIT", "dependencies": { - "@sinclair/typebox": "^0.24.1" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/aws-sdk-client-mock-jest/node_modules/@jest/types": { - "version": "28.1.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/schemas": "^28.1.3", - "@types/istanbul-lib-coverage": "^2.0.0", - "@types/istanbul-reports": "^3.0.0", - "@types/node": "*", - "@types/yargs": "^17.0.8", - "chalk": "^4.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/aws-sdk-client-mock-jest/node_modules/@types/jest": { - "version": "28.1.8", - "dev": true, - "license": "MIT", - "dependencies": { - "expect": "^28.0.0", - "pretty-format": "^28.0.0" - } - }, - "node_modules/aws-sdk-client-mock-jest/node_modules/ansi-styles": { - "version": "5.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/aws-sdk-client-mock-jest/node_modules/diff-sequences": { - "version": "28.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/aws-sdk-client-mock-jest/node_modules/expect": { - "version": "28.1.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/expect-utils": "^28.1.3", - "jest-get-type": "^28.0.2", - "jest-matcher-utils": "^28.1.3", - "jest-message-util": "^28.1.3", - "jest-util": "^28.1.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/aws-sdk-client-mock-jest/node_modules/jest-diff": { - "version": "28.1.3", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.0.0", - "diff-sequences": "^28.1.1", - "jest-get-type": "^28.0.2", - "pretty-format": "^28.1.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/aws-sdk-client-mock-jest/node_modules/jest-get-type": { - "version": "28.0.2", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/aws-sdk-client-mock-jest/node_modules/jest-matcher-utils": { - "version": "28.1.3", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.0.0", - "jest-diff": "^28.1.3", - "jest-get-type": "^28.0.2", - "pretty-format": "^28.1.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/aws-sdk-client-mock-jest/node_modules/jest-message-util": { - "version": "28.1.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.12.13", - "@jest/types": "^28.1.3", - "@types/stack-utils": "^2.0.0", - "chalk": "^4.0.0", - "graceful-fs": "^4.2.9", - "micromatch": "^4.0.4", - "pretty-format": "^28.1.3", - "slash": "^3.0.0", - "stack-utils": "^2.0.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/aws-sdk-client-mock-jest/node_modules/jest-util": { - "version": "28.1.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "^28.1.3", - "@types/node": "*", - "chalk": "^4.0.0", - "ci-info": "^3.2.0", - "graceful-fs": "^4.2.9", - "picomatch": "^2.2.3" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/aws-sdk-client-mock-jest/node_modules/pretty-format": { - "version": "28.1.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/schemas": "^28.1.3", - "ansi-regex": "^5.0.1", - "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" - }, - "engines": { - "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" - } - }, - "node_modules/aws-sdk/node_modules/uuid": { - "version": "8.0.0", - "dev": true, - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/aws-xray-sdk-core": { - "version": "3.4.1", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/service-error-classification": "^3.4.1", - "@aws-sdk/types": "^3.4.1", - "@types/cls-hooked": "^4.3.3", - "atomic-batcher": "^1.0.2", - "cls-hooked": "^4.2.2", - "semver": "^5.3.0" - }, - "engines": { - "node": ">= 14.x" - } - }, - "node_modules/aws-xray-sdk-core/node_modules/semver": { - "version": "5.7.1", - "license": "ISC", - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/axios": { - "version": "1.2.4", - "dev": true, - "license": "MIT", - "dependencies": { - "follow-redirects": "^1.15.0", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, - "node_modules/axios/node_modules/form-data": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" }, "engines": { "node": ">= 6" @@ -9260,9 +9328,9 @@ "license": "MIT" }, "node_modules/fast-xml-parser": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.2.4.tgz", - "integrity": "sha512-fbfMDvgBNIdDJLdLOwacjFAPYt67tr31H9ZhWSm45CDAxvd0I6WTlSOUo7K2P/K5sA5JgMKG64PI3DMcaFdWpQ==", + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.2.5.tgz", + "integrity": "sha512-B9/wizE4WngqQftFPmdaMYlXoJlJOYxGQOanC77fq9k8+Z0v5dDSVh+3glErdIROP//s/jgb7ZuxKfB8nVyo0g==", "funding": [ { "type": "paypal", @@ -10150,6 +10218,18 @@ "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", "dev": true }, + "node_modules/hashi-vault-js": { + "version": "0.4.13", + "resolved": "https://registry.npmjs.org/hashi-vault-js/-/hashi-vault-js-0.4.13.tgz", + "integrity": "sha512-0M+3/kZ39LQXrQ7QDkPjaYJbUrYZR1MvaJJeodMhYyxs4xG5J56TOpFacDV5TIgUbvUvqiIvriUxtQ8z7BiJvQ==", + "dev": true, + "dependencies": { + "axios": "^1.3.4" + }, + "engines": { + "node": ">=14" + } + }, "node_modules/hosted-git-info": { "version": "6.1.1", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-6.1.1.tgz", @@ -17923,107 +18003,491 @@ }, "packages/commons": { "name": "@aws-lambda-powertools/commons", - "version": "1.10.0", + "version": "1.11.0", "license": "MIT-0", "devDependencies": { - "@aws-sdk/client-lambda": "^3.310.0", + "@aws-sdk/client-lambda": "^3.360.0", "@aws-sdk/util-utf8-node": "^3.259.0" } }, - "packages/commons/node_modules/@aws-sdk/util-utf8-node": { - "version": "3.259.0", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/util-buffer-from": "3.208.0", - "tslib": "^2.3.1" - }, - "engines": { - "node": ">=14.0.0" - } - }, "packages/idempotency": { "name": "@aws-lambda-powertools/idempotency", - "version": "1.10.0", + "version": "1.11.0", "license": "MIT-0", "dependencies": { - "@aws-lambda-powertools/commons": "^1.10.0", + "@aws-lambda-powertools/commons": "^1.11.0", "@aws-sdk/lib-dynamodb": "^3.231.0", + "@aws-sdk/util-base64-node": "^3.209.0", "jmespath": "^0.16.0" }, "devDependencies": { - "@aws-sdk/client-dynamodb": "^3.231.0", + "@aws-sdk/client-dynamodb": "^3.360.0", "@types/jmespath": "^0.15.0", - "aws-sdk-client-mock": "^2.0.1", - "aws-sdk-client-mock-jest": "^2.0.1" + "aws-sdk-client-mock": "^2.2.0", + "aws-sdk-client-mock-jest": "^2.2.0" } }, - "packages/logger": { - "name": "@aws-lambda-powertools/logger", - "version": "1.10.0", - "license": "MIT-0", + "packages/idempotency/node_modules/@jest/expect-utils": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-28.1.3.tgz", + "integrity": "sha512-wvbi9LUrHJLn3NlDW6wF2hvIMtd4JUl2QNVrjq+IBSHirgfrR3o9RnVtxzdEGO2n9JyIWwHnLfby5KzqBGg2YA==", + "dev": true, "dependencies": { - "@aws-lambda-powertools/commons": "^1.10.0", - "lodash.merge": "^4.6.2" + "jest-get-type": "^28.0.2" }, - "devDependencies": { - "@types/lodash.merge": "^4.6.7" + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" } }, - "packages/metrics": { - "name": "@aws-lambda-powertools/metrics", - "version": "1.10.0", - "license": "MIT-0", + "packages/idempotency/node_modules/@jest/schemas": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-28.1.3.tgz", + "integrity": "sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg==", + "dev": true, "dependencies": { - "@aws-lambda-powertools/commons": "^1.10.0" + "@sinclair/typebox": "^0.24.1" }, - "devDependencies": { - "@aws-sdk/client-cloudwatch": "^3.316.0", - "@types/promise-retry": "^1.1.3", - "promise-retry": "^2.0.1" + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" } }, - "packages/parameters": { - "name": "@aws-lambda-powertools/parameters", - "version": "1.10.0", - "license": "MIT-0", + "packages/idempotency/node_modules/@jest/types": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", + "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", + "dev": true, "dependencies": { - "@aws-lambda-powertools/commons": "^1.10.0", - "@aws-sdk/util-base64-node": "^3.209.0" + "@jest/schemas": "^28.1.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" }, - "devDependencies": { - "@aws-sdk/client-appconfigdata": "^3.241.0", - "@aws-sdk/client-dynamodb": "^3.245.0", - "@aws-sdk/client-secrets-manager": "^3.238.0", - "@aws-sdk/client-ssm": "^3.244.0", - "@aws-sdk/util-dynamodb": "^3.245.0", - "aws-sdk-client-mock": "^2.0.1", - "aws-sdk-client-mock-jest": "^2.0.1" + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" } }, - "packages/parameters/node_modules/@aws-sdk/util-dynamodb": { - "version": "3.245.0", + "packages/idempotency/node_modules/@types/jest": { + "version": "28.1.8", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-28.1.8.tgz", + "integrity": "sha512-8TJkV++s7B6XqnDrzR1m/TT0A0h948Pnl/097veySPN67VRAgQ4gZ7n2KfJo2rVq6njQjdxU3GCCyDvAeuHoiw==", "dev": true, - "license": "Apache-2.0", "dependencies": { - "tslib": "^2.3.1" - }, + "expect": "^28.0.0", + "pretty-format": "^28.0.0" + } + }, + "packages/idempotency/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, "engines": { - "node": ">=14.0.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "packages/idempotency/node_modules/aws-sdk-client-mock": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/aws-sdk-client-mock/-/aws-sdk-client-mock-2.2.0.tgz", + "integrity": "sha512-Kq2N+6gHRDedbrgTA0NMMfyN1XDWEA5Kbpm9/M/cenSxoNjfvQBOtBawI1lQe5h4UziLl///E7u17K9PBoHEKA==", + "dev": true, + "dependencies": { + "@types/sinon": "^10.0.10", + "sinon": "^14.0.2", + "tslib": "^2.1.0" + } + }, + "packages/idempotency/node_modules/aws-sdk-client-mock-jest": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/aws-sdk-client-mock-jest/-/aws-sdk-client-mock-jest-2.2.0.tgz", + "integrity": "sha512-lpPapmCjTe70qhXYFIjUL9cdA75YmtC0surig3QSr2Y5doaG1e4fuXlgkNeH6V873rlwu9TWCG2MFOr4rHuMfg==", + "dev": true, + "dependencies": { + "@types/jest": "^28.1.3", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "aws-sdk-client-mock": "2.2.0" + } + }, + "packages/idempotency/node_modules/diff-sequences": { + "version": "28.1.1", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-28.1.1.tgz", + "integrity": "sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw==", + "dev": true, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "packages/idempotency/node_modules/expect": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/expect/-/expect-28.1.3.tgz", + "integrity": "sha512-eEh0xn8HlsuOBxFgIss+2mX85VAS4Qy3OSkjV7rlBWljtA4oWH37glVGyOZSZvErDT/yBywZdPGwCXuTvSG85g==", + "dev": true, + "dependencies": { + "@jest/expect-utils": "^28.1.3", + "jest-get-type": "^28.0.2", + "jest-matcher-utils": "^28.1.3", + "jest-message-util": "^28.1.3", + "jest-util": "^28.1.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "packages/idempotency/node_modules/jest-diff": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-28.1.3.tgz", + "integrity": "sha512-8RqP1B/OXzjjTWkqMX67iqgwBVJRgCyKD3L9nq+6ZqJMdvjE8RgHktqZ6jNrkdMT+dJuYNI3rhQpxaz7drJHfw==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^28.1.1", + "jest-get-type": "^28.0.2", + "pretty-format": "^28.1.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "packages/idempotency/node_modules/jest-get-type": { + "version": "28.0.2", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-28.0.2.tgz", + "integrity": "sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA==", + "dev": true, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "packages/idempotency/node_modules/jest-matcher-utils": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-28.1.3.tgz", + "integrity": "sha512-kQeJ7qHemKfbzKoGjHHrRKH6atgxMk8Enkk2iPQ3XwO6oE/KYD8lMYOziCkeSB9G4adPM4nR1DE8Tf5JeWH6Bw==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^28.1.3", + "jest-get-type": "^28.0.2", + "pretty-format": "^28.1.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "packages/idempotency/node_modules/jest-message-util": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-28.1.3.tgz", + "integrity": "sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^28.1.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^28.1.3", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "packages/idempotency/node_modules/jest-util": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz", + "integrity": "sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==", + "dev": true, + "dependencies": { + "@jest/types": "^28.1.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "packages/idempotency/node_modules/pretty-format": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.3.tgz", + "integrity": "sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==", + "dev": true, + "dependencies": { + "@jest/schemas": "^28.1.3", + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "packages/logger": { + "name": "@aws-lambda-powertools/logger", + "version": "1.11.0", + "license": "MIT-0", + "dependencies": { + "@aws-lambda-powertools/commons": "^1.11.0", + "lodash.merge": "^4.6.2" + }, + "devDependencies": { + "@types/lodash.merge": "^4.6.7" + } + }, + "packages/metrics": { + "name": "@aws-lambda-powertools/metrics", + "version": "1.11.0", + "license": "MIT-0", + "dependencies": { + "@aws-lambda-powertools/commons": "^1.11.0" + }, + "devDependencies": { + "@aws-sdk/client-cloudwatch": "^3.360.0", + "@types/promise-retry": "^1.1.3", + "promise-retry": "^2.0.1" + } + }, + "packages/parameters": { + "name": "@aws-lambda-powertools/parameters", + "version": "1.11.0", + "license": "MIT-0", + "dependencies": { + "@aws-lambda-powertools/commons": "^1.11.0", + "@aws-sdk/util-base64-node": "^3.209.0" + }, + "devDependencies": { + "@aws-sdk/client-appconfigdata": "^3.360.0", + "@aws-sdk/client-dynamodb": "^3.360.0", + "@aws-sdk/client-secrets-manager": "^3.360.0", + "@aws-sdk/client-ssm": "^3.360.0", + "@aws-sdk/util-dynamodb": "^3.360.0", + "aws-sdk-client-mock": "^2.2.0", + "aws-sdk-client-mock-jest": "^2.2.0" + } + }, + "packages/parameters/node_modules/@jest/expect-utils": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-28.1.3.tgz", + "integrity": "sha512-wvbi9LUrHJLn3NlDW6wF2hvIMtd4JUl2QNVrjq+IBSHirgfrR3o9RnVtxzdEGO2n9JyIWwHnLfby5KzqBGg2YA==", + "dev": true, + "dependencies": { + "jest-get-type": "^28.0.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "packages/parameters/node_modules/@jest/schemas": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-28.1.3.tgz", + "integrity": "sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg==", + "dev": true, + "dependencies": { + "@sinclair/typebox": "^0.24.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "packages/parameters/node_modules/@jest/types": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", + "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", + "dev": true, + "dependencies": { + "@jest/schemas": "^28.1.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "packages/parameters/node_modules/@types/jest": { + "version": "28.1.8", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-28.1.8.tgz", + "integrity": "sha512-8TJkV++s7B6XqnDrzR1m/TT0A0h948Pnl/097veySPN67VRAgQ4gZ7n2KfJo2rVq6njQjdxU3GCCyDvAeuHoiw==", + "dev": true, + "dependencies": { + "expect": "^28.0.0", + "pretty-format": "^28.0.0" + } + }, + "packages/parameters/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "packages/parameters/node_modules/aws-sdk-client-mock": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/aws-sdk-client-mock/-/aws-sdk-client-mock-2.2.0.tgz", + "integrity": "sha512-Kq2N+6gHRDedbrgTA0NMMfyN1XDWEA5Kbpm9/M/cenSxoNjfvQBOtBawI1lQe5h4UziLl///E7u17K9PBoHEKA==", + "dev": true, + "dependencies": { + "@types/sinon": "^10.0.10", + "sinon": "^14.0.2", + "tslib": "^2.1.0" + } + }, + "packages/parameters/node_modules/aws-sdk-client-mock-jest": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/aws-sdk-client-mock-jest/-/aws-sdk-client-mock-jest-2.2.0.tgz", + "integrity": "sha512-lpPapmCjTe70qhXYFIjUL9cdA75YmtC0surig3QSr2Y5doaG1e4fuXlgkNeH6V873rlwu9TWCG2MFOr4rHuMfg==", + "dev": true, + "dependencies": { + "@types/jest": "^28.1.3", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "aws-sdk-client-mock": "2.2.0" + } + }, + "packages/parameters/node_modules/diff-sequences": { + "version": "28.1.1", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-28.1.1.tgz", + "integrity": "sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw==", + "dev": true, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "packages/parameters/node_modules/expect": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/expect/-/expect-28.1.3.tgz", + "integrity": "sha512-eEh0xn8HlsuOBxFgIss+2mX85VAS4Qy3OSkjV7rlBWljtA4oWH37glVGyOZSZvErDT/yBywZdPGwCXuTvSG85g==", + "dev": true, + "dependencies": { + "@jest/expect-utils": "^28.1.3", + "jest-get-type": "^28.0.2", + "jest-matcher-utils": "^28.1.3", + "jest-message-util": "^28.1.3", + "jest-util": "^28.1.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "packages/parameters/node_modules/jest-diff": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-28.1.3.tgz", + "integrity": "sha512-8RqP1B/OXzjjTWkqMX67iqgwBVJRgCyKD3L9nq+6ZqJMdvjE8RgHktqZ6jNrkdMT+dJuYNI3rhQpxaz7drJHfw==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^28.1.1", + "jest-get-type": "^28.0.2", + "pretty-format": "^28.1.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "packages/parameters/node_modules/jest-get-type": { + "version": "28.0.2", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-28.0.2.tgz", + "integrity": "sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA==", + "dev": true, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "packages/parameters/node_modules/jest-matcher-utils": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-28.1.3.tgz", + "integrity": "sha512-kQeJ7qHemKfbzKoGjHHrRKH6atgxMk8Enkk2iPQ3XwO6oE/KYD8lMYOziCkeSB9G4adPM4nR1DE8Tf5JeWH6Bw==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^28.1.3", + "jest-get-type": "^28.0.2", + "pretty-format": "^28.1.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "packages/parameters/node_modules/jest-message-util": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-28.1.3.tgz", + "integrity": "sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^28.1.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^28.1.3", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "packages/parameters/node_modules/jest-util": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz", + "integrity": "sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==", + "dev": true, + "dependencies": { + "@jest/types": "^28.1.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "packages/parameters/node_modules/pretty-format": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.3.tgz", + "integrity": "sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==", + "dev": true, + "dependencies": { + "@jest/schemas": "^28.1.3", + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" } }, "packages/tracer": { "name": "@aws-lambda-powertools/tracer", - "version": "1.10.0", + "version": "1.11.0", "license": "MIT-0", "dependencies": { - "@aws-lambda-powertools/commons": "^1.10.0", + "@aws-lambda-powertools/commons": "^1.11.0", "aws-xray-sdk-core": "^3.4.1" }, "devDependencies": { - "@aws-sdk/client-dynamodb": "^3.231.0", - "@aws-sdk/client-sts": "^3.310.0", - "@aws-sdk/client-xray": "^3.310.0", + "@aws-sdk/client-dynamodb": "^3.360.0", + "@aws-sdk/client-sts": "^3.360.0", + "@aws-sdk/client-xray": "^3.360.0", "@types/promise-retry": "^1.1.3", "aws-sdk": "^2.1354.0", "axios": "^1.2.1", diff --git a/packages/commons/CHANGELOG.md b/packages/commons/CHANGELOG.md index e96f3be1dc..fd912a0b86 100644 --- a/packages/commons/CHANGELOG.md +++ b/packages/commons/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [1.11.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v1.10.0...v1.11.0) (2023-06-29) + +**Note:** Version bump only for package @aws-lambda-powertools/commons + # [1.10.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v1.9.0...v1.10.0) (2023-06-23) ### Bug Fixes diff --git a/packages/commons/README.md b/packages/commons/README.md index f121aec7df..6d62247577 100644 --- a/packages/commons/README.md +++ b/packages/commons/README.md @@ -31,7 +31,7 @@ You can use the library in both TypeScript and JavaScript code bases. * **[Tracer](https://docs.powertools.aws.dev/lambda-typescript/latest/core/tracer/)** - Utilities to trace Lambda function handlers, and both synchronous and asynchronous functions * **[Logger](https://docs.powertools.aws.dev/lambda-typescript/latest/core/logger/)** - Structured logging made easier, and a middleware to enrich log items with key details of the Lambda context * **[Metrics](https://docs.powertools.aws.dev/lambda-typescript/latest/core/metrics/)** - Custom Metrics created asynchronously via CloudWatch Embedded Metric Format (EMF) -* **[Parameters (beta)](https://docs.powertools.aws.dev/lambda-typescript/latest/utilities/parameters/)** - High-level functions to retrieve one or more parameters from AWS SSM, Secrets Manager, AppConfig, and DynamoDB +* **[Parameters](https://docs.powertools.aws.dev/lambda-typescript/latest/utilities/parameters/)** - High-level functions to retrieve one or more parameters from AWS SSM, Secrets Manager, AppConfig, and DynamoDB ## Getting started @@ -98,6 +98,7 @@ The following companies, among others, use Powertools: * [Bailey Nelson](https://www.baileynelson.com.au) * [Perfect Post](https://www.perfectpost.fr) * [Sennder](https://sennder.com/) +* [Certible](https://www.certible.com/) ### Sharing your work diff --git a/packages/commons/package.json b/packages/commons/package.json index 0b5af896ff..fa5979e373 100644 --- a/packages/commons/package.json +++ b/packages/commons/package.json @@ -1,6 +1,6 @@ { "name": "@aws-lambda-powertools/commons", - "version": "1.10.0", + "version": "1.11.0", "description": "A shared utility package for Powertools for AWS Lambda (TypeScript) libraries", "author": { "name": "Amazon Web Services", @@ -46,7 +46,7 @@ "nodejs" ], "devDependencies": { - "@aws-sdk/client-lambda": "^3.310.0", + "@aws-sdk/client-lambda": "^3.360.0", "@aws-sdk/util-utf8-node": "^3.259.0" } } diff --git a/packages/idempotency/CHANGELOG.md b/packages/idempotency/CHANGELOG.md index d8543aa427..9fada5a632 100644 --- a/packages/idempotency/CHANGELOG.md +++ b/packages/idempotency/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [1.11.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v1.10.0...v1.11.0) (2023-06-29) + +### Features + +- **idempotency:** preserve original error when wrapping into `IdempotencyPersistenceLayerError` ([#1552](https://github.com/aws-powertools/powertools-lambda-typescript/issues/1552)) ([866837d](https://github.com/aws-powertools/powertools-lambda-typescript/commit/866837daf34563698709612351c45769e02daf16)) + # [1.10.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v1.9.0...v1.10.0) (2023-06-23) ### Bug Fixes diff --git a/packages/idempotency/README.md b/packages/idempotency/README.md index 87bf3e18b8..63833d664d 100644 --- a/packages/idempotency/README.md +++ b/packages/idempotency/README.md @@ -8,15 +8,33 @@ Powertools for AWS Lambda (TypeScript) is a developer toolkit to implement Serverless [best practices and increase developer velocity](https://docs.powertools.aws.dev/lambda-typescript/latest/#features). +You can use the package in both TypeScript and JavaScript code bases. + +- [Intro](#intro) +- [Key features](#key-features) +- [Usage](#usage) + - [Function wrapper](#function-wrapper) + - [Middy middleware](#middy-middleware) + - [DynamoDB persistence layer](#dynamodb-persistence-layer) +- [Contribute](#contribute) +- [Roadmap](#roadmap) +- [Connect](#connect) +- [How to support Powertools for AWS Lambda (TypeScript)?](#how-to-support-powertools-for-aws-lambda-typescript) + - [Becoming a reference customer](#becoming-a-reference-customer) + - [Sharing your work](#sharing-your-work) + - [Using Lambda Layer](#using-lambda-layer) +- [Credits](#credits) +- [License](#license) + ## Intro This package provides a utility to implement idempotency in your Lambda functions. -You can either use it as a decorator on your Lambda handler or as a wrapper on any other function. -If you use middy, we also provide a middleware to make your Lambda handler idempotent. -The current implementation provides a persistance layer for Amazon DynamoDB, which offers a variety of configuration options. -You can also bring your own persistance layer by implementing the `IdempotencyPersistanceLayer` interface. +You can either use it to wrapp a function, or as Middy middleware to make your AWS Lambda handler idempotent. + +The current implementation provides a persistence layer for Amazon DynamoDB, which offers a variety of configuration options. You can also bring your own persistence layer by extending the `BasePersistenceLayer` class. ## Key features + * Prevent Lambda handler from executing more than once on the same event payload during a time window * Ensure Lambda handler returns the same result when called with the same payload * Select a subset of the event as the idempotency key using JMESPath expressions @@ -25,125 +43,99 @@ You can also bring your own persistance layer by implementing the `IdempotencyPe ## Usage -### Decorators -If you use classes to define your Lambda handlers, you can use the decorators to make your handler idempotent or a specific function idempotent. -We offer two decorators: -* `@idempotentLambdaHandler`: makes the handler idempotent. -* `@idempotentFunction`: makes any function within your class idempotent +To get started, install the library by running: -The first can only be applied to the handler function with the specific signature of a Lambda handler. -The second can be applied to any function within your class. In this case you need to pass a `Record` object and provide the `dataKeywordArgument` parameter to specify the name of the argument that contains the data to be used as the idempotency key. -In any of both cases yoiu need to pass the persistance layer where we will store the idempotency information. +```sh +npm install @aws-lambda-powertools/idempotency +``` +Next, review the IAM permissions attached to your AWS Lambda function and make sure you allow the [actions detailed](https://docs.powertools.aws.dev/lambda/typescript/latest/utilities/idempotency/#iam-permissions) in the documentation of the utility. ### Function wrapper -A more common approach is to use the function wrapper. -Similar to `@idempotentFunction` decorator you need to pass keyword argument to indicate which part of the payload will be hashed. - -### Middy middleware -// TODO: after e2e tests are implemented - -### DynamoDB peristance layer -To store the idempotency information offer a DynamoDB persistance layer. -This enables you to store the hash key, payload, status for progress and expiration and much more. -You can customise most of the configuration options of the DynamoDB table, i.e the names of the attributes. -See the [API documentation](https://docs.powertools.aws.dev/lambda-typescript/latest/modules/.index.DynamoDBPersistenceLayer.html) for more details. - -## Examples - -### Decorator Lambda handler - -```ts -import { idempotentLambdaHandler } from "@aws-lambda-powertools/idempotency"; -import { DynamoDBPersistenceLayer } from "@aws-lambda-powertools/idempotency/persistance"; -import type { Context } from 'aws-lambda'; - -const dynamoDBPersistenceLayer = new DynamoDBPersistenceLayer(); - -class MyLambdaHandler implements LambdaInterface { - @idempotentLambdaHandler({ persistenceStore: dynamoDBPersistenceLayer }) - public async handler(_event: any, _context: Context): Promise { - // your lambda code here - return "Hello World"; - } -} - -const lambdaClass = new MyLambdaHandler(); -export const handler = lambdaClass.handler.bind(lambdaClass); -``` +You can make any function idempotent, and safe to retry, by wrapping it using the `makeFunctionIdempotent` higher-order function. -### Decorator function +The function wrapper takes a reference to the function to be made idempotent as first argument, and an object with options as second argument. ```ts -import { idempotentLambdaHandler } from "@aws-lambda-powertools/idempotency"; -import { DynamoDBPersistenceLayer } from "@aws-lambda-powertools/idempotency/persistance"; -import type { Context } from 'aws-lambda'; +import { makeFunctionIdempotent } from '@aws-lambda-powertools/idempotency'; +import { DynamoDBPersistenceLayer } from '@aws-lambda-powertools/idempotency/persistence'; +import type { Context, SQSEvent, SQSRecord } from 'aws-lambda'; +const persistenceStore = new DynamoDBPersistenceLayer({ + tableName: 'idempotencyTableName', +}); -const dynamoDBPersistenceLayer = new DynamoDBPersistenceLayer(); +const processingFunction = async (payload: SQSRecord): Promise => { + // your code goes here here +}; -class MyLambdaHandler implements LambdaInterface { - - public async handler(_event: any, _context: Context): Promise { - for(const record of _event.Records) { - await this.processRecord(record); - } - } - - @idempotentFunction({ persistenceStore: dynamoDBPersistenceLayer, dataKeywordArgument: "payload" }) - public async process(payload: Record): Promise { - // your lambda code here +export const handler = async ( + event: SQSEvent, + _context: Context +): Promise => { + for (const record of event.Records) { + await makeFunctionIdempotent(proccessingFunction, { + dataKeywordArgument: 'transactionId', + persistenceStore, + }); } -} +}; ``` -The `dataKeywordArgument` parameter is optional. If not provided, the whole event will be used as the idempotency key. -Otherwise, you need to specify the string name of the argument that contains the data to be used as the idempotency key. -For example if you have an input like this: +Note that we are specifying a `dataKeywordArgument` option, this tells the Idempotency utility which field(s) will be used as idempotency key. +Check the [docs](https://docs.powertools.aws.dev/lambda/typescript/latest/utilities/idempotency/) for more examples. -```json -{ - "transactionId": 1235, - "product": "book", - "quantity": 1, - "price": 10 -} -``` - -You can use `transactionId` as the idempotency key. This will ensure that the same transaction is not processed twice. +### Middy middleware -### Function wrapper +If instead you use Middy, you can use the `makeHandlerIdempotent` middleware. When using the middleware your Lambda handler becomes idempotent. -In case where you don't use classes and decorators you can wrap your function to make it idempotent. +By default, the Idempotency utility will use the full event payload to create an hash and determine if a request is idempotent, and therefore it should not be retried. When dealing with a more elaborate payload, where parts of the payload always change you should use the `IdempotencyConfig` object to instruct the utility to only use a portion of your payload. This is useful when dealing with payloads that contain timestamps or request ids. ```ts -import { makeFunctionIdempotent } from "@aws-lambda-powertools/idempotency"; -import { DynamoDBPersistenceLayer } from "@aws-lambda-powertools/idempotency/persistance"; -import type { Context } from 'aws-lambda'; - +import { IdempotencyConfig } from '@aws-lambda-powertools/idempotency'; +import { makeHandlerIdempotent } from '@aws-lambda-powertools/idempotency/middleware'; +import { DynamoDBPersistenceLayer } from '@aws-lambda-powertools/idempotency/persistence'; +import middy from '@middy/core'; +import type { Context, APIGatewayProxyEvent } from 'aws-lambda'; + +const persistenceStore = new DynamoDBPersistenceLayer({ + tableName: 'idempotencyTableName', +}); +const config = new IdempotencyConfig({ + hashFunction: 'md5', + useLocalCache: false, + expiresAfterSeconds: 3600, + throwOnNoIdempotencyKey: false, + eventKeyJmesPath: 'headers.idempotency-key', +}); -const dynamoDBPersistenceLayer = new DynamoDBPersistenceLayer(); -const processingFunction = async (payload: Record): Promise => { - // your lambda code here +const processingFunction = async (payload: SQSRecord): Promise => { + // your code goes here here }; -const processIdempotently = makeFunctionIdempotent(proccessingFunction, { - persistenceStore: dynamoDBPersistenceLayer, - dataKeywordArgument: "transactionId" -}); - -export const handler = async ( - _event: any, - _context: Context -): Promise => { - for (const record of _event.Records) { - await processIdempotently(record); +export const handler = middy( + async (event: APIGatewayProxyEvent, _context: Context): Promise => { + // your code goes here here } -}; +).use( + makeHandlerIdempotent({ + config, + persistenceStore, + }) +); ``` +Check the [docs](https://docs.powertools.aws.dev/lambda/typescript/latest/utilities/idempotency/) for more examples. + +### DynamoDB persistence layer + +You can use a DynamoDB Table to store the idempotency information. This enables you to keep track of the hash key, payload, status for progress, expiration, and much more. + +You can customize most of the configuration options of the table, i.e the names of the attributes. +See the [API documentation](https://docs.powertools.aws.dev/lambda/typescript/latest/api/types/_aws_lambda_powertools_idempotency.types.DynamoDBPersistenceOptions.html) for more details. + ## Contribute If you are interested in contributing to this project, please refer to our [Contributing Guidelines](https://github.com/aws-powertools/powertools-lambda-typescript/blob/main/CONTRIBUTING.md). @@ -173,6 +165,7 @@ The following companies, among others, use Powertools: * [Bailey Nelson](https://www.baileynelson.com.au) * [Perfect Post](https://www.perfectpost.fr) * [Sennder](https://sennder.com/) +* [Certible](https://www.certible.com/) ### Sharing your work diff --git a/packages/idempotency/package.json b/packages/idempotency/package.json index cebdebf213..706465d13d 100644 --- a/packages/idempotency/package.json +++ b/packages/idempotency/package.json @@ -1,6 +1,6 @@ { "name": "@aws-lambda-powertools/idempotency", - "version": "1.10.0", + "version": "1.11.0", "description": "The idempotency package for the Powertools for AWS Lambda (TypeScript) library. It provides options to make your Lambda functions idempotent and safe to retry.", "author": { "name": "Amazon Web Services", @@ -78,8 +78,9 @@ "url": "https://github.com/aws-powertools/powertools-lambda-typescript/issues" }, "dependencies": { - "@aws-lambda-powertools/commons": "^1.10.0", + "@aws-lambda-powertools/commons": "^1.11.0", "@aws-sdk/lib-dynamodb": "^3.231.0", + "@aws-sdk/util-base64-node": "^3.209.0", "jmespath": "^0.16.0" }, "keywords": [ @@ -91,9 +92,9 @@ "nodejs" ], "devDependencies": { - "@aws-sdk/client-dynamodb": "^3.231.0", + "@aws-sdk/client-dynamodb": "^3.360.0", "@types/jmespath": "^0.15.0", - "aws-sdk-client-mock": "^2.0.1", - "aws-sdk-client-mock-jest": "^2.0.1" + "aws-sdk-client-mock": "^2.2.0", + "aws-sdk-client-mock-jest": "^2.2.0" } } diff --git a/packages/idempotency/src/IdempotencyHandler.ts b/packages/idempotency/src/IdempotencyHandler.ts index 07b0786732..1caeeef6dc 100644 --- a/packages/idempotency/src/IdempotencyHandler.ts +++ b/packages/idempotency/src/IdempotencyHandler.ts @@ -5,7 +5,7 @@ import { IdempotencyInconsistentStateError, IdempotencyItemAlreadyExistsError, IdempotencyPersistenceLayerError, -} from './Exceptions'; +} from './errors'; import { BasePersistenceLayer, IdempotencyRecord } from './persistence'; import { IdempotencyConfig } from './IdempotencyConfig'; import { MAX_RETRIES } from './constants'; @@ -80,7 +80,8 @@ export class IdempotencyHandler { ); } catch (e) { throw new IdempotencyPersistenceLayerError( - 'Failed to delete record from idempotency store' + 'Failed to delete record from idempotency store', + e as Error ); } throw e; @@ -92,7 +93,8 @@ export class IdempotencyHandler { ); } catch (e) { throw new IdempotencyPersistenceLayerError( - 'Failed to update success record to idempotency store' + 'Failed to update success record to idempotency store', + e as Error ); } @@ -153,7 +155,10 @@ export class IdempotencyHandler { idempotencyRecord ) as U; } else { - throw new IdempotencyPersistenceLayerError(); + throw new IdempotencyPersistenceLayerError( + 'Failed to save record in progress', + e as Error + ); } } diff --git a/packages/idempotency/src/Exceptions.ts b/packages/idempotency/src/errors.ts similarity index 78% rename from packages/idempotency/src/Exceptions.ts rename to packages/idempotency/src/errors.ts index 650d4419d4..21812ece6a 100644 --- a/packages/idempotency/src/Exceptions.ts +++ b/packages/idempotency/src/errors.ts @@ -31,7 +31,17 @@ class IdempotencyInconsistentStateError extends Error {} /** * Unrecoverable error from the data store */ -class IdempotencyPersistenceLayerError extends Error {} +class IdempotencyPersistenceLayerError extends Error { + public readonly cause: Error | undefined; + + public constructor(message: string, cause?: Error) { + const errorMessage = cause + ? `${message}. This error was caused by: ${cause.message}.` + : message; + super(errorMessage); + this.cause = cause; + } +} /** * Payload does not contain an idempotent key diff --git a/packages/idempotency/src/idempotentDecorator.ts b/packages/idempotency/src/idempotentDecorator.ts deleted file mode 100644 index 9b97f89bbb..0000000000 --- a/packages/idempotency/src/idempotentDecorator.ts +++ /dev/null @@ -1,141 +0,0 @@ -import { - GenericTempRecord, - IdempotencyFunctionOptions, - IdempotencyLambdaHandlerOptions, -} from './types'; -import { IdempotencyHandler } from './IdempotencyHandler'; -import { IdempotencyConfig } from './IdempotencyConfig'; -import { Context } from 'aws-lambda'; - -const isContext = (arg: unknown): arg is Context => { - return ( - arg !== undefined && - arg !== null && - typeof arg === 'object' && - 'getRemainingTimeInMillis' in arg - ); -}; - -/** - * use this function to narrow the type of options between IdempotencyHandlerOptions and IdempotencyFunctionOptions - * @param options - */ -const isFunctionOption = ( - options: IdempotencyLambdaHandlerOptions | IdempotencyFunctionOptions -): boolean => - (options as IdempotencyFunctionOptions).dataKeywordArgument !== undefined; - -const idempotent = function ( - options: IdempotencyLambdaHandlerOptions | IdempotencyFunctionOptions -): ( - target: unknown, - propertyKey: string, - descriptor: PropertyDescriptor -) => PropertyDescriptor { - return function ( - _target: unknown, - _propertyKey: string, - descriptor: PropertyDescriptor - ) { - const childFunction = descriptor.value; - descriptor.value = function ( - record: GenericTempRecord, - ...args: unknown[] - ) { - const functionPayloadtoBeHashed = isFunctionOption(options) - ? record[(options as IdempotencyFunctionOptions).dataKeywordArgument] - : record; - const idempotencyConfig = options.config - ? options.config - : new IdempotencyConfig({}); - const context = args[0]; - if (isContext(context)) { - idempotencyConfig.registerLambdaContext(context); - } - const idempotencyHandler = new IdempotencyHandler({ - functionToMakeIdempotent: childFunction, - functionPayloadToBeHashed: functionPayloadtoBeHashed, - persistenceStore: options.persistenceStore, - idempotencyConfig: idempotencyConfig, - fullFunctionPayload: record, - }); - - return idempotencyHandler.handle(); - }; - - return descriptor; - }; -}; - -/** - * Use this decorator to make your lambda handler itempotent. - * You need to provide a peristance layer to store the idempotency information. - * At the moment we only support `DynamodbPersistenceLayer`. - * > **Note**: - * > decorators are an exeperimental feature in typescript and may change in the future. - * > To enable decoratopr support in your project, you need to enable the `experimentalDecorators` compiler option in your tsconfig.json file. - * @example - * ```ts - * import { - * DynamoDBPersistenceLayer, - * idempotentLambdaHandler - * } from '@aws-lambda-powertools/idempotency' - * - * class MyLambdaFunction { - * @idempotentLambdaHandler({ persistenceStore: new DynamoDBPersistenceLayer() }) - * async handler(event: any, context: any) { - * return "Hello World"; - * } - * } - * export myLambdaHandler new MyLambdaFunction(); - * export const handler = myLambdaHandler.handler.bind(myLambdaHandler); - * ``` - * @see {@link DynamoDBPersistenceLayer} - * @see https://www.typescriptlang.org/docs/handbook/decorators.html - */ -const idempotentLambdaHandler = function ( - options: IdempotencyLambdaHandlerOptions -): ( - target: unknown, - propertyKey: string, - descriptor: PropertyDescriptor -) => PropertyDescriptor { - return idempotent(options); -}; -/** - * Use this decorator to make any class function idempotent. - * Similar to the `idempotentLambdaHandler` decorator, you need to provide a persistence layer to store the idempotency information. - * @example - * ```ts - * import { - * DynamoDBPersistenceLayer, - * idempotentFunction - * } from '@aws-lambda-powertools/idempotency' - * - * class MyClass { - * - * public async handler(_event: any, _context: any) { - * for(const record of _event.records){ - * await this.process(record); - * } - * } - * - * @idempotentFunction({ persistenceStore: new DynamoDBPersistenceLayer() }) - * public async process(record: Record PropertyDescriptor { - return idempotent(options); -}; - -export { idempotentLambdaHandler, idempotentFunction }; diff --git a/packages/idempotency/src/index.ts b/packages/idempotency/src/index.ts index 02f3b0e01e..bc5289a9ed 100644 --- a/packages/idempotency/src/index.ts +++ b/packages/idempotency/src/index.ts @@ -1,4 +1,3 @@ -export * from './Exceptions'; +export * from './errors'; export * from './IdempotencyConfig'; -export * from './idempotentDecorator'; export * from './makeFunctionIdempotent'; diff --git a/packages/idempotency/src/middleware/makeHandlerIdempotent.ts b/packages/idempotency/src/middleware/makeHandlerIdempotent.ts index 5af5b2ab23..b0f574cb20 100644 --- a/packages/idempotency/src/middleware/makeHandlerIdempotent.ts +++ b/packages/idempotency/src/middleware/makeHandlerIdempotent.ts @@ -5,7 +5,7 @@ import { IdempotencyInconsistentStateError, IdempotencyItemAlreadyExistsError, IdempotencyPersistenceLayerError, -} from '../Exceptions'; +} from '../errors'; import { IdempotencyRecord } from '../persistence'; import { MAX_RETRIES } from '../constants'; import type { @@ -124,7 +124,8 @@ const makeHandlerIdempotent = ( } } else { throw new IdempotencyPersistenceLayerError( - 'Failed to save in progress record to idempotency store' + 'Failed to save in progress record to idempotency store', + error as Error ); } } @@ -149,7 +150,8 @@ const makeHandlerIdempotent = ( ); } catch (e) { throw new IdempotencyPersistenceLayerError( - 'Failed to update success record to idempotency store' + 'Failed to update success record to idempotency store', + e as Error ); } }; @@ -172,7 +174,8 @@ const makeHandlerIdempotent = ( ); } catch (error) { throw new IdempotencyPersistenceLayerError( - 'Failed to delete record from idempotency store' + 'Failed to delete record from idempotency store', + error as Error ); } }; diff --git a/packages/idempotency/src/persistence/BasePersistenceLayer.ts b/packages/idempotency/src/persistence/BasePersistenceLayer.ts index 3f4a41ae29..94b235c004 100644 --- a/packages/idempotency/src/persistence/BasePersistenceLayer.ts +++ b/packages/idempotency/src/persistence/BasePersistenceLayer.ts @@ -8,7 +8,7 @@ import { BasePersistenceLayerInterface } from './BasePersistenceLayerInterface'; import { IdempotencyItemAlreadyExistsError, IdempotencyValidationError, -} from '../Exceptions'; +} from '../errors'; import { LRUCache } from './LRUCache'; /** diff --git a/packages/idempotency/src/persistence/DynamoDBPersistenceLayer.ts b/packages/idempotency/src/persistence/DynamoDBPersistenceLayer.ts index ed98141eee..57b76bb596 100644 --- a/packages/idempotency/src/persistence/DynamoDBPersistenceLayer.ts +++ b/packages/idempotency/src/persistence/DynamoDBPersistenceLayer.ts @@ -1,9 +1,9 @@ import { IdempotencyItemAlreadyExistsError, IdempotencyItemNotFoundError, -} from '../Exceptions'; +} from '../errors'; import { IdempotencyRecordStatus } from '../types'; -import type { DynamoPersistenceOptions } from '../types'; +import type { DynamoDBPersistenceOptions } from '../types'; import { DynamoDBClient, DynamoDBClientConfig, @@ -40,7 +40,7 @@ class DynamoDBPersistenceLayer extends BasePersistenceLayer { private tableName: string; private validationKeyAttr: string; - public constructor(config: DynamoPersistenceOptions) { + public constructor(config: DynamoDBPersistenceOptions) { super(); this.tableName = config.tableName; @@ -261,4 +261,3 @@ class DynamoDBPersistenceLayer extends BasePersistenceLayer { } export { DynamoDBPersistenceLayer }; -export type { DynamoPersistenceOptions as DynamoDBPersistenceLayerOptions }; diff --git a/packages/idempotency/src/persistence/IdempotencyRecord.ts b/packages/idempotency/src/persistence/IdempotencyRecord.ts index b2fe7a0528..98ec57da21 100644 --- a/packages/idempotency/src/persistence/IdempotencyRecord.ts +++ b/packages/idempotency/src/persistence/IdempotencyRecord.ts @@ -1,10 +1,10 @@ import type { IdempotencyRecordOptions } from '../types'; import { IdempotencyRecordStatus } from '../types'; -import { IdempotencyInvalidStatusError } from '../Exceptions'; +import { IdempotencyInvalidStatusError } from '../errors'; /** * Class representing an idempotency record. - * The properties of this class will be reflected in the persistance layer. + * The properties of this class will be reflected in the persistence layer. */ class IdempotencyRecord { /** diff --git a/packages/idempotency/src/types/DynamoDBPersistence.ts b/packages/idempotency/src/types/DynamoDBPersistence.ts index 65b1980510..7a1284d692 100644 --- a/packages/idempotency/src/types/DynamoDBPersistence.ts +++ b/packages/idempotency/src/types/DynamoDBPersistence.ts @@ -17,7 +17,7 @@ import type { * @property {string} [sortKeyAttr] - The DynamoDB table sort key attribute name, use only when table has one. Defaults to undefined. * @property {string} [staticPkValue] - The DynamoDB table static partition key value, use only with sortKeyAttr. Defaults to `idempotency#{LAMBDA_FUNCTION_NAME}`. */ -interface DynamoPersistenceOptionsBaseInterface { +interface DynamoDBPersistenceOptionsBase { tableName: string; keyAttr?: string; expiryAttr?: string; @@ -30,29 +30,29 @@ interface DynamoPersistenceOptionsBaseInterface { } /** - * Interface for DynamoPersistenceOptions with clientConfig property. + * Interface for DynamoDBPersistenceOptions with clientConfig property. * * @interface - * @extends DynamoPersistenceOptionsBaseInterface + * @extends DynamoDBPersistenceOptionsBase * @property {DynamoDBClientConfig} [clientConfig] - Optional configuration to pass during client initialization, e.g. AWS region. * @property {never} [awsSdkV3Client] - This property should never be passed. */ -interface DynamoPersistenceOptionsWithClientConfig - extends DynamoPersistenceOptionsBaseInterface { +interface DynamoDBPersistenceOptionsWithClientConfig + extends DynamoDBPersistenceOptionsBase { awsSdkV3Client?: never; clientConfig?: DynamoDBClientConfig; } /** - * Interface for DynamoPersistenceOptions with awsSdkV3Client property. + * Interface for DynamoDBPersistenceOptions with awsSdkV3Client property. * * @interface - * @extends DynamoPersistenceOptionsBaseInterface + * @extends DynamoDBPersistenceOptionsBase * @property {DynamoDBClient} [awsSdkV3Client] - Optional AWS SDK v3 client to pass during AppConfigProvider class instantiation * @property {never} [clientConfig] - This property should never be passed. */ -interface DynamoPersistenceOptionsWithClientInstance - extends DynamoPersistenceOptionsBaseInterface { +interface DynamoDBPersistenceOptionsWithClientInstance + extends DynamoDBPersistenceOptionsBase { awsSdkV3Client?: DynamoDBClient; clientConfig?: never; } @@ -60,7 +60,9 @@ interface DynamoPersistenceOptionsWithClientInstance /** * Options for the {@link DynamoDBPersistenceLayer} class constructor. * - * @type DynamoPersistenceOptions + * @see {@link DynamoDBPersistenceOptionsBase}, {@link DynamoDBPersistenceOptionsWithClientConfig}, and {@link DynamoDBPersistenceOptionsWithClientInstance} for full list of properties. + * + * @type DynamoDBPersistenceOptions * @property {string} tableName - The DynamoDB table name. * @property {string} [keyAttr] - The DynamoDB table key attribute name. Defaults to 'id'. * @property {string} [expiryAttr] - The DynamoDB table expiry attribute name. Defaults to 'expiration'. @@ -73,8 +75,13 @@ interface DynamoPersistenceOptionsWithClientInstance * @property {DynamoDBClientConfig} [clientConfig] - Optional configuration to pass during client initialization, e.g. AWS region. Mutually exclusive with awsSdkV3Client. * @property {DynamoDBClient} [awsSdkV3Client] - Optional AWS SDK v3 client to pass during DynamoDBProvider class instantiation. Mutually exclusive with clientConfig. */ -type DynamoPersistenceOptions = - | DynamoPersistenceOptionsWithClientConfig - | DynamoPersistenceOptionsWithClientInstance; +type DynamoDBPersistenceOptions = + | DynamoDBPersistenceOptionsWithClientConfig + | DynamoDBPersistenceOptionsWithClientInstance; -export type { DynamoPersistenceOptions }; +export type { + DynamoDBPersistenceOptionsBase, + DynamoDBPersistenceOptionsWithClientConfig, + DynamoDBPersistenceOptionsWithClientInstance, + DynamoDBPersistenceOptions, +}; diff --git a/packages/idempotency/tests/e2e/idempotencyDecorator.test.FunctionCode.ts b/packages/idempotency/tests/e2e/idempotencyDecorator.test.FunctionCode.ts deleted file mode 100644 index 9d6d0b4471..0000000000 --- a/packages/idempotency/tests/e2e/idempotencyDecorator.test.FunctionCode.ts +++ /dev/null @@ -1,127 +0,0 @@ -import type { Context } from 'aws-lambda'; -import { LambdaInterface } from '@aws-lambda-powertools/commons'; -import { idempotentFunction, idempotentLambdaHandler } from '../../src'; -import { Logger } from '../../../logger'; -import { DynamoDBPersistenceLayer } from '../../src/persistence/DynamoDBPersistenceLayer'; -import { IdempotencyConfig } from '../../src/'; - -const IDEMPOTENCY_TABLE_NAME = - process.env.IDEMPOTENCY_TABLE_NAME || 'table_name'; -const dynamoDBPersistenceLayer = new DynamoDBPersistenceLayer({ - tableName: IDEMPOTENCY_TABLE_NAME, -}); - -const ddbPersistenceLayerCustomized = new DynamoDBPersistenceLayer({ - tableName: IDEMPOTENCY_TABLE_NAME, - dataAttr: 'dataattr', - keyAttr: 'customId', - expiryAttr: 'expiryattr', - statusAttr: 'statusattr', - inProgressExpiryAttr: 'inprogressexpiryattr', - staticPkValue: 'staticpkvalue', - validationKeyAttr: 'validationkeyattr', -}); - -interface TestEvent { - [key: string]: string; -} - -interface EventRecords { - records: Record[]; -} - -class DefaultLambda implements LambdaInterface { - @idempotentLambdaHandler({ persistenceStore: dynamoDBPersistenceLayer }) - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore - public async handler(_event: Record, _context: Context): Promise { - logger.info(`Got test event: ${JSON.stringify(_event)}`); - // sleep to enforce error with parallel execution - await new Promise((resolve) => setTimeout(resolve, 3000)); - - return 'Hello World'; - } - - @idempotentLambdaHandler({ persistenceStore: ddbPersistenceLayerCustomized }) - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore - public async handlerCustomized( - _event: TestEvent, - _context: Context - ): Promise { - logger.info(`Got test event customized: ${JSON.stringify(_event)}`); - // sleep for 5 seconds - - return 'Hello World Customized'; - } - - @idempotentLambdaHandler({ persistenceStore: dynamoDBPersistenceLayer }) - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore - public async handlerFails( - _event: TestEvent, - _context: Context - ): Promise { - logger.info(`Got test event: ${JSON.stringify(_event)}`); - - throw new Error('Failed'); - } - - @idempotentLambdaHandler({ - persistenceStore: dynamoDBPersistenceLayer, - config: new IdempotencyConfig({ - eventKeyJmesPath: 'idempotencyKey', - throwOnNoIdempotencyKey: false, - }), - }) - public async handlerWithOptionalIdempoitencyKey( - _event: TestEvent, - _context: Context - ): Promise { - logger.info(`Got test event: ${JSON.stringify(_event)}`); - - return 'This should not be stored in DynamoDB'; - } -} - -const defaultLambda = new DefaultLambda(); -export const handler = defaultLambda.handler.bind(defaultLambda); -export const handlerCustomized = - defaultLambda.handlerCustomized.bind(defaultLambda); -export const handlerFails = defaultLambda.handlerFails.bind(defaultLambda); - -export const handlerWithOptionalIdempoitencyKey = - defaultLambda.handlerWithOptionalIdempoitencyKey.bind(defaultLambda); - -const logger = new Logger(); - -class LambdaWithKeywordArgument implements LambdaInterface { - public async handler( - _event: EventRecords, - _context: Context - ): Promise { - logger.info(`Got test event: ${JSON.stringify(_event)}`); - for (const record of _event.records) { - logger.info(`Processing event: ${JSON.stringify(record)}`); - await this.process(record); - } - - return 'Hello World Keyword Argument'; - } - - @idempotentFunction({ - persistenceStore: dynamoDBPersistenceLayer, - dataKeywordArgument: 'foo', - }) - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore - public async process(record: Record): string { - logger.info(`Processing inside: ${JSON.stringify(record)}`); - - return 'idempotent result: ' + record.foo; - } -} - -const lambdaWithKeywordArg = new LambdaWithKeywordArgument(); -export const handlerWithKeywordArgument = - lambdaWithKeywordArg.handler.bind(lambdaWithKeywordArg); diff --git a/packages/idempotency/tests/e2e/idempotencyDecorator.test.ts b/packages/idempotency/tests/e2e/idempotencyDecorator.test.ts deleted file mode 100644 index 9b2fb5c26a..0000000000 --- a/packages/idempotency/tests/e2e/idempotencyDecorator.test.ts +++ /dev/null @@ -1,331 +0,0 @@ -/** - * Test idempotency decorator - * - * @group e2e/idempotency - */ -import { v4 } from 'uuid'; -import { App, Stack } from 'aws-cdk-lib'; -import { DynamoDBClient } from '@aws-sdk/client-dynamodb'; -import { - generateUniqueName, - invokeFunction, - isValidRuntimeKey, -} from '../../../commons/tests/utils/e2eUtils'; -import { - RESOURCE_NAME_PREFIX, - SETUP_TIMEOUT, - TEARDOWN_TIMEOUT, - TEST_CASE_TIMEOUT, -} from './constants'; -import { - deployStack, - destroyStack, -} from '../../../commons/tests/utils/cdk-cli'; -import { LEVEL } from '../../../commons/tests/utils/InvocationLogs'; -import { GetCommand, ScanCommand } from '@aws-sdk/lib-dynamodb'; -import { createHash } from 'node:crypto'; -import { createIdempotencyResources } from '../helpers/idempotencyUtils'; - -const runtime: string = process.env.RUNTIME || 'nodejs18x'; - -if (!isValidRuntimeKey(runtime)) { - throw new Error(`Invalid runtime key value: ${runtime}`); -} - -const uuid = v4(); -const stackName = generateUniqueName( - RESOURCE_NAME_PREFIX, - uuid, - runtime, - 'Idempotency' -); -const decoratorFunctionFile = 'idempotencyDecorator.test.FunctionCode.ts'; - -const app = new App(); - -const ddb = new DynamoDBClient({ region: 'eu-west-1' }); -const stack = new Stack(app, stackName); - -const functionNameDefault = generateUniqueName( - RESOURCE_NAME_PREFIX, - uuid, - runtime, - 'default' -); -const ddbTableNameDefault = stackName + '-default-table'; -createIdempotencyResources( - stack, - runtime, - ddbTableNameDefault, - decoratorFunctionFile, - functionNameDefault, - 'handler' -); - -const functionNameCustom = generateUniqueName( - RESOURCE_NAME_PREFIX, - uuid, - runtime, - 'custom' -); -const ddbTableNameCustom = stackName + '-custom-table'; -createIdempotencyResources( - stack, - runtime, - ddbTableNameCustom, - decoratorFunctionFile, - functionNameCustom, - 'handlerCustomized', - 'customId' -); - -const functionNameKeywordArg = generateUniqueName( - RESOURCE_NAME_PREFIX, - uuid, - runtime, - 'keywordarg' -); -const ddbTableNameKeywordArg = stackName + '-keywordarg-table'; -createIdempotencyResources( - stack, - runtime, - ddbTableNameKeywordArg, - decoratorFunctionFile, - functionNameKeywordArg, - 'handlerWithKeywordArgument' -); - -const functionNameFails = generateUniqueName( - RESOURCE_NAME_PREFIX, - uuid, - runtime, - 'fails' -); -const ddbTableNameFails = stackName + '-fails-table'; -createIdempotencyResources( - stack, - runtime, - ddbTableNameFails, - decoratorFunctionFile, - functionNameFails, - 'handlerFails' -); - -const functionNameOptionalIdempotencyKey = generateUniqueName( - RESOURCE_NAME_PREFIX, - uuid, - runtime, - 'optionalIdempotencyKey' -); -const ddbTableNameOptionalIdempotencyKey = - stackName + '-optional-idempotencyKey-table'; -createIdempotencyResources( - stack, - runtime, - ddbTableNameOptionalIdempotencyKey, - decoratorFunctionFile, - functionNameOptionalIdempotencyKey, - 'handlerWithOptionalIdempoitencyKey' -); -describe('Idempotency e2e test decorator, default settings', () => { - beforeAll(async () => { - await deployStack(app, stack); - }, SETUP_TIMEOUT); - - test( - 'when called twice, it returns the same value without calling the inner function', - async () => { - const payload = { foo: 'baz' }; - const payloadHash = createHash('md5') - .update(JSON.stringify(payload)) - .digest('base64'); - - const invocationLogsSequential = await invokeFunction( - functionNameDefault, - 2, - 'SEQUENTIAL', - payload, - false - ); - // create dynamodb client to query the table and check the value - const result = await ddb.send( - new GetCommand({ - TableName: ddbTableNameDefault, - Key: { id: `${functionNameDefault}#${payloadHash}` }, - }) - ); - expect(result?.Item?.data).toEqual('Hello World'); - expect(result?.Item?.status).toEqual('COMPLETED'); - expect(result?.Item?.expiration).toBeGreaterThan(Date.now() / 1000); - // we log events inside the handler, so the 2nd invocation should not log anything - expect( - invocationLogsSequential[0].getFunctionLogs().toString() - ).toContain('Got test event'); - expect( - invocationLogsSequential[1].getFunctionLogs().toString() - ).not.toContain('Got test event'); - }, - TEST_CASE_TIMEOUT - ); - - test( - 'when called twice in parallel, it trows an error', - async () => { - const payload = { id: '123' }; - const payloadHash = createHash('md5') - .update(JSON.stringify(payload)) - .digest('base64'); - const invocationLogs = await invokeFunction( - functionNameDefault, - 2, - 'PARALLEL', - payload, - false - ); - - const result = await ddb.send( - new GetCommand({ - TableName: ddbTableNameDefault, - Key: { id: `${functionNameDefault}#${payloadHash}` }, - }) - ); - expect(result?.Item?.data).toEqual('Hello World'); - expect(result?.Item?.status).toEqual('COMPLETED'); - expect(result?.Item?.expiration).toBeGreaterThan(Date.now() / 1000); - expect( - invocationLogs[0].getFunctionLogs(LEVEL.ERROR).toString() - ).toContain( - 'There is already an execution in progress with idempotency key' - ); - }, - TEST_CASE_TIMEOUT - ); - - test( - 'when called with customized idempotency decorator, it creates ddb entry with custom attributes', - async () => { - const payload = { foo: 'baz' }; - const payloadHash = createHash('md5') - .update(JSON.stringify(payload)) - .digest('base64'); - - const invocationLogsCustmozed = await invokeFunction( - functionNameCustom, - 1, - 'PARALLEL', - payload, - false - ); - const result = await ddb.send( - new GetCommand({ - TableName: ddbTableNameCustom, - Key: { customId: `${functionNameCustom}#${payloadHash}` }, - }) - ); - expect(result?.Item?.dataattr).toEqual('Hello World Customized'); - expect(result?.Item?.statusattr).toEqual('COMPLETED'); - expect(result?.Item?.expiryattr).toBeGreaterThan(Date.now() / 1000); - expect(invocationLogsCustmozed[0].getFunctionLogs().toString()).toContain( - 'Got test event customized' - ); - }, - TEST_CASE_TIMEOUT - ); - - test( - 'when called with a function that fails, it creates ddb entry with error status', - async () => { - const payload = { foo: 'baz' }; - const payloadHash = createHash('md5') - .update(JSON.stringify(payload)) - .digest('base64'); - - await invokeFunction(functionNameFails, 1, 'PARALLEL', payload, false); - const result = await ddb.send( - new GetCommand({ - TableName: ddbTableNameFails, - Key: { id: `${functionNameFails}#${payloadHash}` }, - }) - ); - console.log(result); - expect(result?.Item).toBeUndefined(); - }, - TEST_CASE_TIMEOUT - ); - - test( - 'when called with a function that has keyword argument, it creates for every entry of keyword argument', - async () => { - const payloadArray = { - records: [ - { id: 1, foo: 'bar' }, - { id: 2, foo: 'baq' }, - { id: 3, foo: 'bar' }, - ], - }; - const payloadHashFirst = createHash('md5') - .update('"bar"') - .digest('base64'); - - await invokeFunction( - functionNameKeywordArg, - 2, - 'SEQUENTIAL', - payloadArray, - false - ); - const resultFirst = await ddb.send( - new GetCommand({ - TableName: ddbTableNameKeywordArg, - Key: { id: `${functionNameKeywordArg}#${payloadHashFirst}` }, - }) - ); - console.log(resultFirst); - expect(resultFirst?.Item?.data).toEqual('idempotent result: bar'); - expect(resultFirst?.Item?.status).toEqual('COMPLETED'); - expect(resultFirst?.Item?.expiration).toBeGreaterThan(Date.now() / 1000); - - const payloadHashSecond = createHash('md5') - .update('"baq"') - .digest('base64'); - const resultSecond = await ddb.send( - new GetCommand({ - TableName: ddbTableNameKeywordArg, - Key: { id: `${functionNameKeywordArg}#${payloadHashSecond}` }, - }) - ); - console.log(resultSecond); - expect(resultSecond?.Item?.data).toEqual('idempotent result: baq'); - expect(resultSecond?.Item?.status).toEqual('COMPLETED'); - expect(resultSecond?.Item?.expiration).toBeGreaterThan(Date.now() / 1000); - }, - TEST_CASE_TIMEOUT - ); - - test( - 'when called with a function with optional idempotency key and thorwOnNoIdempotencyKey is false, it does not create ddb entry', - async () => { - const payload = { foo: 'baz' }; // we set eventKeyJmesPath: 'idempotencyKey' in the idempotency configuration - await invokeFunction( - functionNameOptionalIdempotencyKey, - 2, - 'PARALLEL', - payload, - false - ); - const result = await ddb.send( - new ScanCommand({ - TableName: ddbTableNameOptionalIdempotencyKey, - }) - ); - expect(result?.Items).toEqual([]); - }, - TEST_CASE_TIMEOUT - ); - - afterAll(async () => { - if (!process.env.DISABLE_TEARDOWN) { - await destroyStack(app, stack); - } - }, TEARDOWN_TIMEOUT); -}); diff --git a/packages/idempotency/tests/unit/IdempotencyHandler.test.ts b/packages/idempotency/tests/unit/IdempotencyHandler.test.ts index 5ff0558189..4650e12543 100644 --- a/packages/idempotency/tests/unit/IdempotencyHandler.test.ts +++ b/packages/idempotency/tests/unit/IdempotencyHandler.test.ts @@ -8,7 +8,7 @@ import { IdempotencyInconsistentStateError, IdempotencyItemAlreadyExistsError, IdempotencyPersistenceLayerError, -} from '../../src/Exceptions'; +} from '../../src/errors'; import { IdempotencyRecordStatus } from '../../src/types'; import { BasePersistenceLayer, IdempotencyRecord } from '../../src/persistence'; import { IdempotencyHandler } from '../../src/IdempotencyHandler'; @@ -165,16 +165,20 @@ describe('Class IdempotencyHandler', () => { }); test('when persistences store throws any error, it wraps the error to IdempotencyPersistencesLayerError', async () => { + const innerError = new Error('Some error'); const mockSaveInProgress = jest .spyOn(mockIdempotencyOptions.persistenceStore, 'saveInProgress') - .mockRejectedValue(new Error('Some error')); + .mockRejectedValue(innerError); const mockDetermineResultFromIdempotencyRecord = jest .spyOn(IdempotencyHandler, 'determineResultFromIdempotencyRecord') .mockImplementation(() => 'result'); - await expect(idempotentHandler.processIdempotency()).rejects.toThrow( - IdempotencyPersistenceLayerError + new IdempotencyPersistenceLayerError( + 'Failed to save record in progress', + innerError + ) ); + expect(mockSaveInProgress).toHaveBeenCalledTimes(1); expect(mockDetermineResultFromIdempotencyRecord).toHaveBeenCalledTimes(0); }); @@ -323,7 +327,9 @@ describe('Class IdempotencyHandler', () => { .mockRejectedValue(new Error('Some error')); await expect(idempotentHandler.getFunctionResult()).rejects.toThrow( - IdempotencyPersistenceLayerError + new IdempotencyPersistenceLayerError( + 'Failed to delete record from idempotency store. This error was caused by: Some error.' + ) ); expect(mockDeleteInProgress).toHaveBeenCalledTimes(1); }); diff --git a/packages/idempotency/tests/unit/idempotentDecorator.test.ts b/packages/idempotency/tests/unit/idempotentDecorator.test.ts deleted file mode 100644 index 9a1b2dc643..0000000000 --- a/packages/idempotency/tests/unit/idempotentDecorator.test.ts +++ /dev/null @@ -1,275 +0,0 @@ -/** - * Test Function Wrapper - * - * @group unit/idempotency/decorator - */ - -import { BasePersistenceLayer, IdempotencyRecord } from '../../src/persistence'; -import { idempotentFunction, idempotentLambdaHandler } from '../../src/'; -import type { IdempotencyRecordOptions } from '../../src/types'; -import { IdempotencyRecordStatus } from '../../src/types'; -import { - IdempotencyAlreadyInProgressError, - IdempotencyInconsistentStateError, - IdempotencyItemAlreadyExistsError, - IdempotencyPersistenceLayerError, -} from '../../src/Exceptions'; -import { IdempotencyConfig } from '../../src'; -import { Context } from 'aws-lambda'; -import { helloworldContext } from '@aws-lambda-powertools/commons/lib/samples/resources/contexts'; - -const mockSaveInProgress = jest - .spyOn(BasePersistenceLayer.prototype, 'saveInProgress') - .mockImplementation(); -const mockSaveSuccess = jest - .spyOn(BasePersistenceLayer.prototype, 'saveSuccess') - .mockImplementation(); -const mockGetRecord = jest - .spyOn(BasePersistenceLayer.prototype, 'getRecord') - .mockImplementation(); - -const dummyContext = helloworldContext; - -const mockConfig: IdempotencyConfig = new IdempotencyConfig({}); - -class PersistenceLayerTestClass extends BasePersistenceLayer { - protected _deleteRecord = jest.fn(); - protected _getRecord = jest.fn(); - protected _putRecord = jest.fn(); - protected _updateRecord = jest.fn(); -} - -const functionalityToDecorate = jest.fn(); - -class TestinClassWithLambdaHandler { - @idempotentLambdaHandler({ - persistenceStore: new PersistenceLayerTestClass(), - }) - // eslint-disable-next-line @typescript-eslint/no-unused-vars - public testing(record: Record, context: Context): string { - functionalityToDecorate(record); - - return 'Hi'; - } -} - -class TestingClassWithFunctionDecorator { - public handler(record: Record, context: Context): string { - mockConfig.registerLambdaContext(context); - - return this.proccessRecord(record); - } - - @idempotentFunction({ - persistenceStore: new PersistenceLayerTestClass(), - dataKeywordArgument: 'testingKey', - config: mockConfig, - }) - public proccessRecord(record: Record): string { - functionalityToDecorate(record); - - return 'Processed Record'; - } -} - -describe('Given a class with a function to decorate', (classWithLambdaHandler = new TestinClassWithLambdaHandler(), classWithFunctionDecorator = new TestingClassWithFunctionDecorator()) => { - const keyValueToBeSaved = 'thisWillBeSaved'; - const inputRecord = { - testingKey: keyValueToBeSaved, - otherKey: 'thisWillNot', - }; - beforeEach(() => jest.clearAllMocks()); - - describe('When wrapping a function with no previous executions', () => { - beforeEach(async () => { - await classWithFunctionDecorator.handler(inputRecord, dummyContext); - }); - - test('Then it will save the record to INPROGRESS', () => { - expect(mockSaveInProgress).toBeCalledWith( - keyValueToBeSaved, - dummyContext.getRemainingTimeInMillis() - ); - }); - - test('Then it will call the function that was decorated', () => { - expect(functionalityToDecorate).toBeCalledWith(inputRecord); - }); - - test('Then it will save the record to COMPLETED with function return value', () => { - expect(mockSaveSuccess).toBeCalledWith( - keyValueToBeSaved, - 'Processed Record' - ); - }); - }); - describe('When wrapping a function with no previous executions', () => { - beforeEach(async () => { - await classWithLambdaHandler.testing(inputRecord, dummyContext); - }); - - test('Then it will save the record to INPROGRESS', () => { - expect(mockSaveInProgress).toBeCalledWith( - inputRecord, - dummyContext.getRemainingTimeInMillis() - ); - }); - - test('Then it will call the function that was decorated', () => { - expect(functionalityToDecorate).toBeCalledWith(inputRecord); - }); - - test('Then it will save the record to COMPLETED with function return value', () => { - expect(mockSaveSuccess).toBeCalledWith(inputRecord, 'Hi'); - }); - }); - - describe('When decorating a function with previous execution that is INPROGRESS', () => { - let resultingError: Error; - beforeEach(async () => { - mockSaveInProgress.mockRejectedValue( - new IdempotencyItemAlreadyExistsError() - ); - const idempotencyOptions: IdempotencyRecordOptions = { - idempotencyKey: 'key', - status: IdempotencyRecordStatus.INPROGRESS, - }; - mockGetRecord.mockResolvedValue( - new IdempotencyRecord(idempotencyOptions) - ); - try { - await classWithLambdaHandler.testing(inputRecord, dummyContext); - } catch (e) { - resultingError = e as Error; - } - }); - - test('Then it will attempt to save the record to INPROGRESS', () => { - expect(mockSaveInProgress).toBeCalledWith( - inputRecord, - dummyContext.getRemainingTimeInMillis() - ); - }); - - test('Then it will get the previous execution record', () => { - expect(mockGetRecord).toBeCalledWith(inputRecord); - }); - - test('Then it will not call the function that was decorated', () => { - expect(functionalityToDecorate).not.toBeCalled(); - }); - - test('Then an IdempotencyAlreadyInProgressError is thrown', () => { - expect(resultingError).toBeInstanceOf(IdempotencyAlreadyInProgressError); - }); - }); - - describe('When decorating a function with previous execution that is EXPIRED', () => { - let resultingError: Error; - beforeEach(async () => { - mockSaveInProgress.mockRejectedValue( - new IdempotencyItemAlreadyExistsError() - ); - const idempotencyOptions: IdempotencyRecordOptions = { - idempotencyKey: 'key', - status: IdempotencyRecordStatus.EXPIRED, - }; - mockGetRecord.mockResolvedValue( - new IdempotencyRecord(idempotencyOptions) - ); - try { - await classWithLambdaHandler.testing(inputRecord, dummyContext); - } catch (e) { - resultingError = e as Error; - } - }); - - test('Then it will attempt to save the record to INPROGRESS', () => { - expect(mockSaveInProgress).toBeCalledWith( - inputRecord, - dummyContext.getRemainingTimeInMillis() - ); - }); - - test('Then it will get the previous execution record', () => { - expect(mockGetRecord).toBeCalledWith(inputRecord); - }); - - test('Then it will not call the function that was decorated', () => { - expect(functionalityToDecorate).not.toBeCalled(); - }); - - test('Then an IdempotencyInconsistentStateError is thrown', () => { - expect(resultingError).toBeInstanceOf(IdempotencyInconsistentStateError); - }); - }); - - describe('When wrapping a function with previous execution that is COMPLETED', () => { - beforeEach(async () => { - mockSaveInProgress.mockRejectedValue( - new IdempotencyItemAlreadyExistsError() - ); - const idempotencyOptions: IdempotencyRecordOptions = { - idempotencyKey: 'key', - status: IdempotencyRecordStatus.COMPLETED, - }; - - mockGetRecord.mockResolvedValue( - new IdempotencyRecord(idempotencyOptions) - ); - await classWithLambdaHandler.testing(inputRecord, dummyContext); - }); - - test('Then it will attempt to save the record to INPROGRESS', () => { - expect(mockSaveInProgress).toBeCalledWith( - inputRecord, - dummyContext.getRemainingTimeInMillis() - ); - }); - - test('Then it will get the previous execution record', () => { - expect(mockGetRecord).toBeCalledWith(inputRecord); - }); - - test('Then it will not call decorated functionality', () => { - expect(functionalityToDecorate).not.toBeCalledWith(inputRecord); - }); - }); - - describe('When wrapping a function with issues saving the record', () => { - class TestinClassWithLambdaHandlerWithConfig { - @idempotentLambdaHandler({ - persistenceStore: new PersistenceLayerTestClass(), - config: new IdempotencyConfig({ lambdaContext: dummyContext }), - }) - public testing(record: Record): string { - functionalityToDecorate(record); - - return 'Hi'; - } - } - - let resultingError: Error; - beforeEach(async () => { - mockSaveInProgress.mockRejectedValue(new Error('RandomError')); - const classWithLambdaHandlerWithConfig = - new TestinClassWithLambdaHandlerWithConfig(); - try { - await classWithLambdaHandlerWithConfig.testing(inputRecord); - } catch (e) { - resultingError = e as Error; - } - }); - - test('Then it will attempt to save the record to INPROGRESS', () => { - expect(mockSaveInProgress).toBeCalledWith( - inputRecord, - dummyContext.getRemainingTimeInMillis() - ); - }); - - test('Then an IdempotencyPersistenceLayerError is thrown', () => { - expect(resultingError).toBeInstanceOf(IdempotencyPersistenceLayerError); - }); - }); -}); diff --git a/packages/idempotency/tests/unit/makeFunctionIdempotent.test.ts b/packages/idempotency/tests/unit/makeFunctionIdempotent.test.ts index e5fb2f6037..8ae1a1687a 100644 --- a/packages/idempotency/tests/unit/makeFunctionIdempotent.test.ts +++ b/packages/idempotency/tests/unit/makeFunctionIdempotent.test.ts @@ -16,7 +16,7 @@ import { IdempotencyInconsistentStateError, IdempotencyItemAlreadyExistsError, IdempotencyPersistenceLayerError, -} from '../../src/Exceptions'; +} from '../../src/errors'; import { IdempotencyConfig } from '../../src'; import { Context } from 'aws-lambda'; diff --git a/packages/idempotency/tests/unit/makeHandlerIdempotent.test.ts b/packages/idempotency/tests/unit/makeHandlerIdempotent.test.ts index b36dbaf1be..09c0c22f80 100644 --- a/packages/idempotency/tests/unit/makeHandlerIdempotent.test.ts +++ b/packages/idempotency/tests/unit/makeHandlerIdempotent.test.ts @@ -12,7 +12,7 @@ import { IdempotencyInconsistentStateError, IdempotencyItemAlreadyExistsError, IdempotencyPersistenceLayerError, -} from '../../src/Exceptions'; +} from '../../src/errors'; import { IdempotencyConfig } from '../../src/'; import middy from '@middy/core'; import { MAX_RETRIES } from '../../src/constants'; @@ -115,7 +115,7 @@ describe('Middleware: makeHandlerIdempotent', () => { // Act && Assess await expect(handler(event, context)).rejects.toThrowError( new IdempotencyPersistenceLayerError( - 'Failed to save in progress record to idempotency store' + 'Failed to save in progress record to idempotency store. This error was caused by: Something went wrong.' ) ); }); @@ -131,7 +131,7 @@ describe('Middleware: makeHandlerIdempotent', () => { // Act && Assess await expect(handler(event, context)).rejects.toThrowError( new IdempotencyPersistenceLayerError( - 'Failed to update success record to idempotency store' + 'Failed to update success record to idempotency store. This error was caused by: Something went wrong.' ) ); }); @@ -149,7 +149,7 @@ describe('Middleware: makeHandlerIdempotent', () => { // Act && Assess await expect(handler(event, context)).rejects.toThrow( new IdempotencyPersistenceLayerError( - 'Failed to delete record from idempotency store' + 'Failed to delete record from idempotency store. This error was caused by: Something went wrong.' ) ); }); diff --git a/packages/idempotency/tests/unit/persistence/BasePersistenceLayer.test.ts b/packages/idempotency/tests/unit/persistence/BasePersistenceLayer.test.ts index 9cc3dc63f5..848d3258a2 100644 --- a/packages/idempotency/tests/unit/persistence/BasePersistenceLayer.test.ts +++ b/packages/idempotency/tests/unit/persistence/BasePersistenceLayer.test.ts @@ -12,7 +12,7 @@ import { import { IdempotencyItemAlreadyExistsError, IdempotencyValidationError, -} from '../../../src/Exceptions'; +} from '../../../src/errors'; import type { IdempotencyConfigOptions } from '../../../src/types'; import { IdempotencyRecordStatus } from '../../../src/types'; diff --git a/packages/idempotency/tests/unit/persistence/DynamoDbPersistenceLayer.test.ts b/packages/idempotency/tests/unit/persistence/DynamoDbPersistenceLayer.test.ts index b8321bd44a..204b519dba 100644 --- a/packages/idempotency/tests/unit/persistence/DynamoDbPersistenceLayer.test.ts +++ b/packages/idempotency/tests/unit/persistence/DynamoDbPersistenceLayer.test.ts @@ -7,9 +7,9 @@ import { DynamoDBPersistenceLayer } from '../../../src/persistence/DynamoDBPersi import { IdempotencyItemAlreadyExistsError, IdempotencyItemNotFoundError, -} from '../../../src/Exceptions'; +} from '../../../src/errors'; import { IdempotencyRecord } from '../../../src/persistence'; -import type { DynamoPersistenceOptions } from '../../../src/types'; +import type { DynamoDBPersistenceOptions } from '../../../src/types'; import { IdempotencyRecordStatus } from '../../../src/types'; import { DynamoDBClient, @@ -92,7 +92,7 @@ describe('Class: DynamoDBPersistenceLayer', () => { test('when instantiated with specific options it creates an instance with correct values', () => { // Prepare - const testDynamoDBPersistenceLayerOptions: DynamoPersistenceOptions = { + const testDynamoDBPersistenceLayerOptions: DynamoDBPersistenceOptions = { tableName: dummyTableName, keyAttr: dummyKey, statusAttr: 'someStatusAttr', @@ -129,7 +129,7 @@ describe('Class: DynamoDBPersistenceLayer', () => { test('when instantiated with a sortKeyAttr that has same value of keyAttr, it throws', () => { // Prepare - const testDynamoDBPersistenceLayerOptions: DynamoPersistenceOptions = { + const testDynamoDBPersistenceLayerOptions: DynamoDBPersistenceOptions = { tableName: dummyTableName, keyAttr: dummyKey, sortKeyAttr: dummyKey, diff --git a/packages/idempotency/tests/unit/persistence/IdempotencyRecord.test.ts b/packages/idempotency/tests/unit/persistence/IdempotencyRecord.test.ts index 52063066d6..c655696caf 100644 --- a/packages/idempotency/tests/unit/persistence/IdempotencyRecord.test.ts +++ b/packages/idempotency/tests/unit/persistence/IdempotencyRecord.test.ts @@ -3,7 +3,7 @@ * * @group unit/idempotency/persistence/idempotencyRecord */ -import { IdempotencyInvalidStatusError } from '../../../src/Exceptions'; +import { IdempotencyInvalidStatusError } from '../../../src/errors'; import { IdempotencyRecord } from '../../../src/persistence'; import { IdempotencyRecordStatus } from '../../../src/types'; diff --git a/packages/idempotency/typedoc.json b/packages/idempotency/typedoc.json index b983e7c7b4..e2ece84d17 100644 --- a/packages/idempotency/typedoc.json +++ b/packages/idempotency/typedoc.json @@ -6,7 +6,8 @@ "./src/index.ts", "./src/types/index.ts", "./src/middleware/index.ts", - "./src/persistence/index.ts" + "./src/persistence/index.ts", + "./src/persistence/DynamoDBPersistenceLayer.ts", ], "readme": "README.md" } \ No newline at end of file diff --git a/packages/logger/CHANGELOG.md b/packages/logger/CHANGELOG.md index a6b18d05b3..214db969c0 100644 --- a/packages/logger/CHANGELOG.md +++ b/packages/logger/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [1.11.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v1.10.0...v1.11.0) (2023-06-29) + +**Note:** Version bump only for package @aws-lambda-powertools/logger + # [1.10.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v1.9.0...v1.10.0) (2023-06-23) ### Bug Fixes diff --git a/packages/logger/README.md b/packages/logger/README.md index 8ae8220792..ff8b873201 100644 --- a/packages/logger/README.md +++ b/packages/logger/README.md @@ -30,7 +30,7 @@ You can use the library in both TypeScript and JavaScript code bases. * **[Tracer](https://docs.powertools.aws.dev/lambda-typescript/latest/core/tracer/)** - Utilities to trace Lambda function handlers, and both synchronous and asynchronous functions * **[Logger](https://docs.powertools.aws.dev/lambda-typescript/latest/core/logger/)** - Structured logging made easier, and a middleware to enrich log items with key details of the Lambda context * **[Metrics](https://docs.powertools.aws.dev/lambda-typescript/latest/core/metrics/)** - Custom Metrics created asynchronously via CloudWatch Embedded Metric Format (EMF) -* **[Parameters (beta)](https://docs.powertools.aws.dev/lambda-typescript/latest/utilities/parameters/)** - High-level functions to retrieve one or more parameters from AWS SSM, Secrets Manager, AppConfig, and DynamoDB +* **[Parameters](https://docs.powertools.aws.dev/lambda-typescript/latest/utilities/parameters/)** - High-level functions to retrieve one or more parameters from AWS SSM, Secrets Manager, AppConfig, and DynamoDB ## Getting started @@ -97,6 +97,7 @@ The following companies, among others, use Powertools: * [Bailey Nelson](https://www.baileynelson.com.au) * [Perfect Post](https://www.perfectpost.fr) * [Sennder](https://sennder.com/) +* [Certible](https://www.certible.com/) ### Sharing your work diff --git a/packages/logger/package.json b/packages/logger/package.json index 191b856752..fe3ba823fb 100644 --- a/packages/logger/package.json +++ b/packages/logger/package.json @@ -1,6 +1,6 @@ { "name": "@aws-lambda-powertools/logger", - "version": "1.10.0", + "version": "1.11.0", "description": "The logging package for the Powertools for AWS Lambda (TypeScript) library", "author": { "name": "Amazon Web Services", @@ -45,7 +45,7 @@ "url": "https://github.com/aws-powertools/powertools-lambda-typescript/issues" }, "dependencies": { - "@aws-lambda-powertools/commons": "^1.10.0", + "@aws-lambda-powertools/commons": "^1.11.0", "lodash.merge": "^4.6.2" }, "keywords": [ diff --git a/packages/metrics/CHANGELOG.md b/packages/metrics/CHANGELOG.md index 7215f9eafe..56d75ac490 100644 --- a/packages/metrics/CHANGELOG.md +++ b/packages/metrics/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [1.11.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v1.10.0...v1.11.0) (2023-06-29) + +**Note:** Version bump only for package @aws-lambda-powertools/metrics + # [1.10.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v1.9.0...v1.10.0) (2023-06-23) ### Bug Fixes diff --git a/packages/metrics/README.md b/packages/metrics/README.md index 55b790dc15..3df94a668a 100644 --- a/packages/metrics/README.md +++ b/packages/metrics/README.md @@ -30,7 +30,7 @@ You can use the library in both TypeScript and JavaScript code bases. * **[Tracer](https://docs.powertools.aws.dev/lambda-typescript/latest/core/tracer/)** - Utilities to trace Lambda function handlers, and both synchronous and asynchronous functions * **[Logger](https://docs.powertools.aws.dev/lambda-typescript/latest/core/logger/)** - Structured logging made easier, and a middleware to enrich log items with key details of the Lambda context * **[Metrics](https://docs.powertools.aws.dev/lambda-typescript/latest/core/metrics/)** - Custom Metrics created asynchronously via CloudWatch Embedded Metric Format (EMF) -* **[Parameters (beta)](https://docs.powertools.aws.dev/lambda-typescript/latest/utilities/parameters/)** - High-level functions to retrieve one or more parameters from AWS SSM, Secrets Manager, AppConfig, and DynamoDB +* **[Parameters](https://docs.powertools.aws.dev/lambda-typescript/latest/utilities/parameters/)** - High-level functions to retrieve one or more parameters from AWS SSM, Secrets Manager, AppConfig, and DynamoDB ## Getting started @@ -96,6 +96,7 @@ The following companies, among others, use Powertools: * [Bailey Nelson](https://www.baileynelson.com.au) * [Perfect Post](https://www.perfectpost.fr) * [Sennder](https://sennder.com/) +* [Certible](https://www.certible.com/) ### Sharing your work diff --git a/packages/metrics/package.json b/packages/metrics/package.json index 119d05658d..89871fbd83 100644 --- a/packages/metrics/package.json +++ b/packages/metrics/package.json @@ -1,6 +1,6 @@ { "name": "@aws-lambda-powertools/metrics", - "version": "1.10.0", + "version": "1.11.0", "description": "The metrics package for the Powertools for AWS Lambda (TypeScript) library", "author": { "name": "Amazon Web Services", @@ -32,7 +32,7 @@ "main": "./lib/index.js", "types": "./lib/index.d.ts", "devDependencies": { - "@aws-sdk/client-cloudwatch": "^3.316.0", + "@aws-sdk/client-cloudwatch": "^3.360.0", "@types/promise-retry": "^1.1.3", "promise-retry": "^2.0.1" }, @@ -47,7 +47,7 @@ "url": "https://github.com/aws-powertools/powertools-lambda-typescript/issues" }, "dependencies": { - "@aws-lambda-powertools/commons": "^1.10.0" + "@aws-lambda-powertools/commons": "^1.11.0" }, "keywords": [ "aws", diff --git a/packages/parameters/CHANGELOG.md b/packages/parameters/CHANGELOG.md index 576ec79239..46731a556d 100644 --- a/packages/parameters/CHANGELOG.md +++ b/packages/parameters/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [1.11.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v1.10.0...v1.11.0) (2023-06-29) + +**Note:** Version bump only for package @aws-lambda-powertools/parameters + # [1.10.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v1.9.0...v1.10.0) (2023-06-23) ### Features diff --git a/packages/parameters/README.md b/packages/parameters/README.md index 79a7984964..b4c041c26e 100644 --- a/packages/parameters/README.md +++ b/packages/parameters/README.md @@ -1,21 +1,16 @@ # Powertools for AWS Lambda (TypeScript) -| ⚠️ **WARNING: Do not use this utility in production just yet!** ⚠️ | -| :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| **This utility is currently released as beta developer preview** and is intended strictly for feedback and testing purposes **and not for production workloads**.. The version and all future versions tagged with the `-beta` suffix should be treated as not stable. Up until before the [General Availability release](https://github.com/aws-powertools/powertools-lambda-typescript/milestone/10) we might introduce significant breaking changes and improvements in response to customers feedback. | _ | - -Powertools for AWS Lambda (TypeScript) is a developer toolkit to implement Serverless [best practices and increase developer velocity](https://docs.powertools.aws.dev/lambda-typescript/latest/#features). +Powertools for AWS Lambda (TypeScript) is a developer toolkit to implement Serverless [best practices and increase developer velocity](https://docs.powertools.aws.dev/lambda/typescript/latest/#features). You can use the package in both TypeScript and JavaScript code bases. - [Intro](#intro) - [Key features](#key-features) - [Usage](#usage) - - [SSMProvider](#ssmprovider) - - [Fetching parameters](#fetching-parameters) - - [SecretsProvider](#secretsprovider) - - [DynamoDBProvider](#dynamodbprovider) - - [AppConfigProvider](#appconfigprovider) + - [Fetching parameters from AWS SSM Parameter Store](#fetching-parameters-from-aws-ssm-parameter-store) + - [Getting secrets from Amazon Secrets Manager](#getting-secrets-from-amazon-secrets-manager) + - [Retrieving values from Amazon DynamoDB](#retrieving-values-from-amazon-dynamodb) + - [Fetching configs from AWS AppConfig](#fetching-configs-from-aws-appconfig) - [Contribute](#contribute) - [Roadmap](#roadmap) - [Connect](#connect) @@ -39,7 +34,7 @@ The Parameters utility provides high-level functions to retrieve one or multiple ## Usage -### SSMProvider +### Fetching parameters from AWS SSM Parameter Store To get started, install the library and the corresponding AWS SDK for JavaScript v3: @@ -47,9 +42,7 @@ To get started, install the library and the corresponding AWS SDK for JavaScript npm install @aws-lambda-powertools/parameters @aws-sdk/client-ssm ``` -Next, review the IAM permissions attached to your AWS Lambda function and make sure you allow the [actions detailed](https://docs.powertools.aws.dev/lambda-typescript/1.9.0/utilities/parameters/#iam-permissions) in the documentation of the utility. - -#### Fetching parameters +Next, review the IAM permissions attached to your AWS Lambda function and make sure you allow the [actions detailed](https://docs.powertools.aws.dev/lambda/typescript/latest/utilities/parameters/#iam-permissions) in the documentation of the utility. You can retrieve a single parameter using the `getParameter` high-level function. @@ -105,9 +98,9 @@ export const handler = async (): Promise => { }; ``` -Check the [docs](https://docs.powertools.aws.dev/lambda-typescript/latest/utilities/parameters/#fetching-parameters) for more examples, and [the advanced section](https://docs.powertools.aws.dev/lambda-typescript/latest/utilities/parameters/#advanced) for details about caching, transforms, customizing the underlying SDK, and more. +Check the [docs](https://docs.powertools.aws.dev/lambda/typescript/latest/utilities/parameters/#fetching-parameters) for more examples, and [the advanced section](https://docs.powertools.aws.dev/lambda/typescript/latest/utilities/parameters/#advanced) for details about caching, transforms, customizing the underlying SDK, and more. -### SecretsProvider +### Getting secrets from Amazon Secrets Manager To get started, install the library and the corresponding AWS SDK for JavaScript v3: @@ -115,7 +108,7 @@ To get started, install the library and the corresponding AWS SDK for JavaScript npm install @aws-lambda-powertools/parameters @aws-sdk/client-secrets-manager ``` -Next, review the IAM permissions attached to your AWS Lambda function and make sure you allow the [actions detailed](https://docs.powertools.aws.dev/lambda-typescript/1.9.0/utilities/parameters/#iam-permissions) in the documentation of the utility. +Next, review the IAM permissions attached to your AWS Lambda function and make sure you allow the [actions detailed](https://docs.powertools.aws.dev/lambda/typescript/latest/utilities/parameters/#iam-permissions) in the documentation of the utility. You can fetch secrets stored in Secrets Manager using the `getSecret` function: @@ -129,9 +122,9 @@ export const handler = async (): Promise => { }; ``` -Check the [docs](https://docs.powertools.aws.dev/lambda-typescript/latest/utilities/parameters/#fetching-secrets) for more examples, and [the advanced section](https://docs.powertools.aws.dev/lambda-typescript/latest/utilities/parameters/#advanced) for details about caching, transforms, customizing the underlying SDK, and more. +Check the [docs](https://docs.powertools.aws.dev/lambda/typescript/latest/utilities/parameters/#fetching-secrets) for more examples, and [the advanced section](https://docs.powertools.aws.dev/lambda/typescript/latest/utilities/parameters/#advanced) for details about caching, transforms, customizing the underlying SDK, and more. -### DynamoDBProvider +### Retrieving values from Amazon DynamoDB To get started, install the library and the corresponding AWS SDK for JavaScript v3: @@ -139,7 +132,7 @@ To get started, install the library and the corresponding AWS SDK for JavaScript npm install @aws-lambda-powertools/parameters @aws-sdk/client-dynamodb @aws-sdk/util-dynamodb ``` -Next, review the IAM permissions attached to your AWS Lambda function and make sure you allow the [actions detailed](https://docs.powertools.aws.dev/lambda-typescript/1.9.0/utilities/parameters/#iam-permissions) in the documentation of the utility. +Next, review the IAM permissions attached to your AWS Lambda function and make sure you allow the [actions detailed](https://docs.powertools.aws.dev/lambda/typescript/latest/utilities/parameters/#iam-permissions) in the documentation of the utility. You can retrieve a single parameter from DynamoDB using the `DynamoDBProvider.get()` method: @@ -176,10 +169,10 @@ export const handler = async (): Promise => { }; ``` -Check the [docs](https://docs.powertools.aws.dev/lambda-typescript/latest/utilities/parameters/#fetching-secrets) for more examples, and [the advanced section](https://docs.powertools.aws.dev/lambda-typescript/latest/utilities/parameters/#advanced) for details about caching, transforms, customizing the underlying SDK, and more. +Check the [docs](https://docs.powertools.aws.dev/lambda/typescript/latest/utilities/parameters/#fetching-secrets) for more examples, and [the advanced section](https://docs.powertools.aws.dev/lambda/typescript/latest/utilities/parameters/#advanced) for details about caching, transforms, customizing the underlying SDK, and more. -### AppConfigProvider +### Fetching configs from AWS AppConfig To get started, install the library and the corresponding AWS SDK for JavaScript v3: @@ -187,7 +180,7 @@ To get started, install the library and the corresponding AWS SDK for JavaScript npm install @aws-lambda-powertools/parameters @aws-sdk/client-appconfigdata ``` -Next, review the IAM permissions attached to your AWS Lambda function and make sure you allow the [actions detailed](https://docs.powertools.aws.dev/lambda-typescript/1.9.0/utilities/parameters/#iam-permissions) in the documentation of the utility. +Next, review the IAM permissions attached to your AWS Lambda function and make sure you allow the [actions detailed](https://docs.powertools.aws.dev/lambda/typescript/latest/utilities/parameters/#iam-permissions) in the documentation of the utility. You can fetch application configurations in AWS AppConfig using the `getAppConfig` function: @@ -204,7 +197,7 @@ export const handler = async (): Promise => { }; ``` -Check the [docs](https://docs.powertools.aws.dev/lambda-typescript/latest/utilities/parameters/#fetching-app-configurations) for more examples, and [the advanced section](https://docs.powertools.aws.dev/lambda-typescript/latest/utilities/parameters/#advanced) for details about caching, transforms, customizing the underlying SDK, and more. +Check the [docs](https://docs.powertools.aws.dev/lambda/typescript/latest/utilities/parameters/#fetching-app-configurations) for more examples, and [the advanced section](https://docs.powertools.aws.dev/lambda/typescript/latest/utilities/parameters/#advanced) for details about caching, transforms, customizing the underlying SDK, and more. ## Contribute @@ -212,7 +205,7 @@ If you are interested in contributing to this project, please refer to our [Cont ## Roadmap -[The roadmap](https://docs.powertools.aws.dev/lambda-typescript/latest/roadmap/) of Powertools for AWS Lambda (TypeScript) is driven by customers’ demand. +[The roadmap](https://docs.powertools.aws.dev/lambda/typescript/latest/roadmap/) of Powertools for AWS Lambda (TypeScript) is driven by customers’ demand. Help us prioritize upcoming functionalities or utilities by [upvoting existing RFCs and feature requests](https://github.com/aws-powertools/powertools-lambda-typescript/issues), or [creating new ones](https://github.com/aws-powertools/powertools-lambda-typescript/issues/new/choose), in this GitHub repository. ## Connect @@ -235,10 +228,11 @@ The following companies, among others, use Powertools: * [Bailey Nelson](https://www.baileynelson.com.au) * [Perfect Post](https://www.perfectpost.fr) * [Sennder](https://sennder.com/) +* [Certible](https://www.certible.com/) ### Sharing your work -Share what you did with Powertools for AWS Lambda (TypeScript) 💞💞. Blog post, workshops, presentation, sample apps and others. Check out what the community has already shared about Powertools for AWS Lambda (TypeScript) [here](https://docs.powertools.aws.dev/lambda-typescript/latest/we_made_this). +Share what you did with Powertools for AWS Lambda (TypeScript) 💞💞. Blog post, workshops, presentation, sample apps and others. Check out what the community has already shared about Powertools for AWS Lambda (TypeScript) [here](https://docs.powertools.aws.dev/lambda/typescript/latest/we_made_this). ### Using Lambda Layer diff --git a/packages/parameters/package.json b/packages/parameters/package.json index 227d50e13e..86e0fb927c 100644 --- a/packages/parameters/package.json +++ b/packages/parameters/package.json @@ -1,6 +1,6 @@ { "name": "@aws-lambda-powertools/parameters", - "version": "1.10.0", + "version": "1.11.0", "description": "The parameters package for the Powertools for AWS Lambda (TypeScript) library", "author": { "name": "Amazon Web Services", @@ -138,16 +138,16 @@ "nodejs" ], "devDependencies": { - "@aws-sdk/client-appconfigdata": "^3.241.0", - "@aws-sdk/client-dynamodb": "^3.245.0", - "@aws-sdk/client-secrets-manager": "^3.238.0", - "@aws-sdk/client-ssm": "^3.244.0", - "@aws-sdk/util-dynamodb": "^3.245.0", - "aws-sdk-client-mock": "^2.0.1", - "aws-sdk-client-mock-jest": "^2.0.1" + "@aws-sdk/client-appconfigdata": "^3.360.0", + "@aws-sdk/client-dynamodb": "^3.360.0", + "@aws-sdk/client-secrets-manager": "^3.360.0", + "@aws-sdk/client-ssm": "^3.360.0", + "@aws-sdk/util-dynamodb": "^3.360.0", + "aws-sdk-client-mock": "^2.2.0", + "aws-sdk-client-mock-jest": "^2.2.0" }, "dependencies": { - "@aws-lambda-powertools/commons": "^1.10.0", + "@aws-lambda-powertools/commons": "^1.11.0", "@aws-sdk/util-base64-node": "^3.209.0" } } diff --git a/packages/parameters/tests/unit/AppConfigProvider.test.ts b/packages/parameters/tests/unit/AppConfigProvider.test.ts index affe3c28fd..a7cfa50559 100644 --- a/packages/parameters/tests/unit/AppConfigProvider.test.ts +++ b/packages/parameters/tests/unit/AppConfigProvider.test.ts @@ -11,12 +11,12 @@ import { StartConfigurationSessionCommand, GetLatestConfigurationCommand, } from '@aws-sdk/client-appconfigdata'; +import { Uint8ArrayBlobAdapter } from '@aws-sdk/util-stream'; import { mockClient } from 'aws-sdk-client-mock'; import 'aws-sdk-client-mock-jest'; describe('Class: AppConfigProvider', () => { const client = mockClient(AppConfigDataClient); - const encoder = new TextEncoder(); beforeEach(() => { jest.clearAllMocks(); @@ -117,7 +117,7 @@ describe('Class: AppConfigProvider', () => { const fakeInitialToken = 'aW5pdGlhbFRva2Vu'; const fakeNextToken = 'bmV4dFRva2Vu'; - const mockData = encoder.encode('myAppConfiguration'); + const mockData = Uint8ArrayBlobAdapter.fromString('myAppConfiguration'); client .on(StartConfigurationSessionCommand) @@ -148,7 +148,7 @@ describe('Class: AppConfigProvider', () => { const fakeInitialToken = 'aW5pdGlhbFRva2Vu'; const fakeNextToken = 'bmV4dFRva2Vu'; - const mockData = encoder.encode('myAppConfiguration'); + const mockData = Uint8ArrayBlobAdapter.fromString('myAppConfiguration'); client .on(StartConfigurationSessionCommand) @@ -199,7 +199,7 @@ describe('Class: AppConfigProvider', () => { const provider = new AppConfigProviderMock(options); const name = 'MyAppFeatureFlag'; const fakeToken = 'ZmFrZVRva2Vu'; - const mockData = encoder.encode('myAppConfiguration'); + const mockData = Uint8ArrayBlobAdapter.fromString('myAppConfiguration'); client.on(GetLatestConfigurationCommand).resolves({ Configuration: mockData, @@ -243,7 +243,7 @@ describe('Class: AppConfigProvider', () => { const fakeInitialToken = 'aW5pdGlhbFRva2Vu'; const fakeNextToken1 = 'bmV4dFRva2Vu'; const fakeNextToken2 = 'bmV4dFRva2Vq'; - const mockData = encoder.encode('myAppConfiguration'); + const mockData = Uint8ArrayBlobAdapter.fromString('myAppConfiguration'); client .on(StartConfigurationSessionCommand) diff --git a/packages/parameters/tests/unit/getAppConfig.test.ts b/packages/parameters/tests/unit/getAppConfig.test.ts index 4d1a3b23c2..466454fbb1 100644 --- a/packages/parameters/tests/unit/getAppConfig.test.ts +++ b/packages/parameters/tests/unit/getAppConfig.test.ts @@ -17,6 +17,7 @@ import { import { mockClient } from 'aws-sdk-client-mock'; import 'aws-sdk-client-mock-jest'; import { toBase64 } from '@aws-sdk/util-base64-node'; +import { Uint8ArrayBlobAdapter } from '@aws-sdk/util-stream'; import { JSONValue } from '@aws-lambda-powertools/commons'; describe('Function: getAppConfig', () => { @@ -29,7 +30,7 @@ describe('Function: getAppConfig', () => { test('when called and a default provider does not exist, it instantiates one and returns the value', async () => { // Prepare - const mockData = encoder.encode('myAppConfiguration'); + const mockData = Uint8ArrayBlobAdapter.fromString('myAppConfiguration'); client .on(StartConfigurationSessionCommand) .resolves({ @@ -58,7 +59,7 @@ describe('Function: getAppConfig', () => { environment: 'prod', }); DEFAULT_PROVIDERS.appconfig = provider; - const mockData = encoder.encode('myAppConfiguration'); + const mockData = Uint8ArrayBlobAdapter.fromString('myAppConfiguration'); client .on(StartConfigurationSessionCommand) .resolves({ @@ -83,7 +84,9 @@ describe('Function: getAppConfig', () => { test('when called with transform: `binary` option, it returns string value', async () => { // Prepare const expectedValue = 'my-value'; - const mockData = encoder.encode(toBase64(encoder.encode(expectedValue))); + const mockData = Uint8ArrayBlobAdapter.fromString( + toBase64(encoder.encode(expectedValue)) + ); client .on(StartConfigurationSessionCommand) .resolves({ @@ -109,7 +112,9 @@ describe('Function: getAppConfig', () => { test('when called with transform: `json` option, it returns a JSON value', async () => { // Prepare const expectedValue = { foo: 'my-value' }; - const mockData = encoder.encode(JSON.stringify(expectedValue)); + const mockData = Uint8ArrayBlobAdapter.fromString( + JSON.stringify(expectedValue) + ); client .on(StartConfigurationSessionCommand) .resolves({ diff --git a/packages/tracer/CHANGELOG.md b/packages/tracer/CHANGELOG.md index f1204cafb8..275924898c 100644 --- a/packages/tracer/CHANGELOG.md +++ b/packages/tracer/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [1.11.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v1.10.0...v1.11.0) (2023-06-29) + +**Note:** Version bump only for package @aws-lambda-powertools/tracer + # [1.10.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v1.9.0...v1.10.0) (2023-06-23) ### Bug Fixes diff --git a/packages/tracer/README.md b/packages/tracer/README.md index 55b790dc15..3df94a668a 100644 --- a/packages/tracer/README.md +++ b/packages/tracer/README.md @@ -30,7 +30,7 @@ You can use the library in both TypeScript and JavaScript code bases. * **[Tracer](https://docs.powertools.aws.dev/lambda-typescript/latest/core/tracer/)** - Utilities to trace Lambda function handlers, and both synchronous and asynchronous functions * **[Logger](https://docs.powertools.aws.dev/lambda-typescript/latest/core/logger/)** - Structured logging made easier, and a middleware to enrich log items with key details of the Lambda context * **[Metrics](https://docs.powertools.aws.dev/lambda-typescript/latest/core/metrics/)** - Custom Metrics created asynchronously via CloudWatch Embedded Metric Format (EMF) -* **[Parameters (beta)](https://docs.powertools.aws.dev/lambda-typescript/latest/utilities/parameters/)** - High-level functions to retrieve one or more parameters from AWS SSM, Secrets Manager, AppConfig, and DynamoDB +* **[Parameters](https://docs.powertools.aws.dev/lambda-typescript/latest/utilities/parameters/)** - High-level functions to retrieve one or more parameters from AWS SSM, Secrets Manager, AppConfig, and DynamoDB ## Getting started @@ -96,6 +96,7 @@ The following companies, among others, use Powertools: * [Bailey Nelson](https://www.baileynelson.com.au) * [Perfect Post](https://www.perfectpost.fr) * [Sennder](https://sennder.com/) +* [Certible](https://www.certible.com/) ### Sharing your work diff --git a/packages/tracer/package.json b/packages/tracer/package.json index 481e0a3ed6..a071a5b426 100644 --- a/packages/tracer/package.json +++ b/packages/tracer/package.json @@ -1,6 +1,6 @@ { "name": "@aws-lambda-powertools/tracer", - "version": "1.10.0", + "version": "1.11.0", "description": "The tracer package for the Powertools for AWS Lambda (TypeScript) library", "author": { "name": "Amazon Web Services", @@ -32,9 +32,9 @@ "main": "./lib/index.js", "types": "./lib/index.d.ts", "devDependencies": { - "@aws-sdk/client-dynamodb": "^3.231.0", - "@aws-sdk/client-sts": "^3.310.0", - "@aws-sdk/client-xray": "^3.310.0", + "@aws-sdk/client-dynamodb": "^3.360.0", + "@aws-sdk/client-sts": "^3.360.0", + "@aws-sdk/client-xray": "^3.360.0", "@types/promise-retry": "^1.1.3", "aws-sdk": "^2.1354.0", "axios": "^1.2.1", @@ -51,7 +51,7 @@ "url": "https://github.com/aws-powertools/powertools-lambda-typescript/issues" }, "dependencies": { - "@aws-lambda-powertools/commons": "^1.10.0", + "@aws-lambda-powertools/commons": "^1.11.0", "aws-xray-sdk-core": "^3.4.1" }, "keywords": [ diff --git a/packages/tracer/tests/e2e/allFeatures.decorator.test.functionCode.ts b/packages/tracer/tests/e2e/allFeatures.decorator.test.functionCode.ts index 200782dafa..6522cb3bff 100644 --- a/packages/tracer/tests/e2e/allFeatures.decorator.test.functionCode.ts +++ b/packages/tracer/tests/e2e/allFeatures.decorator.test.functionCode.ts @@ -52,7 +52,7 @@ export class MyFunctionBase { Item: { id: `${serviceName}-${event.invocation}-sdkv2` }, }) .promise(), - axios.get('https://docs.powertools.aws.dev/lambda-typescript/latest/', { + axios.get('https://docs.powertools.aws.dev/lambda/typescript/latest/', { timeout: 5000, }), new Promise((resolve, reject) => { diff --git a/packages/tracer/tests/e2e/allFeatures.manual.test.functionCode.ts b/packages/tracer/tests/e2e/allFeatures.manual.test.functionCode.ts index 4e61825c2c..e878fdee08 100644 --- a/packages/tracer/tests/e2e/allFeatures.manual.test.functionCode.ts +++ b/packages/tracer/tests/e2e/allFeatures.manual.test.functionCode.ts @@ -56,7 +56,7 @@ export const handler = async ( }) .promise(); await axios.get( - 'https://docs.powertools.aws.dev/lambda-typescript/latest/', + 'https://docs.powertools.aws.dev/lambda/typescript/latest/', { timeout: 5000 } ); diff --git a/packages/tracer/tests/e2e/allFeatures.middy.test.functionCode.ts b/packages/tracer/tests/e2e/allFeatures.middy.test.functionCode.ts index 9d4af93e62..1b768052d9 100644 --- a/packages/tracer/tests/e2e/allFeatures.middy.test.functionCode.ts +++ b/packages/tracer/tests/e2e/allFeatures.middy.test.functionCode.ts @@ -46,7 +46,7 @@ const testHandler = async ( }) ); await axios.get( - 'https://docs.powertools.aws.dev/lambda-typescript/latest/', + 'https://docs.powertools.aws.dev/lambda/typescript/latest/', { timeout: 5000 } ); diff --git a/packages/tracer/tests/e2e/asyncHandler.decorator.test.functionCode.ts b/packages/tracer/tests/e2e/asyncHandler.decorator.test.functionCode.ts index ced360f5a5..d4cca85893 100644 --- a/packages/tracer/tests/e2e/asyncHandler.decorator.test.functionCode.ts +++ b/packages/tracer/tests/e2e/asyncHandler.decorator.test.functionCode.ts @@ -56,7 +56,7 @@ export class MyFunctionBase { }) ); await axios.get( - 'https://docs.powertools.aws.dev/lambda-typescript/latest/', + 'https://docs.powertools.aws.dev/lambda/typescript/latest/', { timeout: 5000 } ); @@ -82,9 +82,8 @@ class MyFunctionWithDecorator extends MyFunctionBase { // @ts-ignore public async handler( event: CustomEvent, - _context: Context, - _callback: Callback - ): void | Promise { + _context: Context + ): Promise { return super.handler(event, _context); } @@ -105,9 +104,8 @@ export class MyFunctionWithDecoratorAndCustomNamedSubSegmentForMethod extends My // @ts-ignore public async handler( event: CustomEvent, - _context: Context, - _callback: Callback - ): void | Promise { + _context: Context + ): Promise { return super.handler(event, _context); }