diff --git a/.github/workflows/bootstrap_region.yml b/.github/workflows/bootstrap_region.yml index a9d7db8bcd..61cc174eab 100644 --- a/.github/workflows/bootstrap_region.yml +++ b/.github/workflows/bootstrap_region.yml @@ -38,6 +38,7 @@ jobs: name: Bootstrap Region runs-on: ubuntu-latest permissions: + contents: read id-token: write environment: layer-${{ inputs.environment }} steps: @@ -46,14 +47,14 @@ jobs: with: ref: ${{ github.sha }} - name: Setup Node.js - uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4.1.0 + uses: actions/setup-node@1d0ff469b7ec7b3cb9d8673fde0c81c44821de2a # v4.2.0 with: node-version: "22" - name: Setup dependencies uses: aws-powertools/actions/.github/actions/cached-node-modules@29979bc5339bf54f76a11ac36ff67701986bb0f0 - id: credentials name: AWS Credentials - uses: aws-actions/configure-aws-credentials@e3dd6a429d7300a6a4c196c26e071d42e0343502 + uses: aws-actions/configure-aws-credentials@ececac1a45f3b08a01d2dd070d28d111c5fe6722 with: aws-region: ${{ inputs.region }} role-to-assume: ${{ secrets.REGION_IAM_ROLE }} @@ -74,19 +75,20 @@ jobs: runs-on: ubuntu-latest needs: bootstrap permissions: + contents: read id-token: write environment: layer-${{ inputs.environment }} steps: - id: credentials name: AWS Credentials - uses: aws-actions/configure-aws-credentials@e3dd6a429d7300a6a4c196c26e071d42e0343502 + uses: aws-actions/configure-aws-credentials@ececac1a45f3b08a01d2dd070d28d111c5fe6722 with: aws-region: us-east-1 role-to-assume: ${{ secrets.REGION_IAM_ROLE }} mask-aws-account-id: true - id: go-setup name: Setup Go - uses: actions/setup-go@3041bf56c941b39c61721a86cd11f3bb1338122a # v5.2.0 + uses: actions/setup-go@f111f3307d8850f501ac008e886eec1fd1932a34 # v5.3.0 with: go-version: '>=1.23.0' - id: go-env @@ -94,7 +96,7 @@ jobs: run: go env - id: go-install-pkg name: Install - run: go install github.com/aws-powertools/actions/layer-balancer/cmd/balance@@29979bc5339bf54f76a11ac36ff67701986bb0f0 + run: go install github.com/aws-powertools/actions/layer-balancer/cmd/balance@29979bc5339bf54f76a11ac36ff67701986bb0f0 - id: run-balance name: Run Balance run: balance -read-region us-east-1 -write-region ${{ inputs.region }} -write-role ${{ secrets.BALANCE_ROLE_ARN }} -layer-name AWSLambdaPowertoolsTypeScriptV2 -dry-run=false diff --git a/.github/workflows/dispatch_analytics.yml b/.github/workflows/dispatch_analytics.yml index 0bfef0d7af..9d34ec90b2 100644 --- a/.github/workflows/dispatch_analytics.yml +++ b/.github/workflows/dispatch_analytics.yml @@ -42,7 +42,7 @@ jobs: statuses: read steps: - name: Configure AWS credentials - uses: aws-actions/configure-aws-credentials@e3dd6a429d7300a6a4c196c26e071d42e0343502 # v4.0.2 + uses: aws-actions/configure-aws-credentials@ececac1a45f3b08a01d2dd070d28d111c5fe6722 # v4.1.0 with: aws-region: eu-central-1 role-to-assume: ${{ secrets.AWS_ANALYTICS_ROLE_ARN }} diff --git a/.github/workflows/make-release.yml b/.github/workflows/make-release.yml index 16e6a105d6..8cfe629f9e 100644 --- a/.github/workflows/make-release.yml +++ b/.github/workflows/make-release.yml @@ -49,7 +49,7 @@ jobs: with: ref: ${{ github.sha }} - name: Setup NodeJS - uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4.1.0 + uses: actions/setup-node@1d0ff469b7ec7b3cb9d8673fde0c81c44821de2a # v4.2.0 with: node-version: "22" cache: "npm" diff --git a/.github/workflows/make-version.yml b/.github/workflows/make-version.yml index e7220911ba..051b20f0c4 100644 --- a/.github/workflows/make-version.yml +++ b/.github/workflows/make-version.yml @@ -23,7 +23,7 @@ jobs: ref: ${{ github.ref }} fetch-depth: 0 # fetch all history, commits and tags, lerna scans it to the last tag and looks at commits, we need all of it to determine the next version - name: Setup NodeJS - uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4.1.0 + uses: actions/setup-node@1d0ff469b7ec7b3cb9d8673fde0c81c44821de2a # v4.2.0 with: node-version: "22" cache: "npm" diff --git a/.github/workflows/ossf_scorecard.yml b/.github/workflows/ossf_scorecard.yml index f566732130..fe38a0735d 100644 --- a/.github/workflows/ossf_scorecard.yml +++ b/.github/workflows/ossf_scorecard.yml @@ -35,7 +35,7 @@ jobs: # repo_token: ${{ secrets.SCORECARD_TOKEN }} # read-only fine-grained token to read branch protection settings - name: "Upload results" - uses: actions/upload-artifact@6f51ac03b9356f520e9adb1b1b7802705f340c2b # v4.5.0 + uses: actions/upload-artifact@65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08 # v4.6.0 with: name: SARIF file path: results.sarif @@ -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@df409f7d9260372bd5f19e5b04e83cb3c43714ae # v3.27.9 + uses: github/codeql-action/upload-sarif@9e8d0789d4a0fa9ceb6b1738f7e269594bdd67f0 # v3.28.9 with: sarif_file: results.sarif diff --git a/.github/workflows/publish-package.yml b/.github/workflows/publish-package.yml index 3d3de5860c..d71bbab195 100644 --- a/.github/workflows/publish-package.yml +++ b/.github/workflows/publish-package.yml @@ -39,7 +39,7 @@ jobs: with: ref: ${{ github.sha }} - name: Setup NodeJS - uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4.1.0 + uses: actions/setup-node@1d0ff469b7ec7b3cb9d8673fde0c81c44821de2a # v4.2.0 with: node-version: "22" cache: "npm" diff --git a/.github/workflows/publish_layer.yml b/.github/workflows/publish_layer.yml index 1049892949..fd00957e79 100644 --- a/.github/workflows/publish_layer.yml +++ b/.github/workflows/publish_layer.yml @@ -35,7 +35,7 @@ jobs: with: ref: ${{ github.sha }} - name: Setup Node.js - uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4.1.0 + uses: actions/setup-node@1d0ff469b7ec7b3cb9d8673fde0c81c44821de2a # v4.2.0 with: node-version: "22" - name: Setup dependencies @@ -45,7 +45,7 @@ jobs: - name: Zip output run: zip -r cdk.out.zip layers/cdk.out - name: Archive CDK artifacts - uses: actions/upload-artifact@6f51ac03b9356f520e9adb1b1b7802705f340c2b # v4.5.0 + uses: actions/upload-artifact@65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08 # v4.6.0 with: name: cdk-layer-artifact path: cdk.out.zip diff --git a/.github/workflows/quality_check.yml b/.github/workflows/quality_check.yml index 6fcedd30f0..8debce5930 100644 --- a/.github/workflows/quality_check.yml +++ b/.github/workflows/quality_check.yml @@ -37,7 +37,7 @@ jobs: - name: Checkout code uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Setup NodeJS - uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4.1.0 + uses: actions/setup-node@1d0ff469b7ec7b3cb9d8673fde0c81c44821de2a # v4.2.0 with: node-version: ${{ matrix.version }} cache: "npm" @@ -66,7 +66,7 @@ jobs: - name: Checkout code uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Setup NodeJS - uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4.1.0 + uses: actions/setup-node@1d0ff469b7ec7b3cb9d8673fde0c81c44821de2a # v4.2.0 with: node-version: 22 cache: "npm" @@ -84,7 +84,7 @@ jobs: - name: Checkout code uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Setup NodeJS - uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4.1.0 + uses: actions/setup-node@1d0ff469b7ec7b3cb9d8673fde0c81c44821de2a # v4.2.0 with: node-version: 22 cache: "npm" @@ -102,7 +102,7 @@ jobs: - name: Checkout code uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Setup NodeJS - uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4.1.0 + uses: actions/setup-node@1d0ff469b7ec7b3cb9d8673fde0c81c44821de2a # v4.2.0 with: node-version: 22 cache: "npm" @@ -118,7 +118,7 @@ jobs: - name: Checkout code uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Setup NodeJS - uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4.1.0 + uses: actions/setup-node@1d0ff469b7ec7b3cb9d8673fde0c81c44821de2a # v4.2.0 with: node-version: 22 cache: "npm" diff --git a/.github/workflows/record_pr.yml b/.github/workflows/record_pr.yml index a3c066a262..d1df6abd50 100644 --- a/.github/workflows/record_pr.yml +++ b/.github/workflows/record_pr.yml @@ -53,7 +53,7 @@ jobs: script: | const script = require('.github/scripts/save_pr_details.js') await script({github, context, core}) - - uses: actions/upload-artifact@6f51ac03b9356f520e9adb1b1b7802705f340c2b # v4.5.0 + - uses: actions/upload-artifact@65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08 # v4.6.0 with: name: pr path: pr.txt diff --git a/.github/workflows/release-drafter.yml b/.github/workflows/release-drafter.yml index 1c0617d041..8cff1b721d 100644 --- a/.github/workflows/release-drafter.yml +++ b/.github/workflows/release-drafter.yml @@ -27,6 +27,6 @@ jobs: permissions: contents: write # create release in draft mode steps: - - uses: release-drafter/release-drafter@3f0f87098bd6b5c5b9a36d49c41d998ea58f9348 # v5.20.1 + - uses: release-drafter/release-drafter@b1476f6e6eb133afa41ed8589daba6dc69b4d3f5 # v5.20.1 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file 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 91fcc711f4..01e7c8fef8 100644 --- a/.github/workflows/reusable-run-linting-check-and-unit-tests.yml +++ b/.github/workflows/reusable-run-linting-check-and-unit-tests.yml @@ -50,6 +50,7 @@ jobs: "packages/tracer", "packages/parser", "packages/parameters", + "packages/validation", "packages/metrics" ] fail-fast: false @@ -57,7 +58,7 @@ jobs: - name: Checkout code uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Setup NodeJS - uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4.1.0 + uses: actions/setup-node@1d0ff469b7ec7b3cb9d8673fde0c81c44821de2a # v4.2.0 with: node-version: ${{ matrix.version }} cache: "npm" @@ -86,7 +87,7 @@ jobs: - name: Checkout code uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Setup NodeJS - uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4.1.0 + uses: actions/setup-node@1d0ff469b7ec7b3cb9d8673fde0c81c44821de2a # v4.2.0 with: node-version: 22 cache: "npm" @@ -104,7 +105,7 @@ jobs: - name: Checkout code uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Setup NodeJS - uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4.1.0 + uses: actions/setup-node@1d0ff469b7ec7b3cb9d8673fde0c81c44821de2a # v4.2.0 with: node-version: 22 cache: "npm" @@ -122,7 +123,7 @@ jobs: - name: Checkout code uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Setup NodeJS - uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4.1.0 + uses: actions/setup-node@1d0ff469b7ec7b3cb9d8673fde0c81c44821de2a # v4.2.0 with: node-version: 22 cache: "npm" @@ -138,7 +139,7 @@ jobs: - name: Checkout code uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Setup NodeJS - uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4.1.0 + uses: actions/setup-node@1d0ff469b7ec7b3cb9d8673fde0c81c44821de2a # v4.2.0 with: node-version: 22 cache: "npm" diff --git a/.github/workflows/reusable_deploy_layer_stack.yml b/.github/workflows/reusable_deploy_layer_stack.yml index 82281f7483..db0adcb104 100644 --- a/.github/workflows/reusable_deploy_layer_stack.yml +++ b/.github/workflows/reusable_deploy_layer_stack.yml @@ -66,13 +66,13 @@ jobs: - name: checkout uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: aws credentials - uses: aws-actions/configure-aws-credentials@e3dd6a429d7300a6a4c196c26e071d42e0343502 # v4.0.2 + uses: aws-actions/configure-aws-credentials@ececac1a45f3b08a01d2dd070d28d111c5fe6722 # v4.1.0 with: aws-region: ${{ matrix.region }} role-to-assume: ${{ secrets.target-account-role }} mask-aws-account-id: true - name: Setup Node.js - uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4.1.0 + uses: actions/setup-node@1d0ff469b7ec7b3cb9d8673fde0c81c44821de2a # v4.2.0 with: node-version: "22" - name: Setup dependencies @@ -93,7 +93,7 @@ jobs: cat cdk-layer-stack/${{ matrix.region }}-layer-version.txt - name: Save Layer ARN artifact if: ${{ inputs.stage == 'PROD' }} - uses: actions/upload-artifact@6f51ac03b9356f520e9adb1b1b7802705f340c2b # v4.5.0 + uses: actions/upload-artifact@65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08 # v4.6.0 with: name: cdk-layer-stack-${{ matrix.region }} path: ./cdk-layer-stack/* # NOTE: upload-artifact does not inherit working-directory setting. diff --git a/.github/workflows/reusable_publish_docs.yml b/.github/workflows/reusable_publish_docs.yml index 0e21fe86cd..545b74a084 100644 --- a/.github/workflows/reusable_publish_docs.yml +++ b/.github/workflows/reusable_publish_docs.yml @@ -52,7 +52,7 @@ jobs: - name: Checkout code uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Setup NodeJS - uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4.1.0 + uses: actions/setup-node@1d0ff469b7ec7b3cb9d8673fde0c81c44821de2a # v4.2.0 with: node-version: "22" cache: "npm" @@ -87,7 +87,7 @@ jobs: rm -rf api npm run docs-generateApiDoc - name: Configure AWS credentials - uses: aws-actions/configure-aws-credentials@e3dd6a429d7300a6a4c196c26e071d42e0343502 # v4.0.2 + uses: aws-actions/configure-aws-credentials@ececac1a45f3b08a01d2dd070d28d111c5fe6722 # v4.1.0 with: aws-region: us-east-1 role-to-assume: ${{ secrets.AWS_DOCS_ROLE_ARN }} @@ -96,7 +96,7 @@ jobs: run: | cp -r api site/ - name: Create Artifact (Site) - uses: actions/upload-artifact@6f51ac03b9356f520e9adb1b1b7802705f340c2b # v4.5.0 + uses: actions/upload-artifact@65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08 # v4.6.0 with: name: site path: site diff --git a/.github/workflows/run-e2e-tests.yml b/.github/workflows/run-e2e-tests.yml index 41a82ea277..72eb282a3b 100644 --- a/.github/workflows/run-e2e-tests.yml +++ b/.github/workflows/run-e2e-tests.yml @@ -55,7 +55,7 @@ jobs: with: ref: ${{ steps.extract_PR_details.outputs.headSHA }} - name: Setup NodeJS - uses: actions/setup-node@39370e3970a6d050c480ffad4ff0ed4d3fdee5af # v4.1.0 + uses: actions/setup-node@1d0ff469b7ec7b3cb9d8673fde0c81c44821de2a # v4.2.0 with: node-version: '22' - name: Setup dependencies @@ -63,7 +63,7 @@ jobs: with: nodeVersion: '22' - name: Setup AWS credentials - uses: aws-actions/configure-aws-credentials@e3dd6a429d7300a6a4c196c26e071d42e0343502 # v4.0.2 + uses: aws-actions/configure-aws-credentials@ececac1a45f3b08a01d2dd070d28d111c5fe6722 # v4.1.0 with: role-to-assume: ${{ secrets.AWS_ROLE_ARN_TO_ASSUME }} aws-region: eu-west-1 diff --git a/.github/workflows/secure-workflows.yml b/.github/workflows/secure-workflows.yml index 2f27590b57..4a3a5938c3 100644 --- a/.github/workflows/secure-workflows.yml +++ b/.github/workflows/secure-workflows.yml @@ -32,6 +32,6 @@ jobs: - name: Checkout code uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Ensure 3rd party workflows have SHA pinned - uses: zgosalvez/github-actions-ensure-sha-pinned-actions@64418826697dcd77c93a8e4a1f7601a1942e57b5 # v3.0.18 + uses: zgosalvez/github-actions-ensure-sha-pinned-actions@25ed13d0628a1601b4b44048e63cc4328ed03633 # v3.0.22 with: allowlist: slsa-framework/slsa-github-generator \ No newline at end of file diff --git a/.github/workflows/stale-issues.yml b/.github/workflows/stale-issues.yml index 0ac6baa12d..e3402e95fa 100644 --- a/.github/workflows/stale-issues.yml +++ b/.github/workflows/stale-issues.yml @@ -13,7 +13,7 @@ jobs: permissions: issues: write steps: - - uses: actions/stale@28ca1036281a5e5922ead5184a1bbf96e5fc984e # v9.0.0 + - uses: actions/stale@5bef64f19d7facfb25b37b414482c7164d639639 # v9.1.0 with: repo-token: ${{ secrets.GITHUB_TOKEN }} stale-issue-message: "This issue has not received a response in 2 weeks. If you still think there is a problem, please leave a comment to avoid the issue from automatically closing." diff --git a/.github/workflows/update_ssm.yml b/.github/workflows/update_ssm.yml index 3591f43492..9556c3d085 100644 --- a/.github/workflows/update_ssm.yml +++ b/.github/workflows/update_ssm.yml @@ -66,7 +66,7 @@ jobs: run: | echo 'CONVERTED_REGION=${{ matrix.region }}' | tr 'a-z\-' 'A-Z_' >> "$GITHUB_OUTPUT" - id: creds - uses: aws-actions/configure-aws-credentials@e3dd6a429d7300a6a4c196c26e071d42e0343502 + uses: aws-actions/configure-aws-credentials@ececac1a45f3b08a01d2dd070d28d111c5fe6722 with: aws-region: ${{ matrix.region }} role-to-assume: ${{ secrets[format('{0}', steps.transform.outputs.CONVERTED_REGION)] }} @@ -82,4 +82,4 @@ jobs: env: prefix: ${{ inputs.environment == 'beta' && '/aws/service/powertools/beta' || '/aws/service/powertools' }} run: | - aws ssm put-parameter --name ${{ env.prefix }}/generic/all/latest --value "arn:aws:lambda:${{ matrix.region }}:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:${{ inputs.layer_version }}" --type String --overwrite \ No newline at end of file + aws ssm put-parameter --name ${{ env.prefix }}/typescript/generic/all/latest --value "arn:aws:lambda:${{ matrix.region }}:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:${{ inputs.layer_version }}" --type String --overwrite diff --git a/CHANGELOG.md b/CHANGELOG.md index 298343ca93..a4eb2d20cc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,29 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.15.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.14.0...v2.15.0) (2025-02-25) + + +### Bug Fixes + +* **ci:** Add permissions to jobs ([#3586](https://github.com/aws-powertools/powertools-lambda-typescript/issues/3586)) ([90c93ea](https://github.com/aws-powertools/powertools-lambda-typescript/commit/90c93eac603b9a496aac1aee8e010fbc983aabdc)) +* **ci:** fix path for latest SSM param ([#3585](https://github.com/aws-powertools/powertools-lambda-typescript/issues/3585)) ([e34952d](https://github.com/aws-powertools/powertools-lambda-typescript/commit/e34952dacf0b55219f57aaf32a5422bd2595d7a9)) +* **logger:** handle illegal `null`/`undefined` as extra args ([#3614](https://github.com/aws-powertools/powertools-lambda-typescript/issues/3614)) ([6f99073](https://github.com/aws-powertools/powertools-lambda-typescript/commit/6f99073cf61d2e49b01d8f7dcc9b4edf36166ad9)) + + +### Features + +* **idempotency:** add support for custom key prefix ([#3532](https://github.com/aws-powertools/powertools-lambda-typescript/issues/3532)) ([7be7a83](https://github.com/aws-powertools/powertools-lambda-typescript/commit/7be7a83a07e86927221ba34ec1dbae7e73cf6e32)) +* **logger:** add circular buffer ([#3593](https://github.com/aws-powertools/powertools-lambda-typescript/issues/3593)) ([618cdee](https://github.com/aws-powertools/powertools-lambda-typescript/commit/618cdeefd8838bf291b5b9df73d765c30d2457df)) +* **logger:** Add log buffer and flush method ([#3617](https://github.com/aws-powertools/powertools-lambda-typescript/issues/3617)) ([6968ca8](https://github.com/aws-powertools/powertools-lambda-typescript/commit/6968ca87f55ef7574c7904e268ba0604d4b591b7)) +* **logger:** Emit a warning on buffer flush ([#3639](https://github.com/aws-powertools/powertools-lambda-typescript/issues/3639)) ([f471552](https://github.com/aws-powertools/powertools-lambda-typescript/commit/f4715520322e768f4cc743388069f91d424b0ebd)) +* **logger:** refresh sample rate calculation per invocation ([#3644](https://github.com/aws-powertools/powertools-lambda-typescript/issues/3644)) ([1d66a2a](https://github.com/aws-powertools/powertools-lambda-typescript/commit/1d66a2a0d0af36d6c8aa86b0c559f8489fe9ef77)) +* **parser:** provide sub-path exports ([#3598](https://github.com/aws-powertools/powertools-lambda-typescript/issues/3598)) ([09f0aaa](https://github.com/aws-powertools/powertools-lambda-typescript/commit/09f0aaaf92233d326acd9e5fbd21a5c241cdbfe7)) + + + + + # [2.14.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.13.1...v2.14.0) (2025-02-10) diff --git a/docs/Dockerfile b/docs/Dockerfile index 204177439f..a7cb09fc46 100644 --- a/docs/Dockerfile +++ b/docs/Dockerfile @@ -1,5 +1,5 @@ # version 9.5.35 -FROM squidfunk/mkdocs-material@sha256:c62453b1ba229982c6325a71165c1a3007c11bd3dd470e7a1446c5783bd145b4 +FROM squidfunk/mkdocs-material@sha256:f5bcec4e71c138bcb89c0dccb633c830f54a0218e1aefedaade952b61b908d00 COPY requirements.txt /tmp/ RUN pip install --require-hashes -r /tmp/requirements.txt diff --git a/docs/core/logger.md b/docs/core/logger.md index d4fa68f45d..0a0ea34bcc 100644 --- a/docs/core/logger.md +++ b/docs/core/logger.md @@ -588,7 +588,7 @@ If you prefer to log in a specific timezone, you can configure it by setting the ### Using multiple Logger instances across your code -The `createChild` method allows you to create a child instance of the Logger, which inherits all of the attributes from its parent. You have the option to override any of the settings and attributes from the parent logger, including [its settings](#utility-settings), any [extra keys](#appending-additional-keys), and [the log formatter](#custom-log-formatter-bring-your-own-formatter). +The `createChild` method allows you to create a child instance of the Logger, which inherits all of the attributes from its parent. You have the option to override any of the settings and attributes from the parent logger, including [its settings](#utility-settings), any [extra keys](#appending-additional-keys), and [the log formatter](#custom-log-formatter). Once a child logger is created, the logger and its parent will act as separate instances of the Logger class, and as such any change to one won't be applied to the other. @@ -754,9 +754,11 @@ Sampling decision happens at the Logger initialization. This means sampling may } ``` -### Custom Log formatter (Bring Your Own Formatter) +### Custom Log formatter -You can customize the structure (keys and values) of your log items by passing a custom log formatter, an object that implements the `LogFormatter` abstract class. +You can customize the structure (keys and values) of your logs by passing a custom log formatter, a class that implements the `LogFormatter` interface, to the `Logger` constructor. + +When working with custom log formatters, you take full control over the structure of your logs. This allows you to optionally drop or transform keys, add new ones, or change the format to suit your company's logging standards or use Logger with a third-party logging service. === "handler.ts" @@ -764,16 +766,12 @@ You can customize the structure (keys and values) of your log items by passing a --8<-- "examples/snippets/logger/bringYourOwnFormatterHandler.ts" ``` -This is how the `MyCompanyLogFormatter` (dummy name) would look like: - === "utils/formatters/MyCompanyLogFormatter.ts" ```typescript --8<-- "examples/snippets/logger/bringYourOwnFormatterClass.ts" ``` -This is how the printed log would look: - === "Example CloudWatch Logs excerpt" ```json @@ -804,8 +802,7 @@ This is how the printed log would look: } ``` -!!! tip "Custom Log formatter and Child loggers" - It is not necessary to pass the `LogFormatter` each time a [child logger](#using-multiple-logger-instances-across-your-code) is created. The parent's LogFormatter will be inherited by the child logger. +Note that when implementing this method, you should avoid mutating the `attributes` and `additionalLogAttributes` objects directly. Instead, create a new object with the desired structure and return it. If mutation is necessary, you can create a [`structuredClone`](https://developer.mozilla.org/en-US/docs/Web/API/Window/structuredClone) of the object to avoid side effects. ### Bring your own JSON serializer diff --git a/docs/index.md b/docs/index.md index d7a68013ce..f89cb5061a 100644 --- a/docs/index.md +++ b/docs/index.md @@ -69,7 +69,7 @@ You can use Powertools for AWS Lambda (TypeScript) by installing it with your fa For the latter, make sure to replace `{region}` with your AWS region, e.g., `eu-west-1`. - __arn:aws:lambda:{region}:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:19__{: .copyMe}:clipboard: + __arn:aws:lambda:{region}:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:20__{: .copyMe}:clipboard: ???+ note "Code snippets for popular infrastructure as code frameworks" @@ -89,7 +89,7 @@ You can use Powertools for AWS Lambda (TypeScript) by installing it with your fa const powertoolsLayer = LayerVersion.fromLayerVersionArn( this, 'PowertoolsLayer', - `arn:aws:lambda:${Stack.of(this).region}:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:19` + `arn:aws:lambda:${Stack.of(this).region}:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:20` ); new Function(this, 'Function', { @@ -126,7 +126,7 @@ You can use Powertools for AWS Lambda (TypeScript) by installing it with your fa Type: AWS::Serverless::Function Properties: Layers: - - !Sub arn:aws:lambda:${AWS::Region}:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:19 + - !Sub arn:aws:lambda:${AWS::Region}:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:20 ``` You can also use AWS SSM Parameter Store to dynamically add Powertools for AWS Lambda. The `{version}` placeholder is the semantic version number (e,g. 2.1.0) for a release or `_latest_`. @@ -165,7 +165,7 @@ You can use Powertools for AWS Lambda (TypeScript) by installing it with your fa hello: handler: lambda_function.lambda_handler layers: - - arn:aws:lambda:${aws:region}:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:19 + - arn:aws:lambda:${aws:region}:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:20 ``` If you use `esbuild` to bundle your code, make sure to exclude `@aws-lambda-powertools/*` and `@aws-sdk/*` from being bundled since the packages are already present the layer: @@ -200,7 +200,7 @@ You can use Powertools for AWS Lambda (TypeScript) by installing it with your fa role = ... handler = "index.handler" runtime = "nodejs22.x" - layers = ["arn:aws:lambda:{aws::region}:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:19"] + layers = ["arn:aws:lambda:{aws::region}:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:20"] source_code_hash = filebase64sha256("lambda_function_payload.zip") } ``` @@ -235,7 +235,7 @@ You can use Powertools for AWS Lambda (TypeScript) by installing it with your fa const lambdaFunction = new aws.lambda.Function('function', { layers: [ - pulumi.interpolate`arn:aws:lambda:${aws.getRegionOutput().name}:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:19` + pulumi.interpolate`arn:aws:lambda:${aws.getRegionOutput().name}:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:20` ], code: new pulumi.asset.FileArchive('lambda_function_payload.zip'), tracingConfig: { @@ -259,7 +259,7 @@ You can use Powertools for AWS Lambda (TypeScript) by installing it with your fa name: "my-function", layers: { "@aws-lambda-powertools/*": - "arn:aws:lambda:${AWS::Region}:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:19", + "arn:aws:lambda:${AWS::Region}:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:20", }, }); ``` @@ -273,35 +273,35 @@ You can use the Lambda Layer both with CommonJS and ESM (ECMAScript modules) for ??? note "Click to expand and copy any regional Lambda Layer ARN" | Region | Layer ARN | | ---------------- | ------------------------------------------------------------------------------------------------------------- | - | `us-east-1` | [arn:aws:lambda:us-east-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:19](#){: .copyMe}:clipboard: | - | `us-east-2` | [arn:aws:lambda:us-east-2:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:19](#){: .copyMe}:clipboard: | - | `us-west-1` | [arn:aws:lambda:us-west-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:19](#){: .copyMe}:clipboard: | - | `us-west-2` | [arn:aws:lambda:us-west-2:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:19](#){: .copyMe}:clipboard: | - | `ap-south-1` | [arn:aws:lambda:ap-south-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:19](#){: .copyMe}:clipboard: | - | `ap-south-2` | [arn:aws:lambda:ap-south-2:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:19](#){: .copyMe}:clipboard: | - | `ap-east-1` | [arn:aws:lambda:ap-east-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:19](#){: .copyMe}:clipboard: | - | `ap-northeast-1` | [arn:aws:lambda:ap-northeast-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:19](#){: .copyMe}:clipboard: | - | `ap-northeast-2` | [arn:aws:lambda:ap-northeast-2:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:19](#){: .copyMe}:clipboard: | - | `ap-northeast-3` | [arn:aws:lambda:ap-northeast-3:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:19](#){: .copyMe}:clipboard: | - | `ap-southeast-1` | [arn:aws:lambda:ap-southeast-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:19](#){: .copyMe}:clipboard: | - | `ap-southeast-2` | [arn:aws:lambda:ap-southeast-2:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:19](#){: .copyMe}:clipboard: | - | `ap-southeast-3` | [arn:aws:lambda:ap-southeast-3:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:19](#){: .copyMe}:clipboard: | - | `ap-southeast-4` | [arn:aws:lambda:ap-southeast-4:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:19](#){: .copyMe}:clipboard: | - | `eu-central-1` | [arn:aws:lambda:eu-central-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:19](#){: .copyMe}:clipboard: | - | `eu-central-2` | [arn:aws:lambda:eu-central-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:19](#){: .copyMe}:clipboard: | - | `eu-west-1` | [arn:aws:lambda:eu-west-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:19](#){: .copyMe}:clipboard: | - | `eu-west-2` | [arn:aws:lambda:eu-west-2:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:19](#){: .copyMe}:clipboard: | - | `eu-west-3` | [arn:aws:lambda:eu-west-3:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:19](#){: .copyMe}:clipboard: | - | `eu-north-1` | [arn:aws:lambda:eu-north-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:19](#){: .copyMe}:clipboard: | - | `eu-south-1` | [arn:aws:lambda:eu-south-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:19](#){: .copyMe}:clipboard: | - | `eu-south-2` | [arn:aws:lambda:eu-south-2:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:19](#){: .copyMe}:clipboard: | - | `ca-central-1` | [arn:aws:lambda:ca-central-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:19](#){: .copyMe}:clipboard: | - | `ca-west-1` | [arn:aws:lambda:ca-west-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:19](#){: .copyMe}:clipboard: | - | `sa-east-1` | [arn:aws:lambda:sa-east-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:19](#){: .copyMe}:clipboard: | - | `af-south-1` | [arn:aws:lambda:af-south-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:19](#){: .copyMe}:clipboard: | - | `me-south-1` | [arn:aws:lambda:me-south-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:19](#){: .copyMe}:clipboard: | - | `me-central-1` | [arn:aws:lambda:me-central-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:19](#){: .copyMe}:clipboard: | - | `il-central-1` | [arn:aws:lambda:il-central-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:19](#){: .copyMe}:clipboard: | + | `us-east-1` | [arn:aws:lambda:us-east-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:20](#){: .copyMe}:clipboard: | + | `us-east-2` | [arn:aws:lambda:us-east-2:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:20](#){: .copyMe}:clipboard: | + | `us-west-1` | [arn:aws:lambda:us-west-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:20](#){: .copyMe}:clipboard: | + | `us-west-2` | [arn:aws:lambda:us-west-2:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:20](#){: .copyMe}:clipboard: | + | `ap-south-1` | [arn:aws:lambda:ap-south-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:20](#){: .copyMe}:clipboard: | + | `ap-south-2` | [arn:aws:lambda:ap-south-2:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:20](#){: .copyMe}:clipboard: | + | `ap-east-1` | [arn:aws:lambda:ap-east-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:20](#){: .copyMe}:clipboard: | + | `ap-northeast-1` | [arn:aws:lambda:ap-northeast-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:20](#){: .copyMe}:clipboard: | + | `ap-northeast-2` | [arn:aws:lambda:ap-northeast-2:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:20](#){: .copyMe}:clipboard: | + | `ap-northeast-3` | [arn:aws:lambda:ap-northeast-3:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:20](#){: .copyMe}:clipboard: | + | `ap-southeast-1` | [arn:aws:lambda:ap-southeast-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:20](#){: .copyMe}:clipboard: | + | `ap-southeast-2` | [arn:aws:lambda:ap-southeast-2:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:20](#){: .copyMe}:clipboard: | + | `ap-southeast-3` | [arn:aws:lambda:ap-southeast-3:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:20](#){: .copyMe}:clipboard: | + | `ap-southeast-4` | [arn:aws:lambda:ap-southeast-4:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:20](#){: .copyMe}:clipboard: | + | `eu-central-1` | [arn:aws:lambda:eu-central-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:20](#){: .copyMe}:clipboard: | + | `eu-central-2` | [arn:aws:lambda:eu-central-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:20](#){: .copyMe}:clipboard: | + | `eu-west-1` | [arn:aws:lambda:eu-west-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:20](#){: .copyMe}:clipboard: | + | `eu-west-2` | [arn:aws:lambda:eu-west-2:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:20](#){: .copyMe}:clipboard: | + | `eu-west-3` | [arn:aws:lambda:eu-west-3:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:20](#){: .copyMe}:clipboard: | + | `eu-north-1` | [arn:aws:lambda:eu-north-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:20](#){: .copyMe}:clipboard: | + | `eu-south-1` | [arn:aws:lambda:eu-south-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:20](#){: .copyMe}:clipboard: | + | `eu-south-2` | [arn:aws:lambda:eu-south-2:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:20](#){: .copyMe}:clipboard: | + | `ca-central-1` | [arn:aws:lambda:ca-central-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:20](#){: .copyMe}:clipboard: | + | `ca-west-1` | [arn:aws:lambda:ca-west-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:20](#){: .copyMe}:clipboard: | + | `sa-east-1` | [arn:aws:lambda:sa-east-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:20](#){: .copyMe}:clipboard: | + | `af-south-1` | [arn:aws:lambda:af-south-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:20](#){: .copyMe}:clipboard: | + | `me-south-1` | [arn:aws:lambda:me-south-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:20](#){: .copyMe}:clipboard: | + | `me-central-1` | [arn:aws:lambda:me-central-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:20](#){: .copyMe}:clipboard: | + | `il-central-1` | [arn:aws:lambda:il-central-1:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:20](#){: .copyMe}:clipboard: | **Want to inspect the contents of the Layer?** @@ -310,7 +310,7 @@ The pre-signed URL to download this Lambda Layer will be within `Location` key i Change `{aws::region}` to your AWS region, e.g. `eu-west-1`, and run the following command: ```bash title="AWS CLI command to download Lambda Layer content" -aws lambda get-layer-version-by-arn --arn arn:aws:lambda:{aws::region}:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:19 --region {aws::region} +aws lambda get-layer-version-by-arn --arn arn:aws:lambda:{aws::region}:094274105915:layer:AWSLambdaPowertoolsTypeScriptV2:20 --region {aws::region} ``` ## Instrumentation diff --git a/docs/requirements.in b/docs/requirements.in index e255c8968f..9acce4774d 100644 --- a/docs/requirements.in +++ b/docs/requirements.in @@ -1,4 +1,4 @@ mike==1.1.2 -mkdocs-material==9.6.3 +mkdocs-material==9.6.4 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 65de94452d..b1ccc7dddc 100644 --- a/docs/requirements.txt +++ b/docs/requirements.txt @@ -235,9 +235,9 @@ mkdocs-get-deps==0.2.0 \ mkdocs-git-revision-date-plugin==0.3.2 \ --hash=sha256:2e67956cb01823dd2418e2833f3623dee8604cdf223bddd005fe36226a56f6ef # via -r requirements.in -mkdocs-material==9.6.3 \ - --hash=sha256:1125622067e26940806701219303b27c0933e04533560725d97ec26fd16a39cf \ - --hash=sha256:c87f7d1c39ce6326da5e10e232aed51bae46252e646755900f4b0fc9192fa832 +mkdocs-material==9.6.4 \ + --hash=sha256:414e8376551def6d644b8e6f77226022868532a792eb2c9accf52199009f568f \ + --hash=sha256:4d1d35e1c1d3e15294cb7fa5d02e0abaee70d408f75027dc7be6e30fb32e6867 # via -r requirements.in mkdocs-material-extensions==1.3.1 \ --hash=sha256:10c9511cea88f568257f960358a467d12b970e1f7b2c0e5fb2bb48cab1928443 \ diff --git a/docs/roadmap.md b/docs/roadmap.md index 99c9ae9240..9c1499d2de 100644 --- a/docs/roadmap.md +++ b/docs/roadmap.md @@ -9,22 +9,22 @@ description: Public roadmap for Powertools for AWS Lambda (TypeScript) Our public roadmap outlines the high level direction we are working towards. We update this document when our priorities change: security and stability are our top priority. -!!! info "For most up-to-date information, see our [board of activities](https://github.com/orgs/aws-powertools/projects/7/views/3?query=is%3Aopen+sort%3Aupdated-desc){target="_blank"}." +!!! info "For most up-to-date information, see our [board of activities](https://github.com/orgs/aws-powertools/projects/7/views/13?query=is%3Aopen+sort%3Aupdated-desc){target="_blank"}." ### Key areas Security and operational excellence take precedence above all else. This means bug fixing, stability, customer's support, and internal compliance may delay one or more key areas below. -**Missing something or want us to prioritize an existing area?** +!!! info "We may choose to reprioritize or defer items based on customer feedback, security, and operational impacts, and business value." -You can help us prioritize by [upvoting existing feature requests](https://github.com/aws-powertools/powertools-lambda-typescript/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc++label%3Atype%2Ffeature-request+), leaving a comment on what use cases it could unblock for you, and by joining our discussions on Discord. +#### Event Handler REST (p0) -[![Join our Discord](https://dcbadge.vercel.app/api/server/B8zZKbbyET)](https://discord.gg/B8zZKbbyET){target="_blank"} +This is a roadmap item that we carry forward from 2024 and involves the creation of a new utility for customers to work with REST APIs built on AWS Lambda, and Amazon API Gateway REST and HTTP APIs, Application Load Balancer (ALB), Lambda Function URLs, and VPC Lattice. It's one of the most requested features in terms of feature parity from our customers. -#### Event Handler REST +You can follow the progress of this feature in the [Event Handler REST milestone](https://github.com/aws-powertools/powertools-lambda-typescript/milestone/17){target="_blank"}. Below are some of the key macro tasks that we will be working on: -- [ ] [RFC to discuss initial thoughts and feasibility for TS/JS ecosystem](https://github.com/aws-powertools/powertools-lambda-typescript/issues/413) -- [ ] Explore pros & cons of whether to build atop lean frameworks (e.g., Hono) or from scratch +- [x] [Explore pros & cons of whether to build atop lean frameworks (e.g., Hono) or from scratch](https://github.com/aws-powertools/powertools-lambda-typescript/issues/2409){target="_blank"} +- [x] [RFC to discuss initial thoughts and feasibility for TS/JS ecosystem](https://github.com/aws-powertools/powertools-lambda-typescript/discussions/3500){target="_blank"} - [ ] Support for API Gateway REST API resolver - [ ] Support for API Gateway HTTP API resolver - [ ] Support for Lambda Function URL resolver @@ -39,11 +39,58 @@ You can help us prioritize by [upvoting existing feature requests](https://githu - [ ] Support for injecting request details _(consider not doing globals like Python legacy)_ - [ ] Support for Router _(multi-file routes)_ -#### Improve operational excellence +#### Feature parity (p1) + +To close the gap between Powertools for AWS Lambda (Python) and Powertools for AWS Lambda (TypeScript), we will focus our efforts on adding targeted features that are currently missing from the TypeScript version. These include (but are not limited to): + +##### Logger + +- [ ] [Ability to buffer logs](https://github.com/aws-powertools/powertools-lambda-typescript/discussions/3410){target="_blank"} +- [ ] [Ability to add a correlation ID to logs via decorator/middleware](https://github.com/aws-powertools/powertools-lambda-typescript/issues/2863){target="_blank"} +- [ ] [Ability to refresh debug log sampling rate via decorator/middleware](https://github.com/aws-powertools/powertools-lambda-typescript/issues/3278){target="_blank"} +- [ ] [Ability to pretty print stack traces](https://github.com/aws-powertools/powertools-lambda-typescript/issues/1362){target="_blank"} + +##### Event Handler + +In addition to the Event Handler REST feature mentioned above, we will also be working on the following: + +- [ ] Implement resolver for Amazon Bedrock Agents +- [ ] Create RFC for AppSync GraphQL resolver + +##### Validation -We continue to work on increasing operational excellence to remove as much undifferentiated heavy lifting for maintainers, so that we can focus on delivering features that help you. +For the Validation utility, we'll experiment with a community-driven approach to building a new Powertools for AWS Lambda utility. -This means improving our automation workflows, project management, and test coverage. +We will update this roadmap with more details as they become available. + +#### Governance & Advanced Use Cases (p2) + +To streghten our offering for more advanced customers as well as enterprises, we will be working on a set of activities that will help us better support their needs and practices. These include: + +- [ ] [Publish Lambda layers to GovCloud](https://github.com/aws-powertools/powertools-lambda-typescript/issues/3423){target="_blank"} +- [ ] Publish Lambda layers to China regions +- [ ] [Publish SSM Parameters to lookup Lambda layers ARNs](https://github.com/aws-powertools/powertools-lambda-typescript/issues/3439){target="_blank"} +- [ ] Improve OSS supply chain posture (Q2) by making sure we're auditing our dependencies for compatible licenses and include NOTICE files in our Lambda layers +- [ ] Create a new "Advanced Use Cases" section in the docs - to help customers with more complex use cases, such as running Powertools for AWS Lambda in container environments +- [ ] Set up CI/CD for performance testing +- [ ] Improve performance of our core utilities +- [ ] [Improve performance overhead of Lambda layers](https://github.com/aws-powertools/powertools-lambda-typescript/issues/1725){target="_blank"} + +#### Community engagement & new customers (p3) + +To ensure we are attracting tomorrow's customers as well as new contributors to the project, we will be working on a set of activities that will help us better engage with the community and new customers. These include: + +- [ ] [Create a new "Getting Started" guide in the docs](https://github.com/aws-powertools/powertools-lambda-typescript/issues/2948){target="_blank"} +- [ ] Further improve the "Contributing" & "How to find contributions" pages +- [ ] Surface contribution opportunities in Discord & other community channels +- [ ] Improve release notes announcements in Discord & other community channels +- [ ] We will also attempt to create a community-developed new utility (see [Validation](#validation) above) + +### Missing something? + +You can help us prioritize by [upvoting existing feature requests](https://github.com/aws-powertools/powertools-lambda-typescript/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-desc++label%3Atype%2Ffeature-request+), leaving a comment on what use cases it could unblock for you, and by joining our discussions on Discord. + +[![Join our Discord](https://dcbadge.vercel.app/api/server/B8zZKbbyET)](https://discord.gg/B8zZKbbyET){target="_blank"} ### Roadmap status definition @@ -111,43 +158,3 @@ A: Because job zero is security and operational stability, we can't provide spec **Q: How can I provide feedback or ask for more information?** A: For existing features, you can directly comment on issues. For anything else, please open an issue. - -### Launched - -#### JMESPath Functions - -> [Docs](https://docs.powertools.aws.dev/lambda/typescript/latest/utilities/jmespath/) - -Feature parity on JMESPath Powertools Functions feature - -- [x] Support for extracting data -- [x] Support for envelopes (unwrap before data extraction) -- [x] Support for built-in `powertools_json` JMESPath function -- [x] Support for built-in `powertools_base64` JMESPath function -- [x] Support for built-in `powertools_base64_gzip` JMESPath function -- [x] Support for Bring Your Own JMESPath function - -#### Parser (Zod) - -> [Docs](https://docs.powertools.aws.dev/lambda/typescript/latest/utilities/parser/) - -Feature parity on Parser feature - -- [x] Support for defining your own Zod schema -- [x] Support for popular Lambda Event Sources as built-in schemas -- [x] Support for envelope (wrapping before schema validation) -- [x] Support for user-defined envelopes - -#### Version 2 release - -> [Docs](https://docs.powertools.aws.dev/lambda/typescript/latest/upgrade/) - -Over the past year, we have gathered a number of feature requests and improvements that we want to implement but that are not backwards compatible with the current API surface. We are going to release our next major version (v2) by the end of 2023, which will include some of these changes: - -- [x] **ES Modules support ([#521](https://github.com/aws-powertools/powertools-lambda-typescript/issues/521))** - Thanks to the work of the community we have been able to validate the feasibility of dual support for CommonJS and ES Modules. We are currently working on a plan to implement this. -- [x] **TypeScript 5.x support ([#1375](https://github.com/aws-powertools/powertools-lambda-typescript/issues/1375))** - This new version of TypeScript brings breaking changes to the experimental decorators API, which we use in our core utilities. We need to investigate the impact of this change and how to best support it. -- [x] **Support for 3rd party observability providers ([#1500](https://github.com/aws-powertools/powertools-lambda-typescript/issues/1500))** - Many of our customers would like to use Powertools for AWS to send logs, traces, and metrics to providers other than Amazon CloudWatch. - -You can find the full list of changes in the [v2 RFC](https://github.com/aws-powertools/powertools-lambda-typescript/issues/1714) and follow the progress in the [v2 milestone](https://github.com/aws-powertools/powertools-lambda-typescript/milestone/12). - -Just like for the feature parity, if you have any feedback or would like to contribute to the discussion, please leave a comment in the RFC or join the discussion in our [Discord community](https://discord.gg/B8zZKbbyET){target="_blank"}. diff --git a/docs/upgrade.md b/docs/upgrade.md index 91a0115bb1..df57b45f3d 100644 --- a/docs/upgrade.md +++ b/docs/upgrade.md @@ -22,7 +22,7 @@ V2 is focused on official support for ESM (ECMAScript modules). We've made other | **ESM support** | Added ESM support via dual CommonJS and ESM bundling, enabling top-level `await` and tree-shaking. | - | | **Middy.js** | Updated import path for Middy.js middlewares to leverage subpath exports - i.e. `@aws-lambda-powertools/tracer/middleware`. | Yes | | **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** | Changed [log sampling](./core/logger.md#sampling-debug-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 | @@ -305,7 +305,7 @@ In v2, you have more control over **standard** (`attributes`) and [**custom keys export { MyCompanyLogFormatter }; ``` - 1. This new argument contains all [your custom keys](./core/logger.md#appending-persistent-additional-log-keys-and-values). + 1. This new argument contains all [your custom keys](./core/logger.md#appending-additional-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})`** diff --git a/docs/utilities/idempotency.md b/docs/utilities/idempotency.md index 878f06042c..fde149ebbb 100644 --- a/docs/utilities/idempotency.md +++ b/docs/utilities/idempotency.md @@ -695,6 +695,31 @@ This means that we will raise **`IdempotencyKeyError`** if the evaluation of **` --8<-- "examples/snippets/idempotency/samples/workingWIthIdempotencyRequiredKeyError.json" ``` +### Customizing the idempotency key prefix + +!!! warning + Changing the idempotency key generation will invalidate existing idempotency records + +You can use the `keyPrefix` parameter in any of the idempotency configurations to define a custom prefix for your idempotency key. This allows you to decouple the idempotency key from the function name, which is especially useful during application refactorings. + +=== "Using a custom prefix with function wrapper" + + ```typescript hl_lines="25" + --8<-- "examples/snippets/idempotency/customKeyPrefixFnWrapper.ts" + ``` + +=== "Using a custom prefix with decorator" + + ```typescript hl_lines="13" + --8<-- "examples/snippets/idempotency/customKeyPrefixDecorator.ts" + ``` + +=== "Using a custom prefix with Middy.js middleware" + + ```typescript hl_lines="14" + --8<-- "examples/snippets/idempotency/customKeyPrefixMiddleware.ts" + ``` + ### Batch integration You can easily integrate with [Batch](batch.md) utility by using idempotency wrapper around your processing function. diff --git a/docs/utilities/validation.md b/docs/utilities/validation.md new file mode 100644 index 0000000000..bfbaa2aac3 --- /dev/null +++ b/docs/utilities/validation.md @@ -0,0 +1,717 @@ +--- +title: Validation (JSON Schema) +descrition: Utility +--- + + + +This utility provides [JSON Schema](https://json-schema.org) validation for events and responses, including JMESPath support to unwrap events before validation. + +!!! warning + This feature is currently under development. As such it's considered not stable and we might make significant breaking changes before going before its release. You are welcome to [provide feedback](https://github.com/aws-powertools/powertools-lambda-typescript/discussions/3519) and [contribute to its implementation](https://github.com/aws-powertools/powertools-lambda-typescript/milestone/18). + +## Key features + +- Validate incoming event and response payloads +- JMESPath support to unwrap events before validation +- Built-in envelope to unwrap popular AWS service events +- TypeScript support with type-safe validation + +## Getting started + +```bash +npm install @aws-lambda-powertools/validation ajv +``` + +You can validate inbound and outbound payloads using the validator class method decorator or Middy.js middleware. + +You can also use the standalone `validate` function, if you want more control over the validation process such as handling a validation error. + +!!! tip "Using JSON Schemas for the first time?" + Check this step-by-step guide on [how to create JSON Schemas](https://json-schema.org/learn/getting-started-step-by-step.html). By default, we support JSON Schema draft-07. + +### Validator decorator + +The `@validator` decorator is a class method decorator that you can use to validate both the incoming event and the response payload. + +If the validation fails, we will throw a `SchemaValidationError`. + +??? note "A note on class method decorators" + The class method decorators in this project follow the experimental implementation enabled via the [`experimentalDecorators` compiler option](https://www.typescriptlang.org/tsconfig#experimentalDecorators) in TypeScript. We will add support for the newer Stage 3 decorators proposal in the next major release. + + All our decorators assume that the method they are decorating is an async method. This means that even when decorating a synchronous method, it will return a promise. If this is not the desired behavior, you can use one of the other patterns to validate your payloads. + +=== "getting_started_decorator.ts" + + ```typescript + import { validator } from '@aws-lambda-powertools/validation'; + import type { Context } from 'aws-lambda'; + import { + inboundSchema, + outboundSchema, + type InboundSchema, + type OutboundSchema + } from './getting_started_schemas.js'; + + class Lambda { + @validator({ + inboundSchema, + outboundSchema, + }) + async handler(event: InboundSchema, context: Context): Promise { + return { + statusCode: 200, + body: `Hello from ${event.userId}`, + } + } + } + + export const handler = new Lambda().handler + ``` + +=== "getting_started_schemas.ts" + + ```typescript + const inboundSchema = { + type: 'object', + properties: { + userId: { + type: 'string' + } + }, + required: ['userId'] + } as const; + + type InboundSchema = { + userId: string; + }; + + const outboundSchema = { + type: 'object', + properties: { + body: { + type: 'string' + }, + statusCode: { + type: 'number' + } + }, + required: ['body', 'statusCode'] + } as const; + + type OutboundSchema = { + body: string; + statusCode: number; + }; + + export { + inboundSchema, + outboundSchema, + type InboundSchema, + type OutboundSchema + }; + ``` + +It's not mandatory to validate both the inbound and outbound payloads. You can either use one, the other, or both. + +### Validator middleware + +If you are using Middy.js, you can use the `validator` middleware to validate the incoming event and response payload. + +??? note "A note on Middy.js" + We officially support versions of Middy.js `v4.x` through `v6.x` + + Check their docs to learn more about [Middy.js and its middleware stack](https://middy.js.org/docs/intro/getting-started){target="_blank"} as well as [best practices when working with Powertools for AWS](https://middy.js.org/docs/integrations/lambda-powertools#best-practices){target="_blank"}. + +Like the class method decorator, if the validation fails, we will throw a `SchemaValidationError`, and you don't need to use both the inbound and outbound schemas if you don't need to. + +=== "getting_started_middy.ts" + + ```typescript + import { validator } from '@aws-lambda-powertools/validation/middleware'; + import middy from '@middy/core'; + import { + inboundSchema, + outboundSchema, + type InboundSchema, + type OutboundSchema + } from './getting_started_schemas.js'; + + export const handler = middy() + .use(validator({ + inboundSchema, + outboundSchema, + })) + .handler( + async (event: InboundSchema, context: Context): Promise => { + return { + statusCode: 200, + body: `Hello from ${event.userId}`, + } + }); + ``` + +=== "getting_started_schemas.ts" + + ```typescript + const inboundSchema = { + type: 'object', + properties: { + userId: { + type: 'string' + } + }, + required: ['userId'] + } as const; + + type InboundSchema = { + userId: string; + }; + + const outboundSchema = { + type: 'object', + properties: { + body: { + type: 'string' + }, + statusCode: { + type: 'number' + } + }, + required: ['body', 'statusCode'] + } as const; + + type OutboundSchema = { + body: string; + statusCode: number; + }; + + export { + inboundSchema, + outboundSchema, + type InboundSchema, + type OutboundSchema + }; + ``` + +### Standalone validation + +The `validate` function gives you more control over the validation process, and is typically used within the Lambda handler, or any other function that performs validation. + +You can also gracefully handle schema validation errors by catching `SchemaValidationError` errors. + +=== "getting_started_standalone.ts" + + ```typescript + import { validate, SchemaValidationError } from '@aws-lambda-powertools/validation'; + import { Logger } from '@aws-lambda-powertools/logger'; + import { + inboundSchema, + type InboundSchema, + } from './getting_started_schemas.js'; + + const logger = new Logger(); + + export const handler = async (event: InboundSchema, context: Context) => { + try { + await validate({ + payload: event, + schema: inboundSchema, + }) + + return { // since we are not validating the output, we can return anything + message: 'ok' + } + } catch (error) { + if (error instanceof SchemaValidationError) { + logger.error('Schema validation failed', error) + throw new Error('Invalid event payload') + } + + throw error + } + } + ``` + +=== "getting_started_schemas.ts" + + ```typescript + const inboundSchema = { + type: 'object', + properties: { + userId: { + type: 'string' + } + }, + required: ['userId'] + } as const; + + type InboundSchema = { + userId: string; + }; + + const outboundSchema = { + type: 'object', + properties: { + body: { + type: 'string' + }, + statusCode: { + type: 'number' + } + }, + required: ['body', 'statusCode'] + } as const; + + type OutboundSchema = { + body: string; + statusCode: number; + }; + + export { + inboundSchema, + outboundSchema, + type InboundSchema, + type OutboundSchema + }; + ``` + +### Unwrapping events prior to validation + +In some cases you might want to validate only a portion of the event payload - this is what the `envelope` option is for. + +Envelopes are [JMESPath expressions](https://jmespath.org/tutorial.html) to extract the part of the JSON you want before applying the JSON Schema validation. + +Here is a sample custom EventBridge event, where we only want to validate the `detail` part of the event: + +=== "getting_started_envelope.ts" + + ```typescript + import { validator } from '@aws-lambda-powertools/validation'; + import type { Context } from 'aws-lambda'; + import { + inboundSchema, + type InboundSchema, + type OutboundSchema + } from './getting_started_schemas.js'; + + class Lambda { + @validator({ + inboundSchema, + envelope: 'detail', + }) + async handler(event: InboundSchema, context: Context) { + return { + message: `processed ${event.userId}`, + success: true, + } + } + } + + export const handler = new Lambda().handler + ``` + +=== "getting_started_schemas.ts" + + ```typescript + const inboundSchema = { + type: 'object', + properties: { + userId: { + type: 'string' + } + }, + required: ['userId'] + } as const; + + type InboundSchema = { + userId: string; + }; + + const outboundSchema = { + type: 'object', + properties: { + body: { + type: 'string' + }, + statusCode: { + type: 'number' + } + }, + required: ['body', 'statusCode'] + } as const; + + type OutboundSchema = { + body: string; + statusCode: number; + }; + + export { + inboundSchema, + outboundSchema, + type InboundSchema, + type OutboundSchema + }; + ``` + +=== "getting_started_envelope_event.json" + + ```json + { + "version": "0", + "id": "12345678-1234-1234-1234-123456789012", + "detail-type": "myDetailType", + "source": "myEventSource", + "account": "123456789012", + "time": "2017-12-22T18:43:48Z", + "region": "us-west-2", + "resources": [], + "detail": { + "userId": "123" + } + } + ``` + +This is quite powerful as it allows you to validate only the part of the event that you are interested in, and thanks to JMESPath, you can extract records from [arrays](https://jmespath.org/tutorial.html#list-and-slice-projections), combine [pipe](https://jmespath.org/tutorial.html#pipe-expressions) and filter expressions, and more. + +When combined, these features allow you to extract and validate the exact part of the event you actually care about. + +### Built-in envelopes + +We provide built-in envelopes to easily extract payloads from popular AWS event sources. + +Here is an example of how you can use the built-in envelope for SQS events: + +=== "getting_started_envelope_builtin.ts" + + ```typescript + import { validator } from '@aws-lambda-powertools/validation'; + import { SQS } from '@aws-lambda-powertools/validation/envelopes/sqs'; + import type { Context } from 'aws-lambda'; + import { + inboundSchema, + type InboundSchema, + } from './getting_started_schemas.js'; + + const logger = new Logger(); + + export const handler = middy() + .use(validator({ + inboundSchema, + envelope: SQS, + })) + .handler( + async (event: Array, context: Context) => { + for (const record of event) { + logger.info(`Processing message ${record.userId}`); + } + } + ) + ``` + +=== "getting_started_schemas.ts" + + ```typescript + const inboundSchema = { + type: 'object', + properties: { + userId: { + type: 'string' + } + }, + required: ['userId'] + } as const; + + type InboundSchema = { + userId: string; + }; + + const outboundSchema = { + type: 'object', + properties: { + body: { + type: 'string' + }, + statusCode: { + type: 'number' + } + }, + required: ['body', 'statusCode'] + } as const; + + type OutboundSchema = { + body: string; + statusCode: number; + }; + + export { + inboundSchema, + outboundSchema, + type InboundSchema, + type OutboundSchema + }; + ``` + +=== "getting_started_envelope_event.json" + + ```json + { + "Records": [ + { + "messageId": "c80e8021-a70a-42c7-a470-796e1186f753", + "receiptHandle": "AQEBwJnKyrHigUMZj6rYigCgxlaS3SLy0a...", + "body": "{\"userId\":\"123\"}", + "attributes": { + "ApproximateReceiveCount": "3", + "SentTimestamp": "1529104986221", + "SenderId": "AIDAIC6K7FJUZ7Q", + "ApproximateFirstReceiveTimestamp": "1529104986230" + }, + "messageAttributes": {}, + "md5OfBody": "098f6bcd4621d373cade4e832627b4f6", + "eventSource": "aws:sqs", + "eventSourceARN": "arn:aws:sqs:us-west-2:123456789012:my-queue", + "awsRegion": "us-west-2" + }, + { + "messageId": "c80e8021-a70a-42c7-a470-796e1186f753", + "receiptHandle": "AQEBwJnKyrHigUMZj6rYigCgxlaS3SLy0a...", + "body": "{\"userId\":\"456\"}", + "attributes": { + "ApproximateReceiveCount": "3", + "SentTimestamp": "1529104986221", + "SenderId": "AIDAIC6K7FJUZ7Q", + "ApproximateFirstReceiveTimestamp": "1529104986230" + }, + "messageAttributes": {}, + "md5OfBody": "098f6bcd4621d373cade4e832627b4f6", + "eventSource": "aws:sqs", + "eventSourceARN": "arn:aws:sqs:us-west-2:123456789012:my-queue", + "awsRegion": "us-west-2" + } + ] + } + ``` + +For a complete list of built-in envelopes, check the built-in envelopes section [here](https://docs.powertools.aws.dev/lambda/typescript/latest/utilities/jmespath/#built-in-envelopes). + +## Advanced + +### Validating custom formats + +While JSON Schema draft-07 has many new built-in formats such as date, time, and specifically a regex format which can be used in place of custom formats, you can also define your own custom formats. + +This is useful when you have a specific format that is not covered by the built-in formats or when you don't control the schema. + +JSON Schemas with custom formats like `awsaccountid` will fail validation if the format is not defined. You can define custom formats using the `formats` option to any of the validation methods. + +=== "schema_with_custom_format.json" + + ```json + { + "type": "object", + "properties": { + "accountId": { + "type": "string", + "format": "awsaccountid" + }, + "creditCard": { + "type": "string", + "format": "creditcard" + } + }, + "required": ["accountId"] + } + ``` + +For each one of these custom formats, you need to tell us how to validate them. To do so, you can either pass a `RegExp` object or a function that receives the value and returns a boolean. + +For example, to validate using the schema above, you can define a custom format for `awsaccountid` like this: + +=== "advanced_custom_format.ts" + + ```typescript + import { validate, SchemaValidationError } from '@aws-lambda-powertools/validation'; + import { Logger } from '@aws-lambda-powertools/logger'; + + const logger = new Logger(); + + const customFormats = { + awsaccountid: new RegExp('^[0-9]{12}$'), + creditcard: (value: string) => { + // Luhn algorithm (for demonstration purposes only - do not use in production) + const sum = value.split('').reverse().reduce((acc, digit, index) => { + const num = parseInt(digit, 10); + return acc + (index % 2 === 0 ? num : num < 5 ? num * 2 : num * 2 - 9); + }, 0); + + return sum % 10 === 0; + } + }; + + export const handler = async (event: any, context: Context) => { + try { + await validate({ + payload: event, + schema: schemaWithCustomFormat, + formats: customFormats, + }) + + return { // since we are not validating the output, we can return anything + message: 'ok' + } + } catch (error) { + if (error instanceof SchemaValidationError) { + logger.error('Schema validation failed', error) + throw new Error('Invalid event payload') + } + + throw error + } + } + ``` + +### Built-in JMESpath functions + +In some cases, your payloads might require some transformation before validation. For example, you might want to parse a JSON string or decode a base64 string before validating the payload. + +For this, you can use our buil-in JMESPath functions within your expressions. We have a few built-in functions that you can use: + +- [`powertools_json()`](https://docs.powertools.aws.dev/lambda/typescript/latest/utilities/jmespath/#powertools_json-function): Parses a JSON string +- [`powertools_base64()`](https://docs.powertools.aws.dev/lambda/typescript/latest/utilities/jmespath/#powertools_base64-function): Decodes a base64 string +- [`powertools_base64_gzip()`](https://docs.powertools.aws.dev/lambda/typescript/latest/utilities/jmespath/#powertools_base64_gzip-function): Decodes a base64 string and unzips it + +We use these functions for [built-in envelopes](#built-in-envelopes) to easily decode and unwrap events from sources like Kinesis, SQS, S3, and more. + +### Validating with external references + +JSON Schema allows schemas to reference other schemas using the `$ref` keyword. This is useful when you have a common schema that you want to reuse across multiple schemas. + +You can use the `externalRefs` option to pass a list of schemas that you want to reference in your inbound and outbound schemas. + +=== "advanced_custom_format.ts" + + ```typescript + import { validate } from '@aws-lambda-powertools/validation'; + import { + inboundSchema, + outboundSchema, + defsSchema, + type InboundSchema, + } from './schemas_with_external_ref.ts'; + + class Lambda { + @validator({ + inboundSchema, + outboundSchema, + externalRefs: [defsSchema], + }) + async handler(event: InboundSchema, context: Context) { + return { + message: `processed ${event.userId}`, + success: true, + } + } + } + ``` + +=== "schemas_with_external_ref.ts" + + ```ts + const defsSchema = { + $id: 'http://example.com/schemas/defs.json', + definitions: { + int: { type: 'integer' }, + str: { type: 'string' }, + }, + } as const; + + const inboundSchema = { + $id: 'http://example.com/schemas/inbound.json', + type: 'object', + properties: { + userId: { $ref: 'defs.json#/definitions/str' } + }, + required: ['userId'] + } as const; + + type InboundSchema = { + userId: string; + }; + + const outboundSchema = { + $id: 'http://example.com/schemas/outbound.json', + type: 'object', + properties: { + body: { $ref: 'defs.json#/definitions/str' }, + statusCode: { $ref: 'defs.json#/definitions/int' } + }, + required: ['body', 'statusCode'] + } as const; + + type OutboundSchema = { + body: string; + statusCode: number; + }; + + export { + defsSchema, + inboundSchema, + outboundSchema, + type InboundSchema, + type OutboundSchema + }; + ``` + +### Bringing your own `ajv` instance + +By default, we use JSON Schema draft-07. If you want to use a different draft, you can pass your own `ajv` instance to any of the validation methods. + +This is also useful if you want to configure `ajv` with custom options like keywords and more. + +=== "advanced_custom_format.ts" + + ```typescript + import { validate } from '@aws-lambda-powertools/validation'; + import Ajv2019 from "ajv/dist/2019" + import { Logger } from '@aws-lambda-powertools/logger'; + + const logger = new Logger(); + + const ajv = new Ajv2019(); + + export const handler = async (event: any, context: Context) => { + try { + await validate({ + payload: event, + schema: schemaWithCustomFormat, + ajv, + }) + + return { // since we are not validating the output, we can return anything + message: 'ok' + } + } catch (error) { + if (error instanceof SchemaValidationError) { + logger.error('Schema validation failed', error) + throw new Error('Invalid event payload') + } + + throw error + } + } + ``` + +## Should I use this or Parser? + +One of Powertools for AWS Lambda [tenets](../index.md#tenets) is to be progressive. This means that our utilities are designed to be incrementally adopted by customers at any stage of their serverless journey. + +For new projects, especially those using TypeScript, we recommend using the [Parser](parser.md) utility. Thanks to its integration with [Zod](http://zod.dev), it provides an expressive and type-safe way to validate and parse payloads. + +If instead you are already using JSON Schema, or simply feel more comfortable with it, the Validation utility is a great choice. It provides an opinionated thin layer on top of the popular [ajv](https://ajv.js.org) library, with built-in support for JMESPath and AWS service envelopes. + +When it comes to feature set, besides the type-safe parsing, the Parser utility also provides a rich collection of built-in schemas and envelopes for AWS services. The Validation utility, on the other hand, follows a more bring-your-own-schema approach, with built-in support for JMESPath and AWS service envelopes to help you unwrap events before validation. + +Additionally, while both utilities serve specific use cases, understanding your project requirements will help you choose the right tool for your validation needs. + +Finally, in terms of bundle size, the Validation utility is slightly heavier than the Parser utility primarily due to ajv not providing ESM builds. However, even with this, the Validation utility still clocks in at under ~100KB when minified and bundled. diff --git a/examples/app/CHANGELOG.md b/examples/app/CHANGELOG.md index c8529a1e00..2d8aa8a10c 100644 --- a/examples/app/CHANGELOG.md +++ b/examples/app/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.15.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.14.0...v2.15.0) (2025-02-25) + +**Note:** Version bump only for package powertools-sample-app + + + + + # [2.14.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.13.1...v2.14.0) (2025-02-10) **Note:** Version bump only for package powertools-sample-app diff --git a/examples/app/package.json b/examples/app/package.json index f5b9ccca0c..69535c9f5b 100644 --- a/examples/app/package.json +++ b/examples/app/package.json @@ -1,6 +1,6 @@ { "name": "powertools-sample-app", - "version": "2.14.0", + "version": "2.15.0", "author": { "name": "Amazon Web Services", "url": "https://aws.amazon.com" @@ -29,27 +29,27 @@ }, "devDependencies": { "@types/aws-lambda": "^8.10.147", - "@types/node": "22.13.1", - "aws-cdk-lib": "^2.178.1", + "@types/node": "22.13.4", + "aws-cdk-lib": "^2.179.0", "constructs": "^10.4.2", "source-map-support": "^0.5.21", - "tsx": "^4.19.2", + "tsx": "^4.19.3", "typescript": "^5.7.3", "vitest": "^3.0.5" }, "dependencies": { - "@aws-lambda-powertools/batch": "^2.14.0", - "@aws-lambda-powertools/idempotency": "^2.14.0", - "@aws-lambda-powertools/logger": "^2.14.0", - "@aws-lambda-powertools/metrics": "^2.14.0", - "@aws-lambda-powertools/parameters": "^2.14.0", - "@aws-lambda-powertools/tracer": "^2.14.0", - "@aws-sdk/client-ssm": "^3.744.0", - "@aws-sdk/lib-dynamodb": "^3.744.0", + "@aws-lambda-powertools/batch": "^2.15.0", + "@aws-lambda-powertools/idempotency": "^2.15.0", + "@aws-lambda-powertools/logger": "^2.15.0", + "@aws-lambda-powertools/metrics": "^2.15.0", + "@aws-lambda-powertools/parameters": "^2.15.0", + "@aws-lambda-powertools/tracer": "^2.15.0", + "@aws-sdk/client-ssm": "^3.750.0", + "@aws-sdk/lib-dynamodb": "^3.751.0", "@middy/core": "^4.7.0", "@types/aws-lambda": "^8.10.147", - "@types/node": "22.13.1", - "aws-cdk": "^2.178.1", + "@types/node": "22.13.4", + "aws-cdk": "^2.1000.2", "constructs": "^10.4.2", "esbuild": "^0.25.0", "typescript": "^5.7.3" diff --git a/examples/snippets/CHANGELOG.md b/examples/snippets/CHANGELOG.md index 02f83c4293..3976be0acf 100644 --- a/examples/snippets/CHANGELOG.md +++ b/examples/snippets/CHANGELOG.md @@ -3,6 +3,17 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.15.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.14.0...v2.15.0) (2025-02-25) + + +### Features + +* **logger:** refresh sample rate calculation per invocation ([#3644](https://github.com/aws-powertools/powertools-lambda-typescript/issues/3644)) ([1d66a2a](https://github.com/aws-powertools/powertools-lambda-typescript/commit/1d66a2a0d0af36d6c8aa86b0c559f8489fe9ef77)) + + + + + # [2.14.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.13.1...v2.14.0) (2025-02-10) **Note:** Version bump only for package code-snippets diff --git a/examples/snippets/idempotency/customKeyPrefixDecorator.ts b/examples/snippets/idempotency/customKeyPrefixDecorator.ts new file mode 100644 index 0000000000..407e328ade --- /dev/null +++ b/examples/snippets/idempotency/customKeyPrefixDecorator.ts @@ -0,0 +1,31 @@ +import { randomUUID } from 'node:crypto'; +import { idempotent } from '@aws-lambda-powertools/idempotency'; +import { DynamoDBPersistenceLayer } from '@aws-lambda-powertools/idempotency/dynamodb'; +import type { Context } from 'aws-lambda'; + +const persistenceStore = new DynamoDBPersistenceLayer({ + tableName: 'idempotencyTableName', +}); + +class Lambda { + @idempotent({ + persistenceStore, + keyPrefix: 'createSubscriptionPayment', + }) + async handler(event: unknown, context: Context) { + try { + // ... create payment + + return { + paymentId: randomUUID(), + message: 'success', + statusCode: 200, + }; + } catch (error) { + throw new Error('Error creating payment'); + } + } +} + +const lambda = new Lambda(); +export const handler = lambda.handler.bind(lambda); diff --git a/examples/snippets/idempotency/customKeyPrefixFnWrapper.ts b/examples/snippets/idempotency/customKeyPrefixFnWrapper.ts new file mode 100644 index 0000000000..0395ff3e9f --- /dev/null +++ b/examples/snippets/idempotency/customKeyPrefixFnWrapper.ts @@ -0,0 +1,27 @@ +import { randomUUID } from 'node:crypto'; +import { makeIdempotent } from '@aws-lambda-powertools/idempotency'; +import { DynamoDBPersistenceLayer } from '@aws-lambda-powertools/idempotency/dynamodb'; + +const persistenceStore = new DynamoDBPersistenceLayer({ + tableName: 'idempotencyTableName', +}); + +export const handler = makeIdempotent( + async () => { + try { + // ... create payment + + return { + paymentId: randomUUID(), + message: 'success', + statusCode: 200, + }; + } catch (error) { + throw new Error('Error creating payment'); + } + }, + { + persistenceStore, + keyPrefix: 'createSubscriptionPayment', + } +); diff --git a/examples/snippets/idempotency/customKeyPrefixMiddleware.ts b/examples/snippets/idempotency/customKeyPrefixMiddleware.ts new file mode 100644 index 0000000000..9505ec75ea --- /dev/null +++ b/examples/snippets/idempotency/customKeyPrefixMiddleware.ts @@ -0,0 +1,29 @@ +import { randomUUID } from 'node:crypto'; +import { DynamoDBPersistenceLayer } from '@aws-lambda-powertools/idempotency/dynamodb'; +import { makeHandlerIdempotent } from '@aws-lambda-powertools/idempotency/middleware'; +import middy from '@middy/core'; + +const persistenceStore = new DynamoDBPersistenceLayer({ + tableName: 'idempotencyTableName', +}); + +export const handler = middy() + .use( + makeHandlerIdempotent({ + persistenceStore, + keyPrefix: 'createSubscriptionPayment', + }) + ) + .handler(async () => { + try { + // ... create payment + + return { + paymentId: randomUUID(), + message: 'success', + statusCode: 200, + }; + } catch (error) { + throw new Error('Error creating payment'); + } + }); diff --git a/examples/snippets/package.json b/examples/snippets/package.json index 4bb5c134c3..4a44f8c418 100644 --- a/examples/snippets/package.json +++ b/examples/snippets/package.json @@ -1,6 +1,6 @@ { "name": "code-snippets", - "version": "2.14.0", + "version": "2.15.0", "description": "A collection code snippets for the Powertools for AWS Lambda (TypeScript) docs", "author": { "name": "Amazon Web Services", @@ -24,23 +24,23 @@ }, "homepage": "https://github.com/aws-powertools/powertools-lambda-typescript#readme", "devDependencies": { - "@aws-lambda-powertools/batch": "^2.14.0", - "@aws-lambda-powertools/idempotency": "^2.14.0", - "@aws-lambda-powertools/jmespath": "^2.14.0", - "@aws-lambda-powertools/logger": "^2.14.0", - "@aws-lambda-powertools/metrics": "^2.14.0", - "@aws-lambda-powertools/parameters": "^2.14.0", - "@aws-lambda-powertools/parser": "^2.14.0", - "@aws-lambda-powertools/tracer": "^2.14.0", - "@aws-sdk/client-appconfigdata": "^3.744.0", - "@aws-sdk/client-dynamodb": "^3.744.0", - "@aws-sdk/client-secrets-manager": "^3.744.0", - "@aws-sdk/client-ssm": "^3.744.0", - "@aws-sdk/util-dynamodb": "^3.744.0", + "@aws-lambda-powertools/batch": "^2.15.0", + "@aws-lambda-powertools/idempotency": "^2.15.0", + "@aws-lambda-powertools/jmespath": "^2.15.0", + "@aws-lambda-powertools/logger": "^2.15.0", + "@aws-lambda-powertools/metrics": "^2.15.0", + "@aws-lambda-powertools/parameters": "^2.15.0", + "@aws-lambda-powertools/parser": "^2.15.0", + "@aws-lambda-powertools/tracer": "^2.15.0", + "@aws-sdk/client-appconfigdata": "^3.750.0", + "@aws-sdk/client-dynamodb": "^3.751.0", + "@aws-sdk/client-secrets-manager": "^3.750.0", + "@aws-sdk/client-ssm": "^3.750.0", + "@aws-sdk/util-dynamodb": "^3.751.0", "@middy/core": "^4.7.0", "aws-sdk": "^2.1692.0", "aws-sdk-client-mock": "^4.1.0", "hashi-vault-js": "^0.4.16", - "zod": "^3.24.1" + "zod": "^3.24.2" } } diff --git a/layers/CHANGELOG.md b/layers/CHANGELOG.md index df01a6738e..7dcf58f143 100644 --- a/layers/CHANGELOG.md +++ b/layers/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.15.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.14.0...v2.15.0) (2025-02-25) + +**Note:** Version bump only for package layers + + + + + # [2.14.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.13.1...v2.14.0) (2025-02-10) **Note:** Version bump only for package layers diff --git a/layers/package.json b/layers/package.json index eb7d1eb7e8..98a7196ff4 100644 --- a/layers/package.json +++ b/layers/package.json @@ -1,6 +1,6 @@ { "name": "layers", - "version": "2.14.0", + "version": "2.15.0", "bin": { "layer": "bin/layers.js" }, @@ -40,9 +40,9 @@ "source-map-support": "^0.5.21" }, "dependencies": { - "aws-cdk": "^2.178.1", - "aws-cdk-lib": "^2.178.1", + "aws-cdk": "^2.1000.2", + "aws-cdk-lib": "^2.179.0", "esbuild": "^0.25.0", - "tsx": "^4.19.2" + "tsx": "^4.19.3" } } diff --git a/lerna.json b/lerna.json index b294aaa8e1..fdc0f5b090 100644 --- a/lerna.json +++ b/lerna.json @@ -11,11 +11,12 @@ "packages/jmespath", "packages/parser", "packages/event-handler", + "packages/validation", "examples/app", "layers", "examples/snippets" ], - "version": "2.14.0", + "version": "2.15.0", "npmClient": "npm", "message": "chore(release): %s [skip ci]" } diff --git a/mkdocs.yml b/mkdocs.yml index 8f688bff7d..090841d535 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -3,6 +3,7 @@ site_description: Powertools for AWS Lambda (TypeScript) site_author: Amazon Web Services repo_url: https://github.com/aws-powertools/powertools-lambda-typescript edit_uri: edit/main/docs +site_url: https://docs.powertools.aws.dev/lambda/typescript nav: - Homepage: diff --git a/package-lock.json b/package-lock.json index 632c7c57f7..44c90c9ff8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -22,13 +22,14 @@ "examples/snippets", "layers", "examples/app", - "packages/event-handler" + "packages/event-handler", + "packages/validation" ], "devDependencies": { "@biomejs/biome": "^1.9.4", "@types/aws-lambda": "^8.10.147", - "@types/node": "^22.13.1", - "@vitest/coverage-v8": "^3.0.5", + "@types/node": "^22.13.4", + "@vitest/coverage-v8": "^3.0.6", "husky": "^9.1.7", "lerna": "8.1.2", "lint-staged": "^15.4.3", @@ -48,69 +49,69 @@ }, "examples/app": { "name": "powertools-sample-app", - "version": "2.14.0", + "version": "2.15.0", "license": "MIT-0", "dependencies": { - "@aws-lambda-powertools/batch": "^2.14.0", - "@aws-lambda-powertools/idempotency": "^2.14.0", - "@aws-lambda-powertools/logger": "^2.14.0", - "@aws-lambda-powertools/metrics": "^2.14.0", - "@aws-lambda-powertools/parameters": "^2.14.0", - "@aws-lambda-powertools/tracer": "^2.14.0", - "@aws-sdk/client-ssm": "^3.744.0", - "@aws-sdk/lib-dynamodb": "^3.744.0", + "@aws-lambda-powertools/batch": "^2.15.0", + "@aws-lambda-powertools/idempotency": "^2.15.0", + "@aws-lambda-powertools/logger": "^2.15.0", + "@aws-lambda-powertools/metrics": "^2.15.0", + "@aws-lambda-powertools/parameters": "^2.15.0", + "@aws-lambda-powertools/tracer": "^2.15.0", + "@aws-sdk/client-ssm": "^3.750.0", + "@aws-sdk/lib-dynamodb": "^3.751.0", "@middy/core": "^4.7.0", "@types/aws-lambda": "^8.10.147", - "@types/node": "22.13.1", - "aws-cdk": "^2.178.1", + "@types/node": "22.13.4", + "aws-cdk": "^2.1000.2", "constructs": "^10.4.2", "esbuild": "^0.25.0", "typescript": "^5.7.3" }, "devDependencies": { "@types/aws-lambda": "^8.10.147", - "@types/node": "22.13.1", - "aws-cdk-lib": "^2.178.1", + "@types/node": "22.13.4", + "aws-cdk-lib": "^2.179.0", "constructs": "^10.4.2", "source-map-support": "^0.5.21", - "tsx": "^4.19.2", + "tsx": "^4.19.3", "typescript": "^5.7.3", "vitest": "^3.0.5" } }, "examples/snippets": { "name": "code-snippets", - "version": "2.14.0", + "version": "2.15.0", "license": "MIT-0", "devDependencies": { - "@aws-lambda-powertools/batch": "^2.14.0", - "@aws-lambda-powertools/idempotency": "^2.14.0", - "@aws-lambda-powertools/jmespath": "^2.14.0", - "@aws-lambda-powertools/logger": "^2.14.0", - "@aws-lambda-powertools/metrics": "^2.14.0", - "@aws-lambda-powertools/parameters": "^2.14.0", - "@aws-lambda-powertools/parser": "^2.14.0", - "@aws-lambda-powertools/tracer": "^2.14.0", - "@aws-sdk/client-appconfigdata": "^3.744.0", - "@aws-sdk/client-dynamodb": "^3.744.0", - "@aws-sdk/client-secrets-manager": "^3.744.0", - "@aws-sdk/client-ssm": "^3.744.0", - "@aws-sdk/util-dynamodb": "^3.744.0", + "@aws-lambda-powertools/batch": "^2.15.0", + "@aws-lambda-powertools/idempotency": "^2.15.0", + "@aws-lambda-powertools/jmespath": "^2.15.0", + "@aws-lambda-powertools/logger": "^2.15.0", + "@aws-lambda-powertools/metrics": "^2.15.0", + "@aws-lambda-powertools/parameters": "^2.15.0", + "@aws-lambda-powertools/parser": "^2.15.0", + "@aws-lambda-powertools/tracer": "^2.15.0", + "@aws-sdk/client-appconfigdata": "^3.750.0", + "@aws-sdk/client-dynamodb": "^3.751.0", + "@aws-sdk/client-secrets-manager": "^3.750.0", + "@aws-sdk/client-ssm": "^3.750.0", + "@aws-sdk/util-dynamodb": "^3.751.0", "@middy/core": "^4.7.0", "aws-sdk": "^2.1692.0", "aws-sdk-client-mock": "^4.1.0", "hashi-vault-js": "^0.4.16", - "zod": "^3.24.1" + "zod": "^3.24.2" } }, "layers": { - "version": "2.14.0", + "version": "2.15.0", "license": "MIT-0", "dependencies": { - "aws-cdk": "^2.178.1", - "aws-cdk-lib": "^2.178.1", + "aws-cdk": "^2.1000.2", + "aws-cdk-lib": "^2.179.0", "esbuild": "^0.25.0", - "tsx": "^4.19.2" + "tsx": "^4.19.3" }, "bin": { "layer": "bin/layers.js" @@ -138,11 +139,6 @@ "resolved": "https://registry.npmjs.org/@aws-cdk/asset-awscli-v1/-/asset-awscli-v1-2.2.209.tgz", "integrity": "sha512-tL7aBDzx/QBuZoQso9OST2BMCoev89v01iQZicOKlR0J6vWQLPiqZfn4vd9nissFbM4X+xIwi3UKasPBTQL0WQ==" }, - "node_modules/@aws-cdk/asset-kubectl-v20": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@aws-cdk/asset-kubectl-v20/-/asset-kubectl-v20-2.1.3.tgz", - "integrity": "sha512-cDG1w3ieM6eOT9mTefRuTypk95+oyD7P5X/wRltwmYxU7nZc3+076YEVS6vrjDKr3ADYbfn0lDKpfB1FBtO9CQ==" - }, "node_modules/@aws-cdk/asset-node-proxy-agent-v6": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/@aws-cdk/asset-node-proxy-agent-v6/-/asset-node-proxy-agent-v6-2.1.0.tgz", @@ -354,51 +350,55 @@ "resolved": "packages/tracer", "link": true }, + "node_modules/@aws-lambda-powertools/validation": { + "resolved": "packages/validation", + "link": true + }, "node_modules/@aws-sdk/client-appconfigdata": { - "version": "3.744.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-appconfigdata/-/client-appconfigdata-3.744.0.tgz", - "integrity": "sha512-msBY1aFy1GySw7ipf0QhGuaVEKttZKoECF9dy0v+xhXnFQ8n4mcM4Ei/lFSQQdG4iA4HtKtWv/karRFsWSaxPg==", + "version": "3.750.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-appconfigdata/-/client-appconfigdata-3.750.0.tgz", + "integrity": "sha512-osPZfTFe+VKd/OnURDlDCHbOBP2IIBn3plhpI7dOcDyxjdmWl15TM17Wynszv+X23FGU5jidsqjJTAArbJFyvw==", "dev": true, "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.744.0", - "@aws-sdk/credential-provider-node": "3.744.0", + "@aws-sdk/core": "3.750.0", + "@aws-sdk/credential-provider-node": "3.750.0", "@aws-sdk/middleware-host-header": "3.734.0", "@aws-sdk/middleware-logger": "3.734.0", "@aws-sdk/middleware-recursion-detection": "3.734.0", - "@aws-sdk/middleware-user-agent": "3.744.0", + "@aws-sdk/middleware-user-agent": "3.750.0", "@aws-sdk/region-config-resolver": "3.734.0", "@aws-sdk/types": "3.734.0", "@aws-sdk/util-endpoints": "3.743.0", "@aws-sdk/util-user-agent-browser": "3.734.0", - "@aws-sdk/util-user-agent-node": "3.744.0", + "@aws-sdk/util-user-agent-node": "3.750.0", "@smithy/config-resolver": "^4.0.1", - "@smithy/core": "^3.1.2", + "@smithy/core": "^3.1.4", "@smithy/fetch-http-handler": "^5.0.1", "@smithy/hash-node": "^4.0.1", "@smithy/invalid-dependency": "^4.0.1", "@smithy/middleware-content-length": "^4.0.1", - "@smithy/middleware-endpoint": "^4.0.3", - "@smithy/middleware-retry": "^4.0.4", + "@smithy/middleware-endpoint": "^4.0.5", + "@smithy/middleware-retry": "^4.0.6", "@smithy/middleware-serde": "^4.0.2", "@smithy/middleware-stack": "^4.0.1", "@smithy/node-config-provider": "^4.0.1", "@smithy/node-http-handler": "^4.0.2", "@smithy/protocol-http": "^5.0.1", - "@smithy/smithy-client": "^4.1.3", + "@smithy/smithy-client": "^4.1.5", "@smithy/types": "^4.1.0", "@smithy/url-parser": "^4.0.1", "@smithy/util-base64": "^4.0.0", "@smithy/util-body-length-browser": "^4.0.0", "@smithy/util-body-length-node": "^4.0.0", - "@smithy/util-defaults-mode-browser": "^4.0.4", - "@smithy/util-defaults-mode-node": "^4.0.4", + "@smithy/util-defaults-mode-browser": "^4.0.6", + "@smithy/util-defaults-mode-node": "^4.0.6", "@smithy/util-endpoints": "^3.0.1", "@smithy/util-middleware": "^4.0.1", "@smithy/util-retry": "^4.0.1", - "@smithy/util-stream": "^4.0.2", + "@smithy/util-stream": "^4.1.1", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, @@ -407,47 +407,47 @@ } }, "node_modules/@aws-sdk/client-cloudwatch": { - "version": "3.744.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-cloudwatch/-/client-cloudwatch-3.744.0.tgz", - "integrity": "sha512-+EZCa3SXJ+4WiC/I2Nre6QxvRqR7vK56Q+BrlxrrESQ4XefXIIWj/6R/+cn/ERhATC6+IfJSHYbhwy/5IvtdrA==", + "version": "3.750.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-cloudwatch/-/client-cloudwatch-3.750.0.tgz", + "integrity": "sha512-Ii+OQOe/RCgEEQwuNkEFrKnXB2UREiiIY/0liaI4kGxBhATz4lH7TxwCL8zXtNXOB4KJIdQy1+6hOO1/WcmkPA==", "dev": true, "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.744.0", - "@aws-sdk/credential-provider-node": "3.744.0", + "@aws-sdk/core": "3.750.0", + "@aws-sdk/credential-provider-node": "3.750.0", "@aws-sdk/middleware-host-header": "3.734.0", "@aws-sdk/middleware-logger": "3.734.0", "@aws-sdk/middleware-recursion-detection": "3.734.0", - "@aws-sdk/middleware-user-agent": "3.744.0", + "@aws-sdk/middleware-user-agent": "3.750.0", "@aws-sdk/region-config-resolver": "3.734.0", "@aws-sdk/types": "3.734.0", "@aws-sdk/util-endpoints": "3.743.0", "@aws-sdk/util-user-agent-browser": "3.734.0", - "@aws-sdk/util-user-agent-node": "3.744.0", + "@aws-sdk/util-user-agent-node": "3.750.0", "@smithy/config-resolver": "^4.0.1", - "@smithy/core": "^3.1.2", + "@smithy/core": "^3.1.4", "@smithy/fetch-http-handler": "^5.0.1", "@smithy/hash-node": "^4.0.1", "@smithy/invalid-dependency": "^4.0.1", - "@smithy/middleware-compression": "^4.0.3", + "@smithy/middleware-compression": "^4.0.5", "@smithy/middleware-content-length": "^4.0.1", - "@smithy/middleware-endpoint": "^4.0.3", - "@smithy/middleware-retry": "^4.0.4", + "@smithy/middleware-endpoint": "^4.0.5", + "@smithy/middleware-retry": "^4.0.6", "@smithy/middleware-serde": "^4.0.2", "@smithy/middleware-stack": "^4.0.1", "@smithy/node-config-provider": "^4.0.1", "@smithy/node-http-handler": "^4.0.2", "@smithy/protocol-http": "^5.0.1", - "@smithy/smithy-client": "^4.1.3", + "@smithy/smithy-client": "^4.1.5", "@smithy/types": "^4.1.0", "@smithy/url-parser": "^4.0.1", "@smithy/util-base64": "^4.0.0", "@smithy/util-body-length-browser": "^4.0.0", "@smithy/util-body-length-node": "^4.0.0", - "@smithy/util-defaults-mode-browser": "^4.0.4", - "@smithy/util-defaults-mode-node": "^4.0.4", + "@smithy/util-defaults-mode-browser": "^4.0.6", + "@smithy/util-defaults-mode-node": "^4.0.6", "@smithy/util-endpoints": "^3.0.1", "@smithy/util-middleware": "^4.0.1", "@smithy/util-retry": "^4.0.1", @@ -460,46 +460,46 @@ } }, "node_modules/@aws-sdk/client-dynamodb": { - "version": "3.744.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-dynamodb/-/client-dynamodb-3.744.0.tgz", - "integrity": "sha512-/LKOp6LvwMa5QDg7/AX2rdF6enp7lyfSuMzORqcqyO/CYCXwswJN1eWWaOx/fRzROW59kswoxj6X23riLywIdA==", + "version": "3.751.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-dynamodb/-/client-dynamodb-3.751.0.tgz", + "integrity": "sha512-U7hbXiuePbfmH7wstnCvOmUxwrWRV3/FMK2WuZU7wQZfBrIsPdmMh8XMGyXJ7VZ4dSq66Skqs0U2OBpB+9sO5w==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.744.0", - "@aws-sdk/credential-provider-node": "3.744.0", + "@aws-sdk/core": "3.750.0", + "@aws-sdk/credential-provider-node": "3.750.0", "@aws-sdk/middleware-endpoint-discovery": "3.734.0", "@aws-sdk/middleware-host-header": "3.734.0", "@aws-sdk/middleware-logger": "3.734.0", "@aws-sdk/middleware-recursion-detection": "3.734.0", - "@aws-sdk/middleware-user-agent": "3.744.0", + "@aws-sdk/middleware-user-agent": "3.750.0", "@aws-sdk/region-config-resolver": "3.734.0", "@aws-sdk/types": "3.734.0", "@aws-sdk/util-endpoints": "3.743.0", "@aws-sdk/util-user-agent-browser": "3.734.0", - "@aws-sdk/util-user-agent-node": "3.744.0", + "@aws-sdk/util-user-agent-node": "3.750.0", "@smithy/config-resolver": "^4.0.1", - "@smithy/core": "^3.1.2", + "@smithy/core": "^3.1.4", "@smithy/fetch-http-handler": "^5.0.1", "@smithy/hash-node": "^4.0.1", "@smithy/invalid-dependency": "^4.0.1", "@smithy/middleware-content-length": "^4.0.1", - "@smithy/middleware-endpoint": "^4.0.3", - "@smithy/middleware-retry": "^4.0.4", + "@smithy/middleware-endpoint": "^4.0.5", + "@smithy/middleware-retry": "^4.0.6", "@smithy/middleware-serde": "^4.0.2", "@smithy/middleware-stack": "^4.0.1", "@smithy/node-config-provider": "^4.0.1", "@smithy/node-http-handler": "^4.0.2", "@smithy/protocol-http": "^5.0.1", - "@smithy/smithy-client": "^4.1.3", + "@smithy/smithy-client": "^4.1.5", "@smithy/types": "^4.1.0", "@smithy/url-parser": "^4.0.1", "@smithy/util-base64": "^4.0.0", "@smithy/util-body-length-browser": "^4.0.0", "@smithy/util-body-length-node": "^4.0.0", - "@smithy/util-defaults-mode-browser": "^4.0.4", - "@smithy/util-defaults-mode-node": "^4.0.4", + "@smithy/util-defaults-mode-browser": "^4.0.6", + "@smithy/util-defaults-mode-node": "^4.0.6", "@smithy/util-endpoints": "^3.0.1", "@smithy/util-middleware": "^4.0.1", "@smithy/util-retry": "^4.0.1", @@ -514,26 +514,26 @@ } }, "node_modules/@aws-sdk/client-lambda": { - "version": "3.744.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-lambda/-/client-lambda-3.744.0.tgz", - "integrity": "sha512-XPWPuvRkrabJ9jMBeEurn2vXVo40umeoeV0+nAERtG6mt9dB8d3gobHROBG5iwWJV1oqBDn9E/ZN8WDahvM1BQ==", + "version": "3.750.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-lambda/-/client-lambda-3.750.0.tgz", + "integrity": "sha512-lSfKdMBXaSQOh48hleRJEKuVO1wQBOgPIonRkCPU5bpagZckWyeD8p8XSgdF6p22lZZUPuasS6+PEJ6knSYNDQ==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.744.0", - "@aws-sdk/credential-provider-node": "3.744.0", + "@aws-sdk/core": "3.750.0", + "@aws-sdk/credential-provider-node": "3.750.0", "@aws-sdk/middleware-host-header": "3.734.0", "@aws-sdk/middleware-logger": "3.734.0", "@aws-sdk/middleware-recursion-detection": "3.734.0", - "@aws-sdk/middleware-user-agent": "3.744.0", + "@aws-sdk/middleware-user-agent": "3.750.0", "@aws-sdk/region-config-resolver": "3.734.0", "@aws-sdk/types": "3.734.0", "@aws-sdk/util-endpoints": "3.743.0", "@aws-sdk/util-user-agent-browser": "3.734.0", - "@aws-sdk/util-user-agent-node": "3.744.0", + "@aws-sdk/util-user-agent-node": "3.750.0", "@smithy/config-resolver": "^4.0.1", - "@smithy/core": "^3.1.2", + "@smithy/core": "^3.1.4", "@smithy/eventstream-serde-browser": "^4.0.1", "@smithy/eventstream-serde-config-resolver": "^4.0.1", "@smithy/eventstream-serde-node": "^4.0.1", @@ -541,25 +541,25 @@ "@smithy/hash-node": "^4.0.1", "@smithy/invalid-dependency": "^4.0.1", "@smithy/middleware-content-length": "^4.0.1", - "@smithy/middleware-endpoint": "^4.0.3", - "@smithy/middleware-retry": "^4.0.4", + "@smithy/middleware-endpoint": "^4.0.5", + "@smithy/middleware-retry": "^4.0.6", "@smithy/middleware-serde": "^4.0.2", "@smithy/middleware-stack": "^4.0.1", "@smithy/node-config-provider": "^4.0.1", "@smithy/node-http-handler": "^4.0.2", "@smithy/protocol-http": "^5.0.1", - "@smithy/smithy-client": "^4.1.3", + "@smithy/smithy-client": "^4.1.5", "@smithy/types": "^4.1.0", "@smithy/url-parser": "^4.0.1", "@smithy/util-base64": "^4.0.0", "@smithy/util-body-length-browser": "^4.0.0", "@smithy/util-body-length-node": "^4.0.0", - "@smithy/util-defaults-mode-browser": "^4.0.4", - "@smithy/util-defaults-mode-node": "^4.0.4", + "@smithy/util-defaults-mode-browser": "^4.0.6", + "@smithy/util-defaults-mode-node": "^4.0.6", "@smithy/util-endpoints": "^3.0.1", "@smithy/util-middleware": "^4.0.1", "@smithy/util-retry": "^4.0.1", - "@smithy/util-stream": "^4.0.2", + "@smithy/util-stream": "^4.1.1", "@smithy/util-utf8": "^4.0.0", "@smithy/util-waiter": "^4.0.2", "tslib": "^2.6.2" @@ -569,46 +569,46 @@ } }, "node_modules/@aws-sdk/client-secrets-manager": { - "version": "3.744.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-secrets-manager/-/client-secrets-manager-3.744.0.tgz", - "integrity": "sha512-AF5Db4vmy+aWk++d6afxv+DI8YLtWq76AIlFcHv+E9Omb7/Fgzrf9AfevjLTgg8BLK51l+uSdAEfC60K3aD3RA==", + "version": "3.750.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-secrets-manager/-/client-secrets-manager-3.750.0.tgz", + "integrity": "sha512-5JrrOQECJtcUFodKqBNKTk82WycIu/4cVFYf6QXsZQ/0bJ8zlp3vDyTeAjLriZXRXrb8HZlWqOsPCPT3wEBYdg==", "dev": true, "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.744.0", - "@aws-sdk/credential-provider-node": "3.744.0", + "@aws-sdk/core": "3.750.0", + "@aws-sdk/credential-provider-node": "3.750.0", "@aws-sdk/middleware-host-header": "3.734.0", "@aws-sdk/middleware-logger": "3.734.0", "@aws-sdk/middleware-recursion-detection": "3.734.0", - "@aws-sdk/middleware-user-agent": "3.744.0", + "@aws-sdk/middleware-user-agent": "3.750.0", "@aws-sdk/region-config-resolver": "3.734.0", "@aws-sdk/types": "3.734.0", "@aws-sdk/util-endpoints": "3.743.0", "@aws-sdk/util-user-agent-browser": "3.734.0", - "@aws-sdk/util-user-agent-node": "3.744.0", + "@aws-sdk/util-user-agent-node": "3.750.0", "@smithy/config-resolver": "^4.0.1", - "@smithy/core": "^3.1.2", + "@smithy/core": "^3.1.4", "@smithy/fetch-http-handler": "^5.0.1", "@smithy/hash-node": "^4.0.1", "@smithy/invalid-dependency": "^4.0.1", "@smithy/middleware-content-length": "^4.0.1", - "@smithy/middleware-endpoint": "^4.0.3", - "@smithy/middleware-retry": "^4.0.4", + "@smithy/middleware-endpoint": "^4.0.5", + "@smithy/middleware-retry": "^4.0.6", "@smithy/middleware-serde": "^4.0.2", "@smithy/middleware-stack": "^4.0.1", "@smithy/node-config-provider": "^4.0.1", "@smithy/node-http-handler": "^4.0.2", "@smithy/protocol-http": "^5.0.1", - "@smithy/smithy-client": "^4.1.3", + "@smithy/smithy-client": "^4.1.5", "@smithy/types": "^4.1.0", "@smithy/url-parser": "^4.0.1", "@smithy/util-base64": "^4.0.0", "@smithy/util-body-length-browser": "^4.0.0", "@smithy/util-body-length-node": "^4.0.0", - "@smithy/util-defaults-mode-browser": "^4.0.4", - "@smithy/util-defaults-mode-node": "^4.0.4", + "@smithy/util-defaults-mode-browser": "^4.0.6", + "@smithy/util-defaults-mode-node": "^4.0.6", "@smithy/util-endpoints": "^3.0.1", "@smithy/util-middleware": "^4.0.1", "@smithy/util-retry": "^4.0.1", @@ -622,45 +622,45 @@ } }, "node_modules/@aws-sdk/client-ssm": { - "version": "3.744.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-ssm/-/client-ssm-3.744.0.tgz", - "integrity": "sha512-g39uok7YjyIpMt8d9lZ2HHOR/pRppXLCCesJTCFTIlF7P1Z2Z0VoRYKBa/dNmKS5W3ngc4vsIEXz4ljY/YsUSA==", + "version": "3.750.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-ssm/-/client-ssm-3.750.0.tgz", + "integrity": "sha512-YCsR3MeOa1fv8XZo+Q1X8kNodz5lYJqgDC65kr2GDvGJ1U32tO/Q1/J3kzkMwIazCj+DD6JS4DO75piw70Voyw==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.744.0", - "@aws-sdk/credential-provider-node": "3.744.0", + "@aws-sdk/core": "3.750.0", + "@aws-sdk/credential-provider-node": "3.750.0", "@aws-sdk/middleware-host-header": "3.734.0", "@aws-sdk/middleware-logger": "3.734.0", "@aws-sdk/middleware-recursion-detection": "3.734.0", - "@aws-sdk/middleware-user-agent": "3.744.0", + "@aws-sdk/middleware-user-agent": "3.750.0", "@aws-sdk/region-config-resolver": "3.734.0", "@aws-sdk/types": "3.734.0", "@aws-sdk/util-endpoints": "3.743.0", "@aws-sdk/util-user-agent-browser": "3.734.0", - "@aws-sdk/util-user-agent-node": "3.744.0", + "@aws-sdk/util-user-agent-node": "3.750.0", "@smithy/config-resolver": "^4.0.1", - "@smithy/core": "^3.1.2", + "@smithy/core": "^3.1.4", "@smithy/fetch-http-handler": "^5.0.1", "@smithy/hash-node": "^4.0.1", "@smithy/invalid-dependency": "^4.0.1", "@smithy/middleware-content-length": "^4.0.1", - "@smithy/middleware-endpoint": "^4.0.3", - "@smithy/middleware-retry": "^4.0.4", + "@smithy/middleware-endpoint": "^4.0.5", + "@smithy/middleware-retry": "^4.0.6", "@smithy/middleware-serde": "^4.0.2", "@smithy/middleware-stack": "^4.0.1", "@smithy/node-config-provider": "^4.0.1", "@smithy/node-http-handler": "^4.0.2", "@smithy/protocol-http": "^5.0.1", - "@smithy/smithy-client": "^4.1.3", + "@smithy/smithy-client": "^4.1.5", "@smithy/types": "^4.1.0", "@smithy/url-parser": "^4.0.1", "@smithy/util-base64": "^4.0.0", "@smithy/util-body-length-browser": "^4.0.0", "@smithy/util-body-length-node": "^4.0.0", - "@smithy/util-defaults-mode-browser": "^4.0.4", - "@smithy/util-defaults-mode-node": "^4.0.4", + "@smithy/util-defaults-mode-browser": "^4.0.6", + "@smithy/util-defaults-mode-node": "^4.0.6", "@smithy/util-endpoints": "^3.0.1", "@smithy/util-middleware": "^4.0.1", "@smithy/util-retry": "^4.0.1", @@ -675,44 +675,44 @@ } }, "node_modules/@aws-sdk/client-sso": { - "version": "3.744.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.744.0.tgz", - "integrity": "sha512-mzJxPQ9mcnNY50pi7+pxB34/Dt7PUn0OgkashHdJPTnavoriLWvPcaQCG1NEVAtyzxNdowhpi4KjC+aN1EwAeA==", + "version": "3.750.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.750.0.tgz", + "integrity": "sha512-y0Rx6pTQXw0E61CaptpZF65qNggjqOgymq/RYZU5vWba5DGQ+iqGt8Yq8s+jfBoBBNXshxq8l8Dl5Uq/JTY1wg==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.744.0", + "@aws-sdk/core": "3.750.0", "@aws-sdk/middleware-host-header": "3.734.0", "@aws-sdk/middleware-logger": "3.734.0", "@aws-sdk/middleware-recursion-detection": "3.734.0", - "@aws-sdk/middleware-user-agent": "3.744.0", + "@aws-sdk/middleware-user-agent": "3.750.0", "@aws-sdk/region-config-resolver": "3.734.0", "@aws-sdk/types": "3.734.0", "@aws-sdk/util-endpoints": "3.743.0", "@aws-sdk/util-user-agent-browser": "3.734.0", - "@aws-sdk/util-user-agent-node": "3.744.0", + "@aws-sdk/util-user-agent-node": "3.750.0", "@smithy/config-resolver": "^4.0.1", - "@smithy/core": "^3.1.2", + "@smithy/core": "^3.1.4", "@smithy/fetch-http-handler": "^5.0.1", "@smithy/hash-node": "^4.0.1", "@smithy/invalid-dependency": "^4.0.1", "@smithy/middleware-content-length": "^4.0.1", - "@smithy/middleware-endpoint": "^4.0.3", - "@smithy/middleware-retry": "^4.0.4", + "@smithy/middleware-endpoint": "^4.0.5", + "@smithy/middleware-retry": "^4.0.6", "@smithy/middleware-serde": "^4.0.2", "@smithy/middleware-stack": "^4.0.1", "@smithy/node-config-provider": "^4.0.1", "@smithy/node-http-handler": "^4.0.2", "@smithy/protocol-http": "^5.0.1", - "@smithy/smithy-client": "^4.1.3", + "@smithy/smithy-client": "^4.1.5", "@smithy/types": "^4.1.0", "@smithy/url-parser": "^4.0.1", "@smithy/util-base64": "^4.0.0", "@smithy/util-body-length-browser": "^4.0.0", "@smithy/util-body-length-node": "^4.0.0", - "@smithy/util-defaults-mode-browser": "^4.0.4", - "@smithy/util-defaults-mode-node": "^4.0.4", + "@smithy/util-defaults-mode-browser": "^4.0.6", + "@smithy/util-defaults-mode-node": "^4.0.6", "@smithy/util-endpoints": "^3.0.1", "@smithy/util-middleware": "^4.0.1", "@smithy/util-retry": "^4.0.1", @@ -724,46 +724,46 @@ } }, "node_modules/@aws-sdk/client-xray": { - "version": "3.744.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-xray/-/client-xray-3.744.0.tgz", - "integrity": "sha512-mF7foqSYyGd3KEHDcbQbLqabaoEXdc+TDEt8+figWTVGLj/+AVE9Lxk5z1IDVZTF0zQs7ATKJQInYzZNqz6Kdw==", + "version": "3.751.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-xray/-/client-xray-3.751.0.tgz", + "integrity": "sha512-FOCI4IPbulkaXi40J2NLMZH2UbsFWj9Gxpps+Zpz/qkO+ENE0K/xLDASzy/bogIKEo05yyHjBq9Dp1RT1WVSVg==", "dev": true, "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.744.0", - "@aws-sdk/credential-provider-node": "3.744.0", + "@aws-sdk/core": "3.750.0", + "@aws-sdk/credential-provider-node": "3.750.0", "@aws-sdk/middleware-host-header": "3.734.0", "@aws-sdk/middleware-logger": "3.734.0", "@aws-sdk/middleware-recursion-detection": "3.734.0", - "@aws-sdk/middleware-user-agent": "3.744.0", + "@aws-sdk/middleware-user-agent": "3.750.0", "@aws-sdk/region-config-resolver": "3.734.0", "@aws-sdk/types": "3.734.0", "@aws-sdk/util-endpoints": "3.743.0", "@aws-sdk/util-user-agent-browser": "3.734.0", - "@aws-sdk/util-user-agent-node": "3.744.0", + "@aws-sdk/util-user-agent-node": "3.750.0", "@smithy/config-resolver": "^4.0.1", - "@smithy/core": "^3.1.2", + "@smithy/core": "^3.1.4", "@smithy/fetch-http-handler": "^5.0.1", "@smithy/hash-node": "^4.0.1", "@smithy/invalid-dependency": "^4.0.1", "@smithy/middleware-content-length": "^4.0.1", - "@smithy/middleware-endpoint": "^4.0.3", - "@smithy/middleware-retry": "^4.0.4", + "@smithy/middleware-endpoint": "^4.0.5", + "@smithy/middleware-retry": "^4.0.6", "@smithy/middleware-serde": "^4.0.2", "@smithy/middleware-stack": "^4.0.1", "@smithy/node-config-provider": "^4.0.1", "@smithy/node-http-handler": "^4.0.2", "@smithy/protocol-http": "^5.0.1", - "@smithy/smithy-client": "^4.1.3", + "@smithy/smithy-client": "^4.1.5", "@smithy/types": "^4.1.0", "@smithy/url-parser": "^4.0.1", "@smithy/util-base64": "^4.0.0", "@smithy/util-body-length-browser": "^4.0.0", "@smithy/util-body-length-node": "^4.0.0", - "@smithy/util-defaults-mode-browser": "^4.0.4", - "@smithy/util-defaults-mode-node": "^4.0.4", + "@smithy/util-defaults-mode-browser": "^4.0.6", + "@smithy/util-defaults-mode-node": "^4.0.6", "@smithy/util-endpoints": "^3.0.1", "@smithy/util-middleware": "^4.0.1", "@smithy/util-retry": "^4.0.1", @@ -775,18 +775,18 @@ } }, "node_modules/@aws-sdk/core": { - "version": "3.744.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.744.0.tgz", - "integrity": "sha512-R0XLfDDq7MAXYyDf7tPb+m0R7gmzTRRDtPNQ5jvuq8dbkefph5gFMkxZ2zSx7dfTsfYHhBPuTBsQ0c5Xjal3Vg==", + "version": "3.750.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.750.0.tgz", + "integrity": "sha512-bZ5K7N5L4+Pa2epbVpUQqd1XLG2uU8BGs/Sd+2nbgTf+lNQJyIxAg/Qsrjz9MzmY8zzQIeRQEkNmR6yVAfCmmQ==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/types": "3.734.0", - "@smithy/core": "^3.1.2", + "@smithy/core": "^3.1.4", "@smithy/node-config-provider": "^4.0.1", "@smithy/property-provider": "^4.0.1", "@smithy/protocol-http": "^5.0.1", "@smithy/signature-v4": "^5.0.1", - "@smithy/smithy-client": "^4.1.3", + "@smithy/smithy-client": "^4.1.5", "@smithy/types": "^4.1.0", "@smithy/util-middleware": "^4.0.1", "fast-xml-parser": "4.4.1", @@ -797,12 +797,12 @@ } }, "node_modules/@aws-sdk/credential-provider-env": { - "version": "3.744.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.744.0.tgz", - "integrity": "sha512-hyjC7xqzAeERorYYjhQG1ivcr1XlxgfBpa+r4pG29toFG60mACyVzaR7+og3kgzjRFAB7D1imMxPQyEvQ1QokA==", + "version": "3.750.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.750.0.tgz", + "integrity": "sha512-In6bsG0p/P31HcH4DBRKBbcDS/3SHvEPjfXV8ODPWZO/l3/p7IRoYBdQ07C9R+VMZU2D0+/Sc/DWK/TUNDk1+Q==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.744.0", + "@aws-sdk/core": "3.750.0", "@aws-sdk/types": "3.734.0", "@smithy/property-provider": "^4.0.1", "@smithy/types": "^4.1.0", @@ -813,20 +813,20 @@ } }, "node_modules/@aws-sdk/credential-provider-http": { - "version": "3.744.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.744.0.tgz", - "integrity": "sha512-k+P1Tl5ewBvVByR6hB726qFIzANgQVf2cY87hZ/e09pQYlH4bfBcyY16VJhkqYnKmv6HMdWxKHX7D8nwlc8Obg==", + "version": "3.750.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.750.0.tgz", + "integrity": "sha512-wFB9qqfa20AB0dElsQz5ZlZT5o+a+XzpEpmg0erylmGYqEOvh8NQWfDUVpRmQuGq9VbvW/8cIbxPoNqEbPtuWQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.744.0", + "@aws-sdk/core": "3.750.0", "@aws-sdk/types": "3.734.0", "@smithy/fetch-http-handler": "^5.0.1", "@smithy/node-http-handler": "^4.0.2", "@smithy/property-provider": "^4.0.1", "@smithy/protocol-http": "^5.0.1", - "@smithy/smithy-client": "^4.1.3", + "@smithy/smithy-client": "^4.1.5", "@smithy/types": "^4.1.0", - "@smithy/util-stream": "^4.0.2", + "@smithy/util-stream": "^4.1.1", "tslib": "^2.6.2" }, "engines": { @@ -834,18 +834,18 @@ } }, "node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.744.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.744.0.tgz", - "integrity": "sha512-hjEWgkF86tkvg8PIsDiB3KkTj7z8ZFGR0v0OLQYD47o17q1qfoMzZmg9wae3wXp9KzU+lZETo+8oMqX9a+7aVQ==", + "version": "3.750.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.750.0.tgz", + "integrity": "sha512-2YIZmyEr5RUd3uxXpxOLD9G67Bibm4I/65M6vKFP17jVMUT+R1nL7mKqmhEVO2p+BoeV+bwMyJ/jpTYG368PCg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.744.0", - "@aws-sdk/credential-provider-env": "3.744.0", - "@aws-sdk/credential-provider-http": "3.744.0", - "@aws-sdk/credential-provider-process": "3.744.0", - "@aws-sdk/credential-provider-sso": "3.744.0", - "@aws-sdk/credential-provider-web-identity": "3.744.0", - "@aws-sdk/nested-clients": "3.744.0", + "@aws-sdk/core": "3.750.0", + "@aws-sdk/credential-provider-env": "3.750.0", + "@aws-sdk/credential-provider-http": "3.750.0", + "@aws-sdk/credential-provider-process": "3.750.0", + "@aws-sdk/credential-provider-sso": "3.750.0", + "@aws-sdk/credential-provider-web-identity": "3.750.0", + "@aws-sdk/nested-clients": "3.750.0", "@aws-sdk/types": "3.734.0", "@smithy/credential-provider-imds": "^4.0.1", "@smithy/property-provider": "^4.0.1", @@ -858,17 +858,17 @@ } }, "node_modules/@aws-sdk/credential-provider-node": { - "version": "3.744.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.744.0.tgz", - "integrity": "sha512-4oUfRd6pe/VGmKoav17pPoOO0WP0L6YXmHqtJHSDmFUOAa+Vh0ZRljTj/yBdleRgdO6rOfdWqoGLFSFiAZDrsQ==", + "version": "3.750.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.750.0.tgz", + "integrity": "sha512-THWHHAceLwsOiowPEmKyhWVDlEUxH07GHSw5AQFDvNQtGKOQl0HSIFO1mKObT2Q2Vqzji9Bq8H58SO5BFtNPRw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/credential-provider-env": "3.744.0", - "@aws-sdk/credential-provider-http": "3.744.0", - "@aws-sdk/credential-provider-ini": "3.744.0", - "@aws-sdk/credential-provider-process": "3.744.0", - "@aws-sdk/credential-provider-sso": "3.744.0", - "@aws-sdk/credential-provider-web-identity": "3.744.0", + "@aws-sdk/credential-provider-env": "3.750.0", + "@aws-sdk/credential-provider-http": "3.750.0", + "@aws-sdk/credential-provider-ini": "3.750.0", + "@aws-sdk/credential-provider-process": "3.750.0", + "@aws-sdk/credential-provider-sso": "3.750.0", + "@aws-sdk/credential-provider-web-identity": "3.750.0", "@aws-sdk/types": "3.734.0", "@smithy/credential-provider-imds": "^4.0.1", "@smithy/property-provider": "^4.0.1", @@ -881,12 +881,12 @@ } }, "node_modules/@aws-sdk/credential-provider-process": { - "version": "3.744.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.744.0.tgz", - "integrity": "sha512-m0d/pDBIaiEAAxWXt/c79RHsKkUkyPOvF2SAMRddVhhOt1GFZI4ml+3f4drmAZfXldIyJmvJTJJqWluVPwTIqQ==", + "version": "3.750.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.750.0.tgz", + "integrity": "sha512-Q78SCH1n0m7tpu36sJwfrUSxI8l611OyysjQeMiIOliVfZICEoHcLHLcLkiR+tnIpZ3rk7d2EQ6R1jwlXnalMQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.744.0", + "@aws-sdk/core": "3.750.0", "@aws-sdk/types": "3.734.0", "@smithy/property-provider": "^4.0.1", "@smithy/shared-ini-file-loader": "^4.0.1", @@ -898,14 +898,14 @@ } }, "node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.744.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.744.0.tgz", - "integrity": "sha512-xdMufTZOvpbDoDPI2XLu0/Rg3qJ/txpS8IJR63NsCGotHJZ/ucLNKwTcGS40hllZB8qSHTlvmlOzElDahTtx/A==", + "version": "3.750.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.750.0.tgz", + "integrity": "sha512-FGYrDjXN/FOQVi/t8fHSv8zCk+NEvtFnuc4cZUj5OIbM4vrfFc5VaPyn41Uza3iv6Qq9rZg0QOwWnqK8lNrqUw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/client-sso": "3.744.0", - "@aws-sdk/core": "3.744.0", - "@aws-sdk/token-providers": "3.744.0", + "@aws-sdk/client-sso": "3.750.0", + "@aws-sdk/core": "3.750.0", + "@aws-sdk/token-providers": "3.750.0", "@aws-sdk/types": "3.734.0", "@smithy/property-provider": "^4.0.1", "@smithy/shared-ini-file-loader": "^4.0.1", @@ -917,13 +917,13 @@ } }, "node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.744.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.744.0.tgz", - "integrity": "sha512-cNk93GZxORzqEojWfXdrPBF6a7Nu3LpPCWG5mV+lH2tbuGsmw6XhKkwpt7o+OiIP4tKCpHlvqOD8f1nmhe1KDA==", + "version": "3.750.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.750.0.tgz", + "integrity": "sha512-Nz8zs3YJ+GOTSrq+LyzbbC1Ffpt7pK38gcOyNZv76pP5MswKTUKNYBJehqwa+i7FcFQHsCk3TdhR8MT1ZR23uA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.744.0", - "@aws-sdk/nested-clients": "3.744.0", + "@aws-sdk/core": "3.750.0", + "@aws-sdk/nested-clients": "3.750.0", "@aws-sdk/types": "3.734.0", "@smithy/property-provider": "^4.0.1", "@smithy/types": "^4.1.0", @@ -947,15 +947,15 @@ } }, "node_modules/@aws-sdk/lib-dynamodb": { - "version": "3.744.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/lib-dynamodb/-/lib-dynamodb-3.744.0.tgz", - "integrity": "sha512-oUUy6ScyyAvAXgZwLAphjLGBbiR0cYUPyYF6KBlLQ4eliYjnymcMNF1q+gRgXjDrlM5YY/9HXqdg/DF5Gue9CQ==", + "version": "3.751.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/lib-dynamodb/-/lib-dynamodb-3.751.0.tgz", + "integrity": "sha512-x8p/TL+ODkZWzqV23t4bX2prgu3bYDpsv7jrJzhGS+5r0jzYKo0I8dSbdxDaE7s3uJZNHs7IATDMuT/iut7eHQ==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.744.0", - "@aws-sdk/util-dynamodb": "3.744.0", - "@smithy/core": "^3.1.2", - "@smithy/smithy-client": "^4.1.3", + "@aws-sdk/core": "3.750.0", + "@aws-sdk/util-dynamodb": "3.751.0", + "@smithy/core": "^3.1.4", + "@smithy/smithy-client": "^4.1.5", "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, @@ -963,7 +963,7 @@ "node": ">=18.0.0" }, "peerDependencies": { - "@aws-sdk/client-dynamodb": "^3.744.0" + "@aws-sdk/client-dynamodb": "^3.751.0" } }, "node_modules/@aws-sdk/middleware-endpoint-discovery": { @@ -1028,15 +1028,15 @@ } }, "node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.744.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.744.0.tgz", - "integrity": "sha512-ROUbDQHfVWiBHXd4m9E9mKj1Azby8XCs8RC8OCf9GVH339GSE6aMrPJSzMlsV1LmzPdPIypgp5qqh5NfSrKztg==", + "version": "3.750.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.750.0.tgz", + "integrity": "sha512-YYcslDsP5+2NZoN3UwuhZGkhAHPSli7HlJHBafBrvjGV/I9f8FuOO1d1ebxGdEP4HyRXUGyh+7Ur4q+Psk0ryw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.744.0", + "@aws-sdk/core": "3.750.0", "@aws-sdk/types": "3.734.0", "@aws-sdk/util-endpoints": "3.743.0", - "@smithy/core": "^3.1.2", + "@smithy/core": "^3.1.4", "@smithy/protocol-http": "^5.0.1", "@smithy/types": "^4.1.0", "tslib": "^2.6.2" @@ -1046,44 +1046,44 @@ } }, "node_modules/@aws-sdk/nested-clients": { - "version": "3.744.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.744.0.tgz", - "integrity": "sha512-Mnrlh4lRY1gZQnKvN2Lh/5WXcGkzC41NM93mtn2uaqOh+DZLCXCttNCfbUesUvYJLOo3lYaOpiDsjTkPVB1yjw==", + "version": "3.750.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.750.0.tgz", + "integrity": "sha512-OH68BRF0rt9nDloq4zsfeHI0G21lj11a66qosaljtEP66PWm7tQ06feKbFkXHT5E1K3QhJW3nVyK8v2fEBY5fg==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.744.0", + "@aws-sdk/core": "3.750.0", "@aws-sdk/middleware-host-header": "3.734.0", "@aws-sdk/middleware-logger": "3.734.0", "@aws-sdk/middleware-recursion-detection": "3.734.0", - "@aws-sdk/middleware-user-agent": "3.744.0", + "@aws-sdk/middleware-user-agent": "3.750.0", "@aws-sdk/region-config-resolver": "3.734.0", "@aws-sdk/types": "3.734.0", "@aws-sdk/util-endpoints": "3.743.0", "@aws-sdk/util-user-agent-browser": "3.734.0", - "@aws-sdk/util-user-agent-node": "3.744.0", + "@aws-sdk/util-user-agent-node": "3.750.0", "@smithy/config-resolver": "^4.0.1", - "@smithy/core": "^3.1.2", + "@smithy/core": "^3.1.4", "@smithy/fetch-http-handler": "^5.0.1", "@smithy/hash-node": "^4.0.1", "@smithy/invalid-dependency": "^4.0.1", "@smithy/middleware-content-length": "^4.0.1", - "@smithy/middleware-endpoint": "^4.0.3", - "@smithy/middleware-retry": "^4.0.4", + "@smithy/middleware-endpoint": "^4.0.5", + "@smithy/middleware-retry": "^4.0.6", "@smithy/middleware-serde": "^4.0.2", "@smithy/middleware-stack": "^4.0.1", "@smithy/node-config-provider": "^4.0.1", "@smithy/node-http-handler": "^4.0.2", "@smithy/protocol-http": "^5.0.1", - "@smithy/smithy-client": "^4.1.3", + "@smithy/smithy-client": "^4.1.5", "@smithy/types": "^4.1.0", "@smithy/url-parser": "^4.0.1", "@smithy/util-base64": "^4.0.0", "@smithy/util-body-length-browser": "^4.0.0", "@smithy/util-body-length-node": "^4.0.0", - "@smithy/util-defaults-mode-browser": "^4.0.4", - "@smithy/util-defaults-mode-node": "^4.0.4", + "@smithy/util-defaults-mode-browser": "^4.0.6", + "@smithy/util-defaults-mode-node": "^4.0.6", "@smithy/util-endpoints": "^3.0.1", "@smithy/util-middleware": "^4.0.1", "@smithy/util-retry": "^4.0.1", @@ -1112,12 +1112,12 @@ } }, "node_modules/@aws-sdk/token-providers": { - "version": "3.744.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.744.0.tgz", - "integrity": "sha512-v/1+lWkDCd60Ei6oyhJqli6mTsPEVepLoSMB50vHUVlJP0fzXu/3FMje90/RzeUoh/VugZQJCEv/NNpuC6wztg==", + "version": "3.750.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.750.0.tgz", + "integrity": "sha512-X/KzqZw41iWolwNdc8e3RMcNSMR364viHv78u6AefXOO5eRM40c4/LuST1jDzq35/LpnqRhL7/MuixOetw+sFw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/nested-clients": "3.744.0", + "@aws-sdk/nested-clients": "3.750.0", "@aws-sdk/types": "3.734.0", "@smithy/property-provider": "^4.0.1", "@smithy/shared-ini-file-loader": "^4.0.1", @@ -1142,9 +1142,9 @@ } }, "node_modules/@aws-sdk/util-dynamodb": { - "version": "3.744.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-dynamodb/-/util-dynamodb-3.744.0.tgz", - "integrity": "sha512-cJXZorexgIDW6GAxp2q5ivXGTR1LjaQ4VWHL7/FsfsQJtjQcRnI3/Yycx9X8RuU0JL0++ggzgh1lx8Y17jVPuA==", + "version": "3.751.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-dynamodb/-/util-dynamodb-3.751.0.tgz", + "integrity": "sha512-+dFK+SqM6CLcGIXYGl8f65aCnhYtty3dSmmGqd/VMi8cfAeVLZpS77LqanCJylbp607mjNQODY0ZnU38P/tYuA==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -1153,7 +1153,7 @@ "node": ">=18.0.0" }, "peerDependencies": { - "@aws-sdk/client-dynamodb": "^3.744.0" + "@aws-sdk/client-dynamodb": "^3.751.0" } }, "node_modules/@aws-sdk/util-endpoints": { @@ -1195,12 +1195,12 @@ } }, "node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.744.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.744.0.tgz", - "integrity": "sha512-BJURjwIXhNa4heXkLC0+GcL+8wVXaU7JoyW6ckdvp93LL+sVHeR1d5FxXZHQW/pMI4E3gNlKyBqjKaT75tObNQ==", + "version": "3.750.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.750.0.tgz", + "integrity": "sha512-84HJj9G9zbrHX2opLk9eHfDceB+UIHVrmflMzWHpsmo9fDuro/flIBqaVDlE021Osj6qIM0SJJcnL6s23j7JEw==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/middleware-user-agent": "3.744.0", + "@aws-sdk/middleware-user-agent": "3.750.0", "@aws-sdk/types": "3.734.0", "@smithy/node-config-provider": "^4.0.1", "@smithy/types": "^4.1.0", @@ -2886,9 +2886,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.34.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.34.3.tgz", - "integrity": "sha512-8kq/NjMKkMTGKMPldWihncOl62kgnLYk7cW+/4NCUWfS70/wz4+gQ7rMxMMpZ3dIOP/xw7wKNzIuUnN/H2GfUg==", + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.34.8.tgz", + "integrity": "sha512-q217OSE8DTp8AFHuNHXo0Y86e1wtlfVrXiAlwkIvGRQv9zbc6mE3sjIVfwI8sYUyNxwOg0j/Vm1RKM04JcWLJw==", "cpu": [ "arm" ], @@ -2900,9 +2900,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.34.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.34.3.tgz", - "integrity": "sha512-1PqMHiuRochQ6++SDI7SaRDWJKr/NgAlezBi5nOne6Da6IWJo3hK0TdECBDwd92IUDPG4j/bZmWuwOnomNT8wA==", + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.34.8.tgz", + "integrity": "sha512-Gigjz7mNWaOL9wCggvoK3jEIUUbGul656opstjaUSGC3eT0BM7PofdAJaBfPFWWkXNVAXbaQtC99OCg4sJv70Q==", "cpu": [ "arm64" ], @@ -2914,9 +2914,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.34.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.34.3.tgz", - "integrity": "sha512-fqbrykX4mGV3DlCDXhF4OaMGcchd2tmLYxVt3On5oOZWVDFfdEoYAV2alzNChl8OzNaeMAGqm1f7gk7eIw/uDg==", + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.34.8.tgz", + "integrity": "sha512-02rVdZ5tgdUNRxIUrFdcMBZQoaPMrxtwSb+/hOfBdqkatYHR3lZ2A2EGyHq2sGOd0Owk80oV3snlDASC24He3Q==", "cpu": [ "arm64" ], @@ -2928,9 +2928,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.34.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.34.3.tgz", - "integrity": "sha512-8Wxrx/KRvMsTyLTbdrMXcVKfpW51cCNW8x7iQD72xSEbjvhCY3b+w83Bea3nQfysTMR7K28esc+ZFITThXm+1w==", + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.34.8.tgz", + "integrity": "sha512-qIP/elwR/tq/dYRx3lgwK31jkZvMiD6qUtOycLhTzCvrjbZ3LjQnEM9rNhSGpbLXVJYQ3rq39A6Re0h9tU2ynw==", "cpu": [ "x64" ], @@ -2942,9 +2942,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.34.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.34.3.tgz", - "integrity": "sha512-lpBmV2qSiELh+ATQPTjQczt5hvbTLsE0c43Rx4bGxN2VpnAZWy77we7OO62LyOSZNY7CzjMoceRPc+Lt4e9J6A==", + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.34.8.tgz", + "integrity": "sha512-IQNVXL9iY6NniYbTaOKdrlVP3XIqazBgJOVkddzJlqnCpRi/yAeSOa8PLcECFSQochzqApIOE1GHNu3pCz+BDA==", "cpu": [ "arm64" ], @@ -2956,9 +2956,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.34.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.34.3.tgz", - "integrity": "sha512-sNPvBIXpgaYcI6mAeH13GZMXFrrw5mdZVI1M9YQPRG2LpjwL8DSxSIflZoh/B5NEuOi53kxsR/S2GKozK1vDXA==", + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.34.8.tgz", + "integrity": "sha512-TYXcHghgnCqYFiE3FT5QwXtOZqDj5GmaFNTNt3jNC+vh22dc/ukG2cG+pi75QO4kACohZzidsq7yKTKwq/Jq7Q==", "cpu": [ "x64" ], @@ -2970,9 +2970,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.34.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.34.3.tgz", - "integrity": "sha512-MW6N3AoC61OfE1VgnN5O1OW0gt8VTbhx9s/ZEPLBM11wEdHjeilPzOxVmmsrx5YmejpGPvez8QwGGvMU+pGxpw==", + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.34.8.tgz", + "integrity": "sha512-A4iphFGNkWRd+5m3VIGuqHnG3MVnqKe7Al57u9mwgbyZ2/xF9Jio72MaY7xxh+Y87VAHmGQr73qoKL9HPbXj1g==", "cpu": [ "arm" ], @@ -2984,9 +2984,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.34.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.34.3.tgz", - "integrity": "sha512-2SQkhr5xvatYq0/+H6qyW0zvrQz9LM4lxGkpWURLoQX5+yP8MsERh4uWmxFohOvwCP6l/+wgiHZ1qVwLDc7Qmw==", + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.34.8.tgz", + "integrity": "sha512-S0lqKLfTm5u+QTxlFiAnb2J/2dgQqRy/XvziPtDd1rKZFXHTyYLoVL58M/XFwDI01AQCDIevGLbQrMAtdyanpA==", "cpu": [ "arm" ], @@ -2998,9 +2998,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.34.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.34.3.tgz", - "integrity": "sha512-R3JLYt8YoRwKI5shJsovLpcR6pwIMui/MGG/MmxZ1DYI3iRSKI4qcYrvYgDf4Ss2oCR3RL3F3dYK7uAGQgMIuQ==", + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.34.8.tgz", + "integrity": "sha512-jpz9YOuPiSkL4G4pqKrus0pn9aYwpImGkosRKwNi+sJSkz+WU3anZe6hi73StLOQdfXYXC7hUfsQlTnjMd3s1A==", "cpu": [ "arm64" ], @@ -3012,9 +3012,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.34.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.34.3.tgz", - "integrity": "sha512-4XQhG8v/t3S7Rxs7rmFUuM6j09hVrTArzONS3fUZ6oBRSN/ps9IPQjVhp62P0W3KhqJdQADo/MRlYRMdgxr/3w==", + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.34.8.tgz", + "integrity": "sha512-KdSfaROOUJXgTVxJNAZ3KwkRc5nggDk+06P6lgi1HLv1hskgvxHUKZ4xtwHkVYJ1Rep4GNo+uEfycCRRxht7+Q==", "cpu": [ "arm64" ], @@ -3026,9 +3026,9 @@ ] }, "node_modules/@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.34.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.34.3.tgz", - "integrity": "sha512-QlW1jCUZ1LHUIYCAK2FciVw1ptHsxzApYVi05q7bz2A8oNE8QxQ85NhM4arLxkAlcnS42t4avJbSfzSQwbIaKg==", + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.34.8.tgz", + "integrity": "sha512-NyF4gcxwkMFRjgXBM6g2lkT58OWztZvw5KkV2K0qqSnUEqCVcqdh2jN4gQrTn/YUpAcNKyFHfoOZEer9nwo6uQ==", "cpu": [ "loong64" ], @@ -3040,9 +3040,9 @@ ] }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.34.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.34.3.tgz", - "integrity": "sha512-kMbLToizVeCcN69+nnm20Dh0hrRIAjgaaL+Wh0gWZcNt8e542d2FUGtsyuNsHVNNF3gqTJrpzUGIdwMGLEUM7g==", + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.34.8.tgz", + "integrity": "sha512-LMJc999GkhGvktHU85zNTDImZVUCJ1z/MbAJTnviiWmmjyckP5aQsHtcujMjpNdMZPT2rQEDBlJfubhs3jsMfw==", "cpu": [ "ppc64" ], @@ -3054,9 +3054,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.34.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.34.3.tgz", - "integrity": "sha512-YgD0DnZ3CHtvXRH8rzjVSxwI0kMTr0RQt3o1N92RwxGdx7YejzbBO0ELlSU48DP96u1gYYVWfUhDRyaGNqJqJg==", + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.34.8.tgz", + "integrity": "sha512-xAQCAHPj8nJq1PI3z8CIZzXuXCstquz7cIOL73HHdXiRcKk8Ywwqtx2wrIy23EcTn4aZ2fLJNBB8d0tQENPCmw==", "cpu": [ "riscv64" ], @@ -3068,9 +3068,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.34.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.34.3.tgz", - "integrity": "sha512-dIOoOz8altjp6UjAi3U9EW99s8nta4gzi52FeI45GlPyrUH4QixUoBMH9VsVjt+9A2RiZBWyjYNHlJ/HmJOBCQ==", + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.34.8.tgz", + "integrity": "sha512-DdePVk1NDEuc3fOe3dPPTb+rjMtuFw89gw6gVWxQFAuEqqSdDKnrwzZHrUYdac7A7dXl9Q2Vflxpme15gUWQFA==", "cpu": [ "s390x" ], @@ -3082,9 +3082,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.34.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.34.3.tgz", - "integrity": "sha512-lOyG3aF4FTKrhpzXfMmBXgeKUUXdAWmP2zSNf8HTAXPqZay6QYT26l64hVizBjq+hJx3pl0DTEyvPi9sTA6VGA==", + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.34.8.tgz", + "integrity": "sha512-8y7ED8gjxITUltTUEJLQdgpbPh1sUQ0kMTmufRF/Ns5tI9TNMNlhWtmPKKHCU0SilX+3MJkZ0zERYYGIVBYHIA==", "cpu": [ "x64" ], @@ -3096,9 +3096,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.34.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.34.3.tgz", - "integrity": "sha512-usztyYLu2i+mYzzOjqHZTaRXbUOqw3P6laNUh1zcqxbPH1P2Tz/QdJJCQSnGxCtsRQeuU2bCyraGMtMumC46rw==", + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.34.8.tgz", + "integrity": "sha512-SCXcP0ZpGFIe7Ge+McxY5zKxiEI5ra+GT3QRxL0pMMtxPfpyLAKleZODi1zdRHkz5/BhueUrYtYVgubqe9JBNQ==", "cpu": [ "x64" ], @@ -3110,9 +3110,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.34.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.34.3.tgz", - "integrity": "sha512-ojFOKaz/ZyalIrizdBq2vyc2f0kFbJahEznfZlxdB6pF9Do6++i1zS5Gy6QLf8D7/S57MHrmBLur6AeRYeQXSA==", + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.34.8.tgz", + "integrity": "sha512-YHYsgzZgFJzTRbth4h7Or0m5O74Yda+hLin0irAIobkLQFRQd1qWmnoVfwmKm9TXIZVAD0nZ+GEb2ICicLyCnQ==", "cpu": [ "arm64" ], @@ -3124,9 +3124,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.34.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.34.3.tgz", - "integrity": "sha512-K/V97GMbNa+Da9mGcZqmSl+DlJmWfHXTuI9V8oB2evGsQUtszCl67+OxWjBKpeOnYwox9Jpmt/J6VhpeRCYqow==", + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.34.8.tgz", + "integrity": "sha512-r3NRQrXkHr4uWy5TOjTpTYojR9XmF0j/RYgKCef+Ag46FWUTltm5ziticv8LdNsDMehjJ543x/+TJAek/xBA2w==", "cpu": [ "ia32" ], @@ -3138,9 +3138,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.34.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.34.3.tgz", - "integrity": "sha512-CUypcYP31Q8O04myV6NKGzk9GVXslO5EJNfmARNSzLF2A+5rmZUlDJ4et6eoJaZgBT9wrC2p4JZH04Vkic8HdQ==", + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.34.8.tgz", + "integrity": "sha512-U0FaE5O1BCpZSeE6gBl3c5ObhePQSfk9vDRToMmTkbhCOgW4jqvtS5LGyQ76L1fH8sM0keRp4uDTsbjiUyjk0g==", "cpu": [ "x64" ], @@ -3557,9 +3557,9 @@ } }, "node_modules/@smithy/core": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.1.2.tgz", - "integrity": "sha512-htwQXkbdF13uwwDevz9BEzL5ABK+1sJpVQXywwGSH973AVOvisHNfpcB8A8761G6XgHoS2kHPqc9DqHJ2gp+/Q==", + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.1.4.tgz", + "integrity": "sha512-wFExFGK+7r2wYriOqe7RRIBNpvxwiS95ih09+GSLRBdoyK/O1uZA7K7pKesj5CBvwJuSBeXwLyR88WwIAY+DGA==", "license": "Apache-2.0", "dependencies": { "@smithy/middleware-serde": "^4.0.2", @@ -3567,7 +3567,7 @@ "@smithy/types": "^4.1.0", "@smithy/util-body-length-browser": "^4.0.0", "@smithy/util-middleware": "^4.0.1", - "@smithy/util-stream": "^4.0.2", + "@smithy/util-stream": "^4.1.1", "@smithy/util-utf8": "^4.0.0", "tslib": "^2.6.2" }, @@ -3717,13 +3717,13 @@ } }, "node_modules/@smithy/middleware-compression": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@smithy/middleware-compression/-/middleware-compression-4.0.3.tgz", - "integrity": "sha512-wky+QPiimetgx0jKDQ6vOkOKwDWmDpc1oh/ji8ILJrvZrlO4+RGB1tPwLrrRuNjTbGsSBzpvGqXIYlxkYg4pcg==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/middleware-compression/-/middleware-compression-4.0.5.tgz", + "integrity": "sha512-qWf/l4kKnGxOBOIbNL2bW1D4g19hBufj3DUOwkW9nqmn5Ml2fcZD5kRJvGs6xbxNS8pv2fJMom5ZB6+EhepMIg==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.1.2", + "@smithy/core": "^3.1.4", "@smithy/is-array-buffer": "^4.0.0", "@smithy/node-config-provider": "^4.0.1", "@smithy/protocol-http": "^5.0.1", @@ -3753,12 +3753,12 @@ } }, "node_modules/@smithy/middleware-endpoint": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.0.3.tgz", - "integrity": "sha512-YdbmWhQF5kIxZjWqPIgboVfi8i5XgiYMM7GGKFMTvBei4XjNQfNv8sukT50ITvgnWKKKpOtp0C0h7qixLgb77Q==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.0.5.tgz", + "integrity": "sha512-cPzGZV7qStHwboFrm6GfrzQE+YDiCzWcTh4+7wKrP/ZQ4gkw+r7qDjV8GjM4N0UYsuUyLfpzLGg5hxsYTU11WA==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.1.2", + "@smithy/core": "^3.1.4", "@smithy/middleware-serde": "^4.0.2", "@smithy/node-config-provider": "^4.0.1", "@smithy/shared-ini-file-loader": "^4.0.1", @@ -3772,15 +3772,15 @@ } }, "node_modules/@smithy/middleware-retry": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.0.4.tgz", - "integrity": "sha512-wmxyUBGHaYUqul0wZiset4M39SMtDBOtUr2KpDuftKNN74Do9Y36Go6Eqzj9tL0mIPpr31ulB5UUtxcsCeGXsQ==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.0.6.tgz", + "integrity": "sha512-s8QzuOQnbdvRymD9Gt9c9zMq10wUQAHQ3z72uirrBHCwZcLTrL5iCOuVTMdka2IXOYhQE890WD5t6G24+F+Qcg==", "license": "Apache-2.0", "dependencies": { "@smithy/node-config-provider": "^4.0.1", "@smithy/protocol-http": "^5.0.1", "@smithy/service-error-classification": "^4.0.1", - "@smithy/smithy-client": "^4.1.3", + "@smithy/smithy-client": "^4.1.5", "@smithy/types": "^4.1.0", "@smithy/util-middleware": "^4.0.1", "@smithy/util-retry": "^4.0.1", @@ -3946,17 +3946,17 @@ } }, "node_modules/@smithy/smithy-client": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.1.3.tgz", - "integrity": "sha512-A2Hz85pu8BJJaYFdX8yb1yocqigyqBzn+OVaVgm+Kwi/DkN8vhN2kbDVEfADo6jXf5hPKquMLGA3UINA64UZ7A==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.1.5.tgz", + "integrity": "sha512-DMXYoYeL4QkElr216n1yodTFeATbfb4jwYM9gKn71Rw/FNA1/Sm36tkTSCsZEs7mgpG3OINmkxL9vgVFzyGPaw==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.1.2", - "@smithy/middleware-endpoint": "^4.0.3", + "@smithy/core": "^3.1.4", + "@smithy/middleware-endpoint": "^4.0.5", "@smithy/middleware-stack": "^4.0.1", "@smithy/protocol-http": "^5.0.1", "@smithy/types": "^4.1.0", - "@smithy/util-stream": "^4.0.2", + "@smithy/util-stream": "^4.1.1", "tslib": "^2.6.2" }, "engines": { @@ -4048,13 +4048,13 @@ } }, "node_modules/@smithy/util-defaults-mode-browser": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.0.4.tgz", - "integrity": "sha512-Ej1bV5sbrIfH++KnWxjjzFNq9nyP3RIUq2c9Iqq7SmMO/idUR24sqvKH2LUQFTSPy/K7G4sB2m8n7YYlEAfZaw==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.0.6.tgz", + "integrity": "sha512-N8+VCt+piupH1A7DgSVDNrVHqRLz8r6DvBkpS7EWHiIxsUk4jqGuQLjqC/gnCzmwGkVBdNruHoYAzzaSQ8e80w==", "license": "Apache-2.0", "dependencies": { "@smithy/property-provider": "^4.0.1", - "@smithy/smithy-client": "^4.1.3", + "@smithy/smithy-client": "^4.1.5", "@smithy/types": "^4.1.0", "bowser": "^2.11.0", "tslib": "^2.6.2" @@ -4064,16 +4064,16 @@ } }, "node_modules/@smithy/util-defaults-mode-node": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.0.4.tgz", - "integrity": "sha512-HE1I7gxa6yP7ZgXPCFfZSDmVmMtY7SHqzFF55gM/GPegzZKaQWZZ+nYn9C2Cc3JltCMyWe63VPR3tSFDEvuGjw==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.0.6.tgz", + "integrity": "sha512-9zhx1shd1VwSSVvLZB8CM3qQ3RPD3le7A3h/UPuyh/PC7g4OaWDi2xUNzamsVoSmCGtmUBONl56lM2EU6LcH7A==", "license": "Apache-2.0", "dependencies": { "@smithy/config-resolver": "^4.0.1", "@smithy/credential-provider-imds": "^4.0.1", "@smithy/node-config-provider": "^4.0.1", "@smithy/property-provider": "^4.0.1", - "@smithy/smithy-client": "^4.1.3", + "@smithy/smithy-client": "^4.1.5", "@smithy/types": "^4.1.0", "tslib": "^2.6.2" }, @@ -4134,9 +4134,9 @@ } }, "node_modules/@smithy/util-stream": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.0.2.tgz", - "integrity": "sha512-0eZ4G5fRzIoewtHtwaYyl8g2C+osYOT4KClXgfdNEDAgkbe2TYPqcnw4GAWabqkZCax2ihRGPe9LZnsPdIUIHA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.1.1.tgz", + "integrity": "sha512-+Xvh8nhy0Wjv1y71rBVyV3eJU3356XsFQNI8dEZVNrQju7Eib8G31GWtO+zMa9kTCGd41Mflu+ZKfmQL/o2XzQ==", "license": "Apache-2.0", "dependencies": { "@smithy/fetch-http-handler": "^5.0.1", @@ -4302,9 +4302,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "22.13.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.1.tgz", - "integrity": "sha512-jK8uzQlrvXqEU91UxiK5J7pKHyzgnI1Qnl0QDHIgVGuolJhRb9EEl28Cj9b3rGR8B2lhFCtvIm5os8lFnO/1Ew==", + "version": "22.13.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.13.4.tgz", + "integrity": "sha512-ywP2X0DYtX3y08eFVx5fNIw7/uIv8hYUKgXoK8oayJlLnKcRfEYCxWMVE1XagUdVtCJlZT1AU4LXEABW+L1Peg==", "license": "MIT", "dependencies": { "undici-types": "~6.20.0" @@ -4359,9 +4359,9 @@ "integrity": "sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==" }, "node_modules/@vitest/coverage-v8": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-3.0.5.tgz", - "integrity": "sha512-zOOWIsj5fHh3jjGwQg+P+J1FW3s4jBu1Zqga0qW60yutsBtqEqNEJKWYh7cYn1yGD+1bdPsPdC/eL4eVK56xMg==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-3.0.6.tgz", + "integrity": "sha512-JRTlR8Bw+4BcmVTICa7tJsxqphAktakiLsAmibVLAWbu1lauFddY/tXeM6sAyl1cgkPuXtpnUgaCPhTdz1Qapg==", "dev": true, "license": "MIT", "dependencies": { @@ -4382,8 +4382,8 @@ "url": "https://opencollective.com/vitest" }, "peerDependencies": { - "@vitest/browser": "3.0.5", - "vitest": "3.0.5" + "@vitest/browser": "3.0.6", + "vitest": "3.0.6" }, "peerDependenciesMeta": { "@vitest/browser": { @@ -4435,15 +4435,15 @@ } }, "node_modules/@vitest/expect": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.0.5.tgz", - "integrity": "sha512-nNIOqupgZ4v5jWuQx2DSlHLEs7Q4Oh/7AYwNyE+k0UQzG7tSmjPXShUikn1mpNGzYEN2jJbTvLejwShMitovBA==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.0.6.tgz", + "integrity": "sha512-zBduHf/ja7/QRX4HdP1DSq5XrPgdN+jzLOwaTq/0qZjYfgETNFCKf9nOAp2j3hmom3oTbczuUzrzg9Hafh7hNg==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/spy": "3.0.5", - "@vitest/utils": "3.0.5", - "chai": "^5.1.2", + "@vitest/spy": "3.0.6", + "@vitest/utils": "3.0.6", + "chai": "^5.2.0", "tinyrainbow": "^2.0.0" }, "funding": { @@ -4451,13 +4451,13 @@ } }, "node_modules/@vitest/mocker": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.0.5.tgz", - "integrity": "sha512-CLPNBFBIE7x6aEGbIjaQAX03ZZlBMaWwAjBdMkIf/cAn6xzLTiM3zYqO/WAbieEjsAZir6tO71mzeHZoodThvw==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.0.6.tgz", + "integrity": "sha512-KPztr4/tn7qDGZfqlSPQoF2VgJcKxnDNhmfR3VgZ6Fy1bO8T9Fc1stUiTXtqz0yG24VpD00pZP5f8EOFknjNuQ==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/spy": "3.0.5", + "@vitest/spy": "3.0.6", "estree-walker": "^3.0.3", "magic-string": "^0.30.17" }, @@ -4478,9 +4478,9 @@ } }, "node_modules/@vitest/pretty-format": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.0.5.tgz", - "integrity": "sha512-CjUtdmpOcm4RVtB+up8r2vVDLR16Mgm/bYdkGFe3Yj/scRfCpbSi2W/BDSDcFK7ohw8UXvjMbOp9H4fByd/cOA==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.0.6.tgz", + "integrity": "sha512-Zyctv3dbNL+67qtHfRnUE/k8qxduOamRfAL1BurEIQSyOEFffoMvx2pnDSSbKAAVxY0Ej2J/GH2dQKI0W2JyVg==", "dev": true, "license": "MIT", "dependencies": { @@ -4490,10 +4490,39 @@ "url": "https://opencollective.com/vitest" } }, + "node_modules/@vitest/runner": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.0.6.tgz", + "integrity": "sha512-JopP4m/jGoaG1+CBqubV/5VMbi7L+NQCJTu1J1Pf6YaUbk7bZtaq5CX7p+8sY64Sjn1UQ1XJparHfcvTTdu9cA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "3.0.6", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/snapshot": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.0.6.tgz", + "integrity": "sha512-qKSmxNQwT60kNwwJHMVwavvZsMGXWmngD023OHSgn873pV0lylK7dwBTfYP7e4URy5NiBCHHiQGA9DHkYkqRqg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "3.0.6", + "magic-string": "^0.30.17", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, "node_modules/@vitest/spy": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.0.5.tgz", - "integrity": "sha512-5fOzHj0WbUNqPK6blI/8VzZdkBlQLnT25knX0r4dbZI9qoZDf3qAdjoMmDcLG5A83W6oUUFJgUd0EYBc2P5xqg==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.0.6.tgz", + "integrity": "sha512-HfOGx/bXtjy24fDlTOpgiAEJbRfFxoX3zIGagCqACkFKKZ/TTOE6gYMKXlqecvxEndKFuNHcHqP081ggZ2yM0Q==", "dev": true, "license": "MIT", "dependencies": { @@ -4504,14 +4533,14 @@ } }, "node_modules/@vitest/utils": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.0.5.tgz", - "integrity": "sha512-N9AX0NUoUtVwKwy21JtwzaqR5L5R5A99GAbrHfCCXK1lp593i/3AZAXhSP43wRQuxYsflrdzEfXZFo1reR1Nkg==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.0.6.tgz", + "integrity": "sha512-18ktZpf4GQFTbf9jK543uspU03Q2qya7ZGya5yiZ0Gx0nnnalBvd5ZBislbl2EhLjM8A8rt4OilqKG7QwcGkvQ==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "3.0.5", - "loupe": "^3.1.2", + "@vitest/pretty-format": "3.0.6", + "loupe": "^3.1.3", "tinyrainbow": "^2.0.0" }, "funding": { @@ -4639,6 +4668,22 @@ "node": ">=8" } }, + "node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, "node_modules/ansi-colors": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", @@ -4751,6 +4796,7 @@ "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" } @@ -4799,24 +4845,24 @@ } }, "node_modules/aws-cdk": { - "version": "2.178.1", - "resolved": "https://registry.npmjs.org/aws-cdk/-/aws-cdk-2.178.1.tgz", - "integrity": "sha512-64z9ARFI90jhX6sfjqqJghGxkfh1T4STxY3ccuRY8OxzAK1FY6XLjKBxSyXi9jJFa3v9nN57x7W32u4hZDj6gw==", + "version": "2.1000.2", + "resolved": "https://registry.npmjs.org/aws-cdk/-/aws-cdk-2.1000.2.tgz", + "integrity": "sha512-QsXqJhGWjHNqP7etgE3sHOTiDBXItmSKdFKgsm1qPMBabCMyFfmWZnEeUxfZ4sMaIoxvLpr3sqoWSNeLuUk4sg==", "license": "Apache-2.0", "bin": { "cdk": "bin/cdk" }, "engines": { - "node": ">= 14.15.0" + "node": ">= 16.0.0" }, "optionalDependencies": { "fsevents": "2.3.2" } }, "node_modules/aws-cdk-lib": { - "version": "2.178.1", - "resolved": "https://registry.npmjs.org/aws-cdk-lib/-/aws-cdk-lib-2.178.1.tgz", - "integrity": "sha512-Sl6/posIlvfoD3ILHlABaCVw2C84jbhlQ+mA8J3DEFbN2RvrPkG4dz4HQfC5IiXQJigu39kmj73JPQCnSKl2iA==", + "version": "2.179.0", + "resolved": "https://registry.npmjs.org/aws-cdk-lib/-/aws-cdk-lib-2.179.0.tgz", + "integrity": "sha512-fwkoEzvh3TXYj+GPkyq/GSQt63JJV1dBgDKwr3xRdb8lQaPntSclmisa+ARO8tjPfkru1NqxAFQTtiqtAE83cA==", "bundleDependencies": [ "@balena/dockerignore", "case", @@ -4833,7 +4879,6 @@ "license": "Apache-2.0", "dependencies": { "@aws-cdk/asset-awscli-v1": "^2.2.208", - "@aws-cdk/asset-kubectl-v20": "^2.1.3", "@aws-cdk/asset-node-proxy-agent-v6": "^2.1.0", "@aws-cdk/cloud-assembly-schema": "^39.2.0", "@balena/dockerignore": "^1.0.2", @@ -5506,10 +5551,11 @@ } }, "node_modules/chai": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/chai/-/chai-5.1.2.tgz", - "integrity": "sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-5.2.0.tgz", + "integrity": "sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==", "dev": true, + "license": "MIT", "dependencies": { "assertion-error": "^2.0.1", "check-error": "^2.1.1", @@ -5581,6 +5627,7 @@ "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 16" } @@ -6243,6 +6290,7 @@ "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -6736,6 +6784,12 @@ "node": ">=0.6.0" } }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "license": "MIT" + }, "node_modules/fast-glob": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", @@ -6752,6 +6806,22 @@ "node": ">=8.6.0" } }, + "node_modules/fast-uri": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz", + "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, "node_modules/fast-xml-parser": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.4.1.tgz", @@ -8258,6 +8328,12 @@ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", "dev": true }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT" + }, "node_modules/json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", @@ -9212,10 +9288,11 @@ } }, "node_modules/loupe": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.2.tgz", - "integrity": "sha512-23I4pFZHmAemUnz8WZXbYRSKYj801VDaNv9ETuMh7IrMc7VuVVSo+Z9iLE3ni30+U48iDWfi30d3twAXBYmnCg==", - "dev": true + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.3.tgz", + "integrity": "sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==", + "dev": true, + "license": "MIT" }, "node_modules/lru-cache": { "version": "10.4.3", @@ -11893,11 +11970,19 @@ "node": ">=8" } }, + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, "node_modules/pathval": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz", "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 14.16" } @@ -11966,9 +12051,9 @@ } }, "node_modules/postcss": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.1.tgz", - "integrity": "sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==", + "version": "8.5.2", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.2.tgz", + "integrity": "sha512-MjOadfU3Ys9KYoX0AdkBlFEF1Vx37uCCeN4ZHnmwm9FfpbsGWMZeBLMmmpY+6Ocqod7mkdZ0DT31OlbsFrLlkA==", "dev": true, "funding": [ { @@ -12519,6 +12604,15 @@ "node": ">=0.10.0" } }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/resolve": { "version": "1.22.8", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", @@ -12676,9 +12770,9 @@ } }, "node_modules/rollup": { - "version": "4.34.3", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.34.3.tgz", - "integrity": "sha512-ORCtU0UBJyiAIn9m0llUXJXAswG/68pZptCrqxHG7//Z2DDzAUeyyY5hqf4XrsGlUxscMr9GkQ2QI7KTLqeyPw==", + "version": "4.34.8", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.34.8.tgz", + "integrity": "sha512-489gTVMzAYdiZHFVA/ig/iYFllCcWFHMvUHI1rpFmkoUtRlQxqh6/yiNqnYibjMZ2b/+FUQwldG+aLsEt6bglQ==", "dev": true, "license": "MIT", "dependencies": { @@ -12692,25 +12786,25 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.34.3", - "@rollup/rollup-android-arm64": "4.34.3", - "@rollup/rollup-darwin-arm64": "4.34.3", - "@rollup/rollup-darwin-x64": "4.34.3", - "@rollup/rollup-freebsd-arm64": "4.34.3", - "@rollup/rollup-freebsd-x64": "4.34.3", - "@rollup/rollup-linux-arm-gnueabihf": "4.34.3", - "@rollup/rollup-linux-arm-musleabihf": "4.34.3", - "@rollup/rollup-linux-arm64-gnu": "4.34.3", - "@rollup/rollup-linux-arm64-musl": "4.34.3", - "@rollup/rollup-linux-loongarch64-gnu": "4.34.3", - "@rollup/rollup-linux-powerpc64le-gnu": "4.34.3", - "@rollup/rollup-linux-riscv64-gnu": "4.34.3", - "@rollup/rollup-linux-s390x-gnu": "4.34.3", - "@rollup/rollup-linux-x64-gnu": "4.34.3", - "@rollup/rollup-linux-x64-musl": "4.34.3", - "@rollup/rollup-win32-arm64-msvc": "4.34.3", - "@rollup/rollup-win32-ia32-msvc": "4.34.3", - "@rollup/rollup-win32-x64-msvc": "4.34.3", + "@rollup/rollup-android-arm-eabi": "4.34.8", + "@rollup/rollup-android-arm64": "4.34.8", + "@rollup/rollup-darwin-arm64": "4.34.8", + "@rollup/rollup-darwin-x64": "4.34.8", + "@rollup/rollup-freebsd-arm64": "4.34.8", + "@rollup/rollup-freebsd-x64": "4.34.8", + "@rollup/rollup-linux-arm-gnueabihf": "4.34.8", + "@rollup/rollup-linux-arm-musleabihf": "4.34.8", + "@rollup/rollup-linux-arm64-gnu": "4.34.8", + "@rollup/rollup-linux-arm64-musl": "4.34.8", + "@rollup/rollup-linux-loongarch64-gnu": "4.34.8", + "@rollup/rollup-linux-powerpc64le-gnu": "4.34.8", + "@rollup/rollup-linux-riscv64-gnu": "4.34.8", + "@rollup/rollup-linux-s390x-gnu": "4.34.8", + "@rollup/rollup-linux-x64-gnu": "4.34.8", + "@rollup/rollup-linux-x64-musl": "4.34.8", + "@rollup/rollup-win32-arm64-msvc": "4.34.8", + "@rollup/rollup-win32-ia32-msvc": "4.34.8", + "@rollup/rollup-win32-x64-msvc": "4.34.8", "fsevents": "~2.3.2" } }, @@ -13632,6 +13726,7 @@ "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.2.tgz", "integrity": "sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=14.0.0" } @@ -13678,11 +13773,12 @@ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" }, "node_modules/tsx": { - "version": "4.19.2", - "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.19.2.tgz", - "integrity": "sha512-pOUl6Vo2LUq/bSa8S5q7b91cgNSjctn9ugq/+Mvow99qW6x/UZYwzxy/3NmqoT66eHYfCVvFvACC58UBPFf28g==", + "version": "4.19.3", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.19.3.tgz", + "integrity": "sha512-4H8vUNGNjQ4V2EOoGw005+c+dGuPSnhpPBPHBtsZdGZBk/iJb4kguGlPWaZTZ3q5nMtFOEsY0nRDlh9PJyd6SQ==", + "license": "MIT", "dependencies": { - "esbuild": "~0.23.0", + "esbuild": "~0.25.0", "get-tsconfig": "^4.7.5" }, "bin": { @@ -13695,500 +13791,102 @@ "fsevents": "~2.3.3" } }, - "node_modules/tsx/node_modules/@esbuild/aix-ppc64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.23.1.tgz", - "integrity": "sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==", - "cpu": [ - "ppc64" - ], - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/android-arm": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.23.1.tgz", - "integrity": "sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/android-arm64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.23.1.tgz", - "integrity": "sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==", - "cpu": [ - "arm64" - ], + "node_modules/tsx/node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, "optional": true, "os": [ - "android" + "darwin" ], "engines": { - "node": ">=18" + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/tsx/node_modules/@esbuild/android-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.23.1.tgz", - "integrity": "sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "android" - ], + "node_modules/tuf-js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-1.1.7.tgz", + "integrity": "sha512-i3P9Kgw3ytjELUfpuKVDNBJvk4u5bXL6gskv572mcevPbSKCV3zt3djhmlEQ65yERjIbOSncy7U4cQJaB1CBCg==", + "dev": true, + "dependencies": { + "@tufjs/models": "1.0.4", + "debug": "^4.3.4", + "make-fetch-happen": "^11.1.1" + }, "engines": { - "node": ">=18" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/tsx/node_modules/@esbuild/darwin-arm64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.23.1.tgz", - "integrity": "sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "darwin" - ], + "node_modules/tuf-js/node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "dependencies": { + "debug": "4" + }, "engines": { - "node": ">=18" + "node": ">= 6.0.0" } }, - "node_modules/tsx/node_modules/@esbuild/darwin-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.23.1.tgz", - "integrity": "sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "darwin" - ], + "node_modules/tuf-js/node_modules/cacache": { + "version": "17.1.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-17.1.4.tgz", + "integrity": "sha512-/aJwG2l3ZMJ1xNAnqbMpA40of9dj/pIH3QfiuQSqjfPJF747VR0J/bHn+/KdNnHKc6XQcWt/AfRSBft82W1d2A==", + "dev": true, + "dependencies": { + "@npmcli/fs": "^3.1.0", + "fs-minipass": "^3.0.0", + "glob": "^10.2.2", + "lru-cache": "^7.7.1", + "minipass": "^7.0.3", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "p-map": "^4.0.0", + "ssri": "^10.0.0", + "tar": "^6.1.11", + "unique-filename": "^3.0.0" + }, "engines": { - "node": ">=18" + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/tsx/node_modules/@esbuild/freebsd-arm64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.23.1.tgz", - "integrity": "sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "freebsd" - ], + "node_modules/tuf-js/node_modules/http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, "engines": { - "node": ">=18" + "node": ">= 6" } }, - "node_modules/tsx/node_modules/@esbuild/freebsd-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.23.1.tgz", - "integrity": "sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "freebsd" - ], + "node_modules/tuf-js/node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, "engines": { - "node": ">=18" + "node": ">= 6" } }, - "node_modules/tsx/node_modules/@esbuild/linux-arm": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.23.1.tgz", - "integrity": "sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==", - "cpu": [ - "arm" - ], - "optional": true, - "os": [ - "linux" - ], + "node_modules/tuf-js/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/linux-arm64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.23.1.tgz", - "integrity": "sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/linux-ia32": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.23.1.tgz", - "integrity": "sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/linux-loong64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.23.1.tgz", - "integrity": "sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==", - "cpu": [ - "loong64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/linux-mips64el": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.23.1.tgz", - "integrity": "sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==", - "cpu": [ - "mips64el" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/linux-ppc64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.23.1.tgz", - "integrity": "sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==", - "cpu": [ - "ppc64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/linux-riscv64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.23.1.tgz", - "integrity": "sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==", - "cpu": [ - "riscv64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/linux-s390x": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.23.1.tgz", - "integrity": "sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==", - "cpu": [ - "s390x" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/linux-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.23.1.tgz", - "integrity": "sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/netbsd-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.23.1.tgz", - "integrity": "sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/openbsd-arm64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.23.1.tgz", - "integrity": "sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/openbsd-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.23.1.tgz", - "integrity": "sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/sunos-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.23.1.tgz", - "integrity": "sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/win32-arm64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.23.1.tgz", - "integrity": "sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==", - "cpu": [ - "arm64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/win32-ia32": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.23.1.tgz", - "integrity": "sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==", - "cpu": [ - "ia32" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/@esbuild/win32-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.23.1.tgz", - "integrity": "sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/tsx/node_modules/esbuild": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.23.1.tgz", - "integrity": "sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==", - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.23.1", - "@esbuild/android-arm": "0.23.1", - "@esbuild/android-arm64": "0.23.1", - "@esbuild/android-x64": "0.23.1", - "@esbuild/darwin-arm64": "0.23.1", - "@esbuild/darwin-x64": "0.23.1", - "@esbuild/freebsd-arm64": "0.23.1", - "@esbuild/freebsd-x64": "0.23.1", - "@esbuild/linux-arm": "0.23.1", - "@esbuild/linux-arm64": "0.23.1", - "@esbuild/linux-ia32": "0.23.1", - "@esbuild/linux-loong64": "0.23.1", - "@esbuild/linux-mips64el": "0.23.1", - "@esbuild/linux-ppc64": "0.23.1", - "@esbuild/linux-riscv64": "0.23.1", - "@esbuild/linux-s390x": "0.23.1", - "@esbuild/linux-x64": "0.23.1", - "@esbuild/netbsd-x64": "0.23.1", - "@esbuild/openbsd-arm64": "0.23.1", - "@esbuild/openbsd-x64": "0.23.1", - "@esbuild/sunos-x64": "0.23.1", - "@esbuild/win32-arm64": "0.23.1", - "@esbuild/win32-ia32": "0.23.1", - "@esbuild/win32-x64": "0.23.1" - } - }, - "node_modules/tsx/node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/tuf-js": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/tuf-js/-/tuf-js-1.1.7.tgz", - "integrity": "sha512-i3P9Kgw3ytjELUfpuKVDNBJvk4u5bXL6gskv572mcevPbSKCV3zt3djhmlEQ65yERjIbOSncy7U4cQJaB1CBCg==", - "dev": true, - "dependencies": { - "@tufjs/models": "1.0.4", - "debug": "^4.3.4", - "make-fetch-happen": "^11.1.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/tuf-js/node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dev": true, - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/tuf-js/node_modules/cacache": { - "version": "17.1.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-17.1.4.tgz", - "integrity": "sha512-/aJwG2l3ZMJ1xNAnqbMpA40of9dj/pIH3QfiuQSqjfPJF747VR0J/bHn+/KdNnHKc6XQcWt/AfRSBft82W1d2A==", - "dev": true, - "dependencies": { - "@npmcli/fs": "^3.1.0", - "fs-minipass": "^3.0.0", - "glob": "^10.2.2", - "lru-cache": "^7.7.1", - "minipass": "^7.0.3", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "p-map": "^4.0.0", - "ssri": "^10.0.0", - "tar": "^6.1.11", - "unique-filename": "^3.0.0" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/tuf-js/node_modules/http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", - "dev": true, - "dependencies": { - "@tootallnate/once": "2", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/tuf-js/node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "dev": true, - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/tuf-js/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true, - "engines": { - "node": ">=12" + "node": ">=12" } }, "node_modules/tuf-js/node_modules/make-fetch-happen": { @@ -14524,21 +14222,21 @@ } }, "node_modules/vite": { - "version": "5.4.14", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.14.tgz", - "integrity": "sha512-EK5cY7Q1D8JNhSaPKVK4pwBFvaTmZxEnoKXLG/U9gmdDcihQGNzFlgIvaxezFR4glP1LsuiedwMBqCXH3wZccA==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.1.1.tgz", + "integrity": "sha512-4GgM54XrwRfrOp297aIYspIti66k56v16ZnqHvrIM7mG+HjDlAwS7p+Srr7J6fGvEdOJ5JcQ/D9T7HhtdXDTzA==", "dev": true, "license": "MIT", "dependencies": { - "esbuild": "^0.21.3", - "postcss": "^8.4.43", - "rollup": "^4.20.0" + "esbuild": "^0.24.2", + "postcss": "^8.5.2", + "rollup": "^4.30.1" }, "bin": { "vite": "bin/vite.js" }, "engines": { - "node": "^18.0.0 || >=20.0.0" + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" }, "funding": { "url": "https://github.com/vitejs/vite?sponsor=1" @@ -14547,19 +14245,25 @@ "fsevents": "~2.3.3" }, "peerDependencies": { - "@types/node": "^18.0.0 || >=20.0.0", + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", - "terser": "^5.4.0" + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" }, "peerDependenciesMeta": { "@types/node": { "optional": true }, + "jiti": { + "optional": true + }, "less": { "optional": true }, @@ -14580,13 +14284,42 @@ }, "terser": { "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true } } }, + "node_modules/vite-node": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.0.6.tgz", + "integrity": "sha512-s51RzrTkXKJrhNbUzQRsarjmAae7VmMPAsRT7lppVpIg6mK3zGthP9Hgz0YQQKuNcF+Ii7DfYk3Fxz40jRmePw==", + "dev": true, + "license": "MIT", + "dependencies": { + "cac": "^6.7.14", + "debug": "^4.4.0", + "es-module-lexer": "^1.6.0", + "pathe": "^2.0.3", + "vite": "^5.0.0 || ^6.0.0" + }, + "bin": { + "vite-node": "vite-node.mjs" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, "node_modules/vite/node_modules/@esbuild/aix-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", - "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.2.tgz", + "integrity": "sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==", "cpu": [ "ppc64" ], @@ -14597,13 +14330,13 @@ "aix" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/vite/node_modules/@esbuild/android-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", - "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.2.tgz", + "integrity": "sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==", "cpu": [ "arm" ], @@ -14614,13 +14347,13 @@ "android" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/vite/node_modules/@esbuild/android-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", - "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.2.tgz", + "integrity": "sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==", "cpu": [ "arm64" ], @@ -14631,13 +14364,13 @@ "android" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/vite/node_modules/@esbuild/android-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", - "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.2.tgz", + "integrity": "sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==", "cpu": [ "x64" ], @@ -14648,13 +14381,13 @@ "android" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/vite/node_modules/@esbuild/darwin-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", - "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.2.tgz", + "integrity": "sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==", "cpu": [ "arm64" ], @@ -14665,13 +14398,13 @@ "darwin" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/vite/node_modules/@esbuild/darwin-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.2.tgz", + "integrity": "sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==", "cpu": [ "x64" ], @@ -14682,13 +14415,13 @@ "darwin" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.2.tgz", + "integrity": "sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==", "cpu": [ "arm64" ], @@ -14699,13 +14432,13 @@ "freebsd" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/vite/node_modules/@esbuild/freebsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.2.tgz", + "integrity": "sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==", "cpu": [ "x64" ], @@ -14716,13 +14449,13 @@ "freebsd" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/vite/node_modules/@esbuild/linux-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.2.tgz", + "integrity": "sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==", "cpu": [ "arm" ], @@ -14733,13 +14466,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/vite/node_modules/@esbuild/linux-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.2.tgz", + "integrity": "sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==", "cpu": [ "arm64" ], @@ -14750,13 +14483,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/vite/node_modules/@esbuild/linux-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.2.tgz", + "integrity": "sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==", "cpu": [ "ia32" ], @@ -14767,13 +14500,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/vite/node_modules/@esbuild/linux-loong64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.2.tgz", + "integrity": "sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==", "cpu": [ "loong64" ], @@ -14784,13 +14517,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/vite/node_modules/@esbuild/linux-mips64el": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.2.tgz", + "integrity": "sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==", "cpu": [ "mips64el" ], @@ -14801,13 +14534,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/vite/node_modules/@esbuild/linux-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.2.tgz", + "integrity": "sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==", "cpu": [ "ppc64" ], @@ -14818,13 +14551,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/vite/node_modules/@esbuild/linux-riscv64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.2.tgz", + "integrity": "sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==", "cpu": [ "riscv64" ], @@ -14835,13 +14568,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/vite/node_modules/@esbuild/linux-s390x": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.2.tgz", + "integrity": "sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==", "cpu": [ "s390x" ], @@ -14852,13 +14585,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/vite/node_modules/@esbuild/linux-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", - "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.2.tgz", + "integrity": "sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==", "cpu": [ "x64" ], @@ -14869,13 +14602,30 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/netbsd-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.24.2.tgz", + "integrity": "sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" } }, "node_modules/vite/node_modules/@esbuild/netbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.2.tgz", + "integrity": "sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==", "cpu": [ "x64" ], @@ -14886,13 +14636,30 @@ "netbsd" ], "engines": { - "node": ">=12" + "node": ">=18" + } + }, + "node_modules/vite/node_modules/@esbuild/openbsd-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.2.tgz", + "integrity": "sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" } }, "node_modules/vite/node_modules/@esbuild/openbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.2.tgz", + "integrity": "sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==", "cpu": [ "x64" ], @@ -14903,13 +14670,13 @@ "openbsd" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/vite/node_modules/@esbuild/sunos-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.2.tgz", + "integrity": "sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==", "cpu": [ "x64" ], @@ -14920,13 +14687,13 @@ "sunos" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/vite/node_modules/@esbuild/win32-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.2.tgz", + "integrity": "sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==", "cpu": [ "arm64" ], @@ -14937,13 +14704,13 @@ "win32" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/vite/node_modules/@esbuild/win32-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.2.tgz", + "integrity": "sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==", "cpu": [ "ia32" ], @@ -14954,13 +14721,13 @@ "win32" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/vite/node_modules/@esbuild/win32-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", - "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.2.tgz", + "integrity": "sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==", "cpu": [ "x64" ], @@ -14971,13 +14738,13 @@ "win32" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/vite/node_modules/esbuild": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", - "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.2.tgz", + "integrity": "sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -14985,32 +14752,34 @@ "esbuild": "bin/esbuild" }, "engines": { - "node": ">=12" + "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.21.5", - "@esbuild/android-arm": "0.21.5", - "@esbuild/android-arm64": "0.21.5", - "@esbuild/android-x64": "0.21.5", - "@esbuild/darwin-arm64": "0.21.5", - "@esbuild/darwin-x64": "0.21.5", - "@esbuild/freebsd-arm64": "0.21.5", - "@esbuild/freebsd-x64": "0.21.5", - "@esbuild/linux-arm": "0.21.5", - "@esbuild/linux-arm64": "0.21.5", - "@esbuild/linux-ia32": "0.21.5", - "@esbuild/linux-loong64": "0.21.5", - "@esbuild/linux-mips64el": "0.21.5", - "@esbuild/linux-ppc64": "0.21.5", - "@esbuild/linux-riscv64": "0.21.5", - "@esbuild/linux-s390x": "0.21.5", - "@esbuild/linux-x64": "0.21.5", - "@esbuild/netbsd-x64": "0.21.5", - "@esbuild/openbsd-x64": "0.21.5", - "@esbuild/sunos-x64": "0.21.5", - "@esbuild/win32-arm64": "0.21.5", - "@esbuild/win32-ia32": "0.21.5", - "@esbuild/win32-x64": "0.21.5" + "@esbuild/aix-ppc64": "0.24.2", + "@esbuild/android-arm": "0.24.2", + "@esbuild/android-arm64": "0.24.2", + "@esbuild/android-x64": "0.24.2", + "@esbuild/darwin-arm64": "0.24.2", + "@esbuild/darwin-x64": "0.24.2", + "@esbuild/freebsd-arm64": "0.24.2", + "@esbuild/freebsd-x64": "0.24.2", + "@esbuild/linux-arm": "0.24.2", + "@esbuild/linux-arm64": "0.24.2", + "@esbuild/linux-ia32": "0.24.2", + "@esbuild/linux-loong64": "0.24.2", + "@esbuild/linux-mips64el": "0.24.2", + "@esbuild/linux-ppc64": "0.24.2", + "@esbuild/linux-riscv64": "0.24.2", + "@esbuild/linux-s390x": "0.24.2", + "@esbuild/linux-x64": "0.24.2", + "@esbuild/netbsd-arm64": "0.24.2", + "@esbuild/netbsd-x64": "0.24.2", + "@esbuild/openbsd-arm64": "0.24.2", + "@esbuild/openbsd-x64": "0.24.2", + "@esbuild/sunos-x64": "0.24.2", + "@esbuild/win32-arm64": "0.24.2", + "@esbuild/win32-ia32": "0.24.2", + "@esbuild/win32-x64": "0.24.2" } }, "node_modules/vite/node_modules/fsevents": { @@ -15029,31 +14798,31 @@ } }, "node_modules/vitest": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.0.5.tgz", - "integrity": "sha512-4dof+HvqONw9bvsYxtkfUp2uHsTN9bV2CZIi1pWgoFpL1Lld8LA1ka9q/ONSsoScAKG7NVGf2stJTI7XRkXb2Q==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.0.6.tgz", + "integrity": "sha512-/iL1Sc5VeDZKPDe58oGK4HUFLhw6b5XdY1MYawjuSaDA4sEfYlY9HnS6aCEG26fX+MgUi7MwlduTBHHAI/OvMA==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/expect": "3.0.5", - "@vitest/mocker": "3.0.5", - "@vitest/pretty-format": "^3.0.5", - "@vitest/runner": "3.0.5", - "@vitest/snapshot": "3.0.5", - "@vitest/spy": "3.0.5", - "@vitest/utils": "3.0.5", - "chai": "^5.1.2", + "@vitest/expect": "3.0.6", + "@vitest/mocker": "3.0.6", + "@vitest/pretty-format": "^3.0.6", + "@vitest/runner": "3.0.6", + "@vitest/snapshot": "3.0.6", + "@vitest/spy": "3.0.6", + "@vitest/utils": "3.0.6", + "chai": "^5.2.0", "debug": "^4.4.0", "expect-type": "^1.1.0", "magic-string": "^0.30.17", - "pathe": "^2.0.2", + "pathe": "^2.0.3", "std-env": "^3.8.0", "tinybench": "^2.9.0", "tinyexec": "^0.3.2", "tinypool": "^1.0.2", "tinyrainbow": "^2.0.0", "vite": "^5.0.0 || ^6.0.0", - "vite-node": "3.0.5", + "vite-node": "3.0.6", "why-is-node-running": "^2.3.0" }, "bin": { @@ -15069,8 +14838,8 @@ "@edge-runtime/vm": "*", "@types/debug": "^4.1.12", "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", - "@vitest/browser": "3.0.5", - "@vitest/ui": "3.0.5", + "@vitest/browser": "3.0.6", + "@vitest/ui": "3.0.6", "happy-dom": "*", "jsdom": "*" }, @@ -15098,65 +14867,6 @@ } } }, - "node_modules/vitest/node_modules/@vitest/runner": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.0.5.tgz", - "integrity": "sha512-BAiZFityFexZQi2yN4OX3OkJC6scwRo8EhRB0Z5HIGGgd2q+Nq29LgHU/+ovCtd0fOfXj5ZI6pwdlUmC5bpi8A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/utils": "3.0.5", - "pathe": "^2.0.2" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/vitest/node_modules/@vitest/snapshot": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.0.5.tgz", - "integrity": "sha512-GJPZYcd7v8QNUJ7vRvLDmRwl+a1fGg4T/54lZXe+UOGy47F9yUfE18hRCtXL5aHN/AONu29NGzIXSVFh9K0feA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@vitest/pretty-format": "3.0.5", - "magic-string": "^0.30.17", - "pathe": "^2.0.2" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/vitest/node_modules/pathe": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.2.tgz", - "integrity": "sha512-15Ztpk+nov8DR524R4BF7uEuzESgzUEAV4Ah7CUMNGXdE5ELuvxElxGXndBl32vMSsWa1jpNf22Z+Er3sKwq+w==", - "dev": true, - "license": "MIT" - }, - "node_modules/vitest/node_modules/vite-node": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.0.5.tgz", - "integrity": "sha512-02JEJl7SbtwSDJdYS537nU6l+ktdvcREfLksk/NDAqtdKWGqHl+joXzEubHROmS3E6pip+Xgu2tFezMu75jH7A==", - "dev": true, - "license": "MIT", - "dependencies": { - "cac": "^6.7.14", - "debug": "^4.4.0", - "es-module-lexer": "^1.6.0", - "pathe": "^2.0.2", - "vite": "^5.0.0 || ^6.0.0" - }, - "bin": { - "vite-node": "vite-node.mjs" - }, - "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, "node_modules/wcwidth": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", @@ -15482,17 +15192,18 @@ } }, "node_modules/zod": { - "version": "3.24.1", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.24.1.tgz", - "integrity": "sha512-muH7gBL9sI1nciMZV67X5fTKKBLtwpZ5VBp1vsOQzj1MhrBZ4wlVCm3gedKZWLp0Oyel8sIGfeiz54Su+OVT+A==", + "version": "3.24.2", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.24.2.tgz", + "integrity": "sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ==", "devOptional": true, + "license": "MIT", "funding": { "url": "https://github.com/sponsors/colinhacks" } }, "packages/batch": { "name": "@aws-lambda-powertools/batch", - "version": "2.14.0", + "version": "2.15.0", "license": "MIT-0", "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing" @@ -15500,7 +15211,7 @@ }, "packages/commons": { "name": "@aws-lambda-powertools/commons", - "version": "2.14.0", + "version": "2.15.0", "license": "MIT-0", "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing" @@ -15508,24 +15219,24 @@ }, "packages/event-handler": { "name": "@aws-lambda-powertools/event-handler", - "version": "2.14.0", + "version": "2.15.0", "license": "MIT-0", "dependencies": { - "@aws-lambda-powertools/commons": "^2.14.0" + "@aws-lambda-powertools/commons": "^2.15.0" } }, "packages/idempotency": { "name": "@aws-lambda-powertools/idempotency", - "version": "2.14.0", + "version": "2.15.0", "license": "MIT-0", "dependencies": { - "@aws-lambda-powertools/commons": "^2.14.0", - "@aws-lambda-powertools/jmespath": "^2.14.0" + "@aws-lambda-powertools/commons": "^2.15.0", + "@aws-lambda-powertools/jmespath": "^2.15.0" }, "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing", - "@aws-sdk/client-dynamodb": "^3.744.0", - "@aws-sdk/lib-dynamodb": "^3.744.0", + "@aws-sdk/client-dynamodb": "^3.751.0", + "@aws-sdk/lib-dynamodb": "^3.751.0", "aws-sdk-client-mock": "^4.1.0" }, "peerDependencies": { @@ -15547,18 +15258,18 @@ }, "packages/jmespath": { "name": "@aws-lambda-powertools/jmespath", - "version": "2.14.0", + "version": "2.15.0", "license": "MIT-0", "dependencies": { - "@aws-lambda-powertools/commons": "^2.14.0" + "@aws-lambda-powertools/commons": "^2.15.0" } }, "packages/logger": { "name": "@aws-lambda-powertools/logger", - "version": "2.14.0", + "version": "2.15.0", "license": "MIT-0", "dependencies": { - "@aws-lambda-powertools/commons": "^2.14.0", + "@aws-lambda-powertools/commons": "^2.15.0", "lodash.merge": "^4.6.2" }, "devDependencies": { @@ -15576,14 +15287,14 @@ }, "packages/metrics": { "name": "@aws-lambda-powertools/metrics", - "version": "2.14.0", + "version": "2.15.0", "license": "MIT-0", "dependencies": { - "@aws-lambda-powertools/commons": "^2.14.0" + "@aws-lambda-powertools/commons": "^2.15.0" }, "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing", - "@aws-sdk/client-cloudwatch": "^3.744.0", + "@aws-sdk/client-cloudwatch": "^3.750.0", "@types/promise-retry": "^1.1.3", "promise-retry": "^2.0.1" }, @@ -15598,18 +15309,18 @@ }, "packages/parameters": { "name": "@aws-lambda-powertools/parameters", - "version": "2.14.0", + "version": "2.15.0", "license": "MIT-0", "dependencies": { - "@aws-lambda-powertools/commons": "^2.14.0" + "@aws-lambda-powertools/commons": "^2.15.0" }, "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing", - "@aws-sdk/client-appconfigdata": "^3.744.0", - "@aws-sdk/client-dynamodb": "^3.744.0", - "@aws-sdk/client-secrets-manager": "^3.744.0", - "@aws-sdk/client-ssm": "^3.744.0", - "@aws-sdk/util-dynamodb": "^3.744.0", + "@aws-sdk/client-appconfigdata": "^3.750.0", + "@aws-sdk/client-dynamodb": "^3.751.0", + "@aws-sdk/client-secrets-manager": "^3.750.0", + "@aws-sdk/client-ssm": "^3.750.0", + "@aws-sdk/util-dynamodb": "^3.751.0", "@smithy/util-base64": "^4.0.0", "aws-sdk-client-mock": "^4.1.0" }, @@ -15644,10 +15355,10 @@ }, "packages/parser": { "name": "@aws-lambda-powertools/parser", - "version": "2.14.0", + "version": "2.15.0", "license": "MIT-0", "dependencies": { - "@aws-lambda-powertools/commons": "^2.14.0" + "@aws-lambda-powertools/commons": "^2.15.0" }, "peerDependencies": { "@middy/core": "4.x || 5.x || 6.x", @@ -15664,13 +15375,13 @@ }, "packages/testing": { "name": "@aws-lambda-powertools/testing-utils", - "version": "2.14.0", + "version": "2.15.0", "license": "MIT-0", "dependencies": { "@aws-cdk/cli-lib-alpha": "^2.176.0-alpha.0", - "@aws-sdk/client-lambda": "^3.744.0", + "@aws-sdk/client-lambda": "^3.750.0", "@smithy/util-utf8": "^4.0.0", - "aws-cdk-lib": "^2.178.1", + "aws-cdk-lib": "^2.179.0", "esbuild": "^0.25.0", "promise-retry": "^2.0.1" }, @@ -15690,16 +15401,16 @@ }, "packages/tracer": { "name": "@aws-lambda-powertools/tracer", - "version": "2.14.0", + "version": "2.15.0", "license": "MIT-0", "dependencies": { - "@aws-lambda-powertools/commons": "^2.14.0", + "@aws-lambda-powertools/commons": "^2.15.0", "aws-xray-sdk-core": "^3.10.3" }, "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing", - "@aws-sdk/client-dynamodb": "^3.744.0", - "@aws-sdk/client-xray": "^3.744.0" + "@aws-sdk/client-dynamodb": "^3.751.0", + "@aws-sdk/client-xray": "^3.751.0" }, "peerDependencies": { "@middy/core": "4.x || 5.x || 6.x" @@ -15709,6 +15420,16 @@ "optional": true } } + }, + "packages/validation": { + "name": "@aws-lambda-powertools/validation", + "version": "2.15.0", + "license": "MIT-0", + "dependencies": { + "@aws-lambda-powertools/commons": "^2.15.0", + "@aws-lambda-powertools/jmespath": "^2.15.0", + "ajv": "^8.17.1" + } } } } diff --git a/package.json b/package.json index 70726e0ebf..53f9895311 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,8 @@ "examples/snippets", "layers", "examples/app", - "packages/event-handler" + "packages/event-handler", + "packages/validation" ], "scripts": { "test": "npm t -ws", @@ -52,8 +53,8 @@ "devDependencies": { "@biomejs/biome": "^1.9.4", "@types/aws-lambda": "^8.10.147", - "@types/node": "^22.13.1", - "@vitest/coverage-v8": "^3.0.5", + "@types/node": "^22.13.4", + "@vitest/coverage-v8": "^3.0.6", "husky": "^9.1.7", "lerna": "8.1.2", "lint-staged": "^15.4.3", diff --git a/packages/batch/CHANGELOG.md b/packages/batch/CHANGELOG.md index b0f7f516da..a923b217f7 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.15.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.14.0...v2.15.0) (2025-02-25) + +**Note:** Version bump only for package @aws-lambda-powertools/batch + + + + + # [2.14.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.13.1...v2.14.0) (2025-02-10) **Note:** Version bump only for package @aws-lambda-powertools/batch diff --git a/packages/batch/package.json b/packages/batch/package.json index 3c8531cf8c..26131f81b3 100644 --- a/packages/batch/package.json +++ b/packages/batch/package.json @@ -1,6 +1,6 @@ { "name": "@aws-lambda-powertools/batch", - "version": "2.14.0", + "version": "2.15.0", "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 a255c408c6..3c954e8a2f 100644 --- a/packages/commons/CHANGELOG.md +++ b/packages/commons/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.15.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.14.0...v2.15.0) (2025-02-25) + +**Note:** Version bump only for package @aws-lambda-powertools/commons + + + + + # [2.14.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.13.1...v2.14.0) (2025-02-10) **Note:** Version bump only for package @aws-lambda-powertools/commons diff --git a/packages/commons/package.json b/packages/commons/package.json index a00e3c26d7..15eb074fc2 100644 --- a/packages/commons/package.json +++ b/packages/commons/package.json @@ -1,6 +1,6 @@ { "name": "@aws-lambda-powertools/commons", - "version": "2.14.0", + "version": "2.15.0", "description": "A shared utility package for Powertools for AWS Lambda (TypeScript) libraries", "author": { "name": "Amazon Web Services", diff --git a/packages/commons/src/awsSdkUtils.ts b/packages/commons/src/awsSdkUtils.ts index df922f9e27..5eabe7f396 100644 --- a/packages/commons/src/awsSdkUtils.ts +++ b/packages/commons/src/awsSdkUtils.ts @@ -47,9 +47,23 @@ const isSdkClient = (client: unknown): client is SdkClient => const customUserAgentMiddleware = (feature: string) => { return (next: (arg0: T) => Promise) => async (args: T) => { - const powertoolsUserAgent = `PT/${feature}/${PT_VERSION} PTEnv/${EXEC_ENV}`; + const existingUserAgent = args.request.headers['user-agent'] || ''; + if (existingUserAgent.includes('PT/NO-OP')) { + const featureSpecificUserAgent = existingUserAgent.replace( + 'PT/NO-OP', + `PT/${feature}/${PT_VERSION} PTEnv/${EXEC_ENV}` + ); + + args.request.headers['user-agent'] = featureSpecificUserAgent; + return await next(args); + } + if (existingUserAgent.includes('PT/')) { + return await next(args); + } args.request.headers['user-agent'] = - `${args.request.headers['user-agent']} ${powertoolsUserAgent}`; + existingUserAgent === '' + ? `PT/${feature}/${PT_VERSION} PTEnv/${EXEC_ENV}` + : `${existingUserAgent} PT/${feature}/${PT_VERSION} PTEnv/${EXEC_ENV}`; return await next(args); }; diff --git a/packages/commons/src/index.ts b/packages/commons/src/index.ts index 591ad8ccff..03b21e2ef7 100644 --- a/packages/commons/src/index.ts +++ b/packages/commons/src/index.ts @@ -1,3 +1,8 @@ +import { PT_VERSION } from './version.js'; +if (!process.env.AWS_SDK_UA_APP_ID) { + process.env.AWS_SDK_UA_APP_ID = `PT/NO-OP/${PT_VERSION}`; +} +export { PT_VERSION } from './version.js'; export { isRecord, isString, @@ -19,4 +24,3 @@ export { METRICS_KEY, IDEMPOTENCY_KEY, } from './middleware/constants.js'; -export { PT_VERSION } from './version.js'; diff --git a/packages/commons/src/version.ts b/packages/commons/src/version.ts index ca18cff544..8ec3a4a129 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.14.0'; +export const PT_VERSION = '2.15.0'; diff --git a/packages/commons/tests/unit/awsSdkUtils.test.ts b/packages/commons/tests/unit/awsSdkUtils.test.ts index 907409b25d..c8f233e355 100644 --- a/packages/commons/tests/unit/awsSdkUtils.test.ts +++ b/packages/commons/tests/unit/awsSdkUtils.test.ts @@ -96,26 +96,49 @@ describe('Helpers: awsSdk', () => { expect(middleware).toBeInstanceOf(Function); }); - it('adds the Powertools UA to the request headers', async () => { + const feature = 'my-feature'; + const middleware = customUserAgentMiddleware(feature); + + it.each([ + { + case: 'adds the feature-specific UA when none is present', + headers: {}, + expected: `PT/my-feature/${version} PTEnv/NA`, + }, + { + case: 'concatenates the ua to existing ones', + headers: { + 'user-agent': 'foo', + }, + expected: `foo PT/my-feature/${version} PTEnv/NA`, + }, + { + case: 'replaces no-op UA with the feature-specific one', + headers: { + 'user-agent': 'PT/NO-OP', + }, + expected: `PT/my-feature/${version} PTEnv/NA`, + }, + { + case: 'leaves a feature-specific UA intact', + headers: { + 'user-agent': 'PT/other-feature/1.0 PTEnv/NA', + }, + expected: 'PT/other-feature/1.0 PTEnv/NA', + }, + ])('it $case', async ({ headers, expected }) => { // Prepare - const feature = 'my-feature'; - const middleware = customUserAgentMiddleware(feature); - const next = vi.fn(); const args = { request: { - headers: { - 'user-agent': 'foo', - }, + headers, }, }; // Act - await middleware(next)(args); + await middleware(vi.fn())(args); // Assess - expect(args.request.headers['user-agent']).toEqual( - `foo PT/my-feature/${version} PTEnv/NA` - ); + expect(args.request.headers['user-agent']).toEqual(expected); }); }); diff --git a/packages/event-handler/CHANGELOG.md b/packages/event-handler/CHANGELOG.md index cca7730b7c..1ad5e680b3 100644 --- a/packages/event-handler/CHANGELOG.md +++ b/packages/event-handler/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.15.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.14.0...v2.15.0) (2025-02-25) + +**Note:** Version bump only for package @aws-lambda-powertools/event-handler + + + + + # [2.14.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.13.1...v2.14.0) (2025-02-10) **Note:** Version bump only for package @aws-lambda-powertools/event-handler diff --git a/packages/event-handler/package.json b/packages/event-handler/package.json index 3fb28f7a5a..8eeda78f76 100644 --- a/packages/event-handler/package.json +++ b/packages/event-handler/package.json @@ -1,6 +1,6 @@ { "name": "@aws-lambda-powertools/event-handler", - "version": "2.14.0", + "version": "2.15.0", "description": "Lightweight routing to reduce boilerplate for API Gateway REST/HTTP API, ALB and Lambda Function URLs", "author": { "name": "Amazon Web Services", @@ -51,7 +51,7 @@ "url": "https://github.com/aws-powertools/powertools-lambda-typescript/issues" }, "dependencies": { - "@aws-lambda-powertools/commons": "^2.14.0" + "@aws-lambda-powertools/commons": "^2.15.0" }, "keywords": [ "aws", diff --git a/packages/idempotency/CHANGELOG.md b/packages/idempotency/CHANGELOG.md index 536b08cb60..b761f73369 100644 --- a/packages/idempotency/CHANGELOG.md +++ b/packages/idempotency/CHANGELOG.md @@ -3,6 +3,17 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.15.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.14.0...v2.15.0) (2025-02-25) + + +### Features + +* **idempotency:** add support for custom key prefix ([#3532](https://github.com/aws-powertools/powertools-lambda-typescript/issues/3532)) ([7be7a83](https://github.com/aws-powertools/powertools-lambda-typescript/commit/7be7a83a07e86927221ba34ec1dbae7e73cf6e32)) + + + + + # [2.14.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.13.1...v2.14.0) (2025-02-10) **Note:** Version bump only for package @aws-lambda-powertools/idempotency diff --git a/packages/idempotency/package.json b/packages/idempotency/package.json index 5dd7e712ca..7e0eab152f 100644 --- a/packages/idempotency/package.json +++ b/packages/idempotency/package.json @@ -1,6 +1,6 @@ { "name": "@aws-lambda-powertools/idempotency", - "version": "2.14.0", + "version": "2.15.0", "description": "The idempotency package for the Powertools for AWS Lambda (TypeScript) library. It provides options to make your Lambda functions idempotent and safe to retry.", "author": { "name": "Amazon Web Services", @@ -98,8 +98,8 @@ "url": "https://github.com/aws-powertools/powertools-lambda-typescript/issues" }, "dependencies": { - "@aws-lambda-powertools/commons": "^2.14.0", - "@aws-lambda-powertools/jmespath": "^2.14.0" + "@aws-lambda-powertools/commons": "^2.15.0", + "@aws-lambda-powertools/jmespath": "^2.15.0" }, "peerDependencies": { "@aws-sdk/client-dynamodb": ">=3.x", @@ -127,8 +127,8 @@ ], "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing", - "@aws-sdk/client-dynamodb": "^3.744.0", - "@aws-sdk/lib-dynamodb": "^3.744.0", + "@aws-sdk/client-dynamodb": "^3.751.0", + "@aws-sdk/lib-dynamodb": "^3.751.0", "aws-sdk-client-mock": "^4.1.0" } } diff --git a/packages/idempotency/src/IdempotencyHandler.ts b/packages/idempotency/src/IdempotencyHandler.ts index 3c64a92a6b..90b7372317 100644 --- a/packages/idempotency/src/IdempotencyHandler.ts +++ b/packages/idempotency/src/IdempotencyHandler.ts @@ -51,6 +51,10 @@ export class IdempotencyHandler { * Idempotency configuration options. */ readonly #idempotencyConfig: IdempotencyConfig; + /** + * Custom prefix to be used when generating the idempotency key. + */ + readonly #keyPrefix: string | undefined; /** * Persistence layer used to store the idempotency records. */ @@ -69,11 +73,13 @@ export class IdempotencyHandler { idempotencyConfig, functionArguments, persistenceStore, + keyPrefix, thisArg, } = options; this.#functionToMakeIdempotent = functionToMakeIdempotent; this.#functionPayloadToBeHashed = functionPayloadToBeHashed; this.#idempotencyConfig = idempotencyConfig; + this.#keyPrefix = keyPrefix; this.#functionArguments = functionArguments; this.#thisArg = thisArg; @@ -81,6 +87,7 @@ export class IdempotencyHandler { this.#persistenceStore.configure({ config: this.#idempotencyConfig, + keyPrefix: this.#keyPrefix, }); } diff --git a/packages/idempotency/src/makeIdempotent.ts b/packages/idempotency/src/makeIdempotent.ts index 251a72a8f8..31718d80da 100644 --- a/packages/idempotency/src/makeIdempotent.ts +++ b/packages/idempotency/src/makeIdempotent.ts @@ -79,7 +79,7 @@ function makeIdempotent( fn: Func, options: ItempotentFunctionOptions> ): (...args: Parameters) => ReturnType { - const { persistenceStore, config } = options; + const { persistenceStore, config, keyPrefix } = options; const idempotencyConfig = config ? config : new IdempotencyConfig({}); if (!idempotencyConfig.isEnabled()) return fn; @@ -102,6 +102,7 @@ function makeIdempotent( functionToMakeIdempotent: fn, idempotencyConfig: idempotencyConfig, persistenceStore: persistenceStore, + keyPrefix: keyPrefix, functionArguments: args, functionPayloadToBeHashed, thisArg: this, diff --git a/packages/idempotency/src/middleware/makeHandlerIdempotent.ts b/packages/idempotency/src/middleware/makeHandlerIdempotent.ts index 11958b3e3b..3803062a01 100644 --- a/packages/idempotency/src/middleware/makeHandlerIdempotent.ts +++ b/packages/idempotency/src/middleware/makeHandlerIdempotent.ts @@ -117,8 +117,10 @@ const makeHandlerIdempotent = ( ? options.config : new IdempotencyConfig({}); const persistenceStore = options.persistenceStore; + const keyPrefix = options.keyPrefix; persistenceStore.configure({ config: idempotencyConfig, + keyPrefix: keyPrefix, }); const idempotencyHandler = new IdempotencyHandler({ @@ -126,6 +128,7 @@ const makeHandlerIdempotent = ( functionArguments: [], idempotencyConfig, persistenceStore, + keyPrefix, functionPayloadToBeHashed: undefined, }); setIdempotencyHandlerInRequestInternal(request, idempotencyHandler); diff --git a/packages/idempotency/src/persistence/BasePersistenceLayer.ts b/packages/idempotency/src/persistence/BasePersistenceLayer.ts index b2f0d9bd7b..0c13a6d753 100644 --- a/packages/idempotency/src/persistence/BasePersistenceLayer.ts +++ b/packages/idempotency/src/persistence/BasePersistenceLayer.ts @@ -46,14 +46,15 @@ abstract class BasePersistenceLayer implements BasePersistenceLayerInterface { /** * Initialize the base persistence layer from the configuration settings * - * @param {BasePersistenceLayerConfigureOptions} config - configuration object for the persistence layer + * @param {BasePersistenceLayerConfigureOptions} options - configuration object for the persistence layer */ - public configure(config: BasePersistenceLayerOptions): void { - // Extracting the idempotency config from the config object for easier access - const { config: idempotencyConfig } = config; + public configure(options: BasePersistenceLayerOptions): void { + const { config: idempotencyConfig, keyPrefix, functionName } = options; - if (config?.functionName && config.functionName.trim() !== '') { - this.idempotencyKeyPrefix = `${this.idempotencyKeyPrefix}.${config.functionName}`; + if (keyPrefix?.trim()) { + this.idempotencyKeyPrefix = keyPrefix.trim(); + } else if (functionName?.trim()) { + this.idempotencyKeyPrefix = `${this.idempotencyKeyPrefix}.${functionName.trim()}`; } // Prevent reconfiguration diff --git a/packages/idempotency/src/types/BasePersistenceLayer.ts b/packages/idempotency/src/types/BasePersistenceLayer.ts index a37440873e..c3c7f19e55 100644 --- a/packages/idempotency/src/types/BasePersistenceLayer.ts +++ b/packages/idempotency/src/types/BasePersistenceLayer.ts @@ -4,6 +4,7 @@ import type { IdempotencyRecord } from '../persistence/IdempotencyRecord.js'; type BasePersistenceLayerOptions = { config: IdempotencyConfig; functionName?: string; + keyPrefix?: string; }; interface BasePersistenceLayerInterface { diff --git a/packages/idempotency/src/types/IdempotencyOptions.ts b/packages/idempotency/src/types/IdempotencyOptions.ts index b366abb526..4c48e25579 100644 --- a/packages/idempotency/src/types/IdempotencyOptions.ts +++ b/packages/idempotency/src/types/IdempotencyOptions.ts @@ -19,6 +19,7 @@ import type { IdempotencyRecord } from '../persistence/IdempotencyRecord.js'; type IdempotencyLambdaHandlerOptions = { persistenceStore: BasePersistenceLayer; config?: IdempotencyConfig; + keyPrefix?: string; }; /** @@ -137,6 +138,10 @@ type IdempotencyHandlerOptions = { * Idempotency configuration options. */ idempotencyConfig: IdempotencyConfig; + /** + * The custom idempotency key prefix. + */ + keyPrefix?: string; /** * Persistence layer used to store the idempotency records. */ diff --git a/packages/idempotency/tests/unit/idempotencyDecorator.test.ts b/packages/idempotency/tests/unit/idempotencyDecorator.test.ts index 8a64b19afe..7f32a4e98c 100644 --- a/packages/idempotency/tests/unit/idempotencyDecorator.test.ts +++ b/packages/idempotency/tests/unit/idempotencyDecorator.test.ts @@ -1,9 +1,10 @@ import type { LambdaInterface } from '@aws-lambda-powertools/commons/types'; import context from '@aws-lambda-powertools/testing-utils/context'; import type { Context } from 'aws-lambda'; -import { describe, expect, it } from 'vitest'; -import { idempotent } from '../../src/index.js'; +import { describe, expect, it, vi } from 'vitest'; +import { idempotent, IdempotencyConfig } from '../../src/index.js'; import { PersistenceLayerTestClass } from '../helpers/idempotencyUtils.js'; +import { BasePersistenceLayer } from '../../src/persistence/BasePersistenceLayer.js'; describe('Given a class with a function to decorate', () => { it('maintains the scope of the decorated function', async () => { @@ -35,4 +36,41 @@ describe('Given a class with a function to decorate', () => { // Assess expect(result).toBe('private foo'); }); + + it('passes the custom keyPrefix to the persistenceStore', async () => { + // Prepare + const configureSpy = vi.spyOn(BasePersistenceLayer.prototype, 'configure'); + const idempotencyConfig = new IdempotencyConfig({}); + + class TestClass implements LambdaInterface { + @idempotent({ + persistenceStore: new PersistenceLayerTestClass(), + config: idempotencyConfig, + keyPrefix: 'my-custom-prefix', + }) + public async handler( + _event: unknown, + _context: Context + ): Promise { + return true; + } + } + + const handlerClass = new TestClass(); + const handler = handlerClass.handler.bind(handlerClass); + + // Act + const result = await handler({}, context); + + // Assess + expect(result).toBeTruthy(); + + expect(configureSpy).toHaveBeenCalled(); + const configureCallArgs = configureSpy.mock.calls[0][0]; // Extract first call's arguments + expect(configureCallArgs.config).toBe(idempotencyConfig); + expect(configureCallArgs.keyPrefix).toBe('my-custom-prefix'); + + // Restore the spy + configureSpy.mockRestore(); + }); }); diff --git a/packages/idempotency/tests/unit/makeIdempotent.test.ts b/packages/idempotency/tests/unit/makeIdempotent.test.ts index 4fdc58cb65..1e1a1e2054 100644 --- a/packages/idempotency/tests/unit/makeIdempotent.test.ts +++ b/packages/idempotency/tests/unit/makeIdempotent.test.ts @@ -393,6 +393,45 @@ describe('Function: makeIdempotent', () => { expect(saveSuccessSpy).toHaveBeenCalledTimes(0); } ); + + it.each([ + { + type: 'wrapper', + }, + { type: 'middleware' }, + ])( + 'passes keyPrefix correctly in idempotency handler ($type)', + async ({ type }) => { + // Prepare + const keyPrefix = 'my-custom-prefix'; + const options = { + ...mockIdempotencyOptions, + keyPrefix, + config: new IdempotencyConfig({ + eventKeyJmesPath: 'idempotencyKey', + }), + }; + const handler = + type === 'wrapper' + ? makeIdempotent(fnSuccessfull, options) + : middy(fnSuccessfull).use(makeHandlerIdempotent(options)); + + const configureSpy = vi.spyOn( + mockIdempotencyOptions.persistenceStore, + 'configure' + ); + + // Act + const result = await handler(event, context); + + // Assess + expect(result).toBe(true); + expect(configureSpy).toHaveBeenCalledWith( + expect.objectContaining({ keyPrefix }) + ); + } + ); + it('uses the first argument when when wrapping an arbitrary function', async () => { // Prepare const config = new IdempotencyConfig({}); diff --git a/packages/idempotency/tests/unit/persistence/BasePersistenceLayer.test.ts b/packages/idempotency/tests/unit/persistence/BasePersistenceLayer.test.ts index 65cb40be11..2a2d5e1a56 100644 --- a/packages/idempotency/tests/unit/persistence/BasePersistenceLayer.test.ts +++ b/packages/idempotency/tests/unit/persistence/BasePersistenceLayer.test.ts @@ -80,6 +80,34 @@ describe('Class: BasePersistenceLayer', () => { ); }); + it('trims the function name before appending as key prefix', () => { + // Prepare + const config = new IdempotencyConfig({}); + const persistenceLayer = new PersistenceLayerTestClass(); + + // Act + persistenceLayer.configure({ config, functionName: ' my-function ' }); + + // Assess + expect(persistenceLayer.idempotencyKeyPrefix).toBe( + 'my-lambda-function.my-function' + ); + }); + + it('appends custom prefix to the idempotence key prefix', () => { + // Prepare + const config = new IdempotencyConfig({}); + const persistenceLayer = new PersistenceLayerTestClass(); + + // Act + persistenceLayer.configure({ config, keyPrefix: 'my-custom-prefix' }); + + // Assess + expect(persistenceLayer.idempotencyKeyPrefix).toBe( + 'my-custom-prefix' + ); + }); + it('uses default config when no option is provided', () => { // Prepare const config = new IdempotencyConfig({}); diff --git a/packages/jmespath/CHANGELOG.md b/packages/jmespath/CHANGELOG.md index d3272c07f3..35b67c3d18 100644 --- a/packages/jmespath/CHANGELOG.md +++ b/packages/jmespath/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.15.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.14.0...v2.15.0) (2025-02-25) + +**Note:** Version bump only for package @aws-lambda-powertools/jmespath + + + + + # [2.14.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.13.1...v2.14.0) (2025-02-10) **Note:** Version bump only for package @aws-lambda-powertools/jmespath diff --git a/packages/jmespath/package.json b/packages/jmespath/package.json index c5bea0647e..707a2bb84c 100644 --- a/packages/jmespath/package.json +++ b/packages/jmespath/package.json @@ -1,6 +1,6 @@ { "name": "@aws-lambda-powertools/jmespath", - "version": "2.14.0", + "version": "2.15.0", "description": "A type safe and modern jmespath module to parse and extract data from JSON documents using JMESPath", "author": { "name": "Amazon Web Services", @@ -71,7 +71,7 @@ "lib" ], "dependencies": { - "@aws-lambda-powertools/commons": "^2.14.0" + "@aws-lambda-powertools/commons": "^2.15.0" }, "repository": { "type": "git", diff --git a/packages/logger/CHANGELOG.md b/packages/logger/CHANGELOG.md index 6e44f9fab6..8f966da85a 100644 --- a/packages/logger/CHANGELOG.md +++ b/packages/logger/CHANGELOG.md @@ -3,6 +3,25 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.15.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.14.0...v2.15.0) (2025-02-25) + + +### Bug Fixes + +* **logger:** handle illegal `null`/`undefined` as extra args ([#3614](https://github.com/aws-powertools/powertools-lambda-typescript/issues/3614)) ([6f99073](https://github.com/aws-powertools/powertools-lambda-typescript/commit/6f99073cf61d2e49b01d8f7dcc9b4edf36166ad9)) + + +### Features + +* **logger:** add circular buffer ([#3593](https://github.com/aws-powertools/powertools-lambda-typescript/issues/3593)) ([618cdee](https://github.com/aws-powertools/powertools-lambda-typescript/commit/618cdeefd8838bf291b5b9df73d765c30d2457df)) +* **logger:** Add log buffer and flush method ([#3617](https://github.com/aws-powertools/powertools-lambda-typescript/issues/3617)) ([6968ca8](https://github.com/aws-powertools/powertools-lambda-typescript/commit/6968ca87f55ef7574c7904e268ba0604d4b591b7)) +* **logger:** Emit a warning on buffer flush ([#3639](https://github.com/aws-powertools/powertools-lambda-typescript/issues/3639)) ([f471552](https://github.com/aws-powertools/powertools-lambda-typescript/commit/f4715520322e768f4cc743388069f91d424b0ebd)) +* **logger:** refresh sample rate calculation per invocation ([#3644](https://github.com/aws-powertools/powertools-lambda-typescript/issues/3644)) ([1d66a2a](https://github.com/aws-powertools/powertools-lambda-typescript/commit/1d66a2a0d0af36d6c8aa86b0c559f8489fe9ef77)) + + + + + # [2.14.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.13.1...v2.14.0) (2025-02-10) diff --git a/packages/logger/package.json b/packages/logger/package.json index 1000488636..73226d87d1 100644 --- a/packages/logger/package.json +++ b/packages/logger/package.json @@ -1,6 +1,6 @@ { "name": "@aws-lambda-powertools/logger", - "version": "2.14.0", + "version": "2.15.0", "description": "The logging package for the Powertools for AWS Lambda (TypeScript) library", "author": { "name": "Amazon Web Services", @@ -86,7 +86,7 @@ "url": "https://github.com/aws-powertools/powertools-lambda-typescript/issues" }, "dependencies": { - "@aws-lambda-powertools/commons": "^2.14.0", + "@aws-lambda-powertools/commons": "^2.15.0", "lodash.merge": "^4.6.2" }, "keywords": [ diff --git a/packages/logger/src/Logger.ts b/packages/logger/src/Logger.ts index ee1a240789..2f342f6ff7 100644 --- a/packages/logger/src/Logger.ts +++ b/packages/logger/src/Logger.ts @@ -1,6 +1,6 @@ import { Console } from 'node:console'; import { randomInt } from 'node:crypto'; -import { Utility } from '@aws-lambda-powertools/commons'; +import { Utility, isNullOrUndefined } from '@aws-lambda-powertools/commons'; import type { AsyncHandler, HandlerMethodDecorator, @@ -13,6 +13,7 @@ import { LogJsonIndent, LogLevelThreshold, ReservedKeys } from './constants.js'; import type { LogFormatter } from './formatter/LogFormatter.js'; import type { LogItem } from './formatter/LogItem.js'; import { PowertoolsLogFormatter } from './formatter/PowertoolsLogFormatter.js'; +import { CircularMap } from './logBuffer.js'; import type { ConfigServiceInterface } from './types/ConfigServiceInterface.js'; import type { ConstructorOptions, @@ -142,7 +143,10 @@ class Logger extends Utility implements LoggerInterface { * Sometimes we need to log warnings before the logger is fully initialized, however we can't log them * immediately because the logger is not ready yet. This buffer stores those logs until the logger is ready. */ - #buffer: [number, Parameters][] = []; + readonly #initBuffer: [ + number, + Parameters, + ][] = []; /** * Flag used to determine if the logger is initialized. */ @@ -165,6 +169,29 @@ class Logger extends Utility implements LoggerInterface { */ #jsonReplacerFn?: CustomJsonReplacerFn; + /** + * Represents whether the buffering functionality is enabled in the logger + */ + protected isBufferEnabled = false; + + /** + * Log level threshold for the buffer + * Logs with a level lower than this threshold will be buffered + */ + protected bufferLogThreshold: number = LogLevelThreshold.DEBUG; + /** + * Max size of the buffer. Additions to the buffer beyond this size will + * cause older logs to be evicted from the buffer + */ + readonly #maxBufferBytesSize = 1024; + + /** + * Contains buffered logs, grouped by _X_AMZN_TRACE_ID, each group with a max size of `maxBufferBytesSize` + */ + readonly #buffer: CircularMap = new CircularMap({ + maxBytesSize: this.#maxBufferBytesSize, + }); + /** * Log level used by the current instance of Logger. * @@ -182,11 +209,11 @@ class Logger extends Utility implements LoggerInterface { // all logs are buffered until the logger is initialized this.setOptions(rest); this.#isInitialized = true; - for (const [level, log] of this.#buffer) { + for (const [level, log] of this.#initBuffer) { // we call the method directly and create the log item just in time this.printLog(level, this.createAndPopulateLogItem(...log)); } - this.#buffer = []; + this.#initBuffer = []; } /** @@ -777,6 +804,9 @@ class Logger extends Utility implements LoggerInterface { additionalAttributes: LogAttributes ): void { for (const item of extraInput) { + if (isNullOrUndefined(item)) { + continue; + } if (item instanceof Error) { additionalAttributes.error = item; } else if (typeof item === 'string') { @@ -916,7 +946,7 @@ class Logger extends Utility implements LoggerInterface { } /** - * Print a given log with given log level. + * Print or buffer a given log with given log level. * * @param logLevel - The log level threshold * @param input - The log message @@ -934,7 +964,33 @@ class Logger extends Utility implements LoggerInterface { this.createAndPopulateLogItem(logLevel, input, extraInput) ); } else { - this.#buffer.push([logLevel, [logLevel, input, extraInput]]); + this.#initBuffer.push([logLevel, [logLevel, input, extraInput]]); + } + return; + } + + const traceId = this.envVarsService.getXrayTraceId(); + if (traceId !== undefined && this.shouldBufferLog(traceId, logLevel)) { + try { + this.bufferLogItem( + traceId, + this.createAndPopulateLogItem(logLevel, input, extraInput), + logLevel + ); + } catch (error) { + this.printLog( + LogLevelThreshold.WARN, + this.createAndPopulateLogItem( + LogLevelThreshold.WARN, + `Unable to buffer log: ${(error as Error).message}`, + [error as Error] + ) + ); + + this.printLog( + logLevel, + this.createAndPopulateLogItem(logLevel, input, extraInput) + ); } } } @@ -1166,6 +1222,81 @@ class Logger extends Utility implements LoggerInterface { }); persistentKeys && this.appendPersistentKeys(persistentKeys); } + + /** + * Add a log to the buffer + * @param xrayTraceId - _X_AMZN_TRACE_ID of the request + * @param log - Log to be buffered + * @param logLevel - level of log to be buffered + */ + protected bufferLogItem( + xrayTraceId: string, + log: LogItem, + logLevel: number + ): void { + log.prepareForPrint(); + + const stringified = JSON.stringify( + log.getAttributes(), + this.getJsonReplacer(), + this.logIndentation + ); + + this.#buffer.setItem(xrayTraceId, stringified, logLevel); + } + + /** + * Flushes all items of the respective _X_AMZN_TRACE_ID within + * the buffer. + */ + protected flushBuffer(): void { + const traceId = this.envVarsService.getXrayTraceId(); + if (traceId === undefined) { + return; + } + + const buffer = this.#buffer.get(traceId); + if (buffer === undefined) { + return; + } + + for (const item of buffer) { + const consoleMethod = + item.logLevel === LogLevelThreshold.CRITICAL + ? 'error' + : (this.getLogLevelNameFromNumber( + item.logLevel + ).toLowerCase() as keyof Omit); + this.console[consoleMethod](item.value); + } + if (buffer.hasEvictedLog) { + this.printLog( + LogLevelThreshold.WARN, + this.createAndPopulateLogItem( + LogLevelThreshold.WARN, + 'Some logs are not displayed because they were evicted from the buffer. Increase buffer size to store more logs in the buffer', + [] + ) + ); + } + + this.#buffer.delete(traceId); + } + /** + * Tests if the log meets the criteria to be buffered + * @param traceId - _X_AMZN_TRACE_ID of the request + * @param logLevel - The level of the log being considered + */ + protected shouldBufferLog( + traceId: string | undefined, + logLevel: number + ): boolean { + return ( + this.isBufferEnabled && + traceId !== undefined && + logLevel <= this.bufferLogThreshold + ); + } } export { Logger }; diff --git a/packages/logger/src/formatter/LogFormatter.ts b/packages/logger/src/formatter/LogFormatter.ts index 00321fc967..27af856835 100644 --- a/packages/logger/src/formatter/LogFormatter.ts +++ b/packages/logger/src/formatter/LogFormatter.ts @@ -25,7 +25,14 @@ abstract class LogFormatter { /** * Format key-value pairs of log attributes. * - * You should implement this method in a subclass to define the structure of the log item. + * You should implement this method in a subclass to define the structure of the log item + * and instantiate a new {@link LogItem} object with the formatted attributes. + * + * Note that when implementing this method, you should avoid mutating the `attributes` and + * `additionalLogAttributes` objects directly. Instead, create a new object with the desired + * structure and return it. + * + * If mutation is necessary, you can create a `structuredClone` of the object to avoid side effects. * * @example * ```typescript @@ -40,7 +47,7 @@ abstract class LogFormatter { * attributes: UnformattedAttributes, * additionalLogAttributes: LogAttributes * ): LogItem { - * const baseAttributes: MyCompanyLog = { + * const baseAttributes = { * message: attributes.message, * service: attributes.serviceName, * environment: attributes.environment, @@ -116,8 +123,11 @@ abstract class LogFormatter { : error.cause, }; for (const key in error) { - if (typeof key === 'string' && !['name', 'message', 'stack', 'cause'].includes(key)) { - formattedError[key] = (errorAttributes as Record)[key]; + if ( + typeof key === 'string' && + !['name', 'message', 'stack', 'cause'].includes(key) + ) { + formattedError[key] = (errorAttributes as Record)[key]; } } diff --git a/packages/logger/src/logBuffer.ts b/packages/logger/src/logBuffer.ts new file mode 100644 index 0000000000..e17512515b --- /dev/null +++ b/packages/logger/src/logBuffer.ts @@ -0,0 +1,96 @@ +import { isString } from '@aws-lambda-powertools/commons/typeutils'; + +export class SizedItem { + public value: V; + public logLevel: number; + public byteSize: number; + + constructor(value: V, logLevel: number) { + if (!isString(value)) { + throw new Error('Value should be a string'); + } + this.value = value; + this.logLevel = logLevel; + this.byteSize = Buffer.byteLength(value as unknown as string); + } +} + +export class SizedSet extends Set> { + public currentBytesSize = 0; + public hasEvictedLog = false; + + add(item: SizedItem): this { + this.currentBytesSize += item.byteSize; + super.add(item); + return this; + } + + delete(item: SizedItem): boolean { + const wasDeleted = super.delete(item); + if (wasDeleted) { + this.currentBytesSize -= item.byteSize; + } + return wasDeleted; + } + + clear(): void { + super.clear(); + this.currentBytesSize = 0; + } + + shift(): SizedItem | undefined { + const firstElement = this.values().next().value; + if (firstElement) { + this.delete(firstElement); + } + return firstElement; + } +} + +export class CircularMap extends Map> { + readonly #maxBytesSize: number; + readonly #onBufferOverflow?: () => void; + + constructor({ + maxBytesSize, + onBufferOverflow, + }: { + maxBytesSize: number; + onBufferOverflow?: () => void; + }) { + super(); + this.#maxBytesSize = maxBytesSize; + this.#onBufferOverflow = onBufferOverflow; + } + + setItem(key: string, value: V, logLevel: number): this { + const item = new SizedItem(value, logLevel); + + if (item.byteSize > this.#maxBytesSize) { + throw new Error('Item too big'); + } + + const buffer = this.get(key) || new SizedSet(); + + if (buffer.currentBytesSize + item.byteSize >= this.#maxBytesSize) { + this.#deleteFromBufferUntilSizeIsLessThanMax(buffer, item); + if (this.#onBufferOverflow) { + this.#onBufferOverflow(); + } + } + + buffer.add(item); + super.set(key, buffer); + return this; + } + + readonly #deleteFromBufferUntilSizeIsLessThanMax = ( + buffer: SizedSet, + item: SizedItem + ) => { + while (buffer.currentBytesSize + item.byteSize >= this.#maxBytesSize) { + buffer.shift(); + buffer.hasEvictedLog = true; + } + }; +} diff --git a/packages/logger/tests/unit/logBuffer.test.ts b/packages/logger/tests/unit/logBuffer.test.ts new file mode 100644 index 0000000000..9ba2923bc3 --- /dev/null +++ b/packages/logger/tests/unit/logBuffer.test.ts @@ -0,0 +1,140 @@ +import { beforeEach, describe, expect, it, vi } from 'vitest'; +import { Logger } from '../../src/Logger.js'; +import { LogLevelThreshold } from '../../src/constants.js'; + +class TestLogger extends Logger { + public enableBuffering() { + this.isBufferEnabled = true; + } + public disableBuffering() { + this.isBufferEnabled = false; + } + + public flushBufferWrapper(): void { + this.flushBuffer(); + } + + public overrideBufferLogItem(): void { + this.bufferLogItem = vi.fn().mockImplementation(() => { + throw new Error('bufferLogItem error'); + }); + } + + public setbufferLevelThreshold(level: number): void { + this.bufferLogThreshold = level; + } +} + +describe('bufferLog', () => { + it('outputs a warning when there is an error buffering the log', () => { + // Prepare + process.env.POWERTOOLS_DEV = 'true'; + const logger = new TestLogger(); + logger.enableBuffering(); + logger.overrideBufferLogItem(); + + // Act + logger.debug('This is a debug'); + + // Assess + expect(console.debug).toBeCalledTimes(1); + expect(console.warn).toBeCalledTimes(1); + }); +}); + +describe('flushBuffer', () => { + const ENVIRONMENT_VARIABLES = process.env; + + beforeEach(() => { + process.env = { + ...ENVIRONMENT_VARIABLES, + POWERTOOLS_LOGGER_LOG_EVENT: 'true', + POWERTOOLS_DEV: 'true', + }; + vi.clearAllMocks(); + }); + + it('outputs buffered logs', () => { + // Prepare + const logger = new TestLogger({ logLevel: 'SILENT' }); + logger.enableBuffering(); + logger.setbufferLevelThreshold(LogLevelThreshold.CRITICAL); + + // Act + logger.debug('This is a debug'); + logger.warn('This is a warning'); + logger.critical('this is a critical'); + + // Assess + expect(console.warn).toHaveBeenCalledTimes(0); + expect(console.error).toHaveBeenCalledTimes(0); + + // Act + logger.flushBufferWrapper(); + + // Assess + expect(console.warn).toHaveBeenCalledTimes(1); + expect(console.error).toHaveBeenCalledTimes(1); + }); + + it('handles an empty buffer', () => { + // Prepare + const logger = new TestLogger(); + logger.enableBuffering(); + + // Act + logger.flushBufferWrapper(); + }); + + it('does not output buffered logs when trace id is not set', () => { + // Prepare + process.env._X_AMZN_TRACE_ID = undefined; + const logger = new TestLogger({}); + logger.enableBuffering(); + + // Act + logger.debug('This is a debug'); + logger.warn('this is a warning'); + + // Assess + expect(console.debug).toHaveBeenCalledTimes(0); + expect(console.warn).toHaveBeenCalledTimes(1); + + // Act + logger.flushBufferWrapper(); + + // Assess + expect(console.debug).toHaveBeenCalledTimes(0); + expect(console.warn).toHaveBeenCalledTimes(1); + }); + + it('outputs a warning when buffered logs have been evicted', () => { + // Prepare + const logger = new TestLogger({ logLevel: 'ERROR' }); + logger.enableBuffering(); + logger.setbufferLevelThreshold(LogLevelThreshold.INFO); + + // Act + const longMessage = 'blah'.repeat(10); + + let i = 0; + while (i < 4) { + logger.info( + `${i} This is a really long log message intended to exceed the buffer ${longMessage}` + ); + i++; + } + + // Act + logger.flushBufferWrapper(); + + // Assess + expect(console.warn).toHaveLogged( + expect.objectContaining({ + level: 'WARN', + message: + 'Some logs are not displayed because they were evicted from the buffer. Increase buffer size to store more logs in the buffer', + }) + ); + }); +}); diff --git a/packages/logger/tests/unit/logBufferStructures.test.ts b/packages/logger/tests/unit/logBufferStructures.test.ts new file mode 100644 index 0000000000..8d44eb25c1 --- /dev/null +++ b/packages/logger/tests/unit/logBufferStructures.test.ts @@ -0,0 +1,147 @@ +import { describe, expect, it, vi } from 'vitest'; + +import { CircularMap, SizedItem, SizedSet } from '../../src/logBuffer.js'; + +describe('SizedItem', () => { + it('calculates the byteSize based on string value', () => { + // Prepare + const logEntry = 'hello world'; + + // Act + const item = new SizedItem(logEntry, 1); + + // Assess + const expectedByteSize = Buffer.byteLength(logEntry); + expect(item.byteSize).toBe(expectedByteSize); + }); + + it('throws an error if value is not a string', () => { + // Prepare + const invalidValue = { message: 'not a string' }; + + // Act & Assess + expect( + () => new SizedItem(invalidValue as unknown as string, 1) + ).toThrowError('Value should be a string'); + }); +}); + +describe('SizedSet', () => { + it('adds an item and updates currentBytesSize correctly', () => { + // Prepare + const set = new SizedSet(); + const item = new SizedItem('value', 1); + + // Act + set.add(item); + + // Assess + expect(set.currentBytesSize).toBe(item.byteSize); + expect(set.has(item)).toBe(true); + }); + + it('deletes an item and updates currentBytesSize correctly', () => { + // Prepare + const set = new SizedSet(); + const item = new SizedItem('value', 1); + set.add(item); + const initialSize = set.currentBytesSize; + + // Act + const result = set.delete(item); + + // Assess + expect(result).toBe(true); + expect(set.currentBytesSize).toBe(initialSize - item.byteSize); + expect(set.has(item)).toBe(false); + }); + + it('clears all items and resets currentBytesSize to 0', () => { + // Prepare + const set = new SizedSet(); + set.add(new SizedItem('b', 1)); + set.add(new SizedItem('d', 1)); + + // Act + set.clear(); + + // Assess + expect(set.currentBytesSize).toBe(0); + expect(set.size).toBe(0); + }); + + it('removes the first inserted item with shift', () => { + // Prepare + const set = new SizedSet(); + const item1 = new SizedItem('first', 1); + const item2 = new SizedItem('second', 1); + set.add(item1); + set.add(item2); + + // Act + const shiftedItem = set.shift(); + + // Assess + expect(shiftedItem).toEqual(item1); + expect(set.has(item1)).toBe(false); + expect(set.currentBytesSize).toBe(item2.byteSize); + }); +}); + +describe('CircularMap', () => { + it('adds items to a new buffer for a given key', () => { + // Prepare + const maxBytes = 200; + const circularMap = new CircularMap({ + maxBytesSize: maxBytes, + }); + + // Act + circularMap.setItem('trace-1', 'first log', 1); + + // Assess + const buffer = circularMap.get('trace-1'); + expect(buffer).toBeDefined(); + if (buffer) { + expect(buffer.currentBytesSize).toBeGreaterThan(0); + expect(buffer.size).toBe(1); + } + }); + + it('throws an error when an item exceeds maxBytesSize', () => { + // Prepare + const maxBytes = 10; + const circularMap = new CircularMap({ + maxBytesSize: maxBytes, + }); + + // Act & Assess + expect(() => { + circularMap.setItem('trace-1', 'a very long message', 1); + }).toThrowError('Item too big'); + }); + + it('evicts items when the buffer overflows and call the overflow callback', () => { + // Prepare + const options = { + maxBytesSize: 15, + onBufferOverflow: vi.fn(), + }; + const circularMap = new CircularMap(options); + const smallEntry = '12345'; + + const entryByteSize = Buffer.byteLength(smallEntry); + const entriesCount = Math.ceil(options.maxBytesSize / entryByteSize); + + // Act + for (let i = 0; i < entriesCount; i++) { + circularMap.setItem('trace-1', smallEntry, 1); + } + + // Assess + expect(options.onBufferOverflow).toHaveBeenCalledTimes(1); + expect(circularMap.get('trace-1')?.currentBytesSize).toBeLessThan( + options.maxBytesSize + ); + }); +}); diff --git a/packages/logger/tests/unit/workingWithkeys.test.ts b/packages/logger/tests/unit/workingWithkeys.test.ts index b39c23c1f6..94c388fc55 100644 --- a/packages/logger/tests/unit/workingWithkeys.test.ts +++ b/packages/logger/tests/unit/workingWithkeys.test.ts @@ -601,7 +601,7 @@ describe('Working with keys', () => { it('logs a warning when using both the deprecated persistentLogAttributes and persistentKeys options', () => { // Prepare - const logger = new Logger({ + new Logger({ persistentKeys: { foo: 'bar', }, @@ -739,4 +739,24 @@ describe('Working with keys', () => { }) ); }); + + it.each([{ value: null }, { value: undefined }])( + 'handles null and undefined values when passing them to the log method ($value)', + ({ value }) => { + // Prepare + const logger = new Logger(); + + // Act + // @ts-expect-error - these values are already forbidden by TypeScript, but JavaScript-only customers might pass them + logger.info('foo', value); + + // Assess + expect(console.info).toHaveLoggedNth( + 1, + expect.objectContaining({ + message: 'foo', + }) + ); + } + ); }); diff --git a/packages/metrics/CHANGELOG.md b/packages/metrics/CHANGELOG.md index 067a181dc4..4bd1e216a2 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.15.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.14.0...v2.15.0) (2025-02-25) + +**Note:** Version bump only for package @aws-lambda-powertools/metrics + + + + + # [2.14.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.13.1...v2.14.0) (2025-02-10) **Note:** Version bump only for package @aws-lambda-powertools/metrics diff --git a/packages/metrics/package.json b/packages/metrics/package.json index 98cdc0ec61..8e8ce684df 100644 --- a/packages/metrics/package.json +++ b/packages/metrics/package.json @@ -1,6 +1,6 @@ { "name": "@aws-lambda-powertools/metrics", - "version": "2.14.0", + "version": "2.15.0", "description": "The metrics package for the Powertools for AWS Lambda (TypeScript) library", "author": { "name": "Amazon Web Services", @@ -65,7 +65,7 @@ "main": "./lib/cjs/index.js", "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing", - "@aws-sdk/client-cloudwatch": "^3.744.0", + "@aws-sdk/client-cloudwatch": "^3.750.0", "@types/promise-retry": "^1.1.3", "promise-retry": "^2.0.1" }, @@ -88,7 +88,7 @@ "url": "https://github.com/aws-powertools/powertools-lambda-typescript/issues" }, "dependencies": { - "@aws-lambda-powertools/commons": "^2.14.0" + "@aws-lambda-powertools/commons": "^2.15.0" }, "keywords": [ "aws", diff --git a/packages/parameters/CHANGELOG.md b/packages/parameters/CHANGELOG.md index d11a0949ac..2d20871a1d 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.15.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.14.0...v2.15.0) (2025-02-25) + +**Note:** Version bump only for package @aws-lambda-powertools/parameters + + + + + # [2.14.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.13.1...v2.14.0) (2025-02-10) **Note:** Version bump only for package @aws-lambda-powertools/parameters diff --git a/packages/parameters/package.json b/packages/parameters/package.json index f7fe409c3f..4f14b7734d 100644 --- a/packages/parameters/package.json +++ b/packages/parameters/package.json @@ -1,6 +1,6 @@ { "name": "@aws-lambda-powertools/parameters", - "version": "2.14.0", + "version": "2.15.0", "description": "The parameters package for the Powertools for AWS Lambda (TypeScript) library", "author": { "name": "Amazon Web Services", @@ -156,16 +156,16 @@ ], "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing", - "@aws-sdk/client-appconfigdata": "^3.744.0", - "@aws-sdk/client-dynamodb": "^3.744.0", - "@aws-sdk/client-secrets-manager": "^3.744.0", - "@aws-sdk/client-ssm": "^3.744.0", - "@aws-sdk/util-dynamodb": "^3.744.0", + "@aws-sdk/client-appconfigdata": "^3.750.0", + "@aws-sdk/client-dynamodb": "^3.751.0", + "@aws-sdk/client-secrets-manager": "^3.750.0", + "@aws-sdk/client-ssm": "^3.750.0", + "@aws-sdk/util-dynamodb": "^3.751.0", "@smithy/util-base64": "^4.0.0", "aws-sdk-client-mock": "^4.1.0" }, "dependencies": { - "@aws-lambda-powertools/commons": "^2.14.0" + "@aws-lambda-powertools/commons": "^2.15.0" }, "peerDependencies": { "@aws-sdk/client-appconfigdata": ">=3.x", diff --git a/packages/parser/CHANGELOG.md b/packages/parser/CHANGELOG.md index 5f5c618303..4fc1d5ae97 100644 --- a/packages/parser/CHANGELOG.md +++ b/packages/parser/CHANGELOG.md @@ -3,6 +3,17 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [2.15.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.14.0...v2.15.0) (2025-02-25) + + +### Features + +* **parser:** provide sub-path exports ([#3598](https://github.com/aws-powertools/powertools-lambda-typescript/issues/3598)) ([09f0aaa](https://github.com/aws-powertools/powertools-lambda-typescript/commit/09f0aaaf92233d326acd9e5fbd21a5c241cdbfe7)) + + + + + # [2.14.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.13.1...v2.14.0) (2025-02-10) diff --git a/packages/parser/package.json b/packages/parser/package.json index 6f949a4b7f..6d6bbb579a 100644 --- a/packages/parser/package.json +++ b/packages/parser/package.json @@ -1,6 +1,6 @@ { "name": "@aws-lambda-powertools/parser", - "version": "2.14.0", + "version": "2.15.0", "description": "The parser package for the Powertools for AWS Lambda (TypeScript) library.", "author": { "name": "Amazon Web Services", @@ -124,61 +124,9 @@ "require": "./lib/cjs/schemas/vpc-latticev2.js", "import": "./lib/esm/schemas/vpc-latticev2.js" }, - "./envelopes": { - "require": "./lib/cjs/envelopes/index.js", - "import": "./lib/esm/envelopes/index.js" - }, - "./envelopes/api-gateway": { - "require": "./lib/cjs/envelopes/apigw.js", - "import": "./lib/esm/envelopes/apigw.js" - }, - "./envelopes/api-gatewayv2": { - "require": "./lib/cjs/envelopes/apigwv2.js", - "import": "./lib/esm/envelopes/apigwv2.js" - }, - "./envelopes/cloudwatch": { - "require": "./lib/cjs/envelopes/cloudwatch.js", - "import": "./lib/esm/envelopes/cloudwatch.js" - }, - "./envelopes/dynamodb": { - "require": "./lib/cjs/envelopes/dynamodb.js", - "import": "./lib/esm/envelopes/dynamodb.js" - }, - "./envelopes/eventbridge": { - "require": "./lib/cjs/envelopes/eventbridge.js", - "import": "./lib/esm/envelopes/eventbridge.js" - }, - "./envelopes/kafka": { - "require": "./lib/cjs/envelopes/kafka.js", - "import": "./lib/esm/envelopes/kafka.js" - }, - "./envelopes/kinesis": { - "require": "./lib/cjs/envelopes/kinesis.js", - "import": "./lib/esm/envelopes/kinesis.js" - }, - "./envelopes/kinesis-firehose": { - "require": "./lib/cjs/envelopes/kinesis-firehose.js", - "import": "./lib/esm/envelopes/kinesis-firehose.js" - }, - "./envelopes/lambda": { - "require": "./lib/cjs/envelopes/lambda.js", - "import": "./lib/esm/envelopes/lambda.js" - }, - "./envelopes/sns": { - "require": "./lib/cjs/envelopes/sns.js", - "import": "./lib/esm/envelopes/sns.js" - }, - "./envelopes/sqs": { - "require": "./lib/cjs/envelopes/sqs.js", - "import": "./lib/esm/envelopes/sqs.js" - }, - "./envelopes/vpc-lattice": { - "require": "./lib/cjs/envelopes/vpc-lattice.js", - "import": "./lib/esm/envelopes/vpc-lattice.js" - }, - "./envelopes/vpc-latticev2": { - "require": "./lib/cjs/envelopes/vpc-latticev2.js", - "import": "./lib/esm/envelopes/vpc-latticev2.js" + "./envelopes/*.ts": { + "require": "./lib/cjs/envelopes/*.js", + "import": "./lib/esm/envelopes/*.js" }, "./helpers": { "require": "./lib/cjs/helpers.js", @@ -279,65 +227,9 @@ "./lib/cjs/schemas/vpc-latticev2.d.ts", "./lib/esm/schemas/vpc-latticev2.d.ts" ], - "envelopes": [ - "./lib/cjs/envelopes/index.d.ts", - "./lib/esm/envelopes/index.d.ts" - ], - "envelopes/api-gateway": [ - "./lib/cjs/envelopes/apigw.d.ts", - "./lib/esm/envelopes/apigw.d.ts" - ], - "envelopes/api-gatewayv2": [ - "./lib/cjs/envelopes/apigwv2.d.ts", - "./lib/esm/envelopes/apigwv2.d.ts" - ], - "envelopes/cloudwatch": [ - "./lib/cjs/envelopes/cloudwatch.d.ts", - "./lib/esm/envelopes/cloudwatch.d.ts" - ], - "envelopes/dynamodb": [ - "./lib/cjs/envelopes/dynamodb.d.ts", - "./lib/esm/envelopes/dynamodb.d.ts" - ], - "envelopes/eventbridge": [ - "./lib/cjs/envelopes/eventbridge.d.ts", - "./lib/esm/envelopes/eventbridge.d.ts" - ], - "envelopes/kafka": [ - "./lib/cjs/envelopes/kafka.d.ts", - "./lib/esm/envelopes/kafka.d.ts" - ], - "envelopes/kinesis": [ - "./lib/cjs/envelopes/kinesis.d.ts", - "./lib/esm/envelopes/kinesis.d.ts" - ], - "envelopes/kinesis-firehose": [ - "./lib/cjs/envelopes/kinesis-firehose.d.ts", - "./lib/esm/envelopes/kinesis-firehose.d.ts" - ], - "envelopes/lambda": [ - "./lib/cjs/envelopes/lambda.d.ts", - "./lib/esm/envelopes/lambda.d.ts" - ], - "envelopes/sns": [ - "./lib/cjs/envelopes/sns.d.ts", - "./lib/esm/envelopes/sns.d.ts" - ], - "envelopes/sqs": [ - "./lib/cjs/envelopes/sqs.d.ts", - "./lib/esm/envelopes/sqs.d.ts" - ], - "schemas/transfer-family": [ - "./lib/cjs/schemas/transfer-family.d.ts", - "./lib/esm/schemas/transfer-family.d.ts" - ], - "envelopes/vpc-lattice": [ - "./lib/cjs/envelopes/vpc-lattice.d.ts", - "./lib/esm/envelopes/vpc-lattice.d.ts" - ], - "envelopes/vpc-latticev2": [ - "./lib/cjs/envelopes/vpc-latticev2.d.ts", - "./lib/esm/envelopes/vpc-latticev2.d.ts" + "envelopes/*.ts": [ + "./lib/cjs/envelopes/*.d.ts", + "./lib/esm/envelopes/*.d.ts" ], "helpers": [ "./lib/cjs/helpers.d.ts", @@ -374,7 +266,7 @@ "nodejs" ], "dependencies": { - "@aws-lambda-powertools/commons": "^2.14.0" + "@aws-lambda-powertools/commons": "^2.15.0" }, "peerDependencies": { "@middy/core": "4.x || 5.x || 6.x", diff --git a/packages/parser/src/envelopes/apigw.ts b/packages/parser/src/envelopes/api-gateway.ts similarity index 100% rename from packages/parser/src/envelopes/apigw.ts rename to packages/parser/src/envelopes/api-gateway.ts diff --git a/packages/parser/src/envelopes/apigwv2.ts b/packages/parser/src/envelopes/api-gatewayv2.ts similarity index 100% rename from packages/parser/src/envelopes/apigwv2.ts rename to packages/parser/src/envelopes/api-gatewayv2.ts diff --git a/packages/parser/src/envelopes/event-bridge.ts b/packages/parser/src/envelopes/eventbridge.ts similarity index 100% rename from packages/parser/src/envelopes/event-bridge.ts rename to packages/parser/src/envelopes/eventbridge.ts diff --git a/packages/parser/src/envelopes/index.ts b/packages/parser/src/envelopes/index.ts index 40932efac5..5e42fb172c 100644 --- a/packages/parser/src/envelopes/index.ts +++ b/packages/parser/src/envelopes/index.ts @@ -1,14 +1,14 @@ -export { ApiGatewayEnvelope } from './apigw.js'; -export { ApiGatewayV2Envelope } from './apigwv2.js'; +export { ApiGatewayEnvelope } from './api-gateway.js'; +export { ApiGatewayV2Envelope } from './api-gatewayv2.js'; export { CloudWatchEnvelope } from './cloudwatch.js'; export { DynamoDBStreamEnvelope } from './dynamodb.js'; -export { EventBridgeEnvelope } from './event-bridge.js'; +export { EventBridgeEnvelope } from './eventbridge.js'; export { KafkaEnvelope } from './kafka.js'; -export { KinesisEnvelope } from './kinesis.js'; export { KinesisFirehoseEnvelope } from './kinesis-firehose.js'; +export { KinesisEnvelope } from './kinesis.js'; export { LambdaFunctionUrlEnvelope } from './lambda.js'; +export { SnsSqsEnvelope } from './sns-sqs.js'; export { SnsEnvelope } from './sns.js'; export { SqsEnvelope } from './sqs.js'; -export { SnsSqsEnvelope } from './snssqs.js'; export { VpcLatticeEnvelope } from './vpc-lattice.js'; export { VpcLatticeV2Envelope } from './vpc-latticev2.js'; diff --git a/packages/parser/src/envelopes/snssqs.ts b/packages/parser/src/envelopes/sns-sqs.ts similarity index 100% rename from packages/parser/src/envelopes/snssqs.ts rename to packages/parser/src/envelopes/sns-sqs.ts diff --git a/packages/parser/src/types/index.ts b/packages/parser/src/types/index.ts index 924698b278..459cc88758 100644 --- a/packages/parser/src/types/index.ts +++ b/packages/parser/src/types/index.ts @@ -10,34 +10,47 @@ export type { Envelope } from './envelope.js'; export type { ALBEvent, ALBMultiValueHeadersEvent, + APIGatewayEventRequestContext, APIGatewayProxyEvent, APIGatewayProxyEventV2, + APIGatewayRequestAuthorizerEvent, APIGatewayRequestAuthorizerV2, APIGatewayRequestContextV2, + APIGatewayTokenAuthorizerEvent, AppSyncBatchResolverEvent, AppSyncResolverEvent, CloudFormationCustomResourceCreateEvent, CloudFormationCustomResourceDeleteEvent, CloudFormationCustomResourceUpdateEvent, + CloudWatchLogEvent, + CloudWatchLogsDecode, CloudWatchLogsEvent, DynamoDBStreamEvent, DynamoDBStreamToKinesisRecordEvent, EventBridgeEvent, KafkaMskEvent, + KafkaRecord, KafkaSelfManagedEvent, KinesisDataStreamEvent, + KinesisDataStreamRecordEvent, KinesisDynamoDBStreamEvent, KinesisFireHoseEvent, + KinesisFirehoseRecord, KinesisFireHoseSqsEvent, + KinesisFirehoseSqsRecord, LambdaFunctionUrlEvent, S3Event, S3EventNotificationEventBridge, S3ObjectLambdaEvent, S3SqsEventNotification, SesEvent, + SesRecord, SnsEvent, + SnsNotification, + SnsRecord, SnsSqsNotification, SqsEvent, + SqsRecord, TransferFamilyEvent, VpcLatticeEvent, VpcLatticeEventV2, diff --git a/packages/parser/src/types/schema.ts b/packages/parser/src/types/schema.ts index 37395bc994..fb58f39835 100644 --- a/packages/parser/src/types/schema.ts +++ b/packages/parser/src/types/schema.ts @@ -1,9 +1,12 @@ import type { z } from 'zod'; import type { + APIGatewayEventRequestContextSchema, APIGatewayProxyEventSchema, APIGatewayProxyEventV2Schema, + APIGatewayRequestAuthorizerEventSchema, APIGatewayRequestAuthorizerV2Schema, APIGatewayRequestContextV2Schema, + APIGatewayTokenAuthorizerEventSchema, AlbMultiValueHeadersSchema, AlbSchema, AppSyncBatchResolverSchema, @@ -11,6 +14,8 @@ import type { CloudFormationCustomResourceCreateSchema, CloudFormationCustomResourceDeleteSchema, CloudFormationCustomResourceUpdateSchema, + CloudWatchLogEventSchema, + CloudWatchLogsDecodeSchema, CloudWatchLogsSchema, DynamoDBStreamSchema, DynamoDBStreamToKinesisRecord, @@ -18,6 +23,7 @@ import type { KafkaMskEventSchema, KafkaRecordSchema, KafkaSelfManagedEventSchema, + KinesisDataStreamRecord, KinesisDataStreamSchema, KinesisDynamoDBStreamSchema, KinesisFirehoseRecordSchema, @@ -48,6 +54,18 @@ type ALBMultiValueHeadersEvent = z.infer; type APIGatewayProxyEvent = z.infer; +type APIGatewayRequestAuthorizerEvent = z.infer< + typeof APIGatewayRequestAuthorizerEventSchema +>; + +type APIGatewayTokenAuthorizerEvent = z.infer< + typeof APIGatewayTokenAuthorizerEventSchema +>; + +type APIGatewayEventRequestContext = z.infer< + typeof APIGatewayEventRequestContextSchema +>; + type APIGatewayProxyEventV2 = z.infer; type APIGatewayRequestAuthorizerV2 = z.infer< @@ -62,6 +80,10 @@ type AppSyncResolverEvent = z.infer; type AppSyncBatchResolverEvent = z.infer; +type CloudWatchLogEvent = z.infer; + +type CloudWatchLogsDecode = z.infer; + type CloudFormationCustomResourceCreateEvent = z.infer< typeof CloudFormationCustomResourceCreateSchema >; @@ -94,6 +116,8 @@ type KinesisDataStreamEvent = z.infer; type KinesisDynamoDBStreamEvent = z.infer; +type KinesisDataStreamRecordEvent = z.infer; + type KinesisFireHoseEvent = z.infer; type KinesisFirehoseRecord = z.infer; @@ -139,39 +163,45 @@ type VpcLatticeEventV2 = z.infer; export type { ALBEvent, ALBMultiValueHeadersEvent, + APIGatewayEventRequestContext, APIGatewayProxyEvent, APIGatewayProxyEventV2, + APIGatewayRequestAuthorizerEvent, APIGatewayRequestAuthorizerV2, APIGatewayRequestContextV2, - AppSyncResolverEvent, + APIGatewayTokenAuthorizerEvent, AppSyncBatchResolverEvent, + AppSyncResolverEvent, CloudFormationCustomResourceCreateEvent, CloudFormationCustomResourceDeleteEvent, CloudFormationCustomResourceUpdateEvent, + CloudWatchLogEvent, + CloudWatchLogsDecode, CloudWatchLogsEvent, DynamoDBStreamEvent, DynamoDBStreamToKinesisRecordEvent, EventBridgeEvent, - KafkaSelfManagedEvent, KafkaMskEvent, KafkaRecord, + KafkaSelfManagedEvent, KinesisDataStreamEvent, + KinesisDataStreamRecordEvent, KinesisDynamoDBStreamEvent, KinesisFireHoseEvent, - KinesisFirehoseRecord, KinesisFireHoseSqsEvent, + KinesisFirehoseRecord, KinesisFirehoseSqsRecord, LambdaFunctionUrlEvent, S3Event, S3EventNotificationEventBridge, - S3SqsEventNotification, S3ObjectLambdaEvent, + S3SqsEventNotification, SesEvent, SesRecord, SnsEvent, - SnsSqsNotification, SnsNotification, SnsRecord, + SnsSqsNotification, SqsEvent, SqsRecord, TransferFamilyEvent, diff --git a/packages/parser/tests/types/envelopes.test.ts b/packages/parser/tests/types/envelopes.test.ts index f211feb5f5..7ba2f9387e 100644 --- a/packages/parser/tests/types/envelopes.test.ts +++ b/packages/parser/tests/types/envelopes.test.ts @@ -1,21 +1,19 @@ import { describe, expect, expectTypeOf, it } from 'vitest'; import { z } from 'zod'; -import { - ApiGatewayEnvelope, - ApiGatewayV2Envelope, - CloudWatchEnvelope, - DynamoDBStreamEnvelope, - EventBridgeEnvelope, - KafkaEnvelope, - KinesisEnvelope, - KinesisFirehoseEnvelope, - LambdaFunctionUrlEnvelope, - SnsEnvelope, - SnsSqsEnvelope, - SqsEnvelope, - VpcLatticeEnvelope, - VpcLatticeV2Envelope, -} from '../../src/envelopes/index.js'; +import { ApiGatewayEnvelope } from '../../src/envelopes/api-gateway.js'; +import { ApiGatewayV2Envelope } from '../../src/envelopes/api-gatewayv2.js'; +import { CloudWatchEnvelope } from '../../src/envelopes/cloudwatch.js'; +import { DynamoDBStreamEnvelope } from '../../src/envelopes/dynamodb.js'; +import { EventBridgeEnvelope } from '../../src/envelopes/eventbridge.js'; +import { KafkaEnvelope } from '../../src/envelopes/kafka.js'; +import { KinesisFirehoseEnvelope } from '../../src/envelopes/kinesis-firehose.js'; +import { KinesisEnvelope } from '../../src/envelopes/kinesis.js'; +import { LambdaFunctionUrlEnvelope } from '../../src/envelopes/lambda.js'; +import { SnsSqsEnvelope } from '../../src/envelopes/sns-sqs.js'; +import { SnsEnvelope } from '../../src/envelopes/sns.js'; +import { SqsEnvelope } from '../../src/envelopes/sqs.js'; +import { VpcLatticeEnvelope } from '../../src/envelopes/vpc-lattice.js'; +import { VpcLatticeV2Envelope } from '../../src/envelopes/vpc-latticev2.js'; import type { ParserOutput } from '../../src/types/parser.js'; describe('Types ', () => { diff --git a/packages/parser/tests/types/parser.test.ts b/packages/parser/tests/types/parser.test.ts index 292acfb36c..fb49248bcc 100644 --- a/packages/parser/tests/types/parser.test.ts +++ b/packages/parser/tests/types/parser.test.ts @@ -1,7 +1,8 @@ import { describe } from 'node:test'; import { expect, expectTypeOf, it } from 'vitest'; import { z } from 'zod'; -import { EventBridgeEnvelope, SqsEnvelope } from '../../src/envelopes/index.js'; +import { EventBridgeEnvelope } from '../../src/envelopes/eventbridge.js'; +import { SqsEnvelope } from '../../src/envelopes/sqs.js'; import { parse } from '../../src/parser.js'; import type { EventBridgeEvent, SqsEvent } from '../../src/types/schema.js'; import { getTestEvent } from '../unit/helpers/utils.js'; diff --git a/packages/parser/tests/unit/envelopes/apigw.test.ts b/packages/parser/tests/unit/envelopes/api-gateway.test.ts similarity index 100% rename from packages/parser/tests/unit/envelopes/apigw.test.ts rename to packages/parser/tests/unit/envelopes/api-gateway.test.ts diff --git a/packages/parser/tests/unit/envelopes/apigwv2.test.ts b/packages/parser/tests/unit/envelopes/api-gatewayv2.test.ts similarity index 97% rename from packages/parser/tests/unit/envelopes/apigwv2.test.ts rename to packages/parser/tests/unit/envelopes/api-gatewayv2.test.ts index ffd2d890ef..99f90373a0 100644 --- a/packages/parser/tests/unit/envelopes/apigwv2.test.ts +++ b/packages/parser/tests/unit/envelopes/api-gatewayv2.test.ts @@ -1,6 +1,6 @@ import { describe, expect, it } from 'vitest'; import { ZodError, z } from 'zod'; -import { ApiGatewayV2Envelope } from '../../../src/envelopes/index.js'; +import { ApiGatewayV2Envelope } from '../../../src/envelopes/api-gatewayv2.js'; import { ParseError } from '../../../src/errors.js'; import { JSONStringified } from '../../../src/helpers.js'; import type { APIGatewayProxyEventV2 } from '../../../src/types/schema.js'; diff --git a/packages/parser/tests/unit/envelopes/cloudwatch.test.ts b/packages/parser/tests/unit/envelopes/cloudwatch.test.ts index 98f907724c..4e617e088d 100644 --- a/packages/parser/tests/unit/envelopes/cloudwatch.test.ts +++ b/packages/parser/tests/unit/envelopes/cloudwatch.test.ts @@ -2,7 +2,7 @@ import { gunzipSync, gzipSync } from 'node:zlib'; import { describe, expect, it } from 'vitest'; import { ZodError, z } from 'zod'; import { ParseError } from '../../../src'; -import { CloudWatchEnvelope } from '../../../src/envelopes/index.js'; +import { CloudWatchEnvelope } from '../../../src/envelopes/cloudwatch.js'; import { DecompressError } from '../../../src/errors.js'; import { JSONStringified } from '../../../src/helpers.js'; import { getTestEvent } from '../helpers/utils.js'; diff --git a/packages/parser/tests/unit/envelopes/dynamodb.test.ts b/packages/parser/tests/unit/envelopes/dynamodb.test.ts index 4c5a3dccaa..3eb745bc8b 100644 --- a/packages/parser/tests/unit/envelopes/dynamodb.test.ts +++ b/packages/parser/tests/unit/envelopes/dynamodb.test.ts @@ -1,7 +1,7 @@ import { marshall } from '@aws-sdk/util-dynamodb'; import { describe, expect, it } from 'vitest'; import { ZodError, z } from 'zod'; -import { DynamoDBStreamEnvelope } from '../../../src/envelopes/index.js'; +import { DynamoDBStreamEnvelope } from '../../../src/envelopes/dynamodb.js'; import { ParseError } from '../../../src/errors.js'; import type { DynamoDBStreamEvent } from '../../../src/types/schema.js'; import { getTestEvent } from '../helpers/utils.js'; diff --git a/packages/parser/tests/unit/envelopes/eventbridge.test.ts b/packages/parser/tests/unit/envelopes/event-bridge.test.ts similarity index 97% rename from packages/parser/tests/unit/envelopes/eventbridge.test.ts rename to packages/parser/tests/unit/envelopes/event-bridge.test.ts index 7dbd0c5ede..25137e39ad 100644 --- a/packages/parser/tests/unit/envelopes/eventbridge.test.ts +++ b/packages/parser/tests/unit/envelopes/event-bridge.test.ts @@ -1,6 +1,6 @@ import { describe, expect, it } from 'vitest'; import { ZodError, z } from 'zod'; -import { EventBridgeEnvelope } from '../../../src/envelopes/index.js'; +import { EventBridgeEnvelope } from '../../../src/envelopes/eventbridge.js'; import { ParseError } from '../../../src/errors.js'; import type { EventBridgeEvent } from '../../../src/types/schema.js'; import { getTestEvent, omit } from '../helpers/utils.js'; diff --git a/packages/parser/tests/unit/envelopes/kafka.test.ts b/packages/parser/tests/unit/envelopes/kafka.test.ts index 5641eedbd6..70df419978 100644 --- a/packages/parser/tests/unit/envelopes/kafka.test.ts +++ b/packages/parser/tests/unit/envelopes/kafka.test.ts @@ -1,6 +1,6 @@ import { describe, expect, it } from 'vitest'; import { ZodError, z } from 'zod'; -import { KafkaEnvelope } from '../../../src/envelopes/index.js'; +import { KafkaEnvelope } from '../../../src/envelopes/kafka.js'; import { ParseError } from '../../../src/errors.js'; import { JSONStringified } from '../../../src/helpers.js'; import { getTestEvent } from '../helpers/utils.js'; diff --git a/packages/parser/tests/unit/envelopes/kinesis-firehose.test.ts b/packages/parser/tests/unit/envelopes/kinesis-firehose.test.ts index 7d103d14a2..bf5476c412 100644 --- a/packages/parser/tests/unit/envelopes/kinesis-firehose.test.ts +++ b/packages/parser/tests/unit/envelopes/kinesis-firehose.test.ts @@ -1,6 +1,6 @@ import { describe, expect, it } from 'vitest'; import { ZodError, z } from 'zod'; -import { KinesisFirehoseEnvelope } from '../../../src/envelopes/index.js'; +import { KinesisFirehoseEnvelope } from '../../../src/envelopes/kinesis-firehose.js'; import { ParseError } from '../../../src/errors.js'; import { JSONStringified } from '../../../src/helpers.js'; import type { diff --git a/packages/parser/tests/unit/envelopes/kinesis.test.ts b/packages/parser/tests/unit/envelopes/kinesis.test.ts index b476c874ec..57ae688888 100644 --- a/packages/parser/tests/unit/envelopes/kinesis.test.ts +++ b/packages/parser/tests/unit/envelopes/kinesis.test.ts @@ -1,6 +1,6 @@ import { describe, expect, it } from 'vitest'; import { ZodError, z } from 'zod'; -import { KinesisEnvelope } from '../../../src/envelopes/index.js'; +import { KinesisEnvelope } from '../../../src/envelopes/kinesis.js'; import { ParseError } from '../../../src/errors.js'; import type { KinesisDataStreamEvent } from '../../../src/types/schema.js'; import { getTestEvent } from '../helpers/utils.js'; diff --git a/packages/parser/tests/unit/envelopes/lambda.test.ts b/packages/parser/tests/unit/envelopes/lambda.test.ts index 2a200388ae..ff5f954a74 100644 --- a/packages/parser/tests/unit/envelopes/lambda.test.ts +++ b/packages/parser/tests/unit/envelopes/lambda.test.ts @@ -1,7 +1,7 @@ import { describe, expect, it } from 'vitest'; import { ZodError, z } from 'zod'; import { ParseError } from '../../../src'; -import { LambdaFunctionUrlEnvelope } from '../../../src/envelopes/index.js'; +import { LambdaFunctionUrlEnvelope } from '../../../src/envelopes/lambda.js'; import { JSONStringified } from '../../../src/helpers'; import type { LambdaFunctionUrlEvent } from '../../../src/types'; import { getTestEvent, omit } from '../helpers/utils.js'; diff --git a/packages/parser/tests/unit/envelopes/snssqs.test.ts b/packages/parser/tests/unit/envelopes/sns-sqs.test.ts similarity index 99% rename from packages/parser/tests/unit/envelopes/snssqs.test.ts rename to packages/parser/tests/unit/envelopes/sns-sqs.test.ts index 3a65ed758b..93c193a227 100644 --- a/packages/parser/tests/unit/envelopes/snssqs.test.ts +++ b/packages/parser/tests/unit/envelopes/sns-sqs.test.ts @@ -1,6 +1,6 @@ import { describe, expect, it } from 'vitest'; import { ZodError, z } from 'zod'; -import { SnsSqsEnvelope } from '../../../src/envelopes/snssqs.js'; +import { SnsSqsEnvelope } from '../../../src/envelopes/sns-sqs.js'; import { ParseError } from '../../../src/errors.js'; import { JSONStringified } from '../../../src/helpers.js'; import type { SqsEvent } from '../../../src/types/schema.js'; diff --git a/packages/parser/tests/unit/envelopes/vpc-lattice.test.ts b/packages/parser/tests/unit/envelopes/vpc-lattice.test.ts index b99430d5c5..9a77317d81 100644 --- a/packages/parser/tests/unit/envelopes/vpc-lattice.test.ts +++ b/packages/parser/tests/unit/envelopes/vpc-lattice.test.ts @@ -1,6 +1,6 @@ import { describe, expect, it } from 'vitest'; import { ZodError, z } from 'zod'; -import { VpcLatticeEnvelope } from '../../../src/envelopes/index.js'; +import { VpcLatticeEnvelope } from '../../../src/envelopes/vpc-lattice.js'; import { ParseError } from '../../../src/errors.js'; import { JSONStringified } from '../../../src/helpers.js'; import type { VpcLatticeEvent } from '../../../src/types/index.js'; diff --git a/packages/parser/tests/unit/envelopes/vpc-latticev2.test.ts b/packages/parser/tests/unit/envelopes/vpc-latticev2.test.ts index a4c1b10f83..a3097b741e 100644 --- a/packages/parser/tests/unit/envelopes/vpc-latticev2.test.ts +++ b/packages/parser/tests/unit/envelopes/vpc-latticev2.test.ts @@ -1,6 +1,6 @@ import { describe, expect, it } from 'vitest'; import { ZodError, z } from 'zod'; -import { VpcLatticeV2Envelope } from '../../../src/envelopes/index.js'; +import { VpcLatticeV2Envelope } from '../../../src/envelopes/vpc-latticev2.js'; import { ParseError } from '../../../src/errors.js'; import { JSONStringified } from '../../../src/helpers.js'; import type { VpcLatticeEventV2 } from '../../../src/types/index.js'; diff --git a/packages/parser/tests/unit/parser.decorator.test.ts b/packages/parser/tests/unit/parser.decorator.test.ts index 1b843e8ecb..48a647736e 100644 --- a/packages/parser/tests/unit/parser.decorator.test.ts +++ b/packages/parser/tests/unit/parser.decorator.test.ts @@ -2,7 +2,7 @@ import type { LambdaInterface } from '@aws-lambda-powertools/commons/types'; import type { Context } from 'aws-lambda'; import { describe, expect, it } from 'vitest'; import { type ZodSchema, z } from 'zod'; -import { EventBridgeEnvelope } from '../../src/envelopes/index.js'; +import { EventBridgeEnvelope } from '../../src/envelopes/eventbridge.js'; import { ParseError } from '../../src/errors.js'; import { parser } from '../../src/index.js'; import { EventBridgeSchema } from '../../src/schemas/index.js'; diff --git a/packages/parser/tests/unit/parser.middy.test.ts b/packages/parser/tests/unit/parser.middy.test.ts index 8fd9dcafb2..c6bfdb34cc 100644 --- a/packages/parser/tests/unit/parser.middy.test.ts +++ b/packages/parser/tests/unit/parser.middy.test.ts @@ -2,7 +2,7 @@ import middy from '@middy/core'; import type { Context } from 'aws-lambda'; import { describe, expect, it } from 'vitest'; import { z } from 'zod'; -import { EventBridgeEnvelope } from '../../src/envelopes/event-bridge.js'; +import { EventBridgeEnvelope } from '../../src/envelopes/eventbridge.js'; import { SqsEnvelope } from '../../src/envelopes/sqs.js'; import { ParseError } from '../../src/errors.js'; import { parser } from '../../src/middleware/parser.js'; @@ -107,7 +107,7 @@ describe('Middleware: parser', () => { const result = await middy() .use(parser({ schema: schema, safeParse: true })) .handler((event) => event)( - event as unknown as ParsedResult>, + event as unknown as ParsedResult>, {} as Context ); @@ -126,7 +126,7 @@ describe('Middleware: parser', () => { const result = await middy() .use(parser({ schema: z.string(), safeParse: true })) .handler((event) => event)( - event as unknown as ParsedResult, + event as unknown as ParsedResult, {} as Context ); diff --git a/packages/parser/tests/unit/schema/alb.test.ts b/packages/parser/tests/unit/schema/alb.test.ts index 8e5a481415..1b038fdf45 100644 --- a/packages/parser/tests/unit/schema/alb.test.ts +++ b/packages/parser/tests/unit/schema/alb.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from 'vitest'; -import { AlbSchema } from '../../../src/schemas/alb.js'; +import { AlbSchema } from '../../../src/schemas/index.js'; import type { ALBEvent } from '../../../src/types/schema.js'; import { getTestEvent, omit } from '../helpers/utils.js'; diff --git a/packages/testing/CHANGELOG.md b/packages/testing/CHANGELOG.md index 644e9662c1..387eba22bd 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.15.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.14.0...v2.15.0) (2025-02-25) + +**Note:** Version bump only for package @aws-lambda-powertools/testing-utils + + + + + # [2.14.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.13.1...v2.14.0) (2025-02-10) **Note:** Version bump only for package @aws-lambda-powertools/testing-utils diff --git a/packages/testing/package.json b/packages/testing/package.json index 1ac7fdca6e..8166e65648 100644 --- a/packages/testing/package.json +++ b/packages/testing/package.json @@ -1,6 +1,6 @@ { "name": "@aws-lambda-powertools/testing-utils", - "version": "2.14.0", + "version": "2.15.0", "description": "A package containing utilities to test your serverless workloads", "author": { "name": "Amazon Web Services", @@ -98,9 +98,9 @@ "homepage": "https://github.com/aws-powertools/powertools-lambda-typescript/tree/main/packages/testing#readme", "dependencies": { "@aws-cdk/cli-lib-alpha": "^2.176.0-alpha.0", - "@aws-sdk/client-lambda": "^3.744.0", + "@aws-sdk/client-lambda": "^3.750.0", "@smithy/util-utf8": "^4.0.0", - "aws-cdk-lib": "^2.178.1", + "aws-cdk-lib": "^2.179.0", "esbuild": "^0.25.0", "promise-retry": "^2.0.1" }, diff --git a/packages/tracer/CHANGELOG.md b/packages/tracer/CHANGELOG.md index b1b47f5d1e..508387ee96 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.15.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.14.0...v2.15.0) (2025-02-25) + +**Note:** Version bump only for package @aws-lambda-powertools/tracer + + + + + # [2.14.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.13.1...v2.14.0) (2025-02-10) **Note:** Version bump only for package @aws-lambda-powertools/tracer diff --git a/packages/tracer/package.json b/packages/tracer/package.json index e2b0569934..ebc4014696 100644 --- a/packages/tracer/package.json +++ b/packages/tracer/package.json @@ -1,6 +1,6 @@ { "name": "@aws-lambda-powertools/tracer", - "version": "2.14.0", + "version": "2.15.0", "description": "The tracer package for the Powertools for AWS Lambda (TypeScript) library", "author": { "name": "Amazon Web Services", @@ -30,8 +30,8 @@ "license": "MIT-0", "devDependencies": { "@aws-lambda-powertools/testing-utils": "file:../testing", - "@aws-sdk/client-dynamodb": "^3.744.0", - "@aws-sdk/client-xray": "^3.744.0" + "@aws-sdk/client-dynamodb": "^3.751.0", + "@aws-sdk/client-xray": "^3.751.0" }, "peerDependencies": { "@middy/core": "4.x || 5.x || 6.x" @@ -87,7 +87,7 @@ "url": "https://github.com/aws-powertools/powertools-lambda-typescript/issues" }, "dependencies": { - "@aws-lambda-powertools/commons": "^2.14.0", + "@aws-lambda-powertools/commons": "^2.15.0", "aws-xray-sdk-core": "^3.10.3" }, "keywords": [ diff --git a/packages/validation/CHANGELOG.md b/packages/validation/CHANGELOG.md new file mode 100644 index 0000000000..d37a659787 --- /dev/null +++ b/packages/validation/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.15.0](https://github.com/aws-powertools/powertools-lambda-typescript/compare/v2.14.0...v2.15.0) (2025-02-25) + +**Note:** Version bump only for package @aws-lambda-powertools/validation diff --git a/packages/validation/README.md b/packages/validation/README.md new file mode 100644 index 0000000000..b843d1823b --- /dev/null +++ b/packages/validation/README.md @@ -0,0 +1,68 @@ +# Powertools for AWS Lambda (TypeScript) - Validation Utility + +This utility provides JSON Schema validation for events and responses, including JMESPath support to unwrap events before validation. + +> [!Warning] +> This feature is currently under development. As such it's considered not stable and we might make significant breaking changes before going before its release. You are welcome to [provide feedback](https://github.com/aws-powertools/powertools-lambda-typescript/discussions/3519) and [contribute to its implementation](https://github.com/aws-powertools/powertools-lambda-typescript/milestone/18). + +Powertools for AWS Lambda (TypeScript) is a developer toolkit to implement Serverless [best practices and increase developer velocity](https://docs.powertools.aws.dev/lambda/typescript/latest/#features). You can use the library in both TypeScript and JavaScript code bases. + +To get started, install the package by running: + +```sh +npm i @aws-lambda-powertools/validation +``` + +> [!Note] +> This readme is a work in progress. + +## Contribute + +If you are interested in contributing to this project, please refer to our [Contributing Guidelines](https://github.com/aws-powertools/powertools-lambda-typescript/blob/main/CONTRIBUTING.md). + +## Roadmap + +The roadmap of Powertools for AWS Lambda (TypeScript) is driven by customers’ demand. +Help us prioritize upcoming functionalities or utilities by [upvoting existing RFCs and feature requests](https://github.com/aws-powertools/powertools-lambda-typescript/issues), or [creating new ones](https://github.com/aws-powertools/powertools-lambda-typescript/issues/new/choose), in this GitHub repository. + +## Connect + +- **Powertools for AWS Lambda on Discord**: `#typescript` - **[Invite link](https://discord.gg/B8zZKbbyET)** +- **Email**: + +## How to support Powertools for AWS Lambda (TypeScript)? + +### Becoming a reference customer + +Knowing which companies are using this library is important to help prioritize the project internally. If your company is using Powertools for AWS Lambda (TypeScript), you can request to have your name and logo added to the README file by raising a [Support Powertools for AWS Lambda (TypeScript) (become a reference)](https://s12d.com/become-reference-pt-ts) issue. + +The following companies, among others, use Powertools: + +- [Alma Media](https://www.almamedia.fi) +- [AppYourself](https://appyourself.net) +- [Bailey Nelson](https://www.baileynelson.com.au) +- [Banxware](https://www.banxware.com) +- [Caylent](https://caylent.com/) +- [Certible](https://www.certible.com/) +- [Elva](https://elva-group.com) +- [Flyweight](https://flyweight.io/) +- [globaldatanet](https://globaldatanet.com/) +- [Hashnode](https://hashnode.com/) +- [LocalStack](https://localstack.cloud/) +- [Perfect Post](https://www.perfectpost.fr) +- [Sennder](https://sennder.com/) +- [tecRacer GmbH & Co. KG](https://www.tecracer.com/) +- [Trek10](https://www.trek10.com/) +- [WeSchool](https://www.weschool.com) + +### Sharing your work + +Share what you did with Powertools for AWS Lambda (TypeScript) 💞💞. Blog post, workshops, presentation, sample apps and others. Check out what the community has already shared about Powertools for AWS Lambda (TypeScript) [here](https://docs.powertools.aws.dev/lambda/typescript/latest/we_made_this). + +### Using Lambda Layer + +This helps us understand who uses Powertools for AWS Lambda (TypeScript) in a non-intrusive way, and helps us gain future investments for other Powertools for AWS Lambda languages. When [using Layers](https://docs.powertools.aws.dev/lambda/typescript/latest/#lambda-layer), you can add Powertools as a dev dependency to not impact the development process. + +## License + +This library is licensed under the MIT-0 License. See the LICENSE file. diff --git a/packages/validation/package.json b/packages/validation/package.json new file mode 100644 index 0000000000..6987a1f4d6 --- /dev/null +++ b/packages/validation/package.json @@ -0,0 +1,69 @@ +{ + "name": "@aws-lambda-powertools/validation", + "version": "2.15.0", + "description": "An utility to validate events and responses using JSON Schemas", + "author": { + "name": "Amazon Web Services", + "url": "https://aws.amazon.com" + }, + "private": true, + "scripts": { + "test": "vitest --run", + "test:unit": "vitest --run", + "test:unit:coverage": "vitest --run tests/unit --coverage.enabled --coverage.thresholds.100 --coverage.include='src/**'", + "test:unit:types": "echo 'Not Implemented'", + "test:e2e:nodejs18x": "echo \"Not implemented\"", + "test:e2e:nodejs20x": "echo \"Not implemented\"", + "test:e2e:nodejs22x": "echo \"Not implemented\"", + "test:e2e": "echo \"Not implemented\"", + "build:cjs": "tsc --build tsconfig.json && echo '{ \"type\": \"commonjs\" }' > lib/cjs/package.json", + "build:esm": "tsc --build tsconfig.esm.json && echo '{ \"type\": \"module\" }' > lib/esm/package.json", + "build": "echo \"Not implemented\"", + "lint": "biome lint .", + "lint:fix": "biome check --write .", + "prepack": "node ../../.github/scripts/release_patch_package_json.js ." + }, + "homepage": "https://github.com/aws-powertools/powertools-lambda-typescript#readme", + "license": "MIT-0", + "type": "module", + "exports": { + ".": { + "require": { + "types": "./lib/cjs/index.d.ts", + "default": "./lib/cjs/index.js" + }, + "import": { + "types": "./lib/esm/index.d.ts", + "default": "./lib/esm/index.js" + } + } + }, + "types": "./lib/cjs/index.d.ts", + "main": "./lib/cjs/index.js", + "files": [ + "lib" + ], + "repository": { + "type": "git", + "url": "git+https://github.com/aws-powertools/powertools-lambda-typescript.git" + }, + "bugs": { + "url": "https://github.com/aws-powertools/powertools-lambda-typescript/issues" + }, + "dependencies": { + "@aws-lambda-powertools/commons": "^2.15.0", + "@aws-lambda-powertools/jmespath": "^2.15.0", + "ajv": "^8.17.1" + }, + "keywords": [ + "aws", + "lambda", + "powertools", + "json-schema", + "validation", + "event", + "handler", + "nodejs", + "serverless" + ] +} diff --git a/packages/validation/src/index.ts b/packages/validation/src/index.ts new file mode 100644 index 0000000000..9d87720cc5 --- /dev/null +++ b/packages/validation/src/index.ts @@ -0,0 +1 @@ +export const foo = () => true; diff --git a/packages/validation/tests/tsconfig.json b/packages/validation/tests/tsconfig.json new file mode 100644 index 0000000000..39f442212e --- /dev/null +++ b/packages/validation/tests/tsconfig.json @@ -0,0 +1,8 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "rootDir": "../../", + "noEmit": true + }, + "include": ["../../testing/src/setupEnv.ts", "../src/**/*", "./**/*"] +} diff --git a/packages/validation/tests/unit/index.test.ts b/packages/validation/tests/unit/index.test.ts new file mode 100644 index 0000000000..096d56dbb9 --- /dev/null +++ b/packages/validation/tests/unit/index.test.ts @@ -0,0 +1,16 @@ +import { beforeEach, describe, expect, it, vi } from 'vitest'; +import { foo } from '../../src/index.js'; + +describe('Validation', () => { + beforeEach(() => { + vi.clearAllMocks(); + }); + + it('should return true', () => { + // Act + const result = foo(); + + // Assess + expect(result).toBe(true); + }); +}); diff --git a/packages/validation/tsconfig.esm.json b/packages/validation/tsconfig.esm.json new file mode 100644 index 0000000000..82486b64fa --- /dev/null +++ b/packages/validation/tsconfig.esm.json @@ -0,0 +1,10 @@ +{ + "extends": "../../tsconfig.esm.json", + "compilerOptions": { + "baseUrl": ".", + "outDir": "./lib/esm", + "rootDir": "./src", + "tsBuildInfoFile": ".tsbuildinfo/esm.json" + }, + "include": ["./src/**/*"] +} diff --git a/packages/validation/tsconfig.json b/packages/validation/tsconfig.json new file mode 100644 index 0000000000..4923c4f6f4 --- /dev/null +++ b/packages/validation/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "outDir": "./lib/cjs/", + "rootDir": "./src", + "tsBuildInfoFile": ".tsbuildinfo/cjs.json" + }, + "include": ["./src/**/*"] +} diff --git a/packages/validation/vitest.config.ts b/packages/validation/vitest.config.ts new file mode 100644 index 0000000000..9f1196ef1f --- /dev/null +++ b/packages/validation/vitest.config.ts @@ -0,0 +1,8 @@ +import { defineProject } from 'vitest/config'; + +export default defineProject({ + test: { + environment: 'node', + setupFiles: ['../testing/src/setupEnv.ts'], + }, +});