diff --git a/.github/workflows/dependency-review.yml b/.github/workflows/dependency-review.yml index ef8b379311..9bb07b1d7e 100644 --- a/.github/workflows/dependency-review.yml +++ b/.github/workflows/dependency-review.yml @@ -17,6 +17,6 @@ jobs: runs-on: ubuntu-latest steps: - name: 'Checkout Repository' - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@9bb56186c3b09b4f86b1c65136769dd318469633 # v4.1.2 - name: 'Dependency Review' - uses: actions/dependency-review-action@9129d7d40b8c12c1ed0f60400d00c92d437adcce # v4.1.3 + uses: actions/dependency-review-action@0fa40c3c10055986a88de3baa0d6ec17c5a894b3 # v4.2.3 diff --git a/.github/workflows/label_pr_on_title.yml b/.github/workflows/label_pr_on_title.yml index e1c6fb581d..a191c823f4 100644 --- a/.github/workflows/label_pr_on_title.yml +++ b/.github/workflows/label_pr_on_title.yml @@ -49,7 +49,7 @@ jobs: pull-requests: write # label respective PR steps: - name: Checkout repository - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@9bb56186c3b09b4f86b1c65136769dd318469633 # v4.1.2 - name: "Label PR based on title" uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 env: diff --git a/.github/workflows/make-release.yml b/.github/workflows/make-release.yml index 3602d606d2..0f42160f29 100644 --- a/.github/workflows/make-release.yml +++ b/.github/workflows/make-release.yml @@ -45,7 +45,7 @@ jobs: RELEASE_VERSION: ${{ steps.set-release-version.outputs.RELEASE_VERSION }} steps: - name: Checkout code - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@9bb56186c3b09b4f86b1c65136769dd318469633 # v4.1.2 with: ref: ${{ github.sha }} - name: Setup NodeJS @@ -75,7 +75,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout code - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@9bb56186c3b09b4f86b1c65136769dd318469633 # v4.1.2 with: ref: ${{ github.sha }} - name: Git client setup diff --git a/.github/workflows/make-version.yml b/.github/workflows/make-version.yml index 9ff2a457f7..7440fc92a6 100644 --- a/.github/workflows/make-version.yml +++ b/.github/workflows/make-version.yml @@ -18,7 +18,7 @@ jobs: RELEASE_VERSION: ${{ steps.set-release-version.outputs.RELEASE_VERSION }} steps: - name: Checkout code - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@9bb56186c3b09b4f86b1c65136769dd318469633 # v4.1.2 with: ref: ${{ github.ref }} - name: Setup NodeJS diff --git a/.github/workflows/on_merged_pr.yml b/.github/workflows/on_merged_pr.yml index 2daae2b1b3..8d536bc307 100644 --- a/.github/workflows/on_merged_pr.yml +++ b/.github/workflows/on_merged_pr.yml @@ -49,7 +49,7 @@ jobs: issues: write # label issue with pending-release if: needs.get_pr_details.outputs.prIsMerged == 'true' steps: - - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + - uses: actions/checkout@9bb56186c3b09b4f86b1c65136769dd318469633 # v4.1.2 - name: "Label PR related issue for release" uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 env: diff --git a/.github/workflows/on_opened_pr.yml b/.github/workflows/on_opened_pr.yml index dcd6f0c7ad..25462721f6 100644 --- a/.github/workflows/on_opened_pr.yml +++ b/.github/workflows/on_opened_pr.yml @@ -47,7 +47,7 @@ jobs: needs: get_pr_details runs-on: ubuntu-latest steps: - - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + - uses: actions/checkout@9bb56186c3b09b4f86b1c65136769dd318469633 # v4.1.2 - name: "Ensure related issue is present" uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 env: @@ -66,7 +66,7 @@ jobs: permissions: pull-requests: write # label and comment on PR if missing acknowledge section (requirement) steps: - - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + - uses: actions/checkout@9bb56186c3b09b4f86b1c65136769dd318469633 # v4.1.2 - name: "Ensure acknowledgement section is present" uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 env: diff --git a/.github/workflows/ossf_scorecard.yml b/.github/workflows/ossf_scorecard.yml index 506b4fdee3..a332e155ab 100644 --- a/.github/workflows/ossf_scorecard.yml +++ b/.github/workflows/ossf_scorecard.yml @@ -22,7 +22,7 @@ jobs: steps: - name: "Checkout code" - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@9bb56186c3b09b4f86b1c65136769dd318469633 # v4.1.2 with: persist-credentials: false @@ -43,6 +43,6 @@ jobs: # Upload the results to GitHub's code scanning dashboard. - name: "Upload to code-scanning" - uses: github/codeql-action/upload-sarif@8a470fddafa5cbb6266ee11b37ef4d8aae19c571 # v3.24.6 + uses: github/codeql-action/upload-sarif@1b1aada464948af03b950897e5eb522f92603cc2 # v3.24.9 with: sarif_file: results.sarif diff --git a/.github/workflows/post-release.yml b/.github/workflows/post-release.yml index 5bd01b7b6e..cadff1fdc0 100644 --- a/.github/workflows/post-release.yml +++ b/.github/workflows/post-release.yml @@ -26,7 +26,7 @@ jobs: env: RELEASE_VERSION: ${{ inputs.versionNumber }} steps: - - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + - uses: actions/checkout@9bb56186c3b09b4f86b1c65136769dd318469633 # v4.1.2 - name: Get release version run: | # The code below does the following: diff --git a/.github/workflows/publish_layer.yml b/.github/workflows/publish_layer.yml index 067490c197..7dd30d8ff8 100644 --- a/.github/workflows/publish_layer.yml +++ b/.github/workflows/publish_layer.yml @@ -31,7 +31,7 @@ jobs: if: ${{ (github.event.workflow_run.conclusion == 'success') || (github.event_name == 'workflow_dispatch') }} steps: - name: checkout - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@9bb56186c3b09b4f86b1c65136769dd318469633 # v4.1.2 with: ref: ${{ github.sha }} - name: Setup Node.js @@ -93,7 +93,7 @@ jobs: id-token: none steps: - name: Checkout repository # reusable workflows start clean, so we need to checkout again - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@9bb56186c3b09b4f86b1c65136769dd318469633 # v4.1.2 with: ref: ${{ github.sha }} - name: Download CDK layer artifacts diff --git a/.github/workflows/record_pr.yml b/.github/workflows/record_pr.yml index 33379a1ddd..9bd37995a6 100644 --- a/.github/workflows/record_pr.yml +++ b/.github/workflows/record_pr.yml @@ -46,7 +46,7 @@ jobs: permissions: contents: read # NOTE: treat as untrusted location steps: - - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + - uses: actions/checkout@9bb56186c3b09b4f86b1c65136769dd318469633 # v4.1.2 - name: "Extract PR details" uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 with: diff --git a/.github/workflows/reusable-run-linting-check-and-unit-tests.yml b/.github/workflows/reusable-run-linting-check-and-unit-tests.yml index d7d7b2bd0a..519ab4845f 100644 --- a/.github/workflows/reusable-run-linting-check-and-unit-tests.yml +++ b/.github/workflows/reusable-run-linting-check-and-unit-tests.yml @@ -17,7 +17,7 @@ jobs: fail-fast: false steps: - name: Checkout code - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@9bb56186c3b09b4f86b1c65136769dd318469633 # v4.1.2 - name: Setup NodeJS uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4.0.2 with: @@ -44,7 +44,7 @@ jobs: working-directory: examples/${{ matrix.example }} steps: - name: Checkout code - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@9bb56186c3b09b4f86b1c65136769dd318469633 # v4.1.2 - name: Setup NodeJS uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4.0.2 with: @@ -62,7 +62,7 @@ jobs: NODE_ENV: dev steps: - name: Checkout code - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@9bb56186c3b09b4f86b1c65136769dd318469633 # v4.1.2 - name: Setup NodeJS uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4.0.2 with: @@ -80,7 +80,7 @@ jobs: NODE_ENV: dev steps: - name: Checkout code - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@9bb56186c3b09b4f86b1c65136769dd318469633 # v4.1.2 - name: Setup NodeJS uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4.0.2 with: diff --git a/.github/workflows/reusable_deploy_layer_stack.yml b/.github/workflows/reusable_deploy_layer_stack.yml index a4fc08ab17..1248c89319 100644 --- a/.github/workflows/reusable_deploy_layer_stack.yml +++ b/.github/workflows/reusable_deploy_layer_stack.yml @@ -62,7 +62,7 @@ jobs: ] steps: - name: checkout - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@9bb56186c3b09b4f86b1c65136769dd318469633 # v4.1.2 - name: aws credentials uses: aws-actions/configure-aws-credentials@e3dd6a429d7300a6a4c196c26e071d42e0343502 # v4.0.2 with: diff --git a/.github/workflows/reusable_export_pr_details.yml b/.github/workflows/reusable_export_pr_details.yml index dc9b44309b..016b78a06b 100644 --- a/.github/workflows/reusable_export_pr_details.yml +++ b/.github/workflows/reusable_export_pr_details.yml @@ -75,7 +75,7 @@ jobs: prLabels: ${{ steps.prLabels.outputs.prLabels }} steps: - name: Checkout repository # in case caller workflow doesn't checkout thus failing with file not found - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@9bb56186c3b09b4f86b1c65136769dd318469633 # v4.1.2 - name: "Download previously saved PR" uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 env: diff --git a/.github/workflows/reusable_publish_docs.yml b/.github/workflows/reusable_publish_docs.yml index 3b8fc275d2..5e8914f248 100644 --- a/.github/workflows/reusable_publish_docs.yml +++ b/.github/workflows/reusable_publish_docs.yml @@ -50,7 +50,7 @@ jobs: id-token: write # trade JWT token for AWS credentials in AWS Docs account steps: - name: Checkout code - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@9bb56186c3b09b4f86b1c65136769dd318469633 # v4.1.2 - name: Setup NodeJS uses: actions/setup-node@60edb5dd545a775178f52524783378180af0d1f8 # v4.0.2 with: diff --git a/.github/workflows/run-e2e-tests.yml b/.github/workflows/run-e2e-tests.yml index 9d6b508726..88654c6cc9 100644 --- a/.github/workflows/run-e2e-tests.yml +++ b/.github/workflows/run-e2e-tests.yml @@ -36,7 +36,7 @@ jobs: fail-fast: false steps: - name: Checkout Repo - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@9bb56186c3b09b4f86b1c65136769dd318469633 # v4.1.2 # If we pass a PR Number when triggering the workflow we will retrieve the PR info and get its headSHA - name: Extract PR details id: extract_PR_details @@ -50,7 +50,7 @@ jobs: # we checkout the PR at that point in time - name: Checkout PR code if: ${{ inputs.prNumber != '' }} - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@9bb56186c3b09b4f86b1c65136769dd318469633 # v4.1.2 with: ref: ${{ steps.extract_PR_details.outputs.headSHA }} - name: Setup NodeJS diff --git a/.github/workflows/secure-workflows.yml b/.github/workflows/secure-workflows.yml index c0c1fde8bf..50965a3f80 100644 --- a/.github/workflows/secure-workflows.yml +++ b/.github/workflows/secure-workflows.yml @@ -30,7 +30,7 @@ jobs: contents: read # checkout code and subsequently GitHub action workflows steps: - name: Checkout code - uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 + uses: actions/checkout@9bb56186c3b09b4f86b1c65136769dd318469633 # v4.1.2 - name: Ensure 3rd party workflows have SHA pinned uses: zgosalvez/github-actions-ensure-sha-pinned-actions@ba37328d4ea95eaf8b3bd6c6cef308f709a5f2ec # v3.0.3 with: diff --git a/CHANGELOG.md b/CHANGELOG.md index 0320919dc4..9913756170 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## 2.0.3 (2024-03-15) + +**feat(logger):** improve regex in stack trace parsing ([#2121](https://github.com/aws-powertools/powertools-lambda-typescript/issues/2121)) ([ebe5eef](https://github.com/aws-powertools/powertools-lambda-typescript/commit/ebe5eef3319fc95070c2c33c0ac64b8e42443b38)) +**fix(idempotency):** transform private class fields ([#2230](https://github.com/aws-powertools/powertools-lambda-typescript/issues/2230)) ([aa6e6e0](https://github.com/aws-powertools/powertools-lambda-typescript/commit/aa6e6e0c25bbc93151cc5cddc584400575604f05)) +**improv(commons):**: expand type utils functions ([#2191](https://github.com/aws-powertools/powertools-lambda-typescript/issues/2191)) ([9208393](https://github.com/aws-powertools/powertools-lambda-typescript/commit/9208393fe07d33cb35ea479b3c0866c8a7b91a21)) +**feat(commons):** add fromBase64 helper function ([#2188](https://github.com/aws-powertools/powertools-lambda-typescript/issues/2188)) ([133159b](https://github.com/aws-powertools/powertools-lambda-typescript/commit/133159ba4cca41a61c14d62f9356bb89a7f0a08f)) +**fix(layers):**: add createRequire banner in esm build ([#2231](https://github.com/aws-powertools/powertools-lambda-typescript/issues/2231)) ([730bcc9](https://github.com/aws-powertools/powertools-lambda-typescript/commit/730bcc93c027f4d60788badb6c5c01a09b3c70be)) + ## 2.0.2 (2024-03-05) diff --git a/docs/Dockerfile b/docs/Dockerfile index 878408723b..6a0f8921e3 100644 --- a/docs/Dockerfile +++ b/docs/Dockerfile @@ -1,5 +1,5 @@ # version 9.5.2 -FROM squidfunk/mkdocs-material@sha256:3678304a65e17660953a30c0a0be0bc2fb8f55ac450216c14af6ba942badc4dc +FROM squidfunk/mkdocs-material@sha256:6c81a890d0b5a59cc36e53684ae696995aa1f526f1406106f9bfec49d5031581 ADD requirements.txt /tmp/ RUN pip install --require-hashes -r /tmp/requirements.txt \ No newline at end of file diff --git a/docs/core/tracer.md b/docs/core/tracer.md index 2c45e0faad..c6af66a67a 100644 --- a/docs/core/tracer.md +++ b/docs/core/tracer.md @@ -55,7 +55,7 @@ The library has three optional settings. You can set them as environment variabl | **Capture Errors** | Defines whether functions errors are serialized as metadata | `POWERTOOLS_TRACER_CAPTURE_ERROR` | `true` | `true` or `false` | `false` | N/A | !!! note - Before your use this utility, your AWS Lambda function must have [Active Tracing enabled](https://docs.aws.amazon.com/lambda/latest/dg/services-xray.html) as well as [have permissions](https://docs.aws.amazon.com/lambda/latest/dg/services-xray.html#services-xray-permissions) to send traces to AWS X-Ray + Before you use this utility, your AWS Lambda function must have [Active Tracing enabled](https://docs.aws.amazon.com/lambda/latest/dg/services-xray.html) as well as [have permissions](https://docs.aws.amazon.com/lambda/latest/dg/services-xray.html#services-xray-permissions) to send traces to AWS X-Ray #### Example using AWS Serverless Application Model (SAM) diff --git a/docs/index.md b/docs/index.md index c8e7497aab..cda7576b08 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:AWSLambdaPowertoolsTypeScriptV2:2**](#){: .copyMe}:clipboard: +* **Lambda Layer**: [**arn:aws:lambda:{region}:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:3**](#){: .copyMe}:clipboard: * **npm**: [`npm install @aws-lambda-powertools/tracer @aws-lambda-powertools/metrics @aws-lambda-powertools/logger`](#){: .copyMe}:clipboard: ### Lambda Layer @@ -41,33 +41,33 @@ 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:AWSLambdaPowertoolsTypeScriptV2:2](#){: .copyMe}:clipboard: | - | `us-east-2` | [arn:aws:lambda:us-east-2:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:2](#){: .copyMe}:clipboard: | - | `us-west-1` | [arn:aws:lambda:us-west-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:2](#){: .copyMe}:clipboard: | - | `us-west-2` | [arn:aws:lambda:us-west-2:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:2](#){: .copyMe}:clipboard: | - | `ap-south-1` | [arn:aws:lambda:ap-south-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:2](#){: .copyMe}:clipboard: | - | `ap-east-1` | [arn:aws:lambda:ap-east-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:2](#){: .copyMe}:clipboard: | - | `ap-northeast-1` | [arn:aws:lambda:ap-northeast-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:2](#){: .copyMe}:clipboard: | - | `ap-northeast-2` | [arn:aws:lambda:ap-northeast-2:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:2](#){: .copyMe}:clipboard: | - | `ap-northeast-3` | [arn:aws:lambda:ap-northeast-3:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:2](#){: .copyMe}:clipboard: | - | `ap-southeast-1` | [arn:aws:lambda:ap-southeast-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:2](#){: .copyMe}:clipboard: | - | `ap-southeast-2` | [arn:aws:lambda:ap-southeast-2:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:2](#){: .copyMe}:clipboard: | - | `ap-southeast-3` | [arn:aws:lambda:ap-southeast-3:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:2](#){: .copyMe}:clipboard: | - | `ap-southeast-4` | [arn:aws:lambda:ap-southeast-4:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:2](#){: .copyMe}:clipboard: | - | `eu-central-1` | [arn:aws:lambda:eu-central-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:2](#){: .copyMe}:clipboard: | - | `eu-central-2` | [arn:aws:lambda:eu-central-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:2](#){: .copyMe}:clipboard: | - | `eu-west-1` | [arn:aws:lambda:eu-west-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:2](#){: .copyMe}:clipboard: | - | `eu-west-2` | [arn:aws:lambda:eu-west-2:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:2](#){: .copyMe}:clipboard: | - | `eu-west-3` | [arn:aws:lambda:eu-west-3:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:2](#){: .copyMe}:clipboard: | - | `eu-north-1` | [arn:aws:lambda:eu-north-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:2](#){: .copyMe}:clipboard: | - | `eu-south-1` | [arn:aws:lambda:eu-south-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:2](#){: .copyMe}:clipboard: | - | `eu-south-2` | [arn:aws:lambda:eu-south-2:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:2](#){: .copyMe}:clipboard: | - | `ca-central-1` | [arn:aws:lambda:ca-central-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:2](#){: .copyMe}:clipboard: | - | `ca-west-1` | [arn:aws:lambda:ca-west-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:2](#){: .copyMe}:clipboard: | - | `sa-east-1` | [arn:aws:lambda:sa-east-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:2](#){: .copyMe}:clipboard: | - | `af-south-1` | [arn:aws:lambda:af-south-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:2](#){: .copyMe}:clipboard: | - | `me-south-1` | [arn:aws:lambda:me-south-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:2](#){: .copyMe}:clipboard: | - | `il-central-1` | [arn:aws:lambda:il-central-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:2](#){: .copyMe}:clipboard: | + | `us-east-1` | [arn:aws:lambda:us-east-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:3](#){: .copyMe}:clipboard: | + | `us-east-2` | [arn:aws:lambda:us-east-2:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:3](#){: .copyMe}:clipboard: | + | `us-west-1` | [arn:aws:lambda:us-west-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:3](#){: .copyMe}:clipboard: | + | `us-west-2` | [arn:aws:lambda:us-west-2:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:3](#){: .copyMe}:clipboard: | + | `ap-south-1` | [arn:aws:lambda:ap-south-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:3](#){: .copyMe}:clipboard: | + | `ap-east-1` | [arn:aws:lambda:ap-east-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:3](#){: .copyMe}:clipboard: | + | `ap-northeast-1` | [arn:aws:lambda:ap-northeast-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:3](#){: .copyMe}:clipboard: | + | `ap-northeast-2` | [arn:aws:lambda:ap-northeast-2:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:3](#){: .copyMe}:clipboard: | + | `ap-northeast-3` | [arn:aws:lambda:ap-northeast-3:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:3](#){: .copyMe}:clipboard: | + | `ap-southeast-1` | [arn:aws:lambda:ap-southeast-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:3](#){: .copyMe}:clipboard: | + | `ap-southeast-2` | [arn:aws:lambda:ap-southeast-2:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:3](#){: .copyMe}:clipboard: | + | `ap-southeast-3` | [arn:aws:lambda:ap-southeast-3:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:3](#){: .copyMe}:clipboard: | + | `ap-southeast-4` | [arn:aws:lambda:ap-southeast-4:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:3](#){: .copyMe}:clipboard: | + | `eu-central-1` | [arn:aws:lambda:eu-central-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:3](#){: .copyMe}:clipboard: | + | `eu-central-2` | [arn:aws:lambda:eu-central-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:3](#){: .copyMe}:clipboard: | + | `eu-west-1` | [arn:aws:lambda:eu-west-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:3](#){: .copyMe}:clipboard: | + | `eu-west-2` | [arn:aws:lambda:eu-west-2:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:3](#){: .copyMe}:clipboard: | + | `eu-west-3` | [arn:aws:lambda:eu-west-3:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:3](#){: .copyMe}:clipboard: | + | `eu-north-1` | [arn:aws:lambda:eu-north-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:3](#){: .copyMe}:clipboard: | + | `eu-south-1` | [arn:aws:lambda:eu-south-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:3](#){: .copyMe}:clipboard: | + | `eu-south-2` | [arn:aws:lambda:eu-south-2:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:3](#){: .copyMe}:clipboard: | + | `ca-central-1` | [arn:aws:lambda:ca-central-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:3](#){: .copyMe}:clipboard: | + | `ca-west-1` | [arn:aws:lambda:ca-west-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:3](#){: .copyMe}:clipboard: | + | `sa-east-1` | [arn:aws:lambda:sa-east-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:3](#){: .copyMe}:clipboard: | + | `af-south-1` | [arn:aws:lambda:af-south-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:3](#){: .copyMe}:clipboard: | + | `me-south-1` | [arn:aws:lambda:me-south-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:3](#){: .copyMe}:clipboard: | + | `il-central-1` | [arn:aws:lambda:il-central-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:3](#){: .copyMe}:clipboard: | ??? note "Click to expand and copy code snippets for popular frameworks" @@ -78,7 +78,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:AWSLambdaPowertoolsTypeScriptV2:2 + - !Sub arn:aws:lambda:${AWS::Region}:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:3 ``` 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: @@ -109,7 +109,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:AWSLambdaPowertoolsTypeScriptV2:2 + - arn:aws:lambda:${aws:region}:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:3 ``` 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: @@ -141,7 +141,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:AWSLambdaPowertoolsTypeScriptV2:2` + `arn:aws:lambda:${cdk.Stack.of(this).region}:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:3` ); new lambda.Function(this, 'Function', { @@ -193,7 +193,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:AWSLambdaPowertoolsTypeScriptV2:2"] + layers = ["arn:aws:lambda:{aws::region}:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:3"] source_code_hash = filebase64sha256("lambda_function_payload.zip") } ``` @@ -211,7 +211,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:AWSLambdaPowertoolsTypeScriptV2:2` + pulumi.interpolate`arn:aws:lambda:${aws.getRegionOutput().name}:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:3` ], code: new pulumi.asset.FileArchive('lambda_function_payload.zip'), tracingConfig: { @@ -235,7 +235,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:AWSLambdaPowertoolsTypeScriptV2:2 + ? Enter up to 5 existing Lambda layer ARNs (comma-separated): arn:aws:lambda:{aws::region}:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:3 ❯ amplify push -y # Updating an existing function and add the layer @@ -245,7 +245,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:AWSLambdaPowertoolsTypeScriptV2:2 + ? Enter up to 5 existing Lambda layer ARNs (comma-separated): arn:aws:lambda:{aws::region}:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:3 ? Do you want to edit the local lambda function now? No ``` @@ -255,7 +255,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:AWSLambdaPowertoolsTypeScriptV2:2 --region {region} + aws lambda get-layer-version-by-arn --arn arn:aws:lambda:{aws::region}:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:3 --region {region} ``` The pre-signed URL to download this Lambda Layer will be within `Location` key. diff --git a/docs/overrides/main.html b/docs/overrides/main.html index 21efa64b87..67010de9bc 100644 --- a/docs/overrides/main.html +++ b/docs/overrides/main.html @@ -8,6 +8,6 @@ {% endblock %} {% block announce %} -Version 2 is coming soon 🔥 Check out the upgrade guide to see +Version 2 is generally available 🔥 Check out the upgrade guide to see what's new. {% endblock %} \ No newline at end of file diff --git a/docs/requirements.in b/docs/requirements.in index c703cd1132..3e497982f1 100644 --- a/docs/requirements.in +++ b/docs/requirements.in @@ -1,4 +1,4 @@ mike==1.1.2 -mkdocs-material==9.5.13 +mkdocs-material==9.5.14 mkdocs-git-revision-date-plugin==0.3.2 mkdocs-exclude==1.0.2 \ No newline at end of file diff --git a/docs/requirements.txt b/docs/requirements.txt index dd8d23a0bb..c16d6565f3 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -229,9 +229,9 @@ mkdocs-exclude==1.0.2 \ mkdocs-git-revision-date-plugin==0.3.2 \ --hash=sha256:2e67956cb01823dd2418e2833f3623dee8604cdf223bddd005fe36226a56f6ef # via -r requirements.in -mkdocs-material==9.5.13 \ - --hash=sha256:5cbe17fee4e3b4980c8420a04cc762d8dc052ef1e10532abd4fce88e5ea9ce6a \ - --hash=sha256:d8e4caae576312a88fd2609b81cf43d233cdbe36860d67a68702b018b425bd87 +mkdocs-material==9.5.14 \ + --hash=sha256:2a1f8e67cda2587ab93ecea9ba42d0ca61d1d7b5fad8cf690eeaeb39dcd4b9af \ + --hash=sha256:a45244ac221fda46ecf8337f00ec0e5cb5348ab9ffb203ca2a0c313b0d4dbc27 # via -r requirements.in mkdocs-material-extensions==1.3.1 \ --hash=sha256:10c9511cea88f568257f960358a467d12b970e1f7b2c0e5fb2bb48cab1928443 \ diff --git a/docs/snippets/CHANGELOG.md b/docs/snippets/CHANGELOG.md index 01339b5224..c059ed1f01 100644 --- a/docs/snippets/CHANGELOG.md +++ b/docs/snippets/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## 2.0.3 (2024-03-15) + +**Note:** Version bump only for package docs + + + + + ## 2.0.2 (2024-03-05) **Note:** Version bump only for package docs diff --git a/docs/snippets/package.json b/docs/snippets/package.json index ee07137510..14d6c517f5 100644 --- a/docs/snippets/package.json +++ b/docs/snippets/package.json @@ -1,6 +1,6 @@ { "name": "docs", - "version": "2.0.2", + "version": "2.0.3", "description": "A collection code snippets for the Powertools for AWS Lambda (TypeScript) docs", "author": { "name": "Amazon Web Services", @@ -29,15 +29,15 @@ }, "homepage": "https://github.com/aws-powertools/powertools-lambda-typescript#readme", "devDependencies": { - "@aws-sdk/client-appconfigdata": "^3.525.0", - "@aws-sdk/client-dynamodb": "^3.528.0", - "@aws-sdk/client-secrets-manager": "^3.525.0", - "@aws-sdk/client-ssm": "^3.525.0", - "@aws-sdk/util-dynamodb": "^3.528.0", - "aws-sdk": "^2.1568.0", - "aws-sdk-client-mock": "^3.0.1", - "aws-sdk-client-mock-jest": "^3.0.1", - "axios": "^1.6.7", + "@aws-sdk/client-appconfigdata": "^3.535.0", + "@aws-sdk/client-dynamodb": "^3.538.0", + "@aws-sdk/client-secrets-manager": "^3.535.0", + "@aws-sdk/client-ssm": "^3.535.0", + "@aws-sdk/util-dynamodb": "^3.538.0", + "aws-sdk": "^2.1583.0", + "aws-sdk-client-mock": "^4.0.0", + "aws-sdk-client-mock-jest": "^4.0.0", + "axios": "^1.6.8", "hashi-vault-js": "^0.4.14" } } diff --git a/docs/upgrade.md b/docs/upgrade.md index bc104bc099..ab2d14be0c 100644 --- a/docs/upgrade.md +++ b/docs/upgrade.md @@ -3,6 +3,12 @@ title: Upgrade guide description: Guide to update between major Powertools for AWS Lambda (TypeScript) versions --- +## End of support v1 + +!!! warning "On March 13th, 2024, Powertools for AWS Lambda (TypeScript) v1 entered maintenance mode, and will reach end-of-life on September 1st, 2024. If you are still using v1, we strongly recommend you to read our upgrade guide and update to the latest version." + +Given our commitment to all of our customers using Powertools for AWS Lambda (TypeScript), we will keep npm v1 releases and documentation 1.x versions to prevent any disruption. + ## Migrate from v1 to v2 V2 is focused on official support for ESM (ECMAScript modules). We've made other minimal breaking changes to make your transition to v2 as smooth as possible. @@ -16,6 +22,7 @@ V2 is focused on official support for ESM (ECMAScript modules). We've made other | **Types imports** | Updated import path for TypeScript types to leverage subpath exports - i.e. `@aws-lambda-powertools/logger/types`. | Yes | | **Logger** | Changed [log sampling](./core/logger.md#sampling-logs) to dynamically switch log level to `DEBUG` on a percentage of requests. | - | | **Logger** | Updated [custom log formatter](#custom-log-formatter) to include standard as well as persistent keys. | Yes | +| **Logger** | Removed `ContextExamples` from `@aws-lambda-powertools/commons` package. | Yes | | **Logger and Tracer** | Removed deprecated `createLogger` and `createTracer` helper functions in favor of direct instantiation. | Yes | @@ -280,6 +287,56 @@ In v2, you have more control over **standard** (`attributes`) and [**custom keys 2. `LogItem` is the new return object instead of a plain object. 3. If you prefer adding at the initialization, use:

**`LogItem({persistentAttributes: additionalLogAttributes, attributes: baseAttributes})`** +### ContextExamples for testing + +In v1, we have provided a `ContextExamples` object to help you with testing. + +In v2, we have removed the `ContextExamples` from the `@aws-lambda-powertools/commons` package, so you need to create it in your tests: + +=== "Before" + + ```typescript + import { ContextExamples as dummyContext } from '@aws-lambda-powertools/commons'; + + describe('MyUnitTest', () => { + test('Lambda invoked successfully', async () => { + const testEvent = { test: 'test' }; + await handler(testEvent, dummyContext); + }); + }); + ``` + +=== "After" + + ```typescript + declare const handler: (event: unknown, context: unknown) => Promise; + + const context = { + callbackWaitsForEmptyEventLoop: true, + functionVersion: '$LATEST', + functionName: 'foo-bar-function', + memoryLimitInMB: '128', + logGroupName: '/aws/lambda/foo-bar-function-123456abcdef', + logStreamName: '2021/03/09/[$LATEST]abcdef123456abcdef123456abcdef123456', + invokedFunctionArn: + 'arn:aws:lambda:eu-west-1:123456789012:function:foo-bar-function', + awsRequestId: 'c6af9ac6-7b61-11e6-9a41-93e812345678', + getRemainingTimeInMillis: () => 1234, + done: () => console.log('Done!'), + fail: () => console.log('Failed!'), + succeed: () => console.log('Succeeded!'), + }; + + describe('MyUnitTest', () => { + test('Lambda invoked successfully', async () => { + const testEvent = { test: 'test' }; + await handler(testEvent, context); + }); + }); + ``` + + + ## Helper functions We removed the deprecated `createLogger` and `createTracer` heper functions. diff --git a/docs/versioning.md b/docs/versioning.md index c8055f59f7..f747e90c6d 100644 --- a/docs/versioning.md +++ b/docs/versioning.md @@ -59,5 +59,7 @@ To see the list of available major versions of Powertools for AWS Lambda and whe | SDK | Major version | Current Phase | General Availability Date | Notes | | ------------------------------------ | ------------- | ------------------------ | ------------------------- | ------------------------------------------------------------------------------------------------------- | -| Powertools for AWS Lambda TypeScript | 1.x | Maintenance Announcement | 07/15/2022 | See [v2 RFC](https://github.com/aws-powertools/powertools-lambda-typescript/issues/1714) | +| Powertools for AWS Lambda TypeScript | 1.x | End-of-life | 09/01/2024 | See [announcement](https://github.com/aws-powertools/powertools-lambda-typescript/issues/2224) | +| Powertools for AWS Lambda TypeScript | 1.x | Maintenance Announcement | 03/13/2024 | See [announcement](https://github.com/aws-powertools/powertools-lambda-typescript/issues/2224) | +| Powertools for AWS Lambda TypeScript | 2.x | General Availability | 03/05/2024 | See [Release Notes](https://github.com/aws-powertools/powertools-lambda-typescript/releases/tag/v2.0.0) | | Powertools for AWS Lambda TypeScript | 1.x | General Availability | 07/15/2022 | See [Release Notes](https://github.com/aws-powertools/powertools-lambda-typescript/releases/tag/v1.0.0) | diff --git a/examples/cdk/CHANGELOG.md b/examples/cdk/CHANGELOG.md index 2b94cf69f4..1cc9ebe528 100644 --- a/examples/cdk/CHANGELOG.md +++ b/examples/cdk/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## 2.0.3 (2024-03-15) + +**Note:** Version bump only for package cdk-sample + + + + + ## 2.0.2 (2024-03-05) **Note:** Version bump only for package cdk-sample diff --git a/examples/cdk/package.json b/examples/cdk/package.json index 763cc3ff05..45589aa412 100644 --- a/examples/cdk/package.json +++ b/examples/cdk/package.json @@ -1,6 +1,6 @@ { "name": "cdk-sample", - "version": "2.0.2", + "version": "2.0.3", "author": { "name": "Amazon Web Services", "url": "https://aws.amazon.com" @@ -25,27 +25,27 @@ "*.js": "npm run lint-fix" }, "devDependencies": { - "@aws-lambda-powertools/commons": "^2.0.2", - "@aws-lambda-powertools/logger": "^2.0.2", - "@aws-lambda-powertools/metrics": "^2.0.2", - "@aws-lambda-powertools/parameters": "^2.0.2", - "@aws-lambda-powertools/tracer": "^2.0.2", - "@aws-sdk/client-ssm": "^3.525.0", - "@aws-sdk/lib-dynamodb": "^3.528.0", + "@aws-lambda-powertools/commons": "^2.0.3", + "@aws-lambda-powertools/logger": "^2.0.3", + "@aws-lambda-powertools/metrics": "^2.0.3", + "@aws-lambda-powertools/parameters": "^2.0.3", + "@aws-lambda-powertools/tracer": "^2.0.3", + "@aws-sdk/client-ssm": "^3.535.0", + "@aws-sdk/lib-dynamodb": "^3.538.0", "@types/aws-lambda": "^8.10.136", "@types/jest": "^29.5.12", - "@types/node": "20.11.24", - "aws-cdk": "^2.131.0", + "@types/node": "20.11.30", + "aws-cdk": "^2.133.0", "constructs": "^10.3.0", - "esbuild": "^0.20.1", + "esbuild": "^0.20.2", "jest": "^29.7.0", "ts-jest": "^29.1.2", "ts-node": "^10.9.2", - "typescript": "^5.3.3" + "typescript": "^5.4.3" }, "dependencies": { "@middy/core": "^4.7.0", - "aws-cdk-lib": "^2.131.0", + "aws-cdk-lib": "^2.133.0", "construct": "^1.0.0", "phin": "^3.7.0", "source-map-support": "^0.5.21" diff --git a/examples/sam/CHANGELOG.md b/examples/sam/CHANGELOG.md index 933c34b8b6..4850908a46 100644 --- a/examples/sam/CHANGELOG.md +++ b/examples/sam/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## 2.0.3 (2024-03-15) + +**Note:** Version bump only for package sam-example + + + + + ## 2.0.2 (2024-03-05) **Note:** Version bump only for package sam-example diff --git a/examples/sam/package.json b/examples/sam/package.json index 7546f64e4b..139739c29a 100644 --- a/examples/sam/package.json +++ b/examples/sam/package.json @@ -1,6 +1,6 @@ { "name": "sam-example", - "version": "2.0.2", + "version": "2.0.3", "author": { "name": "Amazon Web Services", "url": "https://aws.amazon.com" @@ -21,23 +21,23 @@ "*.js": "npm run lint-fix" }, "devDependencies": { - "@aws-sdk/client-dynamodb": "^3.528.0", - "@aws-sdk/client-ssm": "^3.525.0", - "@aws-sdk/lib-dynamodb": "^3.528.0", + "@aws-sdk/client-dynamodb": "^3.538.0", + "@aws-sdk/client-ssm": "^3.535.0", + "@aws-sdk/lib-dynamodb": "^3.538.0", "@types/aws-lambda": "^8.10.136", "@types/jest": "^29.5.12", - "@types/node": "^20.11.24", - "esbuild": "^0.20.1", + "@types/node": "^20.11.30", + "esbuild": "^0.20.2", "jest": "^29.7.0", "ts-jest": "^29.1.2", "ts-node": "^10.9.2", - "typescript": "^5.3.3" + "typescript": "^5.4.3" }, "dependencies": { - "@aws-lambda-powertools/logger": "^2.0.2", - "@aws-lambda-powertools/metrics": "^2.0.2", - "@aws-lambda-powertools/parameters": "^2.0.2", - "@aws-lambda-powertools/tracer": "^2.0.2", + "@aws-lambda-powertools/logger": "^2.0.3", + "@aws-lambda-powertools/metrics": "^2.0.3", + "@aws-lambda-powertools/parameters": "^2.0.3", + "@aws-lambda-powertools/tracer": "^2.0.3", "@middy/core": "^4.7.0", "phin": "^3.7.0" } diff --git a/layers/CHANGELOG.md b/layers/CHANGELOG.md index d1b918ff64..6b3b252fc5 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. +## 2.0.3 (2024-03-15) + +**fix:**: add createRequire banner in esm build ([#2231](https://github.com/aws-powertools/powertools-lambda-typescript/issues/2231)) ([730bcc9](https://github.com/aws-powertools/powertools-lambda-typescript/commit/730bcc93c027f4d60788badb6c5c01a09b3c70be)) + ## 2.0.2 (2024-03-05) **Note:** Version bump only for package layers diff --git a/layers/package.json b/layers/package.json index f15444af03..a1e546eb5c 100644 --- a/layers/package.json +++ b/layers/package.json @@ -1,6 +1,6 @@ { "name": "layers", - "version": "2.0.2", + "version": "2.0.3", "bin": { "layer": "bin/layers.js" }, @@ -39,8 +39,8 @@ "source-map-support": "^0.5.21" }, "dependencies": { - "aws-cdk": "^2.131.0", - "aws-cdk-lib": "^2.131.0", - "esbuild": "^0.20.1" + "aws-cdk": "^2.133.0", + "aws-cdk-lib": "^2.133.0", + "esbuild": "^0.20.2" } } diff --git a/layers/src/layer-publisher-stack.ts b/layers/src/layer-publisher-stack.ts index 49b2d87ede..b2bb6f90e6 100644 --- a/layers/src/layer-publisher-stack.ts +++ b/layers/src/layer-publisher-stack.ts @@ -174,10 +174,24 @@ export class LayerPublisherStack extends Stack { .join(' ')}` ); - // Phase 5: Copy files from tmp folder to cdk.out asset folder (the folder is created by CDK) + // Phase 5: patch require keyword in ESM Tracer package due to AWS X-Ray SDK for Node.js not being ESM compatible + const esmTracerPath = join( + tmpBuildDir, + 'node_modules', + '@aws-lambda-powertools/tracer', + 'lib', + 'esm', + 'provider', + 'ProviderService.js' + ); + execSync( + `echo "import { createRequire } from 'module'; const require = createRequire(import.meta.url);$(cat ${esmTracerPath})" > ${esmTracerPath}` + ); + + // Phase 6: Copy files from tmp folder to cdk.out asset folder (the folder is created by CDK) execSync(`cp -R ${tmpBuildPath}${sep}* ${outputDir}`); - // Phase 6: (Optional) Restore changes to the project root made by the build + // Phase 7: (Optional) Restore changes to the project root made by the build buildFromLocal && execSync('git restore packages/*/package.json', { cwd: projectRoot, diff --git a/lerna.json b/lerna.json index 48ef50e999..a8de03dfe1 100644 --- a/lerna.json +++ b/lerna.json @@ -14,7 +14,7 @@ "layers", "docs/snippets" ], - "version": "2.0.2", + "version": "2.0.3", "npmClient": "npm", "message": "chore(release): %s [skip ci]" -} \ No newline at end of file +} diff --git a/package-lock.json b/package-lock.json index 51c442979c..016900181f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -27,7 +27,7 @@ "@middy/core": "^4.7.0", "@types/aws-lambda": "^8.10.136", "@types/jest": "^29.5.12", - "@types/node": "^20.11.24", + "@types/node": "^20.11.30", "@typescript-eslint/eslint-plugin": "^6.21.0", "@typescript-eslint/parser": "^6.21.0", "eslint": "^8.57.0", @@ -44,9 +44,9 @@ "prettier": "^3.2.5", "ts-jest": "^29.1.2", "ts-node": "^10.9.2", - "typedoc": "^0.25.11", + "typedoc": "^0.25.12", "typedoc-plugin-missing-exports": "^2.2.0", - "typescript": "^5.3.3" + "typescript": "^5.4.3" }, "engines": { "node": ">=16" @@ -54,28 +54,28 @@ }, "docs/snippets": { "name": "docs", - "version": "2.0.2", + "version": "2.0.3", "license": "MIT-0", "devDependencies": { - "@aws-sdk/client-appconfigdata": "^3.525.0", - "@aws-sdk/client-dynamodb": "^3.528.0", - "@aws-sdk/client-secrets-manager": "^3.525.0", - "@aws-sdk/client-ssm": "^3.525.0", - "@aws-sdk/util-dynamodb": "^3.528.0", - "aws-sdk": "^2.1568.0", - "aws-sdk-client-mock": "^3.0.1", - "aws-sdk-client-mock-jest": "^3.0.1", - "axios": "^1.6.7", + "@aws-sdk/client-appconfigdata": "^3.535.0", + "@aws-sdk/client-dynamodb": "^3.538.0", + "@aws-sdk/client-secrets-manager": "^3.535.0", + "@aws-sdk/client-ssm": "^3.535.0", + "@aws-sdk/util-dynamodb": "^3.538.0", + "aws-sdk": "^2.1583.0", + "aws-sdk-client-mock": "^4.0.0", + "aws-sdk-client-mock-jest": "^4.0.0", + "axios": "^1.6.8", "hashi-vault-js": "^0.4.14" } }, "examples/cdk": { "name": "cdk-sample", - "version": "2.0.2", + "version": "2.0.3", "license": "MIT-0", "dependencies": { "@middy/core": "^4.7.0", - "aws-cdk-lib": "^2.131.0", + "aws-cdk-lib": "^2.133.0", "construct": "^1.0.0", "phin": "^3.7.0", "source-map-support": "^0.5.21" @@ -84,58 +84,58 @@ "cdk-app": "bin/cdk-app.js" }, "devDependencies": { - "@aws-lambda-powertools/commons": "^2.0.2", - "@aws-lambda-powertools/logger": "^2.0.2", - "@aws-lambda-powertools/metrics": "^2.0.2", - "@aws-lambda-powertools/parameters": "^2.0.2", - "@aws-lambda-powertools/tracer": "^2.0.2", - "@aws-sdk/client-ssm": "^3.525.0", - "@aws-sdk/lib-dynamodb": "^3.528.0", + "@aws-lambda-powertools/commons": "^2.0.3", + "@aws-lambda-powertools/logger": "^2.0.3", + "@aws-lambda-powertools/metrics": "^2.0.3", + "@aws-lambda-powertools/parameters": "^2.0.3", + "@aws-lambda-powertools/tracer": "^2.0.3", + "@aws-sdk/client-ssm": "^3.535.0", + "@aws-sdk/lib-dynamodb": "^3.538.0", "@types/aws-lambda": "^8.10.136", "@types/jest": "^29.5.12", - "@types/node": "20.11.24", - "aws-cdk": "^2.131.0", + "@types/node": "20.11.30", + "aws-cdk": "^2.133.0", "constructs": "^10.3.0", - "esbuild": "^0.20.1", + "esbuild": "^0.20.2", "jest": "^29.7.0", "ts-jest": "^29.1.2", "ts-node": "^10.9.2", - "typescript": "^5.3.3" + "typescript": "^5.4.3" } }, "examples/sam": { "name": "sam-example", - "version": "2.0.2", + "version": "2.0.3", "license": "MIT-0", "dependencies": { - "@aws-lambda-powertools/logger": "^2.0.2", - "@aws-lambda-powertools/metrics": "^2.0.2", - "@aws-lambda-powertools/parameters": "^2.0.2", - "@aws-lambda-powertools/tracer": "^2.0.2", + "@aws-lambda-powertools/logger": "^2.0.3", + "@aws-lambda-powertools/metrics": "^2.0.3", + "@aws-lambda-powertools/parameters": "^2.0.3", + "@aws-lambda-powertools/tracer": "^2.0.3", "@middy/core": "^4.7.0", "phin": "^3.7.0" }, "devDependencies": { - "@aws-sdk/client-dynamodb": "^3.528.0", - "@aws-sdk/client-ssm": "^3.525.0", - "@aws-sdk/lib-dynamodb": "^3.528.0", + "@aws-sdk/client-dynamodb": "^3.538.0", + "@aws-sdk/client-ssm": "^3.535.0", + "@aws-sdk/lib-dynamodb": "^3.538.0", "@types/aws-lambda": "^8.10.136", "@types/jest": "^29.5.12", - "@types/node": "^20.11.24", - "esbuild": "^0.20.1", + "@types/node": "^20.11.30", + "esbuild": "^0.20.2", "jest": "^29.7.0", "ts-jest": "^29.1.2", "ts-node": "^10.9.2", - "typescript": "^5.3.3" + "typescript": "^5.4.3" } }, "layers": { - "version": "2.0.2", + "version": "2.0.3", "license": "MIT-0", "dependencies": { - "aws-cdk": "^2.131.0", - "aws-cdk-lib": "^2.131.0", - "esbuild": "^0.20.1" + "aws-cdk": "^2.133.0", + "aws-cdk-lib": "^2.133.0", + "esbuild": "^0.20.2" }, "bin": { "layer": "bin/layers.js" @@ -318,159 +318,158 @@ "link": true }, "node_modules/@aws-sdk/client-appconfigdata": { - "version": "3.525.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-appconfigdata/-/client-appconfigdata-3.525.0.tgz", - "integrity": "sha512-GdtNOcTSzf5Gg4RxFskrVCNiyLi0KUMXjIueoDK1KdF7/aNCIAbIdqTaHZ4BwE9fma4JpKwexgCHX9myGeVinw==", + "version": "3.535.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-appconfigdata/-/client-appconfigdata-3.535.0.tgz", + "integrity": "sha512-xi0CqbxJKWiXSwIbl+7BPjezENqF1aflSYdaTVZkH2bk+giydXQu4XjqI7+d3TlXlawYMAxxK16RjaRogyzlgw==", "dev": true, "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/client-sts": "3.525.0", - "@aws-sdk/core": "3.525.0", - "@aws-sdk/credential-provider-node": "3.525.0", - "@aws-sdk/middleware-host-header": "3.523.0", - "@aws-sdk/middleware-logger": "3.523.0", - "@aws-sdk/middleware-recursion-detection": "3.523.0", - "@aws-sdk/middleware-user-agent": "3.525.0", - "@aws-sdk/region-config-resolver": "3.525.0", - "@aws-sdk/types": "3.523.0", - "@aws-sdk/util-endpoints": "3.525.0", - "@aws-sdk/util-user-agent-browser": "3.523.0", - "@aws-sdk/util-user-agent-node": "3.525.0", - "@smithy/config-resolver": "^2.1.4", - "@smithy/core": "^1.3.5", - "@smithy/fetch-http-handler": "^2.4.3", - "@smithy/hash-node": "^2.1.3", - "@smithy/invalid-dependency": "^2.1.3", - "@smithy/middleware-content-length": "^2.1.3", - "@smithy/middleware-endpoint": "^2.4.4", - "@smithy/middleware-retry": "^2.1.4", - "@smithy/middleware-serde": "^2.1.3", - "@smithy/middleware-stack": "^2.1.3", - "@smithy/node-config-provider": "^2.2.4", - "@smithy/node-http-handler": "^2.4.1", - "@smithy/protocol-http": "^3.2.1", - "@smithy/smithy-client": "^2.4.2", - "@smithy/types": "^2.10.1", - "@smithy/url-parser": "^2.1.3", - "@smithy/util-base64": "^2.1.1", - "@smithy/util-body-length-browser": "^2.1.1", - "@smithy/util-body-length-node": "^2.2.1", - "@smithy/util-defaults-mode-browser": "^2.1.4", - "@smithy/util-defaults-mode-node": "^2.2.3", - "@smithy/util-endpoints": "^1.1.4", - "@smithy/util-middleware": "^2.1.3", - "@smithy/util-retry": "^2.1.3", - "@smithy/util-stream": "^2.1.3", - "@smithy/util-utf8": "^2.1.1", - "tslib": "^2.5.0" + "@aws-sdk/client-sts": "3.535.0", + "@aws-sdk/core": "3.535.0", + "@aws-sdk/credential-provider-node": "3.535.0", + "@aws-sdk/middleware-host-header": "3.535.0", + "@aws-sdk/middleware-logger": "3.535.0", + "@aws-sdk/middleware-recursion-detection": "3.535.0", + "@aws-sdk/middleware-user-agent": "3.535.0", + "@aws-sdk/region-config-resolver": "3.535.0", + "@aws-sdk/types": "3.535.0", + "@aws-sdk/util-endpoints": "3.535.0", + "@aws-sdk/util-user-agent-browser": "3.535.0", + "@aws-sdk/util-user-agent-node": "3.535.0", + "@smithy/config-resolver": "^2.2.0", + "@smithy/core": "^1.4.0", + "@smithy/fetch-http-handler": "^2.5.0", + "@smithy/hash-node": "^2.2.0", + "@smithy/invalid-dependency": "^2.2.0", + "@smithy/middleware-content-length": "^2.2.0", + "@smithy/middleware-endpoint": "^2.5.0", + "@smithy/middleware-retry": "^2.2.0", + "@smithy/middleware-serde": "^2.3.0", + "@smithy/middleware-stack": "^2.2.0", + "@smithy/node-config-provider": "^2.3.0", + "@smithy/node-http-handler": "^2.5.0", + "@smithy/protocol-http": "^3.3.0", + "@smithy/smithy-client": "^2.5.0", + "@smithy/types": "^2.12.0", + "@smithy/url-parser": "^2.2.0", + "@smithy/util-base64": "^2.3.0", + "@smithy/util-body-length-browser": "^2.2.0", + "@smithy/util-body-length-node": "^2.3.0", + "@smithy/util-defaults-mode-browser": "^2.2.0", + "@smithy/util-defaults-mode-node": "^2.3.0", + "@smithy/util-endpoints": "^1.2.0", + "@smithy/util-middleware": "^2.2.0", + "@smithy/util-retry": "^2.2.0", + "@smithy/util-stream": "^2.2.0", + "@smithy/util-utf8": "^2.3.0", + "tslib": "^2.6.2" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/client-cloudwatch": { - "version": "3.525.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-cloudwatch/-/client-cloudwatch-3.525.0.tgz", - "integrity": "sha512-qi73IN/cGDxixHKnO99UIzGhYshStPXsZou8PNp0ee6ZJgyEpwtj1lFAoAEAbYcD0/PjtXsVNCOpyA1VXNjDDQ==", + "version": "3.535.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cloudwatch/-/client-cloudwatch-3.535.0.tgz", + "integrity": "sha512-6oD45p30wdZotLiAUeBw4OQZCCoFrp9l6Z6LHUkCaYNor4sstNn9uIpkqmtNmQ7xmhzIgD5MXRqci0aUIt37qg==", "dev": true, "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/client-sts": "3.525.0", - "@aws-sdk/core": "3.525.0", - "@aws-sdk/credential-provider-node": "3.525.0", - "@aws-sdk/middleware-host-header": "3.523.0", - "@aws-sdk/middleware-logger": "3.523.0", - "@aws-sdk/middleware-recursion-detection": "3.523.0", - "@aws-sdk/middleware-user-agent": "3.525.0", - "@aws-sdk/region-config-resolver": "3.525.0", - "@aws-sdk/types": "3.523.0", - "@aws-sdk/util-endpoints": "3.525.0", - "@aws-sdk/util-user-agent-browser": "3.523.0", - "@aws-sdk/util-user-agent-node": "3.525.0", - "@smithy/config-resolver": "^2.1.4", - "@smithy/core": "^1.3.5", - "@smithy/fetch-http-handler": "^2.4.3", - "@smithy/hash-node": "^2.1.3", - "@smithy/invalid-dependency": "^2.1.3", - "@smithy/middleware-compression": "^2.1.4", - "@smithy/middleware-content-length": "^2.1.3", - "@smithy/middleware-endpoint": "^2.4.4", - "@smithy/middleware-retry": "^2.1.4", - "@smithy/middleware-serde": "^2.1.3", - "@smithy/middleware-stack": "^2.1.3", - "@smithy/node-config-provider": "^2.2.4", - "@smithy/node-http-handler": "^2.4.1", - "@smithy/protocol-http": "^3.2.1", - "@smithy/smithy-client": "^2.4.2", - "@smithy/types": "^2.10.1", - "@smithy/url-parser": "^2.1.3", - "@smithy/util-base64": "^2.1.1", - "@smithy/util-body-length-browser": "^2.1.1", - "@smithy/util-body-length-node": "^2.2.1", - "@smithy/util-defaults-mode-browser": "^2.1.4", - "@smithy/util-defaults-mode-node": "^2.2.3", - "@smithy/util-endpoints": "^1.1.4", - "@smithy/util-middleware": "^2.1.3", - "@smithy/util-retry": "^2.1.3", - "@smithy/util-utf8": "^2.1.1", - "@smithy/util-waiter": "^2.1.3", - "fast-xml-parser": "4.2.5", - "tslib": "^2.5.0" + "@aws-sdk/client-sts": "3.535.0", + "@aws-sdk/core": "3.535.0", + "@aws-sdk/credential-provider-node": "3.535.0", + "@aws-sdk/middleware-host-header": "3.535.0", + "@aws-sdk/middleware-logger": "3.535.0", + "@aws-sdk/middleware-recursion-detection": "3.535.0", + "@aws-sdk/middleware-user-agent": "3.535.0", + "@aws-sdk/region-config-resolver": "3.535.0", + "@aws-sdk/types": "3.535.0", + "@aws-sdk/util-endpoints": "3.535.0", + "@aws-sdk/util-user-agent-browser": "3.535.0", + "@aws-sdk/util-user-agent-node": "3.535.0", + "@smithy/config-resolver": "^2.2.0", + "@smithy/core": "^1.4.0", + "@smithy/fetch-http-handler": "^2.5.0", + "@smithy/hash-node": "^2.2.0", + "@smithy/invalid-dependency": "^2.2.0", + "@smithy/middleware-compression": "^2.2.0", + "@smithy/middleware-content-length": "^2.2.0", + "@smithy/middleware-endpoint": "^2.5.0", + "@smithy/middleware-retry": "^2.2.0", + "@smithy/middleware-serde": "^2.3.0", + "@smithy/middleware-stack": "^2.2.0", + "@smithy/node-config-provider": "^2.3.0", + "@smithy/node-http-handler": "^2.5.0", + "@smithy/protocol-http": "^3.3.0", + "@smithy/smithy-client": "^2.5.0", + "@smithy/types": "^2.12.0", + "@smithy/url-parser": "^2.2.0", + "@smithy/util-base64": "^2.3.0", + "@smithy/util-body-length-browser": "^2.2.0", + "@smithy/util-body-length-node": "^2.3.0", + "@smithy/util-defaults-mode-browser": "^2.2.0", + "@smithy/util-defaults-mode-node": "^2.3.0", + "@smithy/util-endpoints": "^1.2.0", + "@smithy/util-middleware": "^2.2.0", + "@smithy/util-retry": "^2.2.0", + "@smithy/util-utf8": "^2.3.0", + "@smithy/util-waiter": "^2.2.0", + "tslib": "^2.6.2" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/client-dynamodb": { - "version": "3.528.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-dynamodb/-/client-dynamodb-3.528.0.tgz", - "integrity": "sha512-qqgw2NM4m+WgZ5owLe7+ThtCpjnRxTA19ojFcxcrnKksXngwNqcWof6/OXhGkumeN73IdS08upiw4904ZbjZlQ==", + "version": "3.538.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-dynamodb/-/client-dynamodb-3.538.0.tgz", + "integrity": "sha512-5OAc3AdcAlfzWLOJtIc0vBm2o9VHUyrmOayN+/OcQVvaOWCcGHwqanYVoEmqNaMKiAc5DKV1uARBj5MDLHyhqA==", "dev": true, "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/client-sts": "3.525.0", - "@aws-sdk/core": "3.525.0", - "@aws-sdk/credential-provider-node": "3.525.0", - "@aws-sdk/middleware-endpoint-discovery": "3.525.0", - "@aws-sdk/middleware-host-header": "3.523.0", - "@aws-sdk/middleware-logger": "3.523.0", - "@aws-sdk/middleware-recursion-detection": "3.523.0", - "@aws-sdk/middleware-user-agent": "3.525.0", - "@aws-sdk/region-config-resolver": "3.525.0", - "@aws-sdk/types": "3.523.0", - "@aws-sdk/util-endpoints": "3.525.0", - "@aws-sdk/util-user-agent-browser": "3.523.0", - "@aws-sdk/util-user-agent-node": "3.525.0", - "@smithy/config-resolver": "^2.1.4", - "@smithy/core": "^1.3.5", - "@smithy/fetch-http-handler": "^2.4.3", - "@smithy/hash-node": "^2.1.3", - "@smithy/invalid-dependency": "^2.1.3", - "@smithy/middleware-content-length": "^2.1.3", - "@smithy/middleware-endpoint": "^2.4.4", - "@smithy/middleware-retry": "^2.1.4", - "@smithy/middleware-serde": "^2.1.3", - "@smithy/middleware-stack": "^2.1.3", - "@smithy/node-config-provider": "^2.2.4", - "@smithy/node-http-handler": "^2.4.1", - "@smithy/protocol-http": "^3.2.1", - "@smithy/smithy-client": "^2.4.2", - "@smithy/types": "^2.10.1", - "@smithy/url-parser": "^2.1.3", - "@smithy/util-base64": "^2.1.1", - "@smithy/util-body-length-browser": "^2.1.1", - "@smithy/util-body-length-node": "^2.2.1", - "@smithy/util-defaults-mode-browser": "^2.1.4", - "@smithy/util-defaults-mode-node": "^2.2.3", - "@smithy/util-endpoints": "^1.1.4", - "@smithy/util-middleware": "^2.1.3", - "@smithy/util-retry": "^2.1.3", - "@smithy/util-utf8": "^2.1.1", - "@smithy/util-waiter": "^2.1.3", - "tslib": "^2.5.0", + "@aws-sdk/client-sts": "3.535.0", + "@aws-sdk/core": "3.535.0", + "@aws-sdk/credential-provider-node": "3.535.0", + "@aws-sdk/middleware-endpoint-discovery": "3.535.0", + "@aws-sdk/middleware-host-header": "3.535.0", + "@aws-sdk/middleware-logger": "3.535.0", + "@aws-sdk/middleware-recursion-detection": "3.535.0", + "@aws-sdk/middleware-user-agent": "3.535.0", + "@aws-sdk/region-config-resolver": "3.535.0", + "@aws-sdk/types": "3.535.0", + "@aws-sdk/util-endpoints": "3.535.0", + "@aws-sdk/util-user-agent-browser": "3.535.0", + "@aws-sdk/util-user-agent-node": "3.535.0", + "@smithy/config-resolver": "^2.2.0", + "@smithy/core": "^1.4.0", + "@smithy/fetch-http-handler": "^2.5.0", + "@smithy/hash-node": "^2.2.0", + "@smithy/invalid-dependency": "^2.2.0", + "@smithy/middleware-content-length": "^2.2.0", + "@smithy/middleware-endpoint": "^2.5.0", + "@smithy/middleware-retry": "^2.2.0", + "@smithy/middleware-serde": "^2.3.0", + "@smithy/middleware-stack": "^2.2.0", + "@smithy/node-config-provider": "^2.3.0", + "@smithy/node-http-handler": "^2.5.0", + "@smithy/protocol-http": "^3.3.0", + "@smithy/smithy-client": "^2.5.0", + "@smithy/types": "^2.12.0", + "@smithy/url-parser": "^2.2.0", + "@smithy/util-base64": "^2.3.0", + "@smithy/util-body-length-browser": "^2.2.0", + "@smithy/util-body-length-node": "^2.3.0", + "@smithy/util-defaults-mode-browser": "^2.2.0", + "@smithy/util-defaults-mode-node": "^2.3.0", + "@smithy/util-endpoints": "^1.2.0", + "@smithy/util-middleware": "^2.2.0", + "@smithy/util-retry": "^2.2.0", + "@smithy/util-utf8": "^2.3.0", + "@smithy/util-waiter": "^2.2.0", + "tslib": "^2.6.2", "uuid": "^9.0.1" }, "engines": { @@ -491,106 +490,106 @@ } }, "node_modules/@aws-sdk/client-lambda": { - "version": "3.525.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-lambda/-/client-lambda-3.525.0.tgz", - "integrity": "sha512-Jsz2F6X6DBV962T4wTyQgP2KqsIS3Hxw6shC5653tapCrR+AK2psFpeKs9w3SQA8D0SnEOAQf/5ay4n9sL+fZw==", + "version": "3.536.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-lambda/-/client-lambda-3.536.0.tgz", + "integrity": "sha512-gzrJO9ZuRVnnTHPhSL+sN9MA0t4Cu3+iIEehF3F2ApLUa7SiCr6cNPqLnEReC8Q5FTWX0imxVQG5jHvuKY20BQ==", "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/client-sts": "3.525.0", - "@aws-sdk/core": "3.525.0", - "@aws-sdk/credential-provider-node": "3.525.0", - "@aws-sdk/middleware-host-header": "3.523.0", - "@aws-sdk/middleware-logger": "3.523.0", - "@aws-sdk/middleware-recursion-detection": "3.523.0", - "@aws-sdk/middleware-user-agent": "3.525.0", - "@aws-sdk/region-config-resolver": "3.525.0", - "@aws-sdk/types": "3.523.0", - "@aws-sdk/util-endpoints": "3.525.0", - "@aws-sdk/util-user-agent-browser": "3.523.0", - "@aws-sdk/util-user-agent-node": "3.525.0", - "@smithy/config-resolver": "^2.1.4", - "@smithy/core": "^1.3.5", - "@smithy/eventstream-serde-browser": "^2.1.3", - "@smithy/eventstream-serde-config-resolver": "^2.1.3", - "@smithy/eventstream-serde-node": "^2.1.3", - "@smithy/fetch-http-handler": "^2.4.3", - "@smithy/hash-node": "^2.1.3", - "@smithy/invalid-dependency": "^2.1.3", - "@smithy/middleware-content-length": "^2.1.3", - "@smithy/middleware-endpoint": "^2.4.4", - "@smithy/middleware-retry": "^2.1.4", - "@smithy/middleware-serde": "^2.1.3", - "@smithy/middleware-stack": "^2.1.3", - "@smithy/node-config-provider": "^2.2.4", - "@smithy/node-http-handler": "^2.4.1", - "@smithy/protocol-http": "^3.2.1", - "@smithy/smithy-client": "^2.4.2", - "@smithy/types": "^2.10.1", - "@smithy/url-parser": "^2.1.3", - "@smithy/util-base64": "^2.1.1", - "@smithy/util-body-length-browser": "^2.1.1", - "@smithy/util-body-length-node": "^2.2.1", - "@smithy/util-defaults-mode-browser": "^2.1.4", - "@smithy/util-defaults-mode-node": "^2.2.3", - "@smithy/util-endpoints": "^1.1.4", - "@smithy/util-middleware": "^2.1.3", - "@smithy/util-retry": "^2.1.3", - "@smithy/util-stream": "^2.1.3", - "@smithy/util-utf8": "^2.1.1", - "@smithy/util-waiter": "^2.1.3", - "tslib": "^2.5.0" + "@aws-sdk/client-sts": "3.535.0", + "@aws-sdk/core": "3.535.0", + "@aws-sdk/credential-provider-node": "3.535.0", + "@aws-sdk/middleware-host-header": "3.535.0", + "@aws-sdk/middleware-logger": "3.535.0", + "@aws-sdk/middleware-recursion-detection": "3.535.0", + "@aws-sdk/middleware-user-agent": "3.535.0", + "@aws-sdk/region-config-resolver": "3.535.0", + "@aws-sdk/types": "3.535.0", + "@aws-sdk/util-endpoints": "3.535.0", + "@aws-sdk/util-user-agent-browser": "3.535.0", + "@aws-sdk/util-user-agent-node": "3.535.0", + "@smithy/config-resolver": "^2.2.0", + "@smithy/core": "^1.4.0", + "@smithy/eventstream-serde-browser": "^2.2.0", + "@smithy/eventstream-serde-config-resolver": "^2.2.0", + "@smithy/eventstream-serde-node": "^2.2.0", + "@smithy/fetch-http-handler": "^2.5.0", + "@smithy/hash-node": "^2.2.0", + "@smithy/invalid-dependency": "^2.2.0", + "@smithy/middleware-content-length": "^2.2.0", + "@smithy/middleware-endpoint": "^2.5.0", + "@smithy/middleware-retry": "^2.2.0", + "@smithy/middleware-serde": "^2.3.0", + "@smithy/middleware-stack": "^2.2.0", + "@smithy/node-config-provider": "^2.3.0", + "@smithy/node-http-handler": "^2.5.0", + "@smithy/protocol-http": "^3.3.0", + "@smithy/smithy-client": "^2.5.0", + "@smithy/types": "^2.12.0", + "@smithy/url-parser": "^2.2.0", + "@smithy/util-base64": "^2.3.0", + "@smithy/util-body-length-browser": "^2.2.0", + "@smithy/util-body-length-node": "^2.3.0", + "@smithy/util-defaults-mode-browser": "^2.2.0", + "@smithy/util-defaults-mode-node": "^2.3.0", + "@smithy/util-endpoints": "^1.2.0", + "@smithy/util-middleware": "^2.2.0", + "@smithy/util-retry": "^2.2.0", + "@smithy/util-stream": "^2.2.0", + "@smithy/util-utf8": "^2.3.0", + "@smithy/util-waiter": "^2.2.0", + "tslib": "^2.6.2" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/client-secrets-manager": { - "version": "3.525.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-secrets-manager/-/client-secrets-manager-3.525.0.tgz", - "integrity": "sha512-YhPfH87BWGNrkfV7VkP1EyjNzPkgqxen5aBqQKgJOxPy1M2+kNjqB9zQ/B/Q3T6cyQ/aduQ7Bi7bm3cqihmtbA==", + "version": "3.535.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-secrets-manager/-/client-secrets-manager-3.535.0.tgz", + "integrity": "sha512-vP4/3eYBDSxlV//OLTceUTP3EQIRlESvxeFxwdxtD2gF6FVHA96SlADj8/7N+ky+Vvs5YXmOSwIgfHlkrcvBjA==", "dev": true, "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/client-sts": "3.525.0", - "@aws-sdk/core": "3.525.0", - "@aws-sdk/credential-provider-node": "3.525.0", - "@aws-sdk/middleware-host-header": "3.523.0", - "@aws-sdk/middleware-logger": "3.523.0", - "@aws-sdk/middleware-recursion-detection": "3.523.0", - "@aws-sdk/middleware-user-agent": "3.525.0", - "@aws-sdk/region-config-resolver": "3.525.0", - "@aws-sdk/types": "3.523.0", - "@aws-sdk/util-endpoints": "3.525.0", - "@aws-sdk/util-user-agent-browser": "3.523.0", - "@aws-sdk/util-user-agent-node": "3.525.0", - "@smithy/config-resolver": "^2.1.4", - "@smithy/core": "^1.3.5", - "@smithy/fetch-http-handler": "^2.4.3", - "@smithy/hash-node": "^2.1.3", - "@smithy/invalid-dependency": "^2.1.3", - "@smithy/middleware-content-length": "^2.1.3", - "@smithy/middleware-endpoint": "^2.4.4", - "@smithy/middleware-retry": "^2.1.4", - "@smithy/middleware-serde": "^2.1.3", - "@smithy/middleware-stack": "^2.1.3", - "@smithy/node-config-provider": "^2.2.4", - "@smithy/node-http-handler": "^2.4.1", - "@smithy/protocol-http": "^3.2.1", - "@smithy/smithy-client": "^2.4.2", - "@smithy/types": "^2.10.1", - "@smithy/url-parser": "^2.1.3", - "@smithy/util-base64": "^2.1.1", - "@smithy/util-body-length-browser": "^2.1.1", - "@smithy/util-body-length-node": "^2.2.1", - "@smithy/util-defaults-mode-browser": "^2.1.4", - "@smithy/util-defaults-mode-node": "^2.2.3", - "@smithy/util-endpoints": "^1.1.4", - "@smithy/util-middleware": "^2.1.3", - "@smithy/util-retry": "^2.1.3", - "@smithy/util-utf8": "^2.1.1", - "tslib": "^2.5.0", + "@aws-sdk/client-sts": "3.535.0", + "@aws-sdk/core": "3.535.0", + "@aws-sdk/credential-provider-node": "3.535.0", + "@aws-sdk/middleware-host-header": "3.535.0", + "@aws-sdk/middleware-logger": "3.535.0", + "@aws-sdk/middleware-recursion-detection": "3.535.0", + "@aws-sdk/middleware-user-agent": "3.535.0", + "@aws-sdk/region-config-resolver": "3.535.0", + "@aws-sdk/types": "3.535.0", + "@aws-sdk/util-endpoints": "3.535.0", + "@aws-sdk/util-user-agent-browser": "3.535.0", + "@aws-sdk/util-user-agent-node": "3.535.0", + "@smithy/config-resolver": "^2.2.0", + "@smithy/core": "^1.4.0", + "@smithy/fetch-http-handler": "^2.5.0", + "@smithy/hash-node": "^2.2.0", + "@smithy/invalid-dependency": "^2.2.0", + "@smithy/middleware-content-length": "^2.2.0", + "@smithy/middleware-endpoint": "^2.5.0", + "@smithy/middleware-retry": "^2.2.0", + "@smithy/middleware-serde": "^2.3.0", + "@smithy/middleware-stack": "^2.2.0", + "@smithy/node-config-provider": "^2.3.0", + "@smithy/node-http-handler": "^2.5.0", + "@smithy/protocol-http": "^3.3.0", + "@smithy/smithy-client": "^2.5.0", + "@smithy/types": "^2.12.0", + "@smithy/url-parser": "^2.2.0", + "@smithy/util-base64": "^2.3.0", + "@smithy/util-body-length-browser": "^2.2.0", + "@smithy/util-body-length-node": "^2.3.0", + "@smithy/util-defaults-mode-browser": "^2.2.0", + "@smithy/util-defaults-mode-node": "^2.3.0", + "@smithy/util-endpoints": "^1.2.0", + "@smithy/util-middleware": "^2.2.0", + "@smithy/util-retry": "^2.2.0", + "@smithy/util-utf8": "^2.3.0", + "tslib": "^2.6.2", "uuid": "^9.0.1" }, "engines": { @@ -611,52 +610,52 @@ } }, "node_modules/@aws-sdk/client-ssm": { - "version": "3.525.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-ssm/-/client-ssm-3.525.0.tgz", - "integrity": "sha512-q/z2CltlIePY/FGAFzuZpVRZuAzEopd2/YmQSCFtGZr04weKKXb+6qxdE3P3rdJf+a4MILcLszR3M+xmjK9Rlg==", + "version": "3.535.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-ssm/-/client-ssm-3.535.0.tgz", + "integrity": "sha512-W2fOV3LJeHLRBVVioNtBx4cCdyNCM66TfHBi/oe4NZw5Hp58+w5W8N5sV2VVEGawigczt+pp83zGFftjj7OwOg==", "dev": true, "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/client-sts": "3.525.0", - "@aws-sdk/core": "3.525.0", - "@aws-sdk/credential-provider-node": "3.525.0", - "@aws-sdk/middleware-host-header": "3.523.0", - "@aws-sdk/middleware-logger": "3.523.0", - "@aws-sdk/middleware-recursion-detection": "3.523.0", - "@aws-sdk/middleware-user-agent": "3.525.0", - "@aws-sdk/region-config-resolver": "3.525.0", - "@aws-sdk/types": "3.523.0", - "@aws-sdk/util-endpoints": "3.525.0", - "@aws-sdk/util-user-agent-browser": "3.523.0", - "@aws-sdk/util-user-agent-node": "3.525.0", - "@smithy/config-resolver": "^2.1.4", - "@smithy/core": "^1.3.5", - "@smithy/fetch-http-handler": "^2.4.3", - "@smithy/hash-node": "^2.1.3", - "@smithy/invalid-dependency": "^2.1.3", - "@smithy/middleware-content-length": "^2.1.3", - "@smithy/middleware-endpoint": "^2.4.4", - "@smithy/middleware-retry": "^2.1.4", - "@smithy/middleware-serde": "^2.1.3", - "@smithy/middleware-stack": "^2.1.3", - "@smithy/node-config-provider": "^2.2.4", - "@smithy/node-http-handler": "^2.4.1", - "@smithy/protocol-http": "^3.2.1", - "@smithy/smithy-client": "^2.4.2", - "@smithy/types": "^2.10.1", - "@smithy/url-parser": "^2.1.3", - "@smithy/util-base64": "^2.1.1", - "@smithy/util-body-length-browser": "^2.1.1", - "@smithy/util-body-length-node": "^2.2.1", - "@smithy/util-defaults-mode-browser": "^2.1.4", - "@smithy/util-defaults-mode-node": "^2.2.3", - "@smithy/util-endpoints": "^1.1.4", - "@smithy/util-middleware": "^2.1.3", - "@smithy/util-retry": "^2.1.3", - "@smithy/util-utf8": "^2.1.1", - "@smithy/util-waiter": "^2.1.3", - "tslib": "^2.5.0", + "@aws-sdk/client-sts": "3.535.0", + "@aws-sdk/core": "3.535.0", + "@aws-sdk/credential-provider-node": "3.535.0", + "@aws-sdk/middleware-host-header": "3.535.0", + "@aws-sdk/middleware-logger": "3.535.0", + "@aws-sdk/middleware-recursion-detection": "3.535.0", + "@aws-sdk/middleware-user-agent": "3.535.0", + "@aws-sdk/region-config-resolver": "3.535.0", + "@aws-sdk/types": "3.535.0", + "@aws-sdk/util-endpoints": "3.535.0", + "@aws-sdk/util-user-agent-browser": "3.535.0", + "@aws-sdk/util-user-agent-node": "3.535.0", + "@smithy/config-resolver": "^2.2.0", + "@smithy/core": "^1.4.0", + "@smithy/fetch-http-handler": "^2.5.0", + "@smithy/hash-node": "^2.2.0", + "@smithy/invalid-dependency": "^2.2.0", + "@smithy/middleware-content-length": "^2.2.0", + "@smithy/middleware-endpoint": "^2.5.0", + "@smithy/middleware-retry": "^2.2.0", + "@smithy/middleware-serde": "^2.3.0", + "@smithy/middleware-stack": "^2.2.0", + "@smithy/node-config-provider": "^2.3.0", + "@smithy/node-http-handler": "^2.5.0", + "@smithy/protocol-http": "^3.3.0", + "@smithy/smithy-client": "^2.5.0", + "@smithy/types": "^2.12.0", + "@smithy/url-parser": "^2.2.0", + "@smithy/util-base64": "^2.3.0", + "@smithy/util-body-length-browser": "^2.2.0", + "@smithy/util-body-length-node": "^2.3.0", + "@smithy/util-defaults-mode-browser": "^2.2.0", + "@smithy/util-defaults-mode-node": "^2.3.0", + "@smithy/util-endpoints": "^1.2.0", + "@smithy/util-middleware": "^2.2.0", + "@smithy/util-retry": "^2.2.0", + "@smithy/util-utf8": "^2.3.0", + "@smithy/util-waiter": "^2.2.0", + "tslib": "^2.6.2", "uuid": "^9.0.1" }, "engines": { @@ -677,355 +676,355 @@ } }, "node_modules/@aws-sdk/client-sso": { - "version": "3.525.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.525.0.tgz", - "integrity": "sha512-6KwGQWFoNLH1UupdWPFdKPfTgjSz1kN8/r8aCzuvvXBe4Pz+iDUZ6FEJzGWNc9AapjvZDNO1hs23slomM9rTaA==", + "version": "3.535.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.535.0.tgz", + "integrity": "sha512-h9eQRdFnjDRVBnPJIKXuX7D+isSAioIfZPC4PQwsL5BscTRlk4c90DX0R0uk64YUtp7LZu8TNtrosFZ/1HtTrQ==", "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/core": "3.525.0", - "@aws-sdk/middleware-host-header": "3.523.0", - "@aws-sdk/middleware-logger": "3.523.0", - "@aws-sdk/middleware-recursion-detection": "3.523.0", - "@aws-sdk/middleware-user-agent": "3.525.0", - "@aws-sdk/region-config-resolver": "3.525.0", - "@aws-sdk/types": "3.523.0", - "@aws-sdk/util-endpoints": "3.525.0", - "@aws-sdk/util-user-agent-browser": "3.523.0", - "@aws-sdk/util-user-agent-node": "3.525.0", - "@smithy/config-resolver": "^2.1.4", - "@smithy/core": "^1.3.5", - "@smithy/fetch-http-handler": "^2.4.3", - "@smithy/hash-node": "^2.1.3", - "@smithy/invalid-dependency": "^2.1.3", - "@smithy/middleware-content-length": "^2.1.3", - "@smithy/middleware-endpoint": "^2.4.4", - "@smithy/middleware-retry": "^2.1.4", - "@smithy/middleware-serde": "^2.1.3", - "@smithy/middleware-stack": "^2.1.3", - "@smithy/node-config-provider": "^2.2.4", - "@smithy/node-http-handler": "^2.4.1", - "@smithy/protocol-http": "^3.2.1", - "@smithy/smithy-client": "^2.4.2", - "@smithy/types": "^2.10.1", - "@smithy/url-parser": "^2.1.3", - "@smithy/util-base64": "^2.1.1", - "@smithy/util-body-length-browser": "^2.1.1", - "@smithy/util-body-length-node": "^2.2.1", - "@smithy/util-defaults-mode-browser": "^2.1.4", - "@smithy/util-defaults-mode-node": "^2.2.3", - "@smithy/util-endpoints": "^1.1.4", - "@smithy/util-middleware": "^2.1.3", - "@smithy/util-retry": "^2.1.3", - "@smithy/util-utf8": "^2.1.1", - "tslib": "^2.5.0" + "@aws-sdk/core": "3.535.0", + "@aws-sdk/middleware-host-header": "3.535.0", + "@aws-sdk/middleware-logger": "3.535.0", + "@aws-sdk/middleware-recursion-detection": "3.535.0", + "@aws-sdk/middleware-user-agent": "3.535.0", + "@aws-sdk/region-config-resolver": "3.535.0", + "@aws-sdk/types": "3.535.0", + "@aws-sdk/util-endpoints": "3.535.0", + "@aws-sdk/util-user-agent-browser": "3.535.0", + "@aws-sdk/util-user-agent-node": "3.535.0", + "@smithy/config-resolver": "^2.2.0", + "@smithy/core": "^1.4.0", + "@smithy/fetch-http-handler": "^2.5.0", + "@smithy/hash-node": "^2.2.0", + "@smithy/invalid-dependency": "^2.2.0", + "@smithy/middleware-content-length": "^2.2.0", + "@smithy/middleware-endpoint": "^2.5.0", + "@smithy/middleware-retry": "^2.2.0", + "@smithy/middleware-serde": "^2.3.0", + "@smithy/middleware-stack": "^2.2.0", + "@smithy/node-config-provider": "^2.3.0", + "@smithy/node-http-handler": "^2.5.0", + "@smithy/protocol-http": "^3.3.0", + "@smithy/smithy-client": "^2.5.0", + "@smithy/types": "^2.12.0", + "@smithy/url-parser": "^2.2.0", + "@smithy/util-base64": "^2.3.0", + "@smithy/util-body-length-browser": "^2.2.0", + "@smithy/util-body-length-node": "^2.3.0", + "@smithy/util-defaults-mode-browser": "^2.2.0", + "@smithy/util-defaults-mode-node": "^2.3.0", + "@smithy/util-endpoints": "^1.2.0", + "@smithy/util-middleware": "^2.2.0", + "@smithy/util-retry": "^2.2.0", + "@smithy/util-utf8": "^2.3.0", + "tslib": "^2.6.2" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/client-sso-oidc": { - "version": "3.525.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.525.0.tgz", - "integrity": "sha512-zz13k/6RkjPSLmReSeGxd8wzGiiZa4Odr2Tv3wTcxClM4wOjD+zOgGv4Fe32b9AMqaueiCdjbvdu7AKcYxFA4A==", + "version": "3.535.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso-oidc/-/client-sso-oidc-3.535.0.tgz", + "integrity": "sha512-M2cG4EQXDpAJQyq33ORIr6abmdX9p9zX0ssVy8XwFNB7lrgoIKxuVoGL+fX+XMgecl24x7ELz6b4QlILOevbCw==", "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/client-sts": "3.525.0", - "@aws-sdk/core": "3.525.0", - "@aws-sdk/middleware-host-header": "3.523.0", - "@aws-sdk/middleware-logger": "3.523.0", - "@aws-sdk/middleware-recursion-detection": "3.523.0", - "@aws-sdk/middleware-user-agent": "3.525.0", - "@aws-sdk/region-config-resolver": "3.525.0", - "@aws-sdk/types": "3.523.0", - "@aws-sdk/util-endpoints": "3.525.0", - "@aws-sdk/util-user-agent-browser": "3.523.0", - "@aws-sdk/util-user-agent-node": "3.525.0", - "@smithy/config-resolver": "^2.1.4", - "@smithy/core": "^1.3.5", - "@smithy/fetch-http-handler": "^2.4.3", - "@smithy/hash-node": "^2.1.3", - "@smithy/invalid-dependency": "^2.1.3", - "@smithy/middleware-content-length": "^2.1.3", - "@smithy/middleware-endpoint": "^2.4.4", - "@smithy/middleware-retry": "^2.1.4", - "@smithy/middleware-serde": "^2.1.3", - "@smithy/middleware-stack": "^2.1.3", - "@smithy/node-config-provider": "^2.2.4", - "@smithy/node-http-handler": "^2.4.1", - "@smithy/protocol-http": "^3.2.1", - "@smithy/smithy-client": "^2.4.2", - "@smithy/types": "^2.10.1", - "@smithy/url-parser": "^2.1.3", - "@smithy/util-base64": "^2.1.1", - "@smithy/util-body-length-browser": "^2.1.1", - "@smithy/util-body-length-node": "^2.2.1", - "@smithy/util-defaults-mode-browser": "^2.1.4", - "@smithy/util-defaults-mode-node": "^2.2.3", - "@smithy/util-endpoints": "^1.1.4", - "@smithy/util-middleware": "^2.1.3", - "@smithy/util-retry": "^2.1.3", - "@smithy/util-utf8": "^2.1.1", - "tslib": "^2.5.0" + "@aws-sdk/client-sts": "3.535.0", + "@aws-sdk/core": "3.535.0", + "@aws-sdk/middleware-host-header": "3.535.0", + "@aws-sdk/middleware-logger": "3.535.0", + "@aws-sdk/middleware-recursion-detection": "3.535.0", + "@aws-sdk/middleware-user-agent": "3.535.0", + "@aws-sdk/region-config-resolver": "3.535.0", + "@aws-sdk/types": "3.535.0", + "@aws-sdk/util-endpoints": "3.535.0", + "@aws-sdk/util-user-agent-browser": "3.535.0", + "@aws-sdk/util-user-agent-node": "3.535.0", + "@smithy/config-resolver": "^2.2.0", + "@smithy/core": "^1.4.0", + "@smithy/fetch-http-handler": "^2.5.0", + "@smithy/hash-node": "^2.2.0", + "@smithy/invalid-dependency": "^2.2.0", + "@smithy/middleware-content-length": "^2.2.0", + "@smithy/middleware-endpoint": "^2.5.0", + "@smithy/middleware-retry": "^2.2.0", + "@smithy/middleware-serde": "^2.3.0", + "@smithy/middleware-stack": "^2.2.0", + "@smithy/node-config-provider": "^2.3.0", + "@smithy/node-http-handler": "^2.5.0", + "@smithy/protocol-http": "^3.3.0", + "@smithy/smithy-client": "^2.5.0", + "@smithy/types": "^2.12.0", + "@smithy/url-parser": "^2.2.0", + "@smithy/util-base64": "^2.3.0", + "@smithy/util-body-length-browser": "^2.2.0", + "@smithy/util-body-length-node": "^2.3.0", + "@smithy/util-defaults-mode-browser": "^2.2.0", + "@smithy/util-defaults-mode-node": "^2.3.0", + "@smithy/util-endpoints": "^1.2.0", + "@smithy/util-middleware": "^2.2.0", + "@smithy/util-retry": "^2.2.0", + "@smithy/util-utf8": "^2.3.0", + "tslib": "^2.6.2" }, "engines": { "node": ">=14.0.0" }, "peerDependencies": { - "@aws-sdk/credential-provider-node": "^3.525.0" + "@aws-sdk/credential-provider-node": "^3.535.0" } }, "node_modules/@aws-sdk/client-sts": { - "version": "3.525.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.525.0.tgz", - "integrity": "sha512-a8NUGRvO6rkfTZCbMaCsjDjLbERCwIUU9dIywFYcRgbFhkupJ7fSaZz3Het98U51M9ZbTEpaTa3fz0HaJv8VJw==", + "version": "3.535.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sts/-/client-sts-3.535.0.tgz", + "integrity": "sha512-ii9OOm3TJwP3JmO1IVJXKWIShVKPl0VtdlgROc/SkDglO/kuAw9eDdlROgc+qbFl+gm6bBTguOVTUXt3tS3flw==", "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/core": "3.525.0", - "@aws-sdk/middleware-host-header": "3.523.0", - "@aws-sdk/middleware-logger": "3.523.0", - "@aws-sdk/middleware-recursion-detection": "3.523.0", - "@aws-sdk/middleware-user-agent": "3.525.0", - "@aws-sdk/region-config-resolver": "3.525.0", - "@aws-sdk/types": "3.523.0", - "@aws-sdk/util-endpoints": "3.525.0", - "@aws-sdk/util-user-agent-browser": "3.523.0", - "@aws-sdk/util-user-agent-node": "3.525.0", - "@smithy/config-resolver": "^2.1.4", - "@smithy/core": "^1.3.5", - "@smithy/fetch-http-handler": "^2.4.3", - "@smithy/hash-node": "^2.1.3", - "@smithy/invalid-dependency": "^2.1.3", - "@smithy/middleware-content-length": "^2.1.3", - "@smithy/middleware-endpoint": "^2.4.4", - "@smithy/middleware-retry": "^2.1.4", - "@smithy/middleware-serde": "^2.1.3", - "@smithy/middleware-stack": "^2.1.3", - "@smithy/node-config-provider": "^2.2.4", - "@smithy/node-http-handler": "^2.4.1", - "@smithy/protocol-http": "^3.2.1", - "@smithy/smithy-client": "^2.4.2", - "@smithy/types": "^2.10.1", - "@smithy/url-parser": "^2.1.3", - "@smithy/util-base64": "^2.1.1", - "@smithy/util-body-length-browser": "^2.1.1", - "@smithy/util-body-length-node": "^2.2.1", - "@smithy/util-defaults-mode-browser": "^2.1.4", - "@smithy/util-defaults-mode-node": "^2.2.3", - "@smithy/util-endpoints": "^1.1.4", - "@smithy/util-middleware": "^2.1.3", - "@smithy/util-retry": "^2.1.3", - "@smithy/util-utf8": "^2.1.1", - "fast-xml-parser": "4.2.5", - "tslib": "^2.5.0" + "@aws-sdk/core": "3.535.0", + "@aws-sdk/middleware-host-header": "3.535.0", + "@aws-sdk/middleware-logger": "3.535.0", + "@aws-sdk/middleware-recursion-detection": "3.535.0", + "@aws-sdk/middleware-user-agent": "3.535.0", + "@aws-sdk/region-config-resolver": "3.535.0", + "@aws-sdk/types": "3.535.0", + "@aws-sdk/util-endpoints": "3.535.0", + "@aws-sdk/util-user-agent-browser": "3.535.0", + "@aws-sdk/util-user-agent-node": "3.535.0", + "@smithy/config-resolver": "^2.2.0", + "@smithy/core": "^1.4.0", + "@smithy/fetch-http-handler": "^2.5.0", + "@smithy/hash-node": "^2.2.0", + "@smithy/invalid-dependency": "^2.2.0", + "@smithy/middleware-content-length": "^2.2.0", + "@smithy/middleware-endpoint": "^2.5.0", + "@smithy/middleware-retry": "^2.2.0", + "@smithy/middleware-serde": "^2.3.0", + "@smithy/middleware-stack": "^2.2.0", + "@smithy/node-config-provider": "^2.3.0", + "@smithy/node-http-handler": "^2.5.0", + "@smithy/protocol-http": "^3.3.0", + "@smithy/smithy-client": "^2.5.0", + "@smithy/types": "^2.12.0", + "@smithy/url-parser": "^2.2.0", + "@smithy/util-base64": "^2.3.0", + "@smithy/util-body-length-browser": "^2.2.0", + "@smithy/util-body-length-node": "^2.3.0", + "@smithy/util-defaults-mode-browser": "^2.2.0", + "@smithy/util-defaults-mode-node": "^2.3.0", + "@smithy/util-endpoints": "^1.2.0", + "@smithy/util-middleware": "^2.2.0", + "@smithy/util-retry": "^2.2.0", + "@smithy/util-utf8": "^2.3.0", + "tslib": "^2.6.2" }, "engines": { "node": ">=14.0.0" }, "peerDependencies": { - "@aws-sdk/credential-provider-node": "^3.525.0" + "@aws-sdk/credential-provider-node": "^3.535.0" } }, "node_modules/@aws-sdk/client-xray": { - "version": "3.525.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-xray/-/client-xray-3.525.0.tgz", - "integrity": "sha512-A09mMsmi6oC0i+AW41hmxsIGZreN79js7g3rEgZU05kFC8UAnxhZ7fX1GUoMV9B1ww17r2eY9zS/45aEcEckNw==", + "version": "3.535.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-xray/-/client-xray-3.535.0.tgz", + "integrity": "sha512-rbULFab1C4usQK60zScJJbfwoVt/vinDap6JXqitfG9eaWEgbGE5bM50woZt0KgA70aDgN1Tm0/DyAk6+bdZRw==", "dev": true, "dependencies": { "@aws-crypto/sha256-browser": "3.0.0", "@aws-crypto/sha256-js": "3.0.0", - "@aws-sdk/client-sts": "3.525.0", - "@aws-sdk/core": "3.525.0", - "@aws-sdk/credential-provider-node": "3.525.0", - "@aws-sdk/middleware-host-header": "3.523.0", - "@aws-sdk/middleware-logger": "3.523.0", - "@aws-sdk/middleware-recursion-detection": "3.523.0", - "@aws-sdk/middleware-user-agent": "3.525.0", - "@aws-sdk/region-config-resolver": "3.525.0", - "@aws-sdk/types": "3.523.0", - "@aws-sdk/util-endpoints": "3.525.0", - "@aws-sdk/util-user-agent-browser": "3.523.0", - "@aws-sdk/util-user-agent-node": "3.525.0", - "@smithy/config-resolver": "^2.1.4", - "@smithy/core": "^1.3.5", - "@smithy/fetch-http-handler": "^2.4.3", - "@smithy/hash-node": "^2.1.3", - "@smithy/invalid-dependency": "^2.1.3", - "@smithy/middleware-content-length": "^2.1.3", - "@smithy/middleware-endpoint": "^2.4.4", - "@smithy/middleware-retry": "^2.1.4", - "@smithy/middleware-serde": "^2.1.3", - "@smithy/middleware-stack": "^2.1.3", - "@smithy/node-config-provider": "^2.2.4", - "@smithy/node-http-handler": "^2.4.1", - "@smithy/protocol-http": "^3.2.1", - "@smithy/smithy-client": "^2.4.2", - "@smithy/types": "^2.10.1", - "@smithy/url-parser": "^2.1.3", - "@smithy/util-base64": "^2.1.1", - "@smithy/util-body-length-browser": "^2.1.1", - "@smithy/util-body-length-node": "^2.2.1", - "@smithy/util-defaults-mode-browser": "^2.1.4", - "@smithy/util-defaults-mode-node": "^2.2.3", - "@smithy/util-endpoints": "^1.1.4", - "@smithy/util-middleware": "^2.1.3", - "@smithy/util-retry": "^2.1.3", - "@smithy/util-utf8": "^2.1.1", - "tslib": "^2.5.0" + "@aws-sdk/client-sts": "3.535.0", + "@aws-sdk/core": "3.535.0", + "@aws-sdk/credential-provider-node": "3.535.0", + "@aws-sdk/middleware-host-header": "3.535.0", + "@aws-sdk/middleware-logger": "3.535.0", + "@aws-sdk/middleware-recursion-detection": "3.535.0", + "@aws-sdk/middleware-user-agent": "3.535.0", + "@aws-sdk/region-config-resolver": "3.535.0", + "@aws-sdk/types": "3.535.0", + "@aws-sdk/util-endpoints": "3.535.0", + "@aws-sdk/util-user-agent-browser": "3.535.0", + "@aws-sdk/util-user-agent-node": "3.535.0", + "@smithy/config-resolver": "^2.2.0", + "@smithy/core": "^1.4.0", + "@smithy/fetch-http-handler": "^2.5.0", + "@smithy/hash-node": "^2.2.0", + "@smithy/invalid-dependency": "^2.2.0", + "@smithy/middleware-content-length": "^2.2.0", + "@smithy/middleware-endpoint": "^2.5.0", + "@smithy/middleware-retry": "^2.2.0", + "@smithy/middleware-serde": "^2.3.0", + "@smithy/middleware-stack": "^2.2.0", + "@smithy/node-config-provider": "^2.3.0", + "@smithy/node-http-handler": "^2.5.0", + "@smithy/protocol-http": "^3.3.0", + "@smithy/smithy-client": "^2.5.0", + "@smithy/types": "^2.12.0", + "@smithy/url-parser": "^2.2.0", + "@smithy/util-base64": "^2.3.0", + "@smithy/util-body-length-browser": "^2.2.0", + "@smithy/util-body-length-node": "^2.3.0", + "@smithy/util-defaults-mode-browser": "^2.2.0", + "@smithy/util-defaults-mode-node": "^2.3.0", + "@smithy/util-endpoints": "^1.2.0", + "@smithy/util-middleware": "^2.2.0", + "@smithy/util-retry": "^2.2.0", + "@smithy/util-utf8": "^2.3.0", + "tslib": "^2.6.2" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/core": { - "version": "3.525.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.525.0.tgz", - "integrity": "sha512-E3LtEtMWCriQOFZpVKpLYzbdw/v2PAOEAMhn2VRRZ1g0/g1TXzQrfhEU2yd8l/vQEJaCJ82ooGGg7YECviBUxA==", - "dependencies": { - "@smithy/core": "^1.3.5", - "@smithy/protocol-http": "^3.2.1", - "@smithy/signature-v4": "^2.1.3", - "@smithy/smithy-client": "^2.4.2", - "@smithy/types": "^2.10.1", - "tslib": "^2.5.0" + "version": "3.535.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.535.0.tgz", + "integrity": "sha512-+Yusa9HziuaEDta1UaLEtMAtmgvxdxhPn7jgfRY6PplqAqgsfa5FR83sxy5qr2q7xjQTwHtV4MjQVuOjG9JsLw==", + "dependencies": { + "@smithy/core": "^1.4.0", + "@smithy/protocol-http": "^3.3.0", + "@smithy/signature-v4": "^2.2.0", + "@smithy/smithy-client": "^2.5.0", + "@smithy/types": "^2.12.0", + "fast-xml-parser": "4.2.5", + "tslib": "^2.6.2" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/credential-provider-env": { - "version": "3.523.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.523.0.tgz", - "integrity": "sha512-Y6DWdH6/OuMDoNKVzZlNeBc6f1Yjk1lYMjANKpIhMbkRCvLJw/PYZKOZa8WpXbTYdgg9XLjKybnLIb3ww3uuzA==", + "version": "3.535.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.535.0.tgz", + "integrity": "sha512-XppwO8c0GCGSAvdzyJOhbtktSEaShg14VJKg8mpMa1XcgqzmcqqHQjtDWbx5rZheY1VdpXZhpEzJkB6LpQejpA==", "dependencies": { - "@aws-sdk/types": "3.523.0", - "@smithy/property-provider": "^2.1.3", - "@smithy/types": "^2.10.1", - "tslib": "^2.5.0" + "@aws-sdk/types": "3.535.0", + "@smithy/property-provider": "^2.2.0", + "@smithy/types": "^2.12.0", + "tslib": "^2.6.2" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/credential-provider-http": { - "version": "3.525.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.525.0.tgz", - "integrity": "sha512-RNWQGuSBQZhl3iqklOslUEfQ4br1V3DCPboMpeqFtddUWJV3m2u2extFur9/4Uy+1EHVF120IwZUKtd8dF+ibw==", - "dependencies": { - "@aws-sdk/types": "3.523.0", - "@smithy/fetch-http-handler": "^2.4.3", - "@smithy/node-http-handler": "^2.4.1", - "@smithy/property-provider": "^2.1.3", - "@smithy/protocol-http": "^3.2.1", - "@smithy/smithy-client": "^2.4.2", - "@smithy/types": "^2.10.1", - "@smithy/util-stream": "^2.1.3", - "tslib": "^2.5.0" + "version": "3.535.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.535.0.tgz", + "integrity": "sha512-kdj1wCmOMZ29jSlUskRqN04S6fJ4dvt0Nq9Z32SA6wO7UG8ht6Ot9h/au/eTWJM3E1somZ7D771oK7dQt9b8yw==", + "dependencies": { + "@aws-sdk/types": "3.535.0", + "@smithy/fetch-http-handler": "^2.5.0", + "@smithy/node-http-handler": "^2.5.0", + "@smithy/property-provider": "^2.2.0", + "@smithy/protocol-http": "^3.3.0", + "@smithy/smithy-client": "^2.5.0", + "@smithy/types": "^2.12.0", + "@smithy/util-stream": "^2.2.0", + "tslib": "^2.6.2" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.525.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.525.0.tgz", - "integrity": "sha512-JDnccfK5JRb9jcgpc9lirL9PyCwGIqY0nKdw3LlX5WL5vTpTG4E1q7rLAlpNh7/tFD1n66Itarfv2tsyHMIqCw==", - "dependencies": { - "@aws-sdk/client-sts": "3.525.0", - "@aws-sdk/credential-provider-env": "3.523.0", - "@aws-sdk/credential-provider-process": "3.523.0", - "@aws-sdk/credential-provider-sso": "3.525.0", - "@aws-sdk/credential-provider-web-identity": "3.525.0", - "@aws-sdk/types": "3.523.0", - "@smithy/credential-provider-imds": "^2.2.3", - "@smithy/property-provider": "^2.1.3", - "@smithy/shared-ini-file-loader": "^2.3.3", - "@smithy/types": "^2.10.1", - "tslib": "^2.5.0" + "version": "3.535.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.535.0.tgz", + "integrity": "sha512-bm3XOYlyCjtAb8eeHXLrxqRxYVRw2Iqv9IufdJb4gM13TbNSYniUT1WKaHxGIZ5p+FuNlXVhvk1OpHFM13+gXA==", + "dependencies": { + "@aws-sdk/client-sts": "3.535.0", + "@aws-sdk/credential-provider-env": "3.535.0", + "@aws-sdk/credential-provider-process": "3.535.0", + "@aws-sdk/credential-provider-sso": "3.535.0", + "@aws-sdk/credential-provider-web-identity": "3.535.0", + "@aws-sdk/types": "3.535.0", + "@smithy/credential-provider-imds": "^2.3.0", + "@smithy/property-provider": "^2.2.0", + "@smithy/shared-ini-file-loader": "^2.4.0", + "@smithy/types": "^2.12.0", + "tslib": "^2.6.2" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/credential-provider-node": { - "version": "3.525.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.525.0.tgz", - "integrity": "sha512-RJXlO8goGXpnoHQAyrCcJ0QtWEOFa34LSbfdqBIjQX/fwnjUuEmiGdXTV3AZmwYQ7juk49tfBneHbtOP3AGqsQ==", - "dependencies": { - "@aws-sdk/credential-provider-env": "3.523.0", - "@aws-sdk/credential-provider-http": "3.525.0", - "@aws-sdk/credential-provider-ini": "3.525.0", - "@aws-sdk/credential-provider-process": "3.523.0", - "@aws-sdk/credential-provider-sso": "3.525.0", - "@aws-sdk/credential-provider-web-identity": "3.525.0", - "@aws-sdk/types": "3.523.0", - "@smithy/credential-provider-imds": "^2.2.3", - "@smithy/property-provider": "^2.1.3", - "@smithy/shared-ini-file-loader": "^2.3.3", - "@smithy/types": "^2.10.1", - "tslib": "^2.5.0" + "version": "3.535.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.535.0.tgz", + "integrity": "sha512-6JXp/EuL6euUkH5k4d+lQFF6gBwukrcCOWfNHCmq14mNJf/cqT3HAX1VMtWFRSK20am0IxfYQGccb0/nZykdKg==", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.535.0", + "@aws-sdk/credential-provider-http": "3.535.0", + "@aws-sdk/credential-provider-ini": "3.535.0", + "@aws-sdk/credential-provider-process": "3.535.0", + "@aws-sdk/credential-provider-sso": "3.535.0", + "@aws-sdk/credential-provider-web-identity": "3.535.0", + "@aws-sdk/types": "3.535.0", + "@smithy/credential-provider-imds": "^2.3.0", + "@smithy/property-provider": "^2.2.0", + "@smithy/shared-ini-file-loader": "^2.4.0", + "@smithy/types": "^2.12.0", + "tslib": "^2.6.2" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/credential-provider-process": { - "version": "3.523.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.523.0.tgz", - "integrity": "sha512-f0LP9KlFmMvPWdKeUKYlZ6FkQAECUeZMmISsv6NKtvPCI9e4O4cLTeR09telwDK8P0HrgcRuZfXM7E30m8re0Q==", - "dependencies": { - "@aws-sdk/types": "3.523.0", - "@smithy/property-provider": "^2.1.3", - "@smithy/shared-ini-file-loader": "^2.3.3", - "@smithy/types": "^2.10.1", - "tslib": "^2.5.0" + "version": "3.535.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.535.0.tgz", + "integrity": "sha512-9O1OaprGCnlb/kYl8RwmH7Mlg8JREZctB8r9sa1KhSsWFq/SWO0AuJTyowxD7zL5PkeS4eTvzFFHWCa3OO5epA==", + "dependencies": { + "@aws-sdk/types": "3.535.0", + "@smithy/property-provider": "^2.2.0", + "@smithy/shared-ini-file-loader": "^2.4.0", + "@smithy/types": "^2.12.0", + "tslib": "^2.6.2" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.525.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.525.0.tgz", - "integrity": "sha512-7V7ybtufxdD3plxeIeB6aqHZeFIUlAyPphXIUgXrGY10iNcosL970rQPBeggsohe4gCM6UvY2TfMeEcr+ZE8FA==", - "dependencies": { - "@aws-sdk/client-sso": "3.525.0", - "@aws-sdk/token-providers": "3.525.0", - "@aws-sdk/types": "3.523.0", - "@smithy/property-provider": "^2.1.3", - "@smithy/shared-ini-file-loader": "^2.3.3", - "@smithy/types": "^2.10.1", - "tslib": "^2.5.0" + "version": "3.535.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.535.0.tgz", + "integrity": "sha512-2Dw0YIr8ETdFpq65CC4zK8ZIEbX78rXoNRZXUGNQW3oSKfL0tj8O8ErY6kg1IdEnYbGnEQ35q6luZ5GGNKLgDg==", + "dependencies": { + "@aws-sdk/client-sso": "3.535.0", + "@aws-sdk/token-providers": "3.535.0", + "@aws-sdk/types": "3.535.0", + "@smithy/property-provider": "^2.2.0", + "@smithy/shared-ini-file-loader": "^2.4.0", + "@smithy/types": "^2.12.0", + "tslib": "^2.6.2" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.525.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.525.0.tgz", - "integrity": "sha512-sAukOjR1oKb2JXG4nPpuBFpSwGUhrrY17PG/xbTy8NAoLLhrqRwnErcLfdTfmj6tH+3094k6ws/Sh8a35ae7fA==", - "dependencies": { - "@aws-sdk/client-sts": "3.525.0", - "@aws-sdk/types": "3.523.0", - "@smithy/property-provider": "^2.1.3", - "@smithy/types": "^2.10.1", - "tslib": "^2.5.0" + "version": "3.535.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.535.0.tgz", + "integrity": "sha512-t2/JWrKY0H66A7JW7CqX06/DG2YkJddikt5ymdQvx/Q7dRMJ3d+o/vgjoKr7RvEx/pNruCeyM1599HCvwrVMrg==", + "dependencies": { + "@aws-sdk/client-sts": "3.535.0", + "@aws-sdk/types": "3.535.0", + "@smithy/property-provider": "^2.2.0", + "@smithy/types": "^2.12.0", + "tslib": "^2.6.2" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/endpoint-cache": { - "version": "3.495.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/endpoint-cache/-/endpoint-cache-3.495.0.tgz", - "integrity": "sha512-XCDrpiS50WaPzPzp7FwsChPHtX9PQQUU4nRzcn2N7IkUtpcFCUx8m1PAZe086VQr6hrbdeE4Z4j8hUPNwVdJGQ==", + "version": "3.535.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/endpoint-cache/-/endpoint-cache-3.535.0.tgz", + "integrity": "sha512-sPG2l00iVuporK9AmPWq4UBcJURs2RN+vKA8QLRQANmQS3WFHWHamvGltxCjK79izkeqri882V4XlFpZfWhemA==", "dev": true, "dependencies": { "mnemonist": "0.38.3", - "tslib": "^2.5.0" + "tslib": "^2.6.2" }, "engines": { "node": ">=14.0.0" @@ -1043,15 +1042,15 @@ } }, "node_modules/@aws-sdk/lib-dynamodb": { - "version": "3.528.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/lib-dynamodb/-/lib-dynamodb-3.528.0.tgz", - "integrity": "sha512-BGyST10K2jRE8m+EuW8SVIMjsDd5/KkNhCv8Qm8dUsgSwSWSOokG0B0adOJBg5702X5j6N5mNi47Qd6mEViySA==", + "version": "3.538.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/lib-dynamodb/-/lib-dynamodb-3.538.0.tgz", + "integrity": "sha512-v+FjXrAVy6Kx9iQx4JnOeQF4fEX7XhhFKC3Au48PHajFKv5t/fdZMkJm+2om77OzoVh6688vcnke4sirXW4YGA==", "dev": true, "dependencies": { - "@aws-sdk/util-dynamodb": "3.528.0", - "@smithy/smithy-client": "^2.4.2", - "@smithy/types": "^2.10.1", - "tslib": "^2.5.0" + "@aws-sdk/util-dynamodb": "3.538.0", + "@smithy/smithy-client": "^2.5.0", + "@smithy/types": "^2.12.0", + "tslib": "^2.6.2" }, "engines": { "node": ">=14.0.0" @@ -1061,117 +1060,117 @@ } }, "node_modules/@aws-sdk/middleware-endpoint-discovery": { - "version": "3.525.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-endpoint-discovery/-/middleware-endpoint-discovery-3.525.0.tgz", - "integrity": "sha512-nT/XYP3RDRWPFCTEOZQbOC3HWmUkxB0fDuobmH8WzL92MCBGz9gBG/q9XBxiw9pHk9Dky/MIkLV50BlGB3kM7g==", + "version": "3.535.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-endpoint-discovery/-/middleware-endpoint-discovery-3.535.0.tgz", + "integrity": "sha512-+EsqJB5A15RoTf0HxUdknF3hp+2WDg0HWc+QERUctzzYXy9l5LIQjmhQ96cWDyFttKmHE+4h6fjMZjJEeWOeYQ==", "dev": true, "dependencies": { - "@aws-sdk/endpoint-cache": "3.495.0", - "@aws-sdk/types": "3.523.0", - "@smithy/node-config-provider": "^2.2.4", - "@smithy/protocol-http": "^3.2.1", - "@smithy/types": "^2.10.1", - "tslib": "^2.5.0" + "@aws-sdk/endpoint-cache": "3.535.0", + "@aws-sdk/types": "3.535.0", + "@smithy/node-config-provider": "^2.3.0", + "@smithy/protocol-http": "^3.3.0", + "@smithy/types": "^2.12.0", + "tslib": "^2.6.2" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/middleware-host-header": { - "version": "3.523.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.523.0.tgz", - "integrity": "sha512-4g3q7Ta9sdD9TMUuohBAkbx/e3I/juTqfKi7TPgP+8jxcYX72MOsgemAMHuP6CX27eyj4dpvjH+w4SIVDiDSmg==", + "version": "3.535.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.535.0.tgz", + "integrity": "sha512-0h6TWjBWtDaYwHMQJI9ulafeS4lLaw1vIxRjbpH0svFRt6Eve+Sy8NlVhECfTU2hNz/fLubvrUxsXoThaLBIew==", "dependencies": { - "@aws-sdk/types": "3.523.0", - "@smithy/protocol-http": "^3.2.1", - "@smithy/types": "^2.10.1", - "tslib": "^2.5.0" + "@aws-sdk/types": "3.535.0", + "@smithy/protocol-http": "^3.3.0", + "@smithy/types": "^2.12.0", + "tslib": "^2.6.2" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/middleware-logger": { - "version": "3.523.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.523.0.tgz", - "integrity": "sha512-PeDNJNhfiaZx54LBaLTXzUaJ9LXFwDFFIksipjqjvxMafnoVcQwKbkoPUWLe5ytT4nnL1LogD3s55mERFUsnwg==", + "version": "3.535.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.535.0.tgz", + "integrity": "sha512-huNHpONOrEDrdRTvSQr1cJiRMNf0S52NDXtaPzdxiubTkP+vni2MohmZANMOai/qT0olmEVX01LhZ0ZAOgmg6A==", "dependencies": { - "@aws-sdk/types": "3.523.0", - "@smithy/types": "^2.10.1", - "tslib": "^2.5.0" + "@aws-sdk/types": "3.535.0", + "@smithy/types": "^2.12.0", + "tslib": "^2.6.2" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.523.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.523.0.tgz", - "integrity": "sha512-nZ3Vt7ehfSDYnrcg/aAfjjvpdE+61B3Zk68i6/hSUIegT3IH9H1vSW67NDKVp+50hcEfzWwM2HMPXxlzuyFyrw==", + "version": "3.535.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.535.0.tgz", + "integrity": "sha512-am2qgGs+gwqmR4wHLWpzlZ8PWhm4ktj5bYSgDrsOfjhdBlWNxvPoID9/pDAz5RWL48+oH7I6SQzMqxXsFDikrw==", "dependencies": { - "@aws-sdk/types": "3.523.0", - "@smithy/protocol-http": "^3.2.1", - "@smithy/types": "^2.10.1", - "tslib": "^2.5.0" + "@aws-sdk/types": "3.535.0", + "@smithy/protocol-http": "^3.3.0", + "@smithy/types": "^2.12.0", + "tslib": "^2.6.2" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.525.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.525.0.tgz", - "integrity": "sha512-4al/6uO+t/QIYXK2OgqzDKQzzLAYJza1vWFS+S0lJ3jLNGyLB5BMU5KqWjDzevYZ4eCnz2Nn7z0FveUTNz8YdQ==", - "dependencies": { - "@aws-sdk/types": "3.523.0", - "@aws-sdk/util-endpoints": "3.525.0", - "@smithy/protocol-http": "^3.2.1", - "@smithy/types": "^2.10.1", - "tslib": "^2.5.0" + "version": "3.535.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.535.0.tgz", + "integrity": "sha512-Uvb2WJ+zdHdCOtsWVPI/M0BcfNrjOYsicDZWtaljucRJKLclY5gNWwD+RwIC+8b5TvfnVOlH+N5jhvpi5Impog==", + "dependencies": { + "@aws-sdk/types": "3.535.0", + "@aws-sdk/util-endpoints": "3.535.0", + "@smithy/protocol-http": "^3.3.0", + "@smithy/types": "^2.12.0", + "tslib": "^2.6.2" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/region-config-resolver": { - "version": "3.525.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.525.0.tgz", - "integrity": "sha512-8kFqXk6UyKgTMi7N7QlhA6qM4pGPWbiUXqEY2RgUWngtxqNFGeM9JTexZeuavQI+qLLe09VPShPNX71fEDcM6w==", - "dependencies": { - "@aws-sdk/types": "3.523.0", - "@smithy/node-config-provider": "^2.2.4", - "@smithy/types": "^2.10.1", - "@smithy/util-config-provider": "^2.2.1", - "@smithy/util-middleware": "^2.1.3", - "tslib": "^2.5.0" + "version": "3.535.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.535.0.tgz", + "integrity": "sha512-IXOznDiaItBjsQy4Fil0kzX/J3HxIOknEphqHbOfUf+LpA5ugcsxuQQONrbEQusCBnfJyymrldBvBhFmtlU9Wg==", + "dependencies": { + "@aws-sdk/types": "3.535.0", + "@smithy/node-config-provider": "^2.3.0", + "@smithy/types": "^2.12.0", + "@smithy/util-config-provider": "^2.3.0", + "@smithy/util-middleware": "^2.2.0", + "tslib": "^2.6.2" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/token-providers": { - "version": "3.525.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.525.0.tgz", - "integrity": "sha512-puVjbxuK0Dq7PTQ2HdddHy2eQjOH8GZbump74yWJa6JVpRW84LlOcNmP+79x4Kscvz2ldWB8XDFw/pcCiSDe5A==", - "dependencies": { - "@aws-sdk/client-sso-oidc": "3.525.0", - "@aws-sdk/types": "3.523.0", - "@smithy/property-provider": "^2.1.3", - "@smithy/shared-ini-file-loader": "^2.3.3", - "@smithy/types": "^2.10.1", - "tslib": "^2.5.0" + "version": "3.535.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.535.0.tgz", + "integrity": "sha512-4g+l/B9h1H/SiDtFRosW3pMwc+3PTXljZit+5NUBcET2XqcdUyHmgj3lBdu+CJ9CHdIMggRalYMAFXnRFe3Psg==", + "dependencies": { + "@aws-sdk/client-sso-oidc": "3.535.0", + "@aws-sdk/types": "3.535.0", + "@smithy/property-provider": "^2.2.0", + "@smithy/shared-ini-file-loader": "^2.4.0", + "@smithy/types": "^2.12.0", + "tslib": "^2.6.2" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@aws-sdk/types": { - "version": "3.523.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.523.0.tgz", - "integrity": "sha512-AqGIu4u+SxPiUuNBp2acCVcq80KDUFjxe6e3cMTvKWTzCbrVk1AXv0dAaJnCmdkWIha6zJDWxpIk/aL4EGhZ9A==", + "version": "3.535.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.535.0.tgz", + "integrity": "sha512-aY4MYfduNj+sRR37U7XxYR8wemfbKP6lx00ze2M2uubn7mZotuVrWYAafbMSXrdEMSToE5JDhr28vArSOoLcSg==", "dependencies": { - "@smithy/types": "^2.10.1", - "tslib": "^2.5.0" + "@smithy/types": "^2.12.0", + "tslib": "^2.6.2" }, "engines": { "node": ">=14.0.0" @@ -1203,12 +1202,12 @@ } }, "node_modules/@aws-sdk/util-dynamodb": { - "version": "3.528.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-dynamodb/-/util-dynamodb-3.528.0.tgz", - "integrity": "sha512-RSSFtTWqJOeZHDtaSXd51LIP3Xu0mDPYc1Eu+LJXEC2GHWYDdjoeAMpIJvETBg13bBWkRgHatujT8tLFxCx1ug==", + "version": "3.538.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-dynamodb/-/util-dynamodb-3.538.0.tgz", + "integrity": "sha512-swCwUyd0BgpDhTytTsL0wGfEuqWvi4qFesRsI0GygTEMrY26tEzqBnWfFy3M3r5UuFszKKiv9lnuiJ0cBuIUFA==", "dev": true, "dependencies": { - "tslib": "^2.5.0" + "tslib": "^2.6.2" }, "engines": { "node": ">=14.0.0" @@ -1218,14 +1217,14 @@ } }, "node_modules/@aws-sdk/util-endpoints": { - "version": "3.525.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.525.0.tgz", - "integrity": "sha512-DIW7WWU5tIGkeeKX6NJUyrEIdWMiqjLQG3XBzaUj+ufIENwNjdAHhlD8l2vX7Yr3JZRT6yN/84wBCj7Tw1xd1g==", + "version": "3.535.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.535.0.tgz", + "integrity": "sha512-c8TlaQsiPchOOmTTR6qvHCO2O7L7NJwlKWAoQJ2GqWDZuC5es/fyuF2rp1h+ZRrUVraUomS0YdGkAmaDC7hJQg==", "dependencies": { - "@aws-sdk/types": "3.523.0", - "@smithy/types": "^2.10.1", - "@smithy/util-endpoints": "^1.1.4", - "tslib": "^2.5.0" + "@aws-sdk/types": "3.535.0", + "@smithy/types": "^2.12.0", + "@smithy/util-endpoints": "^1.2.0", + "tslib": "^2.6.2" }, "engines": { "node": ">=14.0.0" @@ -1243,25 +1242,25 @@ } }, "node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.523.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.523.0.tgz", - "integrity": "sha512-6ZRNdGHX6+HQFqTbIA5+i8RWzxFyxsZv8D3soRfpdyWIKkzhSz8IyRKXRciwKBJDaC7OX2jzGE90wxRQft27nA==", + "version": "3.535.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.535.0.tgz", + "integrity": "sha512-RWMcF/xV5n+nhaA/Ff5P3yNP3Kur/I+VNZngog4TEs92oB/nwOdAg/2JL8bVAhUbMrjTjpwm7PItziYFQoqyig==", "dependencies": { - "@aws-sdk/types": "3.523.0", - "@smithy/types": "^2.10.1", + "@aws-sdk/types": "3.535.0", + "@smithy/types": "^2.12.0", "bowser": "^2.11.0", - "tslib": "^2.5.0" + "tslib": "^2.6.2" } }, "node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.525.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.525.0.tgz", - "integrity": "sha512-88Wjt4efyUSBGcyIuh1dvoMqY1k15jpJc5A/3yi67clBQEFsu9QCodQCQPqmRjV3VRcMtBOk+jeCTiUzTY5dRQ==", + "version": "3.535.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.535.0.tgz", + "integrity": "sha512-dRek0zUuIT25wOWJlsRm97nTkUlh1NDcLsQZIN2Y8KxhwoXXWtJs5vaDPT+qAg+OpcNj80i1zLR/CirqlFg/TQ==", "dependencies": { - "@aws-sdk/types": "3.523.0", - "@smithy/node-config-provider": "^2.2.4", - "@smithy/types": "^2.10.1", - "tslib": "^2.5.0" + "@aws-sdk/types": "3.535.0", + "@smithy/node-config-provider": "^2.3.0", + "@smithy/types": "^2.12.0", + "tslib": "^2.6.2" }, "engines": { "node": ">=14.0.0" @@ -1955,9 +1954,9 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.1.tgz", - "integrity": "sha512-m55cpeupQ2DbuRGQMMZDzbv9J9PgVelPjlcmM5kxHnrBdBx6REaEd7LamYV7Dm8N7rCyR/XwU6rVP8ploKtIkA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz", + "integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==", "cpu": [ "ppc64" ], @@ -1970,9 +1969,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.1.tgz", - "integrity": "sha512-4j0+G27/2ZXGWR5okcJi7pQYhmkVgb4D7UKwxcqrjhvp5TKWx3cUjgB1CGj1mfdmJBQ9VnUGgUhign+FPF2Zgw==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz", + "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==", "cpu": [ "arm" ], @@ -1985,9 +1984,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.1.tgz", - "integrity": "sha512-hCnXNF0HM6AjowP+Zou0ZJMWWa1VkD77BXe959zERgGJBBxB+sV+J9f/rcjeg2c5bsukD/n17RKWXGFCO5dD5A==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz", + "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==", "cpu": [ "arm64" ], @@ -2000,9 +1999,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.1.tgz", - "integrity": "sha512-MSfZMBoAsnhpS+2yMFYIQUPs8Z19ajwfuaSZx+tSl09xrHZCjbeXXMsUF/0oq7ojxYEpsSo4c0SfjxOYXRbpaA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz", + "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==", "cpu": [ "x64" ], @@ -2015,9 +2014,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.1.tgz", - "integrity": "sha512-Ylk6rzgMD8klUklGPzS414UQLa5NPXZD5tf8JmQU8GQrj6BrFA/Ic9tb2zRe1kOZyCbGl+e8VMbDRazCEBqPvA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz", + "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==", "cpu": [ "arm64" ], @@ -2030,9 +2029,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.1.tgz", - "integrity": "sha512-pFIfj7U2w5sMp52wTY1XVOdoxw+GDwy9FsK3OFz4BpMAjvZVs0dT1VXs8aQm22nhwoIWUmIRaE+4xow8xfIDZA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz", + "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==", "cpu": [ "x64" ], @@ -2045,9 +2044,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.1.tgz", - "integrity": "sha512-UyW1WZvHDuM4xDz0jWun4qtQFauNdXjXOtIy7SYdf7pbxSWWVlqhnR/T2TpX6LX5NI62spt0a3ldIIEkPM6RHw==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz", + "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==", "cpu": [ "arm64" ], @@ -2060,9 +2059,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.1.tgz", - "integrity": "sha512-itPwCw5C+Jh/c624vcDd9kRCCZVpzpQn8dtwoYIt2TJF3S9xJLiRohnnNrKwREvcZYx0n8sCSbvGH349XkcQeg==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz", + "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==", "cpu": [ "x64" ], @@ -2075,9 +2074,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.1.tgz", - "integrity": "sha512-LojC28v3+IhIbfQ+Vu4Ut5n3wKcgTu6POKIHN9Wpt0HnfgUGlBuyDDQR4jWZUZFyYLiz4RBBBmfU6sNfn6RhLw==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz", + "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==", "cpu": [ "arm" ], @@ -2090,9 +2089,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.1.tgz", - "integrity": "sha512-cX8WdlF6Cnvw/DO9/X7XLH2J6CkBnz7Twjpk56cshk9sjYVcuh4sXQBy5bmTwzBjNVZze2yaV1vtcJS04LbN8w==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz", + "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==", "cpu": [ "arm64" ], @@ -2105,9 +2104,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.1.tgz", - "integrity": "sha512-4H/sQCy1mnnGkUt/xszaLlYJVTz3W9ep52xEefGtd6yXDQbz/5fZE5dFLUgsPdbUOQANcVUa5iO6g3nyy5BJiw==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz", + "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==", "cpu": [ "ia32" ], @@ -2120,9 +2119,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.1.tgz", - "integrity": "sha512-c0jgtB+sRHCciVXlyjDcWb2FUuzlGVRwGXgI+3WqKOIuoo8AmZAddzeOHeYLtD+dmtHw3B4Xo9wAUdjlfW5yYA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz", + "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==", "cpu": [ "loong64" ], @@ -2135,9 +2134,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.1.tgz", - "integrity": "sha512-TgFyCfIxSujyuqdZKDZ3yTwWiGv+KnlOeXXitCQ+trDODJ+ZtGOzLkSWngynP0HZnTsDyBbPy7GWVXWaEl6lhA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz", + "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==", "cpu": [ "mips64el" ], @@ -2150,9 +2149,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.1.tgz", - "integrity": "sha512-b+yuD1IUeL+Y93PmFZDZFIElwbmFfIKLKlYI8M6tRyzE6u7oEP7onGk0vZRh8wfVGC2dZoy0EqX1V8qok4qHaw==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz", + "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==", "cpu": [ "ppc64" ], @@ -2165,9 +2164,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.1.tgz", - "integrity": "sha512-wpDlpE0oRKZwX+GfomcALcouqjjV8MIX8DyTrxfyCfXxoKQSDm45CZr9fanJ4F6ckD4yDEPT98SrjvLwIqUCgg==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz", + "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==", "cpu": [ "riscv64" ], @@ -2180,9 +2179,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.1.tgz", - "integrity": "sha512-5BepC2Au80EohQ2dBpyTquqGCES7++p7G+7lXe1bAIvMdXm4YYcEfZtQrP4gaoZ96Wv1Ute61CEHFU7h4FMueQ==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz", + "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==", "cpu": [ "s390x" ], @@ -2195,9 +2194,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.1.tgz", - "integrity": "sha512-5gRPk7pKuaIB+tmH+yKd2aQTRpqlf1E4f/mC+tawIm/CGJemZcHZpp2ic8oD83nKgUPMEd0fNanrnFljiruuyA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz", + "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==", "cpu": [ "x64" ], @@ -2210,9 +2209,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.1.tgz", - "integrity": "sha512-4fL68JdrLV2nVW2AaWZBv3XEm3Ae3NZn/7qy2KGAt3dexAgSVT+Hc97JKSZnqezgMlv9x6KV0ZkZY7UO5cNLCg==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz", + "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==", "cpu": [ "x64" ], @@ -2225,9 +2224,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.1.tgz", - "integrity": "sha512-GhRuXlvRE+twf2ES+8REbeCb/zeikNqwD3+6S5y5/x+DYbAQUNl0HNBs4RQJqrechS4v4MruEr8ZtAin/hK5iw==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz", + "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==", "cpu": [ "x64" ], @@ -2240,9 +2239,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.1.tgz", - "integrity": "sha512-ZnWEyCM0G1Ex6JtsygvC3KUUrlDXqOihw8RicRuQAzw+c4f1D66YlPNNV3rkjVW90zXVsHwZYWbJh3v+oQFM9Q==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz", + "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==", "cpu": [ "x64" ], @@ -2255,9 +2254,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.1.tgz", - "integrity": "sha512-QZ6gXue0vVQY2Oon9WyLFCdSuYbXSoxaZrPuJ4c20j6ICedfsDilNPYfHLlMH7vGfU5DQR0czHLmJvH4Nzis/A==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz", + "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==", "cpu": [ "arm64" ], @@ -2270,9 +2269,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.1.tgz", - "integrity": "sha512-HzcJa1NcSWTAU0MJIxOho8JftNp9YALui3o+Ny7hCh0v5f90nprly1U3Sj1Ldj/CvKKdvvFsCRvDkpsEMp4DNw==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz", + "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==", "cpu": [ "ia32" ], @@ -2285,9 +2284,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.1.tgz", - "integrity": "sha512-0MBh53o6XtI6ctDnRMeQ+xoCN8kD2qI1rY1KgF/xdWQwoFeKou7puvDfV8/Wv4Ctx2rRpET/gGdz3YlNtNACSA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz", + "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==", "cpu": [ "x64" ], @@ -4246,236 +4245,236 @@ "dev": true }, "node_modules/@smithy/abort-controller": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-2.1.3.tgz", - "integrity": "sha512-c2aYH2Wu1RVE3rLlVgg2kQOBJGM0WbjReQi5DnPTm2Zb7F0gk7J2aeQeaX2u/lQZoHl6gv8Oac7mt9alU3+f4A==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-2.2.0.tgz", + "integrity": "sha512-wRlta7GuLWpTqtFfGo+nZyOO1vEvewdNR1R4rTxpC8XU6vG/NDyrFBhwLZsqg1NUoR1noVaXJPC/7ZK47QCySw==", "dependencies": { - "@smithy/types": "^2.10.1", - "tslib": "^2.5.0" + "@smithy/types": "^2.12.0", + "tslib": "^2.6.2" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@smithy/config-resolver": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-2.1.4.tgz", - "integrity": "sha512-AW2WUZmBAzgO3V3ovKtsUbI3aBNMeQKFDumoqkNxaVDWF/xfnxAWqBKDr/NuG7c06N2Rm4xeZLPiJH/d+na0HA==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-2.2.0.tgz", + "integrity": "sha512-fsiMgd8toyUba6n1WRmr+qACzXltpdDkPTAaDqc8QqPBUzO+/JKwL6bUBseHVi8tu9l+3JOK+tSf7cay+4B3LA==", "dependencies": { - "@smithy/node-config-provider": "^2.2.4", - "@smithy/types": "^2.10.1", - "@smithy/util-config-provider": "^2.2.1", - "@smithy/util-middleware": "^2.1.3", - "tslib": "^2.5.0" + "@smithy/node-config-provider": "^2.3.0", + "@smithy/types": "^2.12.0", + "@smithy/util-config-provider": "^2.3.0", + "@smithy/util-middleware": "^2.2.0", + "tslib": "^2.6.2" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@smithy/core": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@smithy/core/-/core-1.3.5.tgz", - "integrity": "sha512-Rrc+e2Jj6Gu7Xbn0jvrzZlSiP2CZocIOfZ9aNUA82+1sa6GBnxqL9+iZ9EKHeD9aqD1nU8EK4+oN2EiFpSv7Yw==", - "dependencies": { - "@smithy/middleware-endpoint": "^2.4.4", - "@smithy/middleware-retry": "^2.1.4", - "@smithy/middleware-serde": "^2.1.3", - "@smithy/protocol-http": "^3.2.1", - "@smithy/smithy-client": "^2.4.2", - "@smithy/types": "^2.10.1", - "@smithy/util-middleware": "^2.1.3", - "tslib": "^2.5.0" + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-1.4.0.tgz", + "integrity": "sha512-uu9ZDI95Uij4qk+L6kyFjdk11zqBkcJ3Lv0sc6jZrqHvLyr0+oeekD3CnqMafBn/5PRI6uv6ulW3kNLRBUHeVw==", + "dependencies": { + "@smithy/middleware-endpoint": "^2.5.0", + "@smithy/middleware-retry": "^2.2.0", + "@smithy/middleware-serde": "^2.3.0", + "@smithy/protocol-http": "^3.3.0", + "@smithy/smithy-client": "^2.5.0", + "@smithy/types": "^2.12.0", + "@smithy/util-middleware": "^2.2.0", + "tslib": "^2.6.2" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@smithy/credential-provider-imds": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-2.2.4.tgz", - "integrity": "sha512-DdatjmBZQnhGe1FhI8gO98f7NmvQFSDiZTwC3WMvLTCKQUY+Y1SVkhJqIuLu50Eb7pTheoXQmK+hKYUgpUWsNA==", - "dependencies": { - "@smithy/node-config-provider": "^2.2.4", - "@smithy/property-provider": "^2.1.3", - "@smithy/types": "^2.10.1", - "@smithy/url-parser": "^2.1.3", - "tslib": "^2.5.0" + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-2.3.0.tgz", + "integrity": "sha512-BWB9mIukO1wjEOo1Ojgl6LrG4avcaC7T/ZP6ptmAaW4xluhSIPZhY+/PI5YKzlk+jsm+4sQZB45Bt1OfMeQa3w==", + "dependencies": { + "@smithy/node-config-provider": "^2.3.0", + "@smithy/property-provider": "^2.2.0", + "@smithy/types": "^2.12.0", + "@smithy/url-parser": "^2.2.0", + "tslib": "^2.6.2" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@smithy/eventstream-codec": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-2.1.3.tgz", - "integrity": "sha512-rGlCVuwSDv6qfKH4/lRxFjcZQnIE0LZ3D4lkMHg7ZSltK9rA74r0VuGSvWVQ4N/d70VZPaniFhp4Z14QYZsa+A==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-codec/-/eventstream-codec-2.2.0.tgz", + "integrity": "sha512-8janZoJw85nJmQZc4L8TuePp2pk1nxLgkxIR0TUjKJ5Dkj5oelB9WtiSSGXCQvNsJl0VSTvK/2ueMXxvpa9GVw==", "dependencies": { "@aws-crypto/crc32": "3.0.0", - "@smithy/types": "^2.10.1", - "@smithy/util-hex-encoding": "^2.1.1", - "tslib": "^2.5.0" + "@smithy/types": "^2.12.0", + "@smithy/util-hex-encoding": "^2.2.0", + "tslib": "^2.6.2" } }, "node_modules/@smithy/eventstream-serde-browser": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-2.1.3.tgz", - "integrity": "sha512-qAgKbZ9m2oBfSyJWWurX/MvQFRPrYypj79cDSleEgDwBoez6Tfd+FTpu2L/j3ZeC3mDlDHIKWksoeaXZpLLAHw==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-2.2.0.tgz", + "integrity": "sha512-UaPf8jKbcP71BGiO0CdeLmlg+RhWnlN8ipsMSdwvqBFigl5nil3rHOI/5GE3tfiuX8LvY5Z9N0meuU7Rab7jWw==", "dependencies": { - "@smithy/eventstream-serde-universal": "^2.1.3", - "@smithy/types": "^2.10.1", - "tslib": "^2.5.0" + "@smithy/eventstream-serde-universal": "^2.2.0", + "@smithy/types": "^2.12.0", + "tslib": "^2.6.2" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@smithy/eventstream-serde-config-resolver": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-2.1.3.tgz", - "integrity": "sha512-48rvsNv/MgAFCxOE0qwR7ZwKhaEdDoTxqH5HM+T6SDxICmPGb7gEuQzjTxQhcieCPgqyXeZFW8cU0QJxdowuIg==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-2.2.0.tgz", + "integrity": "sha512-RHhbTw/JW3+r8QQH7PrganjNCiuiEZmpi6fYUAetFfPLfZ6EkiA08uN3EFfcyKubXQxOwTeJRZSQmDDCdUshaA==", "dependencies": { - "@smithy/types": "^2.10.1", - "tslib": "^2.5.0" + "@smithy/types": "^2.12.0", + "tslib": "^2.6.2" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@smithy/eventstream-serde-node": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-2.1.3.tgz", - "integrity": "sha512-RPJWWDhj8isk3NtGfm3Xt1WdHyX9ZE42V+m1nLU1I0zZ1hEol/oawHsTnhva/VR5bn+bJ2zscx+BYr0cEPRtmg==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-node/-/eventstream-serde-node-2.2.0.tgz", + "integrity": "sha512-zpQMtJVqCUMn+pCSFcl9K/RPNtQE0NuMh8sKpCdEHafhwRsjP50Oq/4kMmvxSRy6d8Jslqd8BLvDngrUtmN9iA==", "dependencies": { - "@smithy/eventstream-serde-universal": "^2.1.3", - "@smithy/types": "^2.10.1", - "tslib": "^2.5.0" + "@smithy/eventstream-serde-universal": "^2.2.0", + "@smithy/types": "^2.12.0", + "tslib": "^2.6.2" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@smithy/eventstream-serde-universal": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-2.1.3.tgz", - "integrity": "sha512-ssvSMk1LX2jRhiOVgVLGfNJXdB8SvyjieKcJDHq698Gi3LOog6g/+l7ggrN+hZxyjUiDF4cUxgKaZTBUghzhLw==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-2.2.0.tgz", + "integrity": "sha512-pvoe/vvJY0mOpuF84BEtyZoYfbehiFj8KKWk1ds2AT0mTLYFVs+7sBJZmioOFdBXKd48lfrx1vumdPdmGlCLxA==", "dependencies": { - "@smithy/eventstream-codec": "^2.1.3", - "@smithy/types": "^2.10.1", - "tslib": "^2.5.0" + "@smithy/eventstream-codec": "^2.2.0", + "@smithy/types": "^2.12.0", + "tslib": "^2.6.2" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@smithy/fetch-http-handler": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-2.4.3.tgz", - "integrity": "sha512-Fn/KYJFo6L5I4YPG8WQb2hOmExgRmNpVH5IK2zU3JKrY5FKW7y9ar5e0BexiIC9DhSKqKX+HeWq/Y18fq7Dkpw==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-2.5.0.tgz", + "integrity": "sha512-BOWEBeppWhLn/no/JxUL/ghTfANTjT7kg3Ww2rPqTUY9R4yHPXxJ9JhMe3Z03LN3aPwiwlpDIUcVw1xDyHqEhw==", "dependencies": { - "@smithy/protocol-http": "^3.2.1", - "@smithy/querystring-builder": "^2.1.3", - "@smithy/types": "^2.10.1", - "@smithy/util-base64": "^2.1.1", - "tslib": "^2.5.0" + "@smithy/protocol-http": "^3.3.0", + "@smithy/querystring-builder": "^2.2.0", + "@smithy/types": "^2.12.0", + "@smithy/util-base64": "^2.3.0", + "tslib": "^2.6.2" } }, "node_modules/@smithy/hash-node": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-2.1.3.tgz", - "integrity": "sha512-FsAPCUj7VNJIdHbSxMd5uiZiF20G2zdSDgrgrDrHqIs/VMxK85Vqk5kMVNNDMCZmMezp6UKnac0B4nAyx7HJ9g==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-2.2.0.tgz", + "integrity": "sha512-zLWaC/5aWpMrHKpoDF6nqpNtBhlAYKF/7+9yMN7GpdR8CzohnWfGtMznPybnwSS8saaXBMxIGwJqR4HmRp6b3g==", "dependencies": { - "@smithy/types": "^2.10.1", - "@smithy/util-buffer-from": "^2.1.1", - "@smithy/util-utf8": "^2.1.1", - "tslib": "^2.5.0" + "@smithy/types": "^2.12.0", + "@smithy/util-buffer-from": "^2.2.0", + "@smithy/util-utf8": "^2.3.0", + "tslib": "^2.6.2" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@smithy/invalid-dependency": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-2.1.3.tgz", - "integrity": "sha512-wkra7d/G4CbngV4xsjYyAYOvdAhahQje/WymuQdVEnXFExJopEu7fbL5AEAlBPgWHXwu94VnCSG00gVzRfExyg==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-2.2.0.tgz", + "integrity": "sha512-nEDASdbKFKPXN2O6lOlTgrEEOO9NHIeO+HVvZnkqc8h5U9g3BIhWsvzFo+UcUbliMHvKNPD/zVxDrkP1Sbgp8Q==", "dependencies": { - "@smithy/types": "^2.10.1", - "tslib": "^2.5.0" + "@smithy/types": "^2.12.0", + "tslib": "^2.6.2" } }, "node_modules/@smithy/is-array-buffer": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.1.1.tgz", - "integrity": "sha512-xozSQrcUinPpNPNPds4S7z/FakDTh1MZWtRP/2vQtYB/u3HYrX2UXuZs+VhaKBd6Vc7g2XPr2ZtwGBNDN6fNKQ==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", + "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", "dependencies": { - "tslib": "^2.5.0" + "tslib": "^2.6.2" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@smithy/middleware-compression": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@smithy/middleware-compression/-/middleware-compression-2.1.4.tgz", - "integrity": "sha512-euMHyTkvKbndhLvoMKwDDZAcQPhVHv4prkEru2xkbH85ShC8SMLGjuTvQ6UcmOQCzuDZaMCBLhisKxbfn4GWWg==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/middleware-compression/-/middleware-compression-2.2.0.tgz", + "integrity": "sha512-4NHl84M/Yz9fIQH+NckoAExUOr0D8tZ5ng6rtr5eMzHwa8/bRTg4kUnpZW7S4yw7jT1NXDZ66M8r04uFiT4Ccw==", "dev": true, "dependencies": { - "@smithy/is-array-buffer": "^2.1.1", - "@smithy/node-config-provider": "^2.2.4", - "@smithy/protocol-http": "^3.2.1", - "@smithy/types": "^2.10.1", - "@smithy/util-config-provider": "^2.2.1", - "@smithy/util-middleware": "^2.1.3", - "@smithy/util-utf8": "^2.1.1", + "@smithy/is-array-buffer": "^2.2.0", + "@smithy/node-config-provider": "^2.3.0", + "@smithy/protocol-http": "^3.3.0", + "@smithy/types": "^2.12.0", + "@smithy/util-config-provider": "^2.3.0", + "@smithy/util-middleware": "^2.2.0", + "@smithy/util-utf8": "^2.3.0", "fflate": "0.8.1", - "tslib": "^2.5.0" + "tslib": "^2.6.2" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@smithy/middleware-content-length": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-2.1.3.tgz", - "integrity": "sha512-aJduhkC+dcXxdnv5ZpM3uMmtGmVFKx412R1gbeykS5HXDmRU6oSsyy2SoHENCkfOGKAQOjVE2WVqDJibC0d21g==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-2.2.0.tgz", + "integrity": "sha512-5bl2LG1Ah/7E5cMSC+q+h3IpVHMeOkG0yLRyQT1p2aMJkSrZG7RlXHPuAgb7EyaFeidKEnnd/fNaLLaKlHGzDQ==", "dependencies": { - "@smithy/protocol-http": "^3.2.1", - "@smithy/types": "^2.10.1", - "tslib": "^2.5.0" + "@smithy/protocol-http": "^3.3.0", + "@smithy/types": "^2.12.0", + "tslib": "^2.6.2" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@smithy/middleware-endpoint": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-2.4.4.tgz", - "integrity": "sha512-4yjHyHK2Jul4JUDBo2sTsWY9UshYUnXeb/TAK/MTaPEb8XQvDmpwSFnfIRDU45RY1a6iC9LCnmJNg/yHyfxqkw==", - "dependencies": { - "@smithy/middleware-serde": "^2.1.3", - "@smithy/node-config-provider": "^2.2.4", - "@smithy/shared-ini-file-loader": "^2.3.4", - "@smithy/types": "^2.10.1", - "@smithy/url-parser": "^2.1.3", - "@smithy/util-middleware": "^2.1.3", - "tslib": "^2.5.0" + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-2.5.0.tgz", + "integrity": "sha512-OBhI9ZEAG8Xen0xsFJwwNOt44WE2CWkfYIxTognC8x42Lfsdf0VN/wCMqpdkySMDio/vts10BiovAxQp0T0faA==", + "dependencies": { + "@smithy/middleware-serde": "^2.3.0", + "@smithy/node-config-provider": "^2.3.0", + "@smithy/shared-ini-file-loader": "^2.4.0", + "@smithy/types": "^2.12.0", + "@smithy/url-parser": "^2.2.0", + "@smithy/util-middleware": "^2.2.0", + "tslib": "^2.6.2" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@smithy/middleware-retry": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-2.1.4.tgz", - "integrity": "sha512-Cyolv9YckZTPli1EkkaS39UklonxMd08VskiuMhURDjC0HHa/AD6aK/YoD21CHv9s0QLg0WMLvk9YeLTKkXaFQ==", - "dependencies": { - "@smithy/node-config-provider": "^2.2.4", - "@smithy/protocol-http": "^3.2.1", - "@smithy/service-error-classification": "^2.1.3", - "@smithy/smithy-client": "^2.4.2", - "@smithy/types": "^2.10.1", - "@smithy/util-middleware": "^2.1.3", - "@smithy/util-retry": "^2.1.3", - "tslib": "^2.5.0", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-2.2.0.tgz", + "integrity": "sha512-PsjDOLpbevgn37yJbawmfVoanru40qVA8UEf2+YA1lvOefmhuhL6ZbKtGsLAWDRnE1OlAmedsbA/htH6iSZjNA==", + "dependencies": { + "@smithy/node-config-provider": "^2.3.0", + "@smithy/protocol-http": "^3.3.0", + "@smithy/service-error-classification": "^2.1.5", + "@smithy/smithy-client": "^2.5.0", + "@smithy/types": "^2.12.0", + "@smithy/util-middleware": "^2.2.0", + "@smithy/util-retry": "^2.2.0", + "tslib": "^2.6.2", "uuid": "^8.3.2" }, "engines": { @@ -4483,369 +4482,370 @@ } }, "node_modules/@smithy/middleware-serde": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-2.1.3.tgz", - "integrity": "sha512-s76LId+TwASrHhUa9QS4k/zeXDUAuNuddKklQzRgumbzge5BftVXHXIqL4wQxKGLocPwfgAOXWx+HdWhQk9hTg==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-2.3.0.tgz", + "integrity": "sha512-sIADe7ojwqTyvEQBe1nc/GXB9wdHhi9UwyX0lTyttmUWDJLP655ZYE1WngnNyXREme8I27KCaUhyhZWRXL0q7Q==", "dependencies": { - "@smithy/types": "^2.10.1", - "tslib": "^2.5.0" + "@smithy/types": "^2.12.0", + "tslib": "^2.6.2" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@smithy/middleware-stack": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-2.1.3.tgz", - "integrity": "sha512-opMFufVQgvBSld/b7mD7OOEBxF6STyraVr1xel1j0abVILM8ALJvRoFbqSWHGmaDlRGIiV9Q5cGbWi0sdiEaLQ==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-2.2.0.tgz", + "integrity": "sha512-Qntc3jrtwwrsAC+X8wms8zhrTr0sFXnyEGhZd9sLtsJ/6gGQKFzNB+wWbOcpJd7BR8ThNCoKt76BuQahfMvpeA==", "dependencies": { - "@smithy/types": "^2.10.1", - "tslib": "^2.5.0" + "@smithy/types": "^2.12.0", + "tslib": "^2.6.2" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@smithy/node-config-provider": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-2.2.4.tgz", - "integrity": "sha512-nqazHCp8r4KHSFhRQ+T0VEkeqvA0U+RhehBSr1gunUuNW3X7j0uDrWBxB2gE9eutzy6kE3Y7L+Dov/UXT871vg==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-2.3.0.tgz", + "integrity": "sha512-0elK5/03a1JPWMDPaS726Iw6LpQg80gFut1tNpPfxFuChEEklo2yL823V94SpTZTxmKlXFtFgsP55uh3dErnIg==", "dependencies": { - "@smithy/property-provider": "^2.1.3", - "@smithy/shared-ini-file-loader": "^2.3.4", - "@smithy/types": "^2.10.1", - "tslib": "^2.5.0" + "@smithy/property-provider": "^2.2.0", + "@smithy/shared-ini-file-loader": "^2.4.0", + "@smithy/types": "^2.12.0", + "tslib": "^2.6.2" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@smithy/node-http-handler": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-2.4.1.tgz", - "integrity": "sha512-HCkb94soYhJMxPCa61wGKgmeKpJ3Gftx1XD6bcWEB2wMV1L9/SkQu/6/ysKBnbOzWRE01FGzwrTxucHypZ8rdg==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-2.5.0.tgz", + "integrity": "sha512-mVGyPBzkkGQsPoxQUbxlEfRjrj6FPyA3u3u2VXGr9hT8wilsoQdZdvKpMBFMB8Crfhv5dNkKHIW0Yyuc7eABqA==", "dependencies": { - "@smithy/abort-controller": "^2.1.3", - "@smithy/protocol-http": "^3.2.1", - "@smithy/querystring-builder": "^2.1.3", - "@smithy/types": "^2.10.1", - "tslib": "^2.5.0" + "@smithy/abort-controller": "^2.2.0", + "@smithy/protocol-http": "^3.3.0", + "@smithy/querystring-builder": "^2.2.0", + "@smithy/types": "^2.12.0", + "tslib": "^2.6.2" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@smithy/property-provider": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-2.1.3.tgz", - "integrity": "sha512-bMz3se+ySKWNrgm7eIiQMa2HO/0fl2D0HvLAdg9pTMcpgp4SqOAh6bz7Ik6y7uQqSrk4rLjIKgbQ6yzYgGehCQ==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-2.2.0.tgz", + "integrity": "sha512-+xiil2lFhtTRzXkx8F053AV46QnIw6e7MV8od5Mi68E1ICOjCeCHw2XfLnDEUHnT9WGUIkwcqavXjfwuJbGlpg==", "dependencies": { - "@smithy/types": "^2.10.1", - "tslib": "^2.5.0" + "@smithy/types": "^2.12.0", + "tslib": "^2.6.2" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@smithy/protocol-http": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-3.2.1.tgz", - "integrity": "sha512-KLrQkEw4yJCeAmAH7hctE8g9KwA7+H2nSJwxgwIxchbp/L0B5exTdOQi9D5HinPLlothoervGmhpYKelZ6AxIA==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-3.3.0.tgz", + "integrity": "sha512-Xy5XK1AFWW2nlY/biWZXu6/krgbaf2dg0q492D8M5qthsnU2H+UgFeZLbM76FnH7s6RO/xhQRkj+T6KBO3JzgQ==", "dependencies": { - "@smithy/types": "^2.10.1", - "tslib": "^2.5.0" + "@smithy/types": "^2.12.0", + "tslib": "^2.6.2" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@smithy/querystring-builder": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-2.1.3.tgz", - "integrity": "sha512-kFD3PnNqKELe6m9GRHQw/ftFFSZpnSeQD4qvgDB6BQN6hREHELSosVFUMPN4M3MDKN2jAwk35vXHLoDrNfKu0A==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-2.2.0.tgz", + "integrity": "sha512-L1kSeviUWL+emq3CUVSgdogoM/D9QMFaqxL/dd0X7PCNWmPXqt+ExtrBjqT0V7HLN03Vs9SuiLrG3zy3JGnE5A==", "dependencies": { - "@smithy/types": "^2.10.1", - "@smithy/util-uri-escape": "^2.1.1", - "tslib": "^2.5.0" + "@smithy/types": "^2.12.0", + "@smithy/util-uri-escape": "^2.2.0", + "tslib": "^2.6.2" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@smithy/querystring-parser": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-2.1.3.tgz", - "integrity": "sha512-3+CWJoAqcBMR+yvz6D+Fc5VdoGFtfenW6wqSWATWajrRMGVwJGPT3Vy2eb2bnMktJc4HU4bpjeovFa566P3knQ==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-2.2.0.tgz", + "integrity": "sha512-BvHCDrKfbG5Yhbpj4vsbuPV2GgcpHiAkLeIlcA1LtfpMz3jrqizP1+OguSNSj1MwBHEiN+jwNisXLGdajGDQJA==", "dependencies": { - "@smithy/types": "^2.10.1", - "tslib": "^2.5.0" + "@smithy/types": "^2.12.0", + "tslib": "^2.6.2" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@smithy/service-error-classification": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-2.1.3.tgz", - "integrity": "sha512-iUrpSsem97bbXHHT/v3s7vaq8IIeMo6P6cXdeYHrx0wOJpMeBGQF7CB0mbJSiTm3//iq3L55JiEm8rA7CTVI8A==", + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-2.1.5.tgz", + "integrity": "sha512-uBDTIBBEdAQryvHdc5W8sS5YX7RQzF683XrHePVdFmAgKiMofU15FLSM0/HU03hKTnazdNRFa0YHS7+ArwoUSQ==", "dependencies": { - "@smithy/types": "^2.10.1" + "@smithy/types": "^2.12.0" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@smithy/shared-ini-file-loader": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-2.3.4.tgz", - "integrity": "sha512-CiZmPg9GeDKbKmJGEFvJBsJcFnh0AQRzOtQAzj1XEa8N/0/uSN/v1LYzgO7ry8hhO8+9KB7+DhSW0weqBra4Aw==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-2.4.0.tgz", + "integrity": "sha512-WyujUJL8e1B6Z4PBfAqC/aGY1+C7T0w20Gih3yrvJSk97gpiVfB+y7c46T4Nunk+ZngLq0rOIdeVeIklk0R3OA==", "dependencies": { - "@smithy/types": "^2.10.1", - "tslib": "^2.5.0" + "@smithy/types": "^2.12.0", + "tslib": "^2.6.2" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@smithy/signature-v4": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-2.1.3.tgz", - "integrity": "sha512-Jq4iPPdCmJojZTsPePn4r1ULShh6ONkokLuxp1Lnk4Sq7r7rJp4HlA1LbPBq4bD64TIzQezIpr1X+eh5NYkNxw==", - "dependencies": { - "@smithy/eventstream-codec": "^2.1.3", - "@smithy/is-array-buffer": "^2.1.1", - "@smithy/types": "^2.10.1", - "@smithy/util-hex-encoding": "^2.1.1", - "@smithy/util-middleware": "^2.1.3", - "@smithy/util-uri-escape": "^2.1.1", - "@smithy/util-utf8": "^2.1.1", - "tslib": "^2.5.0" + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-2.2.0.tgz", + "integrity": "sha512-+B5TNzj/fRZzVW3z8UUJOkNx15+4E0CLuvJmJUA1JUIZFp3rdJ/M2H5r2SqltaVPXL0oIxv/6YK92T9TsFGbFg==", + "dependencies": { + "@smithy/eventstream-codec": "^2.2.0", + "@smithy/is-array-buffer": "^2.2.0", + "@smithy/types": "^2.12.0", + "@smithy/util-hex-encoding": "^2.2.0", + "@smithy/util-middleware": "^2.2.0", + "@smithy/util-uri-escape": "^2.2.0", + "@smithy/util-utf8": "^2.3.0", + "tslib": "^2.6.2" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@smithy/smithy-client": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-2.4.2.tgz", - "integrity": "sha512-ntAFYN51zu3N3mCd95YFcFi/8rmvm//uX+HnK24CRbI6k5Rjackn0JhgKz5zOx/tbNvOpgQIwhSX+1EvEsBLbA==", - "dependencies": { - "@smithy/middleware-endpoint": "^2.4.4", - "@smithy/middleware-stack": "^2.1.3", - "@smithy/protocol-http": "^3.2.1", - "@smithy/types": "^2.10.1", - "@smithy/util-stream": "^2.1.3", - "tslib": "^2.5.0" + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-2.5.0.tgz", + "integrity": "sha512-DDXWHWdimtS3y/Kw1Jo46KQ0ZYsDKcldFynQERUGBPDpkW1lXOTHy491ALHjwfiBQvzsVKVxl5+ocXNIgJuX4g==", + "dependencies": { + "@smithy/middleware-endpoint": "^2.5.0", + "@smithy/middleware-stack": "^2.2.0", + "@smithy/protocol-http": "^3.3.0", + "@smithy/types": "^2.12.0", + "@smithy/util-stream": "^2.2.0", + "tslib": "^2.6.2" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@smithy/types": { - "version": "2.10.1", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.10.1.tgz", - "integrity": "sha512-hjQO+4ru4cQ58FluQvKKiyMsFg0A6iRpGm2kqdH8fniyNd2WyanoOsYJfMX/IFLuLxEoW6gnRkNZy1y6fUUhtA==", + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-2.12.0.tgz", + "integrity": "sha512-QwYgloJ0sVNBeBuBs65cIkTbfzV/Q6ZNPCJ99EICFEdJYG50nGIY/uYXp+TbsdJReIuPr0a0kXmCvren3MbRRw==", "dependencies": { - "tslib": "^2.5.0" + "tslib": "^2.6.2" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@smithy/url-parser": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-2.1.3.tgz", - "integrity": "sha512-X1NRA4WzK/ihgyzTpeGvI9Wn45y8HmqF4AZ/FazwAv8V203Ex+4lXqcYI70naX9ETqbqKVzFk88W6WJJzCggTQ==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-2.2.0.tgz", + "integrity": "sha512-hoA4zm61q1mNTpksiSWp2nEl1dt3j726HdRhiNgVJQMj7mLp7dprtF57mOB6JvEk/x9d2bsuL5hlqZbBuHQylQ==", "dependencies": { - "@smithy/querystring-parser": "^2.1.3", - "@smithy/types": "^2.10.1", - "tslib": "^2.5.0" + "@smithy/querystring-parser": "^2.2.0", + "@smithy/types": "^2.12.0", + "tslib": "^2.6.2" } }, "node_modules/@smithy/util-base64": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-2.1.1.tgz", - "integrity": "sha512-UfHVpY7qfF/MrgndI5PexSKVTxSZIdz9InghTFa49QOvuu9I52zLPLUHXvHpNuMb1iD2vmc6R+zbv/bdMipR/g==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-2.3.0.tgz", + "integrity": "sha512-s3+eVwNeJuXUwuMbusncZNViuhv2LjVJ1nMwTqSA0XAC7gjKhqqxRdJPhR8+YrkoZ9IiIbFk/yK6ACe/xlF+hw==", "dependencies": { - "@smithy/util-buffer-from": "^2.1.1", - "tslib": "^2.5.0" + "@smithy/util-buffer-from": "^2.2.0", + "@smithy/util-utf8": "^2.3.0", + "tslib": "^2.6.2" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@smithy/util-body-length-browser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-2.1.1.tgz", - "integrity": "sha512-ekOGBLvs1VS2d1zM2ER4JEeBWAvIOUKeaFch29UjjJsxmZ/f0L3K3x0dEETgh3Q9bkZNHgT+rkdl/J/VUqSRag==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-2.2.0.tgz", + "integrity": "sha512-dtpw9uQP7W+n3vOtx0CfBD5EWd7EPdIdsQnWTDoFf77e3VUf05uA7R7TGipIo8e4WL2kuPdnsr3hMQn9ziYj5w==", "dependencies": { - "tslib": "^2.5.0" + "tslib": "^2.6.2" } }, "node_modules/@smithy/util-body-length-node": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-2.2.1.tgz", - "integrity": "sha512-/ggJG+ta3IDtpNVq4ktmEUtOkH1LW64RHB5B0hcr5ZaWBmo96UX2cIOVbjCqqDickTXqBWZ4ZO0APuaPrD7Abg==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-2.3.0.tgz", + "integrity": "sha512-ITWT1Wqjubf2CJthb0BuT9+bpzBfXeMokH/AAa5EJQgbv9aPMVfnM76iFIZVFf50hYXGbtiV71BHAthNWd6+dw==", "dependencies": { - "tslib": "^2.5.0" + "tslib": "^2.6.2" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@smithy/util-buffer-from": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.1.1.tgz", - "integrity": "sha512-clhNjbyfqIv9Md2Mg6FffGVrJxw7bgK7s3Iax36xnfVj6cg0fUG7I4RH0XgXJF8bxi+saY5HR21g2UPKSxVCXg==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", + "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", "dependencies": { - "@smithy/is-array-buffer": "^2.1.1", - "tslib": "^2.5.0" + "@smithy/is-array-buffer": "^2.2.0", + "tslib": "^2.6.2" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@smithy/util-config-provider": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-2.2.1.tgz", - "integrity": "sha512-50VL/tx9oYYcjJn/qKqNy7sCtpD0+s8XEBamIFo4mFFTclKMNp+rsnymD796uybjiIquB7VCB/DeafduL0y2kw==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-2.3.0.tgz", + "integrity": "sha512-HZkzrRcuFN1k70RLqlNK4FnPXKOpkik1+4JaBoHNJn+RnJGYqaa3c5/+XtLOXhlKzlRgNvyaLieHTW2VwGN0VQ==", "dependencies": { - "tslib": "^2.5.0" + "tslib": "^2.6.2" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@smithy/util-defaults-mode-browser": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-2.1.4.tgz", - "integrity": "sha512-J6XAVY+/g7jf03QMnvqPyU+8jqGrrtXoKWFVOS+n1sz0Lg8HjHJ1ANqaDN+KTTKZRZlvG8nU5ZrJOUL6VdwgcQ==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-2.2.0.tgz", + "integrity": "sha512-2okTdZaCBvOJszAPU/KSvlimMe35zLOKbQpHhamFJmR7t95HSe0K3C92jQPjKY3PmDBD+7iMkOnuW05F5OlF4g==", "dependencies": { - "@smithy/property-provider": "^2.1.3", - "@smithy/smithy-client": "^2.4.2", - "@smithy/types": "^2.10.1", + "@smithy/property-provider": "^2.2.0", + "@smithy/smithy-client": "^2.5.0", + "@smithy/types": "^2.12.0", "bowser": "^2.11.0", - "tslib": "^2.5.0" + "tslib": "^2.6.2" }, "engines": { "node": ">= 10.0.0" } }, "node_modules/@smithy/util-defaults-mode-node": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-2.2.3.tgz", - "integrity": "sha512-ttUISrv1uVOjTlDa3nznX33f0pthoUlP+4grhTvOzcLhzArx8qHB94/untGACOG3nlf8vU20nI2iWImfzoLkYA==", - "dependencies": { - "@smithy/config-resolver": "^2.1.4", - "@smithy/credential-provider-imds": "^2.2.4", - "@smithy/node-config-provider": "^2.2.4", - "@smithy/property-provider": "^2.1.3", - "@smithy/smithy-client": "^2.4.2", - "@smithy/types": "^2.10.1", - "tslib": "^2.5.0" + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-2.3.0.tgz", + "integrity": "sha512-hfKXnNLmsW9cmLb/JXKIvtuO6Cf4SuqN5PN1C2Ru/TBIws+m1wSgb+A53vo0r66xzB6E82inKG2J7qtwdi+Kkw==", + "dependencies": { + "@smithy/config-resolver": "^2.2.0", + "@smithy/credential-provider-imds": "^2.3.0", + "@smithy/node-config-provider": "^2.3.0", + "@smithy/property-provider": "^2.2.0", + "@smithy/smithy-client": "^2.5.0", + "@smithy/types": "^2.12.0", + "tslib": "^2.6.2" }, "engines": { "node": ">= 10.0.0" } }, "node_modules/@smithy/util-endpoints": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-1.1.4.tgz", - "integrity": "sha512-/qAeHmK5l4yQ4/bCIJ9p49wDe9rwWtOzhPHblu386fwPNT3pxmodgcs9jDCV52yK9b4rB8o9Sj31P/7Vzka1cg==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-1.2.0.tgz", + "integrity": "sha512-BuDHv8zRjsE5zXd3PxFXFknzBG3owCpjq8G3FcsXW3CykYXuEqM3nTSsmLzw5q+T12ZYuDlVUZKBdpNbhVtlrQ==", "dependencies": { - "@smithy/node-config-provider": "^2.2.4", - "@smithy/types": "^2.10.1", - "tslib": "^2.5.0" + "@smithy/node-config-provider": "^2.3.0", + "@smithy/types": "^2.12.0", + "tslib": "^2.6.2" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@smithy/util-hex-encoding": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-2.1.1.tgz", - "integrity": "sha512-3UNdP2pkYUUBGEXzQI9ODTDK+Tcu1BlCyDBaRHwyxhA+8xLP8agEKQq4MGmpjqb4VQAjq9TwlCQX0kP6XDKYLg==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-2.2.0.tgz", + "integrity": "sha512-7iKXR+/4TpLK194pVjKiasIyqMtTYJsgKgM242Y9uzt5dhHnUDvMNb+3xIhRJ9QhvqGii/5cRUt4fJn3dtXNHQ==", "dependencies": { - "tslib": "^2.5.0" + "tslib": "^2.6.2" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@smithy/util-middleware": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-2.1.3.tgz", - "integrity": "sha512-/+2fm7AZ2ozl5h8wM++ZP0ovE9/tiUUAHIbCfGfb3Zd3+Dyk17WODPKXBeJ/TnK5U+x743QmA0xHzlSm8I/qhw==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-2.2.0.tgz", + "integrity": "sha512-L1qpleXf9QD6LwLCJ5jddGkgWyuSvWBkJwWAZ6kFkdifdso+sk3L3O1HdmPvCdnCK3IS4qWyPxev01QMnfHSBw==", "dependencies": { - "@smithy/types": "^2.10.1", - "tslib": "^2.5.0" + "@smithy/types": "^2.12.0", + "tslib": "^2.6.2" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@smithy/util-retry": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-2.1.3.tgz", - "integrity": "sha512-Kbvd+GEMuozbNUU3B89mb99tbufwREcyx2BOX0X2+qHjq6Gvsah8xSDDgxISDwcOHoDqUWO425F0Uc/QIRhYkg==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-2.2.0.tgz", + "integrity": "sha512-q9+pAFPTfftHXRytmZ7GzLFFrEGavqapFc06XxzZFcSIGERXMerXxCitjOG1prVDR9QdjqotF40SWvbqcCpf8g==", "dependencies": { - "@smithy/service-error-classification": "^2.1.3", - "@smithy/types": "^2.10.1", - "tslib": "^2.5.0" + "@smithy/service-error-classification": "^2.1.5", + "@smithy/types": "^2.12.0", + "tslib": "^2.6.2" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@smithy/util-stream": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-2.1.3.tgz", - "integrity": "sha512-HvpEQbP8raTy9n86ZfXiAkf3ezp1c3qeeO//zGqwZdrfaoOpGKQgF2Sv1IqZp7wjhna7pvczWaGUHjcOPuQwKw==", - "dependencies": { - "@smithy/fetch-http-handler": "^2.4.3", - "@smithy/node-http-handler": "^2.4.1", - "@smithy/types": "^2.10.1", - "@smithy/util-base64": "^2.1.1", - "@smithy/util-buffer-from": "^2.1.1", - "@smithy/util-hex-encoding": "^2.1.1", - "@smithy/util-utf8": "^2.1.1", - "tslib": "^2.5.0" + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-2.2.0.tgz", + "integrity": "sha512-17faEXbYWIRst1aU9SvPZyMdWmqIrduZjVOqCPMIsWFNxs5yQQgFrJL6b2SdiCzyW9mJoDjFtgi53xx7EH+BXA==", + "dependencies": { + "@smithy/fetch-http-handler": "^2.5.0", + "@smithy/node-http-handler": "^2.5.0", + "@smithy/types": "^2.12.0", + "@smithy/util-base64": "^2.3.0", + "@smithy/util-buffer-from": "^2.2.0", + "@smithy/util-hex-encoding": "^2.2.0", + "@smithy/util-utf8": "^2.3.0", + "tslib": "^2.6.2" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@smithy/util-uri-escape": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-2.1.1.tgz", - "integrity": "sha512-saVzI1h6iRBUVSqtnlOnc9ssU09ypo7n+shdQ8hBTZno/9rZ3AuRYvoHInV57VF7Qn7B+pFJG7qTzFiHxWlWBw==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-2.2.0.tgz", + "integrity": "sha512-jtmJMyt1xMD/d8OtbVJ2gFZOSKc+ueYJZPW20ULW1GOp/q/YIM0wNh+u8ZFao9UaIGz4WoPW8hC64qlWLIfoDA==", "dependencies": { - "tslib": "^2.5.0" + "tslib": "^2.6.2" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@smithy/util-utf8": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.1.1.tgz", - "integrity": "sha512-BqTpzYEcUMDwAKr7/mVRUtHDhs6ZoXDi9NypMvMfOr/+u1NW7JgqodPDECiiLboEm6bobcPcECxzjtQh865e9A==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", + "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", "dependencies": { - "@smithy/util-buffer-from": "^2.1.1", - "tslib": "^2.5.0" + "@smithy/util-buffer-from": "^2.2.0", + "tslib": "^2.6.2" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@smithy/util-waiter": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-2.1.3.tgz", - "integrity": "sha512-3R0wNFAQQoH9e4m+bVLDYNOst2qNxtxFgq03WoNHWTBOqQT3jFnOBRj1W51Rf563xDA5kwqjziksxn6RKkHB+Q==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-2.2.0.tgz", + "integrity": "sha512-IHk53BVw6MPMi2Gsn+hCng8rFA3ZmR3Rk7GllxDUW9qFJl/hiSvskn7XldkECapQVkIg/1dHpMAxI9xSTaLLSA==", "dependencies": { - "@smithy/abort-controller": "^2.1.3", - "@smithy/types": "^2.10.1", - "tslib": "^2.5.0" + "@smithy/abort-controller": "^2.2.0", + "@smithy/types": "^2.12.0", + "tslib": "^2.6.2" }, "engines": { "node": ">=14.0.0" @@ -5050,9 +5050,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.11.24", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.24.tgz", - "integrity": "sha512-Kza43ewS3xoLgCEpQrsT+xRo/EJej1y0kVYGiLFE1NEODXGzTfwiC6tXTLMQskn1X4/Rjlh0MQUvx9W+L9long==", + "version": "20.11.30", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.30.tgz", + "integrity": "sha512-dHM6ZxwlmuZaRmUPfv1p+KrdD1Dci04FbdEm/9wEMouFqxYoFl5aMkt0VMAUtYRQDyYvD41WJLukhq/ha3YuTw==", "dependencies": { "undici-types": "~5.26.4" } @@ -5759,9 +5759,9 @@ } }, "node_modules/aws-cdk": { - "version": "2.131.0", - "resolved": "https://registry.npmjs.org/aws-cdk/-/aws-cdk-2.131.0.tgz", - "integrity": "sha512-ji+MwGFGC88HE/EqV6/VARBp5mu3nXIDa/GYwtGycJqu6WqXhNZXWeDH0JsWaY6+BSUdpY6pr6KWpV+MDyVkDg==", + "version": "2.133.0", + "resolved": "https://registry.npmjs.org/aws-cdk/-/aws-cdk-2.133.0.tgz", + "integrity": "sha512-EwH8VgQQ8ODeMwjE3p+WhbcbWNkCbvuJJl+Py9IB5znGf7GwLcEmOu4YWBsBGPVu41SXbSAf36twMBrJytCFZA==", "bin": { "cdk": "bin/cdk" }, @@ -5773,9 +5773,9 @@ } }, "node_modules/aws-cdk-lib": { - "version": "2.131.0", - "resolved": "https://registry.npmjs.org/aws-cdk-lib/-/aws-cdk-lib-2.131.0.tgz", - "integrity": "sha512-9XLgiTgY+q0S3K93VPeJO0chIN8BZwZ3aSrILvF868Dz+0NTNrD2m5M0xGK5Rw0uoJS+N+DvGaz/2hLAiVqcBw==", + "version": "2.133.0", + "resolved": "https://registry.npmjs.org/aws-cdk-lib/-/aws-cdk-lib-2.133.0.tgz", + "integrity": "sha512-5/ezv8Ir2xyz3myeXQcODwrjVRN/cDD2OpBwU/ySFBe+uNac25OoHfTXwUPwE7oLj9qetSt6/i1QvY2iIs6yiQ==", "bundleDependencies": [ "@balena/dockerignore", "case", @@ -6134,10 +6134,11 @@ } }, "node_modules/aws-sdk": { - "version": "2.1568.0", - "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1568.0.tgz", - "integrity": "sha512-ECGJlhn4tnvC+MwNxGDGbhKEOwqLtmtEb3VK5s0z8pcU60Uv1b8+wRPKjqM/eJ+J4N5CL92Y5aq5xAdTquBZRQ==", + "version": "2.1583.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1583.0.tgz", + "integrity": "sha512-gpJFO1kWC4qHPFMRgtjp15X48W8UrU1BvhYNUE7vv4O2YFHWbfulDp1hAdv6NN1sFkq/gvK2gdo5+qjj+4wdOQ==", "dev": true, + "hasInstallScript": true, "dependencies": { "buffer": "4.9.2", "events": "1.1.1", @@ -6155,9 +6156,9 @@ } }, "node_modules/aws-sdk-client-mock": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/aws-sdk-client-mock/-/aws-sdk-client-mock-3.0.1.tgz", - "integrity": "sha512-9VAzJLl8mz99KP9HjOm/93d8vznRRUTpJooPBOunRdUAnVYopCe9xmMuu7eVemu8fQ+w6rP7o5bBK1kAFkB2KQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/aws-sdk-client-mock/-/aws-sdk-client-mock-4.0.0.tgz", + "integrity": "sha512-/rxo+pzCFaUozK7TyCqo3GYwzdBGn9Ai6EsT8ytXDoUXlD/Q5hw9hj2lOkCAyubECzGJFHMmQg9GZ1GOGlN/qQ==", "dev": true, "dependencies": { "@types/sinon": "^10.0.10", @@ -6166,201 +6167,16 @@ } }, "node_modules/aws-sdk-client-mock-jest": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/aws-sdk-client-mock-jest/-/aws-sdk-client-mock-jest-3.0.1.tgz", - "integrity": "sha512-eT0i+XkvitMt7ml2LVUayVd6oiFO7SqLQBEbRId094fs2qlWlL+Png0WuOFVCIcTZgjoK5v81UnKSLwFbbpWqA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/aws-sdk-client-mock-jest/-/aws-sdk-client-mock-jest-4.0.0.tgz", + "integrity": "sha512-Q8WWWYpcEZK8m0OA42Lm2LaJgStAfqvmMYVtEs2Ibz+nwjZDZSK/xlsYbdsFz93RO9cUPXbQMeyKUXeqdjh49g==", "dev": true, "dependencies": { - "@types/jest": "^28.1.3", + "expect": ">28.1.3", "tslib": "^2.1.0" }, "peerDependencies": { - "aws-sdk-client-mock": "3.0.1" - } - }, - "node_modules/aws-sdk-client-mock-jest/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" - } - }, - "node_modules/aws-sdk-client-mock-jest/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" - } - }, - "node_modules/aws-sdk-client-mock-jest/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" - } - }, - "node_modules/aws-sdk-client-mock-jest/node_modules/@sinclair/typebox": { - "version": "0.24.51", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.51.tgz", - "integrity": "sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==", - "dev": true - }, - "node_modules/aws-sdk-client-mock-jest/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" - } - }, - "node_modules/aws-sdk-client-mock-jest/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/aws-sdk-client-mock-jest/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" - } - }, - "node_modules/aws-sdk-client-mock-jest/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" - } - }, - "node_modules/aws-sdk-client-mock-jest/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" - } - }, - "node_modules/aws-sdk-client-mock-jest/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" - } - }, - "node_modules/aws-sdk-client-mock-jest/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" - } - }, - "node_modules/aws-sdk-client-mock-jest/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" - } - }, - "node_modules/aws-sdk-client-mock-jest/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" - } - }, - "node_modules/aws-sdk-client-mock-jest/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" + "aws-sdk-client-mock": "4.0.0" } }, "node_modules/aws-sdk/node_modules/buffer": { @@ -6396,9 +6212,9 @@ } }, "node_modules/aws-xray-sdk-core": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/aws-xray-sdk-core/-/aws-xray-sdk-core-3.5.3.tgz", - "integrity": "sha512-FxDRVvIHqf3bzj76M+LSyh/1V5cYuhn+YLRS+u6Xs6WindPMDn9j03v2PNskPgvUi7pMqU40aVhQphRX/YWTfQ==", + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/aws-xray-sdk-core/-/aws-xray-sdk-core-3.5.4.tgz", + "integrity": "sha512-L4yt2OstsebH8rNAIykDrr+BKjHGxwg5+1FUZAgqDBnaL98sfjPXNYVQNYzg+2ITOjfDbd8NtR1vCQXYVepm+g==", "dependencies": { "@aws-sdk/types": "^3.4.1", "@smithy/service-error-classification": "^2.0.4", @@ -6412,12 +6228,12 @@ } }, "node_modules/axios": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.7.tgz", - "integrity": "sha512-/hDJGff6/c7u0hDkvkGxR/oy6CbCs8ziCsC7SqmhjfozqiJGc8Z11wrv9z9lYfY4K8l+H9TpjcMDX0xOZmx+RA==", + "version": "1.6.8", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz", + "integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==", "dev": true, "dependencies": { - "follow-redirects": "^1.15.4", + "follow-redirects": "^1.15.6", "form-data": "^4.0.0", "proxy-from-env": "^1.1.0" } @@ -7994,9 +7810,9 @@ } }, "node_modules/esbuild": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.1.tgz", - "integrity": "sha512-OJwEgrpWm/PCMsLVWXKqvcjme3bHNpOgN7Tb6cQnR5n0TPbQx1/Xrn7rqM+wn17bYeT6MGB5sn1Bh5YiGi70nA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz", + "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==", "hasInstallScript": true, "bin": { "esbuild": "bin/esbuild" @@ -8005,29 +7821,29 @@ "node": ">=12" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.20.1", - "@esbuild/android-arm": "0.20.1", - "@esbuild/android-arm64": "0.20.1", - "@esbuild/android-x64": "0.20.1", - "@esbuild/darwin-arm64": "0.20.1", - "@esbuild/darwin-x64": "0.20.1", - "@esbuild/freebsd-arm64": "0.20.1", - "@esbuild/freebsd-x64": "0.20.1", - "@esbuild/linux-arm": "0.20.1", - "@esbuild/linux-arm64": "0.20.1", - "@esbuild/linux-ia32": "0.20.1", - "@esbuild/linux-loong64": "0.20.1", - "@esbuild/linux-mips64el": "0.20.1", - "@esbuild/linux-ppc64": "0.20.1", - "@esbuild/linux-riscv64": "0.20.1", - "@esbuild/linux-s390x": "0.20.1", - "@esbuild/linux-x64": "0.20.1", - "@esbuild/netbsd-x64": "0.20.1", - "@esbuild/openbsd-x64": "0.20.1", - "@esbuild/sunos-x64": "0.20.1", - "@esbuild/win32-arm64": "0.20.1", - "@esbuild/win32-ia32": "0.20.1", - "@esbuild/win32-x64": "0.20.1" + "@esbuild/aix-ppc64": "0.20.2", + "@esbuild/android-arm": "0.20.2", + "@esbuild/android-arm64": "0.20.2", + "@esbuild/android-x64": "0.20.2", + "@esbuild/darwin-arm64": "0.20.2", + "@esbuild/darwin-x64": "0.20.2", + "@esbuild/freebsd-arm64": "0.20.2", + "@esbuild/freebsd-x64": "0.20.2", + "@esbuild/linux-arm": "0.20.2", + "@esbuild/linux-arm64": "0.20.2", + "@esbuild/linux-ia32": "0.20.2", + "@esbuild/linux-loong64": "0.20.2", + "@esbuild/linux-mips64el": "0.20.2", + "@esbuild/linux-ppc64": "0.20.2", + "@esbuild/linux-riscv64": "0.20.2", + "@esbuild/linux-s390x": "0.20.2", + "@esbuild/linux-x64": "0.20.2", + "@esbuild/netbsd-x64": "0.20.2", + "@esbuild/openbsd-x64": "0.20.2", + "@esbuild/sunos-x64": "0.20.2", + "@esbuild/win32-arm64": "0.20.2", + "@esbuild/win32-ia32": "0.20.2", + "@esbuild/win32-x64": "0.20.2" } }, "node_modules/escalade": { @@ -8746,9 +8562,9 @@ "dev": true }, "node_modules/follow-redirects": { - "version": "1.15.5", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.5.tgz", - "integrity": "sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==", + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", "dev": true, "funding": [ { @@ -16562,9 +16378,9 @@ "dev": true }, "node_modules/typedoc": { - "version": "0.25.11", - "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.25.11.tgz", - "integrity": "sha512-5MbI1W/FOG6oXsd8bdssQidSTeKh8Kt3xA5uKVzI+K99uzP8EGN45uPnPvQesyaWdD+89s4wCQdtWEd8QUbiRg==", + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.25.12.tgz", + "integrity": "sha512-F+qhkK2VoTweDXd1c42GS/By2DvI2uDF4/EpG424dTexSHdtCH52C6IcAvMA6jR3DzAWZjHpUOW+E02kyPNUNw==", "dev": true, "dependencies": { "lunr": "^2.3.9", @@ -16579,7 +16395,7 @@ "node": ">= 16" }, "peerDependencies": { - "typescript": "4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x || 5.1.x || 5.2.x || 5.3.x" + "typescript": "4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x" } }, "node_modules/typedoc-plugin-missing-exports": { @@ -16592,9 +16408,9 @@ } }, "node_modules/typescript": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", - "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", + "version": "5.4.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.3.tgz", + "integrity": "sha512-KrPd3PKaCLr78MalgiwJnA25Nm8HAmdwN3mYUYZgG/wizIo9EainNVQI9/yDavtVFRN2h3k8uf3GLHuhDMgEHg==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -17159,7 +16975,7 @@ }, "packages/batch": { "name": "@aws-lambda-powertools/batch", - "version": "2.0.2", + "version": "2.0.3", "license": "MIT-0", "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing" @@ -17167,7 +16983,7 @@ }, "packages/commons": { "name": "@aws-lambda-powertools/commons", - "version": "2.0.2", + "version": "2.0.3", "license": "MIT-0", "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing" @@ -17175,20 +16991,20 @@ }, "packages/idempotency": { "name": "@aws-lambda-powertools/idempotency", - "version": "2.0.2", + "version": "2.0.3", "license": "MIT-0", "dependencies": { - "@aws-lambda-powertools/commons": "^2.0.2", + "@aws-lambda-powertools/commons": "^2.0.3", "@aws-sdk/util-base64-node": "^3.209.0", "jmespath": "^0.16.0" }, "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing", - "@aws-sdk/client-dynamodb": "^3.528.0", - "@aws-sdk/lib-dynamodb": "^3.528.0", + "@aws-sdk/client-dynamodb": "^3.538.0", + "@aws-sdk/lib-dynamodb": "^3.538.0", "@types/jmespath": "^0.15.0", - "aws-sdk-client-mock": "^3.0.1", - "aws-sdk-client-mock-jest": "^3.0.1" + "aws-sdk-client-mock": "^4.0.0", + "aws-sdk-client-mock-jest": "^4.0.0" }, "peerDependencies": { "@aws-sdk/client-dynamodb": ">=3.x", @@ -17209,18 +17025,18 @@ }, "packages/jmespath": { "name": "@aws-lambda-powertools/jmespath", - "version": "2.0.2", + "version": "2.0.3", "license": "MIT-0", "dependencies": { - "@aws-lambda-powertools/commons": "^2.0.2" + "@aws-lambda-powertools/commons": "^2.0.3" } }, "packages/logger": { "name": "@aws-lambda-powertools/logger", - "version": "2.0.2", + "version": "2.0.3", "license": "MIT-0", "dependencies": { - "@aws-lambda-powertools/commons": "^2.0.2", + "@aws-lambda-powertools/commons": "^2.0.3", "lodash.merge": "^4.6.2" }, "devDependencies": { @@ -17238,14 +17054,14 @@ }, "packages/metrics": { "name": "@aws-lambda-powertools/metrics", - "version": "2.0.2", + "version": "2.0.3", "license": "MIT-0", "dependencies": { - "@aws-lambda-powertools/commons": "^2.0.2" + "@aws-lambda-powertools/commons": "^2.0.3" }, "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing", - "@aws-sdk/client-cloudwatch": "^3.525.0", + "@aws-sdk/client-cloudwatch": "^3.535.0", "@types/promise-retry": "^1.1.3", "promise-retry": "^2.0.1" }, @@ -17260,21 +17076,21 @@ }, "packages/parameters": { "name": "@aws-lambda-powertools/parameters", - "version": "2.0.2", + "version": "2.0.3", "license": "MIT-0", "dependencies": { - "@aws-lambda-powertools/commons": "^2.0.2", + "@aws-lambda-powertools/commons": "^2.0.3", "@aws-sdk/util-base64-node": "^3.209.0" }, "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing", - "@aws-sdk/client-appconfigdata": "^3.525.0", - "@aws-sdk/client-dynamodb": "^3.528.0", - "@aws-sdk/client-secrets-manager": "^3.525.0", - "@aws-sdk/client-ssm": "^3.525.0", - "@aws-sdk/util-dynamodb": "^3.528.0", - "aws-sdk-client-mock": "^3.0.1", - "aws-sdk-client-mock-jest": "^3.0.1" + "@aws-sdk/client-appconfigdata": "^3.535.0", + "@aws-sdk/client-dynamodb": "^3.538.0", + "@aws-sdk/client-secrets-manager": "^3.535.0", + "@aws-sdk/client-ssm": "^3.535.0", + "@aws-sdk/util-dynamodb": "^3.538.0", + "aws-sdk-client-mock": "^4.0.0", + "aws-sdk-client-mock-jest": "^4.0.0" }, "peerDependencies": { "@aws-sdk/client-appconfigdata": ">=3.x", @@ -17307,31 +17123,31 @@ }, "packages/testing": { "name": "@aws-lambda-powertools/testing-utils", - "version": "2.0.2", + "version": "2.0.3", "license": "MIT-0", "dependencies": { "@aws-cdk/cli-lib-alpha": "^2.121.1-alpha.0", - "@aws-sdk/client-lambda": "^3.525.0", - "@smithy/util-utf8": "^2.1.0", - "aws-cdk-lib": "^2.131.0", - "esbuild": "^0.20.1" + "@aws-sdk/client-lambda": "^3.536.0", + "@smithy/util-utf8": "^2.3.0", + "aws-cdk-lib": "^2.133.0", + "esbuild": "^0.20.2" } }, "packages/tracer": { "name": "@aws-lambda-powertools/tracer", - "version": "2.0.2", + "version": "2.0.3", "license": "MIT-0", "dependencies": { - "@aws-lambda-powertools/commons": "^2.0.2", - "aws-xray-sdk-core": "^3.5.3" + "@aws-lambda-powertools/commons": "^2.0.3", + "aws-xray-sdk-core": "^3.5.4" }, "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing", - "@aws-sdk/client-dynamodb": "^3.528.0", - "@aws-sdk/client-xray": "^3.525.0", + "@aws-sdk/client-dynamodb": "^3.538.0", + "@aws-sdk/client-xray": "^3.535.0", "@types/promise-retry": "^1.1.6", - "aws-sdk": "^2.1568.0", - "axios": "^1.6.7", + "aws-sdk": "^2.1583.0", + "axios": "^1.6.8", "promise-retry": "^2.0.1" }, "peerDependencies": { diff --git a/package.json b/package.json index ab1a0d6d40..fc7180914e 100644 --- a/package.json +++ b/package.json @@ -51,7 +51,7 @@ "@middy/core": "^4.7.0", "@types/aws-lambda": "^8.10.136", "@types/jest": "^29.5.12", - "@types/node": "^20.11.24", + "@types/node": "^20.11.30", "@typescript-eslint/eslint-plugin": "^6.21.0", "@typescript-eslint/parser": "^6.21.0", "eslint": "^8.57.0", @@ -68,9 +68,9 @@ "prettier": "^3.2.5", "ts-jest": "^29.1.2", "ts-node": "^10.9.2", - "typedoc": "^0.25.11", + "typedoc": "^0.25.12", "typedoc-plugin-missing-exports": "^2.2.0", - "typescript": "^5.3.3" + "typescript": "^5.4.3" }, "engines": { "node": ">=16" diff --git a/packages/batch/CHANGELOG.md b/packages/batch/CHANGELOG.md index 1b05a4eb86..a03063cdb4 100644 --- a/packages/batch/CHANGELOG.md +++ b/packages/batch/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## 2.0.3 (2024-03-15) + +**Note:** Version bump only for package @aws-lambda-powertools/batch + + + + + ## 2.0.2 (2024-03-05) diff --git a/packages/batch/package.json b/packages/batch/package.json index 3495a7cf08..60c446436e 100644 --- a/packages/batch/package.json +++ b/packages/batch/package.json @@ -1,6 +1,6 @@ { "name": "@aws-lambda-powertools/batch", - "version": "2.0.2", + "version": "2.0.3", "description": "The batch processing package for the Powertools for AWS Lambda (TypeScript) library.", "author": { "name": "Amazon Web Services", diff --git a/packages/commons/CHANGELOG.md b/packages/commons/CHANGELOG.md index 0284df207a..29796fd541 100644 --- a/packages/commons/CHANGELOG.md +++ b/packages/commons/CHANGELOG.md @@ -3,6 +3,11 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## 2.0.3 (2024-03-15) + +**improv:**: expand type utils functions ([#2191](https://github.com/aws-powertools/powertools-lambda-typescript/issues/2191)) ([9208393](https://github.com/aws-powertools/powertools-lambda-typescript/commit/9208393fe07d33cb35ea479b3c0866c8a7b91a21)) +**feat:** add fromBase64 helper function ([#2188](https://github.com/aws-powertools/powertools-lambda-typescript/issues/2188)) ([133159b](https://github.com/aws-powertools/powertools-lambda-typescript/commit/133159ba4cca41a61c14d62f9356bb89a7f0a08f)) + ## 2.0.2 (2024-03-05) **Note:** Version bump only for package @aws-lambda-powertools/commons diff --git a/packages/commons/package.json b/packages/commons/package.json index aac76fecea..387fde743c 100644 --- a/packages/commons/package.json +++ b/packages/commons/package.json @@ -1,6 +1,6 @@ { "name": "@aws-lambda-powertools/commons", - "version": "2.0.2", + "version": "2.0.3", "description": "A shared utility package for Powertools for AWS Lambda (TypeScript) libraries", "author": { "name": "Amazon Web Services", @@ -40,6 +40,14 @@ "default": "./lib/esm/index.js" } }, + "./typeutils": { + "import": "./lib/esm/typeUtils.js", + "require": "./lib/cjs/typeUtils.js" + }, + "./utils/base64": { + "import": "./lib/esm/fromBase64.js", + "require": "./lib/cjs/fromBase64.js" + }, "./types": { "import": "./lib/esm/types/index.js", "require": "./lib/cjs/types/index.js" @@ -47,6 +55,14 @@ }, "typesVersions": { "*": { + "typeutils": [ + "lib/cjs/typeUtils.d.ts", + "lib/esm/typeUtils.d.ts" + ], + "utils/base64": [ + "lib/cjs/fromBase64.d.ts", + "lib/esm/fromBase64.d.ts" + ], "types": [ "lib/cjs/types/index.d.ts", "lib/esm/types/index.d.ts" diff --git a/packages/commons/src/fromBase64.ts b/packages/commons/src/fromBase64.ts new file mode 100644 index 0000000000..5fd0236c64 --- /dev/null +++ b/packages/commons/src/fromBase64.ts @@ -0,0 +1,35 @@ +const BASE64_REGEX = /^[A-Za-z0-9+/]*={0,2}$/; + +/** + * Convert a base64 string to a Uint8Array. + * + * The input string must be a valid base64 string, otherwise an error will be thrown. + * + * The encoding parameter is optional and defaults to 'utf-8'. + * + * @example + * ```ts + * import { fromBase64 } from '@aws-lambda-powertools/commons/utils/base64'; + * + * const encodedValue = 'aGVsbG8gd29ybGQ='; + * + * const decoded = fromBase64(encodedValue); + * // new Uint8Array([ 97, 71, 86, 115, 98, 71, 56, 103, 100, 50, 57, 121, 98, 71, 81, 61 ]); + * ``` + * + * @param input The base64 string to convert to a Uint8Array + * @param encoding The encoding of the input string (optional) + */ +const fromBase64 = (input: string, encoding?: BufferEncoding): Uint8Array => { + if ((input.length * 3) % 4 !== 0) { + throw new TypeError(`Incorrect padding on base64 string.`); + } + if (!BASE64_REGEX.exec(input)) { + throw new TypeError(`Invalid base64 string.`); + } + const buffer = encoding ? Buffer.from(input, encoding) : Buffer.from(input); + + return new Uint8Array(buffer.buffer, buffer.byteOffset, buffer.byteLength); +}; + +export { fromBase64 }; diff --git a/packages/commons/src/guards.ts b/packages/commons/src/guards.ts deleted file mode 100644 index 7776280e8b..0000000000 --- a/packages/commons/src/guards.ts +++ /dev/null @@ -1,52 +0,0 @@ -/** - * Returns true if the passed value is a record (object). - * - * @param value - */ -const isRecord = (value: unknown): value is Record => { - return ( - Object.prototype.toString.call(value) === '[object Object]' && - !Object.is(value, null) - ); -}; - -/** - * Returns true if the passed value is truthy. - * - * @param value - */ -const isTruthy = (value: unknown): boolean => { - if (typeof value === 'string') { - return value !== ''; - } else if (typeof value === 'number') { - return value !== 0; - } else if (typeof value === 'boolean') { - return value; - } else if (Array.isArray(value)) { - return value.length > 0; - } else if (isRecord(value)) { - return Object.keys(value).length > 0; - } else { - return false; - } -}; - -/** - * Returns true if the passed value is null or undefined. - * - * @param value - */ -const isNullOrUndefined = (value: unknown): value is null | undefined => { - return Object.is(value, null) || Object.is(value, undefined); -}; - -/** - * Returns true if the passed value is a string. - * @param value - * @returns - */ -const isString = (value: unknown): value is string => { - return typeof value === 'string'; -}; - -export { isRecord, isString, isTruthy, isNullOrUndefined }; diff --git a/packages/commons/src/index.ts b/packages/commons/src/index.ts index cdf0815bad..591ad8ccff 100644 --- a/packages/commons/src/index.ts +++ b/packages/commons/src/index.ts @@ -1,4 +1,14 @@ -export { isRecord, isString, isTruthy, isNullOrUndefined } from './guards.js'; +export { + isRecord, + isString, + isNumber, + isIntegerNumber, + isTruthy, + isNull, + isNullOrUndefined, + getType, + isStrictEqual, +} from './typeUtils.js'; export { Utility } from './Utility.js'; export { EnvironmentVariablesService } from './config/EnvironmentVariablesService.js'; export { addUserAgentMiddleware, isSdkClient } from './awsSdkUtils.js'; diff --git a/packages/commons/src/typeUtils.ts b/packages/commons/src/typeUtils.ts new file mode 100644 index 0000000000..6611aea46c --- /dev/null +++ b/packages/commons/src/typeUtils.ts @@ -0,0 +1,179 @@ +/** + * Returns true if the passed value is a record (object). + * + * @param value The value to check + */ +const isRecord = ( + value: unknown +): value is Record => { + return ( + Object.prototype.toString.call(value) === '[object Object]' && + !Object.is(value, null) + ); +}; + +/** + * Check if a value is a string. + * + * @param value The value to check + */ +const isString = (value: unknown): value is string => { + return typeof value === 'string'; +}; + +/** + * Check if a value is a number. + * + * @param value The value to check + */ +const isNumber = (value: unknown): value is number => { + return typeof value === 'number'; +}; + +/** + * Check if a value is an integer number. + * + * @param value The value to check + */ +const isIntegerNumber = (value: unknown): value is number => { + return isNumber(value) && Number.isInteger(value); +}; + +/** + * Check if a value is truthy. + * + * @param value The value to check + */ +const isTruthy = (value: unknown): boolean => { + if (isString(value)) { + return value !== ''; + } else if (isNumber(value)) { + return value !== 0; + } else if (typeof value === 'boolean') { + return value; + } else if (Array.isArray(value)) { + return value.length > 0; + } else if (isRecord(value)) { + return Object.keys(value).length > 0; + } else { + return false; + } +}; + +/** + * Check if a value is null. + * + * @param value The value to check + */ +const isNull = (value: unknown): value is null => { + return Object.is(value, null); +}; + +/** + * Check if a value is null or undefined. + * + * @param value The value to check + */ +const isNullOrUndefined = (value: unknown): value is null | undefined => { + return isNull(value) || Object.is(value, undefined); +}; + +/** + * Get the type of a value as a string. + * + * @param value The value to check + */ +const getType = (value: unknown): string => { + if (Array.isArray(value)) { + return 'array'; + } else if (isRecord(value)) { + return 'object'; + } else if (isString(value)) { + return 'string'; + } else if (isNumber(value)) { + return 'number'; + } else if (typeof value === 'boolean') { + return 'boolean'; + } else if (isNull(value)) { + return 'null'; + } else { + return 'unknown'; + } +}; + +/** + * Compare two arrays for strict equality. + * + * @param left The left array to compare + * @param right The right array to compare + */ +const areArraysEqual = (left: unknown[], right: unknown[]): boolean => { + if (left.length !== right.length) { + return false; + } + + return left.every((value, i) => isStrictEqual(value, right[i])); +}; + +/** + * Compare two records for strict equality. + * + * @param left The left record to compare + * @param right The right record to compare + */ +const areRecordsEqual = ( + left: Record, + right: Record +): boolean => { + const leftKeys = Object.keys(left); + const rightKeys = Object.keys(right); + + if (leftKeys.length !== rightKeys.length) { + return false; + } + + return leftKeys.every((key) => isStrictEqual(left[key], right[key])); +}; + +/** + * Check if two unknown values are strictly equal. + * + * If the values are arrays, then each element is compared, regardless of + * order. If the values are objects, then each key and value from left + * is compared to the corresponding key and value from right. If the + * values are primitives, then they are compared using strict equality. + * + * @param left Left side of strict equality comparison + * @param right Right side of strict equality comparison + */ +const isStrictEqual = (left: unknown, right: unknown): boolean => { + if (left === right) { + return true; + } + + if (typeof left !== typeof right) { + return false; + } + + if (Array.isArray(left) && Array.isArray(right)) { + return areArraysEqual(left, right); + } + + if (isRecord(left) && isRecord(right)) { + return areRecordsEqual(left, right); + } + + return false; +}; + +export { + isRecord, + isString, + isNumber, + isIntegerNumber, + isTruthy, + isNull, + isNullOrUndefined, + getType, + isStrictEqual, +}; diff --git a/packages/commons/src/version.ts b/packages/commons/src/version.ts index a4e5b97746..fe8051a5ac 100644 --- a/packages/commons/src/version.ts +++ b/packages/commons/src/version.ts @@ -1,2 +1,2 @@ // this file is auto generated, do not modify -export const PT_VERSION = '2.0.2'; +export const PT_VERSION = '2.0.3'; diff --git a/packages/commons/tests/unit/fromBase64.test.ts b/packages/commons/tests/unit/fromBase64.test.ts new file mode 100644 index 0000000000..23ee84ecd3 --- /dev/null +++ b/packages/commons/tests/unit/fromBase64.test.ts @@ -0,0 +1,66 @@ +/** + * Test fromBase64 function + * + * @group unit/commons/fromBase64 + */ +import { fromBase64 } from '../../src/fromBase64.js'; + +describe('Function: fromBase64', () => { + beforeEach(() => { + jest.clearAllMocks(); + jest.resetModules(); + }); + + it('returns the Uint8Array from a base64 string', () => { + // Prepare + const base64 = 'aGVsbG8gd29ybGQ='; + const expected = new Uint8Array([ + 97, 71, 86, 115, 98, 71, 56, 103, 100, 50, 57, 121, 98, 71, 81, 61, + ]); + + // Act + const result = fromBase64(base64); + + // Assess + expect(result).toStrictEqual(expected); + }); + + it('throws a TypeError when the base64 string has incorrect padding', () => { + // Prepare + const base64 = 'aGVsbG8gd29ybGQ'; + + // Act + const result = (): Uint8Array => fromBase64(base64); + + // Assess + expect(result).toThrow(TypeError); + expect(result).toThrow(`Incorrect padding on base64 string.`); + }); + + it('throws a TypeError when the base64 string is invalid', () => { + // Prepare + const base64 = 'a-VsbG8gd29ybGQ='; + + // Act + const result = (): Uint8Array => fromBase64(base64); + + // Assess + expect(result).toThrow(TypeError); + expect(result).toThrow(`Invalid base64 string.`); + }); + + it('uses the provided encoding to create the Uint8Array', () => { + // Prepare + const base64 = 'aGVsbG8gd29ybGQ='; + const encoding = 'utf8'; + const expected = new Uint8Array([ + 97, 71, 86, 115, 98, 71, 56, 103, 100, 50, 57, 121, 98, 71, 81, 61, + ]); + + // Act + const result = fromBase64(base64, encoding); + + // Assess + expect(result).toStrictEqual(expected); + }); +}); diff --git a/packages/commons/tests/unit/guards.test.ts b/packages/commons/tests/unit/guards.test.ts deleted file mode 100644 index 53e248e643..0000000000 --- a/packages/commons/tests/unit/guards.test.ts +++ /dev/null @@ -1,120 +0,0 @@ -/** - * Test guards functions - * - * @group unit/commons/guards - */ -import { - isRecord, - isTruthy, - isNullOrUndefined, - isString, -} from '../../src/index.js'; - -describe('Functions: guards', () => { - beforeEach(() => { - jest.clearAllMocks(); - jest.resetModules(); - }); - - describe('Function: isRecord', () => { - it('returns true when the passed object is a Record', () => { - // Prepare - const obj = { a: 1, b: 2, c: 3 }; - - // Act - const result = isRecord(obj); - - // Assert - expect(result).toBe(true); - }); - - it('returns false when the passed object is not a Record', () => { - // Prepare - const obj = [1, 2, 3]; - - // Act - const result = isRecord(obj); - - // Assert - expect(result).toBe(false); - }); - }); - - describe('Function: isTruthy', () => { - it.each(['hello', 1, true, [1], { foo: 1 }])( - 'returns true when the passed value is truthy', - (testValue) => { - // Prepare - const value = testValue; - - // Act - const result = isTruthy(value); - - // Assert - expect(result).toBe(true); - } - ); - - it.each(['', 0, false, [], {}, Symbol])( - 'returns true when the passed value is falsy', - (testValue) => { - // Prepare - const value = testValue; - - // Act - const result = isTruthy(value); - - // Assert - expect(result).toBe(false); - } - ); - }); - - describe('Function: isNullOrUndefined', () => { - it('returns true when the passed value is null or undefined', () => { - // Prepare - const value = undefined; - - // Act - const result = isNullOrUndefined(value); - - // Assert - expect(result).toBe(true); - }); - - it('returns false when the passed value is not null or undefined', () => { - // Prepare - const value = 'hello'; - - // Act - const result = isNullOrUndefined(value); - - // Assert - expect(result).toBe(false); - }); - }); - - describe('Function: isString', () => { - it('returns true when the passed value is a string', () => { - // Prepare - const value = 'hello'; - - // Act - const result = isString(value); - - // Assert - expect(result).toBe(true); - }); - - it('returns false when the passed value is not a string', () => { - // Prepare - const value = 123; - - // Act - const result = isString(value); - - // Assert - expect(result).toBe(false); - }); - }); -}); diff --git a/packages/commons/tests/unit/typeUtils.test.ts b/packages/commons/tests/unit/typeUtils.test.ts new file mode 100644 index 0000000000..7bb940f343 --- /dev/null +++ b/packages/commons/tests/unit/typeUtils.test.ts @@ -0,0 +1,329 @@ +/** + * Test type utils functions + * + * @group unit/commons/typeUtils + */ +import { + isRecord, + isTruthy, + isNullOrUndefined, + isString, + isNumber, + isIntegerNumber, + isNull, + getType, + isStrictEqual, +} from '../../src/index.js'; + +describe('Functions: typeUtils', () => { + beforeEach(() => { + jest.clearAllMocks(); + jest.resetModules(); + }); + + describe('Function: isRecord', () => { + it('returns true when the passed object is a Record', () => { + // Prepare + const obj = { a: 1, b: 2, c: 3 }; + + // Act + const result = isRecord(obj); + + // Assess + expect(result).toBe(true); + }); + + it('returns false when the passed object is not a Record', () => { + // Prepare + const obj = [1, 2, 3]; + + // Act + const result = isRecord(obj); + + // Assess + expect(result).toBe(false); + }); + }); + + describe('Function: isTruthy', () => { + it.each(['hello', 1, true, [1], { foo: 1 }])( + 'returns true when the passed value is truthy', + (testValue) => { + // Prepare + const value = testValue; + + // Act + const result = isTruthy(value); + + // Assess + expect(result).toBe(true); + } + ); + + it.each(['', 0, false, [], {}, Symbol])( + 'returns false when the passed value is falsy', + (testValue) => { + // Prepare + const value = testValue; + + // Act + const result = isTruthy(value); + + // Assess + expect(result).toBe(false); + } + ); + }); + + describe('Function: isNullOrUndefined', () => { + it('returns true when the passed value is null or undefined', () => { + // Prepare + const value = undefined; + + // Act + const result = isNullOrUndefined(value); + + // Assess + expect(result).toBe(true); + }); + + it('returns false when the passed value is not null or undefined', () => { + // Prepare + const value = 'hello'; + + // Act + const result = isNullOrUndefined(value); + + // Assess + expect(result).toBe(false); + }); + }); + + describe('Function: isString', () => { + it('returns true when the passed value is a string', () => { + // Prepare + const value = 'hello'; + + // Act + const result = isString(value); + + // Assess + expect(result).toBe(true); + }); + + it('returns false when the passed value is not a string', () => { + // Prepare + const value = 123; + + // Act + const result = isString(value); + + // Assess + expect(result).toBe(false); + }); + }); + + describe('Function: isNumber', () => { + it('returns true when the passed value is a number', () => { + // Prepare + const value = 123; + + // Act + const result = isNumber(value); + + // Assess + expect(result).toBe(true); + }); + + it('returns false when the passed value is not a number', () => { + // Prepare + const value = 'hello'; + + // Act + const result = isNumber(value); + + // Assess + expect(result).toBe(false); + }); + }); + + describe('Function: isIntegerNumber', () => { + it('returns true when the passed value is an integer number', () => { + // Prepare + const value = 123; + + // Act + const result = isIntegerNumber(value); + + // Assess + expect(result).toBe(true); + }); + + it('returns false when the passed value is not an integer number', () => { + // Prepare + const value = 123.45; + + // Act + const result = isIntegerNumber(value); + + // Assess + expect(result).toBe(false); + }); + }); + + describe('Function: isNull', () => { + it('returns true when the passed value is null', () => { + // Prepare + const value = null; + + // Act + const result = isNull(value); + + // Assess + expect(result).toBe(true); + }); + + it('returns false when the passed value is not null', () => { + // Prepare + const value = 'hello'; + + // Act + const result = isNull(value); + + // Assess + expect(result).toBe(false); + }); + }); + + describe('Function: getType', () => { + it.each([ + { + value: [], + expected: 'array', + }, + { + value: {}, + expected: 'object', + }, + { + value: 'hello', + expected: 'string', + }, + { + value: 123, + expected: 'number', + }, + { + value: true, + expected: 'boolean', + }, + { + value: null, + expected: 'null', + }, + { + value: undefined, + expected: 'unknown', + }, + ])( + 'returns the correct type when passed type $expected', + ({ value, expected }) => { + // Act + const result = getType(value); + + // Assess + expect(result).toBe(expected); + } + ); + }); + + describe('Function: isStrictEqual', () => { + it('returns true when the passed values are strictly equal', () => { + // Prepare + const value1 = 123; + const value2 = 123; + + // Act + const result = isStrictEqual(value1, value2); + + // Assess + expect(result).toBe(true); + }); + + it('returns true when the passed arrays are strictly equal', () => { + // Prepare + const value1 = [1, 2, 3]; + const value2 = [1, 2, 3]; + + // Act + const result = isStrictEqual(value1, value2); + + // Assess + expect(result).toBe(true); + }); + + it('returns true when the passed objects are strictly equal', () => { + // Prepare + const value1 = { a: 1, b: 2, c: 3 }; + const value2 = { a: 1, b: 2, c: 3 }; + + // Act + const result = isStrictEqual(value1, value2); + + // Assess + expect(result).toBe(true); + }); + + it('returns false when the passed values are not strictly equal', () => { + // Prepare + const value1 = 123; + const value2 = '123'; + + // Act + const result = isStrictEqual(value1, value2); + + // Assess + expect(result).toBe(false); + }); + + it.each([ + { + value1: [1, 2, 3], + value2: [1, 3, 2], + }, + { + value1: [1, 2, 3], + value2: [1, 2], + }, + ])( + 'returns false when the passed arrays are not strictly equal', + ({ value1, value2 }) => { + // Act + const result = isStrictEqual(value1, value2); + + // Assess + expect(result).toBe(false); + } + ); + + it.each([ + { + value1: { a: 1, b: 2, c: 3 }, + value2: { a: 1, b: 3, c: 2 }, + }, + { + value1: { a: 1, b: 2, c: 3 }, + value2: { a: 1, b: 2 }, + }, + ])( + 'returns false when the passed objects are not strictly equal', + ({ value1, value2 }) => { + // Act + const result = isStrictEqual(value1, value2); + + // Assess + expect(result).toBe(false); + } + ); + }); +}); diff --git a/packages/idempotency/CHANGELOG.md b/packages/idempotency/CHANGELOG.md index 3a72cdc5be..58d7184c05 100644 --- a/packages/idempotency/CHANGELOG.md +++ b/packages/idempotency/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. +## 2.0.3 (2024-03-15) + +**fix:** transform private class fields ([#2230](https://github.com/aws-powertools/powertools-lambda-typescript/issues/2230)) ([aa6e6e0](https://github.com/aws-powertools/powertools-lambda-typescript/commit/aa6e6e0c25bbc93151cc5cddc584400575604f05)) + ## 2.0.2 (2024-03-05) **Note:** Version bump only for package @aws-lambda-powertools/idempotency diff --git a/packages/idempotency/package.json b/packages/idempotency/package.json index 48a901d34a..78f37f05d8 100644 --- a/packages/idempotency/package.json +++ b/packages/idempotency/package.json @@ -1,6 +1,6 @@ { "name": "@aws-lambda-powertools/idempotency", - "version": "2.0.2", + "version": "2.0.3", "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", @@ -100,7 +100,7 @@ "url": "https://github.com/aws-powertools/powertools-lambda-typescript/issues" }, "dependencies": { - "@aws-lambda-powertools/commons": "^2.0.2", + "@aws-lambda-powertools/commons": "^2.0.3", "@aws-sdk/util-base64-node": "^3.209.0", "jmespath": "^0.16.0" }, @@ -130,10 +130,10 @@ ], "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing", - "@aws-sdk/client-dynamodb": "^3.528.0", - "@aws-sdk/lib-dynamodb": "^3.528.0", + "@aws-sdk/client-dynamodb": "^3.538.0", + "@aws-sdk/lib-dynamodb": "^3.538.0", "@types/jmespath": "^0.15.0", - "aws-sdk-client-mock": "^3.0.1", - "aws-sdk-client-mock-jest": "^3.0.1" + "aws-sdk-client-mock": "^4.0.0", + "aws-sdk-client-mock-jest": "^4.0.0" } } diff --git a/packages/jmespath/CHANGELOG.md b/packages/jmespath/CHANGELOG.md new file mode 100644 index 0000000000..ee6ef839d8 --- /dev/null +++ b/packages/jmespath/CHANGELOG.md @@ -0,0 +1,8 @@ +# Change Log + +All notable changes to this project will be documented in this file. +See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +## 2.0.3 (2024-03-15) + +**Note:** Version bump only for package @aws-lambda-powertools/jmespath diff --git a/packages/jmespath/package.json b/packages/jmespath/package.json index b63353c6b0..2335e78a6a 100644 --- a/packages/jmespath/package.json +++ b/packages/jmespath/package.json @@ -1,6 +1,6 @@ { "name": "@aws-lambda-powertools/jmespath", - "version": "2.0.2", + "version": "2.0.3", "description": "A type safe and modern jmespath module to parse and extract data from JSON documents using JMESPath", "author": { "name": "Amazon Web Services", @@ -72,7 +72,7 @@ "lib" ], "dependencies": { - "@aws-lambda-powertools/commons": "^2.0.2" + "@aws-lambda-powertools/commons": "^2.0.3" }, "repository": { "type": "git", @@ -90,4 +90,4 @@ "typescript", "nodejs" ] -} \ No newline at end of file +} diff --git a/packages/jmespath/src/Expression.ts b/packages/jmespath/src/Expression.ts new file mode 100644 index 0000000000..94c69ef3c4 --- /dev/null +++ b/packages/jmespath/src/Expression.ts @@ -0,0 +1,28 @@ +import type { TreeInterpreter } from './TreeInterpreter.js'; +import type { JSONObject, Node } from './types.js'; + +/** + * Apply a JMESPath expression to a JSON value. + */ +class Expression { + readonly #expression: Node; + readonly #interpreter: TreeInterpreter; + + public constructor(expression: Node, interpreter: TreeInterpreter) { + this.#expression = expression; + this.#interpreter = interpreter; + } + + /** + * Evaluate the expression against a JSON value. + * + * @param value The JSON value to apply the expression to. + * @param node The node to visit. + * @returns The result of applying the expression to the value. + */ + public visit(value: JSONObject, node?: Node): JSONObject { + return this.#interpreter.visit(node ?? this.#expression, value); + } +} + +export { Expression }; diff --git a/packages/jmespath/src/Functions.ts b/packages/jmespath/src/Functions.ts new file mode 100644 index 0000000000..e16e0a4e8f --- /dev/null +++ b/packages/jmespath/src/Functions.ts @@ -0,0 +1,605 @@ +import type { + JSONArray, + JSONObject, + JSONValue, +} from '@aws-lambda-powertools/commons/types'; +import { + getType, + isNumber, + isRecord, +} from '@aws-lambda-powertools/commons/typeutils'; +import type { Expression } from './Expression.js'; +import { JMESPathTypeError } from './errors.js'; +import type { + FunctionSignatureDecorator, + FunctionSignatureOptions, + JSONObject as JSONObjectType, +} from './types.js'; +import { arityCheck, typeCheck } from './utils.js'; + +/** + * A class that contains the built-in JMESPath functions. + * + * The built-in functions are implemented as methods on the Functions class. + * Each method is decorated with the `@Function.signature()` decorator to enforce the + * arity and types of the arguments passed to the function at runtime. + * + * You can extend the Functions class to add custom functions by creating a new class + * that extends Functions and adding new methods to it. + * + * @example + * ```typescript + * import { search } from '@aws-lambda-powertools/jmespath'; + * import { Functions } from '@aws-lambda-powertools/jmespath/functions'; + * + * class MyFunctions extends Functions { + * ⁣@Functions.signature({ + * argumentsSpecs: [['number'], ['number']], + * variadic: true, + * }) + * public funcMyMethod(args: Array): unknown { + * // ... + * } + * } + * + * const myFunctions = new MyFunctions(); + * + * search('myMethod(@)', {}, { customFunctions: new MyFunctions() }); + * ``` + */ +class Functions { + public methods: Set = new Set(); + /** + * Get the absolute value of the provided number. + * + * @param args The number to get the absolute value of + */ + @Functions.signature({ argumentsSpecs: [['number']] }) + public funcAbs(args: number): number { + return Math.abs(args); + } + + /** + * Calculate the average of the numbers in the provided array. + * + * @param args The numbers to average + */ + @Functions.signature({ + argumentsSpecs: [['array-number']], + }) + public funcAvg(args: Array): number { + return args.reduce((a, b) => a + b, 0) / args.length; + } + + /** + * Get the ceiling of the provided number. + * + * @param args The number to get the ceiling of + */ + @Functions.signature({ argumentsSpecs: [['number']] }) + public funcCeil(args: number): number { + return Math.ceil(args); + } + + /** + * Determine if the given value is contained in the provided array or string. + * + * @param haystack The array or string to check + * @param needle The value to check for + */ + @Functions.signature({ + argumentsSpecs: [['array', 'string'], ['any']], + }) + public funcContains(haystack: string, needle: string): boolean { + return haystack.includes(needle); + } + + /** + * Determines if the provided string ends with the provided suffix. + * + * @param str The string to check + * @param suffix The suffix to check for + */ + @Functions.signature({ + argumentsSpecs: [['string'], ['string']], + }) + public funcEndsWith(str: string, suffix: string): boolean { + return str.endsWith(suffix); + } + + /** + * Get the floor of the provided number. + * + * @param args The number to get the floor of + */ + @Functions.signature({ argumentsSpecs: [['number']] }) + public funcFloor(args: number): number { + return Math.floor(args); + } + + /** + * Join the provided array into a single string. + * + * @param separator The separator to use + * @param items The array of itmes to join + */ + @Functions.signature({ + argumentsSpecs: [['string'], ['array-string']], + }) + public funcJoin(separator: string, items: Array): string { + return items.join(separator); + } + + /** + * Get the keys of the provided object. + * + * @param arg The object to get the keys of + */ + @Functions.signature({ + argumentsSpecs: [['object']], + }) + public funcKeys(arg: JSONObject): string[] { + return Object.keys(arg); + } + + /** + * Get the number of items in the provided item. + * + * @param arg The array to get the length of + */ + @Functions.signature({ + argumentsSpecs: [['array', 'string', 'object']], + }) + public funcLength( + arg: string | Array | Record + ): number { + if (isRecord(arg)) { + return Object.keys(arg).length; + } else { + return arg.length; + } + } + + /** + * Map the provided function over the provided array. + * + * @param expression The expression to map over the array + * @param args The array to map the expression over + */ + @Functions.signature({ + argumentsSpecs: [['any'], ['array']], + }) + public funcMap( + expression: Expression, + args: JSONArray + ): JSONArray | Array { + return args.map((arg: JSONObjectType) => { + return expression.visit(arg) || null; + }); + } + + /** + * Get the maximum value in the provided array. + * + * @param arg The array to get the maximum value of + */ + @Functions.signature({ + argumentsSpecs: [['array-number', 'array-string']], + }) + public funcMax(arg: Array): number | string | null { + if (arg.length === 0) { + return null; + // The signature decorator already enforces that all elements are of the same type + } else if (isNumber(arg[0])) { + return Math.max(...(arg as number[])); + } else { + // local compare function to handle string comparison + return arg.reduce((a, b) => (a > b ? a : b)); + } + } + + /** + * Get the item in the provided array that has the maximum value when the provided expression is evaluated. + * + * @param args The array of items to get the maximum value of + * @param expression The expression to evaluate for each item in the array + */ + @Functions.signature({ + argumentsSpecs: [['array'], ['expression']], + }) + public funcMaxBy( + args: Array, + expression: Expression + ): JSONObject | null { + if (args.length === 0) { + return null; + } + + const visitedArgs = args.map((arg) => ({ + arg, + visited: expression.visit(arg), + })); + + const max = visitedArgs.reduce((max, current) => { + const type = getType(current.visited); + if (type !== 'string' && type !== 'number') { + throw new JMESPathTypeError({ + currentValue: current.visited, + expectedTypes: ['string'], + actualType: type, + }); + } + + if (max.visited === current.visited) { + return max; + } else { + // We can safely cast visited to number | string here because we've already + // checked the type at runtime above and we know that it's either a number or a string + return (max.visited as number | string) > + (current.visited as number | string) + ? max + : current; + } + }, visitedArgs[0]); + + return max.arg; + } + + /** + * Merge the provided objects into a single object. + * + * Note that this is a shallow merge and will not merge nested objects. + * + * @param args The objects to merge + */ + @Functions.signature({ + argumentsSpecs: [['object']], + variadic: true, + }) + public funcMerge(...args: Array): JSONObject { + return args.reduce((a, b) => ({ ...a, ...b }), {}); + } + + /** + * Get the minimum value in the provided array. + * + * @param arg The array to get the minimum value of + */ + @Functions.signature({ + argumentsSpecs: [['array-number', 'array-string']], + }) + public funcMin(arg: Array): number | string | null { + if (arg.length === 0) { + return null; + // The signature decorator already enforces that all elements are of the same type + } else if (isNumber(arg[0])) { + return Math.min(...arg); + } else { + return arg.reduce((a, b) => (a < b ? a : b)); + } + } + + /** + * Get the item in the provided array that has the minimum value when the provided expression is evaluated. + * + * @param args The array of items to get the minimum value of + * @param expression The expression to evaluate for each item in the array + */ + @Functions.signature({ + argumentsSpecs: [['array'], ['expression']], + }) + public funcMinBy( + args: Array, + expression: Expression + ): JSONObject | null { + if (args.length === 0) { + return null; + } + + const visitedArgs = args.map((arg) => ({ + arg, + visited: expression.visit(arg), + })); + + const min = visitedArgs.reduce((min, current) => { + const type = getType(current.visited); + if (type !== 'string' && type !== 'number') { + throw new JMESPathTypeError({ + currentValue: current.visited, + expectedTypes: ['string'], + actualType: type, + }); + } + + if (min.visited === current.visited) { + return min; + } else { + // We can safely cast visited to number | string here because we've already + // checked the type at runtime above and we know that it's either a number or a string + return (min.visited as string | number) < + (current.visited as string | number) + ? min + : current; + } + }, visitedArgs[0]); + + return min.arg; + } + + /** + * Get the first argument that does not evaluate to null. + * If all arguments evaluate to null, then null is returned. + * + * @param args The keys of the items to check + */ + @Functions.signature({ + argumentsSpecs: [[]], + variadic: true, + }) + public funcNotNull(...args: Array): JSONValue | null { + return args.find((arg) => !Object.is(arg, null)) || null; + } + + /** + * Reverses the provided string or array. + * + * @param arg The string or array to reverse + */ + @Functions.signature({ + argumentsSpecs: [['string', 'array']], + }) + public funcReverse(arg: string | Array): string | Array { + return Array.isArray(arg) + ? arg.reverse() + : arg.split('').reverse().join(''); + } + + /** + * Sort the provided array. + * + * @param arg The array to sort + */ + @Functions.signature({ + argumentsSpecs: [['array-number', 'array-string']], + }) + public funcSort(arg: Array | Array): Array { + return arg.sort((a: string | number, b: string | number): number => { + if (typeof a === 'string') { + // We can safely cast a and b to string here because the signature decorator + // already enforces that all elements are of the same type + return a.localeCompare(b as string); + } + + // We can safely cast a and b to number here because the signature decorator + // already enforces that all elements are of the same type, so if they're not strings + // then they must be numbers + return (a as number) - (b as number); + }); + } + + /** + * Sort the provided array by the provided expression. + * + * @param args The array to sort + * @param expression The expression to sort by + */ + @Functions.signature({ + argumentsSpecs: [['array'], ['expression']], + }) + public funcSortBy( + args: Array, + expression: Expression + ): Array { + return args + .map((value, index) => { + const visited = expression.visit(value); + const type = getType(visited); + if (type !== 'string' && type !== 'number') { + throw new JMESPathTypeError({ + currentValue: visited, + expectedTypes: ['string'], + actualType: getType(visited), + }); + } + + return { + value, + index, + visited, + }; + }) + .sort((a, b) => { + if (a.visited === b.visited) { + return a.index - b.index; // Make the sort stable + } else { + // We can safely cast visited to number | string here because we've already + // checked the type at runtime above and we know that it's either a number or a string + return (a.visited as string | number) > (b.visited as string | number) + ? 1 + : -1; + } + }) + .map(({ value }) => value); // Extract the original values + } + + /** + * Determines if the provided string starts with the provided prefix. + * + * @param str The string to check + * @param prefix The prefix to check for + */ + @Functions.signature({ + argumentsSpecs: [['string'], ['string']], + }) + public funcStartsWith(str: string, prefix: string): boolean { + return str.startsWith(prefix); + } + + /** + * Sum the provided numbers. + * + * @param args The numbers to sum + */ + @Functions.signature({ + argumentsSpecs: [['array-number']], + }) + public funcSum(args: Array): number { + return args.reduce((a, b) => a + b, 0); + } + + /** + * Convert the provided value to an array. + * + * If the provided value is an array, then it is returned. + * Otherwise, the value is wrapped in an array and returned. + * + * @param arg The items to convert to an array + */ + @Functions.signature({ + argumentsSpecs: [['any']], + }) + public funcToArray( + arg: JSONArray | Array + ): Array | JSONArray { + return Array.isArray(arg) ? arg : [arg]; + } + + /** + * Convert the provided value to a number. + * + * If the provided value is a number, then it is returned. + * Otherwise, the value is converted to a number and returned. + * + * If the value cannot be converted to a number, then null is returned. + * + * @param arg The value to convert to a number + */ + @Functions.signature({ + argumentsSpecs: [['any']], + }) + public funcToNumber(arg: JSONValue): number | null { + if (typeof arg === 'number') { + return arg; + } else if (typeof arg === 'string') { + const num = Number(arg); + + return Number.isNaN(num) ? null : num; + } else { + return null; + } + } + + /** + * Convert the provided value to a string. + * + * If the provided value is a string, then it is returned. + * Otherwise, the value is converted to a string and returned. + * + * @param arg The value to convert to a string + */ + @Functions.signature({ + argumentsSpecs: [['any']], + }) + public funcToString(arg: JSONValue): string { + return typeof arg === 'string' ? arg : JSON.stringify(arg); + } + + /** + * Get the type of the provided value. + * + * @param arg The value to check the type of + */ + @Functions.signature({ + argumentsSpecs: [['any']], + }) + public funcType(arg: JSONValue): string { + return getType(arg); + } + + /** + * Get the values of the provided object. + * + * @param arg The object to get the values of + */ + @Functions.signature({ + argumentsSpecs: [['object']], + }) + public funcValues(arg: JSONObject): JSONValue[] { + return Object.values(arg); + } + + public introspectMethods(scope?: Functions): Set { + const prototype = Object.getPrototypeOf(this); + const ownName = prototype.constructor.name; + const methods = new Set(); + if (ownName !== 'Functions') { + for (const method of prototype.introspectMethods(scope)) { + methods.add(method); + } + } + + // This block is executed for every class in the inheritance chain + for (const method of Object.getOwnPropertyNames( + Object.getPrototypeOf(this) + )) { + method !== 'constructor' && + method.startsWith('func') && + methods.add(method); + } + + // This block will be executed only if the scope is the outermost class + if (this.methods) { + for (const method of methods) { + this.methods.add(method); + } + } + + return methods; + } + + /** + * Decorator to enforce the signature of a function at runtime. + * + * The signature decorator enforces the arity and types of the arguments + * passed to a function at runtime. If the arguments do not match the + * expected arity or types errors are thrown. + * + * @example + * ```typescript + * import { PowertoolsFunctions } from '@aws-lambda-powertools/jmespath/functions'; + * + * class MyFunctions extends Functions { + * ⁣@Functions.signature({ + * argumentsSpecs: [['number'], ['number']], + * variadic: true, + * }) + * public funcMyMethod(args: Array): unknown { + * // ... + * } + * } + * ``` + * + * @param options The options for the signature decorator + */ + public static signature( + options: FunctionSignatureOptions + ): FunctionSignatureDecorator { + return (_target, _propertyKey, descriptor) => { + const originalMethod = descriptor.value; + + // Use a function() {} instead of an () => {} arrow function so that we can + // access `myClass` as `this` in a decorated `myClass.myMethod()`. + descriptor.value = function (args: unknown[]) { + const { variadic, argumentsSpecs } = options; + arityCheck(args, argumentsSpecs, variadic); + typeCheck(args, argumentsSpecs); + + return originalMethod.apply(this, args); + }; + + return descriptor; + }; + } +} + +export { Functions }; diff --git a/packages/jmespath/src/Lexer.ts b/packages/jmespath/src/Lexer.ts new file mode 100644 index 0000000000..e4cdf1aaa2 --- /dev/null +++ b/packages/jmespath/src/Lexer.ts @@ -0,0 +1,368 @@ +import { + SIMPLE_TOKENS, + START_IDENTIFIER, + VALID_IDENTIFIER, + VALID_NUMBER, + WHITESPACE, +} from './constants.js'; +import { EmptyExpressionError, LexerError } from './errors.js'; +import type { Token } from './types.js'; + +/** + * A lexer for JMESPath expressions. + * + * This lexer tokenizes a JMESPath expression into a sequence of tokens. + */ +class Lexer { + #position!: number; + #expression!: string; + #chars!: string[]; + #current!: string; + #length!: number; + + /** + * Tokenize a JMESPath expression. + * + * This method is a generator that yields tokens for the given expression. + * + * @param expression The JMESPath expression to tokenize. + */ + public *tokenize(expression: string): Generator { + this.#initializeForExpression(expression); + while (this.#current !== '' && this.#current !== undefined) { + if (SIMPLE_TOKENS.has(this.#current)) { + yield { + // We know that SIMPLE_TOKENS has this.#current as a key because + // we checked for that above. + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + type: SIMPLE_TOKENS.get(this.#current)!, + value: this.#current, + start: this.#position, + end: this.#position + 1, + }; + + this.#next(); + } else if (START_IDENTIFIER.has(this.#current)) { + yield this.#consumeIdentifier(); + } else if (WHITESPACE.has(this.#current)) { + this.#next(); + } else if (this.#current === '[') { + yield this.#consumeSquareBracket(); + } else if (this.#current === `'`) { + yield this.#consumeRawStringLiteral(); + } else if (this.#current === '`') { + yield this.#consumeLiteral(); + } else if (VALID_NUMBER.has(this.#current)) { + const start = this.#position; + const buff = this.#consumeNumber(); + yield { + type: 'number', + value: parseInt(buff), + start: start, + end: start + buff.length, + }; + } else if (this.#current === '-') { + yield this.#consumeNegativeNumber(); + } else if (this.#current === '"') { + yield this.#consumeQuotedIdentifier(); + } else if (['<', '>', '!', '=', '|', '&'].includes(this.#current)) { + yield this.#consumeComparatorSigns( + this.#current as '<' | '>' | '!' | '=' | '|' | '&' + ); + } else { + throw new LexerError(this.#position, this.#current); + } + } + yield { type: 'eof', value: '', start: this.#length, end: this.#length }; + } + + /** + * Consume a comparator sign. + * + * This method is called when the lexer encounters a comparator sign. + * + * @param current The current character + */ + #consumeComparatorSigns = ( + current: '<' | '>' | '!' | '=' | '|' | '&' + ): Token => { + switch (current) { + case '<': + return this.#matchOrElse('=', 'lte', 'lt'); + case '>': + return this.#matchOrElse('=', 'gte', 'gt'); + case '!': + return this.#matchOrElse('=', 'ne', 'not'); + case '|': + return this.#matchOrElse('|', 'or', 'pipe'); + case '&': + return this.#matchOrElse('&', 'and', 'expref'); + default: + return this.#consumeEqualSign(); + } + }; + + /** + * Consume an equal sign. + * + * This method is called when the lexer encounters an equal sign. + * It checks if the next character is also an equal sign and returns + * the corresponding token. + */ + #consumeEqualSign(): Token { + if (this.#next() === '=') { + this.#next(); + + return { + type: 'eq', + value: '==', + start: this.#position - 1, + end: this.#position, + }; + } else { + throw new LexerError(this.#position - 1, '='); + } + } + + /** + * Consume an unquoted identifier. + * + * This method is called when the lexer encounters a character that is a valid + * identifier. It advances the lexer until it finds a character that is not a + * valid identifier and returns the corresponding token. + */ + #consumeIdentifier(): Token { + const start = this.#position; + let buff = this.#current; + while (VALID_IDENTIFIER.has(this.#next())) { + buff += this.#current; + } + + return { + type: 'unquoted_identifier', + value: buff, + start, + end: start + buff.length, + }; + } + + /** + * Consume a negative number. + * + * This method is called when the lexer encounters a negative sign. + * It checks if the next character is a number and returns the corresponding token. + */ + #consumeNegativeNumber(): Token { + const start = this.#position; + const buff = this.#consumeNumber(); + if (buff.length > 1) { + return { + type: 'number', + value: parseInt(buff), + start: start, + end: start + buff.length, + }; + } else { + // If the negative sign is not followed by a number, it is an error. + throw new LexerError(start, 'Unknown token after "-"'); + } + } + + /** + * Consume a raw string that is a number. + * + * It takes the current position and advances + * the lexer until it finds a character that + * is not a number. + */ + #consumeNumber(): string { + let buff = this.#current; + while (VALID_NUMBER.has(this.#next())) { + buff += this.#current; + } + + return buff; + } + + /** + * Consume a square bracket. + * + * This method is called when the lexer encounters a square bracket. + * It checks if the next character is a question mark or a closing + * square bracket and returns the corresponding token. + */ + #consumeSquareBracket(): Token { + const start = this.#position; + const nextChar = this.#next(); + if (nextChar == ']') { + this.#next(); + + return { type: 'flatten', value: '[]', start: start, end: start + 2 }; + } else if (nextChar == '?') { + this.#next(); + + return { type: 'filter', value: '[?', start: start, end: start + 2 }; + } else { + return { type: 'lbracket', value: '[', start: start, end: start + 1 }; + } + } + + /** + * Initializes the lexer for the given expression. + * + * We use a separate method for this instead of the constructor + * because we want to be able to reuse the same lexer instance + * and also because we want to be able to expose a public API + * for tokenizing expressions like `new Lexer().tokenize(expression)`. + * + * @param expression The JMESPath expression to tokenize. + */ + #initializeForExpression(expression: string): void { + if (typeof expression !== 'string') { + throw new EmptyExpressionError(); + } + + this.#position = 0; + this.#expression = expression; + this.#chars = Array.from(expression); + this.#current = this.#chars[0]; + this.#length = this.#expression.length; + } + + /** + * Advance the lexer to the next character in the expression. + */ + #next(): string { + if (this.#position === this.#length - 1) { + this.#current = ''; + } else { + this.#position += 1; + this.#current = this.#chars[this.#position]; + } + + return this.#current; + } + + /** + * Consume until the given delimiter is reached allowing + * for escaping of the delimiter with a backslash (`\`). + * + * @param delimiter The delimiter to consume until. + */ + #consumeUntil(delimiter: string): string { + const start = this.#position; + let buff = ''; + this.#next(); + while (this.#current !== delimiter) { + if (this.#current === '\\') { + buff += '\\'; + this.#next(); + } + if (this.#current === '') { + // We've reached the end of the expression (EOF) before + // we found the delimiter. This is an error. + throw new LexerError(start, this.#expression.substring(start)); + } + buff += this.#current; + this.#next(); + } + // Skip the closing delimiter + this.#next(); + + return buff; + } + + /** + * Process a literal. + * + * A literal is a JSON string that is enclosed in backticks. + */ + #consumeLiteral(): Token { + const start = this.#position; + const lexeme = this.#consumeUntil('`').replace('\\`', '`'); + try { + const parsedJson = JSON.parse(lexeme); + + return { + type: 'literal', + value: parsedJson, + start, + end: this.#position - start, + }; + } catch (error) { + throw new LexerError(start, lexeme); + } + } + + /** + * Process a quoted identifier. + * + * A quoted identifier is a string that is enclosed in double quotes. + */ + #consumeQuotedIdentifier(): Token { + const start = this.#position; + const lexeme = '"' + this.#consumeUntil('"') + '"'; + const tokenLen = this.#position - start; + + return { + type: 'quoted_identifier', + value: JSON.parse(lexeme), + start, + end: tokenLen, + }; + } + + /** + * Process a raw string literal. + * + * A raw string literal is a string that is enclosed in single quotes. + */ + #consumeRawStringLiteral(): Token { + const start = this.#position; + const lexeme = this.#consumeUntil(`'`).replace(`\\'`, `'`); + const tokenLen = this.#position - start; + + return { + type: 'literal', + value: lexeme, + start, + end: tokenLen, + }; + } + + /** + * Match the expected character and return the corresponding token type. + * + * @param expected The expected character + * @param matchType The token type to return if the expected character is found + * @param elseType The token type to return if the expected character is not found + */ + #matchOrElse( + expected: string, + matchType: Token['type'], + elseType: Token['type'] + ): Token { + const start = this.#position; + const current = this.#current; + const nextChar = this.#next(); + if (nextChar === expected) { + this.#next(); + + return { + type: matchType, + value: current + nextChar, + start, + end: start + 2, + }; + } + + return { + type: elseType, + value: current, + start, + end: start, + }; + } +} + +export { Lexer }; diff --git a/packages/jmespath/src/PowertoolsFunctions.ts b/packages/jmespath/src/PowertoolsFunctions.ts new file mode 100644 index 0000000000..3cba848f73 --- /dev/null +++ b/packages/jmespath/src/PowertoolsFunctions.ts @@ -0,0 +1,61 @@ +import { gunzipSync } from 'node:zlib'; +import type { JSONValue } from '@aws-lambda-powertools/commons/types'; +import { fromBase64 } from '@aws-lambda-powertools/commons/utils/base64'; +import { Functions } from './Functions.js'; + +const decoder = new TextDecoder('utf-8'); + +/** + * Custom functions for the Powertools for AWS Lambda JMESPath module. + * + * Built-in JMESPath functions include: `powertools_json`, `powertools_base64`, `powertools_base64_gzip` + * + * You can use these functions to decode and/or deserialize JSON objects when using the {@link index.search | search} function. + * + * @example + * ```typescript + * import { search } from '@aws-lambda-powertools/jmespath'; + * import { PowertoolsFunctions } from '@aws-lambda-powertools/jmespath/functions'; + * + * const data = { + * body: "{\"foo\": \"bar\"}" + * }; + * + * const result = search( + * 'powertools_json(body)', + * data, + * { customFunctions: new PowertoolsFunctions() } + * ); + * console.log(result); // { foo: 'bar' } + * ``` + * + * When using the {@link extractDataFromEnvelope} function, the PowertoolsFunctions class is automatically used. + * + */ +class PowertoolsFunctions extends Functions { + @Functions.signature({ + argumentsSpecs: [['string']], + }) + public funcPowertoolsBase64(value: string): string { + return decoder.decode(fromBase64(value, 'base64')); + } + + @Functions.signature({ + argumentsSpecs: [['string']], + }) + public funcPowertoolsBase64Gzip(value: string): string { + const encoded = fromBase64(value, 'base64'); + const uncompressed = gunzipSync(encoded); + + return uncompressed.toString(); + } + + @Functions.signature({ + argumentsSpecs: [['string']], + }) + public funcPowertoolsJson(value: string): JSONValue { + return JSON.parse(value); + } +} + +export { PowertoolsFunctions }; diff --git a/packages/jmespath/src/TreeInterpreter.ts b/packages/jmespath/src/TreeInterpreter.ts new file mode 100644 index 0000000000..29fcfcf0ca --- /dev/null +++ b/packages/jmespath/src/TreeInterpreter.ts @@ -0,0 +1,10 @@ +import type { Node, JSONObject } from './types.js'; + +// This is a placeholder for the real class. The actual implementation will be added in a subsequent PR. +export class TreeInterpreter { + public iAmAPlaceholder = true; + + public visit(_node: Node, _value: JSONObject): JSONObject | null { + return this.iAmAPlaceholder; + } +} diff --git a/packages/jmespath/src/ast.ts b/packages/jmespath/src/ast.ts new file mode 100644 index 0000000000..c0f2eff39f --- /dev/null +++ b/packages/jmespath/src/ast.ts @@ -0,0 +1,299 @@ +import type { JSONValue } from '@aws-lambda-powertools/commons/types'; +import type { Node } from './types.js'; + +/** + * AST node representing a comparator expression. + * + * A comparator expression is a binary expression that compares two values. + * + * @param name The name of the comparator + * @param first The left-hand side of the comparator + * @param second The right-hand side of the comparator + */ +const comparator = (name: string, first: Node, second: Node): Node => ({ + type: 'comparator', + children: [first, second], + value: name, +}); + +/** + * AST node representing the current node. + * + * The current node is a reference to the current value being processed. + * In JMESPath, the current node is represented by the `@` symbol. + */ +const currentNode = (): Node => ({ + type: 'current', + children: [], +}); + +/** + * AST node representing an expression reference. + * + * An expression reference is a reference to another expression. + * In JMESPath, an expression reference is represented by the `&` symbol. + * + * @param expression The expression to reference + */ +const expref = (expression: Node): Node => ({ + type: 'expref', + children: [expression], +}); + +/** + * AST node representing a function expression. + * + * A function expression is a reference to a function and its arguments. + * The JMESPath specification defines a set of built-in functions that can + * be used in expressions like `length(@)`, `map(@, &foo)`, etc. + * + * Custom functions can be added by extending the `Functions` class. + * + * @param name The name of the function + * @param args The arguments to the function + */ +const functionExpression = (name: string, args: Node[]): Node => ({ + type: 'function_expression', + children: args, + value: name, +}); + +/** + * AST node representing a field reference. + * + * A field reference is a reference to a field in an object. + */ +const field = (name: JSONValue): Node => ({ + type: 'field', + children: [], + value: name, +}); + +/** + * AST node representing a filter projection. + * + * A filter projection is a binary expression that filters the left-hand side + * based on the right-hand side. + * + * In JMESPath, a filter projection is represented by the `[]` operator. + * For example, `people[?age > 18]` filters the `people` array based on the + * `age` field. + * + * @param left The left-hand side of the filter projection + * @param right The right-hand side of the filter projection + * @param comparator The comparator to use for the filter + */ +const filterProjection = (left: Node, right: Node, comparator: Node): Node => ({ + type: 'filter_projection', + children: [left, right, comparator], +}); + +/** + * AST node representing a flatten expression. + * + * A flatten expression is a unary expression that flattens an array of arrays + * into a single array. + * + * In JMESPath, a flatten expression is represented by the `[]` operator. + * For example, `people[].name` flattens the `people` array and returns the + * `name` field of each object in the array. + * + * @param node The node to flatten + */ +const flatten = (node: Node): Node => ({ + type: 'flatten', + children: [node], +}); + +/** + * AST node representing an identity expression. + */ +const identity = (): Node => ({ type: 'identity', children: [] }); + +/** + * AST node representing an index reference. + * + * An index reference is a reference to an index in an array. + * For example, `people[0]` references the first element in the `people` array. + * + * @param index The index to reference + */ +const index = (index: JSONValue): Node => ({ + type: 'index', + value: index, + children: [], +}); + +/** + * AST node representing an index expression. + * + * An index expression holds the index and the children of the expression. + * + * @param children The children of the index expression + */ +const indexExpression = (children: Node[]): Node => ({ + type: 'index_expression', + children: children, +}); + +/** + * AST node representing a key-value pair. + * + * @param keyName The name of the key + * @param node The value of the key + */ +const keyValPair = (keyName: JSONValue, node: Node): Node => ({ + type: 'key_val_pair', + children: [node], + value: keyName, +}); + +/** + * AST node representing a literal value. + * + * A literal value is a value that is not a reference to another node. + * + * @param literalValue The value of the literal + */ +const literal = (literalValue: JSONValue): Node => ({ + type: 'literal', + value: literalValue, + children: [], +}); + +/** + * AST node representing a multi-select object. + * + * A multi-select object is a reference to multiple nodes in an object. + * + * @param nodes + */ +const multiSelectObject = (nodes: Node[]): Node => ({ + type: 'multi_select_object', + children: nodes, +}); + +/** + * AST node representing a multi-select list. + * + * @param nodes + */ +const multiSelectList = (nodes: Node[]): Node => ({ + type: 'multi_select_list', + children: nodes, +}); + +/** + * AST node representing an or expression. + * + * @param left The left-hand side of the or expression + * @param right The right-hand side of the or expression + */ +const orExpression = (left: Node, right: Node): Node => ({ + type: 'or_expression', + children: [left, right], +}); + +/** + * AST node representing an and expression. + * + * @param left The left-hand side of the and expression + * @param right The right-hand side of the and expression + */ +const andExpression = (left: Node, right: Node): Node => ({ + type: 'and_expression', + children: [left, right], +}); + +/** + * AST node representing a not expression. + * + * @param left The left-hand side of the not expression + * @param right The right-hand side of the not expression + */ +const notExpression = (expr: Node): Node => ({ + type: 'not_expression', + children: [expr], +}); + +/** + * AST node representing a pipe expression. + * + * @param left The left-hand side of the pipe expression + * @param right The right-hand side of the pipe expression + */ +const pipe = (left: Node, right: Node): Node => ({ + type: 'pipe', + children: [left, right], +}); + +/** + * AST node representing a projection. + * + * @param left The left-hand side of the projection + * @param right The right-hand side of the projection + */ +const projection = (left: Node, right: Node): Node => ({ + type: 'projection', + children: [left, right], +}); + +/** + * AST node representing a subexpression. + * + * @param children The children of the subexpression + */ +const subexpression = (children: Node[]): Node => ({ + type: 'subexpression', + children: children, +}); + +/** + * AST node representing a slice. + * + * A slice is a reference to a range of values in an array. + * + * @param start The start of the slice + * @param end The end of the slice + * @param step The step of the slice + */ +const slice = (start: JSONValue, end: JSONValue, step: JSONValue): Node => ({ + type: 'slice', + children: [start as Node, end as Node, step as Node], +}); + +/** + * AST node representing a value projection. + * + * @param left The left-hand side of the value projection + * @param right The right-hand side of the value projection + */ +const valueProjection = (left: Node, right: Node): Node => ({ + type: 'value_projection', + children: [left, right], +}); + +export { + andExpression, + comparator, + currentNode, + expref, + field, + filterProjection, + flatten, + functionExpression, + identity, + index, + indexExpression, + keyValPair, + literal, + multiSelectObject, + multiSelectList, + notExpression, + orExpression, + pipe, + projection, + slice, + subexpression, + valueProjection, +}; diff --git a/packages/jmespath/src/constants.ts b/packages/jmespath/src/constants.ts new file mode 100644 index 0000000000..642e3eb3f9 --- /dev/null +++ b/packages/jmespath/src/constants.ts @@ -0,0 +1,97 @@ +/** + * The binding powers for the various tokens in the JMESPath grammar. + * + * The binding powers are used to determine the order of operations for + * the parser. The higher the binding power, the more tightly the token + * binds to its arguments. + */ +const BINDING_POWER = { + eof: 0, + unquoted_identifier: 0, + quoted_identifier: 0, + literal: 0, + rbracket: 0, + rparen: 0, + comma: 0, + rbrace: 0, + number: 0, + current: 0, + expref: 0, + colon: 0, + pipe: 1, + or: 2, + and: 3, + eq: 5, + gt: 5, + lt: 5, + gte: 5, + lte: 5, + ne: 5, + flatten: 9, + // Everything above stops a projection. + star: 20, + filter: 21, + dot: 40, + not: 45, + lbrace: 50, + lbracket: 55, + lparen: 60, +} as const; + +/** + * The set of ASCII lowercase letters allowed in JMESPath identifiers. + */ +const ASCII_LOWERCASE = 'abcdefghijklmnopqrstuvwxyz'; +/** + * The set of ASCII uppercase letters allowed in JMESPath identifiers. + */ +const ASCII_UPPERCASE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; +/** + * The set of ASCII letters allowed in JMESPath identifiers. + */ +const ASCII_LETTERS = ASCII_LOWERCASE + ASCII_UPPERCASE; +/** + * The set of ASCII digits allowed in JMESPath identifiers. + */ +const DIGITS = '0123456789'; +/** + * The set of ASCII letters and digits allowed in JMESPath identifiers. + */ +const START_IDENTIFIER = new Set(ASCII_LETTERS + '_'); +/** + * The set of ASCII letters and digits allowed in JMESPath identifiers. + */ +const VALID_IDENTIFIER = new Set(ASCII_LETTERS + DIGITS + '_'); +/** + * The set of ASCII digits allowed in JMESPath identifiers. + */ +const VALID_NUMBER = new Set(DIGITS); +/** + * The set of ASCII whitespace characters allowed in JMESPath identifiers. + */ +const WHITESPACE = new Set(' \t\n\r'); +/** + * The set of simple tokens in the JMESPath grammar. + */ +const SIMPLE_TOKENS: Map = new Map([ + ['.', 'dot'], + ['*', 'star'], + [':', 'colon'], + [']', 'rbracket'], + [',', 'comma'], + [':', 'colon'], + ['@', 'current'], + ['(', 'lparen'], + [')', 'rparen'], + ['{', 'lbrace'], + ['}', 'rbrace'], +]); + +export { + BINDING_POWER, + SIMPLE_TOKENS, + START_IDENTIFIER, + VALID_IDENTIFIER, + VALID_NUMBER, + WHITESPACE, +}; diff --git a/packages/jmespath/src/errors.ts b/packages/jmespath/src/errors.ts new file mode 100644 index 0000000000..c0d7112539 --- /dev/null +++ b/packages/jmespath/src/errors.ts @@ -0,0 +1,309 @@ +import type { Token } from './types.js'; + +/** + * Base class for errors thrown during expression parsing and evaluation. + */ +class JMESPathError extends Error { + /** + * Expression that was being parsed when the error occurred. + * Can be set by whatever catches the error. + */ + public expression?: string; + + public constructor(message: string) { + super(message); + this.name = 'JMESPathError'; + this.message = message; + } + + /** + * Set the expression that was being parsed when the error occurred. + * + * The separate method allows the expression to be set after the error is + * thrown. In some instances the expression is not known until after the + * error is thrown (i.e. the error is thrown down the call stack). + * + * @param expression The expression that was being parsed when the error occurred. + */ + public setExpression(expression: string): void { + this.expression = expression; + + // Set the message to include the expression. + this.message = `${this.message} in expression: ${this.expression}`; + } +} + +/** + * Error thrown when an unknown token is encountered during the AST construction. + */ +class LexerError extends JMESPathError { + /** + * Position in the expression where the error occurred. + */ + public lexerPosition: number; + /** + * Token value where the error occurred. + */ + public lexerValue: string; + + public constructor(lexerPosition: number, lexerValue: string) { + super('Bad jmespath expression'); + this.name = 'LexerError'; + this.lexerPosition = lexerPosition; + this.lexerValue = lexerValue; + + // Set the message to include the lexer position and value. + this.message = `${this.message}: unknown token "${this.lexerValue}" at column ${this.lexerPosition}`; + } +} + +/** + * Error thrown when an invalid or unexpected token type or value is encountered during parsing. + */ +class ParseError extends JMESPathError { + /** + * Position in the expression where the error occurred. + */ + public lexPosition: number; + /** + * Additional information about the error. + */ + public reason?: string; + /** + * Token type where the error occurred. + */ + public tokenType: Token['type']; + /** + * Token value where the error occurred. + */ + public tokenValue: Token['value']; + + public constructor(options: { + lexPosition: number; + tokenValue: Token['value']; + tokenType: Token['type']; + reason?: string; + }) { + super('Invalid jmespath expression'); + this.name = 'ParseError'; + this.lexPosition = options.lexPosition; + this.tokenValue = options.tokenValue; + this.tokenType = options.tokenType; + this.reason = options.reason; + + // Set the message to include the lexer position and token info. + let issue: string; + if (this.reason) { + issue = this.reason; + } else if (this.tokenType === 'eof') { + issue = 'found unexpected end of expression (EOF)'; + } else { + issue = `found unexpected token "${this.tokenValue}" (${this.tokenType})`; + } + this.message = `${this.message}: parse error at column ${this.lexPosition}, ${issue}`; + } +} + +/** + * Error thrown when an incomplete expression is encountered during parsing. + */ +class IncompleteExpressionError extends ParseError { + /** + * Expression that was being parsed when the error occurred. + * + * Can be set by whatever catches the error. + */ + public expression?: string; + + public constructor(options: { + lexPosition: number; + tokenValue: Token['value']; + tokenType: Token['type']; + reason?: string; + }) { + super(options); + this.name = 'IncompleteExpressionError'; + } +} + +/** + * Error thrown when an empty expression is encountered during parsing. + */ +class EmptyExpressionError extends JMESPathError { + public constructor() { + super('Invalid JMESPath expression: cannot be empty.'); + this.name = 'EmptyExpressionError'; + } +} + +/** + * Base class for errors thrown during function execution. + * + * When writing a JMESPath expression, you can use functions to transform the + * data. For example, the `abs()` function returns the absolute value of a number. + * + * If an error occurs during function execution, the error is thrown as a + * subclass of `FunctionError`. The subclass is determined by the type of error + * that occurred. + * + * Errors can be thrown while validating the arguments passed to a function, or + * while executing the function itself. + */ +class FunctionError extends JMESPathError { + /** + * Function that was being executed when the error occurred. + * Can be set by whatever catches the error. + */ + public functionName?: string; + + public constructor(message: string) { + super(message); + this.name = 'FunctionError'; + } + + /** + * Set the function that was being validated or executed when the error occurred. + * + * The separate method allows the name to be set after the error is + * thrown. In most cases the error is thrown down the call stack, but we want + * to show the actual function name used in the expression rather than an internal + * alias. To avoid passing the function name down the call stack, we set it + * after the error is thrown. + * + * @param functionName The function that was being validated or executed when the error occurred. + */ + public setEvaluatedFunctionName(functionName: string): void { + this.message = this.message.replace( + 'for function undefined', + `for function ${functionName}()` + ); + } +} + +/** + * Error thrown when an unexpected argument is passed to a function. + * + * Function arguments are validated before the function is executed. If an + * invalid argument is passed, the error is thrown. For example, the `abs()` + * function expects exactly one argument. If more than one argument is passed, + * an `ArityError` is thrown. + */ +class ArityError extends FunctionError { + public actualArity: number; + public expectedArity: number; + + public constructor(options: { expectedArity: number; actualArity: number }) { + super('Invalid arity for JMESPath function'); + this.name = 'ArityError'; + this.actualArity = options.actualArity; + this.expectedArity = options.expectedArity; + + const arityParticle = + this.actualArity > this.expectedArity ? 'at most' : 'at least'; + + // Set the message to include the error info. + this.message = `Expected ${arityParticle} ${ + this.expectedArity + } ${this.pluralize('argument', this.expectedArity)} for function ${ + this.functionName + }, received ${this.actualArity}`; + } + + protected pluralize(word: string, count: number): string { + return count === 1 ? word : `${word}s`; + } +} + +/** + * Error thrown when an unexpected number of arguments is passed to a variadic function. + * + * Variadic functions are functions that accept a variable number of arguments. + * For example, the `max()` function accepts any number of arguments and returns + * the largest one. If no arguments are passed, it returns `null`. + * + * If the number of arguments passed to a variadic function is not within the + * expected range, this error is thrown. + */ +class VariadicArityError extends ArityError { + public constructor(options: { expectedArity: number; actualArity: number }) { + super(options); + this.name = 'VariadicArityError'; + + // Set the message to include the error info. + this.message = `Expected ${this.expectedArity} ${this.pluralize( + 'argument', + this.expectedArity + )} for function ${this.functionName}, received ${this.actualArity}`; + } +} + +/** + * Error thrown when an invalid argument type is passed to a built-in function. + * + * Function arguments are validated before the function is executed. If an + * invalid argument type is found, this error is thrown. For example, the + * `abs()` function expects a number as its argument. If a string is passed + * instead, this error is thrown. + */ +class JMESPathTypeError extends FunctionError { + public actualType: string; + public currentValue: unknown; + public expectedTypes: string[]; + + public constructor(options: { + currentValue: unknown; + actualType: string; + expectedTypes: string[]; + }) { + super('Invalid type for JMESPath expression'); + this.name = 'JMESPathTypeError'; + this.currentValue = options.currentValue; + this.actualType = options.actualType; + this.expectedTypes = options.expectedTypes; + + // Set the message to include the error info. + this.message = `Invalid argument type for function ${ + this.functionName + }, expected ${this.serializeExpectedTypes()} but found "${ + this.actualType + }"`; + } + + protected serializeExpectedTypes(): string { + const types: string[] = []; + for (const type of this.expectedTypes) { + types.push(`"${type}"`); + } + + return types.length === 1 ? types[0] : `one of ${types.join(', ')}`; + } +} + +/** + * Error thrown when an unknown function is used in an expression. + * + * When evaluating a JMESPath expression, the interpreter looks up the function + * name in a table of built-in functions, as well as any custom functions + * provided by the user. If the function name is not found, this error is thrown. + */ +class UnknownFunctionError extends FunctionError { + public constructor(funcName: string) { + super('Unknown function'); + this.name = 'UnknownFunctionError'; + + // Set the message to include the error info. + this.message = `Unknown function: ${funcName}()`; + } +} + +export { + ArityError, + EmptyExpressionError, + IncompleteExpressionError, + JMESPathError, + JMESPathTypeError, + LexerError, + ParseError, + UnknownFunctionError, + VariadicArityError, +}; diff --git a/packages/jmespath/src/types.ts b/packages/jmespath/src/types.ts new file mode 100644 index 0000000000..07eef2fb33 --- /dev/null +++ b/packages/jmespath/src/types.ts @@ -0,0 +1,110 @@ +import type { + JSONValue, + JSONArray, +} from '@aws-lambda-powertools/commons/types'; +import type { Functions } from './Functions.js'; +import { BINDING_POWER } from './constants.js'; + +/** + * A token in the JMESPath AST. + */ +type Token = { + type: keyof typeof BINDING_POWER; + value: JSONValue; + start: number; + end: number; +}; + +/** + * A node in the JMESPath AST. + */ +type Node = { + type: string; + children: Node[]; + value?: JSONValue; +}; + +/** + * Options for the tree interpreter. + */ +type TreeInterpreterOptions = { + /** + * The custom functions to use. + * + * By default, the interpreter uses the standard JMESPath functions + * available in the [JMESPath specification](https://jmespath.org/specification.html). + */ + customFunctions?: Functions; +}; + +/** + * Options for parsing. + * + * You can use this type to customize the parsing of JMESPath expressions. + * + * For example, you can use this type to provide custom functions to the parser. + * + * @example + * ```typescript + * import { search } from '@aws-lambda-powertools/jmespath'; + * import { PowertoolsFunctions } from '@aws-lambda-powertools/jmespath/functions'; + * + * const expression = 'powertools_json(@)'; + * + * const result = search(expression, "{\n \"a\": 1\n}", { + * customFunctions: new PowertoolsFunctions(), + * }); + * console.log(result); // { a: 1 } + * ``` + */ +type ParsingOptions = TreeInterpreterOptions; + +/** + * Decorator for function signatures. + */ +type FunctionSignatureDecorator = ( + target: Functions | typeof Functions, + propertyKey: string | symbol, + descriptor: PropertyDescriptor +) => void; + +/** + * Options for a function signature. + * + * @example + * ```typescript + * import { PowertoolsFunctions } from '@aws-lambda-powertools/jmespath/functions'; + * + * class MyFunctions extends Functions { + * ⁣@Functions.signature({ + * argumentsSpecs: [['number'], ['number']], + * variadic: true, + * }) + * public funcMyMethod(args: Array): unknown { + * // ... + * } + * } + * ``` + * + * @param argumentsSpecs The expected arguments for the function. + * @param variadic Whether the function is variadic. + */ +type FunctionSignatureOptions = { + argumentsSpecs: Array>; + variadic?: boolean; +}; + +/** + * A JSON parseable object. + */ +type JSONObject = JSONArray | JSONValue | object; + +export type { + FunctionSignatureDecorator, + FunctionSignatureOptions, + Node, + ParsingOptions, + Token, + TreeInterpreterOptions, + JSONObject, +}; diff --git a/packages/jmespath/src/utils.ts b/packages/jmespath/src/utils.ts new file mode 100644 index 0000000000..fe115f3098 --- /dev/null +++ b/packages/jmespath/src/utils.ts @@ -0,0 +1,334 @@ +import { + getType, + isIntegerNumber, + isRecord, + isTruthy as isTruthyJS, + isNumber, +} from '@aws-lambda-powertools/commons/typeutils'; +import { Expression } from './Expression.js'; +import { ArityError, JMESPathTypeError, VariadicArityError } from './errors.js'; + +/** + * Check if a value is truthy. + * + * In JavaScript, zero is falsy while all other non-zero numbers are truthy. + * In JMESPath however, zero is truthy as well as all other non-zero numbers. For + * this reason we wrap the original isTruthy function from the commons package + * and add a check for numbers. + * + * @param value The value to check + */ +const isTruthy = (value: unknown): boolean => { + if (isNumber(value)) { + return true; + } else { + return isTruthyJS(value); + } +}; + +/** + * @internal + * Cap a slice range value to the length of an array, taking into account + * negative values and whether the step is negative. + * + * @param arrayLength The length of the array + * @param value The value to cap + * @param isStepNegative Whether the step is negative + */ +const capSliceRange = ( + arrayLength: number, + value: number, + isStepNegative: boolean +): number => { + if (value < 0) { + value += arrayLength; + if (value < 0) { + value = isStepNegative ? -1 : 0; + } + } else if (value >= arrayLength) { + value = isStepNegative ? arrayLength - 1 : arrayLength; + } + + return value; +}; + +/** + * Given a start, stop, and step value, the sub elements in an array are extracted as follows: + * * The first element in the extracted array is the index denoted by start. + * * The last element in the extracted array is the index denoted by end - 1. + * * The step value determines how many indices to skip after each element is selected from the array. An array of 1 (the default step) will not skip any indices. A step value of 2 will skip every other index while extracting elements from an array. A step value of -1 will extract values in reverse order from the array. + * + * Slice expressions adhere to the following rules: + * * If a negative start position is given, it is calculated as the total length of the array plus the given start position. + * * If no start position is given, it is assumed to be 0 if the given step is greater than 0 or the end of the array if the given step is less than 0. + * * If a negative stop position is given, it is calculated as the total length of the array plus the given stop position. + * * If no stop position is given, it is assumed to be the length of the array if the given step is greater than 0 or 0 if the given step is less than 0. + * * If the given step is omitted, it it assumed to be 1. + * * If the given step is 0, an invalid-value error MUST be raised (thrown before calling the function) + * * If the element being sliced is not an array, the result is null (returned before calling the function) + * * If the element being sliced is an array and yields no results, the result MUST be an empty array. + * + * @param array The array to slice + * @param start The start index + * @param end The end index + * @param step The step value + */ +const sliceArray = ({ + array, + start, + end, + step, +}: { + array: T[]; + start?: number; + end?: number; + step: number; +}): T[] | null => { + const isStepNegative = step < 0; + const length = array.length; + const defaultStart = isStepNegative ? length - 1 : 0; + const defaultEnd = isStepNegative ? -1 : length; + + start = isIntegerNumber(start) + ? capSliceRange(length, start, isStepNegative) + : defaultStart; + + end = isIntegerNumber(end) + ? capSliceRange(length, end, isStepNegative) + : defaultEnd; + + const result: T[] = []; + if (step > 0) { + for (let i = start; i < end; i += step) { + result.push(array[i]); + } + } else { + for (let i = start; i > end; i += step) { + result.push(array[i]); + } + } + + return result; +}; + +/** + * Checks if the number of arguments passed to a function matches the expected arity. + * If the number of arguments does not match the expected arity, an ArityError is thrown. + * + * If the function is variadic, then the number of arguments passed to the function must be + * greater than or equal to the expected arity. If the number of arguments passed to the function + * is less than the expected arity, a `VariadicArityError` is thrown. + * + * @param args The arguments passed to the function + * @param argumentsSpecs The expected types for each argument + * @param decoratedFuncName The name of the function being called + * @param variadic Whether the function is variadic + */ +const arityCheck = ( + args: unknown[], + argumentsSpecs: Array>, + variadic?: boolean +): void => { + if (variadic) { + if (args.length < argumentsSpecs.length) { + throw new VariadicArityError({ + expectedArity: argumentsSpecs.length, + actualArity: args.length, + }); + } + } else if (args.length !== argumentsSpecs.length) { + throw new ArityError({ + expectedArity: argumentsSpecs.length, + actualArity: args.length, + }); + } +}; + +/** + * Type checks the arguments passed to a function against the expected types. + * + * Type checking at runtime involves checking the top level type, + * and in the case of arrays, potentially checking the types of + * the elements in the array. + * + * If the list of types includes 'any', then the type check is a + * no-op. + * + * If the list of types includes more than one type, then the + * argument is checked against each type in the list. If the + * argument matches any of the types, then the type check + * passes. If the argument does not match any of the types, then + * a JMESPathTypeError is thrown. + * + * @param args The arguments passed to the function + * @param argumentsSpecs The expected types for each argument + */ +const typeCheck = ( + args: unknown[], + argumentsSpecs: Array> +): void => { + for (const [index, argumentSpec] of argumentsSpecs.entries()) { + if (argumentSpec[0] === 'any') continue; + typeCheckArgument(args[index], argumentSpec); + } +}; + +/** + * Type checks an argument against a list of types. + * + * If the list of types includes more than one type, then the + * argument is checked against each type in the list. If the + * argument matches any of the types, then the type check + * passes. If the argument does not match any of the types, then + * a JMESPathTypeError is thrown. + * + * @param arg + * @param argumentSpec + */ +const typeCheckArgument = (arg: unknown, argumentSpec: Array): void => { + let valid = false; + argumentSpec.forEach((type, index) => { + if (valid) return; + valid = checkIfArgumentTypeIsValid(arg, type, index, argumentSpec); + }); +}; + +/** + * Check if the argument is of the expected type. + * + * @param arg The argument to check + * @param type The expected type + * @param index The index of the type we are checking + * @param argumentSpec The list of types to check against + */ +const checkIfArgumentTypeIsValid = ( + arg: unknown, + type: string, + index: number, + argumentSpec: string[] +): boolean => { + const hasMoreTypesToCheck = index < argumentSpec.length - 1; + if (type.startsWith('array')) { + if (!Array.isArray(arg)) { + if (hasMoreTypesToCheck) { + return false; + } + throw new JMESPathTypeError({ + currentValue: arg, + expectedTypes: argumentSpec, + actualType: getType(arg), + }); + } + checkComplexArrayType(arg, type, hasMoreTypesToCheck); + + return true; + } + if (type === 'expression') { + checkExpressionType(arg, argumentSpec, hasMoreTypesToCheck); + + return true; + } else if (['string', 'number', 'boolean'].includes(type)) { + typeCheckType(arg, type, argumentSpec, hasMoreTypesToCheck); + if (typeof arg === type) return true; + } else if (type === 'object') { + checkObjectType(arg, argumentSpec, hasMoreTypesToCheck); + + return true; + } + + return false; +}; + +/** + * Check if the argument is of the expected type. + * + * @param arg The argument to check + * @param type The type to check against + * @param argumentSpec The list of types to check against + * @param hasMoreTypesToCheck Whether there are more types to check + */ +const typeCheckType = ( + arg: unknown, + type: string, + argumentSpec: string[], + hasMoreTypesToCheck: boolean +): void => { + if (typeof arg !== type && !hasMoreTypesToCheck) { + throw new JMESPathTypeError({ + currentValue: arg, + expectedTypes: argumentSpec, + actualType: getType(arg), + }); + } +}; + +/** + * Check if the argument is an array of complex types. + * + * @param arg The argument to check + * @param type The type to check against + * @param hasMoreTypesToCheck Whether there are more types to check + */ +const checkComplexArrayType = ( + arg: unknown[], + type: string, + hasMoreTypesToCheck: boolean +): void => { + if (!type.includes('-')) return; + const arrayItemsType = type.slice(6); + let actualType: string | undefined; + for (const element of arg) { + try { + typeCheckArgument(element, [arrayItemsType]); + actualType = arrayItemsType; + } catch (error) { + if (!hasMoreTypesToCheck || actualType !== undefined) { + throw error; + } + } + } +}; + +/** + * Check if the argument is an expression. + * + * @param arg The argument to check + * @param type The type to check against + * @param hasMoreTypesToCheck Whether there are more types to check + */ +const checkExpressionType = ( + arg: unknown, + type: string[], + hasMoreTypesToCheck: boolean +): void => { + if (!(arg instanceof Expression) && !hasMoreTypesToCheck) { + throw new JMESPathTypeError({ + currentValue: arg, + expectedTypes: type, + actualType: getType(arg), + }); + } +}; + +/** + * Check if the argument is an object. + * + * @param arg The argument to check + * @param type The type to check against + * @param hasMoreTypesToCheck Whether there are more types to check + */ +const checkObjectType = ( + arg: unknown, + type: string[], + hasMoreTypesToCheck: boolean +): void => { + if (!isRecord(arg) && !hasMoreTypesToCheck) { + throw new JMESPathTypeError({ + currentValue: arg, + expectedTypes: type, + actualType: getType(arg), + }); + } +}; + +export { isTruthy, arityCheck, sliceArray, typeCheck, typeCheckArgument }; diff --git a/packages/logger/CHANGELOG.md b/packages/logger/CHANGELOG.md index d92ed83dc3..eba49822e9 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. +## 2.0.3 (2024-03-15) + +**feat:** improve regex in stack trace parsing ([#2121](https://github.com/aws-powertools/powertools-lambda-typescript/issues/2121)) ([ebe5eef](https://github.com/aws-powertools/powertools-lambda-typescript/commit/ebe5eef3319fc95070c2c33c0ac64b8e42443b38)) + ## 2.0.2 (2024-03-05) **Note:** Version bump only for package @aws-lambda-powertools/logger diff --git a/packages/logger/package.json b/packages/logger/package.json index 7da74efebb..1f93e87f39 100644 --- a/packages/logger/package.json +++ b/packages/logger/package.json @@ -1,6 +1,6 @@ { "name": "@aws-lambda-powertools/logger", - "version": "2.0.2", + "version": "2.0.3", "description": "The logging package for the Powertools for AWS Lambda (TypeScript) library", "author": { "name": "Amazon Web Services", @@ -88,7 +88,7 @@ "url": "https://github.com/aws-powertools/powertools-lambda-typescript/issues" }, "dependencies": { - "@aws-lambda-powertools/commons": "^2.0.2", + "@aws-lambda-powertools/commons": "^2.0.3", "lodash.merge": "^4.6.2" }, "keywords": [ diff --git a/packages/logger/src/formatter/LogFormatter.ts b/packages/logger/src/formatter/LogFormatter.ts index dd874732c4..f3192ea43c 100644 --- a/packages/logger/src/formatter/LogFormatter.ts +++ b/packages/logger/src/formatter/LogFormatter.ts @@ -95,7 +95,7 @@ abstract class LogFormatter implements LogFormatterInterface { } const stackLines = stack.split('\n'); - const regex = /\((.*):(\d+):(\d+)\)\\?$/; + const regex = /\(([^)]*?):(\d+?):(\d+?)\)\\?$/; let i; for (i = 0; i < stackLines.length; i++) { diff --git a/packages/logger/tests/unit/formatter/PowertoolsLogFormatter.test.ts b/packages/logger/tests/unit/formatter/PowertoolsLogFormatter.test.ts index d3c1f289cb..b4e8753cb7 100644 --- a/packages/logger/tests/unit/formatter/PowertoolsLogFormatter.test.ts +++ b/packages/logger/tests/unit/formatter/PowertoolsLogFormatter.test.ts @@ -312,43 +312,89 @@ describe('Class: PowertoolsLogFormatter', () => { }); describe('Method: getCodeLocation', () => { - test('when the stack IS present, it returns a datetime value ISO 8601 compliant', () => { - // Prepare - const formatter = new PowertoolsLogFormatter(); - const stack = - 'Error: Things keep happening!\n' + - ' at /home/foo/bar/file-that-threw-the-error.ts:22:5\n' + - ' at SomeOther.function (/home/foo/bar/some-file.ts:154:19)'; - - // Act - const errorLocation = formatter.getCodeLocation(stack); - - // Assess - expect(errorLocation).toEqual('/home/foo/bar/some-file.ts:154'); - }); - - test('when the stack IS NOT present, it returns a datetime value ISO 8601 compliant', () => { - // Prepare - const formatter = new PowertoolsLogFormatter(); - const stack = undefined; - - // Act - const errorLocation = formatter.getCodeLocation(stack); - - // Assess - expect(errorLocation).toEqual(''); - }); - - test('when the stack IS NOT present, it returns a datetime value ISO 8601 compliant', () => { - // Prepare - const formatter = new PowertoolsLogFormatter(); - const stack = 'A weird stack trace...'; - - // Act - const errorLocation = formatter.getCodeLocation(stack); - - // Assess - expect(errorLocation).toEqual(''); - }); + test.each([ + { + condition: 'stack IS present', + returnExpection: + 'it returns a location for a stackframe with absolute file path', + stack: + 'Error: Things keep happening!\n' + + ' at /home/foo/bar/file-that-threw-the-error.ts:22:5\n' + + ' at SomeOther.function (/home/foo/bar/some-file.ts:154:19)', + expectedLocation: '/home/foo/bar/some-file.ts:154', + }, + { + condition: 'stack IS present', + returnExpection: + 'it returns a location for a stackframe ending with an optional backslash', + stack: + 'Error: Reference Error!\n' + + ' at /home/foo/bar/file-that-threw-the-error.ts:22:5\n' + + ' at SomeOther.function (/home/foo/bar/some-frame-with-ending-backslash.ts:154:19)\\', + expectedLocation: + '/home/foo/bar/some-frame-with-ending-backslash.ts:154', + }, + { + condition: 'stack IS present', + returnExpection: + 'it returns a location for a path containing multiple colons', + stack: + 'Error: The message failed to send\n' + + 'at REPL2:1:17\n' + + 'at Script.runInThisContext (node:vm:130:12)\n' + + '... 7 lines matching cause stack trace ...\n' + + 'at [_line] [as _line] (node:internal/readline/interface:886:18) {\n' + + '[cause]: Error: The remote HTTP server responded with a 500 status\n' + + ' at REPL1:1:15\n' + + ' at Script.runInThisContext (node:vm:130:12)\n' + + ' at REPLServer.defaultEval (node:repl:574:29)\n' + + ' at bound (node:domain:426:15)\n' + + ' at REPLServer.runBound [as eval] (node:domain:437:12)\n' + + ' at REPLServer.onLine (node:repl:902:10)\n' + + ' at REPLServer.emit (node:events:549:35)\n' + + ' at REPLServer.emit (node:domain:482:12)\n' + + ' at [_onLine] [as _onLine] (node:internal/readline/interface:425:12)\n' + + ' at [_line] [as _line] (node:internal/readline/interface:886:18) \n', + expectedLocation: 'node:vm:130', + }, + { + condition: 'stack IS present', + returnExpection: 'it returns a location for a nested path', + stack: + 'Error: unknown\n' + + 'at eval (eval at (file:///home/foo/bar/some-file.ts:1:35), :1:7)\n' + + 'at (/home/foo/bar/file-that-threw-the-error.ts:52:3)\n' + + 'at ModuleJob.run (node:internal/modules/esm/module_job:218:25)\n' + + 'at async ModuleLoader.import (node:internal/modules/esm/loader:329:24)\n' + + 'at async loadESM (node:internal/process/esm_loader:28:7)\n' + + 'at async handleMainPromise (node:internal/modules/run_main:113:12)\n', + expectedLocation: '/home/foo/bar/file-that-threw-the-error.ts:52', + }, + { + condition: 'stack IS NOT present', + returnExpection: 'it returns an empty location', + stack: undefined, + expectedLocation: '', + }, + { + condition: 'stack IS present', + returnExpection: + 'if a stackframe does not have a location, it returns an empty location', + stack: 'A weird stack trace...', + expectedLocation: '', + }, + ])( + 'when the $condition, $returnExpection', + ({ stack, expectedLocation }) => { + // Prepare + const formatter = new PowertoolsLogFormatter(); + + // Act + const errorLocation = formatter.getCodeLocation(stack); + + // Assess + expect(errorLocation).toEqual(expectedLocation); + } + ); }); }); diff --git a/packages/metrics/CHANGELOG.md b/packages/metrics/CHANGELOG.md index a6302ae611..991dad60d1 100644 --- a/packages/metrics/CHANGELOG.md +++ b/packages/metrics/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## 2.0.3 (2024-03-15) + +**Note:** Version bump only for package @aws-lambda-powertools/metrics + + + + + ## 2.0.2 (2024-03-05) **Note:** Version bump only for package @aws-lambda-powertools/metrics diff --git a/packages/metrics/package.json b/packages/metrics/package.json index 477dd9c2cb..a69b68d167 100644 --- a/packages/metrics/package.json +++ b/packages/metrics/package.json @@ -1,6 +1,6 @@ { "name": "@aws-lambda-powertools/metrics", - "version": "2.0.2", + "version": "2.0.3", "description": "The metrics package for the Powertools for AWS Lambda (TypeScript) library", "author": { "name": "Amazon Web Services", @@ -66,7 +66,7 @@ "main": "./lib/cjs/index.js", "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing", - "@aws-sdk/client-cloudwatch": "^3.525.0", + "@aws-sdk/client-cloudwatch": "^3.535.0", "@types/promise-retry": "^1.1.3", "promise-retry": "^2.0.1" }, @@ -89,7 +89,7 @@ "url": "https://github.com/aws-powertools/powertools-lambda-typescript/issues" }, "dependencies": { - "@aws-lambda-powertools/commons": "^2.0.2" + "@aws-lambda-powertools/commons": "^2.0.3" }, "keywords": [ "aws", diff --git a/packages/parameters/CHANGELOG.md b/packages/parameters/CHANGELOG.md index 3dfe4174c3..c940ffdf2e 100644 --- a/packages/parameters/CHANGELOG.md +++ b/packages/parameters/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## 2.0.3 (2024-03-15) + +**Note:** Version bump only for package @aws-lambda-powertools/parameters + + + + + ## 2.0.2 (2024-03-05) **Note:** Version bump only for package @aws-lambda-powertools/parameters diff --git a/packages/parameters/package.json b/packages/parameters/package.json index b81ed1b268..86b410d340 100644 --- a/packages/parameters/package.json +++ b/packages/parameters/package.json @@ -1,6 +1,6 @@ { "name": "@aws-lambda-powertools/parameters", - "version": "2.0.2", + "version": "2.0.3", "description": "The parameters package for the Powertools for AWS Lambda (TypeScript) library", "author": { "name": "Amazon Web Services", @@ -158,16 +158,16 @@ ], "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing", - "@aws-sdk/client-appconfigdata": "^3.525.0", - "@aws-sdk/client-dynamodb": "^3.528.0", - "@aws-sdk/client-secrets-manager": "^3.525.0", - "@aws-sdk/client-ssm": "^3.525.0", - "@aws-sdk/util-dynamodb": "^3.528.0", - "aws-sdk-client-mock": "^3.0.1", - "aws-sdk-client-mock-jest": "^3.0.1" + "@aws-sdk/client-appconfigdata": "^3.535.0", + "@aws-sdk/client-dynamodb": "^3.538.0", + "@aws-sdk/client-secrets-manager": "^3.535.0", + "@aws-sdk/client-ssm": "^3.535.0", + "@aws-sdk/util-dynamodb": "^3.538.0", + "aws-sdk-client-mock": "^4.0.0", + "aws-sdk-client-mock-jest": "^4.0.0" }, "dependencies": { - "@aws-lambda-powertools/commons": "^2.0.2", + "@aws-lambda-powertools/commons": "^2.0.3", "@aws-sdk/util-base64-node": "^3.209.0" }, "peerDependencies": { diff --git a/packages/testing/CHANGELOG.md b/packages/testing/CHANGELOG.md index 627952f84c..ccd0c45682 100644 --- a/packages/testing/CHANGELOG.md +++ b/packages/testing/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## 2.0.3 (2024-03-15) + +**Note:** Version bump only for package @aws-lambda-powertools/testing-utils + + + + + ## 2.0.2 (2024-03-05) **Note:** Version bump only for package @aws-lambda-powertools/testing-utils diff --git a/packages/testing/package.json b/packages/testing/package.json index 7ea2916ae2..858830029c 100644 --- a/packages/testing/package.json +++ b/packages/testing/package.json @@ -1,6 +1,6 @@ { "name": "@aws-lambda-powertools/testing-utils", - "version": "2.0.2", + "version": "2.0.3", "description": "A package containing utilities to test your serverless workloads", "author": { "name": "Amazon Web Services", @@ -95,9 +95,9 @@ "homepage": "https://github.com/aws-powertools/powertools-lambda-typescript/tree/main/packages/testing#readme", "dependencies": { "@aws-cdk/cli-lib-alpha": "^2.121.1-alpha.0", - "@aws-sdk/client-lambda": "^3.525.0", - "@smithy/util-utf8": "^2.1.0", - "aws-cdk-lib": "^2.131.0", - "esbuild": "^0.20.1" + "@aws-sdk/client-lambda": "^3.536.0", + "@smithy/util-utf8": "^2.3.0", + "aws-cdk-lib": "^2.133.0", + "esbuild": "^0.20.2" } } diff --git a/packages/tracer/CHANGELOG.md b/packages/tracer/CHANGELOG.md index 83eabd111e..d5a75bfebc 100644 --- a/packages/tracer/CHANGELOG.md +++ b/packages/tracer/CHANGELOG.md @@ -3,6 +3,14 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +## 2.0.3 (2024-03-15) + +**Note:** Version bump only for package @aws-lambda-powertools/tracer + + + + + ## 2.0.2 (2024-03-05) diff --git a/packages/tracer/package.json b/packages/tracer/package.json index 4b3c84cd88..98a7bea94c 100644 --- a/packages/tracer/package.json +++ b/packages/tracer/package.json @@ -1,6 +1,6 @@ { "name": "@aws-lambda-powertools/tracer", - "version": "2.0.2", + "version": "2.0.3", "description": "The tracer package for the Powertools for AWS Lambda (TypeScript) library", "author": { "name": "Amazon Web Services", @@ -32,11 +32,11 @@ "license": "MIT-0", "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing", - "@aws-sdk/client-dynamodb": "^3.528.0", - "@aws-sdk/client-xray": "^3.525.0", + "@aws-sdk/client-dynamodb": "^3.538.0", + "@aws-sdk/client-xray": "^3.535.0", "@types/promise-retry": "^1.1.6", - "aws-sdk": "^2.1568.0", - "axios": "^1.6.7", + "aws-sdk": "^2.1583.0", + "axios": "^1.6.8", "promise-retry": "^2.0.1" }, "peerDependencies": { @@ -93,8 +93,8 @@ "url": "https://github.com/aws-powertools/powertools-lambda-typescript/issues" }, "dependencies": { - "@aws-lambda-powertools/commons": "^2.0.2", - "aws-xray-sdk-core": "^3.5.3" + "@aws-lambda-powertools/commons": "^2.0.3", + "aws-xray-sdk-core": "^3.5.4" }, "keywords": [ "aws", diff --git a/tsconfig.esm.json b/tsconfig.esm.json index 4c11bfc0ab..00eabe9c38 100644 --- a/tsconfig.esm.json +++ b/tsconfig.esm.json @@ -2,7 +2,6 @@ "extends": "./tsconfig.json", "compilerOptions": { "module": "NodeNext", - "moduleResolution": "NodeNext", // TODO: experiment with bundler & esnext - "noEmitHelpers": true /* Disable generating custom helper functions like '__extends' in compiled output. */ + "moduleResolution": "NodeNext" } -} +} \ No newline at end of file