From a88f075ae93809252dc8e8298661f7406bddb5a6 Mon Sep 17 00:00:00 2001 From: Ian Hodges Date: Tue, 18 Nov 2025 12:21:32 +0000 Subject: [PATCH 01/16] CCM-13146 simple ttl insertion and deletion --- .gitleaksignore | 4 ++ .../create-ttl.component.spec.ts | 2 +- .../handle-ttl.component.spec.ts | 64 +++++++++++++++++++ tests/playwright/helpers/dynamodb-helpers.ts | 35 +++++++++- 4 files changed, 101 insertions(+), 4 deletions(-) create mode 100644 tests/playwright/digital-letters-component-tests/handle-ttl.component.spec.ts diff --git a/.gitleaksignore b/.gitleaksignore index c2a21bcf0..3a1e68feb 100644 --- a/.gitleaksignore +++ b/.gitleaksignore @@ -12,3 +12,7 @@ cd9c0efec38c5d63053dd865e5d4e207c0760d91:docs/guides/Perform_static_analysis.md: 973c8a1feb76f3cd8743ce27b14e4acc4252240c:src/TESTING_PLAN.md:ipv4:2507 cc74128e4207833109339e96f3aaebf3cd40dd65:src/TESTING_PLAN.md:ipv4:2507 791619daf5af4806da7266fa301c0e82145b6de8:src/TESTING_PLAN.md:ipv4:2507 +f8546e35b77b69ba7b15dbe3174d2d7e375200ef:utils/utils/src/__tests__/key-generation/validate-private-key.test.ts:private-key:7 +f8546e35b77b69ba7b15dbe3174d2d7e375200ef:utils/utils/src/__tests__/key-generation/get-private-key.test.ts:private-key:23 +f8546e35b77b69ba7b15dbe3174d2d7e375200ef:utils/utils/src/__tests__/key-generation/get-private-key.test.ts:private-key:30 +f8546e35b77b69ba7b15dbe3174d2d7e375200ef:utils/utils/src/__tests__/key-generation/get-private-key.test.ts:private-key:46 diff --git a/tests/playwright/digital-letters-component-tests/create-ttl.component.spec.ts b/tests/playwright/digital-letters-component-tests/create-ttl.component.spec.ts index bb8b850ff..3c38e7a5a 100644 --- a/tests/playwright/digital-letters-component-tests/create-ttl.component.spec.ts +++ b/tests/playwright/digital-letters-component-tests/create-ttl.component.spec.ts @@ -1,5 +1,5 @@ import { expect, test } from '@playwright/test'; -import getTtl from 'helpers/dynamodb-helpers'; +import { getTtl } from 'helpers/dynamodb-helpers'; import eventPublisher from 'helpers/event-bus-helpers'; import expectToPassEventually from 'helpers/expectations'; import { v4 as uuidv4 } from 'uuid'; diff --git a/tests/playwright/digital-letters-component-tests/handle-ttl.component.spec.ts b/tests/playwright/digital-letters-component-tests/handle-ttl.component.spec.ts new file mode 100644 index 000000000..381fd85ed --- /dev/null +++ b/tests/playwright/digital-letters-component-tests/handle-ttl.component.spec.ts @@ -0,0 +1,64 @@ +import { expect, test } from '@playwright/test'; +import { deleteTtl, putTtl } from 'helpers/dynamodb-helpers'; +import expectToPassEventually from 'helpers/expectations'; +import { v4 as uuidv4 } from 'uuid'; + +test.describe('Digital Letters - Handle TTL', () => { + const baseEvent = { + profileversion: '1.0.0', + profilepublished: '2025-10', + specversion: '1.0', + source: + '/nhs/england/notify/production/primary/data-plane/digital-letters', + subject: + 'customer/920fca11-596a-4eca-9c47-99f624614658/recipient/769acdd4-6a47-496f-999f-76a6fd2c3959', + type: 'uk.nhs.notify.digital.letters.mesh.inbox.message.downloaded.v1', + time: '2023-06-20T12:00:00Z', + recordedtime: '2023-06-20T12:00:00.250Z', + severitynumber: 2, + traceparent: '00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01', + datacontenttype: 'application/json', + dataschema: + 'https://notify.nhs.uk/cloudevents/schemas/digital-letters/2025-10/digital-letter-base-data.schema.json', + dataschemaversion: '1.0', + severitytext: 'INFO', + data: { + messageReference: 'ref1', + senderId: 'sender1', + }, + } + + + test('should handle withdrawn item', async () => { + const letterId = uuidv4(); + const messageUri = `https://example.com/ttl/resource/${letterId}`; + + const event = { + ...baseEvent, + id: letterId, + data: { + ...baseEvent.data, + messageUri, + 'digital-letter-id': letterId, + } + } + + const ttlItem = { + PK: messageUri, + SK: 'TTL', + dateOfExpiry: '2023-12-31#0', + event, + ttl: (Date.now() / 1000) + 3600, + withdrawn: true, + } + + + await expectToPassEventually(async () => { + const putResponseCode = await putTtl(ttlItem); + expect(putResponseCode).toBe(201); + + const deleteResponseCode = await deleteTtl(messageUri); + expect(deleteResponseCode).toBe(200); + }); + }); +}); diff --git a/tests/playwright/helpers/dynamodb-helpers.ts b/tests/playwright/helpers/dynamodb-helpers.ts index 74782ad8c..32f3f13d4 100644 --- a/tests/playwright/helpers/dynamodb-helpers.ts +++ b/tests/playwright/helpers/dynamodb-helpers.ts @@ -1,10 +1,12 @@ -import { DynamoDBClient } from '@aws-sdk/client-dynamodb'; +import { DeleteItemCommand, DeleteItemCommandOutput, DynamoDBClient, PutItemCommand, PutItemCommandOutput } from '@aws-sdk/client-dynamodb'; import { QueryCommand, QueryCommandOutput } from '@aws-sdk/lib-dynamodb'; +import { marshall } from '@aws-sdk/util-dynamodb'; import { REGION, TTL_TABLE_NAME } from 'constants/backend-constants'; +import { TtlDynamodbRecord } from 'utils'; const dynamoDbClient = new DynamoDBClient({ region: REGION }); -async function getTtl(messageUri: string) { +export async function getTtl(messageUri: string) { const params = { TableName: TTL_TABLE_NAME, KeyConditionExpression: `PK = :messageUri`, @@ -18,4 +20,31 @@ async function getTtl(messageUri: string) { return Items ?? []; } -export default getTtl; +export async function putTtl(ttlItem: TtlDynamodbRecord) { + const params = { + TableName: TTL_TABLE_NAME, + Item: marshall(ttlItem), + }; + const request = new PutItemCommand(params); + const output: PutItemCommandOutput = await dynamoDbClient.send(request); + + return output.$metadata.httpStatusCode; +} + +export async function deleteTtl(messageUri: string) { + const params = { + TableName: TTL_TABLE_NAME, + Key:{ + PK: { + S: messageUri, + }, + SK: { + S: 'TTL', + }, + } + }; + const request = new DeleteItemCommand(params); + const output : DeleteItemCommandOutput = await dynamoDbClient.send(request); + + return output.$metadata.httpStatusCode; +} From e804b6eae03adba7017593ae3b61557c9940c61e Mon Sep 17 00:00:00 2001 From: Ian Hodges Date: Tue, 18 Nov 2025 16:38:41 +0000 Subject: [PATCH 02/16] CCM-13146 linting --- package-lock.json | 1906 +++++++++++++++-- .../handle-ttl.component.spec.ts | 15 +- tests/playwright/helpers/dynamodb-helpers.ts | 14 +- tests/playwright/package.json | 11 +- 4 files changed, 1798 insertions(+), 148 deletions(-) diff --git a/package-lock.json b/package-lock.json index feca04270..d2b1e49a7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -193,6 +193,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.928.0.tgz", "integrity": "sha512-Efenb8zV2fJJDXmp2NE4xj8Ymhp4gVJCkQ6ixhdrpfQXgd2PODO7a20C2+BhFM6aGmN3m6XWYJ64ZyhXF4pAyQ==", "license": "Apache-2.0", + "peer": true, "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", @@ -242,6 +243,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.928.0.tgz", "integrity": "sha512-e28J2uKjy2uub4u41dNnmzAu0AN3FGB+LRcLN2Qnwl9Oq3kIcByl5sM8ZD+vWpNG+SFUrUasBCq8cMnHxwXZ4w==", "license": "Apache-2.0", + "peer": true, "dependencies": { "@aws-sdk/types": "3.922.0", "@aws-sdk/xml-builder": "3.921.0", @@ -266,6 +268,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.928.0.tgz", "integrity": "sha512-tB8F9Ti0/NFyFVQX8UQtgRik88evtHpyT6WfXOB4bAY6lEnEHA0ubJZmk9y+aUeoE+OsGLx70dC3JUsiiCPJkQ==", "license": "Apache-2.0", + "peer": true, "dependencies": { "@aws-sdk/core": "3.928.0", "@aws-sdk/types": "3.922.0", @@ -282,6 +285,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.928.0.tgz", "integrity": "sha512-67ynC/8UW9Y8Gn1ZZtC3OgcQDGWrJelHmkbgpmmxYUrzVhp+NINtz3wiTzrrBFhPH/8Uy6BxvhMfXhn0ptcMEQ==", "license": "Apache-2.0", + "peer": true, "dependencies": { "@aws-sdk/core": "3.928.0", "@aws-sdk/types": "3.922.0", @@ -303,6 +307,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.928.0.tgz", "integrity": "sha512-WVWYyj+jox6mhKYp11mu8x1B6Xa2sLbXFHAv5K3Jg8CHvXYpePgTcYlCljq3d4XHC4Jl4nCcsdMtBahSpU9bAA==", "license": "Apache-2.0", + "peer": true, "dependencies": { "@aws-sdk/core": "3.928.0", "@aws-sdk/credential-provider-env": "3.928.0", @@ -327,6 +332,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.928.0.tgz", "integrity": "sha512-SdXVjxZOIXefIR/NJx+lyXOrn4m0ScTAU2JXpLsFCkW2Cafo6vTqHUghyO8vak/XQ8PpPqpLXVpGbAYFuIPW6Q==", "license": "Apache-2.0", + "peer": true, "dependencies": { "@aws-sdk/credential-provider-env": "3.928.0", "@aws-sdk/credential-provider-http": "3.928.0", @@ -350,6 +356,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.928.0.tgz", "integrity": "sha512-XL0juran8yhqwn0mreV+NJeHJOkcRBaExsvVn9fXWW37A4gLh4esSJxM2KbSNh0t+/Bk3ehBI5sL9xad+yRDuw==", "license": "Apache-2.0", + "peer": true, "dependencies": { "@aws-sdk/core": "3.928.0", "@aws-sdk/types": "3.922.0", @@ -367,6 +374,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.928.0.tgz", "integrity": "sha512-md/y+ePDsO1zqPJrsOyPs4ciKmdpqLL7B0dln1NhqZPnKIS5IBfTqZJ5tJ9eTezqc7Tn4Dbg6HiuemcGvZTeFA==", "license": "Apache-2.0", + "peer": true, "dependencies": { "@aws-sdk/client-sso": "3.928.0", "@aws-sdk/core": "3.928.0", @@ -386,6 +394,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.928.0.tgz", "integrity": "sha512-rd97nLY5e/nGOr73ZfsXD+H44iZ9wyGZTKt/2QkiBN3hot/idhgT9+XHsWhRi+o/dThQbpL8RkpAnpF+0ZGthw==", "license": "Apache-2.0", + "peer": true, "dependencies": { "@aws-sdk/core": "3.928.0", "@aws-sdk/nested-clients": "3.928.0", @@ -404,6 +413,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-endpoint-discovery/-/middleware-endpoint-discovery-3.922.0.tgz", "integrity": "sha512-F7Qhwz/bs/Wkbu4SLwKbAeQKoZ7Bzo+JPpVzSqSJGxEely8KBAfsOItXRF8c0d06OEzyeSyml0S6/3TP8T5KUw==", "license": "Apache-2.0", + "peer": true, "dependencies": { "@aws-sdk/endpoint-cache": "3.893.0", "@aws-sdk/types": "3.922.0", @@ -421,6 +431,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.922.0.tgz", "integrity": "sha512-HPquFgBnq/KqKRVkiuCt97PmWbKtxQ5iUNLEc6FIviqOoZTmaYG3EDsIbuFBz9C4RHJU4FKLmHL2bL3FEId6AA==", "license": "Apache-2.0", + "peer": true, "dependencies": { "@aws-sdk/types": "3.922.0", "@smithy/protocol-http": "^5.3.4", @@ -436,6 +447,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.922.0.tgz", "integrity": "sha512-AkvYO6b80FBm5/kk2E636zNNcNgjztNNUxpqVx+huyGn9ZqGTzS4kLqW2hO6CBe5APzVtPCtiQsXL24nzuOlAg==", "license": "Apache-2.0", + "peer": true, "dependencies": { "@aws-sdk/types": "3.922.0", "@smithy/types": "^4.8.1", @@ -450,6 +462,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.922.0.tgz", "integrity": "sha512-TtSCEDonV/9R0VhVlCpxZbp/9sxQvTTRKzIf8LxW3uXpby6Wl8IxEciBJlxmSkoqxh542WRcko7NYODlvL/gDA==", "license": "Apache-2.0", + "peer": true, "dependencies": { "@aws-sdk/types": "3.922.0", "@aws/lambda-invoke-store": "^0.1.1", @@ -466,6 +479,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.928.0.tgz", "integrity": "sha512-ESvcfLx5PtpdUM3ptCwb80toBTd3y5I4w5jaeOPHihiZr7jkRLE/nsaCKzlqscPs6UQ8xI0maav04JUiTskcHw==", "license": "Apache-2.0", + "peer": true, "dependencies": { "@aws-sdk/core": "3.928.0", "@aws-sdk/types": "3.922.0", @@ -484,6 +498,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.928.0.tgz", "integrity": "sha512-kXzfJkq2cD65KAHDe4hZCsnxcGGEWD5pjHqcZplwG4VFMa/iVn/mWrUY9QdadD2GBpXFNQbgOiKG3U2NkKu+4Q==", "license": "Apache-2.0", + "peer": true, "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", @@ -533,6 +548,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.925.0.tgz", "integrity": "sha512-FOthcdF9oDb1pfQBRCfWPZhJZT5wqpvdAS5aJzB1WDZ+6EuaAhLzLH/fW1slDunIqq1PSQGG3uSnVglVVOvPHQ==", "license": "Apache-2.0", + "peer": true, "dependencies": { "@aws-sdk/types": "3.922.0", "@smithy/config-resolver": "^4.4.2", @@ -549,6 +565,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.928.0.tgz", "integrity": "sha512-533NpTdUJNDi98zBwRp4ZpZoqULrAVfc0YgIy+8AZHzk0v7N+v59O0d2Du3YO6zN4VU8HU8766DgKiyEag6Dzg==", "license": "Apache-2.0", + "peer": true, "dependencies": { "@aws-sdk/core": "3.928.0", "@aws-sdk/nested-clients": "3.928.0", @@ -567,6 +584,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.922.0.tgz", "integrity": "sha512-eLA6XjVobAUAMivvM7DBL79mnHyrm+32TkXNWZua5mnxF+6kQCfblKKJvxMZLGosO53/Ex46ogim8IY5Nbqv2w==", "license": "Apache-2.0", + "peer": true, "dependencies": { "@smithy/types": "^4.8.1", "tslib": "^2.6.2" @@ -595,6 +613,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.922.0.tgz", "integrity": "sha512-4ZdQCSuNMY8HMlR1YN4MRDdXuKd+uQTeKIr5/pIM+g3TjInZoj8imvXudjcrFGA63UF3t92YVTkBq88mg58RXQ==", "license": "Apache-2.0", + "peer": true, "dependencies": { "@aws-sdk/types": "3.922.0", "@smithy/types": "^4.8.1", @@ -611,6 +630,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.922.0.tgz", "integrity": "sha512-qOJAERZ3Plj1st7M4Q5henl5FRpE30uLm6L9edZqZXGR6c7ry9jzexWamWVpQ4H4xVAVmiO9dIEBAfbq4mduOA==", "license": "Apache-2.0", + "peer": true, "dependencies": { "@aws-sdk/types": "3.922.0", "@smithy/types": "^4.8.1", @@ -623,6 +643,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.928.0.tgz", "integrity": "sha512-s0jP67nQLLWVWfBtqTkZUkSWK5e6OI+rs+wFya2h9VLyWBFir17XSDI891s8HZKIVCEl8eBrup+hhywm4nsIAA==", "license": "Apache-2.0", + "peer": true, "dependencies": { "@aws-sdk/middleware-user-agent": "3.928.0", "@aws-sdk/types": "3.922.0", @@ -647,6 +668,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.921.0.tgz", "integrity": "sha512-LVHg0jgjyicKKvpNIEMXIMr1EBViESxcPkqfOlT+X1FkmUMTNZEEVF18tOJg4m4hV5vxtkWcqtr4IEeWa1C41Q==", "license": "Apache-2.0", + "peer": true, "dependencies": { "@smithy/types": "^4.8.1", "fast-xml-parser": "5.2.5", @@ -661,6 +683,7 @@ "resolved": "https://registry.npmjs.org/@aws/lambda-invoke-store/-/lambda-invoke-store-0.1.1.tgz", "integrity": "sha512-RcLam17LdlbSOSp9VxmUu1eI6Mwxp+OwhD2QhiSNmNCzoDb0EeUXTD2n/WbcnrAYMGlmf05th6QYq23VqvJqpA==", "license": "Apache-2.0", + "peer": true, "engines": { "node": ">=18.0.0" } @@ -670,6 +693,7 @@ "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.2.5.tgz", "integrity": "sha512-j7HwVkBw68YW8UmFRcjZOmssE77Rvk0GWAIN1oFBhsaovQmZWYCIcGa9/pwRB0ExI8Sk9MWNALTjftjHZea7VA==", "license": "Apache-2.0", + "peer": true, "dependencies": { "@smithy/types": "^4.9.0", "tslib": "^2.6.2" @@ -683,6 +707,7 @@ "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.4.3.tgz", "integrity": "sha512-ezHLe1tKLUxDJo2LHtDuEDyWXolw8WGOR92qb4bQdWq/zKenO5BvctZGrVJBK08zjezSk7bmbKFOXIVyChvDLw==", "license": "Apache-2.0", + "peer": true, "dependencies": { "@smithy/node-config-provider": "^4.3.5", "@smithy/types": "^4.9.0", @@ -700,6 +725,7 @@ "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.18.0.tgz", "integrity": "sha512-vGSDXOJFZgOPTatSI1ly7Gwyy/d/R9zh2TO3y0JZ0uut5qQ88p9IaWaZYIWSSqtdekNM4CGok/JppxbAff4KcQ==", "license": "Apache-2.0", + "peer": true, "dependencies": { "@smithy/middleware-serde": "^4.2.5", "@smithy/protocol-http": "^5.3.5", @@ -721,6 +747,7 @@ "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.2.5.tgz", "integrity": "sha512-BZwotjoZWn9+36nimwm/OLIcVe+KYRwzMjfhd4QT7QxPm9WY0HiOV8t/Wlh+HVUif0SBVV7ksq8//hPaBC/okQ==", "license": "Apache-2.0", + "peer": true, "dependencies": { "@smithy/node-config-provider": "^4.3.5", "@smithy/property-provider": "^4.2.5", @@ -737,6 +764,7 @@ "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.3.6.tgz", "integrity": "sha512-3+RG3EA6BBJ/ofZUeTFJA7mHfSYrZtQIrDP9dI8Lf7X6Jbos2jptuLrAAteDiFVrmbEmLSuRG/bUKzfAXk7dhg==", "license": "Apache-2.0", + "peer": true, "dependencies": { "@smithy/protocol-http": "^5.3.5", "@smithy/querystring-builder": "^4.2.5", @@ -753,6 +781,7 @@ "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.3.7.tgz", "integrity": "sha512-i8Mi8OuY6Yi82Foe3iu7/yhBj1HBRoOQwBSsUNYglJTNSFaWYTNM2NauBBs/7pq2sqkLRqeUXA3Ogi2utzpUlQ==", "license": "Apache-2.0", + "peer": true, "dependencies": { "@smithy/core": "^3.18.0", "@smithy/middleware-serde": "^4.2.5", @@ -772,6 +801,7 @@ "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.2.5.tgz", "integrity": "sha512-La1ldWTJTZ5NqQyPqnCNeH9B+zjFhrNoQIL1jTh4zuqXRlmXhxYHhMtI1/92OlnoAtp6JoN7kzuwhWoXrBwPqg==", "license": "Apache-2.0", + "peer": true, "dependencies": { "@smithy/protocol-http": "^5.3.5", "@smithy/types": "^4.9.0", @@ -786,6 +816,7 @@ "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.2.5.tgz", "integrity": "sha512-bYrutc+neOyWxtZdbB2USbQttZN0mXaOyYLIsaTbJhFsfpXyGWUxJpEuO1rJ8IIJm2qH4+xJT0mxUSsEDTYwdQ==", "license": "Apache-2.0", + "peer": true, "dependencies": { "@smithy/types": "^4.9.0", "tslib": "^2.6.2" @@ -799,6 +830,7 @@ "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.3.5.tgz", "integrity": "sha512-UTurh1C4qkVCtqggI36DGbLB2Kv8UlcFdMXDcWMbqVY2uRg0XmT9Pb4Vj6oSQ34eizO1fvR0RnFV4Axw4IrrAg==", "license": "Apache-2.0", + "peer": true, "dependencies": { "@smithy/property-provider": "^4.2.5", "@smithy/shared-ini-file-loader": "^4.4.0", @@ -814,6 +846,7 @@ "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.4.5.tgz", "integrity": "sha512-CMnzM9R2WqlqXQGtIlsHMEZfXKJVTIrqCNoSd/QpAyp+Dw0a1Vps13l6ma1fH8g7zSPNsA59B/kWgeylFuA/lw==", "license": "Apache-2.0", + "peer": true, "dependencies": { "@smithy/abort-controller": "^4.2.5", "@smithy/protocol-http": "^5.3.5", @@ -830,6 +863,7 @@ "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.2.5.tgz", "integrity": "sha512-8iLN1XSE1rl4MuxvQ+5OSk/Zb5El7NJZ1td6Tn+8dQQHIjp59Lwl6bd0+nzw6SKm2wSSriH2v/I9LPzUic7EOg==", "license": "Apache-2.0", + "peer": true, "dependencies": { "@smithy/types": "^4.9.0", "tslib": "^2.6.2" @@ -843,6 +877,7 @@ "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.3.5.tgz", "integrity": "sha512-RlaL+sA0LNMp03bf7XPbFmT5gN+w3besXSWMkA8rcmxLSVfiEXElQi4O2IWwPfxzcHkxqrwBFMbngB8yx/RvaQ==", "license": "Apache-2.0", + "peer": true, "dependencies": { "@smithy/types": "^4.9.0", "tslib": "^2.6.2" @@ -856,6 +891,7 @@ "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.2.5.tgz", "integrity": "sha512-y98otMI1saoajeik2kLfGyRp11e5U/iJYH/wLCh3aTV/XutbGT9nziKGkgCaMD1ghK7p6htHMm6b6scl9JRUWg==", "license": "Apache-2.0", + "peer": true, "dependencies": { "@smithy/types": "^4.9.0", "@smithy/util-uri-escape": "^4.2.0", @@ -870,6 +906,7 @@ "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.2.5.tgz", "integrity": "sha512-031WCTdPYgiQRYNPXznHXof2YM0GwL6SeaSyTH/P72M1Vz73TvCNH2Nq8Iu2IEPq9QP2yx0/nrw5YmSeAi/AjQ==", "license": "Apache-2.0", + "peer": true, "dependencies": { "@smithy/types": "^4.9.0", "tslib": "^2.6.2" @@ -883,6 +920,7 @@ "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.4.0.tgz", "integrity": "sha512-5WmZ5+kJgJDjwXXIzr1vDTG+RhF9wzSODQBfkrQ2VVkYALKGvZX1lgVSxEkgicSAFnFhPj5rudJV0zoinqS0bA==", "license": "Apache-2.0", + "peer": true, "dependencies": { "@smithy/types": "^4.9.0", "tslib": "^2.6.2" @@ -896,6 +934,7 @@ "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.9.3.tgz", "integrity": "sha512-8tlueuTgV5n7inQCkhyptrB3jo2AO80uGrps/XTYZivv5MFQKKBj3CIWIGMI2fRY5LEduIiazOhAWdFknY1O9w==", "license": "Apache-2.0", + "peer": true, "dependencies": { "@smithy/core": "^3.18.0", "@smithy/middleware-endpoint": "^4.3.7", @@ -914,6 +953,7 @@ "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.9.0.tgz", "integrity": "sha512-MvUbdnXDTwykR8cB1WZvNNwqoWVaTRA0RLlLmf/cIFNMM2cKWz01X4Ly6SMC4Kks30r8tT3Cty0jmeWfiuyHTA==", "license": "Apache-2.0", + "peer": true, "dependencies": { "tslib": "^2.6.2" }, @@ -926,6 +966,7 @@ "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.2.5.tgz", "integrity": "sha512-VaxMGsilqFnK1CeBX+LXnSuaMx4sTL/6znSZh2829txWieazdVxr54HmiyTsIbpOTLcf5nYpq9lpzmwRdxj6rQ==", "license": "Apache-2.0", + "peer": true, "dependencies": { "@smithy/querystring-parser": "^4.2.5", "@smithy/types": "^4.9.0", @@ -940,6 +981,7 @@ "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.2.9.tgz", "integrity": "sha512-dgyribrVWN5qE5usYJ0m5M93mVM3L3TyBPZWe1Xl6uZlH2gzfQx3dz+ZCdW93lWqdedJRkOecnvbnoEEXRZ5VQ==", "license": "Apache-2.0", + "peer": true, "dependencies": { "@smithy/config-resolver": "^4.4.3", "@smithy/credential-provider-imds": "^4.2.5", @@ -958,6 +1000,7 @@ "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.2.5.tgz", "integrity": "sha512-3O63AAWu2cSNQZp+ayl9I3NapW1p1rR5mlVHcF6hAB1dPZUQFfRPYtplWX/3xrzWthPGj5FqB12taJJCfH6s8A==", "license": "Apache-2.0", + "peer": true, "dependencies": { "@smithy/node-config-provider": "^4.3.5", "@smithy/types": "^4.9.0", @@ -972,6 +1015,7 @@ "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.2.5.tgz", "integrity": "sha512-6Y3+rvBF7+PZOc40ybeZMcGln6xJGVeY60E7jy9Mv5iKpMJpHgRE6dKy9ScsVxvfAYuEX4Q9a65DQX90KaQ3bA==", "license": "Apache-2.0", + "peer": true, "dependencies": { "@smithy/types": "^4.9.0", "tslib": "^2.6.2" @@ -985,6 +1029,7 @@ "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.5.6.tgz", "integrity": "sha512-qWw/UM59TiaFrPevefOZ8CNBKbYEP6wBAIlLqxn3VAIo9rgnTNc4ASbVrqDmhuwI87usnjhdQrxodzAGFFzbRQ==", "license": "Apache-2.0", + "peer": true, "dependencies": { "@smithy/fetch-http-handler": "^5.3.6", "@smithy/node-http-handler": "^4.4.5", @@ -1004,6 +1049,7 @@ "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-4.2.5.tgz", "integrity": "sha512-Dbun99A3InifQdIrsXZ+QLcC0PGBPAdrl4cj1mTgJvyc9N2zf7QSxg8TBkzsCmGJdE3TLbO9ycwpY0EkWahQ/g==", "license": "Apache-2.0", + "peer": true, "dependencies": { "@smithy/abort-controller": "^4.2.5", "@smithy/types": "^4.9.0", @@ -1030,7 +1076,6 @@ "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/core": "^29.7.0", "@jest/types": "^29.6.3", @@ -1102,7 +1147,6 @@ "version": "29.7.0", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/core": "^29.7.0", "@jest/types": "^29.6.3", @@ -1847,7 +1891,6 @@ "node_modules/@aws-sdk/client-dynamodb": { "version": "3.914.0", "license": "Apache-2.0", - "peer": true, "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", @@ -2490,7 +2533,6 @@ "node_modules/@aws-sdk/client-s3": { "version": "3.914.0", "license": "Apache-2.0", - "peer": true, "dependencies": { "@aws-crypto/sha1-browser": "5.2.0", "@aws-crypto/sha256-browser": "5.2.0", @@ -3827,7 +3869,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": ">=18" }, @@ -3849,7 +3890,6 @@ } ], "license": "MIT", - "peer": true, "engines": { "node": ">=18" } @@ -5436,7 +5476,6 @@ "version": "30.2.0", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/environment": "30.2.0", "@jest/expect": "30.2.0", @@ -5753,7 +5792,6 @@ "version": "15.5.6", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "fast-glob": "3.3.1" } @@ -7340,7 +7378,6 @@ "version": "8.15.0", "dev": true, "license": "MIT", - "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -7797,7 +7834,6 @@ "version": "4.1.0", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@types/sinon": "^17.0.3", "sinon": "^18.0.1", @@ -8046,7 +8082,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "baseline-browser-mapping": "^2.8.9", "caniuse-lite": "^1.0.30001746", @@ -9010,7 +9045,6 @@ "version": "9.37.0", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", @@ -9204,7 +9238,6 @@ "version": "10.1.8", "dev": true, "license": "MIT", - "peer": true, "bin": { "eslint-config-prettier": "bin/cli.js" }, @@ -9260,7 +9293,6 @@ "version": "4.4.4", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "debug": "^4.4.1", "eslint-import-context": "^0.1.8", @@ -9329,7 +9361,6 @@ "version": "2.32.0", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@rtsao/scc": "^1.1.0", "array-includes": "^3.1.9", @@ -9362,7 +9393,6 @@ "version": "4.16.1", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@typescript-eslint/types": "^8.35.0", "comment-parser": "^1.4.1", @@ -9470,7 +9500,6 @@ "version": "6.10.2", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "aria-query": "^5.3.2", "array-includes": "^3.1.8", @@ -9558,7 +9587,6 @@ "version": "7.37.5", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "array-includes": "^3.1.8", "array.prototype.findlast": "^1.2.5", @@ -9590,7 +9618,6 @@ "version": "5.2.0", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=10" }, @@ -11222,7 +11249,6 @@ "version": "30.2.0", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/core": "30.2.0", "@jest/types": "30.2.0", @@ -13396,7 +13422,6 @@ "version": "26.1.0", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "cssstyle": "^4.2.1", "data-urls": "^5.0.0", @@ -13434,7 +13459,6 @@ "node_modules/jsep": { "version": "1.4.0", "license": "MIT", - "peer": true, "engines": { "node": ">= 10.16.0" } @@ -15685,7 +15709,6 @@ "version": "4.0.2", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -15870,7 +15893,6 @@ "version": "10.9.2", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@cspotcode/source-map-support": "^0.8.0", "@tsconfig/node10": "^1.0.7", @@ -16080,7 +16102,6 @@ "version": "5.9.3", "dev": true, "license": "Apache-2.0", - "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -16093,7 +16114,6 @@ "version": "8.46.1", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@typescript-eslint/eslint-plugin": "8.46.1", "@typescript-eslint/parser": "8.46.1", @@ -16760,6 +16780,7 @@ "@aws-sdk/client-s3": "^3.844.0", "@aws-sdk/client-sqs": "^3.844.0", "@aws-sdk/lib-dynamodb": "3.844.0", + "@aws-sdk/util-dynamodb": "^3.933.0", "@faker-js/faker": "^9.6.0", "@playwright/test": "^1.51.1", "utils": "^0.0.1", @@ -16769,172 +16790,1798 @@ "@types/uuid": "^10.0.0" } }, - "tests/playwright/node_modules/@aws-sdk/core": { - "version": "3.844.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.844.0.tgz", - "integrity": "sha512-pfpI54bG5Xf2NkqrDBC2REStXlDXNCw/whORhkEs+Tp5exU872D5QKguzjPA6hH+8Pvbq1qgt5zXMbduISTHJw==", + "tests/playwright/node_modules/@aws-sdk/client-dynamodb": { + "version": "3.933.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-dynamodb/-/client-dynamodb-3.933.0.tgz", + "integrity": "sha512-zRNDq5phdORYZnlof/p9inwm7B3TBwXWI6vPKzmYd+AmTMv/Ue4FQYsAcCX3JrUbTNXLK36CkaCgaH9/ydnnwg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/types": "3.840.0", - "@aws-sdk/xml-builder": "3.821.0", - "@smithy/core": "^3.7.0", - "@smithy/node-config-provider": "^4.1.3", - "@smithy/property-provider": "^4.0.4", - "@smithy/protocol-http": "^5.1.2", - "@smithy/signature-v4": "^5.1.2", - "@smithy/smithy-client": "^4.4.6", - "@smithy/types": "^4.3.1", - "@smithy/util-base64": "^4.0.0", - "@smithy/util-body-length-browser": "^4.0.0", - "@smithy/util-middleware": "^4.0.4", - "@smithy/util-utf8": "^4.0.0", - "fast-xml-parser": "5.2.5", + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.932.0", + "@aws-sdk/credential-provider-node": "3.933.0", + "@aws-sdk/middleware-endpoint-discovery": "3.930.0", + "@aws-sdk/middleware-host-header": "3.930.0", + "@aws-sdk/middleware-logger": "3.930.0", + "@aws-sdk/middleware-recursion-detection": "3.933.0", + "@aws-sdk/middleware-user-agent": "3.932.0", + "@aws-sdk/region-config-resolver": "3.930.0", + "@aws-sdk/types": "3.930.0", + "@aws-sdk/util-endpoints": "3.930.0", + "@aws-sdk/util-user-agent-browser": "3.930.0", + "@aws-sdk/util-user-agent-node": "3.932.0", + "@smithy/config-resolver": "^4.4.3", + "@smithy/core": "^3.18.2", + "@smithy/fetch-http-handler": "^5.3.6", + "@smithy/hash-node": "^4.2.5", + "@smithy/invalid-dependency": "^4.2.5", + "@smithy/middleware-content-length": "^4.2.5", + "@smithy/middleware-endpoint": "^4.3.9", + "@smithy/middleware-retry": "^4.4.9", + "@smithy/middleware-serde": "^4.2.5", + "@smithy/middleware-stack": "^4.2.5", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/node-http-handler": "^4.4.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/smithy-client": "^4.9.5", + "@smithy/types": "^4.9.0", + "@smithy/url-parser": "^4.2.5", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.8", + "@smithy/util-defaults-mode-node": "^4.2.11", + "@smithy/util-endpoints": "^3.2.5", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-retry": "^4.2.5", + "@smithy/util-utf8": "^4.2.0", + "@smithy/util-waiter": "^4.2.5", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "tests/playwright/node_modules/@aws-sdk/lib-dynamodb": { - "version": "3.844.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/lib-dynamodb/-/lib-dynamodb-3.844.0.tgz", - "integrity": "sha512-Zdv0dxyDTbCKN9AwdS8hUtW0QyMBbMuXFeHa1AhZ7mc1XACM8AF9e8840vZpSThLy+Hfp8Z0770xZfk8/DNPbA==", - "deprecated": "Please upgrade to @aws-sdk/lib-dynamodb@3.850.0 to support Command reuse https://github.com/aws/aws-sdk-js-v3/issues/7217.", + "tests/playwright/node_modules/@aws-sdk/client-dynamodb/node_modules/@aws-sdk/core": { + "version": "3.932.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.932.0.tgz", + "integrity": "sha512-AS8gypYQCbNojwgjvZGkJocC2CoEICDx9ZJ15ILsv+MlcCVLtUJSRSx3VzJOUY2EEIaGLRrPNlIqyn/9/fySvA==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/core": "3.844.0", - "@aws-sdk/util-dynamodb": "3.844.0", - "@smithy/core": "^3.7.0", - "@smithy/smithy-client": "^4.4.6", - "@smithy/types": "^4.3.1", + "@aws-sdk/types": "3.930.0", + "@aws-sdk/xml-builder": "3.930.0", + "@smithy/core": "^3.18.2", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/property-provider": "^4.2.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/signature-v4": "^5.3.5", + "@smithy/smithy-client": "^4.9.5", + "@smithy/types": "^4.9.0", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-dynamodb": "^3.844.0" } }, - "tests/playwright/node_modules/@aws-sdk/types": { - "version": "3.840.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.840.0.tgz", - "integrity": "sha512-xliuHaUFZxEx1NSXeLLZ9Dyu6+EJVQKEoD+yM+zqUo3YDZ7medKJWY6fIOKiPX/N7XbLdBYwajb15Q7IL8KkeA==", + "tests/playwright/node_modules/@aws-sdk/client-dynamodb/node_modules/@aws-sdk/types": { + "version": "3.930.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.930.0.tgz", + "integrity": "sha512-we/vaAgwlEFW7IeftmCLlLMw+6hFs3DzZPJw7lVHbj/5HJ0bz9gndxEsS2lQoeJ1zhiiLqAqvXxmM43s0MBg0A==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "tests/playwright/node_modules/@aws-sdk/util-dynamodb": { - "version": "3.844.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-dynamodb/-/util-dynamodb-3.844.0.tgz", - "integrity": "sha512-idKpV8wDQUdmv7gDh3073pceujd1D6bGqYZTLXWprHBao44iyHnY97FIx8zhBEHLi4HxzD2HqHzpljTAOwgYjQ==", + "tests/playwright/node_modules/@aws-sdk/client-dynamodb/node_modules/@aws-sdk/xml-builder": { + "version": "3.930.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.930.0.tgz", + "integrity": "sha512-YIfkD17GocxdmlUVc3ia52QhcWuRIUJonbF8A2CYfcWNV3HzvAqpcPeC0bYUhkK+8e8YO1ARnLKZQE0TlwzorA==", "license": "Apache-2.0", "dependencies": { + "@smithy/types": "^4.9.0", + "fast-xml-parser": "5.2.5", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-dynamodb": "^3.844.0" } }, - "tests/playwright/node_modules/@aws-sdk/xml-builder": { - "version": "3.821.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.821.0.tgz", - "integrity": "sha512-DIIotRnefVL6DiaHtO6/21DhJ4JZnnIwdNbpwiAhdt/AVbttcE4yw925gsjur0OGv5BTYXQXU3YnANBYnZjuQA==", + "tests/playwright/node_modules/@aws-sdk/client-sso": { + "version": "3.933.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.933.0.tgz", + "integrity": "sha512-zwGLSiK48z3PzKpQiDMKP85+fpIrPMF1qQOQW9OW7BGj5AuBZIisT2O4VzIgYJeh+t47MLU7VgBQL7muc+MJDg==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.3.1", + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.932.0", + "@aws-sdk/middleware-host-header": "3.930.0", + "@aws-sdk/middleware-logger": "3.930.0", + "@aws-sdk/middleware-recursion-detection": "3.933.0", + "@aws-sdk/middleware-user-agent": "3.932.0", + "@aws-sdk/region-config-resolver": "3.930.0", + "@aws-sdk/types": "3.930.0", + "@aws-sdk/util-endpoints": "3.930.0", + "@aws-sdk/util-user-agent-browser": "3.930.0", + "@aws-sdk/util-user-agent-node": "3.932.0", + "@smithy/config-resolver": "^4.4.3", + "@smithy/core": "^3.18.2", + "@smithy/fetch-http-handler": "^5.3.6", + "@smithy/hash-node": "^4.2.5", + "@smithy/invalid-dependency": "^4.2.5", + "@smithy/middleware-content-length": "^4.2.5", + "@smithy/middleware-endpoint": "^4.3.9", + "@smithy/middleware-retry": "^4.4.9", + "@smithy/middleware-serde": "^4.2.5", + "@smithy/middleware-stack": "^4.2.5", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/node-http-handler": "^4.4.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/smithy-client": "^4.9.5", + "@smithy/types": "^4.9.0", + "@smithy/url-parser": "^4.2.5", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.8", + "@smithy/util-defaults-mode-node": "^4.2.11", + "@smithy/util-endpoints": "^3.2.5", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-retry": "^4.2.5", + "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "tests/playwright/node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "utils/utils": { - "version": "0.0.1", + "tests/playwright/node_modules/@aws-sdk/client-sso/node_modules/@aws-sdk/core": { + "version": "3.932.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.932.0.tgz", + "integrity": "sha512-AS8gypYQCbNojwgjvZGkJocC2CoEICDx9ZJ15ILsv+MlcCVLtUJSRSx3VzJOUY2EEIaGLRrPNlIqyn/9/fySvA==", + "license": "Apache-2.0", "dependencies": { - "@aws-sdk/client-dynamodb": "^3.914.0", - "@aws-sdk/client-eventbridge": "^3.918.0", - "@aws-sdk/client-lambda": "^3.914.0", - "@aws-sdk/client-s3": "^3.914.0", - "@aws-sdk/client-sqs": "^3.914.0", - "@aws-sdk/client-ssm": "^3.914.0", - "@aws-sdk/lib-dynamodb": "^3.914.0", - "@aws-sdk/lib-storage": "^3.914.0", - "async-mutex": "^0.4.0", - "date-fns": "^4.1.0", - "winston": "^3.17.0", - "zod": "^4.1.12" + "@aws-sdk/types": "3.930.0", + "@aws-sdk/xml-builder": "3.930.0", + "@smithy/core": "^3.18.2", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/property-provider": "^4.2.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/signature-v4": "^5.3.5", + "@smithy/smithy-client": "^4.9.5", + "@smithy/types": "^4.9.0", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" }, - "devDependencies": { - "@aws-sdk/types": "^3.914.0", - "@tsconfig/node22": "^22.0.2", - "@types/aws-lambda": "^8.10.148", - "@types/jest": "^29.5.14", - "@types/node": "^24.0.10", - "aws-sdk-client-mock": "^4.1.0", - "aws-sdk-client-mock-jest": "^4.1.0", - "jest": "^29.7.0", - "jest-mock-extended": "^3.0.7", - "typescript": "^5.8.2" + "engines": { + "node": ">=18.0.0" } }, - "utils/utils/node_modules/@aws-sdk/types": { - "version": "3.922.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.922.0.tgz", - "integrity": "sha512-eLA6XjVobAUAMivvM7DBL79mnHyrm+32TkXNWZua5mnxF+6kQCfblKKJvxMZLGosO53/Ex46ogim8IY5Nbqv2w==", - "dev": true, + "tests/playwright/node_modules/@aws-sdk/client-sso/node_modules/@aws-sdk/types": { + "version": "3.930.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.930.0.tgz", + "integrity": "sha512-we/vaAgwlEFW7IeftmCLlLMw+6hFs3DzZPJw7lVHbj/5HJ0bz9gndxEsS2lQoeJ1zhiiLqAqvXxmM43s0MBg0A==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.8.1", + "@smithy/types": "^4.9.0", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "utils/utils/node_modules/@smithy/types": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.9.0.tgz", - "integrity": "sha512-MvUbdnXDTwykR8cB1WZvNNwqoWVaTRA0RLlLmf/cIFNMM2cKWz01X4Ly6SMC4Kks30r8tT3Cty0jmeWfiuyHTA==", - "dev": true, + "tests/playwright/node_modules/@aws-sdk/client-sso/node_modules/@aws-sdk/xml-builder": { + "version": "3.930.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.930.0.tgz", + "integrity": "sha512-YIfkD17GocxdmlUVc3ia52QhcWuRIUJonbF8A2CYfcWNV3HzvAqpcPeC0bYUhkK+8e8YO1ARnLKZQE0TlwzorA==", "license": "Apache-2.0", "dependencies": { + "@smithy/types": "^4.9.0", + "fast-xml-parser": "5.2.5", "tslib": "^2.6.2" }, "engines": { "node": ">=18.0.0" } }, - "utils/utils/node_modules/@types/jest": { - "version": "29.5.14", - "dev": true, - "license": "MIT", + "tests/playwright/node_modules/@aws-sdk/core": { + "version": "3.844.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.844.0.tgz", + "integrity": "sha512-pfpI54bG5Xf2NkqrDBC2REStXlDXNCw/whORhkEs+Tp5exU872D5QKguzjPA6hH+8Pvbq1qgt5zXMbduISTHJw==", + "license": "Apache-2.0", "dependencies": { - "expect": "^29.0.0", - "pretty-format": "^29.0.0" + "@aws-sdk/types": "3.840.0", + "@aws-sdk/xml-builder": "3.821.0", + "@smithy/core": "^3.7.0", + "@smithy/node-config-provider": "^4.1.3", + "@smithy/property-provider": "^4.0.4", + "@smithy/protocol-http": "^5.1.2", + "@smithy/signature-v4": "^5.1.2", + "@smithy/smithy-client": "^4.4.6", + "@smithy/types": "^4.3.1", + "@smithy/util-base64": "^4.0.0", + "@smithy/util-body-length-browser": "^4.0.0", + "@smithy/util-middleware": "^4.0.4", + "@smithy/util-utf8": "^4.0.0", + "fast-xml-parser": "5.2.5", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" } }, - "utils/utils/node_modules/@types/node": { - "version": "24.7.2", - "dev": true, - "license": "MIT", + "tests/playwright/node_modules/@aws-sdk/credential-provider-env": { + "version": "3.932.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.932.0.tgz", + "integrity": "sha512-ozge/c7NdHUDyHqro6+P5oHt8wfKSUBN+olttiVfBe9Mw3wBMpPa3gQ0pZnG+gwBkKskBuip2bMR16tqYvUSEA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.932.0", + "@aws-sdk/types": "3.930.0", + "@smithy/property-provider": "^4.2.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "tests/playwright/node_modules/@aws-sdk/credential-provider-env/node_modules/@aws-sdk/core": { + "version": "3.932.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.932.0.tgz", + "integrity": "sha512-AS8gypYQCbNojwgjvZGkJocC2CoEICDx9ZJ15ILsv+MlcCVLtUJSRSx3VzJOUY2EEIaGLRrPNlIqyn/9/fySvA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.930.0", + "@aws-sdk/xml-builder": "3.930.0", + "@smithy/core": "^3.18.2", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/property-provider": "^4.2.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/signature-v4": "^5.3.5", + "@smithy/smithy-client": "^4.9.5", + "@smithy/types": "^4.9.0", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "tests/playwright/node_modules/@aws-sdk/credential-provider-env/node_modules/@aws-sdk/types": { + "version": "3.930.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.930.0.tgz", + "integrity": "sha512-we/vaAgwlEFW7IeftmCLlLMw+6hFs3DzZPJw7lVHbj/5HJ0bz9gndxEsS2lQoeJ1zhiiLqAqvXxmM43s0MBg0A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "tests/playwright/node_modules/@aws-sdk/credential-provider-env/node_modules/@aws-sdk/xml-builder": { + "version": "3.930.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.930.0.tgz", + "integrity": "sha512-YIfkD17GocxdmlUVc3ia52QhcWuRIUJonbF8A2CYfcWNV3HzvAqpcPeC0bYUhkK+8e8YO1ARnLKZQE0TlwzorA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "fast-xml-parser": "5.2.5", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "tests/playwright/node_modules/@aws-sdk/credential-provider-http": { + "version": "3.932.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.932.0.tgz", + "integrity": "sha512-b6N9Nnlg8JInQwzBkUq5spNaXssM3h3zLxGzpPrnw0nHSIWPJPTbZzA5Ca285fcDUFuKP+qf3qkuqlAjGOdWhg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.932.0", + "@aws-sdk/types": "3.930.0", + "@smithy/fetch-http-handler": "^5.3.6", + "@smithy/node-http-handler": "^4.4.5", + "@smithy/property-provider": "^4.2.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/smithy-client": "^4.9.5", + "@smithy/types": "^4.9.0", + "@smithy/util-stream": "^4.5.6", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "tests/playwright/node_modules/@aws-sdk/credential-provider-http/node_modules/@aws-sdk/core": { + "version": "3.932.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.932.0.tgz", + "integrity": "sha512-AS8gypYQCbNojwgjvZGkJocC2CoEICDx9ZJ15ILsv+MlcCVLtUJSRSx3VzJOUY2EEIaGLRrPNlIqyn/9/fySvA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.930.0", + "@aws-sdk/xml-builder": "3.930.0", + "@smithy/core": "^3.18.2", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/property-provider": "^4.2.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/signature-v4": "^5.3.5", + "@smithy/smithy-client": "^4.9.5", + "@smithy/types": "^4.9.0", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "tests/playwright/node_modules/@aws-sdk/credential-provider-http/node_modules/@aws-sdk/types": { + "version": "3.930.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.930.0.tgz", + "integrity": "sha512-we/vaAgwlEFW7IeftmCLlLMw+6hFs3DzZPJw7lVHbj/5HJ0bz9gndxEsS2lQoeJ1zhiiLqAqvXxmM43s0MBg0A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "tests/playwright/node_modules/@aws-sdk/credential-provider-http/node_modules/@aws-sdk/xml-builder": { + "version": "3.930.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.930.0.tgz", + "integrity": "sha512-YIfkD17GocxdmlUVc3ia52QhcWuRIUJonbF8A2CYfcWNV3HzvAqpcPeC0bYUhkK+8e8YO1ARnLKZQE0TlwzorA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "fast-xml-parser": "5.2.5", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "tests/playwright/node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.933.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.933.0.tgz", + "integrity": "sha512-HygGyKuMG5AaGXsmM0d81miWDon55xwalRHB3UmDg3QBhtunbNIoIaWUbNTKuBZXcIN6emeeEZw/YgSMqLc0YA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.932.0", + "@aws-sdk/credential-provider-env": "3.932.0", + "@aws-sdk/credential-provider-http": "3.932.0", + "@aws-sdk/credential-provider-process": "3.932.0", + "@aws-sdk/credential-provider-sso": "3.933.0", + "@aws-sdk/credential-provider-web-identity": "3.933.0", + "@aws-sdk/nested-clients": "3.933.0", + "@aws-sdk/types": "3.930.0", + "@smithy/credential-provider-imds": "^4.2.5", + "@smithy/property-provider": "^4.2.5", + "@smithy/shared-ini-file-loader": "^4.4.0", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "tests/playwright/node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-sdk/core": { + "version": "3.932.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.932.0.tgz", + "integrity": "sha512-AS8gypYQCbNojwgjvZGkJocC2CoEICDx9ZJ15ILsv+MlcCVLtUJSRSx3VzJOUY2EEIaGLRrPNlIqyn/9/fySvA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.930.0", + "@aws-sdk/xml-builder": "3.930.0", + "@smithy/core": "^3.18.2", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/property-provider": "^4.2.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/signature-v4": "^5.3.5", + "@smithy/smithy-client": "^4.9.5", + "@smithy/types": "^4.9.0", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "tests/playwright/node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-sdk/types": { + "version": "3.930.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.930.0.tgz", + "integrity": "sha512-we/vaAgwlEFW7IeftmCLlLMw+6hFs3DzZPJw7lVHbj/5HJ0bz9gndxEsS2lQoeJ1zhiiLqAqvXxmM43s0MBg0A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "tests/playwright/node_modules/@aws-sdk/credential-provider-ini/node_modules/@aws-sdk/xml-builder": { + "version": "3.930.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.930.0.tgz", + "integrity": "sha512-YIfkD17GocxdmlUVc3ia52QhcWuRIUJonbF8A2CYfcWNV3HzvAqpcPeC0bYUhkK+8e8YO1ARnLKZQE0TlwzorA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "fast-xml-parser": "5.2.5", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "tests/playwright/node_modules/@aws-sdk/credential-provider-node": { + "version": "3.933.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.933.0.tgz", + "integrity": "sha512-L2dE0Y7iMLammQewPKNeEh1z/fdJyYEU+/QsLBD9VEh+SXcN/FIyTi21Isw8wPZN6lMB9PDVtISzBnF8HuSFrw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.932.0", + "@aws-sdk/credential-provider-http": "3.932.0", + "@aws-sdk/credential-provider-ini": "3.933.0", + "@aws-sdk/credential-provider-process": "3.932.0", + "@aws-sdk/credential-provider-sso": "3.933.0", + "@aws-sdk/credential-provider-web-identity": "3.933.0", + "@aws-sdk/types": "3.930.0", + "@smithy/credential-provider-imds": "^4.2.5", + "@smithy/property-provider": "^4.2.5", + "@smithy/shared-ini-file-loader": "^4.4.0", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "tests/playwright/node_modules/@aws-sdk/credential-provider-node/node_modules/@aws-sdk/types": { + "version": "3.930.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.930.0.tgz", + "integrity": "sha512-we/vaAgwlEFW7IeftmCLlLMw+6hFs3DzZPJw7lVHbj/5HJ0bz9gndxEsS2lQoeJ1zhiiLqAqvXxmM43s0MBg0A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "tests/playwright/node_modules/@aws-sdk/credential-provider-process": { + "version": "3.932.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.932.0.tgz", + "integrity": "sha512-BodZYKvT4p/Dkm28Ql/FhDdS1+p51bcZeMMu2TRtU8PoMDHnVDhHz27zASEKSZwmhvquxHrZHB0IGuVqjZUtSQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.932.0", + "@aws-sdk/types": "3.930.0", + "@smithy/property-provider": "^4.2.5", + "@smithy/shared-ini-file-loader": "^4.4.0", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "tests/playwright/node_modules/@aws-sdk/credential-provider-process/node_modules/@aws-sdk/core": { + "version": "3.932.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.932.0.tgz", + "integrity": "sha512-AS8gypYQCbNojwgjvZGkJocC2CoEICDx9ZJ15ILsv+MlcCVLtUJSRSx3VzJOUY2EEIaGLRrPNlIqyn/9/fySvA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.930.0", + "@aws-sdk/xml-builder": "3.930.0", + "@smithy/core": "^3.18.2", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/property-provider": "^4.2.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/signature-v4": "^5.3.5", + "@smithy/smithy-client": "^4.9.5", + "@smithy/types": "^4.9.0", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "tests/playwright/node_modules/@aws-sdk/credential-provider-process/node_modules/@aws-sdk/types": { + "version": "3.930.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.930.0.tgz", + "integrity": "sha512-we/vaAgwlEFW7IeftmCLlLMw+6hFs3DzZPJw7lVHbj/5HJ0bz9gndxEsS2lQoeJ1zhiiLqAqvXxmM43s0MBg0A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "tests/playwright/node_modules/@aws-sdk/credential-provider-process/node_modules/@aws-sdk/xml-builder": { + "version": "3.930.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.930.0.tgz", + "integrity": "sha512-YIfkD17GocxdmlUVc3ia52QhcWuRIUJonbF8A2CYfcWNV3HzvAqpcPeC0bYUhkK+8e8YO1ARnLKZQE0TlwzorA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "fast-xml-parser": "5.2.5", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "tests/playwright/node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.933.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.933.0.tgz", + "integrity": "sha512-/R1DBR7xNcuZIhS2RirU+P2o8E8/fOk+iLAhbqeSTq+g09fP/F6W7ouFpS5eVE2NIfWG7YBFoVddOhvuqpn51g==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/client-sso": "3.933.0", + "@aws-sdk/core": "3.932.0", + "@aws-sdk/token-providers": "3.933.0", + "@aws-sdk/types": "3.930.0", + "@smithy/property-provider": "^4.2.5", + "@smithy/shared-ini-file-loader": "^4.4.0", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "tests/playwright/node_modules/@aws-sdk/credential-provider-sso/node_modules/@aws-sdk/core": { + "version": "3.932.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.932.0.tgz", + "integrity": "sha512-AS8gypYQCbNojwgjvZGkJocC2CoEICDx9ZJ15ILsv+MlcCVLtUJSRSx3VzJOUY2EEIaGLRrPNlIqyn/9/fySvA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.930.0", + "@aws-sdk/xml-builder": "3.930.0", + "@smithy/core": "^3.18.2", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/property-provider": "^4.2.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/signature-v4": "^5.3.5", + "@smithy/smithy-client": "^4.9.5", + "@smithy/types": "^4.9.0", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "tests/playwright/node_modules/@aws-sdk/credential-provider-sso/node_modules/@aws-sdk/types": { + "version": "3.930.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.930.0.tgz", + "integrity": "sha512-we/vaAgwlEFW7IeftmCLlLMw+6hFs3DzZPJw7lVHbj/5HJ0bz9gndxEsS2lQoeJ1zhiiLqAqvXxmM43s0MBg0A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "tests/playwright/node_modules/@aws-sdk/credential-provider-sso/node_modules/@aws-sdk/xml-builder": { + "version": "3.930.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.930.0.tgz", + "integrity": "sha512-YIfkD17GocxdmlUVc3ia52QhcWuRIUJonbF8A2CYfcWNV3HzvAqpcPeC0bYUhkK+8e8YO1ARnLKZQE0TlwzorA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "fast-xml-parser": "5.2.5", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "tests/playwright/node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.933.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.933.0.tgz", + "integrity": "sha512-c7Eccw2lhFx2/+qJn3g+uIDWRuWi2A6Sz3PVvckFUEzPsP0dPUo19hlvtarwP5GzrsXn0yEPRVhpewsIaSCGaQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.932.0", + "@aws-sdk/nested-clients": "3.933.0", + "@aws-sdk/types": "3.930.0", + "@smithy/property-provider": "^4.2.5", + "@smithy/shared-ini-file-loader": "^4.4.0", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "tests/playwright/node_modules/@aws-sdk/credential-provider-web-identity/node_modules/@aws-sdk/core": { + "version": "3.932.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.932.0.tgz", + "integrity": "sha512-AS8gypYQCbNojwgjvZGkJocC2CoEICDx9ZJ15ILsv+MlcCVLtUJSRSx3VzJOUY2EEIaGLRrPNlIqyn/9/fySvA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.930.0", + "@aws-sdk/xml-builder": "3.930.0", + "@smithy/core": "^3.18.2", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/property-provider": "^4.2.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/signature-v4": "^5.3.5", + "@smithy/smithy-client": "^4.9.5", + "@smithy/types": "^4.9.0", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "tests/playwright/node_modules/@aws-sdk/credential-provider-web-identity/node_modules/@aws-sdk/types": { + "version": "3.930.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.930.0.tgz", + "integrity": "sha512-we/vaAgwlEFW7IeftmCLlLMw+6hFs3DzZPJw7lVHbj/5HJ0bz9gndxEsS2lQoeJ1zhiiLqAqvXxmM43s0MBg0A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "tests/playwright/node_modules/@aws-sdk/credential-provider-web-identity/node_modules/@aws-sdk/xml-builder": { + "version": "3.930.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.930.0.tgz", + "integrity": "sha512-YIfkD17GocxdmlUVc3ia52QhcWuRIUJonbF8A2CYfcWNV3HzvAqpcPeC0bYUhkK+8e8YO1ARnLKZQE0TlwzorA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "fast-xml-parser": "5.2.5", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "tests/playwright/node_modules/@aws-sdk/lib-dynamodb": { + "version": "3.844.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/lib-dynamodb/-/lib-dynamodb-3.844.0.tgz", + "integrity": "sha512-Zdv0dxyDTbCKN9AwdS8hUtW0QyMBbMuXFeHa1AhZ7mc1XACM8AF9e8840vZpSThLy+Hfp8Z0770xZfk8/DNPbA==", + "deprecated": "Please upgrade to @aws-sdk/lib-dynamodb@3.850.0 to support Command reuse https://github.com/aws/aws-sdk-js-v3/issues/7217.", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.844.0", + "@aws-sdk/util-dynamodb": "3.844.0", + "@smithy/core": "^3.7.0", + "@smithy/smithy-client": "^4.4.6", + "@smithy/types": "^4.3.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-dynamodb": "^3.844.0" + } + }, + "tests/playwright/node_modules/@aws-sdk/lib-dynamodb/node_modules/@aws-sdk/util-dynamodb": { + "version": "3.844.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-dynamodb/-/util-dynamodb-3.844.0.tgz", + "integrity": "sha512-idKpV8wDQUdmv7gDh3073pceujd1D6bGqYZTLXWprHBao44iyHnY97FIx8zhBEHLi4HxzD2HqHzpljTAOwgYjQ==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-dynamodb": "^3.844.0" + } + }, + "tests/playwright/node_modules/@aws-sdk/middleware-endpoint-discovery": { + "version": "3.930.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-endpoint-discovery/-/middleware-endpoint-discovery-3.930.0.tgz", + "integrity": "sha512-OnYrqT4lUA6X9PjB7l89dlIt/iYglrd3J9iEL/L/S41W/OD7wC70ZLGqMxKn6kUTK7ORr6BGcFyT349KgBRISw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/endpoint-cache": "3.893.0", + "@aws-sdk/types": "3.930.0", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "tests/playwright/node_modules/@aws-sdk/middleware-endpoint-discovery/node_modules/@aws-sdk/types": { + "version": "3.930.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.930.0.tgz", + "integrity": "sha512-we/vaAgwlEFW7IeftmCLlLMw+6hFs3DzZPJw7lVHbj/5HJ0bz9gndxEsS2lQoeJ1zhiiLqAqvXxmM43s0MBg0A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "tests/playwright/node_modules/@aws-sdk/middleware-host-header": { + "version": "3.930.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.930.0.tgz", + "integrity": "sha512-x30jmm3TLu7b/b+67nMyoV0NlbnCVT5DI57yDrhXAPCtdgM1KtdLWt45UcHpKOm1JsaIkmYRh2WYu7Anx4MG0g==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.930.0", + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "tests/playwright/node_modules/@aws-sdk/middleware-host-header/node_modules/@aws-sdk/types": { + "version": "3.930.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.930.0.tgz", + "integrity": "sha512-we/vaAgwlEFW7IeftmCLlLMw+6hFs3DzZPJw7lVHbj/5HJ0bz9gndxEsS2lQoeJ1zhiiLqAqvXxmM43s0MBg0A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "tests/playwright/node_modules/@aws-sdk/middleware-logger": { + "version": "3.930.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.930.0.tgz", + "integrity": "sha512-vh4JBWzMCBW8wREvAwoSqB2geKsZwSHTa0nSt0OMOLp2PdTYIZDi0ZiVMmpfnjcx9XbS6aSluLv9sKx4RrG46A==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.930.0", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "tests/playwright/node_modules/@aws-sdk/middleware-logger/node_modules/@aws-sdk/types": { + "version": "3.930.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.930.0.tgz", + "integrity": "sha512-we/vaAgwlEFW7IeftmCLlLMw+6hFs3DzZPJw7lVHbj/5HJ0bz9gndxEsS2lQoeJ1zhiiLqAqvXxmM43s0MBg0A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "tests/playwright/node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.933.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.933.0.tgz", + "integrity": "sha512-qgrMlkVKzTCAdNw2A05DC2sPBo0KRQ7wk+lbYSRJnWVzcrceJhnmhoZVV5PFv7JtchK7sHVcfm9lcpiyd+XaCA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.930.0", + "@aws/lambda-invoke-store": "^0.2.0", + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "tests/playwright/node_modules/@aws-sdk/middleware-recursion-detection/node_modules/@aws-sdk/types": { + "version": "3.930.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.930.0.tgz", + "integrity": "sha512-we/vaAgwlEFW7IeftmCLlLMw+6hFs3DzZPJw7lVHbj/5HJ0bz9gndxEsS2lQoeJ1zhiiLqAqvXxmM43s0MBg0A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "tests/playwright/node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.932.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.932.0.tgz", + "integrity": "sha512-9BGTbJyA/4PTdwQWE9hAFIJGpsYkyEW20WON3i15aDqo5oRZwZmqaVageOD57YYqG8JDJjvcwKyDdR4cc38dvg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.932.0", + "@aws-sdk/types": "3.930.0", + "@aws-sdk/util-endpoints": "3.930.0", + "@smithy/core": "^3.18.2", + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "tests/playwright/node_modules/@aws-sdk/middleware-user-agent/node_modules/@aws-sdk/core": { + "version": "3.932.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.932.0.tgz", + "integrity": "sha512-AS8gypYQCbNojwgjvZGkJocC2CoEICDx9ZJ15ILsv+MlcCVLtUJSRSx3VzJOUY2EEIaGLRrPNlIqyn/9/fySvA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.930.0", + "@aws-sdk/xml-builder": "3.930.0", + "@smithy/core": "^3.18.2", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/property-provider": "^4.2.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/signature-v4": "^5.3.5", + "@smithy/smithy-client": "^4.9.5", + "@smithy/types": "^4.9.0", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "tests/playwright/node_modules/@aws-sdk/middleware-user-agent/node_modules/@aws-sdk/types": { + "version": "3.930.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.930.0.tgz", + "integrity": "sha512-we/vaAgwlEFW7IeftmCLlLMw+6hFs3DzZPJw7lVHbj/5HJ0bz9gndxEsS2lQoeJ1zhiiLqAqvXxmM43s0MBg0A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "tests/playwright/node_modules/@aws-sdk/middleware-user-agent/node_modules/@aws-sdk/xml-builder": { + "version": "3.930.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.930.0.tgz", + "integrity": "sha512-YIfkD17GocxdmlUVc3ia52QhcWuRIUJonbF8A2CYfcWNV3HzvAqpcPeC0bYUhkK+8e8YO1ARnLKZQE0TlwzorA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "fast-xml-parser": "5.2.5", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "tests/playwright/node_modules/@aws-sdk/nested-clients": { + "version": "3.933.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.933.0.tgz", + "integrity": "sha512-o1GX0+IPlFi/D8ei9y/jj3yucJWNfPnbB5appVBWevAyUdZA5KzQ2nK/hDxiu9olTZlFEFpf1m1Rn3FaGxHqsw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.932.0", + "@aws-sdk/middleware-host-header": "3.930.0", + "@aws-sdk/middleware-logger": "3.930.0", + "@aws-sdk/middleware-recursion-detection": "3.933.0", + "@aws-sdk/middleware-user-agent": "3.932.0", + "@aws-sdk/region-config-resolver": "3.930.0", + "@aws-sdk/types": "3.930.0", + "@aws-sdk/util-endpoints": "3.930.0", + "@aws-sdk/util-user-agent-browser": "3.930.0", + "@aws-sdk/util-user-agent-node": "3.932.0", + "@smithy/config-resolver": "^4.4.3", + "@smithy/core": "^3.18.2", + "@smithy/fetch-http-handler": "^5.3.6", + "@smithy/hash-node": "^4.2.5", + "@smithy/invalid-dependency": "^4.2.5", + "@smithy/middleware-content-length": "^4.2.5", + "@smithy/middleware-endpoint": "^4.3.9", + "@smithy/middleware-retry": "^4.4.9", + "@smithy/middleware-serde": "^4.2.5", + "@smithy/middleware-stack": "^4.2.5", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/node-http-handler": "^4.4.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/smithy-client": "^4.9.5", + "@smithy/types": "^4.9.0", + "@smithy/url-parser": "^4.2.5", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.8", + "@smithy/util-defaults-mode-node": "^4.2.11", + "@smithy/util-endpoints": "^3.2.5", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-retry": "^4.2.5", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "tests/playwright/node_modules/@aws-sdk/nested-clients/node_modules/@aws-sdk/core": { + "version": "3.932.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.932.0.tgz", + "integrity": "sha512-AS8gypYQCbNojwgjvZGkJocC2CoEICDx9ZJ15ILsv+MlcCVLtUJSRSx3VzJOUY2EEIaGLRrPNlIqyn/9/fySvA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.930.0", + "@aws-sdk/xml-builder": "3.930.0", + "@smithy/core": "^3.18.2", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/property-provider": "^4.2.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/signature-v4": "^5.3.5", + "@smithy/smithy-client": "^4.9.5", + "@smithy/types": "^4.9.0", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "tests/playwright/node_modules/@aws-sdk/nested-clients/node_modules/@aws-sdk/types": { + "version": "3.930.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.930.0.tgz", + "integrity": "sha512-we/vaAgwlEFW7IeftmCLlLMw+6hFs3DzZPJw7lVHbj/5HJ0bz9gndxEsS2lQoeJ1zhiiLqAqvXxmM43s0MBg0A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "tests/playwright/node_modules/@aws-sdk/nested-clients/node_modules/@aws-sdk/xml-builder": { + "version": "3.930.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.930.0.tgz", + "integrity": "sha512-YIfkD17GocxdmlUVc3ia52QhcWuRIUJonbF8A2CYfcWNV3HzvAqpcPeC0bYUhkK+8e8YO1ARnLKZQE0TlwzorA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "fast-xml-parser": "5.2.5", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "tests/playwright/node_modules/@aws-sdk/region-config-resolver": { + "version": "3.930.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.930.0.tgz", + "integrity": "sha512-KL2JZqH6aYeQssu1g1KuWsReupdfOoxD6f1as2VC+rdwYFUu4LfzMsFfXnBvvQWWqQ7rZHWOw1T+o5gJmg7Dzw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.930.0", + "@smithy/config-resolver": "^4.4.3", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "tests/playwright/node_modules/@aws-sdk/region-config-resolver/node_modules/@aws-sdk/types": { + "version": "3.930.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.930.0.tgz", + "integrity": "sha512-we/vaAgwlEFW7IeftmCLlLMw+6hFs3DzZPJw7lVHbj/5HJ0bz9gndxEsS2lQoeJ1zhiiLqAqvXxmM43s0MBg0A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "tests/playwright/node_modules/@aws-sdk/token-providers": { + "version": "3.933.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.933.0.tgz", + "integrity": "sha512-Qzq7zj9yXUgAAJEbbmqRhm0jmUndl8nHG0AbxFEfCfQRVZWL96Qzx0mf8lYwT9hIMrXncLwy31HOthmbXwFRwQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.932.0", + "@aws-sdk/nested-clients": "3.933.0", + "@aws-sdk/types": "3.930.0", + "@smithy/property-provider": "^4.2.5", + "@smithy/shared-ini-file-loader": "^4.4.0", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "tests/playwright/node_modules/@aws-sdk/token-providers/node_modules/@aws-sdk/core": { + "version": "3.932.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.932.0.tgz", + "integrity": "sha512-AS8gypYQCbNojwgjvZGkJocC2CoEICDx9ZJ15ILsv+MlcCVLtUJSRSx3VzJOUY2EEIaGLRrPNlIqyn/9/fySvA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.930.0", + "@aws-sdk/xml-builder": "3.930.0", + "@smithy/core": "^3.18.2", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/property-provider": "^4.2.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/signature-v4": "^5.3.5", + "@smithy/smithy-client": "^4.9.5", + "@smithy/types": "^4.9.0", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "tests/playwright/node_modules/@aws-sdk/token-providers/node_modules/@aws-sdk/types": { + "version": "3.930.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.930.0.tgz", + "integrity": "sha512-we/vaAgwlEFW7IeftmCLlLMw+6hFs3DzZPJw7lVHbj/5HJ0bz9gndxEsS2lQoeJ1zhiiLqAqvXxmM43s0MBg0A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "tests/playwright/node_modules/@aws-sdk/token-providers/node_modules/@aws-sdk/xml-builder": { + "version": "3.930.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.930.0.tgz", + "integrity": "sha512-YIfkD17GocxdmlUVc3ia52QhcWuRIUJonbF8A2CYfcWNV3HzvAqpcPeC0bYUhkK+8e8YO1ARnLKZQE0TlwzorA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "fast-xml-parser": "5.2.5", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "tests/playwright/node_modules/@aws-sdk/types": { + "version": "3.840.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.840.0.tgz", + "integrity": "sha512-xliuHaUFZxEx1NSXeLLZ9Dyu6+EJVQKEoD+yM+zqUo3YDZ7medKJWY6fIOKiPX/N7XbLdBYwajb15Q7IL8KkeA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.3.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "tests/playwright/node_modules/@aws-sdk/util-dynamodb": { + "version": "3.933.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-dynamodb/-/util-dynamodb-3.933.0.tgz", + "integrity": "sha512-uFMOXZIG1xAispPenRkaz7/nEz1WHaiKZnzHGay66pQ1fjD8S3Fi3uNwy9u5djhJPm7GF5SkupUGTkJ6vvcltQ==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-dynamodb": "^3.933.0" + } + }, + "tests/playwright/node_modules/@aws-sdk/util-endpoints": { + "version": "3.930.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.930.0.tgz", + "integrity": "sha512-M2oEKBzzNAYr136RRc6uqw3aWlwCxqTP1Lawps9E1d2abRPvl1p1ztQmmXp1Ak4rv8eByIZ+yQyKQ3zPdRG5dw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.930.0", + "@smithy/types": "^4.9.0", + "@smithy/url-parser": "^4.2.5", + "@smithy/util-endpoints": "^3.2.5", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "tests/playwright/node_modules/@aws-sdk/util-endpoints/node_modules/@aws-sdk/types": { + "version": "3.930.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.930.0.tgz", + "integrity": "sha512-we/vaAgwlEFW7IeftmCLlLMw+6hFs3DzZPJw7lVHbj/5HJ0bz9gndxEsS2lQoeJ1zhiiLqAqvXxmM43s0MBg0A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "tests/playwright/node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.930.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.930.0.tgz", + "integrity": "sha512-q6lCRm6UAe+e1LguM5E4EqM9brQlDem4XDcQ87NzEvlTW6GzmNCO0w1jS0XgCFXQHjDxjdlNFX+5sRbHijwklg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.930.0", + "@smithy/types": "^4.9.0", + "bowser": "^2.11.0", + "tslib": "^2.6.2" + } + }, + "tests/playwright/node_modules/@aws-sdk/util-user-agent-browser/node_modules/@aws-sdk/types": { + "version": "3.930.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.930.0.tgz", + "integrity": "sha512-we/vaAgwlEFW7IeftmCLlLMw+6hFs3DzZPJw7lVHbj/5HJ0bz9gndxEsS2lQoeJ1zhiiLqAqvXxmM43s0MBg0A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "tests/playwright/node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.932.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.932.0.tgz", + "integrity": "sha512-/kC6cscHrZL74TrZtgiIL5jJNbVsw9duGGPurmaVgoCbP7NnxyaSWEurbNV3VPNPhNE3bV3g4Ci+odq+AlsYQg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/middleware-user-agent": "3.932.0", + "@aws-sdk/types": "3.930.0", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "aws-crt": ">=1.0.0" + }, + "peerDependenciesMeta": { + "aws-crt": { + "optional": true + } + } + }, + "tests/playwright/node_modules/@aws-sdk/util-user-agent-node/node_modules/@aws-sdk/types": { + "version": "3.930.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.930.0.tgz", + "integrity": "sha512-we/vaAgwlEFW7IeftmCLlLMw+6hFs3DzZPJw7lVHbj/5HJ0bz9gndxEsS2lQoeJ1zhiiLqAqvXxmM43s0MBg0A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "tests/playwright/node_modules/@aws-sdk/xml-builder": { + "version": "3.821.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.821.0.tgz", + "integrity": "sha512-DIIotRnefVL6DiaHtO6/21DhJ4JZnnIwdNbpwiAhdt/AVbttcE4yw925gsjur0OGv5BTYXQXU3YnANBYnZjuQA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.3.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "tests/playwright/node_modules/@aws/lambda-invoke-store": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@aws/lambda-invoke-store/-/lambda-invoke-store-0.2.0.tgz", + "integrity": "sha512-D1jAmAZQYMoPiacfgNf7AWhg3DFN3Wq/vQv3WINt9znwjzHp2x+WzdJFxxj7xZL7V1U79As6G8f7PorMYWBKsQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=18.0.0" + } + }, + "tests/playwright/node_modules/@smithy/abort-controller": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.2.5.tgz", + "integrity": "sha512-j7HwVkBw68YW8UmFRcjZOmssE77Rvk0GWAIN1oFBhsaovQmZWYCIcGa9/pwRB0ExI8Sk9MWNALTjftjHZea7VA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "tests/playwright/node_modules/@smithy/config-resolver": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.4.3.tgz", + "integrity": "sha512-ezHLe1tKLUxDJo2LHtDuEDyWXolw8WGOR92qb4bQdWq/zKenO5BvctZGrVJBK08zjezSk7bmbKFOXIVyChvDLw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/node-config-provider": "^4.3.5", + "@smithy/types": "^4.9.0", + "@smithy/util-config-provider": "^4.2.0", + "@smithy/util-endpoints": "^3.2.5", + "@smithy/util-middleware": "^4.2.5", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "tests/playwright/node_modules/@smithy/core": { + "version": "3.18.4", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.18.4.tgz", + "integrity": "sha512-o5tMqPZILBvvROfC8vC+dSVnWJl9a0u9ax1i1+Bq8515eYjUJqqk5XjjEsDLoeL5dSqGSh6WGdVx1eJ1E/Nwhw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/middleware-serde": "^4.2.6", + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-stream": "^4.5.6", + "@smithy/util-utf8": "^4.2.0", + "@smithy/uuid": "^1.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "tests/playwright/node_modules/@smithy/credential-provider-imds": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.2.5.tgz", + "integrity": "sha512-BZwotjoZWn9+36nimwm/OLIcVe+KYRwzMjfhd4QT7QxPm9WY0HiOV8t/Wlh+HVUif0SBVV7ksq8//hPaBC/okQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/node-config-provider": "^4.3.5", + "@smithy/property-provider": "^4.2.5", + "@smithy/types": "^4.9.0", + "@smithy/url-parser": "^4.2.5", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "tests/playwright/node_modules/@smithy/fetch-http-handler": { + "version": "5.3.6", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.3.6.tgz", + "integrity": "sha512-3+RG3EA6BBJ/ofZUeTFJA7mHfSYrZtQIrDP9dI8Lf7X6Jbos2jptuLrAAteDiFVrmbEmLSuRG/bUKzfAXk7dhg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/protocol-http": "^5.3.5", + "@smithy/querystring-builder": "^4.2.5", + "@smithy/types": "^4.9.0", + "@smithy/util-base64": "^4.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "tests/playwright/node_modules/@smithy/hash-node": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.2.5.tgz", + "integrity": "sha512-DpYX914YOfA3UDT9CN1BM787PcHfWRBB43fFGCYrZFUH0Jv+5t8yYl+Pd5PW4+QzoGEDvn5d5QIO4j2HyYZQSA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "@smithy/util-buffer-from": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "tests/playwright/node_modules/@smithy/invalid-dependency": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.2.5.tgz", + "integrity": "sha512-2L2erASEro1WC5nV+plwIMxrTXpvpfzl4e+Nre6vBVRR2HKeGGcvpJyyL3/PpiSg+cJG2KpTmZmq934Olb6e5A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "tests/playwright/node_modules/@smithy/middleware-content-length": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.2.5.tgz", + "integrity": "sha512-Y/RabVa5vbl5FuHYV2vUCwvh/dqzrEY/K2yWPSqvhFUwIY0atLqO4TienjBXakoy4zrKAMCZwg+YEqmH7jaN7A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "tests/playwright/node_modules/@smithy/middleware-endpoint": { + "version": "4.3.11", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.3.11.tgz", + "integrity": "sha512-eJXq9VJzEer1W7EQh3HY2PDJdEcEUnv6sKuNt4eVjyeNWcQFS4KmnY+CKkYOIR6tSqarn6bjjCqg1UB+8UJiPQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/core": "^3.18.4", + "@smithy/middleware-serde": "^4.2.6", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/shared-ini-file-loader": "^4.4.0", + "@smithy/types": "^4.9.0", + "@smithy/url-parser": "^4.2.5", + "@smithy/util-middleware": "^4.2.5", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "tests/playwright/node_modules/@smithy/middleware-retry": { + "version": "4.4.11", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.4.11.tgz", + "integrity": "sha512-EL5OQHvFOKneJVRgzRW4lU7yidSwp/vRJOe542bHgExN3KNThr1rlg0iE4k4SnA+ohC+qlUxoK+smKeAYPzfAQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/node-config-provider": "^4.3.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/service-error-classification": "^4.2.5", + "@smithy/smithy-client": "^4.9.7", + "@smithy/types": "^4.9.0", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-retry": "^4.2.5", + "@smithy/uuid": "^1.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "tests/playwright/node_modules/@smithy/middleware-serde": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.2.6.tgz", + "integrity": "sha512-VkLoE/z7e2g8pirwisLz8XJWedUSY8my/qrp81VmAdyrhi94T+riBfwP+AOEEFR9rFTSonC/5D2eWNmFabHyGQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "tests/playwright/node_modules/@smithy/middleware-stack": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.2.5.tgz", + "integrity": "sha512-bYrutc+neOyWxtZdbB2USbQttZN0mXaOyYLIsaTbJhFsfpXyGWUxJpEuO1rJ8IIJm2qH4+xJT0mxUSsEDTYwdQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "tests/playwright/node_modules/@smithy/node-config-provider": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.3.5.tgz", + "integrity": "sha512-UTurh1C4qkVCtqggI36DGbLB2Kv8UlcFdMXDcWMbqVY2uRg0XmT9Pb4Vj6oSQ34eizO1fvR0RnFV4Axw4IrrAg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/property-provider": "^4.2.5", + "@smithy/shared-ini-file-loader": "^4.4.0", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "tests/playwright/node_modules/@smithy/node-http-handler": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.4.5.tgz", + "integrity": "sha512-CMnzM9R2WqlqXQGtIlsHMEZfXKJVTIrqCNoSd/QpAyp+Dw0a1Vps13l6ma1fH8g7zSPNsA59B/kWgeylFuA/lw==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/abort-controller": "^4.2.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/querystring-builder": "^4.2.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "tests/playwright/node_modules/@smithy/property-provider": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.2.5.tgz", + "integrity": "sha512-8iLN1XSE1rl4MuxvQ+5OSk/Zb5El7NJZ1td6Tn+8dQQHIjp59Lwl6bd0+nzw6SKm2wSSriH2v/I9LPzUic7EOg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "tests/playwright/node_modules/@smithy/protocol-http": { + "version": "5.3.5", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.3.5.tgz", + "integrity": "sha512-RlaL+sA0LNMp03bf7XPbFmT5gN+w3besXSWMkA8rcmxLSVfiEXElQi4O2IWwPfxzcHkxqrwBFMbngB8yx/RvaQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "tests/playwright/node_modules/@smithy/querystring-builder": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.2.5.tgz", + "integrity": "sha512-y98otMI1saoajeik2kLfGyRp11e5U/iJYH/wLCh3aTV/XutbGT9nziKGkgCaMD1ghK7p6htHMm6b6scl9JRUWg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "@smithy/util-uri-escape": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "tests/playwright/node_modules/@smithy/querystring-parser": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.2.5.tgz", + "integrity": "sha512-031WCTdPYgiQRYNPXznHXof2YM0GwL6SeaSyTH/P72M1Vz73TvCNH2Nq8Iu2IEPq9QP2yx0/nrw5YmSeAi/AjQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "tests/playwright/node_modules/@smithy/service-error-classification": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.2.5.tgz", + "integrity": "sha512-8fEvK+WPE3wUAcDvqDQG1Vk3ANLR8Px979te96m84CbKAjBVf25rPYSzb4xU4hlTyho7VhOGnh5i62D/JVF0JQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "tests/playwright/node_modules/@smithy/shared-ini-file-loader": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.4.0.tgz", + "integrity": "sha512-5WmZ5+kJgJDjwXXIzr1vDTG+RhF9wzSODQBfkrQ2VVkYALKGvZX1lgVSxEkgicSAFnFhPj5rudJV0zoinqS0bA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "tests/playwright/node_modules/@smithy/signature-v4": { + "version": "5.3.5", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.3.5.tgz", + "integrity": "sha512-xSUfMu1FT7ccfSXkoLl/QRQBi2rOvi3tiBZU2Tdy3I6cgvZ6SEi9QNey+lqps/sJRnogIS+lq+B1gxxbra2a/w==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/is-array-buffer": "^4.2.0", + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", + "@smithy/util-hex-encoding": "^4.2.0", + "@smithy/util-middleware": "^4.2.5", + "@smithy/util-uri-escape": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "tests/playwright/node_modules/@smithy/smithy-client": { + "version": "4.9.7", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.9.7.tgz", + "integrity": "sha512-pskaE4kg0P9xNQWihfqlTMyxyFR3CH6Sr6keHYghgyqqDXzjl2QJg5lAzuVe/LzZiOzcbcVtxKYi1/fZPt/3DA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/core": "^3.18.4", + "@smithy/middleware-endpoint": "^4.3.11", + "@smithy/middleware-stack": "^4.2.5", + "@smithy/protocol-http": "^5.3.5", + "@smithy/types": "^4.9.0", + "@smithy/util-stream": "^4.5.6", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "tests/playwright/node_modules/@smithy/types": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.9.0.tgz", + "integrity": "sha512-MvUbdnXDTwykR8cB1WZvNNwqoWVaTRA0RLlLmf/cIFNMM2cKWz01X4Ly6SMC4Kks30r8tT3Cty0jmeWfiuyHTA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "tests/playwright/node_modules/@smithy/url-parser": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.2.5.tgz", + "integrity": "sha512-VaxMGsilqFnK1CeBX+LXnSuaMx4sTL/6znSZh2829txWieazdVxr54HmiyTsIbpOTLcf5nYpq9lpzmwRdxj6rQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/querystring-parser": "^4.2.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "tests/playwright/node_modules/@smithy/util-defaults-mode-browser": { + "version": "4.3.10", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.3.10.tgz", + "integrity": "sha512-3iA3JVO1VLrP21FsZZpMCeF93aqP3uIOMvymAT3qHIJz2YlgDeRvNUspFwCNqd/j3qqILQJGtsVQnJZICh/9YA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/property-provider": "^4.2.5", + "@smithy/smithy-client": "^4.9.7", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "tests/playwright/node_modules/@smithy/util-defaults-mode-node": { + "version": "4.2.13", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.2.13.tgz", + "integrity": "sha512-PTc6IpnpSGASuzZAgyUtaVfOFpU0jBD2mcGwrgDuHf7PlFgt5TIPxCYBDbFQs06jxgeV3kd/d/sok1pzV0nJRg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/config-resolver": "^4.4.3", + "@smithy/credential-provider-imds": "^4.2.5", + "@smithy/node-config-provider": "^4.3.5", + "@smithy/property-provider": "^4.2.5", + "@smithy/smithy-client": "^4.9.7", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "tests/playwright/node_modules/@smithy/util-endpoints": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.2.5.tgz", + "integrity": "sha512-3O63AAWu2cSNQZp+ayl9I3NapW1p1rR5mlVHcF6hAB1dPZUQFfRPYtplWX/3xrzWthPGj5FqB12taJJCfH6s8A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/node-config-provider": "^4.3.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "tests/playwright/node_modules/@smithy/util-middleware": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.2.5.tgz", + "integrity": "sha512-6Y3+rvBF7+PZOc40ybeZMcGln6xJGVeY60E7jy9Mv5iKpMJpHgRE6dKy9ScsVxvfAYuEX4Q9a65DQX90KaQ3bA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "tests/playwright/node_modules/@smithy/util-retry": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.2.5.tgz", + "integrity": "sha512-GBj3+EZBbN4NAqJ/7pAhsXdfzdlznOh8PydUijy6FpNIMnHPSMO2/rP4HKu+UFeikJxShERk528oy7GT79YiJg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/service-error-classification": "^4.2.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "tests/playwright/node_modules/@smithy/util-stream": { + "version": "4.5.6", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.5.6.tgz", + "integrity": "sha512-qWw/UM59TiaFrPevefOZ8CNBKbYEP6wBAIlLqxn3VAIo9rgnTNc4ASbVrqDmhuwI87usnjhdQrxodzAGFFzbRQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/fetch-http-handler": "^5.3.6", + "@smithy/node-http-handler": "^4.4.5", + "@smithy/types": "^4.9.0", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-buffer-from": "^4.2.0", + "@smithy/util-hex-encoding": "^4.2.0", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "tests/playwright/node_modules/@smithy/util-waiter": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-4.2.5.tgz", + "integrity": "sha512-Dbun99A3InifQdIrsXZ+QLcC0PGBPAdrl4cj1mTgJvyc9N2zf7QSxg8TBkzsCmGJdE3TLbO9ycwpY0EkWahQ/g==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/abort-controller": "^4.2.5", + "@smithy/types": "^4.9.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "tests/playwright/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "utils/utils": { + "version": "0.0.1", + "dependencies": { + "@aws-sdk/client-dynamodb": "^3.914.0", + "@aws-sdk/client-eventbridge": "^3.918.0", + "@aws-sdk/client-lambda": "^3.914.0", + "@aws-sdk/client-s3": "^3.914.0", + "@aws-sdk/client-sqs": "^3.914.0", + "@aws-sdk/client-ssm": "^3.914.0", + "@aws-sdk/lib-dynamodb": "^3.914.0", + "@aws-sdk/lib-storage": "^3.914.0", + "async-mutex": "^0.4.0", + "date-fns": "^4.1.0", + "winston": "^3.17.0", + "zod": "^4.1.12" + }, + "devDependencies": { + "@aws-sdk/types": "^3.914.0", + "@tsconfig/node22": "^22.0.2", + "@types/aws-lambda": "^8.10.148", + "@types/jest": "^29.5.14", + "@types/node": "^24.0.10", + "aws-sdk-client-mock": "^4.1.0", + "aws-sdk-client-mock-jest": "^4.1.0", + "jest": "^29.7.0", + "jest-mock-extended": "^3.0.7", + "typescript": "^5.8.2" + } + }, + "utils/utils/node_modules/@aws-sdk/types": { + "version": "3.922.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.922.0.tgz", + "integrity": "sha512-eLA6XjVobAUAMivvM7DBL79mnHyrm+32TkXNWZua5mnxF+6kQCfblKKJvxMZLGosO53/Ex46ogim8IY5Nbqv2w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.8.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "utils/utils/node_modules/@smithy/types": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.9.0.tgz", + "integrity": "sha512-MvUbdnXDTwykR8cB1WZvNNwqoWVaTRA0RLlLmf/cIFNMM2cKWz01X4Ly6SMC4Kks30r8tT3Cty0jmeWfiuyHTA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "utils/utils/node_modules/@types/jest": { + "version": "29.5.14", + "dev": true, + "license": "MIT", + "dependencies": { + "expect": "^29.0.0", + "pretty-format": "^29.0.0" + } + }, + "utils/utils/node_modules/@types/node": { + "version": "24.7.2", + "dev": true, + "license": "MIT", "dependencies": { "undici-types": "~7.14.0" } @@ -16943,7 +18590,6 @@ "version": "29.7.0", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/core": "^29.7.0", "@jest/types": "^29.6.3", diff --git a/tests/playwright/digital-letters-component-tests/handle-ttl.component.spec.ts b/tests/playwright/digital-letters-component-tests/handle-ttl.component.spec.ts index 381fd85ed..980dcb44d 100644 --- a/tests/playwright/digital-letters-component-tests/handle-ttl.component.spec.ts +++ b/tests/playwright/digital-letters-component-tests/handle-ttl.component.spec.ts @@ -8,8 +8,7 @@ test.describe('Digital Letters - Handle TTL', () => { profileversion: '1.0.0', profilepublished: '2025-10', specversion: '1.0', - source: - '/nhs/england/notify/production/primary/data-plane/digital-letters', + source: '/nhs/england/notify/production/primary/data-plane/digital-letters', subject: 'customer/920fca11-596a-4eca-9c47-99f624614658/recipient/769acdd4-6a47-496f-999f-76a6fd2c3959', type: 'uk.nhs.notify.digital.letters.mesh.inbox.message.downloaded.v1', @@ -26,8 +25,7 @@ test.describe('Digital Letters - Handle TTL', () => { messageReference: 'ref1', senderId: 'sender1', }, - } - + }; test('should handle withdrawn item', async () => { const letterId = uuidv4(); @@ -40,18 +38,17 @@ test.describe('Digital Letters - Handle TTL', () => { ...baseEvent.data, messageUri, 'digital-letter-id': letterId, - } - } + }, + }; const ttlItem = { PK: messageUri, SK: 'TTL', dateOfExpiry: '2023-12-31#0', event, - ttl: (Date.now() / 1000) + 3600, + ttl: Date.now() / 1000 + 3600, withdrawn: true, - } - + }; await expectToPassEventually(async () => { const putResponseCode = await putTtl(ttlItem); diff --git a/tests/playwright/helpers/dynamodb-helpers.ts b/tests/playwright/helpers/dynamodb-helpers.ts index 32f3f13d4..e9b9db65e 100644 --- a/tests/playwright/helpers/dynamodb-helpers.ts +++ b/tests/playwright/helpers/dynamodb-helpers.ts @@ -1,4 +1,10 @@ -import { DeleteItemCommand, DeleteItemCommandOutput, DynamoDBClient, PutItemCommand, PutItemCommandOutput } from '@aws-sdk/client-dynamodb'; +import { + DeleteItemCommand, + DeleteItemCommandOutput, + DynamoDBClient, + PutItemCommand, + PutItemCommandOutput, +} from '@aws-sdk/client-dynamodb'; import { QueryCommand, QueryCommandOutput } from '@aws-sdk/lib-dynamodb'; import { marshall } from '@aws-sdk/util-dynamodb'; import { REGION, TTL_TABLE_NAME } from 'constants/backend-constants'; @@ -34,17 +40,17 @@ export async function putTtl(ttlItem: TtlDynamodbRecord) { export async function deleteTtl(messageUri: string) { const params = { TableName: TTL_TABLE_NAME, - Key:{ + Key: { PK: { S: messageUri, }, SK: { S: 'TTL', }, - } + }, }; const request = new DeleteItemCommand(params); - const output : DeleteItemCommandOutput = await dynamoDbClient.send(request); + const output: DeleteItemCommandOutput = await dynamoDbClient.send(request); return output.$metadata.httpStatusCode; } diff --git a/tests/playwright/package.json b/tests/playwright/package.json index fa34790d1..0eecd0c06 100644 --- a/tests/playwright/package.json +++ b/tests/playwright/package.json @@ -1,16 +1,20 @@ { "dependencies": { "@aws-sdk/client-cloudwatch-logs": "^3.844.0", + "@aws-sdk/client-dynamodb": "^3.844.0", "@aws-sdk/client-lambda": "^3.844.0", "@aws-sdk/client-s3": "^3.844.0", "@aws-sdk/client-sqs": "^3.844.0", - "@aws-sdk/client-dynamodb": "^3.844.0", "@aws-sdk/lib-dynamodb": "3.844.0", + "@aws-sdk/util-dynamodb": "^3.933.0", "@faker-js/faker": "^9.6.0", "@playwright/test": "^1.51.1", "utils": "^0.0.1", "uuid": "^8.3.2" }, + "devDependencies": { + "@types/uuid": "^10.0.0" + }, "name": "nhs-notify-digital-letters-integration-tests", "private": true, "scripts": { @@ -20,8 +24,5 @@ "test:unit": "echo \"Unit tests not required\"", "typecheck": "tsc --noEmit" }, - "version": "0.0.1", - "devDependencies": { - "@types/uuid": "^10.0.0" - } + "version": "0.0.1" } From efee2dfbde85629f9094edb2bec37057a0678cb8 Mon Sep 17 00:00:00 2001 From: Ian Hodges Date: Thu, 20 Nov 2025 08:47:26 +0000 Subject: [PATCH 03/16] CCM-13146 small rejig --- .../handle-ttl.component.spec.ts | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/tests/playwright/digital-letters-component-tests/handle-ttl.component.spec.ts b/tests/playwright/digital-letters-component-tests/handle-ttl.component.spec.ts index 980dcb44d..db59e0440 100644 --- a/tests/playwright/digital-letters-component-tests/handle-ttl.component.spec.ts +++ b/tests/playwright/digital-letters-component-tests/handle-ttl.component.spec.ts @@ -50,12 +50,14 @@ test.describe('Digital Letters - Handle TTL', () => { withdrawn: true, }; - await expectToPassEventually(async () => { - const putResponseCode = await putTtl(ttlItem); - expect(putResponseCode).toBe(201); + const putResponseCode = await putTtl(ttlItem); + expect(putResponseCode).toBe(200); + + const deleteResponseCode = await deleteTtl(messageUri); + expect(deleteResponseCode).toBe(200); - const deleteResponseCode = await deleteTtl(messageUri); - expect(deleteResponseCode).toBe(200); + await expectToPassEventually(async () => { + // Check lambda log for withdrawn messageReference. }); }); }); From 46e18ee6f3884f49b665060c6bd3338ec8d1e435 Mon Sep 17 00:00:00 2001 From: Ian Hodges Date: Fri, 5 Dec 2025 10:20:10 +0000 Subject: [PATCH 04/16] CCM-13146 give delivery.logs.amazonaws.com access to our cmk --- infrastructure/terraform/components/dl/module_kms.tf | 1 + 1 file changed, 1 insertion(+) diff --git a/infrastructure/terraform/components/dl/module_kms.tf b/infrastructure/terraform/components/dl/module_kms.tf index 972e79f46..eaf28a8fa 100644 --- a/infrastructure/terraform/components/dl/module_kms.tf +++ b/infrastructure/terraform/components/dl/module_kms.tf @@ -33,6 +33,7 @@ data "aws_iam_policy_document" "kms" { identifiers = [ "events.amazonaws.com", + "delivery.logs.amazonaws.com" ] } From e8b983631d029530b642490d03911bc56873c740 Mon Sep 17 00:00:00 2001 From: Ian Hodges Date: Fri, 5 Dec 2025 10:21:01 +0000 Subject: [PATCH 05/16] CCM-13146 remove the cloudwatch log resource policy --- .../dl/cloudwatch_log_group_event_bus.tf | 72 ++++++++++--------- 1 file changed, 38 insertions(+), 34 deletions(-) diff --git a/infrastructure/terraform/components/dl/cloudwatch_log_group_event_bus.tf b/infrastructure/terraform/components/dl/cloudwatch_log_group_event_bus.tf index c355b77ee..5f72e0609 100644 --- a/infrastructure/terraform/components/dl/cloudwatch_log_group_event_bus.tf +++ b/infrastructure/terraform/components/dl/cloudwatch_log_group_event_bus.tf @@ -4,38 +4,42 @@ resource "aws_cloudwatch_log_group" "event_bus" { kms_key_id = module.kms.key_arn } -resource "aws_cloudwatch_log_resource_policy" "event_bus" { - policy_document = data.aws_iam_policy_document.event_bus_logs.json - policy_name = "AWSLogDeliveryWrite-${aws_cloudwatch_event_bus.main.name}" -} +# resource "aws_cloudwatch_log_resource_policy" "event_bus" { +# policy_document = data.aws_iam_policy_document.event_bus_logs.json +# policy_name = "AWSLogDeliveryWrite-${aws_cloudwatch_event_bus.main.name}" +# } -data "aws_iam_policy_document" "event_bus_logs" { - statement { - effect = "Allow" - principals { - type = "Service" - identifiers = ["delivery.logs.amazonaws.com"] - } - actions = [ - "logs:CreateLogStream", - "logs:PutLogEvents" - ] - resources = [ - "${aws_cloudwatch_log_group.event_bus.arn}:log-stream:*" - ] - condition { - test = "StringEquals" - variable = "aws:SourceAccount" - values = [var.aws_account_id] - } - condition { - test = "ArnLike" - variable = "aws:SourceArn" - values = [ - aws_cloudwatch_log_delivery_source.main_info_logs.arn, - aws_cloudwatch_log_delivery_source.main_error_logs.arn, - aws_cloudwatch_log_delivery_source.main_trace_logs.arn - ] - } - } -} +# data "aws_iam_policy_document" "event_bus_logs" { +# statement { +# effect = "Allow" +# principals { +# type = "Service" +# identifiers = [ +# "delivery.logs.amazonaws.com", +# "events.amazonaws.com" +# ] +# } +# actions = [ +# "logs:CreateLogStream", +# "logs:PutLogEvents" +# ] +# resources = [ +# aws_cloudwatch_log_group.event_bus.arn, +# "${aws_cloudwatch_log_group.event_bus.arn}:log-stream:*" +# ] +# condition { +# test = "StringEquals" +# variable = "aws:SourceAccount" +# values = [var.aws_account_id] +# } +# condition { +# test = "ArnLike" +# variable = "aws:SourceArn" +# values = [ +# aws_cloudwatch_log_delivery_source.main_info_logs.arn, +# aws_cloudwatch_log_delivery_source.main_error_logs.arn, +# aws_cloudwatch_log_delivery_source.main_trace_logs.arn +# ] +# } +# } +# } From 7f04a9b4f6f5c09febd4d1360d403e95a6a8139a Mon Sep 17 00:00:00 2001 From: Ian Hodges Date: Fri, 5 Dec 2025 12:23:50 +0000 Subject: [PATCH 06/16] CCM-13146 remove config that hopefully aws will add for us automatically --- .../components/dl/cloudwatch_event_bus.tf | 19 --------- .../dl/cloudwatch_log_delivery_event_bus.tf | 28 ------------- .../dl/cloudwatch_log_group_event_bus.tf | 40 ------------------- 3 files changed, 87 deletions(-) delete mode 100644 infrastructure/terraform/components/dl/cloudwatch_log_delivery_event_bus.tf diff --git a/infrastructure/terraform/components/dl/cloudwatch_event_bus.tf b/infrastructure/terraform/components/dl/cloudwatch_event_bus.tf index f187bee5a..d07f495fb 100644 --- a/infrastructure/terraform/components/dl/cloudwatch_event_bus.tf +++ b/infrastructure/terraform/components/dl/cloudwatch_event_bus.tf @@ -8,22 +8,3 @@ resource "aws_cloudwatch_event_bus" "main" { level = "TRACE" } } - -# CloudWatch Log Delivery Sources for INFO, ERROR, and TRACE logs -resource "aws_cloudwatch_log_delivery_source" "main_info_logs" { - name = "EventBusSource-${aws_cloudwatch_event_bus.main.name}-INFO_LOGS" - log_type = "INFO_LOGS" - resource_arn = aws_cloudwatch_event_bus.main.arn -} - -resource "aws_cloudwatch_log_delivery_source" "main_error_logs" { - name = "EventBusSource-${aws_cloudwatch_event_bus.main.name}-ERROR_LOGS" - log_type = "ERROR_LOGS" - resource_arn = aws_cloudwatch_event_bus.main.arn -} - -resource "aws_cloudwatch_log_delivery_source" "main_trace_logs" { - name = "EventBusSource-${aws_cloudwatch_event_bus.main.name}-TRACE_LOGS" - log_type = "TRACE_LOGS" - resource_arn = aws_cloudwatch_event_bus.main.arn -} diff --git a/infrastructure/terraform/components/dl/cloudwatch_log_delivery_event_bus.tf b/infrastructure/terraform/components/dl/cloudwatch_log_delivery_event_bus.tf deleted file mode 100644 index c09a60d62..000000000 --- a/infrastructure/terraform/components/dl/cloudwatch_log_delivery_event_bus.tf +++ /dev/null @@ -1,28 +0,0 @@ -resource "aws_cloudwatch_log_delivery_destination" "event_bus" { - name = "EventsDeliveryDestination-${aws_cloudwatch_event_bus.main.name}" - - delivery_destination_configuration { - destination_resource_arn = aws_cloudwatch_log_group.event_bus.arn - } -} - -resource "aws_cloudwatch_log_delivery" "events_info_logs" { - delivery_destination_arn = aws_cloudwatch_log_delivery_destination.event_bus.arn - delivery_source_name = aws_cloudwatch_log_delivery_source.main_info_logs.name -} - -resource "aws_cloudwatch_log_delivery" "events_error_logs" { - delivery_destination_arn = aws_cloudwatch_log_delivery_destination.event_bus.arn - delivery_source_name = aws_cloudwatch_log_delivery_source.main_error_logs.name - depends_on = [ - aws_cloudwatch_log_delivery.events_info_logs - ] -} - -resource "aws_cloudwatch_log_delivery" "events_trace_logs" { - delivery_destination_arn = aws_cloudwatch_log_delivery_destination.event_bus.arn - delivery_source_name = aws_cloudwatch_log_delivery_source.main_trace_logs.name - depends_on = [ - aws_cloudwatch_log_delivery.events_error_logs - ] -} diff --git a/infrastructure/terraform/components/dl/cloudwatch_log_group_event_bus.tf b/infrastructure/terraform/components/dl/cloudwatch_log_group_event_bus.tf index 5f72e0609..42711d48a 100644 --- a/infrastructure/terraform/components/dl/cloudwatch_log_group_event_bus.tf +++ b/infrastructure/terraform/components/dl/cloudwatch_log_group_event_bus.tf @@ -3,43 +3,3 @@ resource "aws_cloudwatch_log_group" "event_bus" { retention_in_days = var.log_retention_in_days kms_key_id = module.kms.key_arn } - -# resource "aws_cloudwatch_log_resource_policy" "event_bus" { -# policy_document = data.aws_iam_policy_document.event_bus_logs.json -# policy_name = "AWSLogDeliveryWrite-${aws_cloudwatch_event_bus.main.name}" -# } - -# data "aws_iam_policy_document" "event_bus_logs" { -# statement { -# effect = "Allow" -# principals { -# type = "Service" -# identifiers = [ -# "delivery.logs.amazonaws.com", -# "events.amazonaws.com" -# ] -# } -# actions = [ -# "logs:CreateLogStream", -# "logs:PutLogEvents" -# ] -# resources = [ -# aws_cloudwatch_log_group.event_bus.arn, -# "${aws_cloudwatch_log_group.event_bus.arn}:log-stream:*" -# ] -# condition { -# test = "StringEquals" -# variable = "aws:SourceAccount" -# values = [var.aws_account_id] -# } -# condition { -# test = "ArnLike" -# variable = "aws:SourceArn" -# values = [ -# aws_cloudwatch_log_delivery_source.main_info_logs.arn, -# aws_cloudwatch_log_delivery_source.main_error_logs.arn, -# aws_cloudwatch_log_delivery_source.main_trace_logs.arn -# ] -# } -# } -# } From fdf47c1eb700a0fa124cd5cf01cd0e37f0622a5f Mon Sep 17 00:00:00 2001 From: Ian Hodges Date: Fri, 5 Dec 2025 13:04:10 +0000 Subject: [PATCH 07/16] CCM-13146 update tests to query cloudwatch --- .../handle-ttl.component.spec.ts | 49 ++++++++++++++++++- .../playwright/helpers/cloudwatch-helpers.ts | 36 ++++++++++++++ utils/utils/src/index.ts | 1 + 3 files changed, 85 insertions(+), 1 deletion(-) create mode 100644 tests/playwright/helpers/cloudwatch-helpers.ts diff --git a/tests/playwright/digital-letters-component-tests/handle-ttl.component.spec.ts b/tests/playwright/digital-letters-component-tests/handle-ttl.component.spec.ts index db59e0440..aa3c291b3 100644 --- a/tests/playwright/digital-letters-component-tests/handle-ttl.component.spec.ts +++ b/tests/playwright/digital-letters-component-tests/handle-ttl.component.spec.ts @@ -1,4 +1,6 @@ import { expect, test } from '@playwright/test'; +import { ENV } from 'constants/backend-constants'; +import { getLogsFromCloudwatch } from 'helpers/cloudwatch-helpers'; import { deleteTtl, putTtl } from 'helpers/dynamodb-helpers'; import expectToPassEventually from 'helpers/expectations'; import { v4 as uuidv4 } from 'uuid'; @@ -57,7 +59,52 @@ test.describe('Digital Letters - Handle TTL', () => { expect(deleteResponseCode).toBe(200); await expectToPassEventually(async () => { - // Check lambda log for withdrawn messageReference. + const eventLogEntry = await getLogsFromCloudwatch( + `/aws/lambda/nhs-${ENV}-dl-ttl-handle-expiry`, + `{ ($.messageUri = "${messageUri}") and ($.description = "ItemDequeued event not sent as item withdrawn") }` + ); + + expect(eventLogEntry.length).toEqual(1); + }); + }); + + test('should handle expired item', async () => { + const letterId = uuidv4(); + const messageUri = `https://example.com/ttl/resource/${letterId}`; + + const event = { + ...baseEvent, + id: letterId, + data: { + ...baseEvent.data, + messageUri, + 'digital-letter-id': letterId, + }, + }; + + const ttlItem = { + PK: messageUri, + SK: 'TTL', + dateOfExpiry: '2023-12-31#0', + event, + ttl: Date.now() / 1000 + 3600, + }; + + const putResponseCode = await putTtl(ttlItem); + expect(putResponseCode).toBe(200); + + const deleteResponseCode = await deleteTtl(messageUri); + expect(deleteResponseCode).toBe(200); + + await expectToPassEventually(async () => { + await expectToPassEventually(async () => { + const eventLogEntry = await getLogsFromCloudwatch( + `/aws/vendedlogs/events/event-bus/nhs-${ENV}-dl`, + `{ ($.id = "${letterId}") }` + ); + + expect(eventLogEntry.length).toEqual(1); + }); }); }); }); diff --git a/tests/playwright/helpers/cloudwatch-helpers.ts b/tests/playwright/helpers/cloudwatch-helpers.ts new file mode 100644 index 000000000..f803efb7d --- /dev/null +++ b/tests/playwright/helpers/cloudwatch-helpers.ts @@ -0,0 +1,36 @@ +import { + CloudWatchLogsClient, + FilterLogEventsCommand, +} from '@aws-sdk/client-cloudwatch-logs'; +import { region } from 'utils'; +import { test } from '@playwright/test'; + +const client = new CloudWatchLogsClient({ region: region() }); + +let testStartTime = new Date(); + +test.beforeEach(() => { + testStartTime = new Date(); +}); + +/** + * @param logGroupName e.g. `/aws/lambda/nhs-main-dl-apim-key-generation` + * @param pattern e.g. `{ $.id = ${JSON.stringify(letterId)} }` + */ +export async function getLogsFromCloudwatch( + logGroupName: string, + pattern: string +): Promise { + const filterEvents = new FilterLogEventsCommand({ + logGroupName, + startTime: testStartTime.getTime() - 60 * 1000, + filterPattern: pattern, + limit: 50, + }); + + const { events = [] } = await client.send(filterEvents); + + return events.flatMap(({ message }) => + message ? [JSON.parse(message)] : [] + ); +} diff --git a/utils/utils/src/index.ts b/utils/utils/src/index.ts index c58e22d9a..96bc77808 100644 --- a/utils/utils/src/index.ts +++ b/utils/utils/src/index.ts @@ -1,5 +1,6 @@ export * from './dynamodb'; export * from './lambda-utils'; +export * from './locations'; export * from './logger'; export * from './sqs-utils'; export * from './ssm-utils'; From 36e4f22588b8e8790fd9869446e958072e2a99e9 Mon Sep 17 00:00:00 2001 From: Ian Hodges Date: Fri, 5 Dec 2025 13:21:59 +0000 Subject: [PATCH 08/16] CCM-13146 lint fixes --- .../handle-ttl.component.spec.ts | 4 ++-- tests/playwright/helpers/cloudwatch-helpers.ts | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/playwright/digital-letters-component-tests/handle-ttl.component.spec.ts b/tests/playwright/digital-letters-component-tests/handle-ttl.component.spec.ts index aa3c291b3..7fc3a5665 100644 --- a/tests/playwright/digital-letters-component-tests/handle-ttl.component.spec.ts +++ b/tests/playwright/digital-letters-component-tests/handle-ttl.component.spec.ts @@ -61,7 +61,7 @@ test.describe('Digital Letters - Handle TTL', () => { await expectToPassEventually(async () => { const eventLogEntry = await getLogsFromCloudwatch( `/aws/lambda/nhs-${ENV}-dl-ttl-handle-expiry`, - `{ ($.messageUri = "${messageUri}") and ($.description = "ItemDequeued event not sent as item withdrawn") }` + `{ ($.messageUri = "${messageUri}") and ($.description = "ItemDequeued event not sent as item withdrawn") }`, ); expect(eventLogEntry.length).toEqual(1); @@ -100,7 +100,7 @@ test.describe('Digital Letters - Handle TTL', () => { await expectToPassEventually(async () => { const eventLogEntry = await getLogsFromCloudwatch( `/aws/vendedlogs/events/event-bus/nhs-${ENV}-dl`, - `{ ($.id = "${letterId}") }` + `{ ($.id = "${letterId}") }`, ); expect(eventLogEntry.length).toEqual(1); diff --git a/tests/playwright/helpers/cloudwatch-helpers.ts b/tests/playwright/helpers/cloudwatch-helpers.ts index f803efb7d..f00ccd5ee 100644 --- a/tests/playwright/helpers/cloudwatch-helpers.ts +++ b/tests/playwright/helpers/cloudwatch-helpers.ts @@ -19,7 +19,7 @@ test.beforeEach(() => { */ export async function getLogsFromCloudwatch( logGroupName: string, - pattern: string + pattern: string, ): Promise { const filterEvents = new FilterLogEventsCommand({ logGroupName, @@ -31,6 +31,6 @@ export async function getLogsFromCloudwatch( const { events = [] } = await client.send(filterEvents); return events.flatMap(({ message }) => - message ? [JSON.parse(message)] : [] + message ? [JSON.parse(message)] : [], ); } From 2adc29bb99637db63cb36d3c7a1fee1cb33d4fac Mon Sep 17 00:00:00 2001 From: Ian Hodges Date: Fri, 5 Dec 2025 14:56:48 +0000 Subject: [PATCH 09/16] CCM-13146 fix log filter pattern --- .../handle-ttl.component.spec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/playwright/digital-letters-component-tests/handle-ttl.component.spec.ts b/tests/playwright/digital-letters-component-tests/handle-ttl.component.spec.ts index 7fc3a5665..ef7be9dcb 100644 --- a/tests/playwright/digital-letters-component-tests/handle-ttl.component.spec.ts +++ b/tests/playwright/digital-letters-component-tests/handle-ttl.component.spec.ts @@ -61,7 +61,7 @@ test.describe('Digital Letters - Handle TTL', () => { await expectToPassEventually(async () => { const eventLogEntry = await getLogsFromCloudwatch( `/aws/lambda/nhs-${ENV}-dl-ttl-handle-expiry`, - `{ ($.messageUri = "${messageUri}") and ($.description = "ItemDequeued event not sent as item withdrawn") }`, + `{ ($.message.messageUri = "${messageUri}") && ($.message.description = "ItemDequeued event not sent as item withdrawn") }`, ); expect(eventLogEntry.length).toEqual(1); From f1ad1cde0a325ad876db1e624b2ae7218a697a38 Mon Sep 17 00:00:00 2001 From: Ian Hodges Date: Fri, 5 Dec 2025 14:57:15 +0000 Subject: [PATCH 10/16] CCM-13146 put log devivery sources back --- .../components/dl/cloudwatch_event_bus.tf | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/infrastructure/terraform/components/dl/cloudwatch_event_bus.tf b/infrastructure/terraform/components/dl/cloudwatch_event_bus.tf index d07f495fb..f187bee5a 100644 --- a/infrastructure/terraform/components/dl/cloudwatch_event_bus.tf +++ b/infrastructure/terraform/components/dl/cloudwatch_event_bus.tf @@ -8,3 +8,22 @@ resource "aws_cloudwatch_event_bus" "main" { level = "TRACE" } } + +# CloudWatch Log Delivery Sources for INFO, ERROR, and TRACE logs +resource "aws_cloudwatch_log_delivery_source" "main_info_logs" { + name = "EventBusSource-${aws_cloudwatch_event_bus.main.name}-INFO_LOGS" + log_type = "INFO_LOGS" + resource_arn = aws_cloudwatch_event_bus.main.arn +} + +resource "aws_cloudwatch_log_delivery_source" "main_error_logs" { + name = "EventBusSource-${aws_cloudwatch_event_bus.main.name}-ERROR_LOGS" + log_type = "ERROR_LOGS" + resource_arn = aws_cloudwatch_event_bus.main.arn +} + +resource "aws_cloudwatch_log_delivery_source" "main_trace_logs" { + name = "EventBusSource-${aws_cloudwatch_event_bus.main.name}-TRACE_LOGS" + log_type = "TRACE_LOGS" + resource_arn = aws_cloudwatch_event_bus.main.arn +} From e9790d9018be3532870d27c74b95e39914f8f5f2 Mon Sep 17 00:00:00 2001 From: Ian Hodges Date: Fri, 5 Dec 2025 16:09:42 +0000 Subject: [PATCH 11/16] CCM-13146 put log devivery destination back --- .../dl/cloudwatch_log_delivery_event_bus.tf | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 infrastructure/terraform/components/dl/cloudwatch_log_delivery_event_bus.tf diff --git a/infrastructure/terraform/components/dl/cloudwatch_log_delivery_event_bus.tf b/infrastructure/terraform/components/dl/cloudwatch_log_delivery_event_bus.tf new file mode 100644 index 000000000..c09a60d62 --- /dev/null +++ b/infrastructure/terraform/components/dl/cloudwatch_log_delivery_event_bus.tf @@ -0,0 +1,28 @@ +resource "aws_cloudwatch_log_delivery_destination" "event_bus" { + name = "EventsDeliveryDestination-${aws_cloudwatch_event_bus.main.name}" + + delivery_destination_configuration { + destination_resource_arn = aws_cloudwatch_log_group.event_bus.arn + } +} + +resource "aws_cloudwatch_log_delivery" "events_info_logs" { + delivery_destination_arn = aws_cloudwatch_log_delivery_destination.event_bus.arn + delivery_source_name = aws_cloudwatch_log_delivery_source.main_info_logs.name +} + +resource "aws_cloudwatch_log_delivery" "events_error_logs" { + delivery_destination_arn = aws_cloudwatch_log_delivery_destination.event_bus.arn + delivery_source_name = aws_cloudwatch_log_delivery_source.main_error_logs.name + depends_on = [ + aws_cloudwatch_log_delivery.events_info_logs + ] +} + +resource "aws_cloudwatch_log_delivery" "events_trace_logs" { + delivery_destination_arn = aws_cloudwatch_log_delivery_destination.event_bus.arn + delivery_source_name = aws_cloudwatch_log_delivery_source.main_trace_logs.name + depends_on = [ + aws_cloudwatch_log_delivery.events_error_logs + ] +} From f24670dc091598d30bbfd59c50fefc2b98ecd427 Mon Sep 17 00:00:00 2001 From: Ian Hodges Date: Fri, 5 Dec 2025 16:39:50 +0000 Subject: [PATCH 12/16] CCM-13146 update e2e tests so they pass --- .../handle-ttl.component.spec.ts | 11 +++++++++-- tests/playwright/helpers/cloudwatch-helpers.ts | 8 ++++---- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/tests/playwright/digital-letters-component-tests/handle-ttl.component.spec.ts b/tests/playwright/digital-letters-component-tests/handle-ttl.component.spec.ts index ef7be9dcb..3655a296c 100644 --- a/tests/playwright/digital-letters-component-tests/handle-ttl.component.spec.ts +++ b/tests/playwright/digital-letters-component-tests/handle-ttl.component.spec.ts @@ -61,7 +61,10 @@ test.describe('Digital Letters - Handle TTL', () => { await expectToPassEventually(async () => { const eventLogEntry = await getLogsFromCloudwatch( `/aws/lambda/nhs-${ENV}-dl-ttl-handle-expiry`, - `{ ($.message.messageUri = "${messageUri}") && ($.message.description = "ItemDequeued event not sent as item withdrawn") }`, + [ + `$.message.messageUri = "${messageUri}"`, + '$.message.description = "ItemDequeued event not sent as item withdrawn"', + ], ); expect(eventLogEntry.length).toEqual(1); @@ -100,7 +103,11 @@ test.describe('Digital Letters - Handle TTL', () => { await expectToPassEventually(async () => { const eventLogEntry = await getLogsFromCloudwatch( `/aws/vendedlogs/events/event-bus/nhs-${ENV}-dl`, - `{ ($.id = "${letterId}") }`, + [ + '$.message_type = "EVENT_RECEIPT"', + '$.details.detail_type = "uk.nhs.notify.digital.letters.queue.item.dequeued.v1"', + `$.details.event_detail = "*\\"messageUri\\":\\"${messageUri}\\"*"`, + ], ); expect(eventLogEntry.length).toEqual(1); diff --git a/tests/playwright/helpers/cloudwatch-helpers.ts b/tests/playwright/helpers/cloudwatch-helpers.ts index f00ccd5ee..6af6d9e91 100644 --- a/tests/playwright/helpers/cloudwatch-helpers.ts +++ b/tests/playwright/helpers/cloudwatch-helpers.ts @@ -14,17 +14,17 @@ test.beforeEach(() => { }); /** - * @param logGroupName e.g. `/aws/lambda/nhs-main-dl-apim-key-generation` - * @param pattern e.g. `{ $.id = ${JSON.stringify(letterId)} }` + * @param logGroupName e.g. '/aws/lambda/nhs-main-dl-apim-key-generation' + * @param patterns e.g. [ '$.id = "someId"', '$.message.messageUri = "messageUri"' ] */ export async function getLogsFromCloudwatch( logGroupName: string, - pattern: string, + patterns: string[], ): Promise { const filterEvents = new FilterLogEventsCommand({ logGroupName, startTime: testStartTime.getTime() - 60 * 1000, - filterPattern: pattern, + filterPattern: `{${patterns.join(' && ')}}`, limit: 50, }); From 9544c651a4ab899f3ba6dedf2a52b9aa87b198ef Mon Sep 17 00:00:00 2001 From: Ian Hodges Date: Mon, 8 Dec 2025 11:34:44 +0000 Subject: [PATCH 13/16] CCM-13146 add extra e2e test --- .../playwright/constants/backend-constants.ts | 8 ++- .../handle-ttl.component.spec.ts | 37 +++++++++++ tests/playwright/helpers/sqs-helpers.ts | 64 +++++++++++++++++++ 3 files changed, 107 insertions(+), 2 deletions(-) create mode 100644 tests/playwright/helpers/sqs-helpers.ts diff --git a/tests/playwright/constants/backend-constants.ts b/tests/playwright/constants/backend-constants.ts index d442b7266..c5b9a4030 100644 --- a/tests/playwright/constants/backend-constants.ts +++ b/tests/playwright/constants/backend-constants.ts @@ -2,6 +2,7 @@ // Environment Configuration export const ENV = process.env.ENVIRONMENT || 'main'; export const REGION = process.env.AWS_REGION || 'eu-west-2'; +export const { AWS_ACCOUNT_ID } = process.env; // Compound Scope Indicator export const CSI = `nhs-${ENV}-dl`; @@ -15,9 +16,12 @@ export const TTL_POLL_LAMBDA_NAME = `${CSI}-ttl-poll`; export const TTL_QUEUE_NAME = `${CSI}-ttl-queue`; export const TTL_DLQ_NAME = `${CSI}-ttl-dlq`; +// Queue Url Prefix +export const SQS_URL_PREFIX = `https://sqs.${REGION}.amazonaws.com/${AWS_ACCOUNT_ID}/`; + // Event Bus -export const EVENT_BUS_ARN = `arn:aws:events:${REGION}:${process.env.AWS_ACCOUNT_ID}:event-bus/${CSI}`; -export const EVENT_BUS_DLQ_URL = `https://sqs.${REGION}.amazonaws.com/${process.env.AWS_ACCOUNT_ID}/${CSI}-event-publisher-errors-queue`; +export const EVENT_BUS_ARN = `arn:aws:events:${REGION}:${AWS_ACCOUNT_ID}:event-bus/${CSI}`; +export const EVENT_BUS_DLQ_URL = `${SQS_URL_PREFIX}${CSI}-event-publisher-errors-queue`; // DynamoDB export const TTL_TABLE_NAME = `${CSI}-ttl`; diff --git a/tests/playwright/digital-letters-component-tests/handle-ttl.component.spec.ts b/tests/playwright/digital-letters-component-tests/handle-ttl.component.spec.ts index 3655a296c..46127ab5f 100644 --- a/tests/playwright/digital-letters-component-tests/handle-ttl.component.spec.ts +++ b/tests/playwright/digital-letters-component-tests/handle-ttl.component.spec.ts @@ -3,9 +3,16 @@ import { ENV } from 'constants/backend-constants'; import { getLogsFromCloudwatch } from 'helpers/cloudwatch-helpers'; import { deleteTtl, putTtl } from 'helpers/dynamodb-helpers'; import expectToPassEventually from 'helpers/expectations'; +import { expectMessageContainingString, purgeQueue } from 'helpers/sqs-helpers'; import { v4 as uuidv4 } from 'uuid'; test.describe('Digital Letters - Handle TTL', () => { + const handleTtlDlqName = `nhs-${ENV}-dl-ttl-handle-expiry-errors-queue`; + + test.beforeAll(async () => { + await purgeQueue(handleTtlDlqName); + }); + const baseEvent = { profileversion: '1.0.0', profilepublished: '2025-10', @@ -114,4 +121,34 @@ test.describe('Digital Letters - Handle TTL', () => { }); }); }); + + test('should send invalid item to dlq', async () => { + const letterId = uuidv4(); + const messageUri = `https://example.com/ttl/resource/${letterId}`; + + const eventWithNoMessageUri = { + ...baseEvent, + id: letterId, + data: { + ...baseEvent.data, + 'digital-letter-id': letterId, + }, + }; + + const ttlItem = { + PK: messageUri, + SK: 'TTL', + dateOfExpiry: '2023-12-31#0', + event: eventWithNoMessageUri, + ttl: Date.now() / 1000 + 3600, + }; + + const putResponseCode = await putTtl(ttlItem); + expect(putResponseCode).toBe(200); + + const deleteResponseCode = await deleteTtl(messageUri); + expect(deleteResponseCode).toBe(200); + + await expectMessageContainingString(handleTtlDlqName, letterId); + }); }); diff --git a/tests/playwright/helpers/sqs-helpers.ts b/tests/playwright/helpers/sqs-helpers.ts new file mode 100644 index 000000000..b0f3d3fb0 --- /dev/null +++ b/tests/playwright/helpers/sqs-helpers.ts @@ -0,0 +1,64 @@ +import { + DeleteMessageBatchCommand, + ReceiveMessageCommand, + ReceiveMessageCommandInput, +} from '@aws-sdk/client-sqs'; +import { expect } from '@playwright/test'; +import { SQS_URL_PREFIX } from 'constants/backend-constants'; +import { sqsClient } from 'utils'; +import expectToPassEventually from 'helpers/expectations'; + +function getQueueUrl(queueName: string) { + return `${SQS_URL_PREFIX}${queueName}`; +} + +export async function expectMessageContainingString( + queueName: string, + searchTerm: string, +) { + const input: ReceiveMessageCommandInput = { + QueueUrl: getQueueUrl(queueName), + MaxNumberOfMessages: 10, + WaitTimeSeconds: 1, + VisibilityTimeout: 2, + }; + + await expectToPassEventually(async () => { + const result = await sqsClient.send(new ReceiveMessageCommand(input)); + const polledMessages = result.Messages || []; + + expect( + polledMessages.find((m) => (m.Body ?? '').includes(searchTerm)), + ).toBeDefined(); + }); +} + +export async function purgeQueue(queueName: string) { + const queueUrl = getQueueUrl(queueName); + + for (;;) { + const result = await sqsClient.send( + new ReceiveMessageCommand({ + QueueUrl: queueUrl, + MaxNumberOfMessages: 10, + WaitTimeSeconds: 1, + }), + ); + + const messages = result.Messages || []; + + if (messages.length === 0) { + break; + } + + await sqsClient.send( + new DeleteMessageBatchCommand({ + QueueUrl: queueUrl, + Entries: messages.map((msg, index) => ({ + Id: index.toString(), + ReceiptHandle: msg.ReceiptHandle!, + })), + }), + ); + } +} From cd1ce452ef2e33438070140bdfc8577a40f11b50 Mon Sep 17 00:00:00 2001 From: Ian Hodges Date: Mon, 8 Dec 2025 12:13:43 +0000 Subject: [PATCH 14/16] CCM-13146 remove logging of info generated from process environment variables --- utils/utils/src/event-publisher/event-publisher.ts | 5 ----- 1 file changed, 5 deletions(-) diff --git a/utils/utils/src/event-publisher/event-publisher.ts b/utils/utils/src/event-publisher/event-publisher.ts index 5d1d9664d..21258dd89 100644 --- a/utils/utils/src/event-publisher/event-publisher.ts +++ b/utils/utils/src/event-publisher/event-publisher.ts @@ -55,7 +55,6 @@ export class EventPublisher { const failedEvents: CloudEvent[] = []; this.logger.info({ description: `Sending ${events.length} events to EventBridge`, - eventBusArn: this.config.eventBusArn, eventCount: events.length, }); @@ -63,7 +62,6 @@ export class EventPublisher { const batch = events.slice(i, i + MAX_BATCH_SIZE); this.logger.info({ description: `Sending batch of ${batch.length} events to EventBridge`, - eventBusArn: this.config.eventBusArn, batchSize: batch.length, }); @@ -120,7 +118,6 @@ export class EventPublisher { this.logger.warn({ description: 'Sending failed events to DLQ', - dlqUrl: this.config.dlqUrl, eventCount: events.length, reason, }); @@ -170,7 +167,6 @@ export class EventPublisher { this.logger.warn({ description: 'DLQ send error', err: error, - dlqUrl: this.config.dlqUrl, batchSize: batch.length, }); failedDlqs.push(...batch); @@ -181,7 +177,6 @@ export class EventPublisher { this.logger.error({ description: 'Failed to send events to DLQ', failedEventCount: failedDlqs.length, - dlqUrl: this.config.dlqUrl, }); } From 0afd062a3d075fa672ef718f332862fc888cb0a3 Mon Sep 17 00:00:00 2001 From: Ian Hodges Date: Wed, 10 Dec 2025 10:43:32 +0000 Subject: [PATCH 15/16] CCM-13146 update assertion for message search --- tests/playwright/helpers/sqs-helpers.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/tests/playwright/helpers/sqs-helpers.ts b/tests/playwright/helpers/sqs-helpers.ts index b0f3d3fb0..057e9c542 100644 --- a/tests/playwright/helpers/sqs-helpers.ts +++ b/tests/playwright/helpers/sqs-helpers.ts @@ -27,9 +27,7 @@ export async function expectMessageContainingString( const result = await sqsClient.send(new ReceiveMessageCommand(input)); const polledMessages = result.Messages || []; - expect( - polledMessages.find((m) => (m.Body ?? '').includes(searchTerm)), - ).toBeDefined(); + expect(polledMessages.some((m) => m.Body?.includes(searchTerm))).toBe(true); }); } From 8f4fd3565573d8b05db8187085f8fcba2fe2c33e Mon Sep 17 00:00:00 2001 From: Ian Hodges Date: Wed, 10 Dec 2025 14:24:41 +0000 Subject: [PATCH 16/16] CCM-13146 remove nested expectToPassEventually --- .../handle-ttl.component.spec.ts | 22 +++++++++---------- 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/tests/playwright/digital-letters-component-tests/handle-ttl.component.spec.ts b/tests/playwright/digital-letters-component-tests/handle-ttl.component.spec.ts index 46127ab5f..332ef045f 100644 --- a/tests/playwright/digital-letters-component-tests/handle-ttl.component.spec.ts +++ b/tests/playwright/digital-letters-component-tests/handle-ttl.component.spec.ts @@ -107,18 +107,16 @@ test.describe('Digital Letters - Handle TTL', () => { expect(deleteResponseCode).toBe(200); await expectToPassEventually(async () => { - await expectToPassEventually(async () => { - const eventLogEntry = await getLogsFromCloudwatch( - `/aws/vendedlogs/events/event-bus/nhs-${ENV}-dl`, - [ - '$.message_type = "EVENT_RECEIPT"', - '$.details.detail_type = "uk.nhs.notify.digital.letters.queue.item.dequeued.v1"', - `$.details.event_detail = "*\\"messageUri\\":\\"${messageUri}\\"*"`, - ], - ); - - expect(eventLogEntry.length).toEqual(1); - }); + const eventLogEntry = await getLogsFromCloudwatch( + `/aws/vendedlogs/events/event-bus/nhs-${ENV}-dl`, + [ + '$.message_type = "EVENT_RECEIPT"', + '$.details.detail_type = "uk.nhs.notify.digital.letters.queue.item.dequeued.v1"', + `$.details.event_detail = "*\\"messageUri\\":\\"${messageUri}\\"*"`, + ], + ); + + expect(eventLogEntry.length).toEqual(1); }); });