From 8a0c31a8e971b1d36bf135e71052722e2d10cbe4 Mon Sep 17 00:00:00 2001 From: David Wass Date: Thu, 18 Dec 2025 11:12:57 +0000 Subject: [PATCH 01/20] letter data - auto fix --- .../utilities/letter-test-data/jest.config.ts | 34 +++++----- .../helpers/create_letter_helpers.test.ts | 5 +- .../letter-test-data/src/cli/index.ts | 64 +++++++++++-------- .../src/helpers/create_letter_helpers.ts | 2 +- .../src/helpers/s3_helpers.ts | 18 ++++-- .../src/infrastructure/letter-repo-factory.ts | 13 ++-- 6 files changed, 77 insertions(+), 59 deletions(-) diff --git a/scripts/utilities/letter-test-data/jest.config.ts b/scripts/utilities/letter-test-data/jest.config.ts index cc9a39c9..445325b8 100644 --- a/scripts/utilities/letter-test-data/jest.config.ts +++ b/scripts/utilities/letter-test-data/jest.config.ts @@ -1,7 +1,7 @@ -import type { Config } from 'jest'; +import type { Config } from "jest"; export const baseJestConfig: Config = { - preset: 'ts-jest', + preset: "ts-jest", // Automatically clear mock calls, instances, contexts and results before every test clearMocks: true, @@ -10,10 +10,10 @@ export const baseJestConfig: Config = { collectCoverage: true, // The directory where Jest should output its coverage files - coverageDirectory: './.reports/unit/coverage', + coverageDirectory: "./.reports/unit/coverage", // Indicates which provider should be used to instrument code for coverage - coverageProvider: 'babel', + coverageProvider: "babel", coverageThreshold: { global: { @@ -24,38 +24,38 @@ export const baseJestConfig: Config = { }, }, - coveragePathIgnorePatterns: ['/__tests__/'], - transform: { '^.+\\.ts$': 'ts-jest' }, - testPathIgnorePatterns: ['.build'], - testMatch: ['**/?(*.)+(spec|test).[jt]s?(x)'], + coveragePathIgnorePatterns: ["/__tests__/"], + transform: { "^.+\\.ts$": "ts-jest" }, + testPathIgnorePatterns: [".build"], + testMatch: ["**/?(*.)+(spec|test).[jt]s?(x)"], // Use this configuration option to add custom reporters to Jest reporters: [ - 'default', + "default", [ - 'jest-html-reporter', + "jest-html-reporter", { - pageTitle: 'Test Report', - outputPath: './.reports/unit/test-report.html', + pageTitle: "Test Report", + outputPath: "./.reports/unit/test-report.html", includeFailureMsg: true, }, ], ], // The test environment that will be used for testing - testEnvironment: 'jsdom', + testEnvironment: "jsdom", }; const utilsJestConfig = { ...baseJestConfig, - testEnvironment: 'node', + testEnvironment: "node", coveragePathIgnorePatterns: [ ...(baseJestConfig.coveragePathIgnorePatterns ?? []), - 'cli/index.ts', - 'helpers/s3_helpers.ts', - 'letter-repo-factory.ts', + "cli/index.ts", + "helpers/s3_helpers.ts", + "letter-repo-factory.ts", ], }; diff --git a/scripts/utilities/letter-test-data/src/__test__/helpers/create_letter_helpers.test.ts b/scripts/utilities/letter-test-data/src/__test__/helpers/create_letter_helpers.test.ts index a8b2a0db..bc3c4b73 100644 --- a/scripts/utilities/letter-test-data/src/__test__/helpers/create_letter_helpers.test.ts +++ b/scripts/utilities/letter-test-data/src/__test__/helpers/create_letter_helpers.test.ts @@ -1,6 +1,9 @@ import { LetterRepository } from "@internal/datastore/src/letter-repository"; import { LetterStatusType } from "@internal/datastore"; -import { createLetter, createLetterDto } from "../../helpers/create_letter_helpers"; +import { + createLetter, + createLetterDto, +} from "../../helpers/create_letter_helpers"; import { uploadFile } from "../../helpers/s3_helpers"; jest.mock("../../helpers/s3_helpers"); diff --git a/scripts/utilities/letter-test-data/src/cli/index.ts b/scripts/utilities/letter-test-data/src/cli/index.ts index 915c392b..fba64289 100644 --- a/scripts/utilities/letter-test-data/src/cli/index.ts +++ b/scripts/utilities/letter-test-data/src/cli/index.ts @@ -1,8 +1,11 @@ import { hideBin } from "yargs/helpers"; -import yargs from 'yargs'; +import yargs from "yargs"; import { LetterStatusType } from "@internal/datastore/src/types"; -import { randomUUID } from "crypto"; -import { createLetter, createLetterDto } from "../helpers/create_letter_helpers"; +import { randomUUID } from "node:crypto"; +import { + createLetter, + createLetterDto, +} from "../helpers/create_letter_helpers"; import { createLetterRepository } from "../infrastructure/letter-repo-factory"; import { uploadFile } from "../helpers/s3_helpers"; @@ -60,7 +63,7 @@ async function main() { }, }, async (argv) => { - const supplierId = argv.supplierId; + const { supplierId } = argv; const letterId = argv.letterId ? argv.letterId : randomUUID(); const bucketName = `nhs-${argv.awsAccountId}-eu-west-2-${argv.environment}-supapi-test-letters`; const targetFilename = `${letterId}.pdf`; @@ -68,9 +71,9 @@ async function main() { const specificationId = argv.specificationId ? argv.specificationId : randomUUID(); - const status = argv.status; - const environment = argv.environment; - const ttlHours = argv.ttlHours; + const { status } = argv; + const { environment } = argv; + const { ttlHours } = argv; const letterRepository = createLetterRepository(environment, ttlHours); createLetter({ @@ -114,7 +117,7 @@ async function main() { demandOption: false, default: 336, }, - "count": { + count: { type: "number", demandOption: true, }, @@ -137,41 +140,46 @@ async function main() { }, }, async (argv) => { - // set batch ID const batchId = randomUUID(); // parse args - const supplierId = argv.supplierId; + const { supplierId } = argv; const groupId = argv.groupId ? argv.groupId : randomUUID(); const specificationId = argv.specificationId ? argv.specificationId : randomUUID(); - const status = argv.status; - const environment = argv.environment; - const ttlHours = argv.ttlHours; + const { status } = argv; + const { environment } = argv; + const { ttlHours } = argv; const letterRepository = createLetterRepository(environment, ttlHours); - const count = argv.count; - + const { count } = argv; // Upload a test file for this batch const bucketName = `nhs-${argv.awsAccountId}-eu-west-2-${argv.environment}-supapi-test-letters`; const targetFilename = `${batchId}-${status}.pdf`; const url = `s3://${bucketName}/${batchId}/${targetFilename}`; - await uploadFile(bucketName, batchId, "../../test_letter.pdf", targetFilename); + await uploadFile( + bucketName, + batchId, + "../../test_letter.pdf", + targetFilename, + ); // Create letter DTOs - let letterDtos = []; + const letterDtos = []; for (let i = 0; i < count; i++) { - letterDtos.push(createLetterDto({ - letterId: randomUUID(), - supplierId, - groupId, - specificationId, - status: status as LetterStatusType, - url, - })); - }; + letterDtos.push( + createLetterDto({ + letterId: randomUUID(), + supplierId, + groupId, + specificationId, + status: status as LetterStatusType, + url, + }), + ); + } // Upload Letters await letterRepository.putLetterBatch(letterDtos); @@ -184,8 +192,8 @@ async function main() { } if (require.main === module) { - main().catch((err) => { - console.error(err); + main().catch((error) => { + console.error(error); process.exitCode = 1; }); } diff --git a/scripts/utilities/letter-test-data/src/helpers/create_letter_helpers.ts b/scripts/utilities/letter-test-data/src/helpers/create_letter_helpers.ts index 691171c0..c6137db7 100644 --- a/scripts/utilities/letter-test-data/src/helpers/create_letter_helpers.ts +++ b/scripts/utilities/letter-test-data/src/helpers/create_letter_helpers.ts @@ -1,6 +1,6 @@ import { - LetterRepository, Letter, + LetterRepository, LetterStatusType, } from "@internal/datastore"; import { uploadFile } from "./s3_helpers"; diff --git a/scripts/utilities/letter-test-data/src/helpers/s3_helpers.ts b/scripts/utilities/letter-test-data/src/helpers/s3_helpers.ts index 89ef72a4..0e5dde77 100644 --- a/scripts/utilities/letter-test-data/src/helpers/s3_helpers.ts +++ b/scripts/utilities/letter-test-data/src/helpers/s3_helpers.ts @@ -1,9 +1,13 @@ -import { S3Client, PutObjectCommand } from "@aws-sdk/client-s3"; -import { readFileSync } from "fs"; -import path from "path"; +import { PutObjectCommand, S3Client } from "@aws-sdk/client-s3"; +import { readFileSync } from "node:fs"; +import path from "node:path"; - -export async function uploadFile(bucketName: string, supplierId: string, sourceFilename: string, targetFilename: string) { +export async function uploadFile( + bucketName: string, + supplierId: string, + sourceFilename: string, + targetFilename: string, +) { try { const s3 = new S3Client(); const filePath = path.join(__dirname, sourceFilename); @@ -18,7 +22,7 @@ export async function uploadFile(bucketName: string, supplierId: string, sourceF const command = new PutObjectCommand(uploadParams); return await s3.send(command); - } catch (err) { - console.error("Error uploading file:", err); + } catch (error) { + console.error("Error uploading file:", error); } } diff --git a/scripts/utilities/letter-test-data/src/infrastructure/letter-repo-factory.ts b/scripts/utilities/letter-test-data/src/infrastructure/letter-repo-factory.ts index e0060337..f2bef4a4 100644 --- a/scripts/utilities/letter-test-data/src/infrastructure/letter-repo-factory.ts +++ b/scripts/utilities/letter-test-data/src/infrastructure/letter-repo-factory.ts @@ -1,9 +1,12 @@ -import { DynamoDBClient } from '@aws-sdk/client-dynamodb'; -import { DynamoDBDocumentClient } from '@aws-sdk/lib-dynamodb'; -import { pino } from 'pino'; -import { LetterRepository } from '@internal/datastore'; +import { DynamoDBClient } from "@aws-sdk/client-dynamodb"; +import { DynamoDBDocumentClient } from "@aws-sdk/lib-dynamodb"; +import { pino } from "pino"; +import { LetterRepository } from "@internal/datastore"; -export function createLetterRepository(environment: string, ttlHours:number): LetterRepository { +export function createLetterRepository( + environment: string, + ttlHours: number, +): LetterRepository { const ddbClient = new DynamoDBClient({}); const docClient = DynamoDBDocumentClient.from(ddbClient); const log = pino(); From 983666858436885087fd29df7cc77a56ea194fe4 Mon Sep 17 00:00:00 2001 From: David Wass Date: Thu, 18 Dec 2025 11:40:12 +0000 Subject: [PATCH 02/20] letter test data manual fixes --- package-lock.json | 960 ++++++++++++++---- .../utilities/letter-test-data/package.json | 4 +- ....test.ts => create-letter-helpers.test.ts} | 4 +- .../letter-test-data/src/cli/index.ts | 18 +- ...er_helpers.ts => create-letter-helpers.ts} | 2 +- .../helpers/{s3_helpers.ts => s3-helpers.ts} | 3 +- .../src/infrastructure/letter-repo-factory.ts | 2 +- 7 files changed, 804 insertions(+), 189 deletions(-) rename scripts/utilities/letter-test-data/src/__test__/helpers/{create_letter_helpers.test.ts => create-letter-helpers.test.ts} (95%) rename scripts/utilities/letter-test-data/src/helpers/{create_letter_helpers.ts => create-letter-helpers.ts} (97%) rename scripts/utilities/letter-test-data/src/helpers/{s3_helpers.ts => s3-helpers.ts} (92%) diff --git a/package-lock.json b/package-lock.json index 7a29e4d7..b4a0c05e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6525,12 +6525,12 @@ } }, "node_modules/@smithy/abort-controller": { - "version": "4.2.7", - "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.2.7.tgz", - "integrity": "sha512-rzMY6CaKx2qxrbYbqjXWS0plqEy7LOdKHS0bg4ixJ6aoGDPNUcLWk/FRNuCILh7GKLG9TFUXYYeQQldMBBwuyw==", + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.2.6.tgz", + "integrity": "sha512-P7JD4J+wxHMpGxqIg6SHno2tPkZbBUBLbPpR5/T1DEUvw/mEaINBMaPFZNM7lA+ToSCZ36j6nMHa+5kej+fhGg==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.11.0", + "@smithy/types": "^4.10.0", "tslib": "^2.6.2" }, "engines": { @@ -6563,16 +6563,16 @@ } }, "node_modules/@smithy/config-resolver": { - "version": "4.4.5", - "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.4.5.tgz", - "integrity": "sha512-HAGoUAFYsUkoSckuKbCPayECeMim8pOu+yLy1zOxt1sifzEbrsRpYa+mKcMdiHKMeiqOibyPG0sFJnmaV/OGEg==", + "version": "4.4.4", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.4.4.tgz", + "integrity": "sha512-s3U5ChS21DwU54kMmZ0UJumoS5cg0+rGVZvN6f5Lp6EbAVi0ZyP+qDSHdewfmXKUgNK1j3z45JyzulkDukrjAA==", "license": "Apache-2.0", "dependencies": { - "@smithy/node-config-provider": "^4.3.7", - "@smithy/types": "^4.11.0", + "@smithy/node-config-provider": "^4.3.6", + "@smithy/types": "^4.10.0", "@smithy/util-config-provider": "^4.2.0", - "@smithy/util-endpoints": "^3.2.7", - "@smithy/util-middleware": "^4.2.7", + "@smithy/util-endpoints": "^3.2.6", + "@smithy/util-middleware": "^4.2.6", "tslib": "^2.6.2" }, "engines": { @@ -6580,18 +6580,18 @@ } }, "node_modules/@smithy/core": { - "version": "3.20.0", - "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.20.0.tgz", - "integrity": "sha512-WsSHCPq/neD5G/MkK4csLI5Y5Pkd9c1NMfpYEKeghSGaD4Ja1qLIohRQf2D5c1Uy5aXp76DeKHkzWZ9KAlHroQ==", + "version": "3.19.0", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.19.0.tgz", + "integrity": "sha512-Y9oHXpBcXQgYHOcAEmxjkDilUbSTkgKjoHYed3WaYUH8jngq8lPWDBSpjHblJ9uOgBdy5mh3pzebrScDdYr29w==", "license": "Apache-2.0", "dependencies": { - "@smithy/middleware-serde": "^4.2.8", - "@smithy/protocol-http": "^5.3.7", - "@smithy/types": "^4.11.0", + "@smithy/middleware-serde": "^4.2.7", + "@smithy/protocol-http": "^5.3.6", + "@smithy/types": "^4.10.0", "@smithy/util-base64": "^4.3.0", "@smithy/util-body-length-browser": "^4.2.0", - "@smithy/util-middleware": "^4.2.7", - "@smithy/util-stream": "^4.5.8", + "@smithy/util-middleware": "^4.2.6", + "@smithy/util-stream": "^4.5.7", "@smithy/util-utf8": "^4.2.0", "@smithy/uuid": "^1.1.0", "tslib": "^2.6.2" @@ -6601,15 +6601,15 @@ } }, "node_modules/@smithy/credential-provider-imds": { - "version": "4.2.7", - "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.2.7.tgz", - "integrity": "sha512-CmduWdCiILCRNbQWFR0OcZlUPVtyE49Sr8yYL0rZQ4D/wKxiNzBNS/YHemvnbkIWj623fplgkexUd/c9CAKdoA==", + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.2.6.tgz", + "integrity": "sha512-xBmawExyTzOjbhzkZwg+vVm/khg28kG+rj2sbGlULjFd1jI70sv/cbpaR0Ev4Yfd6CpDUDRMe64cTqR//wAOyA==", "license": "Apache-2.0", "dependencies": { - "@smithy/node-config-provider": "^4.3.7", - "@smithy/property-provider": "^4.2.7", - "@smithy/types": "^4.11.0", - "@smithy/url-parser": "^4.2.7", + "@smithy/node-config-provider": "^4.3.6", + "@smithy/property-provider": "^4.2.6", + "@smithy/types": "^4.10.0", + "@smithy/url-parser": "^4.2.6", "tslib": "^2.6.2" }, "engines": { @@ -6687,14 +6687,14 @@ } }, "node_modules/@smithy/fetch-http-handler": { - "version": "5.3.8", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.3.8.tgz", - "integrity": "sha512-h/Fi+o7mti4n8wx1SR6UHWLaakwHRx29sizvp8OOm7iqwKGFneT06GCSFhml6Bha5BT6ot5pj3CYZnCHhGC2Rg==", + "version": "5.3.7", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.3.7.tgz", + "integrity": "sha512-fcVap4QwqmzQwQK9QU3keeEpCzTjnP9NJ171vI7GnD7nbkAIcP9biZhDUx88uRH9BabSsQDS0unUps88uZvFIQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^5.3.7", - "@smithy/querystring-builder": "^4.2.7", - "@smithy/types": "^4.11.0", + "@smithy/protocol-http": "^5.3.6", + "@smithy/querystring-builder": "^4.2.6", + "@smithy/types": "^4.10.0", "@smithy/util-base64": "^4.3.0", "tslib": "^2.6.2" }, @@ -6718,12 +6718,12 @@ } }, "node_modules/@smithy/hash-node": { - "version": "4.2.7", - "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.2.7.tgz", - "integrity": "sha512-PU/JWLTBCV1c8FtB8tEFnY4eV1tSfBc7bDBADHfn1K+uRbPgSJ9jnJp0hyjiFN2PMdPzxsf1Fdu0eo9fJ760Xw==", + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.2.6.tgz", + "integrity": "sha512-k3Dy9VNR37wfMh2/1RHkFf/e0rMyN0pjY0FdyY6ItJRjENYyVPRMwad6ZR1S9HFm6tTuIOd9pqKBmtJ4VHxvxg==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.11.0", + "@smithy/types": "^4.10.0", "@smithy/util-buffer-from": "^4.2.0", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" @@ -6747,12 +6747,12 @@ } }, "node_modules/@smithy/invalid-dependency": { - "version": "4.2.7", - "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.2.7.tgz", - "integrity": "sha512-ncvgCr9a15nPlkhIUx3CU4d7E7WEuVJOV7fS7nnK2hLtPK9tYRBkMHQbhXU1VvvKeBm/O0x26OEoBq+ngFpOEQ==", + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.2.6.tgz", + "integrity": "sha512-E4t/V/q2T46RY21fpfznd1iSLTvCXKNKo4zJ1QuEFN4SE9gKfu2vb6bgq35LpufkQ+SETWIC7ZAf2GGvTlBaMQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.11.0", + "@smithy/types": "^4.10.0", "tslib": "^2.6.2" }, "engines": { @@ -6786,13 +6786,13 @@ } }, "node_modules/@smithy/middleware-content-length": { - "version": "4.2.7", - "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.2.7.tgz", - "integrity": "sha512-GszfBfCcvt7kIbJ41LuNa5f0wvQCHhnGx/aDaZJCCT05Ld6x6U2s0xsc/0mBFONBZjQJp2U/0uSJ178OXOwbhg==", + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.2.6.tgz", + "integrity": "sha512-0cjqjyfj+Gls30ntq45SsBtqF3dfJQCeqQPyGz58Pk8OgrAr5YiB7ZvDzjCA94p4r6DCI4qLm7FKobqBjf515w==", "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^5.3.7", - "@smithy/types": "^4.11.0", + "@smithy/protocol-http": "^5.3.6", + "@smithy/types": "^4.10.0", "tslib": "^2.6.2" }, "engines": { @@ -6800,18 +6800,18 @@ } }, "node_modules/@smithy/middleware-endpoint": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.4.1.tgz", - "integrity": "sha512-gpLspUAoe6f1M6H0u4cVuFzxZBrsGZmjx2O9SigurTx4PbntYa4AJ+o0G0oGm1L2oSX6oBhcGHwrfJHup2JnJg==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.4.0.tgz", + "integrity": "sha512-M6qWfUNny6NFNy8amrCGIb9TfOMUkHVtg9bHtEFGRgfH7A7AtPpn/fcrToGPjVDK1ECuMVvqGQOXcZxmu9K+7A==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.20.0", - "@smithy/middleware-serde": "^4.2.8", - "@smithy/node-config-provider": "^4.3.7", - "@smithy/shared-ini-file-loader": "^4.4.2", - "@smithy/types": "^4.11.0", - "@smithy/url-parser": "^4.2.7", - "@smithy/util-middleware": "^4.2.7", + "@smithy/core": "^3.19.0", + "@smithy/middleware-serde": "^4.2.7", + "@smithy/node-config-provider": "^4.3.6", + "@smithy/shared-ini-file-loader": "^4.4.1", + "@smithy/types": "^4.10.0", + "@smithy/url-parser": "^4.2.6", + "@smithy/util-middleware": "^4.2.6", "tslib": "^2.6.2" }, "engines": { @@ -6819,18 +6819,18 @@ } }, "node_modules/@smithy/middleware-retry": { - "version": "4.4.17", - "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.4.17.tgz", - "integrity": "sha512-MqbXK6Y9uq17h+4r0ogu/sBT6V/rdV+5NvYL7ZV444BKfQygYe8wAhDrVXagVebN6w2RE0Fm245l69mOsPGZzg==", + "version": "4.4.16", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.4.16.tgz", + "integrity": "sha512-XPpNhNRzm3vhYm7YCsyw3AtmWggJbg1wNGAoqb7NBYr5XA5isMRv14jgbYyUV6IvbTBFZQdf2QpeW43LrRdStQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/node-config-provider": "^4.3.7", - "@smithy/protocol-http": "^5.3.7", - "@smithy/service-error-classification": "^4.2.7", - "@smithy/smithy-client": "^4.10.2", - "@smithy/types": "^4.11.0", - "@smithy/util-middleware": "^4.2.7", - "@smithy/util-retry": "^4.2.7", + "@smithy/node-config-provider": "^4.3.6", + "@smithy/protocol-http": "^5.3.6", + "@smithy/service-error-classification": "^4.2.6", + "@smithy/smithy-client": "^4.10.1", + "@smithy/types": "^4.10.0", + "@smithy/util-middleware": "^4.2.6", + "@smithy/util-retry": "^4.2.6", "@smithy/uuid": "^1.1.0", "tslib": "^2.6.2" }, @@ -6839,13 +6839,13 @@ } }, "node_modules/@smithy/middleware-serde": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.2.8.tgz", - "integrity": "sha512-8rDGYen5m5+NV9eHv9ry0sqm2gI6W7mc1VSFMtn6Igo25S507/HaOX9LTHAS2/J32VXD0xSzrY0H5FJtOMS4/w==", + "version": "4.2.7", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.2.7.tgz", + "integrity": "sha512-PFMVHVPgtFECeu4iZ+4SX6VOQT0+dIpm4jSPLLL6JLSkp9RohGqKBKD0cbiXdeIFS08Forp0UHI6kc0gIHenSA==", "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^5.3.7", - "@smithy/types": "^4.11.0", + "@smithy/protocol-http": "^5.3.6", + "@smithy/types": "^4.10.0", "tslib": "^2.6.2" }, "engines": { @@ -6853,12 +6853,12 @@ } }, "node_modules/@smithy/middleware-stack": { - "version": "4.2.7", - "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.2.7.tgz", - "integrity": "sha512-bsOT0rJ+HHlZd9crHoS37mt8qRRN/h9jRve1SXUhVbkRzu0QaNYZp1i1jha4n098tsvROjcwfLlfvcFuJSXEsw==", + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.2.6.tgz", + "integrity": "sha512-JSbALU3G+JS4kyBZPqnJ3hxIYwOVRV7r9GNQMS6j5VsQDo5+Es5nddLfr9TQlxZLNHPvKSh+XSB0OuWGfSWFcA==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.11.0", + "@smithy/types": "^4.10.0", "tslib": "^2.6.2" }, "engines": { @@ -6866,14 +6866,14 @@ } }, "node_modules/@smithy/node-config-provider": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.3.7.tgz", - "integrity": "sha512-7r58wq8sdOcrwWe+klL9y3bc4GW1gnlfnFOuL7CXa7UzfhzhxKuzNdtqgzmTV+53lEp9NXh5hY/S4UgjLOzPfw==", + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.3.6.tgz", + "integrity": "sha512-fYEyL59Qe82Ha1p97YQTMEQPJYmBS+ux76foqluaTVWoG9Px5J53w6NvXZNE3wP7lIicLDF7Vj1Em18XTX7fsA==", "license": "Apache-2.0", "dependencies": { - "@smithy/property-provider": "^4.2.7", - "@smithy/shared-ini-file-loader": "^4.4.2", - "@smithy/types": "^4.11.0", + "@smithy/property-provider": "^4.2.6", + "@smithy/shared-ini-file-loader": "^4.4.1", + "@smithy/types": "^4.10.0", "tslib": "^2.6.2" }, "engines": { @@ -6881,15 +6881,15 @@ } }, "node_modules/@smithy/node-http-handler": { - "version": "4.4.7", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.4.7.tgz", - "integrity": "sha512-NELpdmBOO6EpZtWgQiHjoShs1kmweaiNuETUpuup+cmm/xJYjT4eUjfhrXRP4jCOaAsS3c3yPsP3B+K+/fyPCQ==", + "version": "4.4.6", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.4.6.tgz", + "integrity": "sha512-Gsb9jf4ido5BhPfani4ggyrKDd3ZK+vTFWmUaZeFg5G3E5nhFmqiTzAIbHqmPs1sARuJawDiGMGR/nY+Gw6+aQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/abort-controller": "^4.2.7", - "@smithy/protocol-http": "^5.3.7", - "@smithy/querystring-builder": "^4.2.7", - "@smithy/types": "^4.11.0", + "@smithy/abort-controller": "^4.2.6", + "@smithy/protocol-http": "^5.3.6", + "@smithy/querystring-builder": "^4.2.6", + "@smithy/types": "^4.10.0", "tslib": "^2.6.2" }, "engines": { @@ -6897,12 +6897,12 @@ } }, "node_modules/@smithy/property-provider": { - "version": "4.2.7", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.2.7.tgz", - "integrity": "sha512-jmNYKe9MGGPoSl/D7JDDs1C8b3dC8f/w78LbaVfoTtWy4xAd5dfjaFG9c9PWPihY4ggMQNQSMtzU77CNgAJwmA==", + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.2.6.tgz", + "integrity": "sha512-a/tGSLPtaia2krbRdwR4xbZKO8lU67DjMk/jfY4QKt4PRlKML+2tL/gmAuhNdFDioO6wOq0sXkfnddNFH9mNUA==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.11.0", + "@smithy/types": "^4.10.0", "tslib": "^2.6.2" }, "engines": { @@ -6910,12 +6910,12 @@ } }, "node_modules/@smithy/protocol-http": { - "version": "5.3.7", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.3.7.tgz", - "integrity": "sha512-1r07pb994I20dD/c2seaZhoCuNYm0rWrvBxhCQ70brNh11M5Ml2ew6qJVo0lclB3jMIXirD4s2XRXRe7QEi0xA==", + "version": "5.3.6", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.3.6.tgz", + "integrity": "sha512-qLRZzP2+PqhE3OSwvY2jpBbP0WKTZ9opTsn+6IWYI0SKVpbG+imcfNxXPq9fj5XeaUTr7odpsNpK6dmoiM1gJQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.11.0", + "@smithy/types": "^4.10.0", "tslib": "^2.6.2" }, "engines": { @@ -6923,12 +6923,12 @@ } }, "node_modules/@smithy/querystring-builder": { - "version": "4.2.7", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.2.7.tgz", - "integrity": "sha512-eKONSywHZxK4tBxe2lXEysh8wbBdvDWiA+RIuaxZSgCMmA0zMgoDpGLJhnyj+c0leOQprVnXOmcB4m+W9Rw7sg==", + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.2.6.tgz", + "integrity": "sha512-MeM9fTAiD3HvoInK/aA8mgJaKQDvm8N0dKy6EiFaCfgpovQr4CaOkJC28XqlSRABM+sHdSQXbC8NZ0DShBMHqg==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.11.0", + "@smithy/types": "^4.10.0", "@smithy/util-uri-escape": "^4.2.0", "tslib": "^2.6.2" }, @@ -6937,12 +6937,12 @@ } }, "node_modules/@smithy/querystring-parser": { - "version": "4.2.7", - "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.2.7.tgz", - "integrity": "sha512-3X5ZvzUHmlSTHAXFlswrS6EGt8fMSIxX/c3Rm1Pni3+wYWB6cjGocmRIoqcQF9nU5OgGmL0u7l9m44tSUpfj9w==", + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.2.6.tgz", + "integrity": "sha512-YmWxl32SQRw/kIRccSOxzS/Ib8/b5/f9ex0r5PR40jRJg8X1wgM3KrR2In+8zvOGVhRSXgvyQpw9yOSlmfmSnA==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.11.0", + "@smithy/types": "^4.10.0", "tslib": "^2.6.2" }, "engines": { @@ -6950,24 +6950,24 @@ } }, "node_modules/@smithy/service-error-classification": { - "version": "4.2.7", - "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.2.7.tgz", - "integrity": "sha512-YB7oCbukqEb2Dlh3340/8g8vNGbs/QsNNRms+gv3N2AtZz9/1vSBx6/6tpwQpZMEJFs7Uq8h4mmOn48ZZ72MkA==", + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.2.6.tgz", + "integrity": "sha512-Q73XBrzJlGTut2nf5RglSntHKgAG0+KiTJdO5QQblLfr4TdliGwIAha1iZIjwisc3rA5ulzqwwsYC6xrclxVQg==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.11.0" + "@smithy/types": "^4.10.0" }, "engines": { "node": ">=18.0.0" } }, "node_modules/@smithy/shared-ini-file-loader": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.4.2.tgz", - "integrity": "sha512-M7iUUff/KwfNunmrgtqBfvZSzh3bmFgv/j/t1Y1dQ+8dNo34br1cqVEqy6v0mYEgi0DkGO7Xig0AnuOaEGVlcg==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.4.1.tgz", + "integrity": "sha512-tph+oQYPbpN6NamF030hx1gb5YN2Plog+GLaRHpoEDwp8+ZPG26rIJvStG9hkWzN2HBn3HcWg0sHeB0tmkYzqA==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.11.0", + "@smithy/types": "^4.10.0", "tslib": "^2.6.2" }, "engines": { @@ -6975,16 +6975,16 @@ } }, "node_modules/@smithy/signature-v4": { - "version": "5.3.7", - "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.3.7.tgz", - "integrity": "sha512-9oNUlqBlFZFOSdxgImA6X5GFuzE7V2H7VG/7E70cdLhidFbdtvxxt81EHgykGK5vq5D3FafH//X+Oy31j3CKOg==", + "version": "5.3.6", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.3.6.tgz", + "integrity": "sha512-P1TXDHuQMadTMTOBv4oElZMURU4uyEhxhHfn+qOc2iofW9Rd4sZtBGx58Lzk112rIGVEYZT8eUMK4NftpewpRA==", "license": "Apache-2.0", "dependencies": { "@smithy/is-array-buffer": "^4.2.0", - "@smithy/protocol-http": "^5.3.7", - "@smithy/types": "^4.11.0", + "@smithy/protocol-http": "^5.3.6", + "@smithy/types": "^4.10.0", "@smithy/util-hex-encoding": "^4.2.0", - "@smithy/util-middleware": "^4.2.7", + "@smithy/util-middleware": "^4.2.6", "@smithy/util-uri-escape": "^4.2.0", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" @@ -6994,17 +6994,17 @@ } }, "node_modules/@smithy/smithy-client": { - "version": "4.10.2", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.10.2.tgz", - "integrity": "sha512-D5z79xQWpgrGpAHb054Fn2CCTQZpog7JELbVQ6XAvXs5MNKWf28U9gzSBlJkOyMl9LA1TZEjRtwvGXfP0Sl90g==", + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.10.1.tgz", + "integrity": "sha512-1ovWdxzYprhq+mWqiGZlt3kF69LJthuQcfY9BIyHx9MywTFKzFapluku1QXoaBB43GCsLDxNqS+1v30ure69AA==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.20.0", - "@smithy/middleware-endpoint": "^4.4.1", - "@smithy/middleware-stack": "^4.2.7", - "@smithy/protocol-http": "^5.3.7", - "@smithy/types": "^4.11.0", - "@smithy/util-stream": "^4.5.8", + "@smithy/core": "^3.19.0", + "@smithy/middleware-endpoint": "^4.4.0", + "@smithy/middleware-stack": "^4.2.6", + "@smithy/protocol-http": "^5.3.6", + "@smithy/types": "^4.10.0", + "@smithy/util-stream": "^4.5.7", "tslib": "^2.6.2" }, "engines": { @@ -7012,9 +7012,9 @@ } }, "node_modules/@smithy/types": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.11.0.tgz", - "integrity": "sha512-mlrmL0DRDVe3mNrjTcVcZEgkFmufITfUAPBEA+AHYiIeYyJebso/He1qLbP3PssRe22KUzLRpQSdBPbXdgZ2VA==", + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.10.0.tgz", + "integrity": "sha512-K9mY7V/f3Ul+/Gz4LJANZ3vJ/yiBIwCyxe0sPT4vNJK63Srvd+Yk1IzP0t+nE7XFSpIGtzR71yljtnqpUTYFlQ==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -7024,13 +7024,13 @@ } }, "node_modules/@smithy/url-parser": { - "version": "4.2.7", - "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.2.7.tgz", - "integrity": "sha512-/RLtVsRV4uY3qPWhBDsjwahAtt3x2IsMGnP5W1b2VZIe+qgCqkLxI1UOHDZp1Q1QSOrdOR32MF3Ph2JfWT1VHg==", + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.2.6.tgz", + "integrity": "sha512-tVoyzJ2vXp4R3/aeV4EQjBDmCuWxRa8eo3KybL7Xv4wEM16nObYh7H1sNfcuLWHAAAzb0RVyxUz1S3sGj4X+Tg==", "license": "Apache-2.0", "dependencies": { - "@smithy/querystring-parser": "^4.2.7", - "@smithy/types": "^4.11.0", + "@smithy/querystring-parser": "^4.2.6", + "@smithy/types": "^4.10.0", "tslib": "^2.6.2" }, "engines": { @@ -7101,14 +7101,14 @@ } }, "node_modules/@smithy/util-defaults-mode-browser": { - "version": "4.3.16", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.3.16.tgz", - "integrity": "sha512-/eiSP3mzY3TsvUOYMeL4EqUX6fgUOj2eUOU4rMMgVbq67TiRLyxT7Xsjxq0bW3OwuzK009qOwF0L2OgJqperAQ==", + "version": "4.3.15", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.3.15.tgz", + "integrity": "sha512-LiZQVAg/oO8kueX4c+oMls5njaD2cRLXRfcjlTYjhIqmwHnCwkQO5B3dMQH0c5PACILxGAQf6Mxsq7CjlDc76A==", "license": "Apache-2.0", "dependencies": { - "@smithy/property-provider": "^4.2.7", - "@smithy/smithy-client": "^4.10.2", - "@smithy/types": "^4.11.0", + "@smithy/property-provider": "^4.2.6", + "@smithy/smithy-client": "^4.10.1", + "@smithy/types": "^4.10.0", "tslib": "^2.6.2" }, "engines": { @@ -7116,17 +7116,17 @@ } }, "node_modules/@smithy/util-defaults-mode-node": { - "version": "4.2.19", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.2.19.tgz", - "integrity": "sha512-3a4+4mhf6VycEJyHIQLypRbiwG6aJvbQAeRAVXydMmfweEPnLLabRbdyo/Pjw8Rew9vjsh5WCdhmDaHkQnhhhA==", + "version": "4.2.18", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.2.18.tgz", + "integrity": "sha512-Kw2J+KzYm9C9Z9nY6+W0tEnoZOofstVCMTshli9jhQbQCy64rueGfKzPfuFBnVUqZD9JobxTh2DzHmPkp/Va/Q==", "license": "Apache-2.0", "dependencies": { - "@smithy/config-resolver": "^4.4.5", - "@smithy/credential-provider-imds": "^4.2.7", - "@smithy/node-config-provider": "^4.3.7", - "@smithy/property-provider": "^4.2.7", - "@smithy/smithy-client": "^4.10.2", - "@smithy/types": "^4.11.0", + "@smithy/config-resolver": "^4.4.4", + "@smithy/credential-provider-imds": "^4.2.6", + "@smithy/node-config-provider": "^4.3.6", + "@smithy/property-provider": "^4.2.6", + "@smithy/smithy-client": "^4.10.1", + "@smithy/types": "^4.10.0", "tslib": "^2.6.2" }, "engines": { @@ -7134,13 +7134,13 @@ } }, "node_modules/@smithy/util-endpoints": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.2.7.tgz", - "integrity": "sha512-s4ILhyAvVqhMDYREeTS68R43B1V5aenV5q/V1QpRQJkCXib5BPRo4s7uNdzGtIKxaPHCfU/8YkvPAEvTpxgspg==", + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.2.6.tgz", + "integrity": "sha512-v60VNM2+mPvgHCBXEfMCYrQ0RepP6u6xvbAkMenfe4Mi872CqNkJzgcnQL837e8NdeDxBgrWQRTluKq5Lqdhfg==", "license": "Apache-2.0", "dependencies": { - "@smithy/node-config-provider": "^4.3.7", - "@smithy/types": "^4.11.0", + "@smithy/node-config-provider": "^4.3.6", + "@smithy/types": "^4.10.0", "tslib": "^2.6.2" }, "engines": { @@ -7160,12 +7160,12 @@ } }, "node_modules/@smithy/util-middleware": { - "version": "4.2.7", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.2.7.tgz", - "integrity": "sha512-i1IkpbOae6NvIKsEeLLM9/2q4X+M90KV3oCFgWQI4q0Qz+yUZvsr+gZPdAEAtFhWQhAHpTsJO8DRJPuwVyln+w==", + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.2.6.tgz", + "integrity": "sha512-qrvXUkxBSAFomM3/OEMuDVwjh4wtqK8D2uDZPShzIqOylPst6gor2Cdp6+XrH4dyksAWq/bE2aSDYBTTnj0Rxg==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.11.0", + "@smithy/types": "^4.10.0", "tslib": "^2.6.2" }, "engines": { @@ -7173,13 +7173,13 @@ } }, "node_modules/@smithy/util-retry": { - "version": "4.2.7", - "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.2.7.tgz", - "integrity": "sha512-SvDdsQyF5CIASa4EYVT02LukPHVzAgUA4kMAuZ97QJc2BpAqZfA4PINB8/KOoCXEw9tsuv/jQjMeaHFvxdLNGg==", + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.2.6.tgz", + "integrity": "sha512-x7CeDQLPQ9cb6xN7fRJEjlP9NyGW/YeXWc4j/RUhg4I+H60F0PEeRc2c/z3rm9zmsdiMFzpV/rT+4UHW6KM1SA==", "license": "Apache-2.0", "dependencies": { - "@smithy/service-error-classification": "^4.2.7", - "@smithy/types": "^4.11.0", + "@smithy/service-error-classification": "^4.2.6", + "@smithy/types": "^4.10.0", "tslib": "^2.6.2" }, "engines": { @@ -7187,14 +7187,14 @@ } }, "node_modules/@smithy/util-stream": { - "version": "4.5.8", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.5.8.tgz", - "integrity": "sha512-ZnnBhTapjM0YPGUSmOs0Mcg/Gg87k503qG4zU2v/+Js2Gu+daKOJMeqcQns8ajepY8tgzzfYxl6kQyZKml6O2w==", + "version": "4.5.7", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.5.7.tgz", + "integrity": "sha512-Uuy4S5Aj4oF6k1z+i2OtIBJUns4mlg29Ph4S+CqjR+f4XXpSFVgTCYLzMszHJTicYDBxKFtwq2/QSEDSS5l02A==", "license": "Apache-2.0", "dependencies": { - "@smithy/fetch-http-handler": "^5.3.8", - "@smithy/node-http-handler": "^4.4.7", - "@smithy/types": "^4.11.0", + "@smithy/fetch-http-handler": "^5.3.7", + "@smithy/node-http-handler": "^4.4.6", + "@smithy/types": "^4.10.0", "@smithy/util-base64": "^4.3.0", "@smithy/util-buffer-from": "^4.2.0", "@smithy/util-hex-encoding": "^4.2.0", @@ -22665,9 +22665,9 @@ "name": "nhs-notify-supplier-api-letter-test-data-utility", "version": "0.0.1", "dependencies": { - "@aws-sdk/client-dynamodb": "^3.858.0", + "@aws-sdk/client-dynamodb": "^3.954.0", "@aws-sdk/client-s3": "^3.858.0", - "@aws-sdk/lib-dynamodb": "^3.858.0", + "@aws-sdk/lib-dynamodb": "^3.954.0", "@internal/datastore": "*", "esbuild": "^0.25.11", "pino": "^9.7.0", @@ -22681,6 +22681,624 @@ "typescript": "^5.9.3" } }, + "scripts/utilities/letter-test-data/node_modules/@aws-sdk/client-dynamodb": { + "version": "3.954.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-dynamodb/-/client-dynamodb-3.954.0.tgz", + "integrity": "sha512-QhdiE3W9jC8wAmkjQhiwDBdpaK3/y/kc9aXfTyj8TaPP+B39zt56zA0VT4GtmXauyiYb81qcvKIjIDTvr95Y4A==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.954.0", + "@aws-sdk/credential-provider-node": "3.954.0", + "@aws-sdk/dynamodb-codec": "3.954.0", + "@aws-sdk/middleware-endpoint-discovery": "3.953.0", + "@aws-sdk/middleware-host-header": "3.953.0", + "@aws-sdk/middleware-logger": "3.953.0", + "@aws-sdk/middleware-recursion-detection": "3.953.0", + "@aws-sdk/middleware-user-agent": "3.954.0", + "@aws-sdk/region-config-resolver": "3.953.0", + "@aws-sdk/types": "3.953.0", + "@aws-sdk/util-endpoints": "3.953.0", + "@aws-sdk/util-user-agent-browser": "3.953.0", + "@aws-sdk/util-user-agent-node": "3.954.0", + "@smithy/config-resolver": "^4.4.4", + "@smithy/core": "^3.19.0", + "@smithy/fetch-http-handler": "^5.3.7", + "@smithy/hash-node": "^4.2.6", + "@smithy/invalid-dependency": "^4.2.6", + "@smithy/middleware-content-length": "^4.2.6", + "@smithy/middleware-endpoint": "^4.4.0", + "@smithy/middleware-retry": "^4.4.16", + "@smithy/middleware-serde": "^4.2.7", + "@smithy/middleware-stack": "^4.2.6", + "@smithy/node-config-provider": "^4.3.6", + "@smithy/node-http-handler": "^4.4.6", + "@smithy/protocol-http": "^5.3.6", + "@smithy/smithy-client": "^4.10.1", + "@smithy/types": "^4.10.0", + "@smithy/url-parser": "^4.2.6", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.15", + "@smithy/util-defaults-mode-node": "^4.2.18", + "@smithy/util-endpoints": "^3.2.6", + "@smithy/util-middleware": "^4.2.6", + "@smithy/util-retry": "^4.2.6", + "@smithy/util-utf8": "^4.2.0", + "@smithy/util-waiter": "^4.2.6", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "scripts/utilities/letter-test-data/node_modules/@aws-sdk/client-sso": { + "version": "3.954.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.954.0.tgz", + "integrity": "sha512-FVyMAvlFhLK68DHWB1lSkCRTm25xl38bIZDd+jKt5+yDolCrG5+n9aIN8AA8jNO1HNGhZuMjSIQm9r5rGmJH8g==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.954.0", + "@aws-sdk/middleware-host-header": "3.953.0", + "@aws-sdk/middleware-logger": "3.953.0", + "@aws-sdk/middleware-recursion-detection": "3.953.0", + "@aws-sdk/middleware-user-agent": "3.954.0", + "@aws-sdk/region-config-resolver": "3.953.0", + "@aws-sdk/types": "3.953.0", + "@aws-sdk/util-endpoints": "3.953.0", + "@aws-sdk/util-user-agent-browser": "3.953.0", + "@aws-sdk/util-user-agent-node": "3.954.0", + "@smithy/config-resolver": "^4.4.4", + "@smithy/core": "^3.19.0", + "@smithy/fetch-http-handler": "^5.3.7", + "@smithy/hash-node": "^4.2.6", + "@smithy/invalid-dependency": "^4.2.6", + "@smithy/middleware-content-length": "^4.2.6", + "@smithy/middleware-endpoint": "^4.4.0", + "@smithy/middleware-retry": "^4.4.16", + "@smithy/middleware-serde": "^4.2.7", + "@smithy/middleware-stack": "^4.2.6", + "@smithy/node-config-provider": "^4.3.6", + "@smithy/node-http-handler": "^4.4.6", + "@smithy/protocol-http": "^5.3.6", + "@smithy/smithy-client": "^4.10.1", + "@smithy/types": "^4.10.0", + "@smithy/url-parser": "^4.2.6", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.15", + "@smithy/util-defaults-mode-node": "^4.2.18", + "@smithy/util-endpoints": "^3.2.6", + "@smithy/util-middleware": "^4.2.6", + "@smithy/util-retry": "^4.2.6", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "scripts/utilities/letter-test-data/node_modules/@aws-sdk/core": { + "version": "3.954.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.954.0.tgz", + "integrity": "sha512-5oYO5RP+mvCNXNj8XnF9jZo0EP0LTseYOJVNQYcii1D9DJqzHL3HJWurYh7cXxz7G7eDyvVYA01O9Xpt34TdoA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.953.0", + "@aws-sdk/xml-builder": "3.953.0", + "@smithy/core": "^3.19.0", + "@smithy/node-config-provider": "^4.3.6", + "@smithy/property-provider": "^4.2.6", + "@smithy/protocol-http": "^5.3.6", + "@smithy/signature-v4": "^5.3.6", + "@smithy/smithy-client": "^4.10.1", + "@smithy/types": "^4.10.0", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-middleware": "^4.2.6", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "scripts/utilities/letter-test-data/node_modules/@aws-sdk/credential-provider-env": { + "version": "3.954.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.954.0.tgz", + "integrity": "sha512-2HNkqBjfsvyoRuPAiFh86JBFMFyaCNhL4VyH6XqwTGKZffjG7hdBmzXPy7AT7G3oFh1k/1Zc27v0qxaKoK7mBA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.954.0", + "@aws-sdk/types": "3.953.0", + "@smithy/property-provider": "^4.2.6", + "@smithy/types": "^4.10.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "scripts/utilities/letter-test-data/node_modules/@aws-sdk/credential-provider-http": { + "version": "3.954.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.954.0.tgz", + "integrity": "sha512-CrWD5300+NE1OYRnSVDxoG7G0b5cLIZb7yp+rNQ5Jq/kqnTmyJXpVAsivq+bQIDaGzPXhadzpAMIoo7K/aHaag==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.954.0", + "@aws-sdk/types": "3.953.0", + "@smithy/fetch-http-handler": "^5.3.7", + "@smithy/node-http-handler": "^4.4.6", + "@smithy/property-provider": "^4.2.6", + "@smithy/protocol-http": "^5.3.6", + "@smithy/smithy-client": "^4.10.1", + "@smithy/types": "^4.10.0", + "@smithy/util-stream": "^4.5.7", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "scripts/utilities/letter-test-data/node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.954.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.954.0.tgz", + "integrity": "sha512-WAFD8pVwRSoBsuXcoD+s/hrdsP9Z0PNUedSgkOGExuJVAabpM2cIIMzYNsdHio9XFZUSqHkv8mF5mQXuIZvuzg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.954.0", + "@aws-sdk/credential-provider-env": "3.954.0", + "@aws-sdk/credential-provider-http": "3.954.0", + "@aws-sdk/credential-provider-login": "3.954.0", + "@aws-sdk/credential-provider-process": "3.954.0", + "@aws-sdk/credential-provider-sso": "3.954.0", + "@aws-sdk/credential-provider-web-identity": "3.954.0", + "@aws-sdk/nested-clients": "3.954.0", + "@aws-sdk/types": "3.953.0", + "@smithy/credential-provider-imds": "^4.2.6", + "@smithy/property-provider": "^4.2.6", + "@smithy/shared-ini-file-loader": "^4.4.1", + "@smithy/types": "^4.10.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "scripts/utilities/letter-test-data/node_modules/@aws-sdk/credential-provider-node": { + "version": "3.954.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.954.0.tgz", + "integrity": "sha512-UPBjw7Lnly5i+/rES8Z5U+nPaumzEUYOE/wrHkxyH6JjwFWn8w7R07fE5Z5cgYlIq1U1lQ7sxYwB3wHPpQ65Aw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.954.0", + "@aws-sdk/credential-provider-http": "3.954.0", + "@aws-sdk/credential-provider-ini": "3.954.0", + "@aws-sdk/credential-provider-process": "3.954.0", + "@aws-sdk/credential-provider-sso": "3.954.0", + "@aws-sdk/credential-provider-web-identity": "3.954.0", + "@aws-sdk/types": "3.953.0", + "@smithy/credential-provider-imds": "^4.2.6", + "@smithy/property-provider": "^4.2.6", + "@smithy/shared-ini-file-loader": "^4.4.1", + "@smithy/types": "^4.10.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "scripts/utilities/letter-test-data/node_modules/@aws-sdk/credential-provider-process": { + "version": "3.954.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.954.0.tgz", + "integrity": "sha512-Y1/0O2LgbKM8iIgcVj/GNEQW6p90LVTCOzF2CI1pouoKqxmZ/1F7F66WHoa6XUOfKaCRj/R6nuMR3om9ThaM5A==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.954.0", + "@aws-sdk/types": "3.953.0", + "@smithy/property-provider": "^4.2.6", + "@smithy/shared-ini-file-loader": "^4.4.1", + "@smithy/types": "^4.10.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "scripts/utilities/letter-test-data/node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.954.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.954.0.tgz", + "integrity": "sha512-UXxGfkp/plFRdyidMLvNul5zoLKmHhVQOCrD2OgR/lg9jNqNmJ7abF+Qu8abo902iDkhU21Qj4M398cx6l8Kng==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/client-sso": "3.954.0", + "@aws-sdk/core": "3.954.0", + "@aws-sdk/token-providers": "3.954.0", + "@aws-sdk/types": "3.953.0", + "@smithy/property-provider": "^4.2.6", + "@smithy/shared-ini-file-loader": "^4.4.1", + "@smithy/types": "^4.10.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "scripts/utilities/letter-test-data/node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.954.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.954.0.tgz", + "integrity": "sha512-XEyf1T08q1tG4zkTS4Dnf1cAQyrJUo/xlvi6XNpqGhY3bOmKUYE2h/K6eITIdytDL9VuCpWYQ6YRcIVtL29E0w==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.954.0", + "@aws-sdk/nested-clients": "3.954.0", + "@aws-sdk/types": "3.953.0", + "@smithy/property-provider": "^4.2.6", + "@smithy/shared-ini-file-loader": "^4.4.1", + "@smithy/types": "^4.10.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "scripts/utilities/letter-test-data/node_modules/@aws-sdk/dynamodb-codec": { + "version": "3.954.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/dynamodb-codec/-/dynamodb-codec-3.954.0.tgz", + "integrity": "sha512-fNY0L1l9e36pLJef4NY5k7Q1SJnm5rgLSxSRPT8xL+bhQBtEn2E2t4JdBiTqlxgeyuOrafWOawbg8yS3pRPcLw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.954.0", + "@smithy/core": "^3.19.0", + "@smithy/smithy-client": "^4.10.1", + "@smithy/types": "^4.10.0", + "@smithy/util-base64": "^4.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-dynamodb": "^3.954.0" + } + }, + "scripts/utilities/letter-test-data/node_modules/@aws-sdk/endpoint-cache": { + "version": "3.953.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/endpoint-cache/-/endpoint-cache-3.953.0.tgz", + "integrity": "sha512-pz67DoHk5WNmvMuyNDiomUS2xo0mq6Z3TdfLJZlWVbSKi3h8hYxVQchJ2kzgTr6wu6zt3UBbtKV9yY1IBhKMVA==", + "license": "Apache-2.0", + "dependencies": { + "mnemonist": "0.38.3", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "scripts/utilities/letter-test-data/node_modules/@aws-sdk/lib-dynamodb": { + "version": "3.954.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/lib-dynamodb/-/lib-dynamodb-3.954.0.tgz", + "integrity": "sha512-DBEzAW7WfvNy6bQ32TfpvuFSVewj5eE8O1sTQWfvylNSZu81u6sPwb+eHPEclbvC84zAANl72JnkETOIkL4r8g==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.954.0", + "@aws-sdk/util-dynamodb": "3.954.0", + "@smithy/core": "^3.19.0", + "@smithy/smithy-client": "^4.10.1", + "@smithy/types": "^4.10.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-dynamodb": "^3.954.0" + } + }, + "scripts/utilities/letter-test-data/node_modules/@aws-sdk/middleware-endpoint-discovery": { + "version": "3.953.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-endpoint-discovery/-/middleware-endpoint-discovery-3.953.0.tgz", + "integrity": "sha512-/YKB1/OiWr7TwOfmkqzv8x1xgOpU71yciQTfsq6erB3dTQhdukPADt/CMJOhWFKC6Q1D5cDN8381nsGmnNuBVg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/endpoint-cache": "3.953.0", + "@aws-sdk/types": "3.953.0", + "@smithy/node-config-provider": "^4.3.6", + "@smithy/protocol-http": "^5.3.6", + "@smithy/types": "^4.10.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "scripts/utilities/letter-test-data/node_modules/@aws-sdk/middleware-host-header": { + "version": "3.953.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.953.0.tgz", + "integrity": "sha512-jTGhfkONav+r4E6HLOrl5SzBqDmPByUYCkyB/c/3TVb8jX3wAZx8/q9bphKpCh+G5ARi3IdbSisgkZrJYqQ19Q==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.953.0", + "@smithy/protocol-http": "^5.3.6", + "@smithy/types": "^4.10.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "scripts/utilities/letter-test-data/node_modules/@aws-sdk/middleware-logger": { + "version": "3.953.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.953.0.tgz", + "integrity": "sha512-PlWdVYgcuptkIC0ZKqVUhWNtSHXJSx7U9V8J7dJjRmsXC40X7zpEycvrkzDMJjeTDGcCceYbyYAg/4X1lkcIMw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.953.0", + "@smithy/types": "^4.10.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "scripts/utilities/letter-test-data/node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.953.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.953.0.tgz", + "integrity": "sha512-cmIJx0gWeesUKK4YwgE+VQL3mpACr3/J24fbwnc1Z5tntC86b+HQFzU5vsBDw6lLwyD46dBgWdsXFh1jL+ZaFw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.953.0", + "@aws/lambda-invoke-store": "^0.2.2", + "@smithy/protocol-http": "^5.3.6", + "@smithy/types": "^4.10.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "scripts/utilities/letter-test-data/node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.954.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.954.0.tgz", + "integrity": "sha512-5PX8JDe3dB2+MqXeGIhmgFnm2rbVsSxhz+Xyuu1oxLtbOn+a9UDA+sNBufEBjt3UxWy5qwEEY1fxdbXXayjlGg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.954.0", + "@aws-sdk/types": "3.953.0", + "@aws-sdk/util-endpoints": "3.953.0", + "@smithy/core": "^3.19.0", + "@smithy/protocol-http": "^5.3.6", + "@smithy/types": "^4.10.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "scripts/utilities/letter-test-data/node_modules/@aws-sdk/nested-clients": { + "version": "3.954.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.954.0.tgz", + "integrity": "sha512-JLUhf35fTQIDPLk6G5KPggL9tV//Hjhy6+N2zZeis76LuBRNhKDq8z1CFyKhjf00vXi/tDYdn9D7y9emI+5Y/g==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.954.0", + "@aws-sdk/middleware-host-header": "3.953.0", + "@aws-sdk/middleware-logger": "3.953.0", + "@aws-sdk/middleware-recursion-detection": "3.953.0", + "@aws-sdk/middleware-user-agent": "3.954.0", + "@aws-sdk/region-config-resolver": "3.953.0", + "@aws-sdk/types": "3.953.0", + "@aws-sdk/util-endpoints": "3.953.0", + "@aws-sdk/util-user-agent-browser": "3.953.0", + "@aws-sdk/util-user-agent-node": "3.954.0", + "@smithy/config-resolver": "^4.4.4", + "@smithy/core": "^3.19.0", + "@smithy/fetch-http-handler": "^5.3.7", + "@smithy/hash-node": "^4.2.6", + "@smithy/invalid-dependency": "^4.2.6", + "@smithy/middleware-content-length": "^4.2.6", + "@smithy/middleware-endpoint": "^4.4.0", + "@smithy/middleware-retry": "^4.4.16", + "@smithy/middleware-serde": "^4.2.7", + "@smithy/middleware-stack": "^4.2.6", + "@smithy/node-config-provider": "^4.3.6", + "@smithy/node-http-handler": "^4.4.6", + "@smithy/protocol-http": "^5.3.6", + "@smithy/smithy-client": "^4.10.1", + "@smithy/types": "^4.10.0", + "@smithy/url-parser": "^4.2.6", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.15", + "@smithy/util-defaults-mode-node": "^4.2.18", + "@smithy/util-endpoints": "^3.2.6", + "@smithy/util-middleware": "^4.2.6", + "@smithy/util-retry": "^4.2.6", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "scripts/utilities/letter-test-data/node_modules/@aws-sdk/region-config-resolver": { + "version": "3.953.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.953.0.tgz", + "integrity": "sha512-5MJgnsc+HLO+le0EK1cy92yrC7kyhGZSpaq8PcQvKs9qtXCXT5Tb6tMdkr5Y07JxYsYOV1omWBynvL6PWh08tQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.953.0", + "@smithy/config-resolver": "^4.4.4", + "@smithy/node-config-provider": "^4.3.6", + "@smithy/types": "^4.10.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "scripts/utilities/letter-test-data/node_modules/@aws-sdk/token-providers": { + "version": "3.954.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.954.0.tgz", + "integrity": "sha512-rDyN3oQQKMOJgyQ9/LNbh4fAGAj8ePMGOAQzSP/kyzizmViI6STpBW1o/VRqiTgMNi1bvA9ZasDtfrJqcVt0iA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.954.0", + "@aws-sdk/nested-clients": "3.954.0", + "@aws-sdk/types": "3.953.0", + "@smithy/property-provider": "^4.2.6", + "@smithy/shared-ini-file-loader": "^4.4.1", + "@smithy/types": "^4.10.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "scripts/utilities/letter-test-data/node_modules/@aws-sdk/types": { + "version": "3.953.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.953.0.tgz", + "integrity": "sha512-M9Iwg9kTyqTErI0vOTVVpcnTHWzS3VplQppy8MuL02EE+mJ0BIwpWfsaAPQW+/XnVpdNpWZTsHcNE29f1+hR8g==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.10.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "scripts/utilities/letter-test-data/node_modules/@aws-sdk/util-dynamodb": { + "version": "3.954.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-dynamodb/-/util-dynamodb-3.954.0.tgz", + "integrity": "sha512-PXjS9P98OMMVXl4ledr/nTHGmNx6oF2rqTBvSQKKWi8dB4mcHjSaU5ASsklQC944xLs1IGsUkrJ39vu7bEqLoA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-dynamodb": "^3.954.0" + } + }, + "scripts/utilities/letter-test-data/node_modules/@aws-sdk/util-endpoints": { + "version": "3.953.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.953.0.tgz", + "integrity": "sha512-rjaS6jrFksopXvNg6YeN+D1lYwhcByORNlFuYesFvaQNtPOufbE5tJL4GJ3TMXyaY0uFR28N5BHHITPyWWfH/g==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.953.0", + "@smithy/types": "^4.10.0", + "@smithy/url-parser": "^4.2.6", + "@smithy/util-endpoints": "^3.2.6", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "scripts/utilities/letter-test-data/node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.953.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.953.0.tgz", + "integrity": "sha512-UF5NeqYesWuFao+u7LJvpV1SJCaLml5BtFZKUdTnNNMeN6jvV+dW/eQoFGpXF94RCqguX0XESmRuRRPQp+/rzQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.953.0", + "@smithy/types": "^4.10.0", + "bowser": "^2.11.0", + "tslib": "^2.6.2" + } + }, + "scripts/utilities/letter-test-data/node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.954.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.954.0.tgz", + "integrity": "sha512-fB5S5VOu7OFkeNzcblQlez4AjO5hgDFaa7phYt7716YWisY3RjAaQPlxgv+G3GltHHDJIfzEC5aRxdf62B9zMg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/middleware-user-agent": "3.954.0", + "@aws-sdk/types": "3.953.0", + "@smithy/node-config-provider": "^4.3.6", + "@smithy/types": "^4.10.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "aws-crt": ">=1.0.0" + }, + "peerDependenciesMeta": { + "aws-crt": { + "optional": true + } + } + }, + "scripts/utilities/letter-test-data/node_modules/@aws-sdk/xml-builder": { + "version": "3.953.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.953.0.tgz", + "integrity": "sha512-Zmrj21jQ2OeOJGr9spPiN00aQvXa/WUqRXcTVENhrMt+OFoSOfDFpYhUj9NQ09QmQ8KMWFoWuWW6iKurNqLvAA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.10.0", + "fast-xml-parser": "5.2.5", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "scripts/utilities/letter-test-data/node_modules/@aws/lambda-invoke-store": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@aws/lambda-invoke-store/-/lambda-invoke-store-0.2.2.tgz", + "integrity": "sha512-C0NBLsIqzDIae8HFw9YIrIBsbc0xTiOtt7fAukGPnqQ/+zZNaq+4jhuccltK0QuWHBnNm/a6kLIRA6GFiM10eg==", + "license": "Apache-2.0", + "engines": { + "node": ">=18.0.0" + } + }, + "scripts/utilities/letter-test-data/node_modules/@smithy/util-waiter": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-4.2.6.tgz", + "integrity": "sha512-xU9HwUSik9UUCJmm530yvBy0AwlQFICveKmqvaaTukKkXEAhyiBdHtSrhPrH3rH+uz0ykyaE3LdgsX86C6mDCQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/abort-controller": "^4.2.6", + "@smithy/types": "^4.10.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "scripts/utilities/letter-test-data/node_modules/ansi-regex": { + "version": "6.2.2", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "scripts/utilities/letter-test-data/node_modules/ansi-styles": { + "version": "6.2.3", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, "scripts/utilities/letter-test-data/node_modules/cliui": { "version": "8.0.1", "license": "ISC", diff --git a/scripts/utilities/letter-test-data/package.json b/scripts/utilities/letter-test-data/package.json index 58be5cd6..ed4e0d9a 100644 --- a/scripts/utilities/letter-test-data/package.json +++ b/scripts/utilities/letter-test-data/package.json @@ -1,8 +1,8 @@ { "dependencies": { - "@aws-sdk/client-dynamodb": "^3.858.0", + "@aws-sdk/client-dynamodb": "^3.954.0", "@aws-sdk/client-s3": "^3.858.0", - "@aws-sdk/lib-dynamodb": "^3.858.0", + "@aws-sdk/lib-dynamodb": "^3.954.0", "@internal/datastore": "*", "esbuild": "^0.25.11", "pino": "^9.7.0", diff --git a/scripts/utilities/letter-test-data/src/__test__/helpers/create_letter_helpers.test.ts b/scripts/utilities/letter-test-data/src/__test__/helpers/create-letter-helpers.test.ts similarity index 95% rename from scripts/utilities/letter-test-data/src/__test__/helpers/create_letter_helpers.test.ts rename to scripts/utilities/letter-test-data/src/__test__/helpers/create-letter-helpers.test.ts index bc3c4b73..c63dfe61 100644 --- a/scripts/utilities/letter-test-data/src/__test__/helpers/create_letter_helpers.test.ts +++ b/scripts/utilities/letter-test-data/src/__test__/helpers/create-letter-helpers.test.ts @@ -3,8 +3,8 @@ import { LetterStatusType } from "@internal/datastore"; import { createLetter, createLetterDto, -} from "../../helpers/create_letter_helpers"; -import { uploadFile } from "../../helpers/s3_helpers"; +} from "../../helpers/create-letter-helpers"; +import { uploadFile } from "../../helpers/s3-helpers"; jest.mock("../../helpers/s3_helpers"); diff --git a/scripts/utilities/letter-test-data/src/cli/index.ts b/scripts/utilities/letter-test-data/src/cli/index.ts index fba64289..97b6e038 100644 --- a/scripts/utilities/letter-test-data/src/cli/index.ts +++ b/scripts/utilities/letter-test-data/src/cli/index.ts @@ -5,9 +5,9 @@ import { randomUUID } from "node:crypto"; import { createLetter, createLetterDto, -} from "../helpers/create_letter_helpers"; +} from "../helpers/create-letter-helpers"; import { createLetterRepository } from "../infrastructure/letter-repo-factory"; -import { uploadFile } from "../helpers/s3_helpers"; +import { uploadFile } from "../helpers/s3-helpers"; async function main() { await yargs(hideBin(process.argv)) @@ -64,13 +64,11 @@ async function main() { }, async (argv) => { const { supplierId } = argv; - const letterId = argv.letterId ? argv.letterId : randomUUID(); + const letterId = argv.letterId ?? randomUUID(); const bucketName = `nhs-${argv.awsAccountId}-eu-west-2-${argv.environment}-supapi-test-letters`; const targetFilename = `${letterId}.pdf`; - const groupId = argv.groupId ? argv.groupId : randomUUID(); - const specificationId = argv.specificationId - ? argv.specificationId - : randomUUID(); + const groupId = argv.groupId ?? randomUUID(); + const specificationId = argv.specificationId ?? randomUUID(); const { status } = argv; const { environment } = argv; const { ttlHours } = argv; @@ -145,10 +143,8 @@ async function main() { // parse args const { supplierId } = argv; - const groupId = argv.groupId ? argv.groupId : randomUUID(); - const specificationId = argv.specificationId - ? argv.specificationId - : randomUUID(); + const groupId = argv.groupId ?? randomUUID(); + const specificationId = argv.specificationId ?? randomUUID(); const { status } = argv; const { environment } = argv; const { ttlHours } = argv; diff --git a/scripts/utilities/letter-test-data/src/helpers/create_letter_helpers.ts b/scripts/utilities/letter-test-data/src/helpers/create-letter-helpers.ts similarity index 97% rename from scripts/utilities/letter-test-data/src/helpers/create_letter_helpers.ts rename to scripts/utilities/letter-test-data/src/helpers/create-letter-helpers.ts index c6137db7..c04b7ee9 100644 --- a/scripts/utilities/letter-test-data/src/helpers/create_letter_helpers.ts +++ b/scripts/utilities/letter-test-data/src/helpers/create-letter-helpers.ts @@ -3,7 +3,7 @@ import { LetterRepository, LetterStatusType, } from "@internal/datastore"; -import { uploadFile } from "./s3_helpers"; +import { uploadFile } from "./s3-helpers"; export async function createLetter(params: { letterId: string; diff --git a/scripts/utilities/letter-test-data/src/helpers/s3_helpers.ts b/scripts/utilities/letter-test-data/src/helpers/s3-helpers.ts similarity index 92% rename from scripts/utilities/letter-test-data/src/helpers/s3_helpers.ts rename to scripts/utilities/letter-test-data/src/helpers/s3-helpers.ts index 0e5dde77..b88bbf74 100644 --- a/scripts/utilities/letter-test-data/src/helpers/s3_helpers.ts +++ b/scripts/utilities/letter-test-data/src/helpers/s3-helpers.ts @@ -2,7 +2,7 @@ import { PutObjectCommand, S3Client } from "@aws-sdk/client-s3"; import { readFileSync } from "node:fs"; import path from "node:path"; -export async function uploadFile( +export default async function uploadFile( bucketName: string, supplierId: string, sourceFilename: string, @@ -24,5 +24,6 @@ export async function uploadFile( return await s3.send(command); } catch (error) { console.error("Error uploading file:", error); + throw error; } } diff --git a/scripts/utilities/letter-test-data/src/infrastructure/letter-repo-factory.ts b/scripts/utilities/letter-test-data/src/infrastructure/letter-repo-factory.ts index f2bef4a4..c6440bf1 100644 --- a/scripts/utilities/letter-test-data/src/infrastructure/letter-repo-factory.ts +++ b/scripts/utilities/letter-test-data/src/infrastructure/letter-repo-factory.ts @@ -3,7 +3,7 @@ import { DynamoDBDocumentClient } from "@aws-sdk/lib-dynamodb"; import { pino } from "pino"; import { LetterRepository } from "@internal/datastore"; -export function createLetterRepository( +export default function createLetterRepository( environment: string, ttlHours: number, ): LetterRepository { From b7e2121bb59ca0c681d7b612c47ac837654b2239 Mon Sep 17 00:00:00 2001 From: David Wass Date: Thu, 18 Dec 2025 11:42:53 +0000 Subject: [PATCH 03/20] supplier data auto fixes --- .../utilities/supplier-data/jest.config.ts | 32 ++++++------- .../utilities/supplier-data/src/cli/index.ts | 45 ++++++++----------- .../infrastructure/suppliers-repo-factory.ts | 12 ++--- 3 files changed, 42 insertions(+), 47 deletions(-) diff --git a/scripts/utilities/supplier-data/jest.config.ts b/scripts/utilities/supplier-data/jest.config.ts index f2972c27..4bb3369a 100644 --- a/scripts/utilities/supplier-data/jest.config.ts +++ b/scripts/utilities/supplier-data/jest.config.ts @@ -1,7 +1,7 @@ -import type { Config } from 'jest'; +import type { Config } from "jest"; export const baseJestConfig: Config = { - preset: 'ts-jest', + preset: "ts-jest", // Automatically clear mock calls, instances, contexts and results before every test clearMocks: true, @@ -10,10 +10,10 @@ export const baseJestConfig: Config = { collectCoverage: true, // The directory where Jest should output its coverage files - coverageDirectory: './.reports/unit/coverage', + coverageDirectory: "./.reports/unit/coverage", // Indicates which provider should be used to instrument code for coverage - coverageProvider: 'babel', + coverageProvider: "babel", coverageThreshold: { global: { @@ -24,37 +24,37 @@ export const baseJestConfig: Config = { }, }, - coveragePathIgnorePatterns: ['/__tests__/'], - transform: { '^.+\\.ts$': 'ts-jest' }, - testPathIgnorePatterns: ['.build'], - testMatch: ['**/?(*.)+(spec|test).[jt]s?(x)'], + coveragePathIgnorePatterns: ["/__tests__/"], + transform: { "^.+\\.ts$": "ts-jest" }, + testPathIgnorePatterns: [".build"], + testMatch: ["**/?(*.)+(spec|test).[jt]s?(x)"], // Use this configuration option to add custom reporters to Jest reporters: [ - 'default', + "default", [ - 'jest-html-reporter', + "jest-html-reporter", { - pageTitle: 'Test Report', - outputPath: './.reports/unit/test-report.html', + pageTitle: "Test Report", + outputPath: "./.reports/unit/test-report.html", includeFailureMsg: true, }, ], ], // The test environment that will be used for testing - testEnvironment: 'jsdom', + testEnvironment: "jsdom", }; const utilsJestConfig = { ...baseJestConfig, - testEnvironment: 'node', + testEnvironment: "node", coveragePathIgnorePatterns: [ ...(baseJestConfig.coveragePathIgnorePatterns ?? []), - 'cli/index.ts', - 'suppliers-repo-factory.ts', + "cli/index.ts", + "suppliers-repo-factory.ts", ], }; diff --git a/scripts/utilities/supplier-data/src/cli/index.ts b/scripts/utilities/supplier-data/src/cli/index.ts index 3efab279..0b5be186 100644 --- a/scripts/utilities/supplier-data/src/cli/index.ts +++ b/scripts/utilities/supplier-data/src/cli/index.ts @@ -1,11 +1,9 @@ import { hideBin } from "yargs/helpers"; -import yargs from 'yargs'; +import yargs from "yargs"; import { LetterStatusType } from "@internal/datastore/src/types"; -import { randomUUID } from "crypto"; +import { randomUUID } from "node:crypto"; import { createSupplierRepository } from "../infrastructure/suppliers-repo-factory"; - - async function main() { await yargs(hideBin(process.argv)) .command( @@ -16,35 +14,32 @@ async function main() { type: "string", demandOption: true, }, - "id": { + id: { type: "string", demandOption: true, }, - "name": { + name: { type: "string", demandOption: true, }, - "apimId": { + apimId: { type: "string", demandOption: true, }, status: { type: "string", demandOption: true, - choices: [ - "ENABLED", - "DISABLED" - ], + choices: ["ENABLED", "DISABLED"], }, }, async (argv) => { // parse args - const id = argv.id; - const name = argv.name; - const apimId = argv.apimId; + const { id } = argv; + const { name } = argv; + const { apimId } = argv; const status = argv.status as "ENABLED" | "DISABLED"; - const environment = argv.environment; + const { environment } = argv; const supplierRepository = createSupplierRepository(environment); @@ -56,13 +51,13 @@ async function main() { }); console.log(`PUT successful ${JSON.stringify(putResult)}`); - } + }, ) .command( "get-supplier-by-id", "Get a supplier by their Supplier ID", { - "id": { + id: { type: "string", demandOption: true, }, @@ -72,9 +67,8 @@ async function main() { }, }, async (argv) => { - - const id = argv.id; - const environment = argv.environment; + const { id } = argv; + const { environment } = argv; const supplierRepository = createSupplierRepository(environment); @@ -87,7 +81,7 @@ async function main() { "get-supplier-by-apim-id", "Get a supplier by their APIM ID", { - "apimId": { + apimId: { type: "string", demandOption: true, }, @@ -97,9 +91,8 @@ async function main() { }, }, async (argv) => { - - const apimId = argv.apimId; - const environment = argv.environment; + const { apimId } = argv; + const { environment } = argv; const supplierRepository = createSupplierRepository(environment); @@ -113,8 +106,8 @@ async function main() { } if (require.main === module) { - main().catch((err) => { - console.error(err); + main().catch((error) => { + console.error(error); process.exitCode = 1; }); } diff --git a/scripts/utilities/supplier-data/src/infrastructure/suppliers-repo-factory.ts b/scripts/utilities/supplier-data/src/infrastructure/suppliers-repo-factory.ts index 3bddc616..a37e2b5d 100644 --- a/scripts/utilities/supplier-data/src/infrastructure/suppliers-repo-factory.ts +++ b/scripts/utilities/supplier-data/src/infrastructure/suppliers-repo-factory.ts @@ -1,9 +1,11 @@ -import { DynamoDBClient } from '@aws-sdk/client-dynamodb'; -import { DynamoDBDocumentClient } from '@aws-sdk/lib-dynamodb'; -import { pino } from 'pino'; -import { SupplierRepository } from '@internal/datastore'; +import { DynamoDBClient } from "@aws-sdk/client-dynamodb"; +import { DynamoDBDocumentClient } from "@aws-sdk/lib-dynamodb"; +import { pino } from "pino"; +import { SupplierRepository } from "@internal/datastore"; -export function createSupplierRepository(environment: string): SupplierRepository { +export function createSupplierRepository( + environment: string, +): SupplierRepository { const ddbClient = new DynamoDBClient({}); const docClient = DynamoDBDocumentClient.from(ddbClient); const log = pino(); From a5dacd173d0bc85d04a7ff724f7f0f45fefc2817 Mon Sep 17 00:00:00 2001 From: David Wass Date: Thu, 18 Dec 2025 11:46:33 +0000 Subject: [PATCH 04/20] supplier data manual fixes --- package-lock.json | 602 +++++++++++++++++- scripts/utilities/supplier-data/package.json | 4 +- .../utilities/supplier-data/src/cli/index.ts | 2 - .../infrastructure/suppliers-repo-factory.ts | 2 +- 4 files changed, 603 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index b4a0c05e..1820e45f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -23368,8 +23368,8 @@ "name": "nhs-notify-supplier-api-suppliers-data-utility", "version": "0.0.1", "dependencies": { - "@aws-sdk/client-dynamodb": "^3.858.0", - "@aws-sdk/lib-dynamodb": "^3.858.0", + "@aws-sdk/client-dynamodb": "^3.954.0", + "@aws-sdk/lib-dynamodb": "^3.954.0", "@internal/datastore": "*", "esbuild": "^0.25.11", "pino": "^9.7.0", @@ -23383,6 +23383,604 @@ "typescript": "^5.8.3" } }, + "scripts/utilities/supplier-data/node_modules/@aws-sdk/client-dynamodb": { + "version": "3.954.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-dynamodb/-/client-dynamodb-3.954.0.tgz", + "integrity": "sha512-QhdiE3W9jC8wAmkjQhiwDBdpaK3/y/kc9aXfTyj8TaPP+B39zt56zA0VT4GtmXauyiYb81qcvKIjIDTvr95Y4A==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.954.0", + "@aws-sdk/credential-provider-node": "3.954.0", + "@aws-sdk/dynamodb-codec": "3.954.0", + "@aws-sdk/middleware-endpoint-discovery": "3.953.0", + "@aws-sdk/middleware-host-header": "3.953.0", + "@aws-sdk/middleware-logger": "3.953.0", + "@aws-sdk/middleware-recursion-detection": "3.953.0", + "@aws-sdk/middleware-user-agent": "3.954.0", + "@aws-sdk/region-config-resolver": "3.953.0", + "@aws-sdk/types": "3.953.0", + "@aws-sdk/util-endpoints": "3.953.0", + "@aws-sdk/util-user-agent-browser": "3.953.0", + "@aws-sdk/util-user-agent-node": "3.954.0", + "@smithy/config-resolver": "^4.4.4", + "@smithy/core": "^3.19.0", + "@smithy/fetch-http-handler": "^5.3.7", + "@smithy/hash-node": "^4.2.6", + "@smithy/invalid-dependency": "^4.2.6", + "@smithy/middleware-content-length": "^4.2.6", + "@smithy/middleware-endpoint": "^4.4.0", + "@smithy/middleware-retry": "^4.4.16", + "@smithy/middleware-serde": "^4.2.7", + "@smithy/middleware-stack": "^4.2.6", + "@smithy/node-config-provider": "^4.3.6", + "@smithy/node-http-handler": "^4.4.6", + "@smithy/protocol-http": "^5.3.6", + "@smithy/smithy-client": "^4.10.1", + "@smithy/types": "^4.10.0", + "@smithy/url-parser": "^4.2.6", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.15", + "@smithy/util-defaults-mode-node": "^4.2.18", + "@smithy/util-endpoints": "^3.2.6", + "@smithy/util-middleware": "^4.2.6", + "@smithy/util-retry": "^4.2.6", + "@smithy/util-utf8": "^4.2.0", + "@smithy/util-waiter": "^4.2.6", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "scripts/utilities/supplier-data/node_modules/@aws-sdk/client-sso": { + "version": "3.954.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.954.0.tgz", + "integrity": "sha512-FVyMAvlFhLK68DHWB1lSkCRTm25xl38bIZDd+jKt5+yDolCrG5+n9aIN8AA8jNO1HNGhZuMjSIQm9r5rGmJH8g==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.954.0", + "@aws-sdk/middleware-host-header": "3.953.0", + "@aws-sdk/middleware-logger": "3.953.0", + "@aws-sdk/middleware-recursion-detection": "3.953.0", + "@aws-sdk/middleware-user-agent": "3.954.0", + "@aws-sdk/region-config-resolver": "3.953.0", + "@aws-sdk/types": "3.953.0", + "@aws-sdk/util-endpoints": "3.953.0", + "@aws-sdk/util-user-agent-browser": "3.953.0", + "@aws-sdk/util-user-agent-node": "3.954.0", + "@smithy/config-resolver": "^4.4.4", + "@smithy/core": "^3.19.0", + "@smithy/fetch-http-handler": "^5.3.7", + "@smithy/hash-node": "^4.2.6", + "@smithy/invalid-dependency": "^4.2.6", + "@smithy/middleware-content-length": "^4.2.6", + "@smithy/middleware-endpoint": "^4.4.0", + "@smithy/middleware-retry": "^4.4.16", + "@smithy/middleware-serde": "^4.2.7", + "@smithy/middleware-stack": "^4.2.6", + "@smithy/node-config-provider": "^4.3.6", + "@smithy/node-http-handler": "^4.4.6", + "@smithy/protocol-http": "^5.3.6", + "@smithy/smithy-client": "^4.10.1", + "@smithy/types": "^4.10.0", + "@smithy/url-parser": "^4.2.6", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.15", + "@smithy/util-defaults-mode-node": "^4.2.18", + "@smithy/util-endpoints": "^3.2.6", + "@smithy/util-middleware": "^4.2.6", + "@smithy/util-retry": "^4.2.6", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "scripts/utilities/supplier-data/node_modules/@aws-sdk/core": { + "version": "3.954.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.954.0.tgz", + "integrity": "sha512-5oYO5RP+mvCNXNj8XnF9jZo0EP0LTseYOJVNQYcii1D9DJqzHL3HJWurYh7cXxz7G7eDyvVYA01O9Xpt34TdoA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.953.0", + "@aws-sdk/xml-builder": "3.953.0", + "@smithy/core": "^3.19.0", + "@smithy/node-config-provider": "^4.3.6", + "@smithy/property-provider": "^4.2.6", + "@smithy/protocol-http": "^5.3.6", + "@smithy/signature-v4": "^5.3.6", + "@smithy/smithy-client": "^4.10.1", + "@smithy/types": "^4.10.0", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-middleware": "^4.2.6", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "scripts/utilities/supplier-data/node_modules/@aws-sdk/credential-provider-env": { + "version": "3.954.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.954.0.tgz", + "integrity": "sha512-2HNkqBjfsvyoRuPAiFh86JBFMFyaCNhL4VyH6XqwTGKZffjG7hdBmzXPy7AT7G3oFh1k/1Zc27v0qxaKoK7mBA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.954.0", + "@aws-sdk/types": "3.953.0", + "@smithy/property-provider": "^4.2.6", + "@smithy/types": "^4.10.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "scripts/utilities/supplier-data/node_modules/@aws-sdk/credential-provider-http": { + "version": "3.954.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.954.0.tgz", + "integrity": "sha512-CrWD5300+NE1OYRnSVDxoG7G0b5cLIZb7yp+rNQ5Jq/kqnTmyJXpVAsivq+bQIDaGzPXhadzpAMIoo7K/aHaag==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.954.0", + "@aws-sdk/types": "3.953.0", + "@smithy/fetch-http-handler": "^5.3.7", + "@smithy/node-http-handler": "^4.4.6", + "@smithy/property-provider": "^4.2.6", + "@smithy/protocol-http": "^5.3.6", + "@smithy/smithy-client": "^4.10.1", + "@smithy/types": "^4.10.0", + "@smithy/util-stream": "^4.5.7", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "scripts/utilities/supplier-data/node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.954.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.954.0.tgz", + "integrity": "sha512-WAFD8pVwRSoBsuXcoD+s/hrdsP9Z0PNUedSgkOGExuJVAabpM2cIIMzYNsdHio9XFZUSqHkv8mF5mQXuIZvuzg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.954.0", + "@aws-sdk/credential-provider-env": "3.954.0", + "@aws-sdk/credential-provider-http": "3.954.0", + "@aws-sdk/credential-provider-login": "3.954.0", + "@aws-sdk/credential-provider-process": "3.954.0", + "@aws-sdk/credential-provider-sso": "3.954.0", + "@aws-sdk/credential-provider-web-identity": "3.954.0", + "@aws-sdk/nested-clients": "3.954.0", + "@aws-sdk/types": "3.953.0", + "@smithy/credential-provider-imds": "^4.2.6", + "@smithy/property-provider": "^4.2.6", + "@smithy/shared-ini-file-loader": "^4.4.1", + "@smithy/types": "^4.10.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "scripts/utilities/supplier-data/node_modules/@aws-sdk/credential-provider-node": { + "version": "3.954.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.954.0.tgz", + "integrity": "sha512-UPBjw7Lnly5i+/rES8Z5U+nPaumzEUYOE/wrHkxyH6JjwFWn8w7R07fE5Z5cgYlIq1U1lQ7sxYwB3wHPpQ65Aw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.954.0", + "@aws-sdk/credential-provider-http": "3.954.0", + "@aws-sdk/credential-provider-ini": "3.954.0", + "@aws-sdk/credential-provider-process": "3.954.0", + "@aws-sdk/credential-provider-sso": "3.954.0", + "@aws-sdk/credential-provider-web-identity": "3.954.0", + "@aws-sdk/types": "3.953.0", + "@smithy/credential-provider-imds": "^4.2.6", + "@smithy/property-provider": "^4.2.6", + "@smithy/shared-ini-file-loader": "^4.4.1", + "@smithy/types": "^4.10.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "scripts/utilities/supplier-data/node_modules/@aws-sdk/credential-provider-process": { + "version": "3.954.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.954.0.tgz", + "integrity": "sha512-Y1/0O2LgbKM8iIgcVj/GNEQW6p90LVTCOzF2CI1pouoKqxmZ/1F7F66WHoa6XUOfKaCRj/R6nuMR3om9ThaM5A==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.954.0", + "@aws-sdk/types": "3.953.0", + "@smithy/property-provider": "^4.2.6", + "@smithy/shared-ini-file-loader": "^4.4.1", + "@smithy/types": "^4.10.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "scripts/utilities/supplier-data/node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.954.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.954.0.tgz", + "integrity": "sha512-UXxGfkp/plFRdyidMLvNul5zoLKmHhVQOCrD2OgR/lg9jNqNmJ7abF+Qu8abo902iDkhU21Qj4M398cx6l8Kng==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/client-sso": "3.954.0", + "@aws-sdk/core": "3.954.0", + "@aws-sdk/token-providers": "3.954.0", + "@aws-sdk/types": "3.953.0", + "@smithy/property-provider": "^4.2.6", + "@smithy/shared-ini-file-loader": "^4.4.1", + "@smithy/types": "^4.10.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "scripts/utilities/supplier-data/node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.954.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.954.0.tgz", + "integrity": "sha512-XEyf1T08q1tG4zkTS4Dnf1cAQyrJUo/xlvi6XNpqGhY3bOmKUYE2h/K6eITIdytDL9VuCpWYQ6YRcIVtL29E0w==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.954.0", + "@aws-sdk/nested-clients": "3.954.0", + "@aws-sdk/types": "3.953.0", + "@smithy/property-provider": "^4.2.6", + "@smithy/shared-ini-file-loader": "^4.4.1", + "@smithy/types": "^4.10.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "scripts/utilities/supplier-data/node_modules/@aws-sdk/dynamodb-codec": { + "version": "3.954.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/dynamodb-codec/-/dynamodb-codec-3.954.0.tgz", + "integrity": "sha512-fNY0L1l9e36pLJef4NY5k7Q1SJnm5rgLSxSRPT8xL+bhQBtEn2E2t4JdBiTqlxgeyuOrafWOawbg8yS3pRPcLw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.954.0", + "@smithy/core": "^3.19.0", + "@smithy/smithy-client": "^4.10.1", + "@smithy/types": "^4.10.0", + "@smithy/util-base64": "^4.3.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-dynamodb": "^3.954.0" + } + }, + "scripts/utilities/supplier-data/node_modules/@aws-sdk/endpoint-cache": { + "version": "3.953.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/endpoint-cache/-/endpoint-cache-3.953.0.tgz", + "integrity": "sha512-pz67DoHk5WNmvMuyNDiomUS2xo0mq6Z3TdfLJZlWVbSKi3h8hYxVQchJ2kzgTr6wu6zt3UBbtKV9yY1IBhKMVA==", + "license": "Apache-2.0", + "dependencies": { + "mnemonist": "0.38.3", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "scripts/utilities/supplier-data/node_modules/@aws-sdk/lib-dynamodb": { + "version": "3.954.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/lib-dynamodb/-/lib-dynamodb-3.954.0.tgz", + "integrity": "sha512-DBEzAW7WfvNy6bQ32TfpvuFSVewj5eE8O1sTQWfvylNSZu81u6sPwb+eHPEclbvC84zAANl72JnkETOIkL4r8g==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.954.0", + "@aws-sdk/util-dynamodb": "3.954.0", + "@smithy/core": "^3.19.0", + "@smithy/smithy-client": "^4.10.1", + "@smithy/types": "^4.10.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-dynamodb": "^3.954.0" + } + }, + "scripts/utilities/supplier-data/node_modules/@aws-sdk/middleware-endpoint-discovery": { + "version": "3.953.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-endpoint-discovery/-/middleware-endpoint-discovery-3.953.0.tgz", + "integrity": "sha512-/YKB1/OiWr7TwOfmkqzv8x1xgOpU71yciQTfsq6erB3dTQhdukPADt/CMJOhWFKC6Q1D5cDN8381nsGmnNuBVg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/endpoint-cache": "3.953.0", + "@aws-sdk/types": "3.953.0", + "@smithy/node-config-provider": "^4.3.6", + "@smithy/protocol-http": "^5.3.6", + "@smithy/types": "^4.10.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "scripts/utilities/supplier-data/node_modules/@aws-sdk/middleware-host-header": { + "version": "3.953.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.953.0.tgz", + "integrity": "sha512-jTGhfkONav+r4E6HLOrl5SzBqDmPByUYCkyB/c/3TVb8jX3wAZx8/q9bphKpCh+G5ARi3IdbSisgkZrJYqQ19Q==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.953.0", + "@smithy/protocol-http": "^5.3.6", + "@smithy/types": "^4.10.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "scripts/utilities/supplier-data/node_modules/@aws-sdk/middleware-logger": { + "version": "3.953.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.953.0.tgz", + "integrity": "sha512-PlWdVYgcuptkIC0ZKqVUhWNtSHXJSx7U9V8J7dJjRmsXC40X7zpEycvrkzDMJjeTDGcCceYbyYAg/4X1lkcIMw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.953.0", + "@smithy/types": "^4.10.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "scripts/utilities/supplier-data/node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.953.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.953.0.tgz", + "integrity": "sha512-cmIJx0gWeesUKK4YwgE+VQL3mpACr3/J24fbwnc1Z5tntC86b+HQFzU5vsBDw6lLwyD46dBgWdsXFh1jL+ZaFw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.953.0", + "@aws/lambda-invoke-store": "^0.2.2", + "@smithy/protocol-http": "^5.3.6", + "@smithy/types": "^4.10.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "scripts/utilities/supplier-data/node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.954.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.954.0.tgz", + "integrity": "sha512-5PX8JDe3dB2+MqXeGIhmgFnm2rbVsSxhz+Xyuu1oxLtbOn+a9UDA+sNBufEBjt3UxWy5qwEEY1fxdbXXayjlGg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.954.0", + "@aws-sdk/types": "3.953.0", + "@aws-sdk/util-endpoints": "3.953.0", + "@smithy/core": "^3.19.0", + "@smithy/protocol-http": "^5.3.6", + "@smithy/types": "^4.10.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "scripts/utilities/supplier-data/node_modules/@aws-sdk/nested-clients": { + "version": "3.954.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.954.0.tgz", + "integrity": "sha512-JLUhf35fTQIDPLk6G5KPggL9tV//Hjhy6+N2zZeis76LuBRNhKDq8z1CFyKhjf00vXi/tDYdn9D7y9emI+5Y/g==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.954.0", + "@aws-sdk/middleware-host-header": "3.953.0", + "@aws-sdk/middleware-logger": "3.953.0", + "@aws-sdk/middleware-recursion-detection": "3.953.0", + "@aws-sdk/middleware-user-agent": "3.954.0", + "@aws-sdk/region-config-resolver": "3.953.0", + "@aws-sdk/types": "3.953.0", + "@aws-sdk/util-endpoints": "3.953.0", + "@aws-sdk/util-user-agent-browser": "3.953.0", + "@aws-sdk/util-user-agent-node": "3.954.0", + "@smithy/config-resolver": "^4.4.4", + "@smithy/core": "^3.19.0", + "@smithy/fetch-http-handler": "^5.3.7", + "@smithy/hash-node": "^4.2.6", + "@smithy/invalid-dependency": "^4.2.6", + "@smithy/middleware-content-length": "^4.2.6", + "@smithy/middleware-endpoint": "^4.4.0", + "@smithy/middleware-retry": "^4.4.16", + "@smithy/middleware-serde": "^4.2.7", + "@smithy/middleware-stack": "^4.2.6", + "@smithy/node-config-provider": "^4.3.6", + "@smithy/node-http-handler": "^4.4.6", + "@smithy/protocol-http": "^5.3.6", + "@smithy/smithy-client": "^4.10.1", + "@smithy/types": "^4.10.0", + "@smithy/url-parser": "^4.2.6", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.15", + "@smithy/util-defaults-mode-node": "^4.2.18", + "@smithy/util-endpoints": "^3.2.6", + "@smithy/util-middleware": "^4.2.6", + "@smithy/util-retry": "^4.2.6", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "scripts/utilities/supplier-data/node_modules/@aws-sdk/region-config-resolver": { + "version": "3.953.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.953.0.tgz", + "integrity": "sha512-5MJgnsc+HLO+le0EK1cy92yrC7kyhGZSpaq8PcQvKs9qtXCXT5Tb6tMdkr5Y07JxYsYOV1omWBynvL6PWh08tQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.953.0", + "@smithy/config-resolver": "^4.4.4", + "@smithy/node-config-provider": "^4.3.6", + "@smithy/types": "^4.10.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "scripts/utilities/supplier-data/node_modules/@aws-sdk/token-providers": { + "version": "3.954.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.954.0.tgz", + "integrity": "sha512-rDyN3oQQKMOJgyQ9/LNbh4fAGAj8ePMGOAQzSP/kyzizmViI6STpBW1o/VRqiTgMNi1bvA9ZasDtfrJqcVt0iA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.954.0", + "@aws-sdk/nested-clients": "3.954.0", + "@aws-sdk/types": "3.953.0", + "@smithy/property-provider": "^4.2.6", + "@smithy/shared-ini-file-loader": "^4.4.1", + "@smithy/types": "^4.10.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "scripts/utilities/supplier-data/node_modules/@aws-sdk/types": { + "version": "3.953.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.953.0.tgz", + "integrity": "sha512-M9Iwg9kTyqTErI0vOTVVpcnTHWzS3VplQppy8MuL02EE+mJ0BIwpWfsaAPQW+/XnVpdNpWZTsHcNE29f1+hR8g==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.10.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "scripts/utilities/supplier-data/node_modules/@aws-sdk/util-dynamodb": { + "version": "3.954.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-dynamodb/-/util-dynamodb-3.954.0.tgz", + "integrity": "sha512-PXjS9P98OMMVXl4ledr/nTHGmNx6oF2rqTBvSQKKWi8dB4mcHjSaU5ASsklQC944xLs1IGsUkrJ39vu7bEqLoA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "@aws-sdk/client-dynamodb": "^3.954.0" + } + }, + "scripts/utilities/supplier-data/node_modules/@aws-sdk/util-endpoints": { + "version": "3.953.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.953.0.tgz", + "integrity": "sha512-rjaS6jrFksopXvNg6YeN+D1lYwhcByORNlFuYesFvaQNtPOufbE5tJL4GJ3TMXyaY0uFR28N5BHHITPyWWfH/g==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.953.0", + "@smithy/types": "^4.10.0", + "@smithy/url-parser": "^4.2.6", + "@smithy/util-endpoints": "^3.2.6", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "scripts/utilities/supplier-data/node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.953.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.953.0.tgz", + "integrity": "sha512-UF5NeqYesWuFao+u7LJvpV1SJCaLml5BtFZKUdTnNNMeN6jvV+dW/eQoFGpXF94RCqguX0XESmRuRRPQp+/rzQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.953.0", + "@smithy/types": "^4.10.0", + "bowser": "^2.11.0", + "tslib": "^2.6.2" + } + }, + "scripts/utilities/supplier-data/node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.954.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.954.0.tgz", + "integrity": "sha512-fB5S5VOu7OFkeNzcblQlez4AjO5hgDFaa7phYt7716YWisY3RjAaQPlxgv+G3GltHHDJIfzEC5aRxdf62B9zMg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/middleware-user-agent": "3.954.0", + "@aws-sdk/types": "3.953.0", + "@smithy/node-config-provider": "^4.3.6", + "@smithy/types": "^4.10.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "aws-crt": ">=1.0.0" + }, + "peerDependenciesMeta": { + "aws-crt": { + "optional": true + } + } + }, + "scripts/utilities/supplier-data/node_modules/@aws-sdk/xml-builder": { + "version": "3.953.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.953.0.tgz", + "integrity": "sha512-Zmrj21jQ2OeOJGr9spPiN00aQvXa/WUqRXcTVENhrMt+OFoSOfDFpYhUj9NQ09QmQ8KMWFoWuWW6iKurNqLvAA==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.10.0", + "fast-xml-parser": "5.2.5", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "scripts/utilities/supplier-data/node_modules/@aws/lambda-invoke-store": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@aws/lambda-invoke-store/-/lambda-invoke-store-0.2.2.tgz", + "integrity": "sha512-C0NBLsIqzDIae8HFw9YIrIBsbc0xTiOtt7fAukGPnqQ/+zZNaq+4jhuccltK0QuWHBnNm/a6kLIRA6GFiM10eg==", + "license": "Apache-2.0", + "engines": { + "node": ">=18.0.0" + } + }, + "scripts/utilities/supplier-data/node_modules/@smithy/util-waiter": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-4.2.6.tgz", + "integrity": "sha512-xU9HwUSik9UUCJmm530yvBy0AwlQFICveKmqvaaTukKkXEAhyiBdHtSrhPrH3rH+uz0ykyaE3LdgsX86C6mDCQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/abort-controller": "^4.2.6", + "@smithy/types": "^4.10.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, "scripts/utilities/supplier-data/node_modules/cliui": { "version": "8.0.1", "license": "ISC", diff --git a/scripts/utilities/supplier-data/package.json b/scripts/utilities/supplier-data/package.json index 0d3b48e9..ebeb6a55 100644 --- a/scripts/utilities/supplier-data/package.json +++ b/scripts/utilities/supplier-data/package.json @@ -1,7 +1,7 @@ { "dependencies": { - "@aws-sdk/client-dynamodb": "^3.858.0", - "@aws-sdk/lib-dynamodb": "^3.858.0", + "@aws-sdk/client-dynamodb": "^3.954.0", + "@aws-sdk/lib-dynamodb": "^3.954.0", "@internal/datastore": "*", "esbuild": "^0.25.11", "pino": "^9.7.0", diff --git a/scripts/utilities/supplier-data/src/cli/index.ts b/scripts/utilities/supplier-data/src/cli/index.ts index 0b5be186..cc60ae5e 100644 --- a/scripts/utilities/supplier-data/src/cli/index.ts +++ b/scripts/utilities/supplier-data/src/cli/index.ts @@ -1,7 +1,5 @@ import { hideBin } from "yargs/helpers"; import yargs from "yargs"; -import { LetterStatusType } from "@internal/datastore/src/types"; -import { randomUUID } from "node:crypto"; import { createSupplierRepository } from "../infrastructure/suppliers-repo-factory"; async function main() { diff --git a/scripts/utilities/supplier-data/src/infrastructure/suppliers-repo-factory.ts b/scripts/utilities/supplier-data/src/infrastructure/suppliers-repo-factory.ts index a37e2b5d..59ce4c3a 100644 --- a/scripts/utilities/supplier-data/src/infrastructure/suppliers-repo-factory.ts +++ b/scripts/utilities/supplier-data/src/infrastructure/suppliers-repo-factory.ts @@ -3,7 +3,7 @@ import { DynamoDBDocumentClient } from "@aws-sdk/lib-dynamodb"; import { pino } from "pino"; import { SupplierRepository } from "@internal/datastore"; -export function createSupplierRepository( +export default function createSupplierRepository( environment: string, ): SupplierRepository { const ddbClient = new DynamoDBClient({}); From 52d01635bcb12cbe4eefddd2bfdfad7d845cac60 Mon Sep 17 00:00:00 2001 From: David Wass Date: Thu, 18 Dec 2025 13:53:19 +0000 Subject: [PATCH 05/20] general tidyup --- docs/package.json | 1 + internal/datastore/.eslintignore | 1 - internal/events/tsconfig.json | 3 ++- lambdas/api-handler/.eslintignore | 1 - lambdas/authorizer/.eslintignore | 1 - lambdas/letter-updates-transformer/.eslintignore | 1 - lambdas/upsert-letter/.eslintignore | 1 - scripts/utilities/letter-test-data/.eslintignore | 1 - scripts/utilities/supplier-data/.eslintignore | 1 - 9 files changed, 3 insertions(+), 8 deletions(-) delete mode 100644 internal/datastore/.eslintignore delete mode 100644 lambdas/api-handler/.eslintignore delete mode 100644 lambdas/authorizer/.eslintignore delete mode 100644 lambdas/letter-updates-transformer/.eslintignore delete mode 100644 lambdas/upsert-letter/.eslintignore delete mode 100644 scripts/utilities/letter-test-data/.eslintignore delete mode 100644 scripts/utilities/supplier-data/.eslintignore diff --git a/docs/package.json b/docs/package.json index 2f2d699b..c694856e 100644 --- a/docs/package.json +++ b/docs/package.json @@ -14,6 +14,7 @@ "build": "JEKYLL_ENV=production bundle exec jekyll build --trace --config _config.yml,_config.version.yml", "debug": "JEKYLL_ENV=development BUNDLE_GEMFILE=Gemfile bundle exec jekyll serve --config _config.yml,_config.dev.yml,_config.version.yml --limit_posts 100 --trace", "generate-includes": "./generate-includes.sh", + "lint": "echo \"Documentation module has no code to lint\"", "test:unit": "echo \"Documentation module has no unit tests\"", "typecheck": "echo \"Documentation module has no typescript to typecheck\"" }, diff --git a/internal/datastore/.eslintignore b/internal/datastore/.eslintignore deleted file mode 100644 index 1521c8b7..00000000 --- a/internal/datastore/.eslintignore +++ /dev/null @@ -1 +0,0 @@ -dist diff --git a/internal/events/tsconfig.json b/internal/events/tsconfig.json index fa5c2949..a9b1c7ab 100644 --- a/internal/events/tsconfig.json +++ b/internal/events/tsconfig.json @@ -14,6 +14,7 @@ "extends": "../../tsconfig.base.json", "include": [ "src/**/*", - "package.json" + "package.json", + "jest.config.ts" ] } diff --git a/lambdas/api-handler/.eslintignore b/lambdas/api-handler/.eslintignore deleted file mode 100644 index 1521c8b7..00000000 --- a/lambdas/api-handler/.eslintignore +++ /dev/null @@ -1 +0,0 @@ -dist diff --git a/lambdas/authorizer/.eslintignore b/lambdas/authorizer/.eslintignore deleted file mode 100644 index 1521c8b7..00000000 --- a/lambdas/authorizer/.eslintignore +++ /dev/null @@ -1 +0,0 @@ -dist diff --git a/lambdas/letter-updates-transformer/.eslintignore b/lambdas/letter-updates-transformer/.eslintignore deleted file mode 100644 index 1521c8b7..00000000 --- a/lambdas/letter-updates-transformer/.eslintignore +++ /dev/null @@ -1 +0,0 @@ -dist diff --git a/lambdas/upsert-letter/.eslintignore b/lambdas/upsert-letter/.eslintignore deleted file mode 100644 index 1521c8b7..00000000 --- a/lambdas/upsert-letter/.eslintignore +++ /dev/null @@ -1 +0,0 @@ -dist diff --git a/scripts/utilities/letter-test-data/.eslintignore b/scripts/utilities/letter-test-data/.eslintignore deleted file mode 100644 index 1521c8b7..00000000 --- a/scripts/utilities/letter-test-data/.eslintignore +++ /dev/null @@ -1 +0,0 @@ -dist diff --git a/scripts/utilities/supplier-data/.eslintignore b/scripts/utilities/supplier-data/.eslintignore deleted file mode 100644 index 1521c8b7..00000000 --- a/scripts/utilities/supplier-data/.eslintignore +++ /dev/null @@ -1 +0,0 @@ -dist From 8c0b17b8e241ad5780737ac3784f19b310022f1d Mon Sep 17 00:00:00 2001 From: David Wass Date: Thu, 18 Dec 2025 14:48:13 +0000 Subject: [PATCH 06/20] aws-lanbda install --- lambdas/authorizer/package.json | 2 ++ lambdas/upsert-letter/package.json | 2 ++ package-lock.json | 22 ++++------------------ 3 files changed, 8 insertions(+), 18 deletions(-) diff --git a/lambdas/authorizer/package.json b/lambdas/authorizer/package.json index 76c674c5..55e7586c 100644 --- a/lambdas/authorizer/package.json +++ b/lambdas/authorizer/package.json @@ -3,6 +3,8 @@ "@aws-sdk/client-dynamodb": "^3.858.0", "@aws-sdk/lib-dynamodb": "^3.858.0", "@internal/datastore": "*", + "@types/aws-lambda": "^8.10.148", + "aws-lambda": "^1.0.7", "esbuild": "^0.25.11", "pino": "^9.7.0", "zod": "^4.1.11" diff --git a/lambdas/upsert-letter/package.json b/lambdas/upsert-letter/package.json index 9444e714..3770b763 100644 --- a/lambdas/upsert-letter/package.json +++ b/lambdas/upsert-letter/package.json @@ -1,5 +1,7 @@ { "dependencies": { + "@types/aws-lambda": "^8.10.148", + "aws-lambda": "^1.0.7", "esbuild": "^0.24.0" }, "devDependencies": { diff --git a/package-lock.json b/package-lock.json index 1820e45f..6965c05a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -221,6 +221,8 @@ "@aws-sdk/client-dynamodb": "^3.858.0", "@aws-sdk/lib-dynamodb": "^3.858.0", "@internal/datastore": "*", + "@types/aws-lambda": "^8.10.148", + "aws-lambda": "^1.0.7", "esbuild": "^0.25.11", "pino": "^9.7.0", "zod": "^4.1.11" @@ -1181,6 +1183,8 @@ "name": "nhs-notify-supplier-api-upsert-letter", "version": "0.0.1", "dependencies": { + "@types/aws-lambda": "^8.10.148", + "aws-lambda": "^1.0.7", "esbuild": "^0.24.0" }, "devDependencies": { @@ -23256,15 +23260,6 @@ "node": ">=18.0.0" } }, - "scripts/utilities/letter-test-data/node_modules/@aws/lambda-invoke-store": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/@aws/lambda-invoke-store/-/lambda-invoke-store-0.2.2.tgz", - "integrity": "sha512-C0NBLsIqzDIae8HFw9YIrIBsbc0xTiOtt7fAukGPnqQ/+zZNaq+4jhuccltK0QuWHBnNm/a6kLIRA6GFiM10eg==", - "license": "Apache-2.0", - "engines": { - "node": ">=18.0.0" - } - }, "scripts/utilities/letter-test-data/node_modules/@smithy/util-waiter": { "version": "4.2.6", "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-4.2.6.tgz", @@ -23958,15 +23953,6 @@ "node": ">=18.0.0" } }, - "scripts/utilities/supplier-data/node_modules/@aws/lambda-invoke-store": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/@aws/lambda-invoke-store/-/lambda-invoke-store-0.2.2.tgz", - "integrity": "sha512-C0NBLsIqzDIae8HFw9YIrIBsbc0xTiOtt7fAukGPnqQ/+zZNaq+4jhuccltK0QuWHBnNm/a6kLIRA6GFiM10eg==", - "license": "Apache-2.0", - "engines": { - "node": ">=18.0.0" - } - }, "scripts/utilities/supplier-data/node_modules/@smithy/util-waiter": { "version": "4.2.6", "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-4.2.6.tgz", From a6f910dee229d5d794a4d6c5104f7efc2448d3f1 Mon Sep 17 00:00:00 2001 From: David Wass Date: Thu, 18 Dec 2025 15:50:20 +0000 Subject: [PATCH 07/20] Update event schema version From d168562e6925301bc441a7765c131e001fb885fd Mon Sep 17 00:00:00 2001 From: David Wass Date: Fri, 19 Dec 2025 10:36:39 +0000 Subject: [PATCH 08/20] fix tests --- .../helpers/create-letter-helpers.test.ts | 4 +- .../src/__test__/helpers/s3-helpers.test.ts | 87 +++++++++++++++++++ .../src/helpers/create-letter-helpers.ts | 2 +- 3 files changed, 90 insertions(+), 3 deletions(-) create mode 100644 scripts/utilities/letter-test-data/src/__test__/helpers/s3-helpers.test.ts diff --git a/scripts/utilities/letter-test-data/src/__test__/helpers/create-letter-helpers.test.ts b/scripts/utilities/letter-test-data/src/__test__/helpers/create-letter-helpers.test.ts index c63dfe61..36217a5c 100644 --- a/scripts/utilities/letter-test-data/src/__test__/helpers/create-letter-helpers.test.ts +++ b/scripts/utilities/letter-test-data/src/__test__/helpers/create-letter-helpers.test.ts @@ -4,9 +4,9 @@ import { createLetter, createLetterDto, } from "../../helpers/create-letter-helpers"; -import { uploadFile } from "../../helpers/s3-helpers"; +import uploadFile from "../../helpers/s3-helpers"; -jest.mock("../../helpers/s3_helpers"); +jest.mock("../../helpers/s3-helpers"); describe("Create letter helpers", () => { beforeEach(() => { diff --git a/scripts/utilities/letter-test-data/src/__test__/helpers/s3-helpers.test.ts b/scripts/utilities/letter-test-data/src/__test__/helpers/s3-helpers.test.ts new file mode 100644 index 00000000..22e56cd5 --- /dev/null +++ b/scripts/utilities/letter-test-data/src/__test__/helpers/s3-helpers.test.ts @@ -0,0 +1,87 @@ +/** + * Unit tests for s3-helpers.ts + * + * Mocks: + * - @aws-sdk/client-s3: S3Client (with send) and PutObjectCommand + * - node:fs.readFileSync to avoid touching the filesystem + */ + +import * as s3Module from "@aws-sdk/client-s3"; +import uploadFile from "../../helpers/s3-helpers"; + +jest.mock("@aws-sdk/client-s3", () => { + const sendMock = jest.fn(); + class PutObjectCommand { + input: any; + + constructor(input: any) { + this.input = input; + } + } + const S3Client = jest.fn().mockImplementation(() => ({ send: sendMock })); + return { + S3Client, + PutObjectCommand, + __sendMock: sendMock, + __esModule: true, + }; +}); + +jest.mock("node:fs", () => ({ + readFileSync: jest.fn().mockReturnValue(Buffer.from("fake-pdf-bytes")), +})); + +describe("uploadFile", () => { + const bucket = "my-bucket"; + const supplierId = "supplier-1"; + const sourceFilename = "some.pdf"; + const targetFilename = "target.pdf"; + + beforeEach(() => { + jest.clearAllMocks(); + }); + + it("calls S3Client.send with a PutObjectCommand containing correct params", async () => { + const sendMock = (s3Module as any).__sendMock as jest.Mock; + sendMock.mockResolvedValue({ ETag: '"etag-value"' }); + + await expect( + uploadFile(bucket, supplierId, sourceFilename, targetFilename), + ).resolves.toBeDefined(); + + // S3Client is a mocked constructor — grab the instance that was created + const S3ClientMock = (s3Module as any).S3Client as jest.Mock; + expect(S3ClientMock).toHaveBeenCalled(); + + const instance = S3ClientMock.mock.results[0].value; + expect(instance.send).toHaveBeenCalledTimes(1); + + const calledWith = instance.send.mock.calls[0][0]; + // The mocked PutObjectCommand stores input as `input` property + expect(calledWith).toHaveProperty("input"); + expect(calledWith.input).toEqual({ + Bucket: bucket, + Key: `${supplierId}/${targetFilename}`, + Body: Buffer.from("fake-pdf-bytes"), + ContentType: "application/pdf", + }); + }); + + it("logs and rethrows when S3Client.send rejects", async () => { + const sendMock = (s3Module as any).__sendMock as jest.Mock; + const err = new Error("upload-failed"); + sendMock.mockRejectedValueOnce(err); + + const consoleSpy = jest + .spyOn(console, "error") + .mockImplementation(() => {}); + + await expect( + uploadFile(bucket, supplierId, sourceFilename, targetFilename), + ).rejects.toThrow("upload-failed"); + + expect(consoleSpy).toHaveBeenCalledWith("Error uploading file:", err); + + consoleSpy.mockRestore(); + }); +}); diff --git a/scripts/utilities/letter-test-data/src/helpers/create-letter-helpers.ts b/scripts/utilities/letter-test-data/src/helpers/create-letter-helpers.ts index c04b7ee9..827c6801 100644 --- a/scripts/utilities/letter-test-data/src/helpers/create-letter-helpers.ts +++ b/scripts/utilities/letter-test-data/src/helpers/create-letter-helpers.ts @@ -3,7 +3,7 @@ import { LetterRepository, LetterStatusType, } from "@internal/datastore"; -import { uploadFile } from "./s3-helpers"; +import uploadFile from "./s3-helpers"; export async function createLetter(params: { letterId: string; From 7379e102f3bf0a953fb9311f6d1ce4e6c1325af1 Mon Sep 17 00:00:00 2001 From: Mark Slowey Date: Wed, 24 Dec 2025 11:06:01 +0000 Subject: [PATCH 09/20] CI typecheck and lint --- .github/workflows/stage-1-commit.yaml | 50 +++++++++++++++++++++++++++ docs/package.json | 2 +- 2 files changed, 51 insertions(+), 1 deletion(-) diff --git a/.github/workflows/stage-1-commit.yaml b/.github/workflows/stage-1-commit.yaml index 4d9d5b14..a3f1dd78 100644 --- a/.github/workflows/stage-1-commit.yaml +++ b/.github/workflows/stage-1-commit.yaml @@ -150,6 +150,56 @@ jobs: uses: actions/checkout@v5 - name: "Lint Terraform" uses: ./.github/actions/lint-terraform + + detect-typescript-changes: + name: "Detect TypeScript Changes" + runs-on: ubuntu-latest + outputs: + typescript_changed: ${{ steps.check.outputs.typescript_changed }} + steps: + - name: "Checkout code" + uses: actions/checkout@v5 + + - name: "Check for TypeScript changes" + id: check + run: | + git fetch origin main || true # Ensure you have the latest main branch + CHANGED_FILES=$(git diff --name-only HEAD origin/main) + echo "Changed files: $CHANGED_FILES" + + if echo "$CHANGED_FILES" | grep -qE '\.ts$'; then + echo "Typescript files have changed." + echo "typescript_changed=true" >> $GITHUB_OUTPUT + else + echo "No Typescript changes detected." + echo "typescript_changed=false" >> $GITHUB_OUTPUT + fi + typecheck-typescript: + name: "Typecheck TypeScript" + runs-on: ubuntu-latest + timeout-minutes: 5 + needs: detect-typescript-changes + if: needs.detect-typescript-changes.outputs.typescript_changed == 'true' + steps: + - name: "Checkout code" + uses: actions/checkout@v5 + - name: "Typecheck TypeScript" + run: | + npm run typecheck --workspaces + lint-typescript: + name: "Typecheck TypeScript" + runs-on: ubuntu-latest + timeout-minutes: 5 + needs: detect-typescript-changes + if: needs.detect-typescript-changes.outputs.typescript_changed == 'true' + steps: + - name: "Checkout code" + uses: actions/checkout@v5 + - name: "Typecheck TypeScript" + run: | + npm run lint --workspaces + + trivy-iac: name: "Trivy IaC Scan" permissions: diff --git a/docs/package.json b/docs/package.json index c694856e..c6116a80 100644 --- a/docs/package.json +++ b/docs/package.json @@ -14,7 +14,7 @@ "build": "JEKYLL_ENV=production bundle exec jekyll build --trace --config _config.yml,_config.version.yml", "debug": "JEKYLL_ENV=development BUNDLE_GEMFILE=Gemfile bundle exec jekyll serve --config _config.yml,_config.dev.yml,_config.version.yml --limit_posts 100 --trace", "generate-includes": "./generate-includes.sh", - "lint": "echo \"Documentation module has no code to lint\"", + "lint": "echo \"Documentation module has no typescript to lint\"", "test:unit": "echo \"Documentation module has no unit tests\"", "typecheck": "echo \"Documentation module has no typescript to typecheck\"" }, From 0d1afa80a663dd0cf38b5844cf7ec6c725a66181 Mon Sep 17 00:00:00 2001 From: Mark Slowey Date: Wed, 24 Dec 2025 11:10:03 +0000 Subject: [PATCH 10/20] default perms --- .github/workflows/stage-1-commit.yaml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/stage-1-commit.yaml b/.github/workflows/stage-1-commit.yaml index a3f1dd78..8be84bbd 100644 --- a/.github/workflows/stage-1-commit.yaml +++ b/.github/workflows/stage-1-commit.yaml @@ -36,6 +36,10 @@ on: required: true type: string + +permissions: + contents: read + jobs: scan-secrets: name: "Scan secrets" From d0695328d9b74a5c88537b08febeea8dc718cab2 Mon Sep 17 00:00:00 2001 From: Mark Slowey Date: Wed, 24 Dec 2025 11:11:14 +0000 Subject: [PATCH 11/20] try and make the alerts happy --- .github/workflows/stage-1-commit.yaml | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/.github/workflows/stage-1-commit.yaml b/.github/workflows/stage-1-commit.yaml index 8be84bbd..f9740fb8 100644 --- a/.github/workflows/stage-1-commit.yaml +++ b/.github/workflows/stage-1-commit.yaml @@ -1,5 +1,8 @@ name: "Commit stage" +permissions: + contents: read + on: workflow_call: inputs: @@ -36,10 +39,6 @@ on: required: true type: string - -permissions: - contents: read - jobs: scan-secrets: name: "Scan secrets" From a716450c37430525993ea9e1ae2959f16b892bee Mon Sep 17 00:00:00 2001 From: Mark Slowey Date: Wed, 24 Dec 2025 11:48:05 +0000 Subject: [PATCH 12/20] Revert "CI typecheck and lint" This reverts commit 663ac0a059fa661106db0525420f89d6cd09c390. --- .github/workflows/stage-1-commit.yaml | 50 --------------------------- docs/package.json | 2 +- 2 files changed, 1 insertion(+), 51 deletions(-) diff --git a/.github/workflows/stage-1-commit.yaml b/.github/workflows/stage-1-commit.yaml index f9740fb8..80ad8c8f 100644 --- a/.github/workflows/stage-1-commit.yaml +++ b/.github/workflows/stage-1-commit.yaml @@ -153,56 +153,6 @@ jobs: uses: actions/checkout@v5 - name: "Lint Terraform" uses: ./.github/actions/lint-terraform - - detect-typescript-changes: - name: "Detect TypeScript Changes" - runs-on: ubuntu-latest - outputs: - typescript_changed: ${{ steps.check.outputs.typescript_changed }} - steps: - - name: "Checkout code" - uses: actions/checkout@v5 - - - name: "Check for TypeScript changes" - id: check - run: | - git fetch origin main || true # Ensure you have the latest main branch - CHANGED_FILES=$(git diff --name-only HEAD origin/main) - echo "Changed files: $CHANGED_FILES" - - if echo "$CHANGED_FILES" | grep -qE '\.ts$'; then - echo "Typescript files have changed." - echo "typescript_changed=true" >> $GITHUB_OUTPUT - else - echo "No Typescript changes detected." - echo "typescript_changed=false" >> $GITHUB_OUTPUT - fi - typecheck-typescript: - name: "Typecheck TypeScript" - runs-on: ubuntu-latest - timeout-minutes: 5 - needs: detect-typescript-changes - if: needs.detect-typescript-changes.outputs.typescript_changed == 'true' - steps: - - name: "Checkout code" - uses: actions/checkout@v5 - - name: "Typecheck TypeScript" - run: | - npm run typecheck --workspaces - lint-typescript: - name: "Typecheck TypeScript" - runs-on: ubuntu-latest - timeout-minutes: 5 - needs: detect-typescript-changes - if: needs.detect-typescript-changes.outputs.typescript_changed == 'true' - steps: - - name: "Checkout code" - uses: actions/checkout@v5 - - name: "Typecheck TypeScript" - run: | - npm run lint --workspaces - - trivy-iac: name: "Trivy IaC Scan" permissions: diff --git a/docs/package.json b/docs/package.json index c6116a80..c694856e 100644 --- a/docs/package.json +++ b/docs/package.json @@ -14,7 +14,7 @@ "build": "JEKYLL_ENV=production bundle exec jekyll build --trace --config _config.yml,_config.version.yml", "debug": "JEKYLL_ENV=development BUNDLE_GEMFILE=Gemfile bundle exec jekyll serve --config _config.yml,_config.dev.yml,_config.version.yml --limit_posts 100 --trace", "generate-includes": "./generate-includes.sh", - "lint": "echo \"Documentation module has no typescript to lint\"", + "lint": "echo \"Documentation module has no code to lint\"", "test:unit": "echo \"Documentation module has no unit tests\"", "typecheck": "echo \"Documentation module has no typescript to typecheck\"" }, From 8c1267c6bc93372b5f29634749543baac1b7e9a9 Mon Sep 17 00:00:00 2001 From: Mark Slowey Date: Wed, 24 Dec 2025 11:52:24 +0000 Subject: [PATCH 13/20] test hooks --- scripts/tests/lint.sh | 22 ++++++++++++++++++++++ scripts/tests/typecheck.sh | 22 ++++++++++++++++++++++ 2 files changed, 44 insertions(+) create mode 100755 scripts/tests/lint.sh create mode 100755 scripts/tests/typecheck.sh diff --git a/scripts/tests/lint.sh b/scripts/tests/lint.sh new file mode 100755 index 00000000..2ace8310 --- /dev/null +++ b/scripts/tests/lint.sh @@ -0,0 +1,22 @@ +#!/bin/bash + +set -euo pipefail + +cd "$(git rev-parse --show-toplevel)" + +# This file is for you! Edit it to call your unit test suite. Note that the same +# file will be called if you run it locally as if you run it on CI. + +# Replace the following line with something like: +# +# rails test:unit +# python manage.py test +# npm run test +# +# or whatever is appropriate to your project. You should *only* run your fast +# tests from here. If you want to run other test suites, see the predefined +# tasks in scripts/test.mk. + +# run tests +npm ci +npm run lint --workspaces diff --git a/scripts/tests/typecheck.sh b/scripts/tests/typecheck.sh new file mode 100755 index 00000000..2ed6c2e0 --- /dev/null +++ b/scripts/tests/typecheck.sh @@ -0,0 +1,22 @@ +#!/bin/bash + +set -euo pipefail + +cd "$(git rev-parse --show-toplevel)" + +# This file is for you! Edit it to call your unit test suite. Note that the same +# file will be called if you run it locally as if you run it on CI. + +# Replace the following line with something like: +# +# rails test:unit +# python manage.py test +# npm run test +# +# or whatever is appropriate to your project. You should *only* run your fast +# tests from here. If you want to run other test suites, see the predefined +# tasks in scripts/test.mk. + +# run tests +npm ci +npm run typecheck --workspaces From ce8cb8e3248bc39e0a45ac9aa846d2232f14f99a Mon Sep 17 00:00:00 2001 From: David Wass Date: Thu, 8 Jan 2026 09:25:59 +0000 Subject: [PATCH 14/20] package-lock --- package-lock.json | 1653 +++++++-------------------------------------- 1 file changed, 229 insertions(+), 1424 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6965c05a..643e5426 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6529,12 +6529,12 @@ } }, "node_modules/@smithy/abort-controller": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.2.6.tgz", - "integrity": "sha512-P7JD4J+wxHMpGxqIg6SHno2tPkZbBUBLbPpR5/T1DEUvw/mEaINBMaPFZNM7lA+ToSCZ36j6nMHa+5kej+fhGg==", + "version": "4.2.7", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.2.7.tgz", + "integrity": "sha512-rzMY6CaKx2qxrbYbqjXWS0plqEy7LOdKHS0bg4ixJ6aoGDPNUcLWk/FRNuCILh7GKLG9TFUXYYeQQldMBBwuyw==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.10.0", + "@smithy/types": "^4.11.0", "tslib": "^2.6.2" }, "engines": { @@ -6567,16 +6567,16 @@ } }, "node_modules/@smithy/config-resolver": { - "version": "4.4.4", - "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.4.4.tgz", - "integrity": "sha512-s3U5ChS21DwU54kMmZ0UJumoS5cg0+rGVZvN6f5Lp6EbAVi0ZyP+qDSHdewfmXKUgNK1j3z45JyzulkDukrjAA==", + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.4.5.tgz", + "integrity": "sha512-HAGoUAFYsUkoSckuKbCPayECeMim8pOu+yLy1zOxt1sifzEbrsRpYa+mKcMdiHKMeiqOibyPG0sFJnmaV/OGEg==", "license": "Apache-2.0", "dependencies": { - "@smithy/node-config-provider": "^4.3.6", - "@smithy/types": "^4.10.0", + "@smithy/node-config-provider": "^4.3.7", + "@smithy/types": "^4.11.0", "@smithy/util-config-provider": "^4.2.0", - "@smithy/util-endpoints": "^3.2.6", - "@smithy/util-middleware": "^4.2.6", + "@smithy/util-endpoints": "^3.2.7", + "@smithy/util-middleware": "^4.2.7", "tslib": "^2.6.2" }, "engines": { @@ -6584,18 +6584,18 @@ } }, "node_modules/@smithy/core": { - "version": "3.19.0", - "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.19.0.tgz", - "integrity": "sha512-Y9oHXpBcXQgYHOcAEmxjkDilUbSTkgKjoHYed3WaYUH8jngq8lPWDBSpjHblJ9uOgBdy5mh3pzebrScDdYr29w==", + "version": "3.20.1", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.20.1.tgz", + "integrity": "sha512-wOboSEdQ85dbKAJ0zL+wQ6b0HTSBRhtGa0PYKysQXkRg+vK0tdCRRVruiFM2QMprkOQwSYOnwF4og96PAaEGag==", "license": "Apache-2.0", "dependencies": { - "@smithy/middleware-serde": "^4.2.7", - "@smithy/protocol-http": "^5.3.6", - "@smithy/types": "^4.10.0", + "@smithy/middleware-serde": "^4.2.8", + "@smithy/protocol-http": "^5.3.7", + "@smithy/types": "^4.11.0", "@smithy/util-base64": "^4.3.0", "@smithy/util-body-length-browser": "^4.2.0", - "@smithy/util-middleware": "^4.2.6", - "@smithy/util-stream": "^4.5.7", + "@smithy/util-middleware": "^4.2.7", + "@smithy/util-stream": "^4.5.8", "@smithy/util-utf8": "^4.2.0", "@smithy/uuid": "^1.1.0", "tslib": "^2.6.2" @@ -6605,15 +6605,15 @@ } }, "node_modules/@smithy/credential-provider-imds": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.2.6.tgz", - "integrity": "sha512-xBmawExyTzOjbhzkZwg+vVm/khg28kG+rj2sbGlULjFd1jI70sv/cbpaR0Ev4Yfd6CpDUDRMe64cTqR//wAOyA==", + "version": "4.2.7", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.2.7.tgz", + "integrity": "sha512-CmduWdCiILCRNbQWFR0OcZlUPVtyE49Sr8yYL0rZQ4D/wKxiNzBNS/YHemvnbkIWj623fplgkexUd/c9CAKdoA==", "license": "Apache-2.0", "dependencies": { - "@smithy/node-config-provider": "^4.3.6", - "@smithy/property-provider": "^4.2.6", - "@smithy/types": "^4.10.0", - "@smithy/url-parser": "^4.2.6", + "@smithy/node-config-provider": "^4.3.7", + "@smithy/property-provider": "^4.2.7", + "@smithy/types": "^4.11.0", + "@smithy/url-parser": "^4.2.7", "tslib": "^2.6.2" }, "engines": { @@ -6691,14 +6691,14 @@ } }, "node_modules/@smithy/fetch-http-handler": { - "version": "5.3.7", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.3.7.tgz", - "integrity": "sha512-fcVap4QwqmzQwQK9QU3keeEpCzTjnP9NJ171vI7GnD7nbkAIcP9biZhDUx88uRH9BabSsQDS0unUps88uZvFIQ==", + "version": "5.3.8", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.3.8.tgz", + "integrity": "sha512-h/Fi+o7mti4n8wx1SR6UHWLaakwHRx29sizvp8OOm7iqwKGFneT06GCSFhml6Bha5BT6ot5pj3CYZnCHhGC2Rg==", "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^5.3.6", - "@smithy/querystring-builder": "^4.2.6", - "@smithy/types": "^4.10.0", + "@smithy/protocol-http": "^5.3.7", + "@smithy/querystring-builder": "^4.2.7", + "@smithy/types": "^4.11.0", "@smithy/util-base64": "^4.3.0", "tslib": "^2.6.2" }, @@ -6722,12 +6722,12 @@ } }, "node_modules/@smithy/hash-node": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.2.6.tgz", - "integrity": "sha512-k3Dy9VNR37wfMh2/1RHkFf/e0rMyN0pjY0FdyY6ItJRjENYyVPRMwad6ZR1S9HFm6tTuIOd9pqKBmtJ4VHxvxg==", + "version": "4.2.7", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.2.7.tgz", + "integrity": "sha512-PU/JWLTBCV1c8FtB8tEFnY4eV1tSfBc7bDBADHfn1K+uRbPgSJ9jnJp0hyjiFN2PMdPzxsf1Fdu0eo9fJ760Xw==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.10.0", + "@smithy/types": "^4.11.0", "@smithy/util-buffer-from": "^4.2.0", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" @@ -6751,12 +6751,12 @@ } }, "node_modules/@smithy/invalid-dependency": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.2.6.tgz", - "integrity": "sha512-E4t/V/q2T46RY21fpfznd1iSLTvCXKNKo4zJ1QuEFN4SE9gKfu2vb6bgq35LpufkQ+SETWIC7ZAf2GGvTlBaMQ==", + "version": "4.2.7", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.2.7.tgz", + "integrity": "sha512-ncvgCr9a15nPlkhIUx3CU4d7E7WEuVJOV7fS7nnK2hLtPK9tYRBkMHQbhXU1VvvKeBm/O0x26OEoBq+ngFpOEQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.10.0", + "@smithy/types": "^4.11.0", "tslib": "^2.6.2" }, "engines": { @@ -6790,13 +6790,13 @@ } }, "node_modules/@smithy/middleware-content-length": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.2.6.tgz", - "integrity": "sha512-0cjqjyfj+Gls30ntq45SsBtqF3dfJQCeqQPyGz58Pk8OgrAr5YiB7ZvDzjCA94p4r6DCI4qLm7FKobqBjf515w==", + "version": "4.2.7", + "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.2.7.tgz", + "integrity": "sha512-GszfBfCcvt7kIbJ41LuNa5f0wvQCHhnGx/aDaZJCCT05Ld6x6U2s0xsc/0mBFONBZjQJp2U/0uSJ178OXOwbhg==", "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^5.3.6", - "@smithy/types": "^4.10.0", + "@smithy/protocol-http": "^5.3.7", + "@smithy/types": "^4.11.0", "tslib": "^2.6.2" }, "engines": { @@ -6804,18 +6804,18 @@ } }, "node_modules/@smithy/middleware-endpoint": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.4.0.tgz", - "integrity": "sha512-M6qWfUNny6NFNy8amrCGIb9TfOMUkHVtg9bHtEFGRgfH7A7AtPpn/fcrToGPjVDK1ECuMVvqGQOXcZxmu9K+7A==", + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.4.2.tgz", + "integrity": "sha512-mqpAdux0BNmZu/SqkFhQEnod4fX23xxTvU2LUpmKp0JpSI+kPYCiHJMmzREr8yxbNxKL2/DU1UZm9i++ayU+2g==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.19.0", - "@smithy/middleware-serde": "^4.2.7", - "@smithy/node-config-provider": "^4.3.6", - "@smithy/shared-ini-file-loader": "^4.4.1", - "@smithy/types": "^4.10.0", - "@smithy/url-parser": "^4.2.6", - "@smithy/util-middleware": "^4.2.6", + "@smithy/core": "^3.20.1", + "@smithy/middleware-serde": "^4.2.8", + "@smithy/node-config-provider": "^4.3.7", + "@smithy/shared-ini-file-loader": "^4.4.2", + "@smithy/types": "^4.11.0", + "@smithy/url-parser": "^4.2.7", + "@smithy/util-middleware": "^4.2.7", "tslib": "^2.6.2" }, "engines": { @@ -6823,18 +6823,18 @@ } }, "node_modules/@smithy/middleware-retry": { - "version": "4.4.16", - "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.4.16.tgz", - "integrity": "sha512-XPpNhNRzm3vhYm7YCsyw3AtmWggJbg1wNGAoqb7NBYr5XA5isMRv14jgbYyUV6IvbTBFZQdf2QpeW43LrRdStQ==", + "version": "4.4.18", + "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.4.18.tgz", + "integrity": "sha512-E5hulijA59nBk/zvcwVMaS7FG7Y4l6hWA9vrW018r+8kiZef4/ETQaPI4oY+3zsy9f6KqDv3c4VKtO4DwwgpCg==", "license": "Apache-2.0", "dependencies": { - "@smithy/node-config-provider": "^4.3.6", - "@smithy/protocol-http": "^5.3.6", - "@smithy/service-error-classification": "^4.2.6", - "@smithy/smithy-client": "^4.10.1", - "@smithy/types": "^4.10.0", - "@smithy/util-middleware": "^4.2.6", - "@smithy/util-retry": "^4.2.6", + "@smithy/node-config-provider": "^4.3.7", + "@smithy/protocol-http": "^5.3.7", + "@smithy/service-error-classification": "^4.2.7", + "@smithy/smithy-client": "^4.10.3", + "@smithy/types": "^4.11.0", + "@smithy/util-middleware": "^4.2.7", + "@smithy/util-retry": "^4.2.7", "@smithy/uuid": "^1.1.0", "tslib": "^2.6.2" }, @@ -6843,13 +6843,13 @@ } }, "node_modules/@smithy/middleware-serde": { - "version": "4.2.7", - "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.2.7.tgz", - "integrity": "sha512-PFMVHVPgtFECeu4iZ+4SX6VOQT0+dIpm4jSPLLL6JLSkp9RohGqKBKD0cbiXdeIFS08Forp0UHI6kc0gIHenSA==", + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.2.8.tgz", + "integrity": "sha512-8rDGYen5m5+NV9eHv9ry0sqm2gI6W7mc1VSFMtn6Igo25S507/HaOX9LTHAS2/J32VXD0xSzrY0H5FJtOMS4/w==", "license": "Apache-2.0", "dependencies": { - "@smithy/protocol-http": "^5.3.6", - "@smithy/types": "^4.10.0", + "@smithy/protocol-http": "^5.3.7", + "@smithy/types": "^4.11.0", "tslib": "^2.6.2" }, "engines": { @@ -6857,12 +6857,12 @@ } }, "node_modules/@smithy/middleware-stack": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.2.6.tgz", - "integrity": "sha512-JSbALU3G+JS4kyBZPqnJ3hxIYwOVRV7r9GNQMS6j5VsQDo5+Es5nddLfr9TQlxZLNHPvKSh+XSB0OuWGfSWFcA==", + "version": "4.2.7", + "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.2.7.tgz", + "integrity": "sha512-bsOT0rJ+HHlZd9crHoS37mt8qRRN/h9jRve1SXUhVbkRzu0QaNYZp1i1jha4n098tsvROjcwfLlfvcFuJSXEsw==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.10.0", + "@smithy/types": "^4.11.0", "tslib": "^2.6.2" }, "engines": { @@ -6870,14 +6870,14 @@ } }, "node_modules/@smithy/node-config-provider": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.3.6.tgz", - "integrity": "sha512-fYEyL59Qe82Ha1p97YQTMEQPJYmBS+ux76foqluaTVWoG9Px5J53w6NvXZNE3wP7lIicLDF7Vj1Em18XTX7fsA==", + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.3.7.tgz", + "integrity": "sha512-7r58wq8sdOcrwWe+klL9y3bc4GW1gnlfnFOuL7CXa7UzfhzhxKuzNdtqgzmTV+53lEp9NXh5hY/S4UgjLOzPfw==", "license": "Apache-2.0", "dependencies": { - "@smithy/property-provider": "^4.2.6", - "@smithy/shared-ini-file-loader": "^4.4.1", - "@smithy/types": "^4.10.0", + "@smithy/property-provider": "^4.2.7", + "@smithy/shared-ini-file-loader": "^4.4.2", + "@smithy/types": "^4.11.0", "tslib": "^2.6.2" }, "engines": { @@ -6885,15 +6885,15 @@ } }, "node_modules/@smithy/node-http-handler": { - "version": "4.4.6", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.4.6.tgz", - "integrity": "sha512-Gsb9jf4ido5BhPfani4ggyrKDd3ZK+vTFWmUaZeFg5G3E5nhFmqiTzAIbHqmPs1sARuJawDiGMGR/nY+Gw6+aQ==", + "version": "4.4.7", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.4.7.tgz", + "integrity": "sha512-NELpdmBOO6EpZtWgQiHjoShs1kmweaiNuETUpuup+cmm/xJYjT4eUjfhrXRP4jCOaAsS3c3yPsP3B+K+/fyPCQ==", "license": "Apache-2.0", "dependencies": { - "@smithy/abort-controller": "^4.2.6", - "@smithy/protocol-http": "^5.3.6", - "@smithy/querystring-builder": "^4.2.6", - "@smithy/types": "^4.10.0", + "@smithy/abort-controller": "^4.2.7", + "@smithy/protocol-http": "^5.3.7", + "@smithy/querystring-builder": "^4.2.7", + "@smithy/types": "^4.11.0", "tslib": "^2.6.2" }, "engines": { @@ -6901,12 +6901,12 @@ } }, "node_modules/@smithy/property-provider": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.2.6.tgz", - "integrity": "sha512-a/tGSLPtaia2krbRdwR4xbZKO8lU67DjMk/jfY4QKt4PRlKML+2tL/gmAuhNdFDioO6wOq0sXkfnddNFH9mNUA==", + "version": "4.2.7", + "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.2.7.tgz", + "integrity": "sha512-jmNYKe9MGGPoSl/D7JDDs1C8b3dC8f/w78LbaVfoTtWy4xAd5dfjaFG9c9PWPihY4ggMQNQSMtzU77CNgAJwmA==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.10.0", + "@smithy/types": "^4.11.0", "tslib": "^2.6.2" }, "engines": { @@ -6914,12 +6914,12 @@ } }, "node_modules/@smithy/protocol-http": { - "version": "5.3.6", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.3.6.tgz", - "integrity": "sha512-qLRZzP2+PqhE3OSwvY2jpBbP0WKTZ9opTsn+6IWYI0SKVpbG+imcfNxXPq9fj5XeaUTr7odpsNpK6dmoiM1gJQ==", + "version": "5.3.7", + "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.3.7.tgz", + "integrity": "sha512-1r07pb994I20dD/c2seaZhoCuNYm0rWrvBxhCQ70brNh11M5Ml2ew6qJVo0lclB3jMIXirD4s2XRXRe7QEi0xA==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.10.0", + "@smithy/types": "^4.11.0", "tslib": "^2.6.2" }, "engines": { @@ -6927,12 +6927,12 @@ } }, "node_modules/@smithy/querystring-builder": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.2.6.tgz", - "integrity": "sha512-MeM9fTAiD3HvoInK/aA8mgJaKQDvm8N0dKy6EiFaCfgpovQr4CaOkJC28XqlSRABM+sHdSQXbC8NZ0DShBMHqg==", + "version": "4.2.7", + "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.2.7.tgz", + "integrity": "sha512-eKONSywHZxK4tBxe2lXEysh8wbBdvDWiA+RIuaxZSgCMmA0zMgoDpGLJhnyj+c0leOQprVnXOmcB4m+W9Rw7sg==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.10.0", + "@smithy/types": "^4.11.0", "@smithy/util-uri-escape": "^4.2.0", "tslib": "^2.6.2" }, @@ -6941,12 +6941,12 @@ } }, "node_modules/@smithy/querystring-parser": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.2.6.tgz", - "integrity": "sha512-YmWxl32SQRw/kIRccSOxzS/Ib8/b5/f9ex0r5PR40jRJg8X1wgM3KrR2In+8zvOGVhRSXgvyQpw9yOSlmfmSnA==", + "version": "4.2.7", + "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.2.7.tgz", + "integrity": "sha512-3X5ZvzUHmlSTHAXFlswrS6EGt8fMSIxX/c3Rm1Pni3+wYWB6cjGocmRIoqcQF9nU5OgGmL0u7l9m44tSUpfj9w==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.10.0", + "@smithy/types": "^4.11.0", "tslib": "^2.6.2" }, "engines": { @@ -6954,24 +6954,24 @@ } }, "node_modules/@smithy/service-error-classification": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.2.6.tgz", - "integrity": "sha512-Q73XBrzJlGTut2nf5RglSntHKgAG0+KiTJdO5QQblLfr4TdliGwIAha1iZIjwisc3rA5ulzqwwsYC6xrclxVQg==", + "version": "4.2.7", + "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.2.7.tgz", + "integrity": "sha512-YB7oCbukqEb2Dlh3340/8g8vNGbs/QsNNRms+gv3N2AtZz9/1vSBx6/6tpwQpZMEJFs7Uq8h4mmOn48ZZ72MkA==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.10.0" + "@smithy/types": "^4.11.0" }, "engines": { "node": ">=18.0.0" } }, "node_modules/@smithy/shared-ini-file-loader": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.4.1.tgz", - "integrity": "sha512-tph+oQYPbpN6NamF030hx1gb5YN2Plog+GLaRHpoEDwp8+ZPG26rIJvStG9hkWzN2HBn3HcWg0sHeB0tmkYzqA==", + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.4.2.tgz", + "integrity": "sha512-M7iUUff/KwfNunmrgtqBfvZSzh3bmFgv/j/t1Y1dQ+8dNo34br1cqVEqy6v0mYEgi0DkGO7Xig0AnuOaEGVlcg==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.10.0", + "@smithy/types": "^4.11.0", "tslib": "^2.6.2" }, "engines": { @@ -6979,16 +6979,16 @@ } }, "node_modules/@smithy/signature-v4": { - "version": "5.3.6", - "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.3.6.tgz", - "integrity": "sha512-P1TXDHuQMadTMTOBv4oElZMURU4uyEhxhHfn+qOc2iofW9Rd4sZtBGx58Lzk112rIGVEYZT8eUMK4NftpewpRA==", + "version": "5.3.7", + "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.3.7.tgz", + "integrity": "sha512-9oNUlqBlFZFOSdxgImA6X5GFuzE7V2H7VG/7E70cdLhidFbdtvxxt81EHgykGK5vq5D3FafH//X+Oy31j3CKOg==", "license": "Apache-2.0", "dependencies": { "@smithy/is-array-buffer": "^4.2.0", - "@smithy/protocol-http": "^5.3.6", - "@smithy/types": "^4.10.0", + "@smithy/protocol-http": "^5.3.7", + "@smithy/types": "^4.11.0", "@smithy/util-hex-encoding": "^4.2.0", - "@smithy/util-middleware": "^4.2.6", + "@smithy/util-middleware": "^4.2.7", "@smithy/util-uri-escape": "^4.2.0", "@smithy/util-utf8": "^4.2.0", "tslib": "^2.6.2" @@ -6998,17 +6998,17 @@ } }, "node_modules/@smithy/smithy-client": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.10.1.tgz", - "integrity": "sha512-1ovWdxzYprhq+mWqiGZlt3kF69LJthuQcfY9BIyHx9MywTFKzFapluku1QXoaBB43GCsLDxNqS+1v30ure69AA==", + "version": "4.10.3", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.10.3.tgz", + "integrity": "sha512-EfECiO/0fAfb590LBnUe7rI5ux7XfquQ8LBzTe7gxw0j9QW/q8UT/EHWHlxV/+jhQ3+Ssga9uUYXCQgImGMbNg==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.19.0", - "@smithy/middleware-endpoint": "^4.4.0", - "@smithy/middleware-stack": "^4.2.6", - "@smithy/protocol-http": "^5.3.6", - "@smithy/types": "^4.10.0", - "@smithy/util-stream": "^4.5.7", + "@smithy/core": "^3.20.1", + "@smithy/middleware-endpoint": "^4.4.2", + "@smithy/middleware-stack": "^4.2.7", + "@smithy/protocol-http": "^5.3.7", + "@smithy/types": "^4.11.0", + "@smithy/util-stream": "^4.5.8", "tslib": "^2.6.2" }, "engines": { @@ -7016,9 +7016,9 @@ } }, "node_modules/@smithy/types": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.10.0.tgz", - "integrity": "sha512-K9mY7V/f3Ul+/Gz4LJANZ3vJ/yiBIwCyxe0sPT4vNJK63Srvd+Yk1IzP0t+nE7XFSpIGtzR71yljtnqpUTYFlQ==", + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.11.0.tgz", + "integrity": "sha512-mlrmL0DRDVe3mNrjTcVcZEgkFmufITfUAPBEA+AHYiIeYyJebso/He1qLbP3PssRe22KUzLRpQSdBPbXdgZ2VA==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -7028,13 +7028,13 @@ } }, "node_modules/@smithy/url-parser": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.2.6.tgz", - "integrity": "sha512-tVoyzJ2vXp4R3/aeV4EQjBDmCuWxRa8eo3KybL7Xv4wEM16nObYh7H1sNfcuLWHAAAzb0RVyxUz1S3sGj4X+Tg==", + "version": "4.2.7", + "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.2.7.tgz", + "integrity": "sha512-/RLtVsRV4uY3qPWhBDsjwahAtt3x2IsMGnP5W1b2VZIe+qgCqkLxI1UOHDZp1Q1QSOrdOR32MF3Ph2JfWT1VHg==", "license": "Apache-2.0", "dependencies": { - "@smithy/querystring-parser": "^4.2.6", - "@smithy/types": "^4.10.0", + "@smithy/querystring-parser": "^4.2.7", + "@smithy/types": "^4.11.0", "tslib": "^2.6.2" }, "engines": { @@ -7105,14 +7105,14 @@ } }, "node_modules/@smithy/util-defaults-mode-browser": { - "version": "4.3.15", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.3.15.tgz", - "integrity": "sha512-LiZQVAg/oO8kueX4c+oMls5njaD2cRLXRfcjlTYjhIqmwHnCwkQO5B3dMQH0c5PACILxGAQf6Mxsq7CjlDc76A==", + "version": "4.3.17", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.3.17.tgz", + "integrity": "sha512-dwN4GmivYF1QphnP3xJESXKtHvkkvKHSZI8GrSKMVoENVSKW2cFPRYC4ZgstYjUHdR3zwaDkIaTDIp26JuY7Cw==", "license": "Apache-2.0", "dependencies": { - "@smithy/property-provider": "^4.2.6", - "@smithy/smithy-client": "^4.10.1", - "@smithy/types": "^4.10.0", + "@smithy/property-provider": "^4.2.7", + "@smithy/smithy-client": "^4.10.3", + "@smithy/types": "^4.11.0", "tslib": "^2.6.2" }, "engines": { @@ -7120,17 +7120,17 @@ } }, "node_modules/@smithy/util-defaults-mode-node": { - "version": "4.2.18", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.2.18.tgz", - "integrity": "sha512-Kw2J+KzYm9C9Z9nY6+W0tEnoZOofstVCMTshli9jhQbQCy64rueGfKzPfuFBnVUqZD9JobxTh2DzHmPkp/Va/Q==", + "version": "4.2.20", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.2.20.tgz", + "integrity": "sha512-VD/I4AEhF1lpB3B//pmOIMBNLMrtdMXwy9yCOfa2QkJGDr63vH3RqPbSAKzoGMov3iryCxTXCxSsyGmEB8PDpg==", "license": "Apache-2.0", "dependencies": { - "@smithy/config-resolver": "^4.4.4", - "@smithy/credential-provider-imds": "^4.2.6", - "@smithy/node-config-provider": "^4.3.6", - "@smithy/property-provider": "^4.2.6", - "@smithy/smithy-client": "^4.10.1", - "@smithy/types": "^4.10.0", + "@smithy/config-resolver": "^4.4.5", + "@smithy/credential-provider-imds": "^4.2.7", + "@smithy/node-config-provider": "^4.3.7", + "@smithy/property-provider": "^4.2.7", + "@smithy/smithy-client": "^4.10.3", + "@smithy/types": "^4.11.0", "tslib": "^2.6.2" }, "engines": { @@ -7138,13 +7138,13 @@ } }, "node_modules/@smithy/util-endpoints": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.2.6.tgz", - "integrity": "sha512-v60VNM2+mPvgHCBXEfMCYrQ0RepP6u6xvbAkMenfe4Mi872CqNkJzgcnQL837e8NdeDxBgrWQRTluKq5Lqdhfg==", + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.2.7.tgz", + "integrity": "sha512-s4ILhyAvVqhMDYREeTS68R43B1V5aenV5q/V1QpRQJkCXib5BPRo4s7uNdzGtIKxaPHCfU/8YkvPAEvTpxgspg==", "license": "Apache-2.0", "dependencies": { - "@smithy/node-config-provider": "^4.3.6", - "@smithy/types": "^4.10.0", + "@smithy/node-config-provider": "^4.3.7", + "@smithy/types": "^4.11.0", "tslib": "^2.6.2" }, "engines": { @@ -7164,12 +7164,12 @@ } }, "node_modules/@smithy/util-middleware": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.2.6.tgz", - "integrity": "sha512-qrvXUkxBSAFomM3/OEMuDVwjh4wtqK8D2uDZPShzIqOylPst6gor2Cdp6+XrH4dyksAWq/bE2aSDYBTTnj0Rxg==", + "version": "4.2.7", + "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.2.7.tgz", + "integrity": "sha512-i1IkpbOae6NvIKsEeLLM9/2q4X+M90KV3oCFgWQI4q0Qz+yUZvsr+gZPdAEAtFhWQhAHpTsJO8DRJPuwVyln+w==", "license": "Apache-2.0", "dependencies": { - "@smithy/types": "^4.10.0", + "@smithy/types": "^4.11.0", "tslib": "^2.6.2" }, "engines": { @@ -7177,13 +7177,13 @@ } }, "node_modules/@smithy/util-retry": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.2.6.tgz", - "integrity": "sha512-x7CeDQLPQ9cb6xN7fRJEjlP9NyGW/YeXWc4j/RUhg4I+H60F0PEeRc2c/z3rm9zmsdiMFzpV/rT+4UHW6KM1SA==", + "version": "4.2.7", + "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.2.7.tgz", + "integrity": "sha512-SvDdsQyF5CIASa4EYVT02LukPHVzAgUA4kMAuZ97QJc2BpAqZfA4PINB8/KOoCXEw9tsuv/jQjMeaHFvxdLNGg==", "license": "Apache-2.0", "dependencies": { - "@smithy/service-error-classification": "^4.2.6", - "@smithy/types": "^4.10.0", + "@smithy/service-error-classification": "^4.2.7", + "@smithy/types": "^4.11.0", "tslib": "^2.6.2" }, "engines": { @@ -7191,14 +7191,14 @@ } }, "node_modules/@smithy/util-stream": { - "version": "4.5.7", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.5.7.tgz", - "integrity": "sha512-Uuy4S5Aj4oF6k1z+i2OtIBJUns4mlg29Ph4S+CqjR+f4XXpSFVgTCYLzMszHJTicYDBxKFtwq2/QSEDSS5l02A==", + "version": "4.5.8", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.5.8.tgz", + "integrity": "sha512-ZnnBhTapjM0YPGUSmOs0Mcg/Gg87k503qG4zU2v/+Js2Gu+daKOJMeqcQns8ajepY8tgzzfYxl6kQyZKml6O2w==", "license": "Apache-2.0", "dependencies": { - "@smithy/fetch-http-handler": "^5.3.7", - "@smithy/node-http-handler": "^4.4.6", - "@smithy/types": "^4.10.0", + "@smithy/fetch-http-handler": "^5.3.8", + "@smithy/node-http-handler": "^4.4.7", + "@smithy/types": "^4.11.0", "@smithy/util-base64": "^4.3.0", "@smithy/util-buffer-from": "^4.2.0", "@smithy/util-hex-encoding": "^4.2.0", @@ -21780,13 +21780,6 @@ "node": ">=18.17" } }, - "node_modules/undici-types": { - "version": "7.18.2", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz", - "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==", - "extraneous": true, - "license": "MIT" - }, "node_modules/universalify": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", @@ -22685,690 +22678,91 @@ "typescript": "^5.9.3" } }, - "scripts/utilities/letter-test-data/node_modules/@aws-sdk/client-dynamodb": { - "version": "3.954.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-dynamodb/-/client-dynamodb-3.954.0.tgz", - "integrity": "sha512-QhdiE3W9jC8wAmkjQhiwDBdpaK3/y/kc9aXfTyj8TaPP+B39zt56zA0VT4GtmXauyiYb81qcvKIjIDTvr95Y4A==", - "license": "Apache-2.0", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.954.0", - "@aws-sdk/credential-provider-node": "3.954.0", - "@aws-sdk/dynamodb-codec": "3.954.0", - "@aws-sdk/middleware-endpoint-discovery": "3.953.0", - "@aws-sdk/middleware-host-header": "3.953.0", - "@aws-sdk/middleware-logger": "3.953.0", - "@aws-sdk/middleware-recursion-detection": "3.953.0", - "@aws-sdk/middleware-user-agent": "3.954.0", - "@aws-sdk/region-config-resolver": "3.953.0", - "@aws-sdk/types": "3.953.0", - "@aws-sdk/util-endpoints": "3.953.0", - "@aws-sdk/util-user-agent-browser": "3.953.0", - "@aws-sdk/util-user-agent-node": "3.954.0", - "@smithy/config-resolver": "^4.4.4", - "@smithy/core": "^3.19.0", - "@smithy/fetch-http-handler": "^5.3.7", - "@smithy/hash-node": "^4.2.6", - "@smithy/invalid-dependency": "^4.2.6", - "@smithy/middleware-content-length": "^4.2.6", - "@smithy/middleware-endpoint": "^4.4.0", - "@smithy/middleware-retry": "^4.4.16", - "@smithy/middleware-serde": "^4.2.7", - "@smithy/middleware-stack": "^4.2.6", - "@smithy/node-config-provider": "^4.3.6", - "@smithy/node-http-handler": "^4.4.6", - "@smithy/protocol-http": "^5.3.6", - "@smithy/smithy-client": "^4.10.1", - "@smithy/types": "^4.10.0", - "@smithy/url-parser": "^4.2.6", - "@smithy/util-base64": "^4.3.0", - "@smithy/util-body-length-browser": "^4.2.0", - "@smithy/util-body-length-node": "^4.2.1", - "@smithy/util-defaults-mode-browser": "^4.3.15", - "@smithy/util-defaults-mode-node": "^4.2.18", - "@smithy/util-endpoints": "^3.2.6", - "@smithy/util-middleware": "^4.2.6", - "@smithy/util-retry": "^4.2.6", - "@smithy/util-utf8": "^4.2.0", - "@smithy/util-waiter": "^4.2.6", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "scripts/utilities/letter-test-data/node_modules/@aws-sdk/client-sso": { - "version": "3.954.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.954.0.tgz", - "integrity": "sha512-FVyMAvlFhLK68DHWB1lSkCRTm25xl38bIZDd+jKt5+yDolCrG5+n9aIN8AA8jNO1HNGhZuMjSIQm9r5rGmJH8g==", - "license": "Apache-2.0", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.954.0", - "@aws-sdk/middleware-host-header": "3.953.0", - "@aws-sdk/middleware-logger": "3.953.0", - "@aws-sdk/middleware-recursion-detection": "3.953.0", - "@aws-sdk/middleware-user-agent": "3.954.0", - "@aws-sdk/region-config-resolver": "3.953.0", - "@aws-sdk/types": "3.953.0", - "@aws-sdk/util-endpoints": "3.953.0", - "@aws-sdk/util-user-agent-browser": "3.953.0", - "@aws-sdk/util-user-agent-node": "3.954.0", - "@smithy/config-resolver": "^4.4.4", - "@smithy/core": "^3.19.0", - "@smithy/fetch-http-handler": "^5.3.7", - "@smithy/hash-node": "^4.2.6", - "@smithy/invalid-dependency": "^4.2.6", - "@smithy/middleware-content-length": "^4.2.6", - "@smithy/middleware-endpoint": "^4.4.0", - "@smithy/middleware-retry": "^4.4.16", - "@smithy/middleware-serde": "^4.2.7", - "@smithy/middleware-stack": "^4.2.6", - "@smithy/node-config-provider": "^4.3.6", - "@smithy/node-http-handler": "^4.4.6", - "@smithy/protocol-http": "^5.3.6", - "@smithy/smithy-client": "^4.10.1", - "@smithy/types": "^4.10.0", - "@smithy/url-parser": "^4.2.6", - "@smithy/util-base64": "^4.3.0", - "@smithy/util-body-length-browser": "^4.2.0", - "@smithy/util-body-length-node": "^4.2.1", - "@smithy/util-defaults-mode-browser": "^4.3.15", - "@smithy/util-defaults-mode-node": "^4.2.18", - "@smithy/util-endpoints": "^3.2.6", - "@smithy/util-middleware": "^4.2.6", - "@smithy/util-retry": "^4.2.6", - "@smithy/util-utf8": "^4.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "scripts/utilities/letter-test-data/node_modules/@aws-sdk/core": { - "version": "3.954.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.954.0.tgz", - "integrity": "sha512-5oYO5RP+mvCNXNj8XnF9jZo0EP0LTseYOJVNQYcii1D9DJqzHL3HJWurYh7cXxz7G7eDyvVYA01O9Xpt34TdoA==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.953.0", - "@aws-sdk/xml-builder": "3.953.0", - "@smithy/core": "^3.19.0", - "@smithy/node-config-provider": "^4.3.6", - "@smithy/property-provider": "^4.2.6", - "@smithy/protocol-http": "^5.3.6", - "@smithy/signature-v4": "^5.3.6", - "@smithy/smithy-client": "^4.10.1", - "@smithy/types": "^4.10.0", - "@smithy/util-base64": "^4.3.0", - "@smithy/util-middleware": "^4.2.6", - "@smithy/util-utf8": "^4.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "scripts/utilities/letter-test-data/node_modules/@aws-sdk/credential-provider-env": { - "version": "3.954.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.954.0.tgz", - "integrity": "sha512-2HNkqBjfsvyoRuPAiFh86JBFMFyaCNhL4VyH6XqwTGKZffjG7hdBmzXPy7AT7G3oFh1k/1Zc27v0qxaKoK7mBA==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "3.954.0", - "@aws-sdk/types": "3.953.0", - "@smithy/property-provider": "^4.2.6", - "@smithy/types": "^4.10.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "scripts/utilities/letter-test-data/node_modules/@aws-sdk/credential-provider-http": { - "version": "3.954.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.954.0.tgz", - "integrity": "sha512-CrWD5300+NE1OYRnSVDxoG7G0b5cLIZb7yp+rNQ5Jq/kqnTmyJXpVAsivq+bQIDaGzPXhadzpAMIoo7K/aHaag==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "3.954.0", - "@aws-sdk/types": "3.953.0", - "@smithy/fetch-http-handler": "^5.3.7", - "@smithy/node-http-handler": "^4.4.6", - "@smithy/property-provider": "^4.2.6", - "@smithy/protocol-http": "^5.3.6", - "@smithy/smithy-client": "^4.10.1", - "@smithy/types": "^4.10.0", - "@smithy/util-stream": "^4.5.7", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "scripts/utilities/letter-test-data/node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.954.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.954.0.tgz", - "integrity": "sha512-WAFD8pVwRSoBsuXcoD+s/hrdsP9Z0PNUedSgkOGExuJVAabpM2cIIMzYNsdHio9XFZUSqHkv8mF5mQXuIZvuzg==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "3.954.0", - "@aws-sdk/credential-provider-env": "3.954.0", - "@aws-sdk/credential-provider-http": "3.954.0", - "@aws-sdk/credential-provider-login": "3.954.0", - "@aws-sdk/credential-provider-process": "3.954.0", - "@aws-sdk/credential-provider-sso": "3.954.0", - "@aws-sdk/credential-provider-web-identity": "3.954.0", - "@aws-sdk/nested-clients": "3.954.0", - "@aws-sdk/types": "3.953.0", - "@smithy/credential-provider-imds": "^4.2.6", - "@smithy/property-provider": "^4.2.6", - "@smithy/shared-ini-file-loader": "^4.4.1", - "@smithy/types": "^4.10.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "scripts/utilities/letter-test-data/node_modules/@aws-sdk/credential-provider-node": { - "version": "3.954.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.954.0.tgz", - "integrity": "sha512-UPBjw7Lnly5i+/rES8Z5U+nPaumzEUYOE/wrHkxyH6JjwFWn8w7R07fE5Z5cgYlIq1U1lQ7sxYwB3wHPpQ65Aw==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/credential-provider-env": "3.954.0", - "@aws-sdk/credential-provider-http": "3.954.0", - "@aws-sdk/credential-provider-ini": "3.954.0", - "@aws-sdk/credential-provider-process": "3.954.0", - "@aws-sdk/credential-provider-sso": "3.954.0", - "@aws-sdk/credential-provider-web-identity": "3.954.0", - "@aws-sdk/types": "3.953.0", - "@smithy/credential-provider-imds": "^4.2.6", - "@smithy/property-provider": "^4.2.6", - "@smithy/shared-ini-file-loader": "^4.4.1", - "@smithy/types": "^4.10.0", - "tslib": "^2.6.2" - }, + "scripts/utilities/letter-test-data/node_modules/ansi-styles": { + "version": "6.2.3", + "license": "MIT", "engines": { - "node": ">=18.0.0" - } - }, - "scripts/utilities/letter-test-data/node_modules/@aws-sdk/credential-provider-process": { - "version": "3.954.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.954.0.tgz", - "integrity": "sha512-Y1/0O2LgbKM8iIgcVj/GNEQW6p90LVTCOzF2CI1pouoKqxmZ/1F7F66WHoa6XUOfKaCRj/R6nuMR3om9ThaM5A==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "3.954.0", - "@aws-sdk/types": "3.953.0", - "@smithy/property-provider": "^4.2.6", - "@smithy/shared-ini-file-loader": "^4.4.1", - "@smithy/types": "^4.10.0", - "tslib": "^2.6.2" + "node": ">=12" }, - "engines": { - "node": ">=18.0.0" + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "scripts/utilities/letter-test-data/node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.954.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.954.0.tgz", - "integrity": "sha512-UXxGfkp/plFRdyidMLvNul5zoLKmHhVQOCrD2OgR/lg9jNqNmJ7abF+Qu8abo902iDkhU21Qj4M398cx6l8Kng==", - "license": "Apache-2.0", + "scripts/utilities/letter-test-data/node_modules/cliui": { + "version": "8.0.1", + "license": "ISC", "dependencies": { - "@aws-sdk/client-sso": "3.954.0", - "@aws-sdk/core": "3.954.0", - "@aws-sdk/token-providers": "3.954.0", - "@aws-sdk/types": "3.953.0", - "@smithy/property-provider": "^4.2.6", - "@smithy/shared-ini-file-loader": "^4.4.1", - "@smithy/types": "^4.10.0", - "tslib": "^2.6.2" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" }, "engines": { - "node": ">=18.0.0" + "node": ">=12" } }, - "scripts/utilities/letter-test-data/node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.954.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.954.0.tgz", - "integrity": "sha512-XEyf1T08q1tG4zkTS4Dnf1cAQyrJUo/xlvi6XNpqGhY3bOmKUYE2h/K6eITIdytDL9VuCpWYQ6YRcIVtL29E0w==", - "license": "Apache-2.0", + "scripts/utilities/letter-test-data/node_modules/pino": { + "version": "9.14.0", + "resolved": "https://registry.npmjs.org/pino/-/pino-9.14.0.tgz", + "integrity": "sha512-8OEwKp5juEvb/MjpIc4hjqfgCNysrS94RIOMXYvpYCdm/jglrKEiAYmiumbmGhCvs+IcInsphYDFwqrjr7398w==", + "license": "MIT", "dependencies": { - "@aws-sdk/core": "3.954.0", - "@aws-sdk/nested-clients": "3.954.0", - "@aws-sdk/types": "3.953.0", - "@smithy/property-provider": "^4.2.6", - "@smithy/shared-ini-file-loader": "^4.4.1", - "@smithy/types": "^4.10.0", - "tslib": "^2.6.2" + "@pinojs/redact": "^0.4.0", + "atomic-sleep": "^1.0.0", + "on-exit-leak-free": "^2.1.0", + "pino-abstract-transport": "^2.0.0", + "pino-std-serializers": "^7.0.0", + "process-warning": "^5.0.0", + "quick-format-unescaped": "^4.0.3", + "real-require": "^0.2.0", + "safe-stable-stringify": "^2.3.1", + "sonic-boom": "^4.0.1", + "thread-stream": "^3.0.0" }, - "engines": { - "node": ">=18.0.0" + "bin": { + "pino": "bin.js" } }, - "scripts/utilities/letter-test-data/node_modules/@aws-sdk/dynamodb-codec": { - "version": "3.954.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/dynamodb-codec/-/dynamodb-codec-3.954.0.tgz", - "integrity": "sha512-fNY0L1l9e36pLJef4NY5k7Q1SJnm5rgLSxSRPT8xL+bhQBtEn2E2t4JdBiTqlxgeyuOrafWOawbg8yS3pRPcLw==", - "license": "Apache-2.0", + "scripts/utilities/letter-test-data/node_modules/wrap-ansi": { + "version": "7.0.0", + "license": "MIT", "dependencies": { - "@aws-sdk/core": "3.954.0", - "@smithy/core": "^3.19.0", - "@smithy/smithy-client": "^4.10.1", - "@smithy/types": "^4.10.0", - "@smithy/util-base64": "^4.3.0", - "tslib": "^2.6.2" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "engines": { - "node": ">=18.0.0" + "node": ">=10" }, - "peerDependencies": { - "@aws-sdk/client-dynamodb": "^3.954.0" + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "scripts/utilities/letter-test-data/node_modules/@aws-sdk/endpoint-cache": { - "version": "3.953.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/endpoint-cache/-/endpoint-cache-3.953.0.tgz", - "integrity": "sha512-pz67DoHk5WNmvMuyNDiomUS2xo0mq6Z3TdfLJZlWVbSKi3h8hYxVQchJ2kzgTr6wu6zt3UBbtKV9yY1IBhKMVA==", - "license": "Apache-2.0", + "scripts/utilities/letter-test-data/node_modules/yargs": { + "version": "17.7.2", + "license": "MIT", "dependencies": { - "mnemonist": "0.38.3", - "tslib": "^2.6.2" + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" }, "engines": { - "node": ">=18.0.0" + "node": ">=12" } }, - "scripts/utilities/letter-test-data/node_modules/@aws-sdk/lib-dynamodb": { - "version": "3.954.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/lib-dynamodb/-/lib-dynamodb-3.954.0.tgz", - "integrity": "sha512-DBEzAW7WfvNy6bQ32TfpvuFSVewj5eE8O1sTQWfvylNSZu81u6sPwb+eHPEclbvC84zAANl72JnkETOIkL4r8g==", - "license": "Apache-2.0", + "scripts/utilities/supplier-data": { + "name": "nhs-notify-supplier-api-suppliers-data-utility", + "version": "0.0.1", "dependencies": { - "@aws-sdk/core": "3.954.0", - "@aws-sdk/util-dynamodb": "3.954.0", - "@smithy/core": "^3.19.0", - "@smithy/smithy-client": "^4.10.1", - "@smithy/types": "^4.10.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-dynamodb": "^3.954.0" - } - }, - "scripts/utilities/letter-test-data/node_modules/@aws-sdk/middleware-endpoint-discovery": { - "version": "3.953.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-endpoint-discovery/-/middleware-endpoint-discovery-3.953.0.tgz", - "integrity": "sha512-/YKB1/OiWr7TwOfmkqzv8x1xgOpU71yciQTfsq6erB3dTQhdukPADt/CMJOhWFKC6Q1D5cDN8381nsGmnNuBVg==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/endpoint-cache": "3.953.0", - "@aws-sdk/types": "3.953.0", - "@smithy/node-config-provider": "^4.3.6", - "@smithy/protocol-http": "^5.3.6", - "@smithy/types": "^4.10.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "scripts/utilities/letter-test-data/node_modules/@aws-sdk/middleware-host-header": { - "version": "3.953.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.953.0.tgz", - "integrity": "sha512-jTGhfkONav+r4E6HLOrl5SzBqDmPByUYCkyB/c/3TVb8jX3wAZx8/q9bphKpCh+G5ARi3IdbSisgkZrJYqQ19Q==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.953.0", - "@smithy/protocol-http": "^5.3.6", - "@smithy/types": "^4.10.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "scripts/utilities/letter-test-data/node_modules/@aws-sdk/middleware-logger": { - "version": "3.953.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.953.0.tgz", - "integrity": "sha512-PlWdVYgcuptkIC0ZKqVUhWNtSHXJSx7U9V8J7dJjRmsXC40X7zpEycvrkzDMJjeTDGcCceYbyYAg/4X1lkcIMw==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.953.0", - "@smithy/types": "^4.10.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "scripts/utilities/letter-test-data/node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.953.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.953.0.tgz", - "integrity": "sha512-cmIJx0gWeesUKK4YwgE+VQL3mpACr3/J24fbwnc1Z5tntC86b+HQFzU5vsBDw6lLwyD46dBgWdsXFh1jL+ZaFw==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.953.0", - "@aws/lambda-invoke-store": "^0.2.2", - "@smithy/protocol-http": "^5.3.6", - "@smithy/types": "^4.10.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "scripts/utilities/letter-test-data/node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.954.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.954.0.tgz", - "integrity": "sha512-5PX8JDe3dB2+MqXeGIhmgFnm2rbVsSxhz+Xyuu1oxLtbOn+a9UDA+sNBufEBjt3UxWy5qwEEY1fxdbXXayjlGg==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "3.954.0", - "@aws-sdk/types": "3.953.0", - "@aws-sdk/util-endpoints": "3.953.0", - "@smithy/core": "^3.19.0", - "@smithy/protocol-http": "^5.3.6", - "@smithy/types": "^4.10.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "scripts/utilities/letter-test-data/node_modules/@aws-sdk/nested-clients": { - "version": "3.954.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.954.0.tgz", - "integrity": "sha512-JLUhf35fTQIDPLk6G5KPggL9tV//Hjhy6+N2zZeis76LuBRNhKDq8z1CFyKhjf00vXi/tDYdn9D7y9emI+5Y/g==", - "license": "Apache-2.0", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.954.0", - "@aws-sdk/middleware-host-header": "3.953.0", - "@aws-sdk/middleware-logger": "3.953.0", - "@aws-sdk/middleware-recursion-detection": "3.953.0", - "@aws-sdk/middleware-user-agent": "3.954.0", - "@aws-sdk/region-config-resolver": "3.953.0", - "@aws-sdk/types": "3.953.0", - "@aws-sdk/util-endpoints": "3.953.0", - "@aws-sdk/util-user-agent-browser": "3.953.0", - "@aws-sdk/util-user-agent-node": "3.954.0", - "@smithy/config-resolver": "^4.4.4", - "@smithy/core": "^3.19.0", - "@smithy/fetch-http-handler": "^5.3.7", - "@smithy/hash-node": "^4.2.6", - "@smithy/invalid-dependency": "^4.2.6", - "@smithy/middleware-content-length": "^4.2.6", - "@smithy/middleware-endpoint": "^4.4.0", - "@smithy/middleware-retry": "^4.4.16", - "@smithy/middleware-serde": "^4.2.7", - "@smithy/middleware-stack": "^4.2.6", - "@smithy/node-config-provider": "^4.3.6", - "@smithy/node-http-handler": "^4.4.6", - "@smithy/protocol-http": "^5.3.6", - "@smithy/smithy-client": "^4.10.1", - "@smithy/types": "^4.10.0", - "@smithy/url-parser": "^4.2.6", - "@smithy/util-base64": "^4.3.0", - "@smithy/util-body-length-browser": "^4.2.0", - "@smithy/util-body-length-node": "^4.2.1", - "@smithy/util-defaults-mode-browser": "^4.3.15", - "@smithy/util-defaults-mode-node": "^4.2.18", - "@smithy/util-endpoints": "^3.2.6", - "@smithy/util-middleware": "^4.2.6", - "@smithy/util-retry": "^4.2.6", - "@smithy/util-utf8": "^4.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "scripts/utilities/letter-test-data/node_modules/@aws-sdk/region-config-resolver": { - "version": "3.953.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.953.0.tgz", - "integrity": "sha512-5MJgnsc+HLO+le0EK1cy92yrC7kyhGZSpaq8PcQvKs9qtXCXT5Tb6tMdkr5Y07JxYsYOV1omWBynvL6PWh08tQ==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.953.0", - "@smithy/config-resolver": "^4.4.4", - "@smithy/node-config-provider": "^4.3.6", - "@smithy/types": "^4.10.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "scripts/utilities/letter-test-data/node_modules/@aws-sdk/token-providers": { - "version": "3.954.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.954.0.tgz", - "integrity": "sha512-rDyN3oQQKMOJgyQ9/LNbh4fAGAj8ePMGOAQzSP/kyzizmViI6STpBW1o/VRqiTgMNi1bvA9ZasDtfrJqcVt0iA==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "3.954.0", - "@aws-sdk/nested-clients": "3.954.0", - "@aws-sdk/types": "3.953.0", - "@smithy/property-provider": "^4.2.6", - "@smithy/shared-ini-file-loader": "^4.4.1", - "@smithy/types": "^4.10.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "scripts/utilities/letter-test-data/node_modules/@aws-sdk/types": { - "version": "3.953.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.953.0.tgz", - "integrity": "sha512-M9Iwg9kTyqTErI0vOTVVpcnTHWzS3VplQppy8MuL02EE+mJ0BIwpWfsaAPQW+/XnVpdNpWZTsHcNE29f1+hR8g==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.10.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "scripts/utilities/letter-test-data/node_modules/@aws-sdk/util-dynamodb": { - "version": "3.954.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-dynamodb/-/util-dynamodb-3.954.0.tgz", - "integrity": "sha512-PXjS9P98OMMVXl4ledr/nTHGmNx6oF2rqTBvSQKKWi8dB4mcHjSaU5ASsklQC944xLs1IGsUkrJ39vu7bEqLoA==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-dynamodb": "^3.954.0" - } - }, - "scripts/utilities/letter-test-data/node_modules/@aws-sdk/util-endpoints": { - "version": "3.953.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.953.0.tgz", - "integrity": "sha512-rjaS6jrFksopXvNg6YeN+D1lYwhcByORNlFuYesFvaQNtPOufbE5tJL4GJ3TMXyaY0uFR28N5BHHITPyWWfH/g==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.953.0", - "@smithy/types": "^4.10.0", - "@smithy/url-parser": "^4.2.6", - "@smithy/util-endpoints": "^3.2.6", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "scripts/utilities/letter-test-data/node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.953.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.953.0.tgz", - "integrity": "sha512-UF5NeqYesWuFao+u7LJvpV1SJCaLml5BtFZKUdTnNNMeN6jvV+dW/eQoFGpXF94RCqguX0XESmRuRRPQp+/rzQ==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.953.0", - "@smithy/types": "^4.10.0", - "bowser": "^2.11.0", - "tslib": "^2.6.2" - } - }, - "scripts/utilities/letter-test-data/node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.954.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.954.0.tgz", - "integrity": "sha512-fB5S5VOu7OFkeNzcblQlez4AjO5hgDFaa7phYt7716YWisY3RjAaQPlxgv+G3GltHHDJIfzEC5aRxdf62B9zMg==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/middleware-user-agent": "3.954.0", - "@aws-sdk/types": "3.953.0", - "@smithy/node-config-provider": "^4.3.6", - "@smithy/types": "^4.10.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "aws-crt": ">=1.0.0" - }, - "peerDependenciesMeta": { - "aws-crt": { - "optional": true - } - } - }, - "scripts/utilities/letter-test-data/node_modules/@aws-sdk/xml-builder": { - "version": "3.953.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.953.0.tgz", - "integrity": "sha512-Zmrj21jQ2OeOJGr9spPiN00aQvXa/WUqRXcTVENhrMt+OFoSOfDFpYhUj9NQ09QmQ8KMWFoWuWW6iKurNqLvAA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.10.0", - "fast-xml-parser": "5.2.5", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "scripts/utilities/letter-test-data/node_modules/@smithy/util-waiter": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-4.2.6.tgz", - "integrity": "sha512-xU9HwUSik9UUCJmm530yvBy0AwlQFICveKmqvaaTukKkXEAhyiBdHtSrhPrH3rH+uz0ykyaE3LdgsX86C6mDCQ==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/abort-controller": "^4.2.6", - "@smithy/types": "^4.10.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "scripts/utilities/letter-test-data/node_modules/ansi-regex": { - "version": "6.2.2", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "scripts/utilities/letter-test-data/node_modules/ansi-styles": { - "version": "6.2.3", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "scripts/utilities/letter-test-data/node_modules/cliui": { - "version": "8.0.1", - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "scripts/utilities/letter-test-data/node_modules/pino": { - "version": "9.14.0", - "resolved": "https://registry.npmjs.org/pino/-/pino-9.14.0.tgz", - "integrity": "sha512-8OEwKp5juEvb/MjpIc4hjqfgCNysrS94RIOMXYvpYCdm/jglrKEiAYmiumbmGhCvs+IcInsphYDFwqrjr7398w==", - "license": "MIT", - "dependencies": { - "@pinojs/redact": "^0.4.0", - "atomic-sleep": "^1.0.0", - "on-exit-leak-free": "^2.1.0", - "pino-abstract-transport": "^2.0.0", - "pino-std-serializers": "^7.0.0", - "process-warning": "^5.0.0", - "quick-format-unescaped": "^4.0.3", - "real-require": "^0.2.0", - "safe-stable-stringify": "^2.3.1", - "sonic-boom": "^4.0.1", - "thread-stream": "^3.0.0" - }, - "bin": { - "pino": "bin.js" - } - }, - "scripts/utilities/letter-test-data/node_modules/wrap-ansi": { - "version": "7.0.0", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "scripts/utilities/letter-test-data/node_modules/yargs": { - "version": "17.7.2", - "license": "MIT", - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "scripts/utilities/supplier-data": { - "name": "nhs-notify-supplier-api-suppliers-data-utility", - "version": "0.0.1", - "dependencies": { - "@aws-sdk/client-dynamodb": "^3.954.0", - "@aws-sdk/lib-dynamodb": "^3.954.0", - "@internal/datastore": "*", - "esbuild": "^0.25.11", - "pino": "^9.7.0", - "yargs": "^17.7.2" + "@aws-sdk/client-dynamodb": "^3.954.0", + "@aws-sdk/lib-dynamodb": "^3.954.0", + "@internal/datastore": "*", + "esbuild": "^0.25.11", + "pino": "^9.7.0", + "yargs": "^17.7.2" }, "devDependencies": { "@tsconfig/node22": "^22.0.2", @@ -23378,595 +22772,6 @@ "typescript": "^5.8.3" } }, - "scripts/utilities/supplier-data/node_modules/@aws-sdk/client-dynamodb": { - "version": "3.954.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-dynamodb/-/client-dynamodb-3.954.0.tgz", - "integrity": "sha512-QhdiE3W9jC8wAmkjQhiwDBdpaK3/y/kc9aXfTyj8TaPP+B39zt56zA0VT4GtmXauyiYb81qcvKIjIDTvr95Y4A==", - "license": "Apache-2.0", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.954.0", - "@aws-sdk/credential-provider-node": "3.954.0", - "@aws-sdk/dynamodb-codec": "3.954.0", - "@aws-sdk/middleware-endpoint-discovery": "3.953.0", - "@aws-sdk/middleware-host-header": "3.953.0", - "@aws-sdk/middleware-logger": "3.953.0", - "@aws-sdk/middleware-recursion-detection": "3.953.0", - "@aws-sdk/middleware-user-agent": "3.954.0", - "@aws-sdk/region-config-resolver": "3.953.0", - "@aws-sdk/types": "3.953.0", - "@aws-sdk/util-endpoints": "3.953.0", - "@aws-sdk/util-user-agent-browser": "3.953.0", - "@aws-sdk/util-user-agent-node": "3.954.0", - "@smithy/config-resolver": "^4.4.4", - "@smithy/core": "^3.19.0", - "@smithy/fetch-http-handler": "^5.3.7", - "@smithy/hash-node": "^4.2.6", - "@smithy/invalid-dependency": "^4.2.6", - "@smithy/middleware-content-length": "^4.2.6", - "@smithy/middleware-endpoint": "^4.4.0", - "@smithy/middleware-retry": "^4.4.16", - "@smithy/middleware-serde": "^4.2.7", - "@smithy/middleware-stack": "^4.2.6", - "@smithy/node-config-provider": "^4.3.6", - "@smithy/node-http-handler": "^4.4.6", - "@smithy/protocol-http": "^5.3.6", - "@smithy/smithy-client": "^4.10.1", - "@smithy/types": "^4.10.0", - "@smithy/url-parser": "^4.2.6", - "@smithy/util-base64": "^4.3.0", - "@smithy/util-body-length-browser": "^4.2.0", - "@smithy/util-body-length-node": "^4.2.1", - "@smithy/util-defaults-mode-browser": "^4.3.15", - "@smithy/util-defaults-mode-node": "^4.2.18", - "@smithy/util-endpoints": "^3.2.6", - "@smithy/util-middleware": "^4.2.6", - "@smithy/util-retry": "^4.2.6", - "@smithy/util-utf8": "^4.2.0", - "@smithy/util-waiter": "^4.2.6", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "scripts/utilities/supplier-data/node_modules/@aws-sdk/client-sso": { - "version": "3.954.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.954.0.tgz", - "integrity": "sha512-FVyMAvlFhLK68DHWB1lSkCRTm25xl38bIZDd+jKt5+yDolCrG5+n9aIN8AA8jNO1HNGhZuMjSIQm9r5rGmJH8g==", - "license": "Apache-2.0", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.954.0", - "@aws-sdk/middleware-host-header": "3.953.0", - "@aws-sdk/middleware-logger": "3.953.0", - "@aws-sdk/middleware-recursion-detection": "3.953.0", - "@aws-sdk/middleware-user-agent": "3.954.0", - "@aws-sdk/region-config-resolver": "3.953.0", - "@aws-sdk/types": "3.953.0", - "@aws-sdk/util-endpoints": "3.953.0", - "@aws-sdk/util-user-agent-browser": "3.953.0", - "@aws-sdk/util-user-agent-node": "3.954.0", - "@smithy/config-resolver": "^4.4.4", - "@smithy/core": "^3.19.0", - "@smithy/fetch-http-handler": "^5.3.7", - "@smithy/hash-node": "^4.2.6", - "@smithy/invalid-dependency": "^4.2.6", - "@smithy/middleware-content-length": "^4.2.6", - "@smithy/middleware-endpoint": "^4.4.0", - "@smithy/middleware-retry": "^4.4.16", - "@smithy/middleware-serde": "^4.2.7", - "@smithy/middleware-stack": "^4.2.6", - "@smithy/node-config-provider": "^4.3.6", - "@smithy/node-http-handler": "^4.4.6", - "@smithy/protocol-http": "^5.3.6", - "@smithy/smithy-client": "^4.10.1", - "@smithy/types": "^4.10.0", - "@smithy/url-parser": "^4.2.6", - "@smithy/util-base64": "^4.3.0", - "@smithy/util-body-length-browser": "^4.2.0", - "@smithy/util-body-length-node": "^4.2.1", - "@smithy/util-defaults-mode-browser": "^4.3.15", - "@smithy/util-defaults-mode-node": "^4.2.18", - "@smithy/util-endpoints": "^3.2.6", - "@smithy/util-middleware": "^4.2.6", - "@smithy/util-retry": "^4.2.6", - "@smithy/util-utf8": "^4.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "scripts/utilities/supplier-data/node_modules/@aws-sdk/core": { - "version": "3.954.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.954.0.tgz", - "integrity": "sha512-5oYO5RP+mvCNXNj8XnF9jZo0EP0LTseYOJVNQYcii1D9DJqzHL3HJWurYh7cXxz7G7eDyvVYA01O9Xpt34TdoA==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.953.0", - "@aws-sdk/xml-builder": "3.953.0", - "@smithy/core": "^3.19.0", - "@smithy/node-config-provider": "^4.3.6", - "@smithy/property-provider": "^4.2.6", - "@smithy/protocol-http": "^5.3.6", - "@smithy/signature-v4": "^5.3.6", - "@smithy/smithy-client": "^4.10.1", - "@smithy/types": "^4.10.0", - "@smithy/util-base64": "^4.3.0", - "@smithy/util-middleware": "^4.2.6", - "@smithy/util-utf8": "^4.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "scripts/utilities/supplier-data/node_modules/@aws-sdk/credential-provider-env": { - "version": "3.954.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.954.0.tgz", - "integrity": "sha512-2HNkqBjfsvyoRuPAiFh86JBFMFyaCNhL4VyH6XqwTGKZffjG7hdBmzXPy7AT7G3oFh1k/1Zc27v0qxaKoK7mBA==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "3.954.0", - "@aws-sdk/types": "3.953.0", - "@smithy/property-provider": "^4.2.6", - "@smithy/types": "^4.10.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "scripts/utilities/supplier-data/node_modules/@aws-sdk/credential-provider-http": { - "version": "3.954.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.954.0.tgz", - "integrity": "sha512-CrWD5300+NE1OYRnSVDxoG7G0b5cLIZb7yp+rNQ5Jq/kqnTmyJXpVAsivq+bQIDaGzPXhadzpAMIoo7K/aHaag==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "3.954.0", - "@aws-sdk/types": "3.953.0", - "@smithy/fetch-http-handler": "^5.3.7", - "@smithy/node-http-handler": "^4.4.6", - "@smithy/property-provider": "^4.2.6", - "@smithy/protocol-http": "^5.3.6", - "@smithy/smithy-client": "^4.10.1", - "@smithy/types": "^4.10.0", - "@smithy/util-stream": "^4.5.7", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "scripts/utilities/supplier-data/node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.954.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.954.0.tgz", - "integrity": "sha512-WAFD8pVwRSoBsuXcoD+s/hrdsP9Z0PNUedSgkOGExuJVAabpM2cIIMzYNsdHio9XFZUSqHkv8mF5mQXuIZvuzg==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "3.954.0", - "@aws-sdk/credential-provider-env": "3.954.0", - "@aws-sdk/credential-provider-http": "3.954.0", - "@aws-sdk/credential-provider-login": "3.954.0", - "@aws-sdk/credential-provider-process": "3.954.0", - "@aws-sdk/credential-provider-sso": "3.954.0", - "@aws-sdk/credential-provider-web-identity": "3.954.0", - "@aws-sdk/nested-clients": "3.954.0", - "@aws-sdk/types": "3.953.0", - "@smithy/credential-provider-imds": "^4.2.6", - "@smithy/property-provider": "^4.2.6", - "@smithy/shared-ini-file-loader": "^4.4.1", - "@smithy/types": "^4.10.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "scripts/utilities/supplier-data/node_modules/@aws-sdk/credential-provider-node": { - "version": "3.954.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.954.0.tgz", - "integrity": "sha512-UPBjw7Lnly5i+/rES8Z5U+nPaumzEUYOE/wrHkxyH6JjwFWn8w7R07fE5Z5cgYlIq1U1lQ7sxYwB3wHPpQ65Aw==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/credential-provider-env": "3.954.0", - "@aws-sdk/credential-provider-http": "3.954.0", - "@aws-sdk/credential-provider-ini": "3.954.0", - "@aws-sdk/credential-provider-process": "3.954.0", - "@aws-sdk/credential-provider-sso": "3.954.0", - "@aws-sdk/credential-provider-web-identity": "3.954.0", - "@aws-sdk/types": "3.953.0", - "@smithy/credential-provider-imds": "^4.2.6", - "@smithy/property-provider": "^4.2.6", - "@smithy/shared-ini-file-loader": "^4.4.1", - "@smithy/types": "^4.10.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "scripts/utilities/supplier-data/node_modules/@aws-sdk/credential-provider-process": { - "version": "3.954.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.954.0.tgz", - "integrity": "sha512-Y1/0O2LgbKM8iIgcVj/GNEQW6p90LVTCOzF2CI1pouoKqxmZ/1F7F66WHoa6XUOfKaCRj/R6nuMR3om9ThaM5A==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "3.954.0", - "@aws-sdk/types": "3.953.0", - "@smithy/property-provider": "^4.2.6", - "@smithy/shared-ini-file-loader": "^4.4.1", - "@smithy/types": "^4.10.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "scripts/utilities/supplier-data/node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.954.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.954.0.tgz", - "integrity": "sha512-UXxGfkp/plFRdyidMLvNul5zoLKmHhVQOCrD2OgR/lg9jNqNmJ7abF+Qu8abo902iDkhU21Qj4M398cx6l8Kng==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/client-sso": "3.954.0", - "@aws-sdk/core": "3.954.0", - "@aws-sdk/token-providers": "3.954.0", - "@aws-sdk/types": "3.953.0", - "@smithy/property-provider": "^4.2.6", - "@smithy/shared-ini-file-loader": "^4.4.1", - "@smithy/types": "^4.10.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "scripts/utilities/supplier-data/node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.954.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.954.0.tgz", - "integrity": "sha512-XEyf1T08q1tG4zkTS4Dnf1cAQyrJUo/xlvi6XNpqGhY3bOmKUYE2h/K6eITIdytDL9VuCpWYQ6YRcIVtL29E0w==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "3.954.0", - "@aws-sdk/nested-clients": "3.954.0", - "@aws-sdk/types": "3.953.0", - "@smithy/property-provider": "^4.2.6", - "@smithy/shared-ini-file-loader": "^4.4.1", - "@smithy/types": "^4.10.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "scripts/utilities/supplier-data/node_modules/@aws-sdk/dynamodb-codec": { - "version": "3.954.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/dynamodb-codec/-/dynamodb-codec-3.954.0.tgz", - "integrity": "sha512-fNY0L1l9e36pLJef4NY5k7Q1SJnm5rgLSxSRPT8xL+bhQBtEn2E2t4JdBiTqlxgeyuOrafWOawbg8yS3pRPcLw==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "3.954.0", - "@smithy/core": "^3.19.0", - "@smithy/smithy-client": "^4.10.1", - "@smithy/types": "^4.10.0", - "@smithy/util-base64": "^4.3.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-dynamodb": "^3.954.0" - } - }, - "scripts/utilities/supplier-data/node_modules/@aws-sdk/endpoint-cache": { - "version": "3.953.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/endpoint-cache/-/endpoint-cache-3.953.0.tgz", - "integrity": "sha512-pz67DoHk5WNmvMuyNDiomUS2xo0mq6Z3TdfLJZlWVbSKi3h8hYxVQchJ2kzgTr6wu6zt3UBbtKV9yY1IBhKMVA==", - "license": "Apache-2.0", - "dependencies": { - "mnemonist": "0.38.3", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "scripts/utilities/supplier-data/node_modules/@aws-sdk/lib-dynamodb": { - "version": "3.954.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/lib-dynamodb/-/lib-dynamodb-3.954.0.tgz", - "integrity": "sha512-DBEzAW7WfvNy6bQ32TfpvuFSVewj5eE8O1sTQWfvylNSZu81u6sPwb+eHPEclbvC84zAANl72JnkETOIkL4r8g==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "3.954.0", - "@aws-sdk/util-dynamodb": "3.954.0", - "@smithy/core": "^3.19.0", - "@smithy/smithy-client": "^4.10.1", - "@smithy/types": "^4.10.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-dynamodb": "^3.954.0" - } - }, - "scripts/utilities/supplier-data/node_modules/@aws-sdk/middleware-endpoint-discovery": { - "version": "3.953.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-endpoint-discovery/-/middleware-endpoint-discovery-3.953.0.tgz", - "integrity": "sha512-/YKB1/OiWr7TwOfmkqzv8x1xgOpU71yciQTfsq6erB3dTQhdukPADt/CMJOhWFKC6Q1D5cDN8381nsGmnNuBVg==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/endpoint-cache": "3.953.0", - "@aws-sdk/types": "3.953.0", - "@smithy/node-config-provider": "^4.3.6", - "@smithy/protocol-http": "^5.3.6", - "@smithy/types": "^4.10.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "scripts/utilities/supplier-data/node_modules/@aws-sdk/middleware-host-header": { - "version": "3.953.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.953.0.tgz", - "integrity": "sha512-jTGhfkONav+r4E6HLOrl5SzBqDmPByUYCkyB/c/3TVb8jX3wAZx8/q9bphKpCh+G5ARi3IdbSisgkZrJYqQ19Q==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.953.0", - "@smithy/protocol-http": "^5.3.6", - "@smithy/types": "^4.10.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "scripts/utilities/supplier-data/node_modules/@aws-sdk/middleware-logger": { - "version": "3.953.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.953.0.tgz", - "integrity": "sha512-PlWdVYgcuptkIC0ZKqVUhWNtSHXJSx7U9V8J7dJjRmsXC40X7zpEycvrkzDMJjeTDGcCceYbyYAg/4X1lkcIMw==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.953.0", - "@smithy/types": "^4.10.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "scripts/utilities/supplier-data/node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.953.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.953.0.tgz", - "integrity": "sha512-cmIJx0gWeesUKK4YwgE+VQL3mpACr3/J24fbwnc1Z5tntC86b+HQFzU5vsBDw6lLwyD46dBgWdsXFh1jL+ZaFw==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.953.0", - "@aws/lambda-invoke-store": "^0.2.2", - "@smithy/protocol-http": "^5.3.6", - "@smithy/types": "^4.10.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "scripts/utilities/supplier-data/node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.954.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.954.0.tgz", - "integrity": "sha512-5PX8JDe3dB2+MqXeGIhmgFnm2rbVsSxhz+Xyuu1oxLtbOn+a9UDA+sNBufEBjt3UxWy5qwEEY1fxdbXXayjlGg==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "3.954.0", - "@aws-sdk/types": "3.953.0", - "@aws-sdk/util-endpoints": "3.953.0", - "@smithy/core": "^3.19.0", - "@smithy/protocol-http": "^5.3.6", - "@smithy/types": "^4.10.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "scripts/utilities/supplier-data/node_modules/@aws-sdk/nested-clients": { - "version": "3.954.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.954.0.tgz", - "integrity": "sha512-JLUhf35fTQIDPLk6G5KPggL9tV//Hjhy6+N2zZeis76LuBRNhKDq8z1CFyKhjf00vXi/tDYdn9D7y9emI+5Y/g==", - "license": "Apache-2.0", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.954.0", - "@aws-sdk/middleware-host-header": "3.953.0", - "@aws-sdk/middleware-logger": "3.953.0", - "@aws-sdk/middleware-recursion-detection": "3.953.0", - "@aws-sdk/middleware-user-agent": "3.954.0", - "@aws-sdk/region-config-resolver": "3.953.0", - "@aws-sdk/types": "3.953.0", - "@aws-sdk/util-endpoints": "3.953.0", - "@aws-sdk/util-user-agent-browser": "3.953.0", - "@aws-sdk/util-user-agent-node": "3.954.0", - "@smithy/config-resolver": "^4.4.4", - "@smithy/core": "^3.19.0", - "@smithy/fetch-http-handler": "^5.3.7", - "@smithy/hash-node": "^4.2.6", - "@smithy/invalid-dependency": "^4.2.6", - "@smithy/middleware-content-length": "^4.2.6", - "@smithy/middleware-endpoint": "^4.4.0", - "@smithy/middleware-retry": "^4.4.16", - "@smithy/middleware-serde": "^4.2.7", - "@smithy/middleware-stack": "^4.2.6", - "@smithy/node-config-provider": "^4.3.6", - "@smithy/node-http-handler": "^4.4.6", - "@smithy/protocol-http": "^5.3.6", - "@smithy/smithy-client": "^4.10.1", - "@smithy/types": "^4.10.0", - "@smithy/url-parser": "^4.2.6", - "@smithy/util-base64": "^4.3.0", - "@smithy/util-body-length-browser": "^4.2.0", - "@smithy/util-body-length-node": "^4.2.1", - "@smithy/util-defaults-mode-browser": "^4.3.15", - "@smithy/util-defaults-mode-node": "^4.2.18", - "@smithy/util-endpoints": "^3.2.6", - "@smithy/util-middleware": "^4.2.6", - "@smithy/util-retry": "^4.2.6", - "@smithy/util-utf8": "^4.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "scripts/utilities/supplier-data/node_modules/@aws-sdk/region-config-resolver": { - "version": "3.953.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.953.0.tgz", - "integrity": "sha512-5MJgnsc+HLO+le0EK1cy92yrC7kyhGZSpaq8PcQvKs9qtXCXT5Tb6tMdkr5Y07JxYsYOV1omWBynvL6PWh08tQ==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.953.0", - "@smithy/config-resolver": "^4.4.4", - "@smithy/node-config-provider": "^4.3.6", - "@smithy/types": "^4.10.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "scripts/utilities/supplier-data/node_modules/@aws-sdk/token-providers": { - "version": "3.954.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.954.0.tgz", - "integrity": "sha512-rDyN3oQQKMOJgyQ9/LNbh4fAGAj8ePMGOAQzSP/kyzizmViI6STpBW1o/VRqiTgMNi1bvA9ZasDtfrJqcVt0iA==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "3.954.0", - "@aws-sdk/nested-clients": "3.954.0", - "@aws-sdk/types": "3.953.0", - "@smithy/property-provider": "^4.2.6", - "@smithy/shared-ini-file-loader": "^4.4.1", - "@smithy/types": "^4.10.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "scripts/utilities/supplier-data/node_modules/@aws-sdk/types": { - "version": "3.953.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.953.0.tgz", - "integrity": "sha512-M9Iwg9kTyqTErI0vOTVVpcnTHWzS3VplQppy8MuL02EE+mJ0BIwpWfsaAPQW+/XnVpdNpWZTsHcNE29f1+hR8g==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.10.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "scripts/utilities/supplier-data/node_modules/@aws-sdk/util-dynamodb": { - "version": "3.954.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-dynamodb/-/util-dynamodb-3.954.0.tgz", - "integrity": "sha512-PXjS9P98OMMVXl4ledr/nTHGmNx6oF2rqTBvSQKKWi8dB4mcHjSaU5ASsklQC944xLs1IGsUkrJ39vu7bEqLoA==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "@aws-sdk/client-dynamodb": "^3.954.0" - } - }, - "scripts/utilities/supplier-data/node_modules/@aws-sdk/util-endpoints": { - "version": "3.953.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.953.0.tgz", - "integrity": "sha512-rjaS6jrFksopXvNg6YeN+D1lYwhcByORNlFuYesFvaQNtPOufbE5tJL4GJ3TMXyaY0uFR28N5BHHITPyWWfH/g==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.953.0", - "@smithy/types": "^4.10.0", - "@smithy/url-parser": "^4.2.6", - "@smithy/util-endpoints": "^3.2.6", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "scripts/utilities/supplier-data/node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.953.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.953.0.tgz", - "integrity": "sha512-UF5NeqYesWuFao+u7LJvpV1SJCaLml5BtFZKUdTnNNMeN6jvV+dW/eQoFGpXF94RCqguX0XESmRuRRPQp+/rzQ==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.953.0", - "@smithy/types": "^4.10.0", - "bowser": "^2.11.0", - "tslib": "^2.6.2" - } - }, - "scripts/utilities/supplier-data/node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.954.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.954.0.tgz", - "integrity": "sha512-fB5S5VOu7OFkeNzcblQlez4AjO5hgDFaa7phYt7716YWisY3RjAaQPlxgv+G3GltHHDJIfzEC5aRxdf62B9zMg==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/middleware-user-agent": "3.954.0", - "@aws-sdk/types": "3.953.0", - "@smithy/node-config-provider": "^4.3.6", - "@smithy/types": "^4.10.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "aws-crt": ">=1.0.0" - }, - "peerDependenciesMeta": { - "aws-crt": { - "optional": true - } - } - }, - "scripts/utilities/supplier-data/node_modules/@aws-sdk/xml-builder": { - "version": "3.953.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.953.0.tgz", - "integrity": "sha512-Zmrj21jQ2OeOJGr9spPiN00aQvXa/WUqRXcTVENhrMt+OFoSOfDFpYhUj9NQ09QmQ8KMWFoWuWW6iKurNqLvAA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.10.0", - "fast-xml-parser": "5.2.5", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "scripts/utilities/supplier-data/node_modules/@smithy/util-waiter": { - "version": "4.2.6", - "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-4.2.6.tgz", - "integrity": "sha512-xU9HwUSik9UUCJmm530yvBy0AwlQFICveKmqvaaTukKkXEAhyiBdHtSrhPrH3rH+uz0ykyaE3LdgsX86C6mDCQ==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/abort-controller": "^4.2.6", - "@smithy/types": "^4.10.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, "scripts/utilities/supplier-data/node_modules/cliui": { "version": "8.0.1", "license": "ISC", From 0bcc6e4bf539f7e3107ddd6b31600a4051d1547d Mon Sep 17 00:00:00 2001 From: David Wass Date: Thu, 8 Jan 2026 10:21:57 +0000 Subject: [PATCH 15/20] schema version --- internal/events/package.json | 2 +- .../src/mappers/__tests__/letter-mapper.test.ts | 2 +- package-lock.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/internal/events/package.json b/internal/events/package.json index 09e72bde..395859af 100644 --- a/internal/events/package.json +++ b/internal/events/package.json @@ -50,5 +50,5 @@ "typecheck": "tsc --noEmit" }, "types": "dist/index.d.ts", - "version": "1.0.6" + "version": "1.0.7" } diff --git a/lambdas/letter-updates-transformer/src/mappers/__tests__/letter-mapper.test.ts b/lambdas/letter-updates-transformer/src/mappers/__tests__/letter-mapper.test.ts index 93429c90..06978a41 100644 --- a/lambdas/letter-updates-transformer/src/mappers/__tests__/letter-mapper.test.ts +++ b/lambdas/letter-updates-transformer/src/mappers/__tests__/letter-mapper.test.ts @@ -22,7 +22,7 @@ describe("letter-mapper", () => { expect(event.dataschema).toBe( `https://notify.nhs.uk/cloudevents/schemas/supplier-api/letter.PRINTED.${event.dataschemaversion}.schema.json` ); - expect(event.dataschemaversion).toBe("1.0.6"); + expect(event.dataschemaversion).toBe("1.0.7"); expect(event.subject).toBe("letter-origin/supplier-api/letter/id1"); expect(event.time).toBe("2025-11-24T15:55:18.000Z"); expect(event.recordedtime).toBe("2025-11-24T15:55:18.000Z"); diff --git a/package-lock.json b/package-lock.json index 643e5426..3bd59ae7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -125,7 +125,7 @@ }, "internal/events": { "name": "@nhsdigital/nhs-notify-event-schemas-supplier-api", - "version": "1.0.6", + "version": "1.0.7", "license": "MIT", "dependencies": { "@asyncapi/bundler": "^0.6.4", From 8d589caf757bb966abb58e033a9cd63397170cb8 Mon Sep 17 00:00:00 2001 From: David Wass Date: Thu, 8 Jan 2026 10:56:43 +0000 Subject: [PATCH 16/20] fix typecheck --- internal/events/tsconfig.json | 3 +-- scripts/utilities/letter-test-data/src/cli/index.ts | 4 ++-- scripts/utilities/supplier-data/src/cli/index.ts | 2 +- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/internal/events/tsconfig.json b/internal/events/tsconfig.json index a9b1c7ab..fa5c2949 100644 --- a/internal/events/tsconfig.json +++ b/internal/events/tsconfig.json @@ -14,7 +14,6 @@ "extends": "../../tsconfig.base.json", "include": [ "src/**/*", - "package.json", - "jest.config.ts" + "package.json" ] } diff --git a/scripts/utilities/letter-test-data/src/cli/index.ts b/scripts/utilities/letter-test-data/src/cli/index.ts index 97b6e038..0d2ec0f1 100644 --- a/scripts/utilities/letter-test-data/src/cli/index.ts +++ b/scripts/utilities/letter-test-data/src/cli/index.ts @@ -6,8 +6,8 @@ import { createLetter, createLetterDto, } from "../helpers/create-letter-helpers"; -import { createLetterRepository } from "../infrastructure/letter-repo-factory"; -import { uploadFile } from "../helpers/s3-helpers"; +import createLetterRepository from "../infrastructure/letter-repo-factory"; +import uploadFile from "../helpers/s3-helpers"; async function main() { await yargs(hideBin(process.argv)) diff --git a/scripts/utilities/supplier-data/src/cli/index.ts b/scripts/utilities/supplier-data/src/cli/index.ts index cc60ae5e..bda349ed 100644 --- a/scripts/utilities/supplier-data/src/cli/index.ts +++ b/scripts/utilities/supplier-data/src/cli/index.ts @@ -1,6 +1,6 @@ import { hideBin } from "yargs/helpers"; import yargs from "yargs"; -import { createSupplierRepository } from "../infrastructure/suppliers-repo-factory"; +import createSupplierRepository from "../infrastructure/suppliers-repo-factory"; async function main() { await yargs(hideBin(process.argv)) From 4e9a29c95bb17a75dbe27630b599312e665813b8 Mon Sep 17 00:00:00 2001 From: David Wass Date: Thu, 8 Jan 2026 11:18:03 +0000 Subject: [PATCH 17/20] further lamdba fixes --- lambdas/api-handler/package.json | 1 + .../src/mappers/__tests__/letter-mapper.test.ts | 2 +- package-lock.json | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/lambdas/api-handler/package.json b/lambdas/api-handler/package.json index 5a436473..d68c90ec 100644 --- a/lambdas/api-handler/package.json +++ b/lambdas/api-handler/package.json @@ -7,6 +7,7 @@ "@aws-sdk/s3-request-presigner": "^3.925.0", "@internal/datastore": "*", "@internal/helpers": "*", + "aws-lambda": "^1.0.7", "esbuild": "^0.25.11", "pino": "^9.7.0", "zod": "^4.1.11" diff --git a/lambdas/letter-updates-transformer/src/mappers/__tests__/letter-mapper.test.ts b/lambdas/letter-updates-transformer/src/mappers/__tests__/letter-mapper.test.ts index 06978a41..6fc36ff0 100644 --- a/lambdas/letter-updates-transformer/src/mappers/__tests__/letter-mapper.test.ts +++ b/lambdas/letter-updates-transformer/src/mappers/__tests__/letter-mapper.test.ts @@ -20,7 +20,7 @@ describe("letter-mapper", () => { $LetterEvent.parse(event); expect(event.type).toBe("uk.nhs.notify.supplier-api.letter.PRINTED.v1"); expect(event.dataschema).toBe( - `https://notify.nhs.uk/cloudevents/schemas/supplier-api/letter.PRINTED.${event.dataschemaversion}.schema.json` + `https://notify.nhs.uk/cloudevents/schemas/supplier-api/letter.PRINTED.${event.dataschemaversion}.schema.json`, ); expect(event.dataschemaversion).toBe("1.0.7"); expect(event.subject).toBe("letter-origin/supplier-api/letter/id1"); diff --git a/package-lock.json b/package-lock.json index 3bd59ae7..c0ca0687 100644 --- a/package-lock.json +++ b/package-lock.json @@ -178,6 +178,7 @@ "@aws-sdk/s3-request-presigner": "^3.925.0", "@internal/datastore": "*", "@internal/helpers": "*", + "aws-lambda": "^1.0.7", "esbuild": "^0.25.11", "pino": "^9.7.0", "zod": "^4.1.11" From 3ec412eed55558586a7e1bef108eac2938babced Mon Sep 17 00:00:00 2001 From: David Wass Date: Thu, 8 Jan 2026 11:28:13 +0000 Subject: [PATCH 18/20] test auto fixes --- .../get-letter-status.spec.ts | 2 +- .../apiGateway-tests/testCases/create-mi.ts | 62 +++++++++---------- .../testCases/update-letter-status.ts | 4 +- .../update-letter-status.spec.ts | 10 +-- tests/config/reporters.ts | 2 +- tests/config/sandbox.config.ts | 2 +- tests/helpers/generate-fetch-test-data.ts | 8 +-- tests/helpers/pnpm-helpers.ts | 10 +-- tests/helpers/validate-json-schema.ts | 4 +- tests/mtls/mtls-test.spec.ts | 10 +-- tests/sandbox/get-letter-status.spec.ts | 2 +- tests/sandbox/get-list-of-letters.spec.ts | 2 +- tests/sandbox/update-letter-status.spec.ts | 2 +- .../update-multiple-letter-status.spec.ts | 2 +- 14 files changed, 61 insertions(+), 61 deletions(-) diff --git a/tests/component-tests/apiGateway-tests/get-letter-status.spec.ts b/tests/component-tests/apiGateway-tests/get-letter-status.spec.ts index c2a12bf9..aa5d475c 100644 --- a/tests/component-tests/apiGateway-tests/get-letter-status.spec.ts +++ b/tests/component-tests/apiGateway-tests/get-letter-status.spec.ts @@ -30,7 +30,7 @@ test.describe("API Gateway Tests to Verify Get Letter Status Endpoint", () => { `${baseUrl}/${SUPPLIER_LETTERS}/${letter.id}`, { headers, - } + }, ); const responseBody = await response.json(); diff --git a/tests/component-tests/apiGateway-tests/testCases/create-mi.ts b/tests/component-tests/apiGateway-tests/testCases/create-mi.ts index f7f0b222..c9ba204a 100644 --- a/tests/component-tests/apiGateway-tests/testCases/create-mi.ts +++ b/tests/component-tests/apiGateway-tests/testCases/create-mi.ts @@ -1,70 +1,70 @@ - - - export type MiRequestBody = { data: { type: string; attributes: { - groupId: string; - lineItem: string; - quantity: number; - specificationId: string; - stockRemaining: number; - timestamp: string; + groupId: string; + lineItem: string; + quantity: number; + specificationId: string; + stockRemaining: number; + timestamp: string; }; }; }; -export function miValidRequest() : MiRequestBody{ +export function miValidRequest(): MiRequestBody { let requestBody: MiRequestBody; requestBody = { data: { -  attributes: { - groupId: 'group123', - lineItem: 'envelope-business-standard', + attributes: { + groupId: "group123", + lineItem: "envelope-business-standard", quantity: 10, - specificationId: 'Test-Spec-Id', + specificationId: "Test-Spec-Id", stockRemaining: 100, timestamp: new Date().toISOString(), }, - type: 'ManagementInformation', - }}; + type: "ManagementInformation", + }, + }; return requestBody; } -export function miInvalidRequest() : MiRequestBody{ +export function miInvalidRequest(): MiRequestBody { let requestBody: MiRequestBody; requestBody = { data: { -  attributes: { - groupId: 'group123', - lineItem: 'envelope-business-standard', + attributes: { + groupId: "group123", + lineItem: "envelope-business-standard", quantity: 10, - specificationId: 'Test-Spec-Id', + specificationId: "Test-Spec-Id", stockRemaining: 100, timestamp: new Date().toISOString(), }, - type: '?', - }}; + type: "?", + }, + }; return requestBody; } -export function miInvalidDateRequest() : MiRequestBody{ +export function miInvalidDateRequest(): MiRequestBody { let requestBody: MiRequestBody; requestBody = { data: { -  attributes: { - groupId: 'group123', - lineItem: 'envelope-business-standard', + attributes: { + groupId: "group123", + lineItem: "envelope-business-standard", quantity: 10, - specificationId: 'Test-Spec-Id', + specificationId: "Test-Spec-Id", stockRemaining: 100, - timestamp: '2021-10-28T', + timestamp: "2021-10-28T", }, - type: 'ManagementInformation', - }}; + type: "ManagementInformation", + }, + }; return requestBody; } diff --git a/tests/component-tests/apiGateway-tests/testCases/update-letter-status.ts b/tests/component-tests/apiGateway-tests/testCases/update-letter-status.ts index 368711a3..5f4d14db 100644 --- a/tests/component-tests/apiGateway-tests/testCases/update-letter-status.ts +++ b/tests/component-tests/apiGateway-tests/testCases/update-letter-status.ts @@ -41,7 +41,7 @@ export function patchRequestHeaders(): RequestHeaders { export function patchValidRequestBody( id: string, - status: string + status: string, ): PatchMessageRequestBody { let requestBody: PatchMessageRequestBody; @@ -59,7 +59,7 @@ export function patchValidRequestBody( export function patchFailureRequestBody( id: string, - status: string + status: string, ): PatchMessageRequestBody { let requestBody: PatchMessageRequestBody; diff --git a/tests/component-tests/apiGateway-tests/update-letter-status.spec.ts b/tests/component-tests/apiGateway-tests/update-letter-status.spec.ts index 371dbba2..bd90cb26 100644 --- a/tests/component-tests/apiGateway-tests/update-letter-status.spec.ts +++ b/tests/component-tests/apiGateway-tests/update-letter-status.spec.ts @@ -45,7 +45,7 @@ test.describe("API Gateway Tests to Verify Patch Status Endpoint", () => { { headers, data: body, - } + }, ); expect(response.status()).toBe(202); @@ -72,7 +72,7 @@ test.describe("API Gateway Tests to Verify Patch Status Endpoint", () => { { headers, data: body, - } + }, ); expect(response.status()).toBe(202); @@ -92,7 +92,7 @@ test.describe("API Gateway Tests to Verify Patch Status Endpoint", () => { { headers, data: body, - } + }, ); const responseBody = await response.json(); @@ -113,7 +113,7 @@ test.describe("API Gateway Tests to Verify Patch Status Endpoint", () => { { headers, data: body, - } + }, ); const responseBody = await response.json(); @@ -133,7 +133,7 @@ test.describe("API Gateway Tests to Verify Patch Status Endpoint", () => { { headers, data: body, - } + }, ); const responseBody = await response.json(); diff --git a/tests/config/reporters.ts b/tests/config/reporters.ts index 913e09c3..b07ac8b7 100644 --- a/tests/config/reporters.ts +++ b/tests/config/reporters.ts @@ -1,5 +1,5 @@ import type { ReporterDescription } from "@playwright/test"; -import path from "path"; +import path from "node:path"; const resultsDir = process.env.RESULTS_DIR || "results"; const reportsDir = process.env.REPORTS_DIR || "reports"; diff --git a/tests/config/sandbox.config.ts b/tests/config/sandbox.config.ts index 79fd5c9a..6f63788b 100644 --- a/tests/config/sandbox.config.ts +++ b/tests/config/sandbox.config.ts @@ -1,7 +1,7 @@ import type { PlaywrightTestConfig } from "@playwright/test"; +import path from "node:path"; import { config as baseConfig } from "./playwright.base.config"; import { getReporters } from "./reporters"; -import path from "path"; const localConfig: PlaywrightTestConfig = { /* Reporter to use. See https://playwright.dev/docs/test-reporters */ diff --git a/tests/helpers/generate-fetch-test-data.ts b/tests/helpers/generate-fetch-test-data.ts index 7e7eee77..d0a0486b 100644 --- a/tests/helpers/generate-fetch-test-data.ts +++ b/tests/helpers/generate-fetch-test-data.ts @@ -33,7 +33,7 @@ export interface SupplierApiLetters { export async function createTestData( supplierId: string, - count?: number + count?: number, ): Promise { await runCreateLetter({ filter: "nhs-notify-supplier-api-letter-test-data-utility", @@ -50,7 +50,7 @@ export async function createTestData( export const getLettersBySupplier = async ( supplierId: string, status: string, - limit: number + limit: number, ) => { const supplierStatus = `${supplierId}#${status}`; const params = { @@ -78,13 +78,13 @@ export const deleteLettersBySupplier = async (id: string) => { TableName: LETTERSTABLENAME, Key: { supplierId: SUPPLIERID, id }, ReturnValues: "ALL_OLD", - }) + }), ); return resp.Attributes; }; export async function checkSupplierExists( - supplierId: string + supplierId: string, ): Promise { try { const params = { diff --git a/tests/helpers/pnpm-helpers.ts b/tests/helpers/pnpm-helpers.ts index d71b1d18..f792739a 100644 --- a/tests/helpers/pnpm-helpers.ts +++ b/tests/helpers/pnpm-helpers.ts @@ -29,7 +29,7 @@ export async function runCreateLetter(options: { const workspaceRoot = path.resolve( __dirname, - "../../scripts/utilities/letter-test-data" + "../../scripts/utilities/letter-test-data", ); const cmd = process.platform === "win32" ? "npm.cmd" : "npm"; const root = path.resolve(workspaceRoot); @@ -73,7 +73,7 @@ export async function runCreateLetter(options: { }); child.on("close", (code) => - code === 0 ? resolve() : reject(new Error(`pnpm exited with ${code}`)) + code === 0 ? resolve() : reject(new Error(`pnpm exited with ${code}`)), ); child.on("error", reject); }); @@ -87,11 +87,11 @@ export async function createSupplierData(options: { environment: string; status: string; }) { - const { apimId, environment, name, status, supplierId, filter } = options; + const { apimId, environment, filter, name, status, supplierId } = options; const workspaceRoot = path.resolve( __dirname, - "../../scripts/utilities/supplier-data" + "../../scripts/utilities/supplier-data", ); const cmd = process.platform === "win32" ? "npm.cmd" : "npm"; const root = path.resolve(workspaceRoot); @@ -131,7 +131,7 @@ export async function createSupplierData(options: { }); child.on("close", (code) => - code === 0 ? resolve() : reject(new Error(`pnpm exited with ${code}`)) + code === 0 ? resolve() : reject(new Error(`pnpm exited with ${code}`)), ); child.on("error", reject); }); diff --git a/tests/helpers/validate-json-schema.ts b/tests/helpers/validate-json-schema.ts index 82dd7e80..b3987d99 100644 --- a/tests/helpers/validate-json-schema.ts +++ b/tests/helpers/validate-json-schema.ts @@ -19,7 +19,7 @@ export default async function validateApiResponse( method: string, pathVar: string, status: number, - body: any + body: any, ): Promise { const openapiDoc = await import(paths); @@ -36,7 +36,7 @@ export default async function validateApiResponse( operation.responses[status] || operation.responses.default; if (!responseSchema) { throw new Error( - `No schema defined for status ${status} at ${method.toUpperCase()} ${pathVar}` + `No schema defined for status ${status} at ${method.toUpperCase()} ${pathVar}`, ); } diff --git a/tests/mtls/mtls-test.spec.ts b/tests/mtls/mtls-test.spec.ts index b3fbee6d..256b3c96 100644 --- a/tests/mtls/mtls-test.spec.ts +++ b/tests/mtls/mtls-test.spec.ts @@ -1,7 +1,7 @@ -import { test, expect, request, APIRequestContext } from "@playwright/test"; +import { APIRequestContext, expect, request, test } from "@playwright/test"; // Assume you have your constants in a config file -const PROXY_URL = process.env.PROXY_URL; +const { PROXY_URL } = process.env; test("should fail when connecting without client certificate", async () => { let apiContext: APIRequestContext | null = null; @@ -15,15 +15,15 @@ test("should fail when connecting without client certificate", async () => { // Check if request succeeded or failed if (response.ok()) { throw new Error( - `Expected connection failure, but got success with status ${response.status()}` + `Expected connection failure, but got success with status ${response.status()}`, ); } // Assert on the actual error code returned by the gateway // For mTLS, often 401, 403, or 502 depending on infra config expect(response.ok()).toBeFalsy(); - } catch (err: any) { + } catch (error: any) { // If the request truly fails at the TLS layer, Playwright will throw instead - expect(err.message).toMatch(/SSL|certificate|ECONNRESET|socket/i); + expect(error.message).toMatch(/SSL|certificate|ECONNRESET|socket/i); } finally { if (apiContext) { await apiContext.dispose(); diff --git a/tests/sandbox/get-letter-status.spec.ts b/tests/sandbox/get-letter-status.spec.ts index 173b6a1f..52401f71 100644 --- a/tests/sandbox/get-letter-status.spec.ts +++ b/tests/sandbox/get-letter-status.spec.ts @@ -20,7 +20,7 @@ test.describe("Sandbox Tests To Get Letter Status", () => { `${SUPPLIER_API_URL_SANDBOX}/${SUPPLIER_LETTERS}/${id}`, { headers: header, - } + }, ); expect(response.status()).toBe(expectedStatus); diff --git a/tests/sandbox/get-list-of-letters.spec.ts b/tests/sandbox/get-list-of-letters.spec.ts index 4132b40d..624a2227 100644 --- a/tests/sandbox/get-list-of-letters.spec.ts +++ b/tests/sandbox/get-list-of-letters.spec.ts @@ -21,7 +21,7 @@ test.describe("Sandbox Tests To Get List Of Pending Letters ", () => { params: { limit, }, - } + }, ); const res = await response.json(); diff --git a/tests/sandbox/update-letter-status.spec.ts b/tests/sandbox/update-letter-status.spec.ts index 996683a9..dcd724fd 100644 --- a/tests/sandbox/update-letter-status.spec.ts +++ b/tests/sandbox/update-letter-status.spec.ts @@ -20,7 +20,7 @@ test.describe("Sandbox Tests To Update Letter Status", () => { { headers: header, data: body, - } + }, ); const res = await response.json(); diff --git a/tests/sandbox/update-multiple-letter-status.spec.ts b/tests/sandbox/update-multiple-letter-status.spec.ts index c5ebba51..f7e30198 100644 --- a/tests/sandbox/update-multiple-letter-status.spec.ts +++ b/tests/sandbox/update-multiple-letter-status.spec.ts @@ -18,7 +18,7 @@ test.describe("Sandbox Tests To Update Multiple Letter Status", () => { { headers: header, data: body, - } + }, ); expect(response.status()).toBe(expectedStatus); }); From a16e1dfeb90fbbce53cd1aa36f8b41ec1933d207 Mon Sep 17 00:00:00 2001 From: David Wass Date: Thu, 8 Jan 2026 11:35:43 +0000 Subject: [PATCH 19/20] tests - manual fixes --- .../apiGateway-tests/testCases/create-mi.ts | 15 +++---------- .../testCases/update-letter-status.ts | 22 +++++-------------- tests/config/reporters.ts | 1 - tests/helpers/pnpm-helpers.ts | 4 ++-- 4 files changed, 10 insertions(+), 32 deletions(-) diff --git a/tests/component-tests/apiGateway-tests/testCases/create-mi.ts b/tests/component-tests/apiGateway-tests/testCases/create-mi.ts index c9ba204a..e3f60db9 100644 --- a/tests/component-tests/apiGateway-tests/testCases/create-mi.ts +++ b/tests/component-tests/apiGateway-tests/testCases/create-mi.ts @@ -13,9 +13,7 @@ export type MiRequestBody = { }; export function miValidRequest(): MiRequestBody { - let requestBody: MiRequestBody; - - requestBody = { + return { data: { attributes: { groupId: "group123", @@ -28,13 +26,10 @@ export function miValidRequest(): MiRequestBody { type: "ManagementInformation", }, }; - return requestBody; } export function miInvalidRequest(): MiRequestBody { - let requestBody: MiRequestBody; - - requestBody = { + return { data: { attributes: { groupId: "group123", @@ -47,13 +42,10 @@ export function miInvalidRequest(): MiRequestBody { type: "?", }, }; - return requestBody; } export function miInvalidDateRequest(): MiRequestBody { - let requestBody: MiRequestBody; - - requestBody = { + return { data: { attributes: { groupId: "group123", @@ -66,5 +58,4 @@ export function miInvalidDateRequest(): MiRequestBody { type: "ManagementInformation", }, }; - return requestBody; } diff --git a/tests/component-tests/apiGateway-tests/testCases/update-letter-status.ts b/tests/component-tests/apiGateway-tests/testCases/update-letter-status.ts index 5f4d14db..10a9184f 100644 --- a/tests/component-tests/apiGateway-tests/testCases/update-letter-status.ts +++ b/tests/component-tests/apiGateway-tests/testCases/update-letter-status.ts @@ -29,23 +29,19 @@ export type PatchMessageResponseBody = { }; export function patchRequestHeaders(): RequestHeaders { - let requestHeaders: RequestHeaders; - requestHeaders = { + return { headerauth1: process.env.HEADERAUTH || "", "NHSD-Supplier-ID": SUPPLIERID, "NHSD-Correlation-ID": "12344", "X-Request-ID": "requestId1", }; - return requestHeaders; } export function patchValidRequestBody( id: string, status: string, ): PatchMessageRequestBody { - let requestBody: PatchMessageRequestBody; - - requestBody = { + return { data: { attributes: { status, @@ -54,16 +50,13 @@ export function patchValidRequestBody( id, }, }; - return requestBody; } export function patchFailureRequestBody( id: string, status: string, ): PatchMessageRequestBody { - let requestBody: PatchMessageRequestBody; - - requestBody = { + return { data: { attributes: { status, @@ -74,12 +67,10 @@ export function patchFailureRequestBody( id, }, }; - return requestBody; } export function patch400ErrorResponseBody(): ErrorMessageBody { - let responseBody: ErrorMessageBody; - responseBody = { + return { errors: [ { id: "12344", @@ -94,12 +85,10 @@ export function patch400ErrorResponseBody(): ErrorMessageBody { }, ], }; - return responseBody; } export function patch500ErrorResponseBody(id: string): ErrorMessageBody { - let responseBody: ErrorMessageBody; - responseBody = { + return { errors: [ { id: "12344", @@ -114,5 +103,4 @@ export function patch500ErrorResponseBody(id: string): ErrorMessageBody { }, ], }; - return responseBody; } diff --git a/tests/config/reporters.ts b/tests/config/reporters.ts index b07ac8b7..6579d8bd 100644 --- a/tests/config/reporters.ts +++ b/tests/config/reporters.ts @@ -2,7 +2,6 @@ import type { ReporterDescription } from "@playwright/test"; import path from "node:path"; const resultsDir = process.env.RESULTS_DIR || "results"; -const reportsDir = process.env.REPORTS_DIR || "reports"; export function getReporters(allureFolder: string) { return [ diff --git a/tests/helpers/pnpm-helpers.ts b/tests/helpers/pnpm-helpers.ts index f792739a..a0578072 100644 --- a/tests/helpers/pnpm-helpers.ts +++ b/tests/helpers/pnpm-helpers.ts @@ -69,7 +69,7 @@ export async function runCreateLetter(options: { child.stdout?.on("id", (id) => { const text = id.toString(); output += text; - process.stdout.write(text); + process.stdout.write(output); }); child.on("close", (code) => @@ -127,7 +127,7 @@ export async function createSupplierData(options: { child.stdout?.on("id", (id) => { const text = id.toString(); output += text; - process.stdout.write(text); + process.stdout.write(output); }); child.on("close", (code) => From 90c7515a7243fc6817214e8aacdb90d62ccda720 Mon Sep 17 00:00:00 2001 From: David Wass Date: Thu, 8 Jan 2026 11:54:25 +0000 Subject: [PATCH 20/20] add jest.config to ts config --- internal/events/tsconfig.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/internal/events/tsconfig.json b/internal/events/tsconfig.json index fa5c2949..a9b1c7ab 100644 --- a/internal/events/tsconfig.json +++ b/internal/events/tsconfig.json @@ -14,6 +14,7 @@ "extends": "../../tsconfig.base.json", "include": [ "src/**/*", - "package.json" + "package.json", + "jest.config.ts" ] }