diff --git a/infrastructure/terraform/components/dl/data/failure_codes.csv b/infrastructure/terraform/components/dl/data/failure_codes.csv new file mode 100644 index 000000000..efb709e96 --- /dev/null +++ b/infrastructure/terraform/components/dl/data/failure_codes.csv @@ -0,0 +1,5 @@ +code,description +DL_PDMV_001,Letter rejected by PDM +DL_PDMV_002,Timeout waiting for letter storage +DL_CLIV_003,Attachment contains a virus +DL_INTE_001,Request rejected by Core API diff --git a/infrastructure/terraform/components/dl/glue_catalog_table_failure_code_lookup.tf b/infrastructure/terraform/components/dl/glue_catalog_table_failure_code_lookup.tf new file mode 100644 index 000000000..57ef8afa7 --- /dev/null +++ b/infrastructure/terraform/components/dl/glue_catalog_table_failure_code_lookup.tf @@ -0,0 +1,39 @@ +resource "aws_glue_catalog_table" "failure_code_lookup" { + name = "failure_code_lookup" + description = "Lookup table for failure code descriptions" + database_name = aws_glue_catalog_database.reporting.name + + table_type = "EXTERNAL_TABLE" + + storage_descriptor { + location = "s3://${module.s3bucket_reporting.bucket}/reference-data/failure_codes/" + + input_format = "org.apache.hadoop.mapred.TextInputFormat" + output_format = "org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat" + + ser_de_info { + name = "csv" + serialization_library = "org.apache.hadoop.hive.serde2.OpenCSVSerde" + + parameters = { + "separatorChar" = "," + "skip.header.line.count" = "1" + } + } + + columns { + name = "code" + type = "string" + } + + columns { + name = "description" + type = "string" + } + } + + parameters = { + EXTERNAL = "TRUE" + classification = "csv" + } +} diff --git a/infrastructure/terraform/components/dl/s3_object_failure_codes.tf b/infrastructure/terraform/components/dl/s3_object_failure_codes.tf new file mode 100644 index 000000000..78c33baef --- /dev/null +++ b/infrastructure/terraform/components/dl/s3_object_failure_codes.tf @@ -0,0 +1,17 @@ +# Auto-generated CSV containing failure code definitions +# Source: src/digital-letters-events/failure-codes.ts +# Build: make build / make generate (runs generate-dependencies) +resource "aws_s3_object" "failure_codes" { + bucket = module.s3bucket_reporting.bucket + key = "reference-data/failure_codes/failure_codes.csv" + source = "${path.module}/data/failure_codes.csv" + content_type = "text/csv" + etag = filemd5("${path.module}/data/failure_codes.csv") + + tags = merge( + local.default_tags, + { + Name = "${local.csi}-failure-codes-csv" + } + ) +} diff --git a/infrastructure/terraform/components/dl/scripts/sql/reports/daily_report.sql b/infrastructure/terraform/components/dl/scripts/sql/reports/daily_report.sql index f965dbf71..57fa3c703 100644 --- a/infrastructure/terraform/components/dl/scripts/sql/reports/daily_report.sql +++ b/infrastructure/terraform/components/dl/scripts/sql/reports/daily_report.sql @@ -7,19 +7,35 @@ WITH vars AS ( e.time, CASE WHEN e.type LIKE '%.item.dequeued.%' - OR e.type LIKE '%.queue.digital.letter.read.%' THEN 'Digital' - WHEN e.type LIKE '%.print.letter.transitioned.%' THEN 'Print' ELSE NULL + OR e.type LIKE '%.queue.digital.letter.read.%' + OR e.type LIKE '%.pdm.resource.submission.rejected.%' + OR e.type LIKE '%.pdm.resource.retries.exceeded.%' + OR e.type LIKE '%.messages.request.rejected.%' THEN 'Digital' + WHEN e.type LIKE '%.print.letter.transitioned.%' + OR e.type LIKE '%.print.file.quarantined.%' THEN 'Print' ELSE NULL END as communicationtype, CASE WHEN e.type LIKE '%.item.dequeued.%' THEN 'Unread' WHEN e.type LIKE '%.queue.digital.letter.read.%' THEN 'Read' + WHEN e.type LIKE '%.pdm.resource.submission.rejected.%' THEN 'Failed' + WHEN e.type LIKE '%.pdm.resource.retries.exceeded.%' THEN 'Failed' + WHEN e.type LIKE '%.messages.request.rejected.%' THEN 'Failed' + WHEN e.type LIKE '%.print.file.quarantined.%' THEN 'Failed' WHEN e.letterstatus = 'RETURNED' THEN 'Returned' WHEN e.letterstatus = 'FAILED' THEN 'Failed' WHEN e.letterstatus = 'DISPATCHED' THEN 'Dispatched' WHEN e.letterstatus = 'REJECTED' THEN 'Rejected' ELSE NULL - END as status + END as status, + e.reasoncode, + COALESCE( + CASE WHEN e.type LIKE '%.messages.request.rejected.%' THEN e.reasontext END, + fcl.description, + e.reasontext, + e.reasoncode + ) as reasontext FROM event_record e CROSS JOIN vars v + LEFT JOIN failure_code_lookup fcl ON e.reasoncode = fcl.code WHERE e.senderid = v.senderid AND e.__year = year(v.dt) AND e.__month = month(v.dt) @@ -31,11 +47,12 @@ WITH vars AS ( ORDER BY te.time DESC, CASE -- Digital Priority Order + WHEN te.communicationtype = 'Digital' AND te.status = 'Failed' THEN 3 WHEN te.status = 'Read' THEN 2 WHEN te.status = 'Unread' THEN 1 -- Print Priority Order WHEN te.status = 'Returned' THEN 4 - WHEN te.status = 'Failed' THEN 3 + WHEN te.communicationtype = 'Print' AND te.status = 'Failed' THEN 3 WHEN te.status = 'Dispatched' THEN 2 WHEN te.status = 'Rejected' THEN 1 ELSE 0 END DESC @@ -43,13 +60,18 @@ WITH vars AS ( te.messagereference, te.time, te.communicationtype, - te.status + te.status, + te.reasoncode, + te.reasontext FROM "translated_events" AS te - where te.status IS NOT NULL + WHERE te.status IS NOT NULL + AND te.communicationtype IS NOT NULL ) SELECT oe.messagereference as "Message Reference", oe.time as "Time", oe.communicationtype as "Communication Type", - oe.status as "Status" + oe.status as "Status", + oe.reasoncode as "Reason Code", + oe.reasontext as "Reason" FROM "ordered_events" AS oe WHERE oe.row_number = 1 diff --git a/lambdas/core-notifier-lambda/src/__tests__/apis/sqs-handler.test.ts b/lambdas/core-notifier-lambda/src/__tests__/apis/sqs-handler.test.ts index ceb3a6985..473ab88b0 100644 --- a/lambdas/core-notifier-lambda/src/__tests__/apis/sqs-handler.test.ts +++ b/lambdas/core-notifier-lambda/src/__tests__/apis/sqs-handler.test.ts @@ -256,11 +256,13 @@ describe('createHandler', () => { const handler = createHandler(dependencies); const { messageId } = sqsEvent.Records[0]; const errorCode = 'VALIDATION_ERROR'; + const failureReason = 'Request validation failed'; const correlationId = 'corr-123'; const error = new RequestNotifyError( new Error('Validation failed'), correlationId, errorCode, + failureReason, ); // Add messageReference property dynamically to trigger the terminal error path (error as any).messageReference = messageReference; diff --git a/lambdas/core-notifier-lambda/src/__tests__/app/notify-api-client.test.ts b/lambdas/core-notifier-lambda/src/__tests__/app/notify-api-client.test.ts index 59af51fd2..20465f89f 100644 --- a/lambdas/core-notifier-lambda/src/__tests__/app/notify-api-client.test.ts +++ b/lambdas/core-notifier-lambda/src/__tests__/app/notify-api-client.test.ts @@ -211,8 +211,11 @@ describe('sendRequest', () => { mockRequest1.data.attributes.messageReference, ), ).rejects.toMatchObject({ - errorCode: 'CM_MISSING_ROUTING_PLAN_TEMPLATE', + cause: error, correlationId: 'request-item-id_request-item-plan-id', + errorCode: 'CM_MISSING_ROUTING_PLAN_TEMPLATE', + failureReason: + 'The templates required to use the routing plan were not found.', }); }, ); diff --git a/lambdas/core-notifier-lambda/src/__tests__/domain/mapper.test.ts b/lambdas/core-notifier-lambda/src/__tests__/domain/mapper.test.ts index e1bde3bc7..f2e8b8a82 100644 --- a/lambdas/core-notifier-lambda/src/__tests__/domain/mapper.test.ts +++ b/lambdas/core-notifier-lambda/src/__tests__/domain/mapper.test.ts @@ -209,6 +209,7 @@ describe('mapper', () => { describe('mapPdmEventToMessageRequestRejected', () => { it('correctly maps PDM event to MessageRequestRejected', () => { const failureCode = 'INVALID_NHS_NUMBER'; + const failureReason = 'NHS number is not valid'; const mockDate = new Date('2024-01-15T12:00:00Z'); jest.spyOn(globalThis, 'Date').mockImplementation(() => mockDate as any); @@ -216,6 +217,7 @@ describe('mapper', () => { mockPdmEvent, mockSender, failureCode, + failureReason, ); expect(result).toEqual({ @@ -232,18 +234,38 @@ describe('mapper', () => { failureCode: 'INVALID_NHS_NUMBER', messageUri: 'https://www.nhsapp.service.nhs.uk/digital-letters?letterid=resource-789', + reasonCode: 'DL_INTE_001', + reasonText: 'NHS number is not valid', }, }); expect(mockRandomUUID).toHaveBeenCalled(); }); + it('includes reasonCode and reasonText for reporting', () => { + const failureCode = 'CM_DUPLICATE_REQUEST'; + const failureReason = 'This request has already been received'; + const result = mapPdmEventToMessageRequestRejected( + mockPdmEvent, + mockSender, + failureCode, + failureReason, + ); + + expect(result.data.reasonCode).toBe('DL_INTE_001'); + expect(result.data.reasonText).toBe( + 'This request has already been received', + ); + }); + it('generates new UUID for event', () => { const failureCode = 'VALIDATION_ERROR'; + const failureReason = 'Request validation failed'; mapPdmEventToMessageRequestRejected( mockPdmEvent, mockSender, failureCode, + failureReason, ); expect(mockRandomUUID).toHaveBeenCalledTimes(1); @@ -251,10 +273,12 @@ describe('mapper', () => { it('includes failureCode in data', () => { const failureCode = 'ROUTING_FAILED'; + const failureReason = 'Unable to route message'; const result = mapPdmEventToMessageRequestRejected( mockPdmEvent, mockSender, failureCode, + failureReason, ); expect(result.data.failureCode).toBe('ROUTING_FAILED'); @@ -262,10 +286,12 @@ describe('mapper', () => { it('includes messageUri with resource ID', () => { const failureCode = 'TIMEOUT'; + const failureReason = 'Request timed out'; const result = mapPdmEventToMessageRequestRejected( mockPdmEvent, mockSender, failureCode, + failureReason, ); expect(result.data.messageUri).toBe( @@ -275,10 +301,12 @@ describe('mapper', () => { it('uses sender senderId in data', () => { const failureCode = 'UNKNOWN_ERROR'; + const failureReason = 'An unknown error occurred'; const result = mapPdmEventToMessageRequestRejected( mockPdmEvent, mockSender, failureCode, + failureReason, ); expect(result.data.senderId).toBe('test-sender-id'); @@ -286,10 +314,12 @@ describe('mapper', () => { it('uses messageReference from PDM event', () => { const failureCode = 'DUPLICATE_REQUEST'; + const failureReason = 'Duplicate request detected'; const result = mapPdmEventToMessageRequestRejected( mockPdmEvent, mockSender, failureCode, + failureReason, ); expect(result.data.messageReference).toBe('msg-ref-123'); @@ -297,10 +327,12 @@ describe('mapper', () => { it('sets correct event type', () => { const failureCode = 'SYSTEM_ERROR'; + const failureReason = 'System error occurred'; const result = mapPdmEventToMessageRequestRejected( mockPdmEvent, mockSender, failureCode, + failureReason, ); expect(result.type).toBe( @@ -310,10 +342,12 @@ describe('mapper', () => { it('sets correct dataschema', () => { const failureCode = 'CONFIG_ERROR'; + const failureReason = 'Configuration error'; const result = mapPdmEventToMessageRequestRejected( mockPdmEvent, mockSender, failureCode, + failureReason, ); expect(result.dataschema).toBe( @@ -323,10 +357,12 @@ describe('mapper', () => { it('preserves CloudEvents properties from PDM event', () => { const failureCode = 'NETWORK_ERROR'; + const failureReason = 'Network connection failed'; const result = mapPdmEventToMessageRequestRejected( mockPdmEvent, mockSender, failureCode, + failureReason, ); expect(result.specversion).toBe('1.0'); diff --git a/lambdas/core-notifier-lambda/src/apis/sqs-handler.ts b/lambdas/core-notifier-lambda/src/apis/sqs-handler.ts index eb217bab0..5d72d880e 100644 --- a/lambdas/core-notifier-lambda/src/apis/sqs-handler.ts +++ b/lambdas/core-notifier-lambda/src/apis/sqs-handler.ts @@ -125,6 +125,7 @@ async function processSqsRecord( incoming, sender, error.errorCode, + error.failureReason, ); } else { // this might be a transient error so we notify the queue to retry diff --git a/lambdas/core-notifier-lambda/src/app/notify-api-client.ts b/lambdas/core-notifier-lambda/src/app/notify-api-client.ts index 9f1ada7bc..888f6a18b 100644 --- a/lambdas/core-notifier-lambda/src/app/notify-api-client.ts +++ b/lambdas/core-notifier-lambda/src/app/notify-api-client.ts @@ -109,6 +109,7 @@ export class NotifyClient implements INotifyClient { error, correlationId, errorBody?.errors[0].code, + errorBody?.errors[0].detail, ); } } diff --git a/lambdas/core-notifier-lambda/src/domain/mapper.ts b/lambdas/core-notifier-lambda/src/domain/mapper.ts index 61455bede..85d25af85 100644 --- a/lambdas/core-notifier-lambda/src/domain/mapper.ts +++ b/lambdas/core-notifier-lambda/src/domain/mapper.ts @@ -8,6 +8,8 @@ import { } from 'digital-letters-events'; import type { SingleMessageRequest } from 'domain/request'; +const CORE_API_FAILURE_CODE = 'DL_INTE_001'; + const DIGITAL_LETTER_URL = 'https://www.nhsapp.service.nhs.uk/digital-letters?letterid='; @@ -99,6 +101,7 @@ export function mapPdmEventToMessageRequestRejected( pdmResourceAvailable: PDMResourceAvailable, sender: Sender, notifyFailureCode: string, + failureReason: string, ): MessageRequestRejected { const { data } = pdmResourceAvailable; const { messageReference } = data; @@ -117,6 +120,8 @@ export function mapPdmEventToMessageRequestRejected( senderId: sender.senderId, failureCode: notifyFailureCode, messageUri: `${DIGITAL_LETTER_URL}${data.resourceId}`, + reasonCode: CORE_API_FAILURE_CODE, + reasonText: failureReason, }, }; } diff --git a/lambdas/core-notifier-lambda/src/domain/request-notify-error.ts b/lambdas/core-notifier-lambda/src/domain/request-notify-error.ts index 98d0fdf98..1e88e29e3 100644 --- a/lambdas/core-notifier-lambda/src/domain/request-notify-error.ts +++ b/lambdas/core-notifier-lambda/src/domain/request-notify-error.ts @@ -9,11 +9,19 @@ export class RequestNotifyError extends Error { readonly errorCode: string; - constructor(cause: Error, correlationId: string, errorCode: string) { + readonly failureReason: string; + + constructor( + cause: Error, + correlationId: string, + errorCode: string, + failureReason: string, + ) { super('Error received from Core Notify API'); this.cause = cause; this.correlationId = correlationId; this.errorCode = errorCode; + this.failureReason = failureReason; } } diff --git a/lambdas/core-notifier-lambda/src/domain/request.ts b/lambdas/core-notifier-lambda/src/domain/request.ts index b5860b5d8..b566a99f0 100644 --- a/lambdas/core-notifier-lambda/src/domain/request.ts +++ b/lambdas/core-notifier-lambda/src/domain/request.ts @@ -46,6 +46,7 @@ export type SingleMessageErrorResponse = { { id: string; code: string; + detail: string; }, ]; }; diff --git a/lambdas/move-scanned-files-lambda/src/__tests__/apis/sqs-handler.test.ts b/lambdas/move-scanned-files-lambda/src/__tests__/apis/sqs-handler.test.ts index d56371eb1..a219a5293 100644 --- a/lambdas/move-scanned-files-lambda/src/__tests__/apis/sqs-handler.test.ts +++ b/lambdas/move-scanned-files-lambda/src/__tests__/apis/sqs-handler.test.ts @@ -132,6 +132,7 @@ describe('sqs-handler', () => { senderId: 'sender-id-2', letterUri: 'https://bucket/key2', createdAt: '2024-01-01T00:00:00Z', + reasonCode: 'DL_CLIV_003', }, subject: 'test-subject', traceparent: 'test-traceparent', diff --git a/lambdas/move-scanned-files-lambda/src/__tests__/domain/mapper.test.ts b/lambdas/move-scanned-files-lambda/src/__tests__/domain/mapper.test.ts index f92f1ee2c..549b641c9 100644 --- a/lambdas/move-scanned-files-lambda/src/__tests__/domain/mapper.test.ts +++ b/lambdas/move-scanned-files-lambda/src/__tests__/domain/mapper.test.ts @@ -106,6 +106,7 @@ describe('mapper', () => { senderId, letterUri, createdAt, + reasonCode: 'DL_CLIV_003', }, recordedtime: '2024-01-15T10:30:00.000Z', severitynumber: 2, diff --git a/lambdas/move-scanned-files-lambda/src/domain/mapper.ts b/lambdas/move-scanned-files-lambda/src/domain/mapper.ts index fe0d483a9..c42208a04 100644 --- a/lambdas/move-scanned-files-lambda/src/domain/mapper.ts +++ b/lambdas/move-scanned-files-lambda/src/domain/mapper.ts @@ -1,13 +1,12 @@ import { randomUUID } from 'node:crypto'; import { FileQuarantined, FileSafe } from 'digital-letters-events'; -function createEventWithCommonFields( - isFileSafe: boolean, +export function createFileSafeEvent( messageReference: string, senderId: string, letterUri: string, createdAt: string, -): FileSafe | FileQuarantined { +): FileSafe { return { specversion: '1.0', id: randomUUID(), @@ -15,9 +14,7 @@ function createEventWithCommonFields( source: '/nhs/england/notify/production/primary/data-plane/digitalletters/print', // Note CCM-13892. traceparent: '00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01', // Note CCM-14255. - type: isFileSafe - ? 'uk.nhs.notify.digital.letters.print.file.safe.v1' - : 'uk.nhs.notify.digital.letters.print.file.quarantined.v1', + type: 'uk.nhs.notify.digital.letters.print.file.safe.v1', time: new Date().toISOString(), data: { messageReference, @@ -25,38 +22,34 @@ function createEventWithCommonFields( letterUri, createdAt, }, - recordedtime: new Date().toISOString(), severitynumber: 2, }; } -export function createFileSafeEvent( - messageReference: string, - senderId: string, - letterUri: string, - createdAt: string, -): FileSafe { - return createEventWithCommonFields( - true, - messageReference, - senderId, - letterUri, - createdAt, - ) as FileSafe; -} - export function createFileQuarantinedEvent( messageReference: string, senderId: string, letterUri: string, createdAt: string, ): FileQuarantined { - return createEventWithCommonFields( - false, - messageReference, - senderId, - letterUri, - createdAt, - ) as FileQuarantined; + return { + specversion: '1.0', + id: randomUUID(), + subject: `customer/${senderId}/recipient/${messageReference}`, + source: + '/nhs/england/notify/production/primary/data-plane/digitalletters/print', // Note CCM-13892. + traceparent: '00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01', // Note CCM-14255. + type: 'uk.nhs.notify.digital.letters.print.file.quarantined.v1', + time: new Date().toISOString(), + data: { + messageReference, + senderId, + letterUri, + createdAt, + reasonCode: 'DL_CLIV_003', + }, + recordedtime: new Date().toISOString(), + severitynumber: 2, + }; } diff --git a/lambdas/pdm-poll-lambda/src/__tests__/apis/sqs-handler.test.ts b/lambdas/pdm-poll-lambda/src/__tests__/apis/sqs-handler.test.ts index 74c1ac350..abed2de86 100644 --- a/lambdas/pdm-poll-lambda/src/__tests__/apis/sqs-handler.test.ts +++ b/lambdas/pdm-poll-lambda/src/__tests__/apis/sqs-handler.test.ts @@ -228,6 +228,7 @@ describe('SQS Handler', () => { senderId: pdmResourceUnavailableEvent.data.senderId, resourceId: pdmResourceUnavailableEvent.data.resourceId, retryCount: 10, + reasonCode: 'DL_PDMV_002', }, }, ], diff --git a/lambdas/pdm-poll-lambda/src/apis/sqs-handler.ts b/lambdas/pdm-poll-lambda/src/apis/sqs-handler.ts index 39ae9c720..092327f00 100644 --- a/lambdas/pdm-poll-lambda/src/apis/sqs-handler.ts +++ b/lambdas/pdm-poll-lambda/src/apis/sqs-handler.ts @@ -143,6 +143,7 @@ function generateRetriesExceededEvent( senderId: event.data.senderId, resourceId: event.data.resourceId, retryCount: retries, + reasonCode: 'DL_PDMV_002', }, }; } diff --git a/lambdas/pdm-uploader-lambda/src/__tests__/apis/sqs-trigger-lambda.test.ts b/lambdas/pdm-uploader-lambda/src/__tests__/apis/sqs-trigger-lambda.test.ts index 0d8df784c..e561fe080 100644 --- a/lambdas/pdm-uploader-lambda/src/__tests__/apis/sqs-trigger-lambda.test.ts +++ b/lambdas/pdm-uploader-lambda/src/__tests__/apis/sqs-trigger-lambda.test.ts @@ -159,6 +159,9 @@ describe('sqs-trigger-lambda', () => { expect.arrayContaining([ expect.objectContaining({ type: 'uk.nhs.notify.digital.letters.pdm.resource.submission.rejected.v1', + data: expect.objectContaining({ + reasonCode: 'DL_PDMV_001', + }), }), ]), expect.anything(), diff --git a/lambdas/pdm-uploader-lambda/src/apis/sqs-trigger-lambda.ts b/lambdas/pdm-uploader-lambda/src/apis/sqs-trigger-lambda.ts index 64c66bc0a..4f3232cab 100644 --- a/lambdas/pdm-uploader-lambda/src/apis/sqs-trigger-lambda.ts +++ b/lambdas/pdm-uploader-lambda/src/apis/sqs-trigger-lambda.ts @@ -196,6 +196,7 @@ async function publishFailedEvents( data: { messageReference: event.data.messageReference, senderId: event.data.senderId, + reasonCode: 'DL_PDMV_001', }, })), pdmResourceSubmissionRejectedValidator, diff --git a/package-lock.json b/package-lock.json index 75352a0d9..2acfb4cbb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -335,7 +335,9 @@ } }, "lambdas/core-notifier-lambda/node_modules/picomatch": { - "version": "2.3.1", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", "dev": true, "license": "MIT", "engines": { @@ -630,7 +632,9 @@ } }, "lambdas/file-scanner-lambda/node_modules/picomatch": { - "version": "2.3.1", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", "dev": true, "license": "MIT", "engines": { @@ -937,7 +941,9 @@ } }, "lambdas/key-generation/node_modules/picomatch": { - "version": "2.3.1", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", "dev": true, "license": "MIT", "engines": { @@ -1230,7 +1236,9 @@ } }, "lambdas/move-scanned-files-lambda/node_modules/picomatch": { - "version": "2.3.1", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", "dev": true, "license": "MIT", "engines": { @@ -1533,7 +1541,9 @@ } }, "lambdas/pdm-mock-lambda/node_modules/picomatch": { - "version": "2.3.1", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", "dev": true, "license": "MIT", "engines": { @@ -1832,7 +1842,9 @@ } }, "lambdas/pdm-poll-lambda/node_modules/picomatch": { - "version": "2.3.1", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", "dev": true, "license": "MIT", "engines": { @@ -2113,7 +2125,9 @@ } }, "lambdas/pdm-uploader-lambda/node_modules/picomatch": { - "version": "2.3.1", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", "dev": true, "license": "MIT", "engines": { @@ -2408,7 +2422,9 @@ } }, "lambdas/print-analyser/node_modules/picomatch": { - "version": "2.3.1", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", "dev": true, "license": "MIT", "engines": { @@ -2687,7 +2703,9 @@ } }, "lambdas/print-sender-lambda/node_modules/picomatch": { - "version": "2.3.1", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", "dev": true, "license": "MIT", "engines": { @@ -2981,7 +2999,9 @@ } }, "lambdas/print-status-handler/node_modules/picomatch": { - "version": "2.3.1", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", "dev": true, "license": "MIT", "engines": { @@ -3290,7 +3310,9 @@ } }, "lambdas/refresh-apim-access-token/node_modules/picomatch": { - "version": "2.3.1", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", "dev": true, "license": "MIT", "engines": { @@ -3584,7 +3606,9 @@ } }, "lambdas/report-event-transformer/node_modules/picomatch": { - "version": "2.3.1", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", "dev": true, "license": "MIT", "engines": { @@ -3885,9 +3909,9 @@ } }, "lambdas/report-generator/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", "dev": true, "license": "MIT", "engines": { @@ -4157,7 +4181,9 @@ } }, "lambdas/report-scheduler/node_modules/picomatch": { - "version": "2.3.1", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", "dev": true, "license": "MIT", "engines": { @@ -4437,7 +4463,9 @@ } }, "lambdas/ttl-create-lambda/node_modules/picomatch": { - "version": "2.3.1", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", "dev": true, "license": "MIT", "engines": { @@ -4735,7 +4763,9 @@ } }, "lambdas/ttl-handle-expiry-lambda/node_modules/picomatch": { - "version": "2.3.1", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", "dev": true, "license": "MIT", "engines": { @@ -5035,7 +5065,9 @@ } }, "lambdas/ttl-poll-lambda/node_modules/picomatch": { - "version": "2.3.1", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", "dev": true, "license": "MIT", "engines": { @@ -6601,13 +6633,13 @@ } }, "node_modules/@aws-sdk/xml-builder": { - "version": "3.972.10", - "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.972.10.tgz", - "integrity": "sha512-OnejAIVD+CxzyAUrVic7lG+3QRltyja9LoNqCE/1YVs8ichoTbJlVSaZ9iSMcnHLyzrSNtvaOGjSDRP+d/ouFA==", + "version": "3.972.15", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.972.15.tgz", + "integrity": "sha512-PxMRlCFNiQnke9YR29vjFQwz4jq+6Q04rOVFeTDR2K7Qpv9h9FOWOxG+zJjageimYbWqE3bTuLjmryWHAWbvaA==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.13.0", - "fast-xml-parser": "5.5.6", + "@smithy/types": "^4.13.1", + "fast-xml-parser": "5.5.8", "tslib": "^2.6.2" }, "engines": { @@ -8048,7 +8080,9 @@ } }, "node_modules/@jest/console/node_modules/picomatch": { - "version": "2.3.1", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", "dev": true, "license": "MIT", "engines": { @@ -8994,7 +9028,9 @@ } }, "node_modules/@jest/reporters/node_modules/picomatch": { - "version": "2.3.1", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", "dev": true, "license": "MIT", "engines": { @@ -9201,7 +9237,9 @@ } }, "node_modules/@jest/transform/node_modules/picomatch": { - "version": "2.3.1", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", "dev": true, "license": "MIT", "engines": { @@ -10020,9 +10058,9 @@ } }, "node_modules/@smithy/types": { - "version": "4.13.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.13.0.tgz", - "integrity": "sha512-COuLsZILbbQsdrwKQpkkpyep7lCsByxwj7m0Mg5v66/ZTyenlfBc40/QFQ5chO0YN/PNEH1Bi3fGtfXPnYNeDw==", + "version": "4.13.1", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.13.1.tgz", + "integrity": "sha512-787F3yzE2UiJIQ+wYW1CVg2odHjmaWLGksnKQHUrK/lYZSEcy1msuLVvxaR/sI2/aDe9U+TBuLsXnr3vod1g0g==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -10965,7 +11003,9 @@ } }, "node_modules/anymatch/node_modules/picomatch": { - "version": "2.3.1", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", "dev": true, "license": "MIT", "engines": { @@ -11898,7 +11938,9 @@ } }, "node_modules/create-jest/node_modules/picomatch": { - "version": "2.3.1", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", "dev": true, "license": "MIT", "engines": { @@ -13571,9 +13613,9 @@ } }, "node_modules/fast-xml-parser": { - "version": "5.5.6", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.5.6.tgz", - "integrity": "sha512-3+fdZyBRVg29n4rXP0joHthhcHdPUHaIC16cuyyd1iLsuaO6Vea36MPrxgAzbZna8lhvZeRL8Bc9GP56/J9xEw==", + "version": "5.5.8", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.5.8.tgz", + "integrity": "sha512-Z7Fh2nVQSb2d+poDViM063ix2ZGt9jmY1nWhPfHBOK2Hgnb/OW3P4Et3P/81SEej0J7QbWtJqxO05h8QYfK7LQ==", "funding": [ { "type": "github", @@ -13583,8 +13625,8 @@ "license": "MIT", "dependencies": { "fast-xml-builder": "^1.1.4", - "path-expression-matcher": "^1.1.3", - "strnum": "^2.1.2" + "path-expression-matcher": "^1.2.0", + "strnum": "^2.2.0" }, "bin": { "fxparser": "src/cli/cli.js" @@ -13681,9 +13723,9 @@ } }, "node_modules/flatted": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.1.tgz", - "integrity": "sha512-IxfVbRFVlV8V/yRaGzk0UVIcsKKHMSfYw66T/u4nTwlWteQePsxe//LjudR1AMX4tZW3WFCh3Zqa/sjlqpbURQ==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", + "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", "dev": true, "license": "ISC" }, @@ -14890,7 +14932,9 @@ } }, "node_modules/jest-changed-files/node_modules/picomatch": { - "version": "2.3.1", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", "dev": true, "license": "MIT", "engines": { @@ -15108,7 +15152,9 @@ } }, "node_modules/jest-circus/node_modules/picomatch": { - "version": "2.3.1", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", "dev": true, "license": "MIT", "engines": { @@ -15836,7 +15882,9 @@ } }, "node_modules/jest-config/node_modules/picomatch": { - "version": "2.3.1", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", "dev": true, "license": "MIT", "engines": { @@ -15988,7 +16036,9 @@ } }, "node_modules/jest-each/node_modules/picomatch": { - "version": "2.3.1", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", "dev": true, "license": "MIT", "engines": { @@ -16178,7 +16228,9 @@ } }, "node_modules/jest-environment-node/node_modules/picomatch": { - "version": "2.3.1", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", "dev": true, "license": "MIT", "engines": { @@ -16299,7 +16351,9 @@ } }, "node_modules/jest-haste-map/node_modules/picomatch": { - "version": "2.3.1", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", "dev": true, "license": "MIT", "engines": { @@ -16869,7 +16923,9 @@ } }, "node_modules/jest-resolve-dependencies/node_modules/picomatch": { - "version": "2.3.1", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", "dev": true, "license": "MIT", "engines": { @@ -16950,7 +17006,9 @@ } }, "node_modules/jest-resolve/node_modules/picomatch": { - "version": "2.3.1", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", "dev": true, "license": "MIT", "engines": { @@ -17112,7 +17170,9 @@ } }, "node_modules/jest-runner/node_modules/picomatch": { - "version": "2.3.1", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", "dev": true, "license": "MIT", "engines": { @@ -17374,7 +17434,9 @@ } }, "node_modules/jest-runtime/node_modules/picomatch": { - "version": "2.3.1", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", "dev": true, "license": "MIT", "engines": { @@ -17765,7 +17827,9 @@ } }, "node_modules/jest-watcher/node_modules/picomatch": { - "version": "2.3.1", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", "dev": true, "license": "MIT", "engines": { @@ -17840,7 +17904,9 @@ } }, "node_modules/jest-worker/node_modules/picomatch": { - "version": "2.3.1", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", "dev": true, "license": "MIT", "engines": { @@ -18532,7 +18598,9 @@ } }, "node_modules/micromatch/node_modules/picomatch": { - "version": "2.3.1", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", "license": "MIT", "engines": { "node": ">=8.6" @@ -19274,7 +19342,9 @@ "license": "ISC" }, "node_modules/picomatch": { - "version": "4.0.3", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", "license": "MIT", "engines": { "node": ">=12" @@ -20400,9 +20470,9 @@ } }, "node_modules/strnum": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.2.0.tgz", - "integrity": "sha512-Y7Bj8XyJxnPAORMZj/xltsfo55uOiyHcU2tnAVzHUnSJR/KsEX+9RoDeXEnsXtl/CX4fAcrt64gZ13aGaWPeBg==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.2.2.tgz", + "integrity": "sha512-DnR90I+jtXNSTXWdwrEy9FakW7UX+qUZg28gj5fk2vxxl7uS/3bpI4fjFYVmdK9etptYBPNkpahuQnEwhwECqA==", "funding": [ { "type": "github", @@ -21895,7 +21965,9 @@ "license": "ISC" }, "node_modules/yaml": { - "version": "2.8.2", + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.3.tgz", + "integrity": "sha512-AvbaCLOO2Otw/lW5bmh9d/WEdcDFdQp2Z2ZUH3pX9U2ihyUY0nvLv7J6TrWowklRGPYbB/IuIMfYgxaCPg5Bpg==", "dev": true, "license": "ISC", "bin": { @@ -22348,7 +22420,9 @@ } }, "src/python-schema-generator/node_modules/picomatch": { - "version": "2.3.1", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", "dev": true, "license": "MIT", "engines": { @@ -22631,7 +22705,9 @@ } }, "src/typescript-schema-generator/node_modules/picomatch": { - "version": "2.3.1", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", "dev": true, "license": "MIT", "engines": { @@ -22954,7 +23030,9 @@ } }, "utils/sender-management/node_modules/picomatch": { - "version": "2.3.1", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", "dev": true, "license": "MIT", "engines": { @@ -23485,7 +23563,9 @@ } }, "utils/utils/node_modules/picomatch": { - "version": "2.3.1", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", "dev": true, "license": "MIT", "engines": { diff --git a/src/cloudevents/domains/digital-letters/2025-10-draft/data/digital-letters-message-request-rejected-data.schema.yaml b/src/cloudevents/domains/digital-letters/2025-10-draft/data/digital-letters-message-request-rejected-data.schema.yaml index 05f3dd373..ce14936ff 100644 --- a/src/cloudevents/domains/digital-letters/2025-10-draft/data/digital-letters-message-request-rejected-data.schema.yaml +++ b/src/cloudevents/domains/digital-letters/2025-10-draft/data/digital-letters-message-request-rejected-data.schema.yaml @@ -12,8 +12,15 @@ properties: $ref: ../defs/requests.schema.yaml#/properties/messageUri failureCode: $ref: ../defs/core.schema.yaml#/properties/failureCode + reasonCode: + $ref: ../defs/print.schema.yaml#/properties/reasonCode + reasonText: + type: string + description: Human-readable description of the failure reason for reporting (from Core API) required: - messageReference - senderId - messageUri - failureCode + - reasonCode + - reasonText diff --git a/src/cloudevents/domains/digital-letters/2025-10-draft/data/digital-letters-pdm-resource-retries-exceeded-data.schema.yaml b/src/cloudevents/domains/digital-letters/2025-10-draft/data/digital-letters-pdm-resource-retries-exceeded-data.schema.yaml index 99e2e449c..41e96b05b 100644 --- a/src/cloudevents/domains/digital-letters/2025-10-draft/data/digital-letters-pdm-resource-retries-exceeded-data.schema.yaml +++ b/src/cloudevents/domains/digital-letters/2025-10-draft/data/digital-letters-pdm-resource-retries-exceeded-data.schema.yaml @@ -12,8 +12,11 @@ properties: $ref: ../defs/pdm.schema.yaml#/properties/resourceId retryCount: $ref: ../defs/pdm.schema.yaml#/properties/retryCount + reasonCode: + $ref: ../defs/print.schema.yaml#/properties/reasonCode required: - messageReference - senderId - resourceId - retryCount + - reasonCode diff --git a/src/cloudevents/domains/digital-letters/2025-10-draft/data/digital-letters-pdm-resource-submission-rejected-data.schema.yaml b/src/cloudevents/domains/digital-letters/2025-10-draft/data/digital-letters-pdm-resource-submission-rejected-data.schema.yaml index 46f44b660..0cb414a84 100644 --- a/src/cloudevents/domains/digital-letters/2025-10-draft/data/digital-letters-pdm-resource-submission-rejected-data.schema.yaml +++ b/src/cloudevents/domains/digital-letters/2025-10-draft/data/digital-letters-pdm-resource-submission-rejected-data.schema.yaml @@ -8,6 +8,9 @@ properties: $ref: ../defs/requests.schema.yaml#/properties/messageReference senderId: $ref: ../defs/requests.schema.yaml#/properties/senderId + reasonCode: + $ref: ../defs/print.schema.yaml#/properties/reasonCode required: - messageReference - senderId + - reasonCode diff --git a/src/cloudevents/domains/digital-letters/2025-10-draft/data/digital-letters-print-file-quarantined-data.schema.yaml b/src/cloudevents/domains/digital-letters/2025-10-draft/data/digital-letters-print-file-quarantined-data.schema.yaml index 86254b2f0..578139a3f 100644 --- a/src/cloudevents/domains/digital-letters/2025-10-draft/data/digital-letters-print-file-quarantined-data.schema.yaml +++ b/src/cloudevents/domains/digital-letters/2025-10-draft/data/digital-letters-print-file-quarantined-data.schema.yaml @@ -12,8 +12,11 @@ properties: $ref: ../defs/print.schema.yaml#/properties/letterUri createdAt: $ref: ../defs/print.schema.yaml#/properties/createdAt + reasonCode: + $ref: ../defs/print.schema.yaml#/properties/reasonCode required: - messageReference - senderId - letterUri - createdAt + - reasonCode diff --git a/src/eventcatalog/package-lock.json b/src/eventcatalog/package-lock.json index 3b656373c..82c4294ad 100644 --- a/src/eventcatalog/package-lock.json +++ b/src/eventcatalog/package-lock.json @@ -8,7 +8,7 @@ "name": "digital-letters", "version": "0.1.0", "dependencies": { - "@eventcatalog/core": "2.64.3" + "@eventcatalog/core": "^2.64.3" }, "devDependencies": { "http-server": "^14.1.1" @@ -164,22 +164,25 @@ } }, "node_modules/@asamuzakjp/css-color": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-4.1.2.tgz", - "integrity": "sha512-NfBUvBaYgKIuq6E/RBLY1m0IohzNHAYyaJGuTK79Z23uNwmz2jl1mPsC5ZxCCxylinKhT1Amn5oNTlx1wN8cQg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-5.0.1.tgz", + "integrity": "sha512-2SZFvqMyvboVV1d15lMf7XiI3m7SDqXUuKaTymJYLN6dSGadqp+fVojqJlVoMlbZnlTmu3S0TLwLTJpvBMO1Aw==", "license": "MIT", "dependencies": { - "@csstools/css-calc": "^3.0.0", - "@csstools/css-color-parser": "^4.0.1", + "@csstools/css-calc": "^3.1.1", + "@csstools/css-color-parser": "^4.0.2", "@csstools/css-parser-algorithms": "^4.0.0", "@csstools/css-tokenizer": "^4.0.0", - "lru-cache": "^11.2.5" + "lru-cache": "^11.2.6" + }, + "engines": { + "node": "^20.19.0 || ^22.12.0 || >=24.0.0" } }, "node_modules/@asamuzakjp/css-color/node_modules/lru-cache": { - "version": "11.2.6", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.6.tgz", - "integrity": "sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ==", + "version": "11.2.7", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.7.tgz", + "integrity": "sha512-aY/R+aEsRelme17KGQa/1ZSIpLpNYYrhcrepKTZgE+W3WM16YMCaPwOHLHsmopZHELU0Ojin1lPVxKR0MihncA==", "license": "BlueOak-1.0.0", "engines": { "node": "20 || >=22" @@ -199,31 +202,31 @@ } }, "node_modules/@asamuzakjp/dom-selector/node_modules/css-tree": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.1.0.tgz", - "integrity": "sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.2.1.tgz", + "integrity": "sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==", "license": "MIT", "dependencies": { - "mdn-data": "2.12.2", - "source-map-js": "^1.0.1" + "mdn-data": "2.27.1", + "source-map-js": "^1.2.1" }, "engines": { "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" } }, "node_modules/@asamuzakjp/dom-selector/node_modules/lru-cache": { - "version": "11.2.6", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.6.tgz", - "integrity": "sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ==", + "version": "11.2.7", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.7.tgz", + "integrity": "sha512-aY/R+aEsRelme17KGQa/1ZSIpLpNYYrhcrepKTZgE+W3WM16YMCaPwOHLHsmopZHELU0Ojin1lPVxKR0MihncA==", "license": "BlueOak-1.0.0", "engines": { "node": "20 || >=22" } }, "node_modules/@asamuzakjp/dom-selector/node_modules/mdn-data": { - "version": "2.12.2", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.12.2.tgz", - "integrity": "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==", + "version": "2.27.1", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.27.1.tgz", + "integrity": "sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==", "license": "CC0-1.0" }, "node_modules/@asamuzakjp/nwsapi": { @@ -264,28 +267,28 @@ "license": "MIT" }, "node_modules/@astrojs/language-server": { - "version": "2.16.3", - "resolved": "https://registry.npmjs.org/@astrojs/language-server/-/language-server-2.16.3.tgz", - "integrity": "sha512-yO5K7RYCMXUfeDlnU6UnmtnoXzpuQc0yhlaCNZ67k1C/MiwwwvMZz+LGa+H35c49w5QBfvtr4w4Zcf5PcH8uYA==", + "version": "2.16.6", + "resolved": "https://registry.npmjs.org/@astrojs/language-server/-/language-server-2.16.6.tgz", + "integrity": "sha512-N990lu+HSFiG57owR0XBkr02BYMgiLCshLf+4QG4v6jjSWkBeQGnzqi+E1L08xFPPJ7eEeXnxPXGLaVv5pa4Ug==", "license": "MIT", "dependencies": { - "@astrojs/compiler": "^2.13.0", - "@astrojs/yaml2ts": "^0.2.2", + "@astrojs/compiler": "^2.13.1", + "@astrojs/yaml2ts": "^0.2.3", "@jridgewell/sourcemap-codec": "^1.5.5", - "@volar/kit": "~2.4.27", - "@volar/language-core": "~2.4.27", - "@volar/language-server": "~2.4.27", - "@volar/language-service": "~2.4.27", + "@volar/kit": "~2.4.28", + "@volar/language-core": "~2.4.28", + "@volar/language-server": "~2.4.28", + "@volar/language-service": "~2.4.28", "muggle-string": "^0.4.1", "tinyglobby": "^0.2.15", - "volar-service-css": "0.0.68", - "volar-service-emmet": "0.0.68", - "volar-service-html": "0.0.68", - "volar-service-prettier": "0.0.68", - "volar-service-typescript": "0.0.68", - "volar-service-typescript-twoslash-queries": "0.0.68", - "volar-service-yaml": "0.0.68", - "vscode-html-languageservice": "^5.6.1", + "volar-service-css": "0.0.70", + "volar-service-emmet": "0.0.70", + "volar-service-html": "0.0.70", + "volar-service-prettier": "0.0.70", + "volar-service-typescript": "0.0.70", + "volar-service-typescript-twoslash-queries": "0.0.70", + "volar-service-yaml": "0.0.70", + "vscode-html-languageservice": "^5.6.2", "vscode-uri": "^3.1.0" }, "bin": { @@ -897,12 +900,12 @@ } }, "node_modules/@astrojs/node": { - "version": "9.5.4", - "resolved": "https://registry.npmjs.org/@astrojs/node/-/node-9.5.4.tgz", - "integrity": "sha512-AbPSZsMGu8hXPR2XxV79RaKy8h6wijhtoqZGeUf4OXg2w1mxXlx4VnIc1D+QvtsgauSz7P5PLhmvf6w/J41GJg==", + "version": "9.5.5", + "resolved": "https://registry.npmjs.org/@astrojs/node/-/node-9.5.5.tgz", + "integrity": "sha512-rtU2BGU5u3SfGURpANfMxVzCIoR86MkaN05ncza9rbtuMKJ/XnRJt/BbyVknDbOJ71hoci0SIsJwKcJR8vvi/A==", "license": "MIT", "dependencies": { - "@astrojs/internal-helpers": "0.7.5", + "@astrojs/internal-helpers": "0.7.6", "send": "^1.2.1", "server-destroy": "^1.0.1" }, @@ -910,6 +913,12 @@ "astro": "^5.17.3" } }, + "node_modules/@astrojs/node/node_modules/@astrojs/internal-helpers": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/@astrojs/internal-helpers/-/internal-helpers-0.7.6.tgz", + "integrity": "sha512-GOle7smBWKfMSP8osUIGOlB5kaHdQLV3foCsf+5Q9Wsuu+C6Fs3Ez/ttXmhjZ1HkSgsogcM1RXSjjOVieHq16Q==", + "license": "MIT" + }, "node_modules/@astrojs/prism": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/@astrojs/prism/-/prism-3.3.0.tgz", @@ -986,12 +995,12 @@ } }, "node_modules/@astrojs/yaml2ts": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/@astrojs/yaml2ts/-/yaml2ts-0.2.2.tgz", - "integrity": "sha512-GOfvSr5Nqy2z5XiwqTouBBpy5FyI6DEe+/g/Mk5am9SjILN1S5fOEvYK0GuWHg98yS/dobP4m8qyqw/URW35fQ==", + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@astrojs/yaml2ts/-/yaml2ts-0.2.3.tgz", + "integrity": "sha512-PJzRmgQzUxI2uwpdX2lXSHtP4G8ocp24/t+bZyf5Fy0SZLSF9f9KXZoMlFM/XCGue+B0nH/2IZ7FpBYQATBsCg==", "license": "MIT", "dependencies": { - "yaml": "^2.5.0" + "yaml": "^2.8.2" } }, "node_modules/@asyncapi/avro-schema-parser": { @@ -1019,12 +1028,12 @@ } }, "node_modules/@asyncapi/parser": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/@asyncapi/parser/-/parser-3.6.0.tgz", - "integrity": "sha512-6S0Yr8vI418a1IrpGsOYbfWVo9+aHvSqN2oSkiY0YJltS/C7oDOt9e0mo6hSld8bg+EeKrtgkVmpW4obh1JFvA==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@asyncapi/parser/-/parser-3.4.0.tgz", + "integrity": "sha512-Sxn74oHiZSU6+cVeZy62iPZMFMvKp4jupMFHelSICCMw1qELmUHPvuZSr+ZHDmNGgHcEpzJM5HN02kR7T4g+PQ==", "license": "Apache-2.0", "dependencies": { - "@asyncapi/specs": "^6.11.1", + "@asyncapi/specs": "^6.8.0", "@openapi-contrib/openapi-schema-to-json-schema": "~3.2.0", "@stoplight/json": "3.21.0", "@stoplight/json-ref-readers": "^1.2.2", @@ -1040,8 +1049,8 @@ "ajv-errors": "^3.0.0", "ajv-formats": "^2.1.1", "avsc": "^5.7.5", - "js-yaml": "^4.1.1", - "jsonpath-plus": "^10.0.7", + "js-yaml": "^4.1.0", + "jsonpath-plus": "^10.0.0", "node-fetch": "2.6.7" } }, @@ -1060,20 +1069,19 @@ } }, "node_modules/@asyncapi/react-component": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/@asyncapi/react-component/-/react-component-2.6.5.tgz", - "integrity": "sha512-+kQyIc337MHGTQ1ZYEuY2vfCyii2J/3o3Pm5/oJFgzWs9jWIz7/momLFl6rsS7Yd7elBam9Ukw0F3oM1AwwyHQ==", + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/@asyncapi/react-component/-/react-component-2.4.3.tgz", + "integrity": "sha512-8DZdadD2vGoq7rw18RehmytQLT2Y1RFQ+UgvhQA3UaTqIFL2qFOHIm1YMnl5VVPxtTmkvi20wZZk37nyNvzJug==", "license": "Apache-2.0", "dependencies": { "@asyncapi/avro-schema-parser": "^3.0.24", "@asyncapi/openapi-schema-parser": "^3.0.24", "@asyncapi/parser": "^3.3.0", - "@asyncapi/protobuf-schema-parser": "^3.6.0", + "@asyncapi/protobuf-schema-parser": "^3.2.14", "highlight.js": "^10.7.2", "isomorphic-dompurify": "^2.14.0", "marked": "^4.0.14", "openapi-sampler": "^1.2.1", - "react-error-boundary": "^4.1.2", "use-resize-observer": "^9.1.0" }, "peerDependencies": { @@ -1442,22 +1450,22 @@ } }, "node_modules/@bramus/specificity/node_modules/css-tree": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.1.0.tgz", - "integrity": "sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.2.1.tgz", + "integrity": "sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==", "license": "MIT", "dependencies": { - "mdn-data": "2.12.2", - "source-map-js": "^1.0.1" + "mdn-data": "2.27.1", + "source-map-js": "^1.2.1" }, "engines": { "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" } }, "node_modules/@bramus/specificity/node_modules/mdn-data": { - "version": "2.12.2", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.12.2.tgz", - "integrity": "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==", + "version": "2.27.1", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.27.1.tgz", + "integrity": "sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==", "license": "CC0-1.0" }, "node_modules/@capsizecss/unpack": { @@ -1686,9 +1694,9 @@ } }, "node_modules/@csstools/color-helpers": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-6.0.1.tgz", - "integrity": "sha512-NmXRccUJMk2AWA5A7e5a//3bCIMyOu2hAtdRYrhPPHjDxINuCwX1w6rnIZ4xjLcp0ayv6h8Pc3X0eJUGiAAXHQ==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-6.0.2.tgz", + "integrity": "sha512-LMGQLS9EuADloEFkcTBR3BwV/CGHV7zyDxVRtVDTwdI2Ca4it0CCVTT9wCkxSgokjE5Ho41hEPgb8OEUwoXr6Q==", "funding": [ { "type": "github", @@ -1728,9 +1736,9 @@ } }, "node_modules/@csstools/css-color-parser": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-4.0.1.tgz", - "integrity": "sha512-vYwO15eRBEkeF6xjAno/KQ61HacNhfQuuU/eGwH67DplL0zD5ZixUa563phQvUelA07yDczIXdtmYojCphKJcw==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-4.0.2.tgz", + "integrity": "sha512-0GEfbBLmTFf0dJlpsNU7zwxRIH0/BGEMuXLTCvFYxuL1tNhqzTbtnFICyJLTNK4a+RechKP75e7w42ClXSnJQw==", "funding": [ { "type": "github", @@ -1743,8 +1751,8 @@ ], "license": "MIT", "dependencies": { - "@csstools/color-helpers": "^6.0.1", - "@csstools/css-calc": "^3.0.0" + "@csstools/color-helpers": "^6.0.2", + "@csstools/css-calc": "^3.1.1" }, "engines": { "node": ">=20.19.0" @@ -1777,22 +1785,6 @@ "@csstools/css-tokenizer": "^4.0.0" } }, - "node_modules/@csstools/css-syntax-patches-for-csstree": { - "version": "1.0.27", - "resolved": "https://registry.npmjs.org/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.0.27.tgz", - "integrity": "sha512-sxP33Jwg1bviSUXAV43cVYdmjt2TLnLXNqCWl9xmxHawWVjGz/kEbdkr7F9pxJNBN2Mh+dq0crgItbW6tQvyow==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/csstools" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/csstools" - } - ], - "license": "MIT-0" - }, "node_modules/@csstools/css-tokenizer": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-4.0.0.tgz", @@ -2311,28 +2303,28 @@ } }, "node_modules/@eventcatalog/core": { - "version": "2.64.3", - "resolved": "https://registry.npmjs.org/@eventcatalog/core/-/core-2.64.3.tgz", - "integrity": "sha512-mb3zFBXG0SBtj2mndTmjZ0b2QDUdUnKKh53SSzYyw0uAapFFHyDdLM+W8N9HblG7n9BZifbrsrODNHc2b3+03Q==", + "version": "2.65.4", + "resolved": "https://registry.npmjs.org/@eventcatalog/core/-/core-2.65.4.tgz", + "integrity": "sha512-dDvZPcupZBIBFEU1eJO20+rvyHkoe8ijBGHuyviz4GXf6gTw4/IqTqsI9xoyu9Gs4rLwoZMGjhxMR4YQZtAo/A==", "dependencies": { "@ai-sdk/anthropic": "^2.0.23", "@ai-sdk/google": "^2.0.17", "@ai-sdk/openai": "^2.0.42", "@ai-sdk/react": "^2.0.60", - "@astrojs/markdown-remark": "^6.3.8", - "@astrojs/mdx": "^4.3.9", - "@astrojs/node": "^9.5.0", - "@astrojs/react": "^4.4.1", - "@astrojs/rss": "^4.0.13", + "@astrojs/markdown-remark": "^6.3.9", + "@astrojs/mdx": "^4.3.12", + "@astrojs/node": "^9.5.1", + "@astrojs/react": "^4.4.2", + "@astrojs/rss": "^4.0.14", "@astrojs/tailwind": "^6.0.2", - "@asyncapi/avro-schema-parser": "^3.0.24", - "@asyncapi/parser": "^3.4.0", - "@asyncapi/react-component": "^2.4.3", + "@asyncapi/avro-schema-parser": "3.0.24", + "@asyncapi/parser": "3.4.0", + "@asyncapi/react-component": "2.4.3", "@auth/core": "^0.37.4", "@eventcatalog/generator-ai": "^1.1.0", "@eventcatalog/license": "^0.0.7", "@eventcatalog/linter": "^0.0.2", - "@eventcatalog/sdk": "^2.8.4", + "@eventcatalog/sdk": "^2.9.2", "@eventcatalog/visualizer": "^0.0.6", "@fontsource/inter": "^5.2.5", "@headlessui/react": "^2.0.3", @@ -2350,7 +2342,7 @@ "@tanstack/react-table": "^8.17.3", "@xyflow/react": "^12.3.6", "ai": "^5.0.60", - "astro": "^5.15.3", + "astro": "^5.16.0", "astro-compress": "^2.3.8", "astro-expressive-code": "^0.41.3", "astro-seo": "^0.8.4", @@ -2366,7 +2358,7 @@ "diff2html": "^3.4.48", "dotenv": "^16.5.0", "elkjs": "^0.10.0", - "glob": "^10.4.1", + "glob": "^10.5.0", "gray-matter": "^4.0.3", "html-to-image": "^1.11.11", "js-yaml": "^4.1.0", @@ -2635,9 +2627,9 @@ } }, "node_modules/@exodus/bytes": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@exodus/bytes/-/bytes-1.14.1.tgz", - "integrity": "sha512-OhkBFWI6GcRMUroChZiopRiSp2iAMvEBK47NhJooDqz1RERO4QuZIZnjP63TXX8GAiLABkYmX+fuQsdJ1dd2QQ==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/@exodus/bytes/-/bytes-1.15.0.tgz", + "integrity": "sha512-UY0nlA+feH81UGSHv92sLEPLCeZFjXOuHhrIo0HQydScuQc8s0A7kL/UdgwgDq8g8ilksmuoF35YVTNphV2aBQ==", "license": "MIT", "engines": { "node": "^20.19.0 || ^22.12.0 || >=24.0.0" @@ -3998,7 +3990,6 @@ "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==", "license": "Apache-2.0", - "peer": true, "engines": { "node": ">=8.0.0" } @@ -7317,6 +7308,7 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-25.3.0.tgz", "integrity": "sha512-4K3bqJpXpqfg2XKGK9bpDTc6xO/xoUP/RBWS7AtRMug6zZFaRekiLzjVtAoZMquxoAbzBvy5nxQ7veS5eYzf8A==", "license": "MIT", + "peer": true, "dependencies": { "undici-types": "~7.18.0" } @@ -8202,9 +8194,9 @@ } }, "node_modules/anymatch/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", "license": "MIT", "engines": { "node": ">=8.6" @@ -10408,46 +10400,71 @@ } }, "node_modules/cssstyle": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-6.0.1.tgz", - "integrity": "sha512-IoJs7La+oFp/AB033wBStxNOJt4+9hHMxsXUPANcoXL2b3W4DZKghlJ2cI/eyeRZIQ9ysvYEorVhjrcYctWbog==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-6.2.0.tgz", + "integrity": "sha512-Fm5NvhYathRnXNVndkUsCCuR63DCLVVwGOOwQw782coXFi5HhkXdu289l59HlXZBawsyNccXfWRYvLzcDCdDig==", "license": "MIT", "dependencies": { - "@asamuzakjp/css-color": "^4.1.2", - "@csstools/css-syntax-patches-for-csstree": "^1.0.26", + "@asamuzakjp/css-color": "^5.0.1", + "@csstools/css-syntax-patches-for-csstree": "^1.0.28", "css-tree": "^3.1.0", - "lru-cache": "^11.2.5" + "lru-cache": "^11.2.6" }, "engines": { "node": ">=20" } }, + "node_modules/cssstyle/node_modules/@csstools/css-syntax-patches-for-csstree": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.1.1.tgz", + "integrity": "sha512-BvqN0AMWNAnLk9G8jnUT77D+mUbY/H2b3uDTvg2isJkHaOufUE2R3AOwxWo7VBQKT1lOdwdvorddo2B/lk64+w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "peerDependencies": { + "css-tree": "^3.2.1" + }, + "peerDependenciesMeta": { + "css-tree": { + "optional": true + } + } + }, "node_modules/cssstyle/node_modules/css-tree": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.1.0.tgz", - "integrity": "sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.2.1.tgz", + "integrity": "sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==", "license": "MIT", + "peer": true, "dependencies": { - "mdn-data": "2.12.2", - "source-map-js": "^1.0.1" + "mdn-data": "2.27.1", + "source-map-js": "^1.2.1" }, "engines": { "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" } }, "node_modules/cssstyle/node_modules/lru-cache": { - "version": "11.2.6", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.6.tgz", - "integrity": "sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ==", + "version": "11.2.7", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.7.tgz", + "integrity": "sha512-aY/R+aEsRelme17KGQa/1ZSIpLpNYYrhcrepKTZgE+W3WM16YMCaPwOHLHsmopZHELU0Ojin1lPVxKR0MihncA==", "license": "BlueOak-1.0.0", "engines": { "node": "20 || >=22" } }, "node_modules/cssstyle/node_modules/mdn-data": { - "version": "2.12.2", - "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.12.2.tgz", - "integrity": "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==", + "version": "2.27.1", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.27.1.tgz", + "integrity": "sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==", "license": "CC0-1.0" }, "node_modules/csstype": { @@ -11273,9 +11290,9 @@ } }, "node_modules/devalue": { - "version": "5.6.3", - "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.6.3.tgz", - "integrity": "sha512-nc7XjUU/2Lb+SvEFVGcWLiKkzfw8+qHI7zn8WYXKkLMgfGSHbgCEaR6bJpev8Cm6Rmrb19Gfd/tZvGqx9is3wg==", + "version": "5.6.4", + "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.6.4.tgz", + "integrity": "sha512-Gp6rDldRsFh/7XuouDbxMH3Mx8GMCcgzIb1pDTvNyn8pZGQ22u+Wa+lGV9dQCltFQ7uVw0MhRyb8XDskNFOReA==", "license": "MIT" }, "node_modules/devlop": { @@ -12133,9 +12150,9 @@ } }, "node_modules/fast-xml-parser": { - "version": "5.5.6", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.5.6.tgz", - "integrity": "sha512-3+fdZyBRVg29n4rXP0joHthhcHdPUHaIC16cuyyd1iLsuaO6Vea36MPrxgAzbZna8lhvZeRL8Bc9GP56/J9xEw==", + "version": "5.5.9", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.5.9.tgz", + "integrity": "sha512-jldvxr1MC6rtiZKgrFnDSvT8xuH+eJqxqOBThUVjYrxssYTo1avZLGql5l0a0BAERR01CadYzZ83kVEkbyDg+g==", "funding": [ { "type": "github", @@ -12145,8 +12162,8 @@ "license": "MIT", "dependencies": { "fast-xml-builder": "^1.1.4", - "path-expression-matcher": "^1.1.3", - "strnum": "^2.1.2" + "path-expression-matcher": "^1.2.0", + "strnum": "^2.2.2" }, "bin": { "fxparser": "src/cli/cli.js" @@ -12210,9 +12227,9 @@ "license": "Apache-2.0" }, "node_modules/flatted": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.1.tgz", - "integrity": "sha512-IxfVbRFVlV8V/yRaGzk0UVIcsKKHMSfYw66T/u4nTwlWteQePsxe//LjudR1AMX4tZW3WFCh3Zqa/sjlqpbURQ==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", + "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", "license": "ISC" }, "node_modules/flattie": { @@ -13504,6 +13521,7 @@ "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz", "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==", "license": "MIT", + "peer": true, "funding": { "type": "opencollective", "url": "https://opencollective.com/immer" @@ -17628,7 +17646,6 @@ "resolved": "https://registry.npmjs.org/mermaid/-/mermaid-11.12.3.tgz", "integrity": "sha512-wN5ZSgJQIC+CHJut9xaKWsknLxaFBwCPwPkGTSUYrTiHORWvpT8RxGk849HPnpUAQ+/9BPRqYb80jTpearrHzQ==", "license": "MIT", - "peer": true, "dependencies": { "@braintree/sanitize-url": "^7.1.1", "@iconify/utils": "^3.0.1", @@ -19210,9 +19227,9 @@ } }, "node_modules/micromatch/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", "license": "MIT", "engines": { "node": ">=8.6" @@ -19799,13 +19816,13 @@ "license": "MIT" }, "node_modules/openapi-sampler": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/openapi-sampler/-/openapi-sampler-1.7.0.tgz", - "integrity": "sha512-fWq32F5vqGpgRJYIarC/9Y1wC9tKnRDcCOjsDJ7MIcSv2HsE7kNifcXIZ8FVtNStBUWxYrEk/MKqVF0SwZ5gog==", + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/openapi-sampler/-/openapi-sampler-1.7.2.tgz", + "integrity": "sha512-OKytvqB5XIaTgA9xtw8W8UTar+uymW2xPVpFN0NihMtuHPdPTGxBEhGnfFnJW5g/gOSIvkP+H0Xh3XhVI9/n7g==", "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.7", - "fast-xml-parser": "^5.3.4", + "fast-xml-parser": "^5.5.1", "json-pointer": "0.6.2" } }, @@ -20134,9 +20151,9 @@ "license": "MIT" }, "node_modules/path-expression-matcher": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/path-expression-matcher/-/path-expression-matcher-1.1.3.tgz", - "integrity": "sha512-qdVgY8KXmVdJZRSS1JdEPOKPdTiEK/pi0RkcT2sw1RhXxohdujUlJFPuS1TSkevZ9vzd3ZlL7ULl1MHGTApKzQ==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/path-expression-matcher/-/path-expression-matcher-1.2.0.tgz", + "integrity": "sha512-DwmPWeFn+tq7TiyJ2CxezCAirXjFxvaiD03npak3cRjlP9+OjTmSy1EpIrEbh+l6JgUundniloMLDQ/6VTdhLQ==", "funding": [ { "type": "github", @@ -20213,9 +20230,9 @@ "license": "ISC" }, "node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", "license": "MIT", "engines": { "node": ">=12" @@ -20799,18 +20816,6 @@ "react": "^18.3.1" } }, - "node_modules/react-error-boundary": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/react-error-boundary/-/react-error-boundary-4.1.2.tgz", - "integrity": "sha512-GQDxZ5Jd+Aq/qUxbCm1UtzmL/s++V7zKgE8yMktJiCQXCCFZnMZh9ng+6/Ne6PjNSXH0L9CjeOEREfRnq6Duag==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.12.5" - }, - "peerDependencies": { - "react": ">=16.13.1" - } - }, "node_modules/react-markdown": { "version": "10.1.0", "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-10.1.0.tgz", @@ -20987,9 +20992,9 @@ } }, "node_modules/readdirp/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", "license": "MIT", "engines": { "node": ">=8.6" @@ -22643,9 +22648,9 @@ } }, "node_modules/smol-toml": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.6.0.tgz", - "integrity": "sha512-4zemZi0HvTnYwLfrpk/CF9LOd9Lt87kAt50GnqhMpyF9U3poDAP2+iukq2bZsO/ufegbYehBkqINbsWxj4l4cw==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.6.1.tgz", + "integrity": "sha512-dWUG8F5sIIARXih1DTaQAX4SsiTXhInKf1buxdY9DIg4ZYPZK5nGM1VRIYmEbDbsHt7USo99xSLFu5Q1IqTmsg==", "license": "BSD-3-Clause", "engines": { "node": ">= 18" @@ -22957,9 +22962,9 @@ } }, "node_modules/strnum": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.1.2.tgz", - "integrity": "sha512-l63NF9y/cLROq/yqKXSLtcMeeyOfnSQlfMSlzFt/K73oIaD8DGaQWd7Z34X9GPiKqP5rbSh84Hl4bOlLcjiSrQ==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.2.2.tgz", + "integrity": "sha512-DnR90I+jtXNSTXWdwrEy9FakW7UX+qUZg28gj5fk2vxxl7uS/3bpI4fjFYVmdK9etptYBPNkpahuQnEwhwECqA==", "funding": [ { "type": "github", @@ -23342,21 +23347,21 @@ } }, "node_modules/tldts": { - "version": "7.0.23", - "resolved": "https://registry.npmjs.org/tldts/-/tldts-7.0.23.tgz", - "integrity": "sha512-ASdhgQIBSay0R/eXggAkQ53G4nTJqTXqC2kbaBbdDwM7SkjyZyO0OaaN1/FH7U/yCeqOHDwFO5j8+Os/IS1dXw==", + "version": "7.0.27", + "resolved": "https://registry.npmjs.org/tldts/-/tldts-7.0.27.tgz", + "integrity": "sha512-I4FZcVFcqCRuT0ph6dCDpPuO4Xgzvh+spkcTr1gK7peIvxWauoloVO0vuy1FQnijT63ss6AsHB6+OIM4aXHbPg==", "license": "MIT", "dependencies": { - "tldts-core": "^7.0.23" + "tldts-core": "^7.0.27" }, "bin": { "tldts": "bin/cli.js" } }, "node_modules/tldts-core": { - "version": "7.0.23", - "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.0.23.tgz", - "integrity": "sha512-0g9vrtDQLrNIiCj22HSe9d4mLVG3g5ph5DZ8zCKBr4OtrspmNB6ss7hVyzArAeE88ceZocIEGkyW1Ime7fxPtQ==", + "version": "7.0.27", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.0.27.tgz", + "integrity": "sha512-YQ7uPjgWUibIK6DW5lrKujGwUKhLevU4hcGbP5O6TcIUb+oTjJYJVWPS4nZsIHrEEEG6myk/oqAJUEQmpZrHsg==", "license": "MIT" }, "node_modules/to-regex-range": { @@ -23381,9 +23386,9 @@ } }, "node_modules/tough-cookie": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-6.0.0.tgz", - "integrity": "sha512-kXuRi1mtaKMrsLUxz3sQYvVl37B0Ns6MzfrtV5DvJceE9bPyspOqk9xxv7XbZWcfLWbFmm997vl83qUWVJA64w==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-6.0.1.tgz", + "integrity": "sha512-LktZQb3IeoUWB9lqR5EWTHgW/VTITCXg4D21M+lvybRVdylLrRMnqaIONLVb5mav8vM19m44HIcGq4qASeu2Qw==", "license": "BSD-3-Clause", "dependencies": { "tldts": "^7.0.5" @@ -23641,9 +23646,9 @@ "license": "MIT" }, "node_modules/undici": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/undici/-/undici-7.24.4.tgz", - "integrity": "sha512-BM/JzwwaRXxrLdElV2Uo6cTLEjhSb3WXboncJamZ15NgUURmvlXvxa6xkwIOILIjPNo9i8ku136ZvWV0Uly8+w==", + "version": "7.24.6", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.24.6.tgz", + "integrity": "sha512-Xi4agocCbRzt0yYMZGMA6ApD7gvtUFaxm4ZmeacWI4cZxaF6C+8I8QfofC20NAePiB/IcvZmzkJ7XPa471AEtA==", "license": "MIT", "engines": { "node": ">=20.18.1" @@ -24681,9 +24686,9 @@ } }, "node_modules/volar-service-css": { - "version": "0.0.68", - "resolved": "https://registry.npmjs.org/volar-service-css/-/volar-service-css-0.0.68.tgz", - "integrity": "sha512-lJSMh6f3QzZ1tdLOZOzovLX0xzAadPhx8EKwraDLPxBndLCYfoTvnNuiFFV8FARrpAlW5C0WkH+TstPaCxr00Q==", + "version": "0.0.70", + "resolved": "https://registry.npmjs.org/volar-service-css/-/volar-service-css-0.0.70.tgz", + "integrity": "sha512-K1qyOvBpE3rzdAv3e4/6Rv5yizrYPy5R/ne3IWCAzLBuMO4qBMV3kSqWzj6KUVe6S0AnN6wxF7cRkiaKfYMYJw==", "license": "MIT", "dependencies": { "vscode-css-languageservice": "^6.3.0", @@ -24700,9 +24705,9 @@ } }, "node_modules/volar-service-emmet": { - "version": "0.0.68", - "resolved": "https://registry.npmjs.org/volar-service-emmet/-/volar-service-emmet-0.0.68.tgz", - "integrity": "sha512-nHvixrRQ83EzkQ4G/jFxu9Y4eSsXS/X2cltEPDM+K9qZmIv+Ey1w0tg1+6caSe8TU5Hgw4oSTwNMf/6cQb3LzQ==", + "version": "0.0.70", + "resolved": "https://registry.npmjs.org/volar-service-emmet/-/volar-service-emmet-0.0.70.tgz", + "integrity": "sha512-xi5bC4m/VyE3zy/n2CXspKeDZs3qA41tHLTw275/7dNWM/RqE2z3BnDICQybHIVp/6G1iOQj5c1qXMgQC08TNg==", "license": "MIT", "dependencies": { "@emmetio/css-parser": "^0.4.1", @@ -24720,9 +24725,9 @@ } }, "node_modules/volar-service-html": { - "version": "0.0.68", - "resolved": "https://registry.npmjs.org/volar-service-html/-/volar-service-html-0.0.68.tgz", - "integrity": "sha512-fru9gsLJxy33xAltXOh4TEdi312HP80hpuKhpYQD4O5hDnkNPEBdcQkpB+gcX0oK0VxRv1UOzcGQEUzWCVHLfA==", + "version": "0.0.70", + "resolved": "https://registry.npmjs.org/volar-service-html/-/volar-service-html-0.0.70.tgz", + "integrity": "sha512-eR6vCgMdmYAo4n+gcT7DSyBQbwB8S3HZZvSagTf0sxNaD4WppMCFfpqWnkrlGStPKMZvMiejRRVmqsX9dYcTvQ==", "license": "MIT", "dependencies": { "vscode-html-languageservice": "^5.3.0", @@ -24739,9 +24744,9 @@ } }, "node_modules/volar-service-prettier": { - "version": "0.0.68", - "resolved": "https://registry.npmjs.org/volar-service-prettier/-/volar-service-prettier-0.0.68.tgz", - "integrity": "sha512-grUmWHkHlebMOd6V8vXs2eNQUw/bJGJMjekh/EPf/p2ZNTK0Uyz7hoBRngcvGfJHMsSXZH8w/dZTForIW/4ihw==", + "version": "0.0.70", + "resolved": "https://registry.npmjs.org/volar-service-prettier/-/volar-service-prettier-0.0.70.tgz", + "integrity": "sha512-Z6BCFSpGVCd8BPAsZ785Kce1BGlWd5ODqmqZGVuB14MJvrR4+CYz6cDy4F+igmE1gMifqfvMhdgT8Aud4M5ngg==", "license": "MIT", "dependencies": { "vscode-uri": "^3.0.8" @@ -24760,9 +24765,9 @@ } }, "node_modules/volar-service-typescript": { - "version": "0.0.68", - "resolved": "https://registry.npmjs.org/volar-service-typescript/-/volar-service-typescript-0.0.68.tgz", - "integrity": "sha512-z7B/7CnJ0+TWWFp/gh2r5/QwMObHNDiQiv4C9pTBNI2Wxuwymd4bjEORzrJ/hJ5Yd5+OzeYK+nFCKevoGEEeKw==", + "version": "0.0.70", + "resolved": "https://registry.npmjs.org/volar-service-typescript/-/volar-service-typescript-0.0.70.tgz", + "integrity": "sha512-l46Bx4cokkUedTd74ojO5H/zqHZJ8SUuyZ0IB8JN4jfRqUM3bQFBHoOwlZCyZmOeO0A3RQNkMnFclxO4c++gsg==", "license": "MIT", "dependencies": { "path-browserify": "^1.0.1", @@ -24782,9 +24787,9 @@ } }, "node_modules/volar-service-typescript-twoslash-queries": { - "version": "0.0.68", - "resolved": "https://registry.npmjs.org/volar-service-typescript-twoslash-queries/-/volar-service-typescript-twoslash-queries-0.0.68.tgz", - "integrity": "sha512-NugzXcM0iwuZFLCJg47vI93su5YhTIweQuLmZxvz5ZPTaman16JCvmDZexx2rd5T/75SNuvvZmrTOTNYUsfe5w==", + "version": "0.0.70", + "resolved": "https://registry.npmjs.org/volar-service-typescript-twoslash-queries/-/volar-service-typescript-twoslash-queries-0.0.70.tgz", + "integrity": "sha512-IdD13Z9N2Bu8EM6CM0fDV1E69olEYGHDU25X51YXmq8Y0CmJ2LNj6gOiBJgpS5JGUqFzECVhMNBW7R0sPdRTMQ==", "license": "MIT", "dependencies": { "vscode-uri": "^3.0.8" @@ -24799,13 +24804,13 @@ } }, "node_modules/volar-service-yaml": { - "version": "0.0.68", - "resolved": "https://registry.npmjs.org/volar-service-yaml/-/volar-service-yaml-0.0.68.tgz", - "integrity": "sha512-84XgE02LV0OvTcwfqhcSwVg4of3MLNUWPMArO6Aj8YXqyEVnPu8xTEMY2btKSq37mVAPuaEVASI4e3ptObmqcA==", + "version": "0.0.70", + "resolved": "https://registry.npmjs.org/volar-service-yaml/-/volar-service-yaml-0.0.70.tgz", + "integrity": "sha512-0c8bXDBeoATF9F6iPIlOuYTuZAC4c+yi0siQo920u7eiBJk8oQmUmg9cDUbR4+Gl++bvGP4plj3fErbJuPqdcQ==", "license": "MIT", "dependencies": { "vscode-uri": "^3.0.8", - "yaml-language-server": "~1.19.2" + "yaml-language-server": "~1.20.0" }, "peerDependencies": { "@volar/language-service": "~2.4.0" @@ -24817,9 +24822,9 @@ } }, "node_modules/vscode-css-languageservice": { - "version": "6.3.9", - "resolved": "https://registry.npmjs.org/vscode-css-languageservice/-/vscode-css-languageservice-6.3.9.tgz", - "integrity": "sha512-1tLWfp+TDM5ZuVWht3jmaY5y7O6aZmpeXLoHl5bv1QtRsRKt4xYGRMmdJa5Pqx/FTkgRbsna9R+Gn2xE+evVuA==", + "version": "6.3.10", + "resolved": "https://registry.npmjs.org/vscode-css-languageservice/-/vscode-css-languageservice-6.3.10.tgz", + "integrity": "sha512-eq5N9Er3fC4vA9zd9EFhyBG90wtCCuXgRSpAndaOgXMh1Wgep5lBgRIeDgjZBW9pa+332yC9+49cZMW8jcL3MA==", "license": "MIT", "dependencies": { "@vscode/l10n": "^0.0.18", @@ -24829,9 +24834,9 @@ } }, "node_modules/vscode-html-languageservice": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/vscode-html-languageservice/-/vscode-html-languageservice-5.6.1.tgz", - "integrity": "sha512-5Mrqy5CLfFZUgkyhNZLA1Ye5g12Cb/v6VM7SxUzZUaRKWMDz4md+y26PrfRTSU0/eQAl3XpO9m2og+GGtDMuaA==", + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/vscode-html-languageservice/-/vscode-html-languageservice-5.6.2.tgz", + "integrity": "sha512-ulCrSnFnfQ16YzvwnYUgEbUEl/ZG7u2eV27YhvLObSHKkb8fw1Z9cgsnUwjTEeDIdJDoTDTDpxuhQwoenoLNMg==", "license": "MIT", "dependencies": { "@vscode/l10n": "^0.0.18", @@ -25325,9 +25330,9 @@ "license": "ISC" }, "node_modules/yaml": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.2.tgz", - "integrity": "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==", + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.3.tgz", + "integrity": "sha512-AvbaCLOO2Otw/lW5bmh9d/WEdcDFdQp2Z2ZUH3pX9U2ihyUY0nvLv7J6TrWowklRGPYbB/IuIMfYgxaCPg5Bpg==", "license": "ISC", "bin": { "yaml": "bin.mjs" @@ -25340,15 +25345,14 @@ } }, "node_modules/yaml-language-server": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/yaml-language-server/-/yaml-language-server-1.19.2.tgz", - "integrity": "sha512-9F3myNmJzUN/679jycdMxqtydPSDRAarSj3wPiF7pchEPnO9Dg07Oc+gIYLqXR4L+g+FSEVXXv2+mr54StLFOg==", + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/yaml-language-server/-/yaml-language-server-1.20.0.tgz", + "integrity": "sha512-qhjK/bzSRZ6HtTvgeFvjNPJGWdZ0+x5NREV/9XZWFjIGezew2b4r5JPy66IfOhd5OA7KeFwk1JfmEbnTvev0cA==", "license": "MIT", "dependencies": { "@vscode/l10n": "^0.0.18", "ajv": "^8.17.1", "ajv-draft-04": "^1.0.0", - "lodash": "4.17.21", "prettier": "^3.5.0", "request-light": "^0.5.7", "vscode-json-languageservice": "4.1.8", @@ -25362,12 +25366,6 @@ "yaml-language-server": "bin/yaml-language-server" } }, - "node_modules/yaml-language-server/node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "license": "MIT" - }, "node_modules/yaml-language-server/node_modules/request-light": { "version": "0.5.8", "resolved": "https://registry.npmjs.org/request-light/-/request-light-0.5.8.tgz", diff --git a/src/eventcatalog/package.json b/src/eventcatalog/package.json index 8bc324488..62a747209 100644 --- a/src/eventcatalog/package.json +++ b/src/eventcatalog/package.json @@ -1,6 +1,6 @@ { "dependencies": { - "@eventcatalog/core": "2.64.3" + "@eventcatalog/core": "^2.64.3" }, "devDependencies": { "http-server": "^14.1.1" diff --git a/tests/playwright/digital-letters-component-tests/report-generator.component.spec.ts b/tests/playwright/digital-letters-component-tests/report-generator.component.spec.ts index c89ecae5f..c29dc9a0b 100644 --- a/tests/playwright/digital-letters-component-tests/report-generator.component.spec.ts +++ b/tests/playwright/digital-letters-component-tests/report-generator.component.spec.ts @@ -43,6 +43,42 @@ const scenarios = [ 'Read', senderId, ), + new ReportScenario( + 'component-test-pdm-resource-submission-rejected', + CommunicationType.Digital, + [EventStatus.DigitalPDMResourceSubmissionRejected], + 'Failed', + senderId, + 'DL_PDMV_001', + 'Letter rejected by PDM', + ), + new ReportScenario( + 'component-test-pdm-resource-retries-exceeded', + CommunicationType.Digital, + [EventStatus.DigitalPDMResourceRetriesExceeded], + 'Failed', + senderId, + 'DL_PDMV_002', + 'Timeout waiting for letter storage', + ), + new ReportScenario( + 'component-test-message-request-rejected', + CommunicationType.Digital, + [EventStatus.DigitalMessageRequestRejected], + 'Failed', + senderId, + 'DL_INTE_001', + 'Request validation failed', + ), + new ReportScenario( + 'component-test-digital-failed-priority', + CommunicationType.Digital, + [EventStatus.Unread, EventStatus.DigitalPDMResourceSubmissionRejected], + 'Failed', + senderId, + 'DL_PDMV_001', + 'Letter rejected by PDM', + ), // Scenarios for communication type Print where there is a single event per message reference. new ReportScenario( 'component-test-rejected', @@ -50,6 +86,8 @@ const scenarios = [ [EventStatus.Rejected], 'Rejected', senderId, + 'API_CODE_001', + 'The letter was rejected.', ), new ReportScenario( 'component-test-failed', @@ -57,6 +95,8 @@ const scenarios = [ [EventStatus.Failed], 'Failed', senderId, + 'API_CODE_002', + 'Letter processing failed', ), new ReportScenario( 'component-test-returned', @@ -64,6 +104,8 @@ const scenarios = [ [EventStatus.Returned], 'Returned', senderId, + 'API_CODE_003', + 'The letter was returned', ), new ReportScenario( 'component-test-dispatched', @@ -72,6 +114,16 @@ const scenarios = [ 'Dispatched', senderId, ), + // Scenario for new Print failure event: FileQuarantined + new ReportScenario( + 'component-test-file-quarantined', + CommunicationType.Print, + [EventStatus.PrintFileQuarantined], + 'Failed', + senderId, + 'DL_CLIV_003', + 'Attachment contains a virus', + ), // multiple events for the same message reference, should take the one with highest priority status (returned > failed > dispatched > rejected) new ReportScenario( 'component-test-rejected-pending', @@ -79,6 +131,8 @@ const scenarios = [ [EventStatus.Rejected, EventStatus.Pending], 'Rejected', senderId, + 'API_CODE_001', + 'The letter was rejected.', ), // pending is ignored. new ReportScenario( 'component-test-rejected-dispatched', @@ -93,6 +147,8 @@ const scenarios = [ [EventStatus.Rejected, EventStatus.Dispatched, EventStatus.Failed], 'Failed', senderId, + 'API_CODE_002', + 'Letter processing failed', ), new ReportScenario( 'component-test-rejected-dispatched-failed-returned', @@ -105,6 +161,8 @@ const scenarios = [ ], 'Returned', senderId, + 'API_CODE_003', + 'The letter was returned', ), ]; @@ -138,8 +196,9 @@ test.describe('Digital Letters - Report Generator', () => { console.log(`Using senderId: ${senderId}`); for (const scenario of scenarios) publishEventForScenario(scenario); - // At this stage we published all the events used for test data. + // Publish an event that should not appear in the report await publishEventNotInReports(senderId); + // At this stage we published all the events used for test data. // Asserts step 1.2 await prerequisiteAssertFirehoseEventsInS3(senderId); // Asserts step 2.1 diff --git a/tests/playwright/helpers/event-builders.ts b/tests/playwright/helpers/event-builders.ts index 50f29e30c..6383a37fe 100644 --- a/tests/playwright/helpers/event-builders.ts +++ b/tests/playwright/helpers/event-builders.ts @@ -1,6 +1,10 @@ import { DigitalLetterRead, + FileQuarantined, ItemDequeued, + MessageRequestRejected, + PDMResourceRetriesExceeded, + PDMResourceSubmissionRejected, PrintLetterTransitioned, } from 'digital-letters-events'; @@ -66,6 +70,8 @@ export function buildPrintLetterTransitionedEvent( messageReference: string, status: string, senderId: string, + reasonCode: string, + reasonText: string, ): PrintLetterTransitioned { const baseEvent = buildBaseEvent('print', time); return { @@ -80,6 +86,99 @@ export function buildPrintLetterTransitionedEvent( status, supplierId: 'supplier-1', time, + reasonCode, + reasonText, }, } as PrintLetterTransitioned; } + +export function buildPDMResourceSubmissionRejectedEvent( + eventId: string, + time: string, + messageReference: string, + senderId: string, +): PDMResourceSubmissionRejected { + const baseEvent = buildBaseEvent('pdm', time); + return { + ...baseEvent, + id: eventId, + type: 'uk.nhs.notify.digital.letters.pdm.resource.submission.rejected.v1', + dataschema: + 'https://notify.nhs.uk/cloudevents/schemas/digital-letters/2025-10-draft/data/digital-letters-pdm-resource-submission-rejected-data.schema.json', + data: { + messageReference, + senderId, + reasonCode: 'DL_PDMV_001', + }, + } as PDMResourceSubmissionRejected; +} + +export function buildPDMResourceRetriesExceededEvent( + eventId: string, + time: string, + messageReference: string, + senderId: string, +): PDMResourceRetriesExceeded { + const baseEvent = buildBaseEvent('pdm', time); + return { + ...baseEvent, + id: eventId, + type: 'uk.nhs.notify.digital.letters.pdm.resource.retries.exceeded.v1', + dataschema: + 'https://notify.nhs.uk/cloudevents/schemas/digital-letters/2025-10-draft/data/digital-letters-pdm-resource-retries-exceeded-data.schema.json', + data: { + messageReference, + senderId, + resourceId: `resource-${eventId}`, + retryCount: 5, + reasonCode: 'DL_PDMV_002', + }, + } as PDMResourceRetriesExceeded; +} + +export function buildMessageRequestRejectedEvent( + eventId: string, + time: string, + messageReference: string, + senderId: string, +): MessageRequestRejected { + const baseEvent = buildBaseEvent('messages', time); + return { + ...baseEvent, + id: eventId, + type: 'uk.nhs.notify.digital.letters.messages.request.rejected.v1', + dataschema: + 'https://notify.nhs.uk/cloudevents/schemas/digital-letters/2025-10-draft/data/digital-letters-message-request-rejected-data.schema.json', + data: { + messageReference, + senderId, + messageUri: `https://example.com/messages/${eventId}`, + failureCode: 'VALIDATION_ERROR', + reasonCode: 'DL_INTE_001', + reasonText: 'Request validation failed', + }, + } as MessageRequestRejected; +} + +export function buildFileQuarantinedEvent( + eventId: string, + time: string, + messageReference: string, + senderId: string, +): FileQuarantined { + const baseEvent = buildBaseEvent('print', time); + return { + ...baseEvent, + id: eventId, + type: 'uk.nhs.notify.digital.letters.print.file.quarantined.v1', + dataschema: + 'https://notify.nhs.uk/cloudevents/schemas/digital-letters/2025-10-draft/data/digital-letters-print-file-quarantined-data.schema.json', + data: { + messageReference, + senderId, + letterUri: `s3://bucket/letters/${eventId}.pdf`, + createdAt: time, + reasonCode: 'DL_CLIV_003', + }, + } as FileQuarantined; +} diff --git a/tests/playwright/helpers/report-helpers.ts b/tests/playwright/helpers/report-helpers.ts index f1a9f17c8..5b5fa25c9 100644 --- a/tests/playwright/helpers/report-helpers.ts +++ b/tests/playwright/helpers/report-helpers.ts @@ -11,16 +11,24 @@ import { v4 as uuidv4 } from 'uuid'; import { DigitalLetterRead, + FileQuarantined, GenerateReport, ItemDequeued, - MESHInboxMessageDownloaded, + MessageRequestRejected, + MessageRequestSkipped, + PDMResourceRetriesExceeded, + PDMResourceSubmissionRejected, PrintLetterTransitioned, } from 'digital-letters-events'; import generateReportValidator from 'digital-letters-events/GenerateReport.js'; import digitalLetterReadValidator from 'digital-letters-events/DigitalLetterRead.js'; -import messageDownloadedValidator from 'digital-letters-events/MESHInboxMessageDownloaded.js'; import itemDequeuedValidator from 'digital-letters-events/ItemDequeued.js'; +import messageRequestSkippedValidator from 'digital-letters-events/MessageRequestSkipped.js'; import printLetterTransitionedValidator from 'digital-letters-events/PrintLetterTransitioned.js'; +import pdmResourceSubmissionRejectedValidator from 'digital-letters-events/PDMResourceSubmissionRejected.js'; +import pdmResourceRetriesExceededValidator from 'digital-letters-events/PDMResourceRetriesExceeded.js'; +import messageRequestRejectedValidator from 'digital-letters-events/MessageRequestRejected.js'; +import fileQuarantinedValidator from 'digital-letters-events/FileQuarantined.js'; import { QueryExecutionState, getQueryState, @@ -31,7 +39,11 @@ import eventPublisher from 'helpers/event-bus-helpers'; import expectToPassEventually from 'helpers/expectations'; import { buildDigitalLetterReadEvent, + buildFileQuarantinedEvent, buildItemDequeuedEvent, + buildMessageRequestRejectedEvent, + buildPDMResourceRetriesExceededEvent, + buildPDMResourceSubmissionRejectedEvent, buildPrintLetterTransitionedEvent, } from 'helpers/event-builders'; import { existsInS3 } from 'helpers/s3-helpers'; @@ -51,6 +63,10 @@ export enum EventStatus { Failed = 'FAILED', Returned = 'RETURNED', Pending = 'PENDING', + DigitalPDMResourceSubmissionRejected = 'PDMResourceSubmissionRejected', + DigitalPDMResourceRetriesExceeded = 'PDMResourceRetriesExceeded', + DigitalMessageRequestRejected = 'MessageRequestRejected', + PrintFileQuarantined = 'FileQuarantined', } /** * Utility class to proof the SQL logic to determine which status should be reported for a given message reference, @@ -67,6 +83,10 @@ export class ReportScenario { readonly senderId: string; + readonly expectedReasonCode: string; + + readonly expectedReason: string; + time: string; constructor( @@ -75,12 +95,16 @@ export class ReportScenario { eventStatuses: EventStatus[], expectedStatus: string, senderId: string, + expectedReasonCode = '', + expectedReason = '', ) { this.messageReference = messageReference; this.communicationType = communicationType; this.eventStatuses = eventStatuses; this.expectedStatus = expectedStatus; this.senderId = senderId; + this.expectedReasonCode = expectedReasonCode; + this.expectedReason = expectedReason; this.time = ''; // Set when publishing the event to EventBridge, otherwise all the events would have the same timestamp. } @@ -90,6 +114,8 @@ export class ReportScenario { Time: this.time, 'Communication Type': this.communicationType, Status: this.expectedStatus, + 'Reason Code': this.expectedReasonCode, + Reason: this.expectedReason, }; } @@ -105,48 +131,112 @@ export function publishEventForScenario(scenario: ReportScenario) { for (const status of scenario.eventStatuses) { switch (scenario.communicationType) { case CommunicationType.Digital: { - if (EventStatus.Read === status) { - eventPublisher.sendEvents( + switch (status) { + case EventStatus.Read: { + eventPublisher.sendEvents( + [ + buildDigitalLetterReadEvent( + uuidv4(), + scenario.time, + scenario.messageReference, + scenario.senderId, + ), + ], + digitalLetterReadValidator, + ); + break; + } + case EventStatus.Unread: { + eventPublisher.sendEvents( + [ + buildItemDequeuedEvent( + uuidv4(), + scenario.time, + scenario.messageReference, + scenario.senderId, + ), + ], + itemDequeuedValidator, + ); + break; + } + case EventStatus.DigitalPDMResourceSubmissionRejected: { + eventPublisher.sendEvents( + [ + buildPDMResourceSubmissionRejectedEvent( + uuidv4(), + scenario.time, + scenario.messageReference, + scenario.senderId, + ), + ], + pdmResourceSubmissionRejectedValidator, + ); + break; + } + case EventStatus.DigitalPDMResourceRetriesExceeded: { + eventPublisher.sendEvents( + [ + buildPDMResourceRetriesExceededEvent( + uuidv4(), + scenario.time, + scenario.messageReference, + scenario.senderId, + ), + ], + pdmResourceRetriesExceededValidator, + ); + break; + } + case EventStatus.DigitalMessageRequestRejected: { + eventPublisher.sendEvents( + [ + buildMessageRequestRejectedEvent( + uuidv4(), + scenario.time, + scenario.messageReference, + scenario.senderId, + ), + ], + messageRequestRejectedValidator, + ); + break; + } + default: + } + break; + } + case CommunicationType.Print: { + if (EventStatus.PrintFileQuarantined === status) { + eventPublisher.sendEvents( [ - buildDigitalLetterReadEvent( + buildFileQuarantinedEvent( uuidv4(), scenario.time, scenario.messageReference, scenario.senderId, ), ], - digitalLetterReadValidator, + fileQuarantinedValidator, ); - } else if (EventStatus.Unread === status) { - eventPublisher.sendEvents( + } else { + eventPublisher.sendEvents( [ - buildItemDequeuedEvent( + buildPrintLetterTransitionedEvent( uuidv4(), scenario.time, scenario.messageReference, + status, scenario.senderId, + scenario.expectedReasonCode, + scenario.expectedReason, ), ], - itemDequeuedValidator, + printLetterTransitionedValidator, ); } break; } - case CommunicationType.Print: { - eventPublisher.sendEvents( - [ - buildPrintLetterTransitionedEvent( - uuidv4(), - scenario.time, - scenario.messageReference, - status, - scenario.senderId, - ), - ], - printLetterTransitionedValidator, - ); - break; - } default: { throw new Error( `Unknown communication type: ${scenario.communicationType}`, @@ -194,35 +284,33 @@ export async function publishGenerateReport( * Publishes an event which should not be included in the report, to prove that only the expected events are included in the report. */ export async function publishEventNotInReports(senderId: string) { - const downloadedEventId = uuidv4(); - const downloadedEventTime = new Date().toISOString(); - await eventPublisher.sendEvents( + const skippedEventId = uuidv4(); + const skippedEventTime = new Date().toISOString(); + await eventPublisher.sendEvents( [ { - id: downloadedEventId, + id: skippedEventId, specversion: '1.0', source: - '/nhs/england/notify/production/primary/data-plane/digitalletters/mesh', + '/nhs/england/notify/production/primary/data-plane/digitalletters/messages', 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: downloadedEventTime, - recordedtime: downloadedEventTime, + type: 'uk.nhs.notify.digital.letters.messages.request.skipped.v1', + time: skippedEventTime, + recordedtime: skippedEventTime, severitynumber: 2, traceparent: '00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01', datacontenttype: 'application/json', dataschema: - 'https://notify.nhs.uk/cloudevents/schemas/digital-letters/2025-10-draft/data/digital-letters-mesh-inbox-message-downloaded-data.schema.json', + 'https://notify.nhs.uk/cloudevents/schemas/digital-letters/2025-10-draft/data/digital-letters-message-request-skipped-data.schema.json', severitytext: 'INFO', data: { - meshMessageId: '12345', - messageUri: `https://example.com/ttl/resource/${downloadedEventId}`, - messageReference: 'component-test-messageDownloaded', + messageReference: 'component-test-messageSkipped', senderId, }, }, ], - messageDownloadedValidator, + messageRequestSkippedValidator, ); }