From 522fc62132da84d2211377dabe3a4e648ffbd12f Mon Sep 17 00:00:00 2001 From: tstephen-nhs <231503406+tstephen-nhs@users.noreply.github.com> Date: Tue, 31 Mar 2026 10:59:39 +0000 Subject: [PATCH 01/20] chore: migrate test config from jest to vitest --- jest.default.config.ts | 35 - package-lock.json | 1496 +++++++++++++++-- package.json | 3 + .../capabilityStatement/.vscode/launch.json | 67 +- .../capabilityStatement/.vscode/settings.json | 6 +- packages/capabilityStatement/jest.config.ts | 9 - packages/capabilityStatement/package.json | 2 +- .../tests/test-handler.test.ts | 6 +- packages/capabilityStatement/vitest.config.ts | 6 + .../.vscode/launch.json | 41 +- .../.vscode/settings.json | 6 +- .../jest.config.ts | 10 - .../package.json | 2 +- .../tests/testDynamoDBclient.test.ts | 2 +- .../tests/testHander.test.ts | 28 +- .../vitest.config.ts | 9 + .../middyErrorHandler/.vscode/launch.json | 41 +- .../middyErrorHandler/.vscode/settings.json | 6 +- .../common/middyErrorHandler/jest.config.ts | 9 - .../common/middyErrorHandler/package.json | 2 +- .../tests/testErrorHandler.test.ts | 6 +- .../common/middyErrorHandler/vitest.config.ts | 6 + packages/common/utilities/jest.config.ts | 9 - packages/cpsuLambda/.vscode/launch.json | 37 +- packages/cpsuLambda/.vscode/settings.json | 6 +- packages/cpsuLambda/jest.config.ts | 9 - packages/cpsuLambda/package.json | 2 +- .../tests/format_1/business_states.test.ts | 6 + packages/cpsuLambda/tests/testHandler.test.ts | 14 +- packages/cpsuLambda/vitest.config.ts | 6 + packages/gsul/.vscode/launch.json | 41 +- packages/gsul/.vscode/settings.json | 6 +- packages/gsul/jest.config.ts | 9 - packages/gsul/package.json | 2 +- ...lterOutFutureReduceToLatestUpdates.test.ts | 1 + packages/gsul/tests/testHander.test.ts | 11 +- .../gsul/tests/testRunDynamoDBQueries.test.ts | 17 +- packages/gsul/vitest.config.ts | 6 + packages/nhsNotifyLambda/jest.config.ts | 10 - .../nhsNotifyUpdateCallback/jest.config.ts | 10 - packages/nhsd-psu-sandbox/.vscode/launch.json | 37 +- .../nhsd-psu-sandbox/.vscode/settings.json | 8 +- packages/nhsd-psu-sandbox/jest.config.ts | 9 - packages/nhsd-psu-sandbox/package.json | 2 +- .../tests/test-handler.test.ts | 2 +- packages/nhsd-psu-sandbox/vitest.config.ts | 6 + packages/postDatedLambda/jest.config.ts | 10 - .../psuRestoreValidationLambda/jest.config.ts | 9 - packages/specification/jest.config.ts | 9 - packages/statusLambda/jest.config.ts | 9 - .../updatePrescriptionStatus/jest.config.ts | 10 - vitest.default.config.ts | 18 + 52 files changed, 1606 insertions(+), 523 deletions(-) delete mode 100644 jest.default.config.ts delete mode 100644 packages/capabilityStatement/jest.config.ts create mode 100644 packages/capabilityStatement/vitest.config.ts delete mode 100644 packages/checkPrescriptionStatusUpdates/jest.config.ts create mode 100644 packages/checkPrescriptionStatusUpdates/vitest.config.ts delete mode 100644 packages/common/middyErrorHandler/jest.config.ts create mode 100644 packages/common/middyErrorHandler/vitest.config.ts delete mode 100644 packages/common/utilities/jest.config.ts delete mode 100644 packages/cpsuLambda/jest.config.ts create mode 100644 packages/cpsuLambda/vitest.config.ts delete mode 100644 packages/gsul/jest.config.ts create mode 100644 packages/gsul/vitest.config.ts delete mode 100644 packages/nhsNotifyLambda/jest.config.ts delete mode 100644 packages/nhsNotifyUpdateCallback/jest.config.ts delete mode 100644 packages/nhsd-psu-sandbox/jest.config.ts create mode 100644 packages/nhsd-psu-sandbox/vitest.config.ts delete mode 100644 packages/postDatedLambda/jest.config.ts delete mode 100644 packages/psuRestoreValidationLambda/jest.config.ts delete mode 100644 packages/specification/jest.config.ts delete mode 100644 packages/statusLambda/jest.config.ts delete mode 100644 packages/updatePrescriptionStatus/jest.config.ts create mode 100644 vitest.default.config.ts diff --git a/jest.default.config.ts b/jest.default.config.ts deleted file mode 100644 index f48396aa26..0000000000 --- a/jest.default.config.ts +++ /dev/null @@ -1,35 +0,0 @@ -/* - * For a detailed explanation regarding each configuration property and type check, visit: - * https://jestjs.io/docs/configuration - */ - -import type {JestConfigWithTsJest} from "ts-jest" - -const esModules = ["@middy"].join("|") -const jestConfig: JestConfigWithTsJest = { - preset: "ts-jest/presets/default-esm", - moduleFileExtensions: ["js", "json", "ts", "d.ts"], - moduleNameMapper: { - "^(\\.{1,2}/.*)\\.js$": "$1" - }, - transform: { - "^.+\\.ts?$": [ - "ts-jest", - { - useESM: true, - tsconfig: "./tsconfig.json" - } - ] - }, - clearMocks: true, - collectCoverage: true, - coverageDirectory: "coverage", - coverageProvider: "v8", - testMatch: ["**/tests/**/*.test.ts"], - testEnvironment: "node", - extensionsToTreatAsEsm: [".ts"], - verbose: true, - transformIgnorePatterns: [`node_modules/(?!${esModules})`] -} - -export default jestConfig diff --git a/package-lock.json b/package-lock.json index d52d2fae56..f7be2f549c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -40,6 +40,7 @@ "@types/node": "^25.5.0", "@typescript-eslint/eslint-plugin": "^8.57.1", "@typescript-eslint/parser": "^8.57.1", + "@vitest/coverage-v8": "^3.2.4", "aws-lambda": "^1.0.7", "eslint": "^10.1.0", "eslint-config-prettier": "^10.1.8", @@ -51,7 +52,23 @@ "ts-jest": "^29.4.6", "ts-node": "^10.9.2", "typescript": "^5.9.3", - "typescript-eslint": "^8.57.0" + "typescript-eslint": "^8.57.0", + "vite-tsconfig-paths": "^5.1.4", + "vitest": "^3.2.4" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" } }, "node_modules/@aws-crypto/sha256-browser": { @@ -3617,161 +3634,511 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/@sinclair/typebox": { - "version": "0.34.41", + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.60.0.tgz", + "integrity": "sha512-WOhNW9K8bR3kf4zLxbfg6Pxu2ybOUbB2AjMDHSQx86LIF4rH4Ft7vmMwNt0loO0eonglSNy4cpD3MKXXKQu0/A==", + "cpu": [ + "arm" + ], "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true, + "os": [ + "android" + ] }, - "node_modules/@sinonjs/commons": { - "version": "3.0.1", + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.60.0.tgz", + "integrity": "sha512-u6JHLll5QKRvjciE78bQXDmqRqNs5M/3GVqZeMwvmjaNODJih/WIrJlFVEihvV0MiYFmd+ZyPr9wxOVbPAG2Iw==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "type-detect": "4.0.8" - } + "license": "MIT", + "optional": true, + "os": [ + "android" + ] }, - "node_modules/@sinonjs/fake-timers": { - "version": "13.0.5", + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.60.0.tgz", + "integrity": "sha512-qEF7CsKKzSRc20Ciu2Zw1wRrBz4g56F7r/vRwY430UPp/nt1x21Q/fpJ9N5l47WWvJlkNCPJz3QRVw008fi7yA==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@sinonjs/commons": "^3.0.1" - } + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] }, - "node_modules/@sinonjs/samsam": { - "version": "8.0.3", + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.60.0.tgz", + "integrity": "sha512-WADYozJ4QCnXCH4wPB+3FuGmDPoFseVCUrANmA5LWwGmC6FL14BWC7pcq+FstOZv3baGX65tZ378uT6WG8ynTw==", + "cpu": [ + "x64" + ], "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@sinonjs/commons": "^3.0.1", - "type-detect": "^4.1.0" - } + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] }, - "node_modules/@sinonjs/samsam/node_modules/type-detect": { - "version": "4.1.0", + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.60.0.tgz", + "integrity": "sha512-6b8wGHJlDrGeSE3aH5mGNHBjA0TTkxdoNHik5EkvPHCt351XnigA4pS7Wsj/Eo9Y8RBU6f35cjN9SYmCFBtzxw==", + "cpu": [ + "arm64" + ], "dev": true, "license": "MIT", - "engines": { - "node": ">=4" - } + "optional": true, + "os": [ + "freebsd" + ] }, - "node_modules/@sinonjs/text-encoding": { - "version": "0.7.3", + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.60.0.tgz", + "integrity": "sha512-h25Ga0t4jaylMB8M/JKAyrvvfxGRjnPQIR8lnCayyzEjEOx2EJIlIiMbhpWxDRKGKF8jbNH01NnN663dH638mA==", + "cpu": [ + "x64" + ], "dev": true, - "license": "(Unlicense OR Apache-2.0)" + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] }, - "node_modules/@smithy/abort-controller": { - "version": "4.2.12", - "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.2.12.tgz", - "integrity": "sha512-xolrFw6b+2iYGl6EcOL7IJY71vvyZ0DJ3mcKtpykqPe2uscwtzDZJa1uVQXyP7w9Dd+kGwYnPbMsJrGISKiY/Q==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.13.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.60.0.tgz", + "integrity": "sha512-RzeBwv0B3qtVBWtcuABtSuCzToo2IEAIQrcyB/b2zMvBWVbjo8bZDjACUpnaafaxhTw2W+imQbP2BD1usasK4g==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@smithy/config-resolver": { - "version": "4.4.13", - "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.4.13.tgz", - "integrity": "sha512-iIzMC5NmOUP6WL6o8iPBjFhUhBZ9pPjpUpQYWMUFQqKyXXzOftbfK8zcQCz/jFV1Psmf05BK5ypx4K2r4Tnwdg==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/node-config-provider": "^4.3.12", - "@smithy/types": "^4.13.1", - "@smithy/util-config-provider": "^4.2.2", - "@smithy/util-endpoints": "^3.3.3", - "@smithy/util-middleware": "^4.2.12", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.60.0.tgz", + "integrity": "sha512-Sf7zusNI2CIU1HLzuu9Tc5YGAHEZs5Lu7N1ssJG4Tkw6e0MEsN7NdjUDDfGNHy2IU+ENyWT+L2obgWiguWibWQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@smithy/core": { - "version": "3.23.12", - "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.23.12.tgz", - "integrity": "sha512-o9VycsYNtgC+Dy3I0yrwCqv9CWicDnke0L7EVOrZtJpjb2t0EjaEofmMrYc0T1Kn3yk32zm6cspxF9u9Bj7e5w==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/protocol-http": "^5.3.12", - "@smithy/types": "^4.13.1", - "@smithy/url-parser": "^4.2.12", - "@smithy/util-base64": "^4.3.2", - "@smithy/util-body-length-browser": "^4.2.2", - "@smithy/util-middleware": "^4.2.12", - "@smithy/util-stream": "^4.5.20", - "@smithy/util-utf8": "^4.2.2", - "@smithy/uuid": "^1.1.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.60.0.tgz", + "integrity": "sha512-DX2x7CMcrJzsE91q7/O02IJQ5/aLkVtYFryqCjduJhUfGKG6yJV8hxaw8pZa93lLEpPTP/ohdN4wFz7yp/ry9A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@smithy/credential-provider-imds": { - "version": "4.2.12", - "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.2.12.tgz", - "integrity": "sha512-cr2lR792vNZcYMriSIj+Um3x9KWrjcu98kn234xA6reOAFMmbRpQMOv8KPgEmLLtx3eldU6c5wALKFqNOhugmg==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/node-config-provider": "^4.3.12", - "@smithy/property-provider": "^4.2.12", - "@smithy/types": "^4.13.1", - "@smithy/url-parser": "^4.2.12", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.60.0.tgz", + "integrity": "sha512-09EL+yFVbJZlhcQfShpswwRZ0Rg+z/CsSELFCnPt3iK+iqwGsI4zht3secj5vLEs957QvFFXnzAT0FFPIxSrkQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@smithy/fetch-http-handler": { - "version": "5.3.15", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.3.15.tgz", - "integrity": "sha512-T4jFU5N/yiIfrtrsb9uOQn7RdELdM/7HbyLNr6uO/mpkj1ctiVs7CihVr51w4LyQlXWDpXFn4BElf1WmQvZu/A==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/protocol-http": "^5.3.12", - "@smithy/querystring-builder": "^4.2.12", - "@smithy/types": "^4.13.1", - "@smithy/util-base64": "^4.3.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.60.0.tgz", + "integrity": "sha512-i9IcCMPr3EXm8EQg5jnja0Zyc1iFxJjZWlb4wr7U2Wx/GrddOuEafxRdMPRYVaXjgbhvqalp6np07hN1w9kAKw==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@smithy/hash-node": { - "version": "4.2.12", - "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.2.12.tgz", - "integrity": "sha512-QhBYbGrbxTkZ43QoTPrK72DoYviDeg6YKDrHTMJbbC+A0sml3kSjzFtXP7BtbyJnXojLfTQldGdUR0RGD8dA3w==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.13.1", - "@smithy/util-buffer-from": "^4.2.2", - "@smithy/util-utf8": "^4.2.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.60.0.tgz", + "integrity": "sha512-DGzdJK9kyJ+B78MCkWeGnpXJ91tK/iKA6HwHxF4TAlPIY7GXEvMe8hBFRgdrR9Ly4qebR/7gfUs9y2IoaVEyog==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@smithy/invalid-dependency": { - "version": "4.2.12", - "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.2.12.tgz", - "integrity": "sha512-/4F1zb7Z8LOu1PalTdESFHR0RbPwHd3FcaG1sI3UEIriQTWakysgJr65lc1jj6QY5ye7aFsisajotH6UhWfm/g==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.13.1", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.60.0.tgz", + "integrity": "sha512-RwpnLsqC8qbS8z1H1AxBA1H6qknR4YpPR9w2XX0vo2Sz10miu57PkNcnHVaZkbqyw/kUWfKMI73jhmfi9BRMUQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@smithy/is-array-buffer": { + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.60.0.tgz", + "integrity": "sha512-Z8pPf54Ly3aqtdWC3G4rFigZgNvd+qJlOE52fmko3KST9SoGfAdSRCwyoyG05q1HrrAblLbk1/PSIV+80/pxLg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.60.0.tgz", + "integrity": "sha512-3a3qQustp3COCGvnP4SvrMHnPQ9d1vzCakQVRTliaz8cIp/wULGjiGpbcqrkv0WrHTEp8bQD/B3HBjzujVWLOA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.60.0.tgz", + "integrity": "sha512-pjZDsVH/1VsghMJ2/kAaxt6dL0psT6ZexQVrijczOf+PeP2BUqTHYejk3l6TlPRydggINOeNRhvpLa0AYpCWSQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.60.0.tgz", + "integrity": "sha512-3ObQs0BhvPgiUVZrN7gqCSvmFuMWvWvsjG5ayJ3Lraqv+2KhOsp+pUbigqbeWqueGIsnn+09HBw27rJ+gYK4VQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.60.0.tgz", + "integrity": "sha512-EtylprDtQPdS5rXvAayrNDYoJhIz1/vzN2fEubo3yLE7tfAw+948dO0g4M0vkTVFhKojnF+n6C8bDNe+gDRdTg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.60.0.tgz", + "integrity": "sha512-k09oiRCi/bHU9UVFqD17r3eJR9bn03TyKraCrlz5ULFJGdJGi7VOmm9jl44vOJvRJ6P7WuBi/s2A97LxxHGIdw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.60.0.tgz", + "integrity": "sha512-1o/0/pIhozoSaDJoDcec+IVLbnRtQmHwPV730+AOD29lHEEo4F5BEUB24H0OBdhbBBDwIOSuf7vgg0Ywxdfiiw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.60.0.tgz", + "integrity": "sha512-pESDkos/PDzYwtyzB5p/UoNU/8fJo68vcXM9ZW2V0kjYayj1KaaUfi1NmTUTUpMn4UhU4gTuK8gIaFO4UGuMbA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.60.0.tgz", + "integrity": "sha512-hj1wFStD7B1YBeYmvY+lWXZ7ey73YGPcViMShYikqKT1GtstIKQAtfUI6yrzPjAy/O7pO0VLXGmUVWXQMaYgTQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.60.0.tgz", + "integrity": "sha512-SyaIPFoxmUPlNDq5EHkTbiKzmSEmq/gOYFI/3HHJ8iS/v1mbugVa7dXUzcJGQfoytp9DJFLhHH4U3/eTy2Bq4w==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.60.0.tgz", + "integrity": "sha512-RdcryEfzZr+lAr5kRm2ucN9aVlCCa2QNq4hXelZxb8GG0NJSazq44Z3PCCc8wISRuCVnGs0lQJVX5Vp6fKA+IA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.60.0.tgz", + "integrity": "sha512-PrsWNQ8BuE00O3Xsx3ALh2Df8fAj9+cvvX9AIA6o4KpATR98c9mud4XtDWVvsEuyia5U4tVSTKygawyJkjm60w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@sinclair/typebox": { + "version": "0.34.41", + "dev": true, + "license": "MIT" + }, + "node_modules/@sinonjs/commons": { + "version": "3.0.1", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "13.0.5", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.1" + } + }, + "node_modules/@sinonjs/samsam": { + "version": "8.0.3", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.1", + "type-detect": "^4.1.0" + } + }, + "node_modules/@sinonjs/samsam/node_modules/type-detect": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/@sinonjs/text-encoding": { + "version": "0.7.3", + "dev": true, + "license": "(Unlicense OR Apache-2.0)" + }, + "node_modules/@smithy/abort-controller": { + "version": "4.2.12", + "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.2.12.tgz", + "integrity": "sha512-xolrFw6b+2iYGl6EcOL7IJY71vvyZ0DJ3mcKtpykqPe2uscwtzDZJa1uVQXyP7w9Dd+kGwYnPbMsJrGISKiY/Q==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/config-resolver": { + "version": "4.4.13", + "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.4.13.tgz", + "integrity": "sha512-iIzMC5NmOUP6WL6o8iPBjFhUhBZ9pPjpUpQYWMUFQqKyXXzOftbfK8zcQCz/jFV1Psmf05BK5ypx4K2r4Tnwdg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/node-config-provider": "^4.3.12", + "@smithy/types": "^4.13.1", + "@smithy/util-config-provider": "^4.2.2", + "@smithy/util-endpoints": "^3.3.3", + "@smithy/util-middleware": "^4.2.12", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/core": { + "version": "3.23.12", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.23.12.tgz", + "integrity": "sha512-o9VycsYNtgC+Dy3I0yrwCqv9CWicDnke0L7EVOrZtJpjb2t0EjaEofmMrYc0T1Kn3yk32zm6cspxF9u9Bj7e5w==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/protocol-http": "^5.3.12", + "@smithy/types": "^4.13.1", + "@smithy/url-parser": "^4.2.12", + "@smithy/util-base64": "^4.3.2", + "@smithy/util-body-length-browser": "^4.2.2", + "@smithy/util-middleware": "^4.2.12", + "@smithy/util-stream": "^4.5.20", + "@smithy/util-utf8": "^4.2.2", + "@smithy/uuid": "^1.1.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/credential-provider-imds": { + "version": "4.2.12", + "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.2.12.tgz", + "integrity": "sha512-cr2lR792vNZcYMriSIj+Um3x9KWrjcu98kn234xA6reOAFMmbRpQMOv8KPgEmLLtx3eldU6c5wALKFqNOhugmg==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/node-config-provider": "^4.3.12", + "@smithy/property-provider": "^4.2.12", + "@smithy/types": "^4.13.1", + "@smithy/url-parser": "^4.2.12", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/fetch-http-handler": { + "version": "5.3.15", + "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.3.15.tgz", + "integrity": "sha512-T4jFU5N/yiIfrtrsb9uOQn7RdELdM/7HbyLNr6uO/mpkj1ctiVs7CihVr51w4LyQlXWDpXFn4BElf1WmQvZu/A==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/protocol-http": "^5.3.12", + "@smithy/querystring-builder": "^4.2.12", + "@smithy/types": "^4.13.1", + "@smithy/util-base64": "^4.3.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/hash-node": { + "version": "4.2.12", + "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.2.12.tgz", + "integrity": "sha512-QhBYbGrbxTkZ43QoTPrK72DoYviDeg6YKDrHTMJbbC+A0sml3kSjzFtXP7BtbyJnXojLfTQldGdUR0RGD8dA3w==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.13.1", + "@smithy/util-buffer-from": "^4.2.2", + "@smithy/util-utf8": "^4.2.2", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/invalid-dependency": { + "version": "4.2.12", + "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.2.12.tgz", + "integrity": "sha512-/4F1zb7Z8LOu1PalTdESFHR0RbPwHd3FcaG1sI3UEIriQTWakysgJr65lc1jj6QY5ye7aFsisajotH6UhWfm/g==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.13.1", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@smithy/is-array-buffer": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-4.2.2.tgz", "integrity": "sha512-n6rQ4N8Jj4YTQO3YFrlgZuwKodf4zUFs7EJIWH86pSCWBaAtAGBFfCM7Wx6D2bBJ2xqFNxGBSrUWswT3M0VJow==", @@ -4352,6 +4719,24 @@ "@babel/types": "^7.28.2" } }, + "node_modules/@types/chai": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", + "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/deep-eql": "*", + "assertion-error": "^2.0.1" + } + }, + "node_modules/@types/deep-eql": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", + "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/esrecurse": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/@types/esrecurse/-/esrecurse-4.3.1.tgz", @@ -5561,6 +5946,219 @@ "win32" ] }, + "node_modules/@vitest/coverage-v8": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-3.2.4.tgz", + "integrity": "sha512-EyF9SXU6kS5Ku/U82E259WSnvg6c8KTjppUncuNdm5QHpe17mwREHnjDzozC8x9MZ0xfBUFSaLkRv4TMA75ALQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.3.0", + "@bcoe/v8-coverage": "^1.0.2", + "ast-v8-to-istanbul": "^0.3.3", + "debug": "^4.4.1", + "istanbul-lib-coverage": "^3.2.2", + "istanbul-lib-report": "^3.0.1", + "istanbul-lib-source-maps": "^5.0.6", + "istanbul-reports": "^3.1.7", + "magic-string": "^0.30.17", + "magicast": "^0.3.5", + "std-env": "^3.9.0", + "test-exclude": "^7.0.1", + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@vitest/browser": "3.2.4", + "vitest": "3.2.4" + }, + "peerDependenciesMeta": { + "@vitest/browser": { + "optional": true + } + } + }, + "node_modules/@vitest/coverage-v8/node_modules/@bcoe/v8-coverage": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-1.0.2.tgz", + "integrity": "sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@vitest/coverage-v8/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@vitest/coverage-v8/node_modules/brace-expansion": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", + "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@vitest/coverage-v8/node_modules/minimatch": { + "version": "10.2.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", + "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@vitest/coverage-v8/node_modules/test-exclude": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-7.0.2.tgz", + "integrity": "sha512-u9E6A+ZDYdp7a4WnarkXPZOx8Ilz46+kby6p1yZ8zsGTz9gYa6FIS7lj2oezzNKmtdyyJNNmmXDppga5GB7kSw==", + "dev": true, + "license": "ISC", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^10.4.1", + "minimatch": "^10.2.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@vitest/expect": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.2.4.tgz", + "integrity": "sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/chai": "^5.2.2", + "@vitest/spy": "3.2.4", + "@vitest/utils": "3.2.4", + "chai": "^5.2.0", + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/mocker": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.2.4.tgz", + "integrity": "sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/spy": "3.2.4", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.17" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "node_modules/@vitest/pretty-format": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.2.4.tgz", + "integrity": "sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.2.4.tgz", + "integrity": "sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/utils": "3.2.4", + "pathe": "^2.0.3", + "strip-literal": "^3.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/snapshot": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.2.4.tgz", + "integrity": "sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "3.2.4", + "magic-string": "^0.30.17", + "pathe": "^2.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/spy": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.2.4.tgz", + "integrity": "sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyspy": "^4.0.3" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.2.4.tgz", + "integrity": "sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/pretty-format": "3.2.4", + "loupe": "^3.1.4", + "tinyrainbow": "^2.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, "node_modules/abort-controller": { "version": "3.0.0", "dev": true, @@ -5618,6 +6216,7 @@ "version": "6.14.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", + "dev": true, "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", @@ -5771,6 +6370,35 @@ "sprintf-js": "~1.0.2" } }, + "node_modules/assertion-error": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/ast-v8-to-istanbul": { + "version": "0.3.12", + "resolved": "https://registry.npmjs.org/ast-v8-to-istanbul/-/ast-v8-to-istanbul-0.3.12.tgz", + "integrity": "sha512-BRRC8VRZY2R4Z4lFIL35MwNXmwVqBityvOIwETtsCSwvjl0IdgFsy9NhdaA6j74nUdtJJlIypeRhpDam19Wq3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.31", + "estree-walker": "^3.0.3", + "js-tokens": "^10.0.0" + } + }, + "node_modules/ast-v8-to-istanbul/node_modules/js-tokens": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-10.0.0.tgz", + "integrity": "sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==", + "dev": true, + "license": "MIT" + }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -6091,6 +6719,16 @@ "dev": true, "license": "MIT" }, + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/call-bind": { "version": "1.0.8", "license": "MIT", @@ -6203,6 +6841,23 @@ "upper-case-first": "^2.0.2" } }, + "node_modules/chai": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/chai/-/chai-5.3.3.tgz", + "integrity": "sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "assertion-error": "^2.0.1", + "check-error": "^2.1.1", + "deep-eql": "^5.0.1", + "loupe": "^3.1.0", + "pathval": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/chalk": { "version": "4.1.2", "dev": true, @@ -6246,6 +6901,16 @@ "node": ">=10" } }, + "node_modules/check-error": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.3.tgz", + "integrity": "sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 16" + } + }, "node_modules/checkPrescriptionStatusUpdates": { "resolved": "packages/checkPrescriptionStatusUpdates", "link": true @@ -6514,6 +7179,16 @@ } } }, + "node_modules/deep-eql": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", + "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/deep-is": { "version": "0.1.4", "dev": true, @@ -6670,6 +7345,13 @@ "node": ">= 0.4" } }, + "node_modules/es-module-lexer": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.7.0.tgz", + "integrity": "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==", + "dev": true, + "license": "MIT" + }, "node_modules/es-object-atoms": { "version": "1.1.1", "license": "MIT", @@ -7043,6 +7725,16 @@ "node": ">=4.0" } }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, "node_modules/esutils": { "version": "2.0.3", "dev": true, @@ -7130,6 +7822,16 @@ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, + "node_modules/expect-type": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.3.0.tgz", + "integrity": "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/extend": { "version": "3.0.2", "license": "MIT" @@ -7145,6 +7847,7 @@ }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", + "dev": true, "license": "MIT" }, "node_modules/fast-levenshtein": { @@ -7214,6 +7917,24 @@ "bser": "2.1.1" } }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, "node_modules/file-entry-cache": { "version": "8.0.0", "dev": true, @@ -7494,6 +8215,13 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/globrex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", + "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", + "dev": true, + "license": "MIT" + }, "node_modules/gopd": { "version": "1.2.0", "license": "MIT", @@ -8673,6 +9401,7 @@ }, "node_modules/json-schema-traverse": { "version": "0.4.1", + "dev": true, "license": "MIT" }, "node_modules/json-stable-stringify-without-jsonify": { @@ -8790,6 +9519,13 @@ "loose-envify": "cli.js" } }, + "node_modules/loupe": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.2.1.tgz", + "integrity": "sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==", + "dev": true, + "license": "MIT" + }, "node_modules/lower-case": { "version": "2.0.2", "license": "MIT", @@ -8810,6 +9546,28 @@ "dev": true, "license": "MIT" }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/magicast": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.3.5.tgz", + "integrity": "sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.25.4", + "@babel/types": "^7.25.4", + "source-map-js": "^1.2.0" + } + }, "node_modules/make-dir": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", @@ -9496,6 +10254,23 @@ "url": "https://opencollective.com/express" } }, + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, + "node_modules/pathval": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.1.tgz", + "integrity": "sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.16" + } + }, "node_modules/perfect-scrollbar": { "version": "1.5.6", "dev": true, @@ -9668,23 +10443,6 @@ "node": ">= 0.8.0" } }, - "node_modules/prettier": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.1.tgz", - "integrity": "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==", - "dev": true, - "license": "MIT", - "peer": true, - "bin": { - "prettier": "bin/prettier.cjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, "node_modules/prettier-linter-helpers": { "version": "1.0.1", "dev": true, @@ -10048,6 +10806,51 @@ "node": ">=0.12" } }, + "node_modules/rollup": { + "version": "4.60.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.60.0.tgz", + "integrity": "sha512-yqjxruMGBQJ2gG4HtjZtAfXArHomazDHoFwFFmZZl0r7Pdo7qCIXKqKHZc8yeoMgzJJ+pO6pEEHa+V7uzWlrAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.60.0", + "@rollup/rollup-android-arm64": "4.60.0", + "@rollup/rollup-darwin-arm64": "4.60.0", + "@rollup/rollup-darwin-x64": "4.60.0", + "@rollup/rollup-freebsd-arm64": "4.60.0", + "@rollup/rollup-freebsd-x64": "4.60.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.60.0", + "@rollup/rollup-linux-arm-musleabihf": "4.60.0", + "@rollup/rollup-linux-arm64-gnu": "4.60.0", + "@rollup/rollup-linux-arm64-musl": "4.60.0", + "@rollup/rollup-linux-loong64-gnu": "4.60.0", + "@rollup/rollup-linux-loong64-musl": "4.60.0", + "@rollup/rollup-linux-ppc64-gnu": "4.60.0", + "@rollup/rollup-linux-ppc64-musl": "4.60.0", + "@rollup/rollup-linux-riscv64-gnu": "4.60.0", + "@rollup/rollup-linux-riscv64-musl": "4.60.0", + "@rollup/rollup-linux-s390x-gnu": "4.60.0", + "@rollup/rollup-linux-x64-gnu": "4.60.0", + "@rollup/rollup-linux-x64-musl": "4.60.0", + "@rollup/rollup-openbsd-x64": "4.60.0", + "@rollup/rollup-openharmony-arm64": "4.60.0", + "@rollup/rollup-win32-arm64-msvc": "4.60.0", + "@rollup/rollup-win32-ia32-msvc": "4.60.0", + "@rollup/rollup-win32-x64-gnu": "4.60.0", + "@rollup/rollup-win32-x64-msvc": "4.60.0", + "fsevents": "~2.3.2" + } + }, "node_modules/safe-buffer": { "version": "5.1.2", "dev": true, @@ -10196,6 +10999,13 @@ "dev": true, "license": "MIT" }, + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true, + "license": "ISC" + }, "node_modules/signal-exit": { "version": "4.1.0", "dev": true, @@ -10363,10 +11173,24 @@ "node": ">=8" } }, + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true, + "license": "MIT" + }, "node_modules/statusLambda": { "resolved": "packages/statusLambda", "link": true }, + "node_modules/std-env": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.10.0.tgz", + "integrity": "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==", + "dev": true, + "license": "MIT" + }, "node_modules/stickyfill": { "version": "1.1.1", "dev": true @@ -10559,6 +11383,26 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/strip-literal": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-3.1.0.tgz", + "integrity": "sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "js-tokens": "^9.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/strip-literal/node_modules/js-tokens": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz", + "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==", + "dev": true, + "license": "MIT" + }, "node_modules/strnum": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.2.1.tgz", @@ -10717,6 +11561,20 @@ "node": "*" } }, + "node_modules/tinybench": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyexec": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", + "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", + "dev": true, + "license": "MIT" + }, "node_modules/tinyglobby": { "version": "0.2.15", "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", @@ -10734,24 +11592,6 @@ "url": "https://github.com/sponsors/SuperchupuDev" } }, - "node_modules/tinyglobby/node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, "node_modules/tinyglobby/node_modules/picomatch": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", @@ -10765,6 +11605,36 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/tinypool": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.1.1.tgz", + "integrity": "sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.0.0 || >=20.0.0" + } + }, + "node_modules/tinyrainbow": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz", + "integrity": "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tinyspy": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-4.0.4.tgz", + "integrity": "sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/tmpl": { "version": "1.0.5", "dev": true, @@ -10901,6 +11771,27 @@ } } }, + "node_modules/tsconfck": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-3.1.6.tgz", + "integrity": "sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w==", + "dev": true, + "license": "MIT", + "bin": { + "tsconfck": "bin/tsconfck.js" + }, + "engines": { + "node": "^18 || >=20" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, "node_modules/tslib": { "version": "2.8.1", "license": "0BSD" @@ -11252,6 +12143,252 @@ "node": ">=10.12.0" } }, + "node_modules/vite": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.1.tgz", + "integrity": "sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.27.0", + "fdir": "^6.5.0", + "picomatch": "^4.0.3", + "postcss": "^8.5.6", + "rollup": "^4.43.0", + "tinyglobby": "^0.2.15" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "lightningcss": "^1.21.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vite-node": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.2.4.tgz", + "integrity": "sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cac": "^6.7.14", + "debug": "^4.4.1", + "es-module-lexer": "^1.7.0", + "pathe": "^2.0.3", + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" + }, + "bin": { + "vite-node": "vite-node.mjs" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/vite-tsconfig-paths": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/vite-tsconfig-paths/-/vite-tsconfig-paths-5.1.4.tgz", + "integrity": "sha512-cYj0LRuLV2c2sMqhqhGpaO3LretdtMn/BVX4cPLanIZuwwrkVl+lK84E/miEXkCHWXuq65rhNN4rXsBcOB3S4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.1", + "globrex": "^0.1.2", + "tsconfck": "^3.0.3" + }, + "peerDependencies": { + "vite": "*" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } + } + }, + "node_modules/vite/node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/vite/node_modules/postcss": { + "version": "8.5.8", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.8.tgz", + "integrity": "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/vitest": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.2.4.tgz", + "integrity": "sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/chai": "^5.2.2", + "@vitest/expect": "3.2.4", + "@vitest/mocker": "3.2.4", + "@vitest/pretty-format": "^3.2.4", + "@vitest/runner": "3.2.4", + "@vitest/snapshot": "3.2.4", + "@vitest/spy": "3.2.4", + "@vitest/utils": "3.2.4", + "chai": "^5.2.0", + "debug": "^4.4.1", + "expect-type": "^1.2.1", + "magic-string": "^0.30.17", + "pathe": "^2.0.3", + "picomatch": "^4.0.2", + "std-env": "^3.9.0", + "tinybench": "^2.9.0", + "tinyexec": "^0.3.2", + "tinyglobby": "^0.2.14", + "tinypool": "^1.1.1", + "tinyrainbow": "^2.0.0", + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0", + "vite-node": "3.2.4", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@types/debug": "^4.1.12", + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "@vitest/browser": "3.2.4", + "@vitest/ui": "3.2.4", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@types/debug": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } + } + }, + "node_modules/vitest/node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/walker": { "version": "1.0.8", "dev": true, @@ -11318,6 +12455,23 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/why-is-node-running": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", + "dev": true, + "license": "MIT", + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/word-wrap": { "version": "1.2.5", "dev": true, diff --git a/package.json b/package.json index 441f9b3f63..1268a32b2a 100644 --- a/package.json +++ b/package.json @@ -36,6 +36,7 @@ "@types/aws-lambda": "^8.10.161", "@types/jest": "^30.0.0", "@types/node": "^25.5.0", + "@vitest/coverage-v8": "^3.2.4", "@typescript-eslint/eslint-plugin": "^8.57.1", "@typescript-eslint/parser": "^8.57.1", "aws-lambda": "^1.0.7", @@ -48,6 +49,8 @@ "jest-junit": "^16.0.0", "ts-jest": "^29.4.6", "ts-node": "^10.9.2", + "vite-tsconfig-paths": "^5.1.4", + "vitest": "^3.2.4", "typescript": "^5.9.3", "typescript-eslint": "^8.57.0" }, diff --git a/packages/capabilityStatement/.vscode/launch.json b/packages/capabilityStatement/.vscode/launch.json index 7c9b0b4b3a..526c590cfa 100644 --- a/packages/capabilityStatement/.vscode/launch.json +++ b/packages/capabilityStatement/.vscode/launch.json @@ -1,35 +1,42 @@ { - // Use IntelliSense to learn about possible attributes. - // Hover to view descriptions of existing attributes. - // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 "version": "0.2.0", "configurations": [ - { - "type": "node", - "name": "vscode-jest-tests.v2", - "request": "launch", - "args": [ - "--runInBand", - "--watchAll=false", - "--testNamePattern", - "${jest.testNamePattern}", - "--runTestsByPath", - "${jest.testFile}", - "--config", - "${workspaceFolder}/jest.debug.config.ts" - ], - "cwd": "${workspaceFolder}", - "console": "integratedTerminal", - "internalConsoleOptions": "neverOpen", - "disableOptimisticBPs": true, - "program": "${workspaceFolder}/../../node_modules/.bin/jest", - "windows": { - "program": "${workspaceFolder}/node_modules/jest/bin/jest" - }, - "env": { - "POWERTOOLS_DEV": true, - "NODE_OPTIONS": "--experimental-vm-modules" - } - } + { + "type": "node", + "name": "vitest: all tests", + "request": "launch", + "program": "${workspaceFolder}/../../node_modules/vitest/vitest.mjs", + "args": [ + "run", + "--config", + "${workspaceFolder}/vitest.config.ts" + ], + "cwd": "${workspaceFolder}", + "console": "integratedTerminal", + "internalConsoleOptions": "neverOpen", + "disableOptimisticBPs": true, + "env": { + "POWERTOOLS_DEV": "true" + } + }, + { + "type": "node", + "name": "vitest: current file", + "request": "launch", + "program": "${workspaceFolder}/../../node_modules/vitest/vitest.mjs", + "args": [ + "run", + "--config", + "${workspaceFolder}/vitest.config.ts", + "${file}" + ], + "cwd": "${workspaceFolder}", + "console": "integratedTerminal", + "internalConsoleOptions": "neverOpen", + "disableOptimisticBPs": true, + "env": { + "POWERTOOLS_DEV": "true" + } + } ] } diff --git a/packages/capabilityStatement/.vscode/settings.json b/packages/capabilityStatement/.vscode/settings.json index 3501264944..915c268c04 100644 --- a/packages/capabilityStatement/.vscode/settings.json +++ b/packages/capabilityStatement/.vscode/settings.json @@ -1,7 +1,3 @@ { - "jest.jestCommandLine": "/workspaces/eps-prescription-status-update-api/node_modules/.bin/jest --no-cache", - "jest.nodeEnv": { - "POWERTOOLS_DEV": true, - "NODE_OPTIONS": "--experimental-vm-modules" - } + "testing.automaticallyOpenPeekView": "never" } diff --git a/packages/capabilityStatement/jest.config.ts b/packages/capabilityStatement/jest.config.ts deleted file mode 100644 index acbc1493de..0000000000 --- a/packages/capabilityStatement/jest.config.ts +++ /dev/null @@ -1,9 +0,0 @@ -import defaultConfig from "../../jest.default.config.ts" -import type {JestConfigWithTsJest} from "ts-jest" - -const jestConfig: JestConfigWithTsJest = { - ...defaultConfig, - rootDir: "./" -} - -export default jestConfig diff --git a/packages/capabilityStatement/package.json b/packages/capabilityStatement/package.json index dbee73fa03..dca829ae1c 100644 --- a/packages/capabilityStatement/package.json +++ b/packages/capabilityStatement/package.json @@ -7,7 +7,7 @@ "license": "MIT", "type": "module", "scripts": { - "unit": "POWERTOOLS_DEV=true NODE_OPTIONS=--experimental-vm-modules jest --no-cache --coverage", + "unit": "POWERTOOLS_DEV=true vitest run --config vitest.config.ts --coverage", "lint": "eslint --max-warnings 0 --fix --config ../../eslint.config.mjs .", "compile": "tsc", "test": "npm run compile && npm run unit", diff --git a/packages/capabilityStatement/tests/test-handler.test.ts b/packages/capabilityStatement/tests/test-handler.test.ts index 9c77955031..33e188c867 100644 --- a/packages/capabilityStatement/tests/test-handler.test.ts +++ b/packages/capabilityStatement/tests/test-handler.test.ts @@ -5,8 +5,8 @@ import { expect, describe, it, - jest -} from "@jest/globals" + vi +} from "vitest" import capabilityStatement from "../src/apim-medicines-prescriptionstatusupdate.json" import {mockAPIGatewayProxyEvent, mockContext} from "@psu-common/testing" @@ -25,7 +25,7 @@ describe("Unit test for app handler", function () { }) it("appends trace id's to the logger", async () => { - const mockAppendKeys = jest.spyOn(Logger.prototype, "appendKeys") + const mockAppendKeys = vi.spyOn(Logger.prototype, "appendKeys") await handler(mockAPIGatewayProxyEvent, mockContext) diff --git a/packages/capabilityStatement/vitest.config.ts b/packages/capabilityStatement/vitest.config.ts new file mode 100644 index 0000000000..823e470724 --- /dev/null +++ b/packages/capabilityStatement/vitest.config.ts @@ -0,0 +1,6 @@ +import {defineConfig, mergeConfig} from "vitest/config" +import defaultConfig from "../../vitest.default.config.ts" + +export default mergeConfig(defaultConfig, defineConfig({ + root: "./" +})) diff --git a/packages/checkPrescriptionStatusUpdates/.vscode/launch.json b/packages/checkPrescriptionStatusUpdates/.vscode/launch.json index 7c9b0b4b3a..6ac9e98546 100644 --- a/packages/checkPrescriptionStatusUpdates/.vscode/launch.json +++ b/packages/checkPrescriptionStatusUpdates/.vscode/launch.json @@ -1,34 +1,39 @@ { - // Use IntelliSense to learn about possible attributes. - // Hover to view descriptions of existing attributes. - // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 "version": "0.2.0", "configurations": [ { "type": "node", - "name": "vscode-jest-tests.v2", + "name": "vitest: all tests", "request": "launch", + "program": "${workspaceFolder}/../../node_modules/vitest/vitest.mjs", "args": [ - "--runInBand", - "--watchAll=false", - "--testNamePattern", - "${jest.testNamePattern}", - "--runTestsByPath", - "${jest.testFile}", + "run", "--config", - "${workspaceFolder}/jest.debug.config.ts" + "${workspaceFolder}/vitest.config.ts" ], "cwd": "${workspaceFolder}", "console": "integratedTerminal", "internalConsoleOptions": "neverOpen", - "disableOptimisticBPs": true, - "program": "${workspaceFolder}/../../node_modules/.bin/jest", - "windows": { - "program": "${workspaceFolder}/node_modules/jest/bin/jest" - }, "env": { - "POWERTOOLS_DEV": true, - "NODE_OPTIONS": "--experimental-vm-modules" + "POWERTOOLS_DEV": "true" + } + }, + { + "type": "node", + "name": "vitest: current file", + "request": "launch", + "program": "${workspaceFolder}/../../node_modules/vitest/vitest.mjs", + "args": [ + "run", + "--config", + "${workspaceFolder}/vitest.config.ts", + "${file}" + ], + "cwd": "${workspaceFolder}", + "console": "integratedTerminal", + "internalConsoleOptions": "neverOpen", + "env": { + "POWERTOOLS_DEV": "true" } } ] diff --git a/packages/checkPrescriptionStatusUpdates/.vscode/settings.json b/packages/checkPrescriptionStatusUpdates/.vscode/settings.json index 3501264944..915c268c04 100644 --- a/packages/checkPrescriptionStatusUpdates/.vscode/settings.json +++ b/packages/checkPrescriptionStatusUpdates/.vscode/settings.json @@ -1,7 +1,3 @@ { - "jest.jestCommandLine": "/workspaces/eps-prescription-status-update-api/node_modules/.bin/jest --no-cache", - "jest.nodeEnv": { - "POWERTOOLS_DEV": true, - "NODE_OPTIONS": "--experimental-vm-modules" - } + "testing.automaticallyOpenPeekView": "never" } diff --git a/packages/checkPrescriptionStatusUpdates/jest.config.ts b/packages/checkPrescriptionStatusUpdates/jest.config.ts deleted file mode 100644 index 1ad45dd190..0000000000 --- a/packages/checkPrescriptionStatusUpdates/jest.config.ts +++ /dev/null @@ -1,10 +0,0 @@ -import defaultConfig from "../../jest.default.config.ts" -import type {JestConfigWithTsJest} from "ts-jest" - -const jestConfig: JestConfigWithTsJest = { - ...defaultConfig, - rootDir: "./", - setupFiles: ["/.jest/setEnvVars.js"] -} - -export default jestConfig diff --git a/packages/checkPrescriptionStatusUpdates/package.json b/packages/checkPrescriptionStatusUpdates/package.json index 072b5f318b..a34d054dc5 100644 --- a/packages/checkPrescriptionStatusUpdates/package.json +++ b/packages/checkPrescriptionStatusUpdates/package.json @@ -6,7 +6,7 @@ "author": "NHS Digital", "license": "MIT", "scripts": { - "unit": "POWERTOOLS_DEV=true NODE_OPTIONS=--experimental-vm-modules jest --no-cache --coverage", + "unit": "POWERTOOLS_DEV=true vitest run --config vitest.config.ts --coverage", "lint": "eslint --max-warnings 0 --fix --config ../../eslint.config.mjs .", "compile": "tsc", "test": "npm run compile && npm run unit", diff --git a/packages/checkPrescriptionStatusUpdates/tests/testDynamoDBclient.test.ts b/packages/checkPrescriptionStatusUpdates/tests/testDynamoDBclient.test.ts index b8258bfdbb..706e939f7a 100644 --- a/packages/checkPrescriptionStatusUpdates/tests/testDynamoDBclient.test.ts +++ b/packages/checkPrescriptionStatusUpdates/tests/testDynamoDBclient.test.ts @@ -1,7 +1,7 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ /* eslint-disable max-len */ import {buildQuery} from "../src/dynamoDBclient" -import {expect, describe} from "@jest/globals" +import {describe, expect, test} from "vitest" import {InputData} from "../src/types" type buildQueryTestData = { diff --git a/packages/checkPrescriptionStatusUpdates/tests/testHander.test.ts b/packages/checkPrescriptionStatusUpdates/tests/testHander.test.ts index 6a2dcfbda7..4c89e5d24c 100644 --- a/packages/checkPrescriptionStatusUpdates/tests/testHander.test.ts +++ b/packages/checkPrescriptionStatusUpdates/tests/testHander.test.ts @@ -2,8 +2,10 @@ import { expect, describe, it, - jest -} from "@jest/globals" + beforeEach, + vi, + type Mock +} from "vitest" import {DynamoDBDocumentClient} from "@aws-sdk/lib-dynamodb" import {handler} from "../src/checkPrescriptionStatusUpdates" @@ -24,13 +26,13 @@ const defaultItem = { describe("test handler", () => { beforeEach(() => { - jest.resetModules() - jest.clearAllMocks() + vi.resetModules() + vi.clearAllMocks() }) it("respond with empty request and status 404 when no results returned by dynamodb", async () => { const mockReply = generateReply(0) - jest.spyOn(DynamoDBDocumentClient.prototype, "send").mockResolvedValue(mockReply as never) + vi.spyOn(DynamoDBDocumentClient.prototype, "send").mockResolvedValue(mockReply as never) const response = await handler(mockAPIGatewayProxyEvent, mockContext) expect(response.statusCode).toBe(404) @@ -41,7 +43,7 @@ describe("test handler", () => { it("respond with success when data returned by dynamodb", async () => { const mockReply = generateReply(1) - jest.spyOn(DynamoDBDocumentClient.prototype, "send").mockResolvedValue(mockReply as never) + vi.spyOn(DynamoDBDocumentClient.prototype, "send").mockResolvedValue(mockReply as never) const response = await handler(mockAPIGatewayProxyEvent, mockContext) expect(response.statusCode).toBe(200) @@ -52,7 +54,7 @@ describe("test handler", () => { it("respond with success and LastEvaluatedKey when paginated data returned by dynamodb", async () => { const mockReply = generateReply(5, false) - jest.spyOn(DynamoDBDocumentClient.prototype, "send").mockResolvedValue(mockReply as never) + vi.spyOn(DynamoDBDocumentClient.prototype, "send").mockResolvedValue(mockReply as never) const response = await handler(mockAPIGatewayProxyEvent, mockContext) expect(response.statusCode).toBe(200) @@ -70,7 +72,7 @@ describe("test handler", () => { it("returns less than 5 results if that's all that's available", async () => { const mockReply = generateReply(3) - jest.spyOn(DynamoDBDocumentClient.prototype, "send").mockResolvedValue(mockReply as never) + vi.spyOn(DynamoDBDocumentClient.prototype, "send").mockResolvedValue(mockReply as never) const response = await handler(mockAPIGatewayProxyEvent, mockContext) expect(response.statusCode).toBe(200) @@ -86,7 +88,7 @@ describe("test handler", () => { it("returns just more than 5 results", async () => { // 6 results in 2 calls, expecting 6 results - jest + vi .spyOn(DynamoDBDocumentClient.prototype, "send") .mockImplementationOnce(() => { return Promise.resolve(generateReply(3, false)) @@ -108,7 +110,7 @@ describe("test handler", () => { }) it("returns just more than 5 results with pagination headers", async () => { - jest + vi .spyOn(DynamoDBDocumentClient.prototype, "send") .mockImplementationOnce(() => { const reply = generateReply(2, false) @@ -129,7 +131,7 @@ describe("test handler", () => { .mockImplementationOnce(() => { return Promise.resolve(generateReply(2)) }) - const mockSend = DynamoDBDocumentClient.prototype.send as jest.Mock + const mockSend = DynamoDBDocumentClient.prototype.send as Mock const event = JSON.parse(JSON.stringify(mockAPIGatewayProxyEvent)) event.headers["exclusivestartkey-prescriptionid"] = "prescriptionId1" @@ -154,7 +156,7 @@ describe("test handler", () => { it("returns no more than 15 results", async () => { // >15 results (15 with pagination headers), expecting 15 results - jest.spyOn(DynamoDBDocumentClient.prototype, "send").mockImplementationOnce(() => { + vi.spyOn(DynamoDBDocumentClient.prototype, "send").mockImplementationOnce(() => { return Promise.resolve(generateReply(15, false)) }) @@ -174,7 +176,7 @@ describe("test handler", () => { it("respond with failure when dynamodb throws exception", async () => { const mockReply = {} - jest.spyOn(DynamoDBDocumentClient.prototype, "send").mockRejectedValue(mockReply as never) + vi.spyOn(DynamoDBDocumentClient.prototype, "send").mockRejectedValue(mockReply as never) const response = await handler(mockAPIGatewayProxyEvent, mockContext) expect(response.statusCode).toBe(500) diff --git a/packages/checkPrescriptionStatusUpdates/vitest.config.ts b/packages/checkPrescriptionStatusUpdates/vitest.config.ts new file mode 100644 index 0000000000..8e0a46ea72 --- /dev/null +++ b/packages/checkPrescriptionStatusUpdates/vitest.config.ts @@ -0,0 +1,9 @@ +import {defineConfig, mergeConfig} from "vitest/config" +import defaultConfig from "../../vitest.default.config.ts" + +export default mergeConfig(defaultConfig, defineConfig({ + root: "./", + test: { + setupFiles: ["./.jest/setEnvVars.js"] + } +})) diff --git a/packages/common/middyErrorHandler/.vscode/launch.json b/packages/common/middyErrorHandler/.vscode/launch.json index 97987739e3..9ee54e92cb 100644 --- a/packages/common/middyErrorHandler/.vscode/launch.json +++ b/packages/common/middyErrorHandler/.vscode/launch.json @@ -1,34 +1,41 @@ { - // Use IntelliSense to learn about possible attributes. - // Hover to view descriptions of existing attributes. - // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 "version": "0.2.0", "configurations": [ { "type": "node", - "name": "vscode-jest-tests.v2", + "name": "vitest: all tests", "request": "launch", + "program": "${workspaceFolder}/../../../node_modules/vitest/vitest.mjs", "args": [ - "--runInBand", - "--watchAll=false", - "--testNamePattern", - "${jest.testNamePattern}", - "--runTestsByPath", - "${jest.testFile}", + "run", "--config", - "${workspaceFolder}/jest.debug.config.ts" + "${workspaceFolder}/vitest.config.ts" ], "cwd": "${workspaceFolder}", "console": "integratedTerminal", "internalConsoleOptions": "neverOpen", "disableOptimisticBPs": true, - "program": "${workspaceFolder}/../../../node_modules/.bin/jest", - "windows": { - "program": "${workspaceFolder}/node_modules/jest/bin/jest" - }, "env": { - "POWERTOOLS_DEV": true, - "NODE_OPTIONS": "--experimental-vm-modules" + "POWERTOOLS_DEV": "true" + } + }, + { + "type": "node", + "name": "vitest: current file", + "request": "launch", + "program": "${workspaceFolder}/../../../node_modules/vitest/vitest.mjs", + "args": [ + "run", + "--config", + "${workspaceFolder}/vitest.config.ts", + "${file}" + ], + "cwd": "${workspaceFolder}", + "console": "integratedTerminal", + "internalConsoleOptions": "neverOpen", + "disableOptimisticBPs": true, + "env": { + "POWERTOOLS_DEV": "true" } } ] diff --git a/packages/common/middyErrorHandler/.vscode/settings.json b/packages/common/middyErrorHandler/.vscode/settings.json index 3501264944..915c268c04 100644 --- a/packages/common/middyErrorHandler/.vscode/settings.json +++ b/packages/common/middyErrorHandler/.vscode/settings.json @@ -1,7 +1,3 @@ { - "jest.jestCommandLine": "/workspaces/eps-prescription-status-update-api/node_modules/.bin/jest --no-cache", - "jest.nodeEnv": { - "POWERTOOLS_DEV": true, - "NODE_OPTIONS": "--experimental-vm-modules" - } + "testing.automaticallyOpenPeekView": "never" } diff --git a/packages/common/middyErrorHandler/jest.config.ts b/packages/common/middyErrorHandler/jest.config.ts deleted file mode 100644 index 022989c681..0000000000 --- a/packages/common/middyErrorHandler/jest.config.ts +++ /dev/null @@ -1,9 +0,0 @@ -import defaultConfig from "../../../jest.default.config.ts" -import type {JestConfigWithTsJest} from "ts-jest" - -const jestConfig: JestConfigWithTsJest = { - ...defaultConfig, - rootDir: "./" -} - -export default jestConfig diff --git a/packages/common/middyErrorHandler/package.json b/packages/common/middyErrorHandler/package.json index 64a3bb508b..cb5a10f7db 100644 --- a/packages/common/middyErrorHandler/package.json +++ b/packages/common/middyErrorHandler/package.json @@ -7,7 +7,7 @@ "main": "lib/src/index.js", "type": "module", "scripts": { - "unit": "POWERTOOLS_DEV=true NODE_OPTIONS=--experimental-vm-modules jest --no-cache --coverage", + "unit": "POWERTOOLS_DEV=true vitest run --config vitest.config.ts --coverage", "lint": "eslint --max-warnings 0 --fix --config ../../../eslint.config.mjs .", "compile": "tsc", "test": "npm run compile && npm run unit", diff --git a/packages/common/middyErrorHandler/tests/testErrorHandler.test.ts b/packages/common/middyErrorHandler/tests/testErrorHandler.test.ts index 366945a6a8..e20c6402c1 100644 --- a/packages/common/middyErrorHandler/tests/testErrorHandler.test.ts +++ b/packages/common/middyErrorHandler/tests/testErrorHandler.test.ts @@ -1,7 +1,7 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ import {MiddyErrorHandler} from "../src/errorHandler" import middy from "@middy/core" -import {expect, jest} from "@jest/globals" +import {expect, test, vi} from "vitest" import {mockContext} from "@psu-common/testing" const mockEvent = { @@ -10,7 +10,7 @@ const mockEvent = { test("Middleware logs all error details", async () => { type ErrorLogger = (error: any, message: string) => void - const mockErrorLogger: jest.MockedFunction = jest.fn() + const mockErrorLogger = vi.fn() const mockLogger = { error: mockErrorLogger } @@ -37,7 +37,7 @@ test("Middleware logs all error details", async () => { test("Middleware returns specific error message on failure", async () => { const mockLogger = { - error: jest.fn(() => {}) + error: vi.fn(() => {}) } const errorResponse = { statusCode: 500, diff --git a/packages/common/middyErrorHandler/vitest.config.ts b/packages/common/middyErrorHandler/vitest.config.ts new file mode 100644 index 0000000000..4465ebbf83 --- /dev/null +++ b/packages/common/middyErrorHandler/vitest.config.ts @@ -0,0 +1,6 @@ +import {defineConfig, mergeConfig} from "vitest/config" +import defaultConfig from "../../../vitest.default.config.ts" + +export default mergeConfig(defaultConfig, defineConfig({ + root: "./" +})) diff --git a/packages/common/utilities/jest.config.ts b/packages/common/utilities/jest.config.ts deleted file mode 100644 index 6a6e039c9a..0000000000 --- a/packages/common/utilities/jest.config.ts +++ /dev/null @@ -1,9 +0,0 @@ -import type {JestConfigWithTsJest} from "ts-jest" -import defaultConfig from "../../../jest.default.config.ts" - -const jestConfig: JestConfigWithTsJest = { - ...defaultConfig, - "rootDir": "./" -} - -export default jestConfig diff --git a/packages/cpsuLambda/.vscode/launch.json b/packages/cpsuLambda/.vscode/launch.json index 4e2a6957e9..c5f33ba628 100644 --- a/packages/cpsuLambda/.vscode/launch.json +++ b/packages/cpsuLambda/.vscode/launch.json @@ -3,28 +3,37 @@ "configurations": [ { "type": "node", - "name": "vscode-jest-tests.v2", + "name": "vitest: all tests", "request": "launch", + "program": "${workspaceFolder}/../../node_modules/vitest/vitest.mjs", "args": [ - "--runInBand", - "--watchAll=false", - "--testNamePattern", - "${jest.testNamePattern}", - "--runTestsByPath", - "${jest.testFile}", + "run", "--config", - "${workspaceFolder}/jest.debug.config.ts" + "${workspaceFolder}/vitest.config.ts" ], "cwd": "${workspaceFolder}", "console": "integratedTerminal", "internalConsoleOptions": "neverOpen", - "program": "${workspaceFolder}/../../node_modules/.bin/jest", - "windows": { - "program": "${workspaceFolder}/node_modules/jest/bin/jest" - }, "env": { - "POWERTOOLS_DEV": "true", - "NODE_OPTIONS": "--experimental-vm-modules" + "POWERTOOLS_DEV": "true" + } + }, + { + "type": "node", + "name": "vitest: current file", + "request": "launch", + "program": "${workspaceFolder}/../../node_modules/vitest/vitest.mjs", + "args": [ + "run", + "--config", + "${workspaceFolder}/vitest.config.ts", + "${file}" + ], + "cwd": "${workspaceFolder}", + "console": "integratedTerminal", + "internalConsoleOptions": "neverOpen", + "env": { + "POWERTOOLS_DEV": "true" } } ] diff --git a/packages/cpsuLambda/.vscode/settings.json b/packages/cpsuLambda/.vscode/settings.json index 3501264944..915c268c04 100644 --- a/packages/cpsuLambda/.vscode/settings.json +++ b/packages/cpsuLambda/.vscode/settings.json @@ -1,7 +1,3 @@ { - "jest.jestCommandLine": "/workspaces/eps-prescription-status-update-api/node_modules/.bin/jest --no-cache", - "jest.nodeEnv": { - "POWERTOOLS_DEV": true, - "NODE_OPTIONS": "--experimental-vm-modules" - } + "testing.automaticallyOpenPeekView": "never" } diff --git a/packages/cpsuLambda/jest.config.ts b/packages/cpsuLambda/jest.config.ts deleted file mode 100644 index d93d212b98..0000000000 --- a/packages/cpsuLambda/jest.config.ts +++ /dev/null @@ -1,9 +0,0 @@ -import type {JestConfigWithTsJest} from "ts-jest" -import defaultConfig from "../../jest.default.config.ts" - -const jestConfig: JestConfigWithTsJest = { - ...defaultConfig, - "rootDir": "./" -} - -export default jestConfig diff --git a/packages/cpsuLambda/package.json b/packages/cpsuLambda/package.json index 5f9e5ef526..98ee402c29 100644 --- a/packages/cpsuLambda/package.json +++ b/packages/cpsuLambda/package.json @@ -7,7 +7,7 @@ "license": "MIT", "type": "module", "scripts": { - "unit": "POWERTOOLS_DEV=true NODE_OPTIONS=--experimental-vm-modules jest --no-cache --coverage", + "unit": "POWERTOOLS_DEV=true vitest run --config vitest.config.ts --coverage", "lint": "eslint --max-warnings 0 --fix --config ../../eslint.config.mjs .", "compile": "tsc", "test": "npm run compile && npm run unit", diff --git a/packages/cpsuLambda/tests/format_1/business_states.test.ts b/packages/cpsuLambda/tests/format_1/business_states.test.ts index 70c5ec58d2..6908a5dadd 100644 --- a/packages/cpsuLambda/tests/format_1/business_states.test.ts +++ b/packages/cpsuLambda/tests/format_1/business_states.test.ts @@ -1,4 +1,10 @@ import {BundleEntry, Task} from "fhir/r4" +import { + describe, + expect, + it, + test +} from "vitest" import {generateTemplate, getBusinessStatus, populateTemplate} from "../../src/schema/format_1/transformer" import { itemType, diff --git a/packages/cpsuLambda/tests/testHandler.test.ts b/packages/cpsuLambda/tests/testHandler.test.ts index 6e63d71b7f..287a30d588 100644 --- a/packages/cpsuLambda/tests/testHandler.test.ts +++ b/packages/cpsuLambda/tests/testHandler.test.ts @@ -5,7 +5,13 @@ import format_1_response_json from "./format_1/example_response.json" import {HandlerParams, newHandler} from "../src/handler" import {MIDDLEWARE} from "../src/middleware" import {Logger} from "@aws-lambda-powertools/logger" -import {jest} from "@jest/globals" +import { + beforeAll, + describe, + expect, + test, + vi +} from "vitest" import {Ok} from "pratica" const {FORMAT_1_PARAMS, format_1_handler} = await import("../src/cpsu") @@ -47,7 +53,7 @@ describe("generic handler", () => { } const logger = new Logger({serviceName: "testService"}) - const logger_output = jest.spyOn(console, "info") + const logger_output = vi.spyOn(console, "info") const handler = newHandler({ params: params, @@ -69,7 +75,7 @@ describe("generic handler", () => { describe("format_1 handler", () => { beforeAll(() => { - jest.useFakeTimers().setSystemTime(new Date("2023-09-11T10:11:12Z")) + vi.useFakeTimers().setSystemTime(new Date("2023-09-11T10:11:12Z")) }) test("Happy path", async () => { const event = { @@ -97,7 +103,7 @@ describe("format_1 handler", () => { function mockedWarnHandler() { const logger = new Logger({serviceName: "testService"}) - const logger_warn = jest.spyOn(logger, "warn") + const logger_warn = vi.spyOn(logger, "warn") const handler = newHandler({ params: FORMAT_1_PARAMS, diff --git a/packages/cpsuLambda/vitest.config.ts b/packages/cpsuLambda/vitest.config.ts new file mode 100644 index 0000000000..823e470724 --- /dev/null +++ b/packages/cpsuLambda/vitest.config.ts @@ -0,0 +1,6 @@ +import {defineConfig, mergeConfig} from "vitest/config" +import defaultConfig from "../../vitest.default.config.ts" + +export default mergeConfig(defaultConfig, defineConfig({ + root: "./" +})) diff --git a/packages/gsul/.vscode/launch.json b/packages/gsul/.vscode/launch.json index 8acf7f0381..c5f33ba628 100644 --- a/packages/gsul/.vscode/launch.json +++ b/packages/gsul/.vscode/launch.json @@ -1,34 +1,39 @@ { - // Use IntelliSense to learn about possible attributes. - // Hover to view descriptions of existing attributes. - // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 "version": "0.2.0", "configurations": [ { "type": "node", - "name": "vscode-jest-tests.v2", + "name": "vitest: all tests", "request": "launch", + "program": "${workspaceFolder}/../../node_modules/vitest/vitest.mjs", "args": [ - "--runInBand", - "--watchAll=false", - "--testNamePattern", - "${jest.testNamePattern}", - "--runTestsByPath", - "${jest.testFile}", + "run", "--config", - "${workspaceFolder}/jest.debug.config.ts" + "${workspaceFolder}/vitest.config.ts" ], "cwd": "${workspaceFolder}", "console": "integratedTerminal", "internalConsoleOptions": "neverOpen", - "disableOptimisticBPs": true, - "program": "${workspaceFolder}/../../node_modules/.bin/jest", - "windows": { - "program": "${workspaceFolder}/node_modules/jest/bin/jest" - }, "env": { - "POWERTOOLS_DEV": true, - "NODE_OPTIONS": "--experimental-vm-modules" + "POWERTOOLS_DEV": "true" + } + }, + { + "type": "node", + "name": "vitest: current file", + "request": "launch", + "program": "${workspaceFolder}/../../node_modules/vitest/vitest.mjs", + "args": [ + "run", + "--config", + "${workspaceFolder}/vitest.config.ts", + "${file}" + ], + "cwd": "${workspaceFolder}", + "console": "integratedTerminal", + "internalConsoleOptions": "neverOpen", + "env": { + "POWERTOOLS_DEV": "true" } } ] diff --git a/packages/gsul/.vscode/settings.json b/packages/gsul/.vscode/settings.json index 3501264944..915c268c04 100644 --- a/packages/gsul/.vscode/settings.json +++ b/packages/gsul/.vscode/settings.json @@ -1,7 +1,3 @@ { - "jest.jestCommandLine": "/workspaces/eps-prescription-status-update-api/node_modules/.bin/jest --no-cache", - "jest.nodeEnv": { - "POWERTOOLS_DEV": true, - "NODE_OPTIONS": "--experimental-vm-modules" - } + "testing.automaticallyOpenPeekView": "never" } diff --git a/packages/gsul/jest.config.ts b/packages/gsul/jest.config.ts deleted file mode 100644 index d93d212b98..0000000000 --- a/packages/gsul/jest.config.ts +++ /dev/null @@ -1,9 +0,0 @@ -import type {JestConfigWithTsJest} from "ts-jest" -import defaultConfig from "../../jest.default.config.ts" - -const jestConfig: JestConfigWithTsJest = { - ...defaultConfig, - "rootDir": "./" -} - -export default jestConfig diff --git a/packages/gsul/package.json b/packages/gsul/package.json index e811c95a08..91055bdf19 100644 --- a/packages/gsul/package.json +++ b/packages/gsul/package.json @@ -7,7 +7,7 @@ "license": "MIT", "type": "module", "scripts": { - "unit": "POWERTOOLS_DEV=true NODE_OPTIONS=--experimental-vm-modules jest --no-cache --coverage", + "unit": "POWERTOOLS_DEV=true vitest run --config vitest.config.ts --coverage", "lint": "eslint --max-warnings 0 --fix --config ../../eslint.config.mjs .", "compile": "tsc", "test": "npm run compile && npm run unit", diff --git a/packages/gsul/tests/testFilterOutFutureReduceToLatestUpdates.test.ts b/packages/gsul/tests/testFilterOutFutureReduceToLatestUpdates.test.ts index 3f24cfdd62..7c235b5dda 100644 --- a/packages/gsul/tests/testFilterOutFutureReduceToLatestUpdates.test.ts +++ b/packages/gsul/tests/testFilterOutFutureReduceToLatestUpdates.test.ts @@ -1,6 +1,7 @@ import {filterOutFutureReduceToLatestUpdates} from "../src/getStatusUpdates" import {inputPrescriptionType} from "../src/schema/request" import {outputPrescriptionType, itemType} from "../src/schema/response" +import {describe, expect, it} from "vitest" type scenariosType = { scenarioDescription: string diff --git a/packages/gsul/tests/testHander.test.ts b/packages/gsul/tests/testHander.test.ts index 114a95308c..51688f7ac9 100644 --- a/packages/gsul/tests/testHander.test.ts +++ b/packages/gsul/tests/testHander.test.ts @@ -2,8 +2,9 @@ import { expect, describe, it, - jest -} from "@jest/globals" + beforeEach, + vi +} from "vitest" import {DynamoDBDocumentClient} from "@aws-sdk/lib-dynamodb" import {handler} from "../src/getStatusUpdates" @@ -25,8 +26,8 @@ const dummyContext = { describe("test handler", () => { beforeEach(() => { - jest.resetModules() - jest.clearAllMocks() + vi.resetModules() + vi.clearAllMocks() }) const testCases = [ @@ -153,7 +154,7 @@ describe("test handler", () => { testCases.forEach(({description, event, mockReply, expectedResponse}) => { it(description, async () => { if (mockReply) { - jest.spyOn(DynamoDBDocumentClient.prototype, "send").mockResolvedValue(mockReply as never) + vi.spyOn(DynamoDBDocumentClient.prototype, "send").mockResolvedValue(mockReply as never) } const response = await handler(event, dummyContext) expect(response).toMatchObject(expectedResponse) diff --git a/packages/gsul/tests/testRunDynamoDBQueries.test.ts b/packages/gsul/tests/testRunDynamoDBQueries.test.ts index b60c00e1b2..e6da770be1 100644 --- a/packages/gsul/tests/testRunDynamoDBQueries.test.ts +++ b/packages/gsul/tests/testRunDynamoDBQueries.test.ts @@ -5,15 +5,16 @@ import { expect, describe, it, - jest -} from "@jest/globals" + beforeEach, + vi +} from "vitest" const logger = new Logger({serviceName: "GSUL_TEST"}) describe("testing dynamoDBClient", () => { beforeEach(() => { - jest.resetModules() - jest.clearAllMocks() + vi.resetModules() + vi.clearAllMocks() const mockReply = { Count: 1, Items: [ @@ -26,7 +27,7 @@ describe("testing dynamoDBClient", () => { } ] } - jest.spyOn(DynamoDBDocumentClient.prototype, "send").mockResolvedValue(mockReply as never) + vi.spyOn(DynamoDBDocumentClient.prototype, "send").mockResolvedValue(mockReply as never) }) it("should call dynamo once and return expected items", async () => { @@ -62,8 +63,8 @@ describe("testing dynamoDBClient", () => { describe("testing pagination in dynamoDBClient", () => { beforeEach(() => { - jest.resetModules() - jest.clearAllMocks() + vi.resetModules() + vi.clearAllMocks() const mockFirstReply = { Count: 1, Items: [ @@ -93,7 +94,7 @@ describe("testing pagination in dynamoDBClient", () => { } ] } - jest + vi .spyOn(DynamoDBDocumentClient.prototype, "send") .mockResolvedValueOnce(mockFirstReply as never) .mockResolvedValueOnce(mockSecondReply as never) diff --git a/packages/gsul/vitest.config.ts b/packages/gsul/vitest.config.ts new file mode 100644 index 0000000000..823e470724 --- /dev/null +++ b/packages/gsul/vitest.config.ts @@ -0,0 +1,6 @@ +import {defineConfig, mergeConfig} from "vitest/config" +import defaultConfig from "../../vitest.default.config.ts" + +export default mergeConfig(defaultConfig, defineConfig({ + root: "./" +})) diff --git a/packages/nhsNotifyLambda/jest.config.ts b/packages/nhsNotifyLambda/jest.config.ts deleted file mode 100644 index 8212011ed9..0000000000 --- a/packages/nhsNotifyLambda/jest.config.ts +++ /dev/null @@ -1,10 +0,0 @@ -import type {JestConfigWithTsJest} from "ts-jest" -import defaultConfig from "../../jest.default.config.ts" - -const jestConfig: JestConfigWithTsJest = { - ...defaultConfig, - rootDir: "./", - setupFiles: ["/.jest/setEnvVars.js"] -} - -export default jestConfig diff --git a/packages/nhsNotifyUpdateCallback/jest.config.ts b/packages/nhsNotifyUpdateCallback/jest.config.ts deleted file mode 100644 index 1ad45dd190..0000000000 --- a/packages/nhsNotifyUpdateCallback/jest.config.ts +++ /dev/null @@ -1,10 +0,0 @@ -import defaultConfig from "../../jest.default.config.ts" -import type {JestConfigWithTsJest} from "ts-jest" - -const jestConfig: JestConfigWithTsJest = { - ...defaultConfig, - rootDir: "./", - setupFiles: ["/.jest/setEnvVars.js"] -} - -export default jestConfig diff --git a/packages/nhsd-psu-sandbox/.vscode/launch.json b/packages/nhsd-psu-sandbox/.vscode/launch.json index 4e2a6957e9..c5f33ba628 100644 --- a/packages/nhsd-psu-sandbox/.vscode/launch.json +++ b/packages/nhsd-psu-sandbox/.vscode/launch.json @@ -3,28 +3,37 @@ "configurations": [ { "type": "node", - "name": "vscode-jest-tests.v2", + "name": "vitest: all tests", "request": "launch", + "program": "${workspaceFolder}/../../node_modules/vitest/vitest.mjs", "args": [ - "--runInBand", - "--watchAll=false", - "--testNamePattern", - "${jest.testNamePattern}", - "--runTestsByPath", - "${jest.testFile}", + "run", "--config", - "${workspaceFolder}/jest.debug.config.ts" + "${workspaceFolder}/vitest.config.ts" ], "cwd": "${workspaceFolder}", "console": "integratedTerminal", "internalConsoleOptions": "neverOpen", - "program": "${workspaceFolder}/../../node_modules/.bin/jest", - "windows": { - "program": "${workspaceFolder}/node_modules/jest/bin/jest" - }, "env": { - "POWERTOOLS_DEV": "true", - "NODE_OPTIONS": "--experimental-vm-modules" + "POWERTOOLS_DEV": "true" + } + }, + { + "type": "node", + "name": "vitest: current file", + "request": "launch", + "program": "${workspaceFolder}/../../node_modules/vitest/vitest.mjs", + "args": [ + "run", + "--config", + "${workspaceFolder}/vitest.config.ts", + "${file}" + ], + "cwd": "${workspaceFolder}", + "console": "integratedTerminal", + "internalConsoleOptions": "neverOpen", + "env": { + "POWERTOOLS_DEV": "true" } } ] diff --git a/packages/nhsd-psu-sandbox/.vscode/settings.json b/packages/nhsd-psu-sandbox/.vscode/settings.json index 6ce2cf741b..38e8cd685d 100644 --- a/packages/nhsd-psu-sandbox/.vscode/settings.json +++ b/packages/nhsd-psu-sandbox/.vscode/settings.json @@ -1,8 +1,4 @@ { - "jest.jestCommandLine": "/workspaces/eps-prescription-status-update-api/node_modules/.bin/jest --no-cache", - "jest.nodeEnv": { - "POWERTOOLS_DEV": true, - "NODE_OPTIONS": "--experimental-vm-modules" - } - } + "testing.automaticallyOpenPeekView": "never" +} diff --git a/packages/nhsd-psu-sandbox/jest.config.ts b/packages/nhsd-psu-sandbox/jest.config.ts deleted file mode 100644 index dd2cb2f161..0000000000 --- a/packages/nhsd-psu-sandbox/jest.config.ts +++ /dev/null @@ -1,9 +0,0 @@ -import defaultConfig from "../../jest.default.config.ts" -import type {JestConfigWithTsJest} from "ts-jest" - -const jestConfig: JestConfigWithTsJest = { - ...defaultConfig, - "rootDir": "./" -} - -export default jestConfig diff --git a/packages/nhsd-psu-sandbox/package.json b/packages/nhsd-psu-sandbox/package.json index 3de98c9b61..02a7c95f4a 100644 --- a/packages/nhsd-psu-sandbox/package.json +++ b/packages/nhsd-psu-sandbox/package.json @@ -6,7 +6,7 @@ "author": "NHS Digital", "license": "MIT", "scripts": { - "unit": "POWERTOOLS_DEV=true NODE_OPTIONS=--experimental-vm-modules jest --no-cache --coverage", + "unit": "POWERTOOLS_DEV=true vitest run --config vitest.config.ts --coverage", "lint": "eslint --max-warnings 0 --fix --config ../../eslint.config.mjs .", "compile": "tsc", "test": "npm run compile && npm run unit", diff --git a/packages/nhsd-psu-sandbox/tests/test-handler.test.ts b/packages/nhsd-psu-sandbox/tests/test-handler.test.ts index 871e498191..75bd94b251 100644 --- a/packages/nhsd-psu-sandbox/tests/test-handler.test.ts +++ b/packages/nhsd-psu-sandbox/tests/test-handler.test.ts @@ -1,6 +1,6 @@ import {APIGatewayProxyEvent, APIGatewayProxyResult} from "aws-lambda" import {handler} from "../src/sandbox" -import {expect, describe, it} from "@jest/globals" +import {expect, describe, it} from "vitest" import successData from "../../specification/examples/response-multiple-items.json" const dummyContext = {} diff --git a/packages/nhsd-psu-sandbox/vitest.config.ts b/packages/nhsd-psu-sandbox/vitest.config.ts new file mode 100644 index 0000000000..823e470724 --- /dev/null +++ b/packages/nhsd-psu-sandbox/vitest.config.ts @@ -0,0 +1,6 @@ +import {defineConfig, mergeConfig} from "vitest/config" +import defaultConfig from "../../vitest.default.config.ts" + +export default mergeConfig(defaultConfig, defineConfig({ + root: "./" +})) diff --git a/packages/postDatedLambda/jest.config.ts b/packages/postDatedLambda/jest.config.ts deleted file mode 100644 index 8212011ed9..0000000000 --- a/packages/postDatedLambda/jest.config.ts +++ /dev/null @@ -1,10 +0,0 @@ -import type {JestConfigWithTsJest} from "ts-jest" -import defaultConfig from "../../jest.default.config.ts" - -const jestConfig: JestConfigWithTsJest = { - ...defaultConfig, - rootDir: "./", - setupFiles: ["/.jest/setEnvVars.js"] -} - -export default jestConfig diff --git a/packages/psuRestoreValidationLambda/jest.config.ts b/packages/psuRestoreValidationLambda/jest.config.ts deleted file mode 100644 index acbc1493de..0000000000 --- a/packages/psuRestoreValidationLambda/jest.config.ts +++ /dev/null @@ -1,9 +0,0 @@ -import defaultConfig from "../../jest.default.config.ts" -import type {JestConfigWithTsJest} from "ts-jest" - -const jestConfig: JestConfigWithTsJest = { - ...defaultConfig, - rootDir: "./" -} - -export default jestConfig diff --git a/packages/specification/jest.config.ts b/packages/specification/jest.config.ts deleted file mode 100644 index dd2cb2f161..0000000000 --- a/packages/specification/jest.config.ts +++ /dev/null @@ -1,9 +0,0 @@ -import defaultConfig from "../../jest.default.config.ts" -import type {JestConfigWithTsJest} from "ts-jest" - -const jestConfig: JestConfigWithTsJest = { - ...defaultConfig, - "rootDir": "./" -} - -export default jestConfig diff --git a/packages/statusLambda/jest.config.ts b/packages/statusLambda/jest.config.ts deleted file mode 100644 index dd2cb2f161..0000000000 --- a/packages/statusLambda/jest.config.ts +++ /dev/null @@ -1,9 +0,0 @@ -import defaultConfig from "../../jest.default.config.ts" -import type {JestConfigWithTsJest} from "ts-jest" - -const jestConfig: JestConfigWithTsJest = { - ...defaultConfig, - "rootDir": "./" -} - -export default jestConfig diff --git a/packages/updatePrescriptionStatus/jest.config.ts b/packages/updatePrescriptionStatus/jest.config.ts deleted file mode 100644 index fd94bd6a89..0000000000 --- a/packages/updatePrescriptionStatus/jest.config.ts +++ /dev/null @@ -1,10 +0,0 @@ -import type {JestConfigWithTsJest} from "ts-jest" -import defaultConfig from "../../jest.default.config.ts" - -const jestConfig: JestConfigWithTsJest = { - ...defaultConfig, - "rootDir": "./", - setupFiles: ["/.jest/setEnvVars.js"] -} - -export default jestConfig diff --git a/vitest.default.config.ts b/vitest.default.config.ts new file mode 100644 index 0000000000..b8e04f1cff --- /dev/null +++ b/vitest.default.config.ts @@ -0,0 +1,18 @@ +import {defineConfig} from "vitest/config" +import tsconfigPaths from "vite-tsconfig-paths" + +const vitestConfig = defineConfig({ + plugins: [tsconfigPaths()], + test: { + clearMocks: true, + environment: "node", + include: ["tests/**/*.test.ts"], + coverage: { + provider: "v8", + reportsDirectory: "coverage", + reporter: ["text", "lcov"] + } + } +}) + +export default vitestConfig From 7aaacc5f32b784df1d8347a36d323cfc2e579d87 Mon Sep 17 00:00:00 2001 From: tstephen-nhs <231503406+tstephen-nhs@users.noreply.github.com> Date: Tue, 31 Mar 2026 11:21:30 +0000 Subject: [PATCH 02/20] chore: initial packages test migration --- packages/common/commonTypes/package.json | 2 +- packages/common/commonTypes/vitest.config.ts | 6 +++ packages/common/testing/package.json | 2 +- packages/common/testing/vitest.config.ts | 6 +++ packages/common/utilities/package.json | 2 +- .../utilities/tests/testTestConfig.test.ts | 12 ++--- packages/common/utilities/vitest.config.ts | 6 +++ .../.vscode/launch.json | 41 +++++++++-------- .../.vscode/settings.json | 6 +-- packages/nhsNotifyUpdateCallback/package.json | 2 +- .../tests/testHelpers.test.ts | 45 ++++++++++--------- .../tests/testNhsNotifyCallbackLambda.test.ts | 24 +++++----- .../nhsNotifyUpdateCallback/vitest.config.ts | 9 ++++ .../.vscode/launch.json | 41 +++++++++-------- .../.vscode/settings.json | 6 +-- .../psuRestoreValidationLambda/package.json | 2 +- .../tests/compareTable.test.ts | 20 ++++----- .../tests/handler.test.ts | 13 +++--- .../vitest.config.ts | 6 +++ packages/statusLambda/.vscode/launch.json | 41 +++++++++-------- packages/statusLambda/.vscode/settings.json | 6 +-- packages/statusLambda/package.json | 2 +- .../statusLambda/tests/test-handler.test.ts | 9 ++-- packages/statusLambda/vitest.config.ts | 6 +++ 24 files changed, 181 insertions(+), 134 deletions(-) create mode 100644 packages/common/commonTypes/vitest.config.ts create mode 100644 packages/common/testing/vitest.config.ts create mode 100644 packages/common/utilities/vitest.config.ts create mode 100644 packages/nhsNotifyUpdateCallback/vitest.config.ts create mode 100644 packages/psuRestoreValidationLambda/vitest.config.ts create mode 100644 packages/statusLambda/vitest.config.ts diff --git a/packages/common/commonTypes/package.json b/packages/common/commonTypes/package.json index 535ccf9004..251634ab13 100644 --- a/packages/common/commonTypes/package.json +++ b/packages/common/commonTypes/package.json @@ -8,7 +8,7 @@ "types": "lib/src/index.d.ts", "type": "module", "scripts": { - "unit": "jest", + "unit": "vitest run --config vitest.config.ts --coverage --passWithNoTests", "lint": "eslint --max-warnings 0 --fix --config ../../../eslint.config.mjs .", "compile": "tsc", "test": "npm run compile && npm run unit", diff --git a/packages/common/commonTypes/vitest.config.ts b/packages/common/commonTypes/vitest.config.ts new file mode 100644 index 0000000000..4465ebbf83 --- /dev/null +++ b/packages/common/commonTypes/vitest.config.ts @@ -0,0 +1,6 @@ +import {defineConfig, mergeConfig} from "vitest/config" +import defaultConfig from "../../../vitest.default.config.ts" + +export default mergeConfig(defaultConfig, defineConfig({ + root: "./" +})) diff --git a/packages/common/testing/package.json b/packages/common/testing/package.json index 61cdc5b29a..8640578c61 100644 --- a/packages/common/testing/package.json +++ b/packages/common/testing/package.json @@ -7,7 +7,7 @@ "main": "lib/src/index.js", "type": "module", "scripts": { - "unit": "jest", + "unit": "vitest run --config vitest.config.ts --coverage --passWithNoTests", "lint": "eslint --max-warnings 0 --fix --config ../../../eslint.config.mjs .", "compile": "tsc", "test": "npm run compile && npm run unit", diff --git a/packages/common/testing/vitest.config.ts b/packages/common/testing/vitest.config.ts new file mode 100644 index 0000000000..4465ebbf83 --- /dev/null +++ b/packages/common/testing/vitest.config.ts @@ -0,0 +1,6 @@ +import {defineConfig, mergeConfig} from "vitest/config" +import defaultConfig from "../../../vitest.default.config.ts" + +export default mergeConfig(defaultConfig, defineConfig({ + root: "./" +})) diff --git a/packages/common/utilities/package.json b/packages/common/utilities/package.json index 8666144162..f2afe26d98 100644 --- a/packages/common/utilities/package.json +++ b/packages/common/utilities/package.json @@ -8,7 +8,7 @@ "types": "lib/src/index.d.ts", "type": "module", "scripts": { - "unit": "POWERTOOLS_DEV=true NODE_OPTIONS=--experimental-vm-modules jest --no-cache --coverage", + "unit": "POWERTOOLS_DEV=true vitest run --config vitest.config.ts --coverage", "lint": "eslint --max-warnings 0 --fix --config ../../../eslint.config.mjs .", "compile": "tsc", "test": "npm run compile && npm run unit", diff --git a/packages/common/utilities/tests/testTestConfig.test.ts b/packages/common/utilities/tests/testTestConfig.test.ts index e4fd3eea18..97d9058fa2 100644 --- a/packages/common/utilities/tests/testTestConfig.test.ts +++ b/packages/common/utilities/tests/testTestConfig.test.ts @@ -3,17 +3,17 @@ import { expect, describe, it, - jest, - beforeEach -} from "@jest/globals" + beforeEach, + vi +} from "vitest" -const mockGet = jest.fn() +const mockGet = vi.fn() const mockInitiatedSSMProvider = { get: mockGet } -jest.unstable_mockModule("../src/ssmUtil", () => ({ +vi.mock("../src/ssmUtil", () => ({ initiatedSSMProvider: mockInitiatedSSMProvider })) @@ -24,7 +24,7 @@ const {TestPrescriptions, getTestPrescriptions} = await import("../src/testConfi describe("Unit tests for TestPrescriptions class", () => { beforeEach(() => { - jest.clearAllMocks() + vi.clearAllMocks() }) describe("getTestPrescriptions method", () => { diff --git a/packages/common/utilities/vitest.config.ts b/packages/common/utilities/vitest.config.ts new file mode 100644 index 0000000000..4465ebbf83 --- /dev/null +++ b/packages/common/utilities/vitest.config.ts @@ -0,0 +1,6 @@ +import {defineConfig, mergeConfig} from "vitest/config" +import defaultConfig from "../../../vitest.default.config.ts" + +export default mergeConfig(defaultConfig, defineConfig({ + root: "./" +})) diff --git a/packages/nhsNotifyUpdateCallback/.vscode/launch.json b/packages/nhsNotifyUpdateCallback/.vscode/launch.json index 7c9b0b4b3a..6ac9e98546 100644 --- a/packages/nhsNotifyUpdateCallback/.vscode/launch.json +++ b/packages/nhsNotifyUpdateCallback/.vscode/launch.json @@ -1,34 +1,39 @@ { - // Use IntelliSense to learn about possible attributes. - // Hover to view descriptions of existing attributes. - // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 "version": "0.2.0", "configurations": [ { "type": "node", - "name": "vscode-jest-tests.v2", + "name": "vitest: all tests", "request": "launch", + "program": "${workspaceFolder}/../../node_modules/vitest/vitest.mjs", "args": [ - "--runInBand", - "--watchAll=false", - "--testNamePattern", - "${jest.testNamePattern}", - "--runTestsByPath", - "${jest.testFile}", + "run", "--config", - "${workspaceFolder}/jest.debug.config.ts" + "${workspaceFolder}/vitest.config.ts" ], "cwd": "${workspaceFolder}", "console": "integratedTerminal", "internalConsoleOptions": "neverOpen", - "disableOptimisticBPs": true, - "program": "${workspaceFolder}/../../node_modules/.bin/jest", - "windows": { - "program": "${workspaceFolder}/node_modules/jest/bin/jest" - }, "env": { - "POWERTOOLS_DEV": true, - "NODE_OPTIONS": "--experimental-vm-modules" + "POWERTOOLS_DEV": "true" + } + }, + { + "type": "node", + "name": "vitest: current file", + "request": "launch", + "program": "${workspaceFolder}/../../node_modules/vitest/vitest.mjs", + "args": [ + "run", + "--config", + "${workspaceFolder}/vitest.config.ts", + "${file}" + ], + "cwd": "${workspaceFolder}", + "console": "integratedTerminal", + "internalConsoleOptions": "neverOpen", + "env": { + "POWERTOOLS_DEV": "true" } } ] diff --git a/packages/nhsNotifyUpdateCallback/.vscode/settings.json b/packages/nhsNotifyUpdateCallback/.vscode/settings.json index 3501264944..915c268c04 100644 --- a/packages/nhsNotifyUpdateCallback/.vscode/settings.json +++ b/packages/nhsNotifyUpdateCallback/.vscode/settings.json @@ -1,7 +1,3 @@ { - "jest.jestCommandLine": "/workspaces/eps-prescription-status-update-api/node_modules/.bin/jest --no-cache", - "jest.nodeEnv": { - "POWERTOOLS_DEV": true, - "NODE_OPTIONS": "--experimental-vm-modules" - } + "testing.automaticallyOpenPeekView": "never" } diff --git a/packages/nhsNotifyUpdateCallback/package.json b/packages/nhsNotifyUpdateCallback/package.json index 17a748935c..cddc702452 100644 --- a/packages/nhsNotifyUpdateCallback/package.json +++ b/packages/nhsNotifyUpdateCallback/package.json @@ -7,7 +7,7 @@ "license": "MIT", "type": "module", "scripts": { - "unit": "POWERTOOLS_DEV=true NODE_OPTIONS=--experimental-vm-modules jest --no-cache --coverage", + "unit": "POWERTOOLS_DEV=true vitest run --config vitest.config.ts --coverage", "lint": "eslint --max-warnings 0 --fix --config ../../eslint.config.mjs .", "compile": "tsc", "test": "npm run compile && npm run unit", diff --git a/packages/nhsNotifyUpdateCallback/tests/testHelpers.test.ts b/packages/nhsNotifyUpdateCallback/tests/testHelpers.test.ts index 307270f5ae..ccb7581e85 100644 --- a/packages/nhsNotifyUpdateCallback/tests/testHelpers.test.ts +++ b/packages/nhsNotifyUpdateCallback/tests/testHelpers.test.ts @@ -1,15 +1,15 @@ import { - jest, + vi, describe, it, beforeEach, afterEach, expect -} from "@jest/globals" +} from "vitest" import {createHmac} from "crypto" // Mock the getSecret call -const mockGetSecret = jest.fn((secretName: string) => { +const mockGetSecret = vi.fn((secretName: string) => { if (secretName === process.env.APP_ID_SECRET) { return Promise.resolve(process.env.APP_ID) } @@ -18,7 +18,7 @@ const mockGetSecret = jest.fn((secretName: string) => { } return Promise.reject(new Error("Unexpected secret")) }) -jest.unstable_mockModule("@aws-lambda-powertools/parameters/secrets", async () => ({ +vi.mock("@aws-lambda-powertools/parameters/secrets", async () => ({ __esModule: true, getSecret: mockGetSecret })) @@ -38,21 +38,22 @@ const { const ORIGINAL_ENV = {...process.env} describe("helpers.ts", () => { - let sendSpy: jest.SpiedFunction + // Keep this broad to avoid over-constraining overloaded AWS SDK client signatures in tests. + let sendSpy: any beforeEach(() => { - jest.resetModules() - jest.clearAllMocks() + vi.resetModules() + vi.clearAllMocks() // Spy on all docClient.send calls - sendSpy = jest.spyOn(DynamoDBDocumentClient.prototype, "send") + sendSpy = vi.spyOn(DynamoDBDocumentClient.prototype, "send") // Freeze time so TTL is predictable - jest.spyOn(Date, "now").mockReturnValue(100_000_000) // ms + vi.spyOn(Date, "now").mockReturnValue(100_000_000) // ms }) afterEach(() => { - jest.restoreAllMocks() + vi.restoreAllMocks() }) describe("response()", () => { @@ -141,12 +142,12 @@ describe("helpers.ts", () => { let logger: Logger beforeEach(() => { logger = new Logger({serviceName: "nhsNotifyUpdateCallback"}) - jest.spyOn(logger, "error") - jest.spyOn(logger, "warn") - jest.spyOn(logger, "info") + vi.spyOn(logger, "error") + vi.spyOn(logger, "warn") + vi.spyOn(logger, "info") - jest.resetModules() - jest.clearAllMocks() + vi.resetModules() + vi.clearAllMocks() }) it("skips update when no matching record found", async () => { @@ -180,7 +181,7 @@ describe("helpers.ts", () => { NotifyMessageID: "msg-123", LastNotificationRequestTimestamp: lastTimestamp } - sendSpy.mockImplementation((cmd) => { + sendSpy.mockImplementation((cmd: unknown) => { if (cmd instanceof QueryCommand) { return Promise.resolve({Items: [mockItem]}) } @@ -222,7 +223,7 @@ describe("helpers.ts", () => { // First call: QueryCommand // Subsequent calls: UpdateCommand - sendSpy.mockImplementation((cmd) => { + sendSpy.mockImplementation((cmd: unknown) => { if (cmd instanceof QueryCommand) { return Promise.resolve({Items: [mockItem]}) } @@ -234,7 +235,7 @@ describe("helpers.ts", () => { await updateNotificationsTable(logger, mockResponse) - const [, [updateCmd]] = sendSpy.mock.calls + const updateCmd = sendSpy.mock.calls[1][0] as UpdateCommand const input = updateCmd.input as UpdateCommandInput // Note that Javascript guarantees the order of this to be preserved, so we're okay to check values like this. @@ -294,7 +295,7 @@ describe("helpers.ts", () => { // First call: QueryCommand // Subsequent calls: UpdateCommand - sendSpy.mockImplementation((cmd) => { + sendSpy.mockImplementation((cmd: unknown) => { if (cmd instanceof QueryCommand) { return Promise.resolve({Items: [mockItem]}) } @@ -306,7 +307,7 @@ describe("helpers.ts", () => { await updateNotificationsTable(logger, mockResponse) - const [, [updateCmd]] = sendSpy.mock.calls + const updateCmd = sendSpy.mock.calls[1][0] as UpdateCommand const input = updateCmd.input as UpdateCommandInput // Note that Javascript guarantees the order of this to be preserved, so we're okay to check values like this. @@ -425,8 +426,8 @@ describe("helpers.ts", () => { describe("fetchSecrets()", () => { let logger: Logger beforeEach(() => { - jest.resetModules() - jest.clearAllMocks() + vi.resetModules() + vi.clearAllMocks() process.env = {...ORIGINAL_ENV} logger = new Logger({serviceName: "nhsNotifyUpdateCallback"}) }) diff --git a/packages/nhsNotifyUpdateCallback/tests/testNhsNotifyCallbackLambda.test.ts b/packages/nhsNotifyUpdateCallback/tests/testNhsNotifyCallbackLambda.test.ts index a3e6603598..d9e40d8ab5 100644 --- a/packages/nhsNotifyUpdateCallback/tests/testNhsNotifyCallbackLambda.test.ts +++ b/packages/nhsNotifyUpdateCallback/tests/testNhsNotifyCallbackLambda.test.ts @@ -1,18 +1,20 @@ import { - jest, + beforeEach, describe, + expect, it, - beforeAll -} from "@jest/globals" + beforeAll, + vi +} from "vitest" import {generateMockEvent} from "./utilities" import {CallbackType, ChannelStatusResponse} from "../src/types" -const mockCheckSignature = jest.fn() -const mockResponse = jest.fn() -const mockUpdateNotificationsTable = jest.fn() -const mockExtractStatusesAndDescriptions = jest.fn() -jest.unstable_mockModule( +const mockCheckSignature = vi.fn() +const mockResponse = vi.fn() +const mockUpdateNotificationsTable = vi.fn() +const mockExtractStatusesAndDescriptions = vi.fn() +vi.mock( "../src/helpers", async () => ({ __esModule: true, @@ -34,9 +36,9 @@ const ORIGINAL_ENV = {...process.env} describe("NHS Notify update callback lambda handler", () => { beforeEach(() => { process.env = {...ORIGINAL_ENV} - jest.clearAllMocks() - jest.restoreAllMocks() - jest.resetAllMocks() + vi.clearAllMocks() + vi.restoreAllMocks() + vi.resetAllMocks() // Copies the real implementation mockResponse.mockImplementation((...args: Array): {statusCode: number; body: string} => { diff --git a/packages/nhsNotifyUpdateCallback/vitest.config.ts b/packages/nhsNotifyUpdateCallback/vitest.config.ts new file mode 100644 index 0000000000..8e0a46ea72 --- /dev/null +++ b/packages/nhsNotifyUpdateCallback/vitest.config.ts @@ -0,0 +1,9 @@ +import {defineConfig, mergeConfig} from "vitest/config" +import defaultConfig from "../../vitest.default.config.ts" + +export default mergeConfig(defaultConfig, defineConfig({ + root: "./", + test: { + setupFiles: ["./.jest/setEnvVars.js"] + } +})) diff --git a/packages/psuRestoreValidationLambda/.vscode/launch.json b/packages/psuRestoreValidationLambda/.vscode/launch.json index f54493ee69..56ca91a9c5 100644 --- a/packages/psuRestoreValidationLambda/.vscode/launch.json +++ b/packages/psuRestoreValidationLambda/.vscode/launch.json @@ -1,34 +1,39 @@ { - // Use IntelliSense to learn about possible attributes. - // Hover to view descriptions of existing attributes. - // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 "version": "0.2.0", "configurations": [ { "type": "node", - "name": "vscode-jest-tests.v2", + "name": "vitest: all tests", "request": "launch", + "program": "${workspaceFolder}/../../node_modules/vitest/vitest.mjs", "args": [ - "--runInBand", - "--watchAll=false", - "--testNamePattern", - "${jest.testNamePattern}", - "--runTestsByPath", - "${jest.testFile}", + "run", "--config", - "${workspaceFolder}/jest.debug.config.ts" + "${workspaceFolder}/vitest.config.ts" ], "cwd": "${workspaceFolder}", "console": "integratedTerminal", "internalConsoleOptions": "neverOpen", - "disableOptimisticBPs": true, - "program": "${workspaceFolder}/../../node_modules/.bin/jest", - "windows": { - "program": "${workspaceFolder}/node_modules/jest/bin/jest" - }, "env": { - "POWERTOOLS_DEV": true, - "NODE_OPTIONS": "--experimental-vm-modules" + "POWERTOOLS_DEV": "true" + } + }, + { + "type": "node", + "name": "vitest: current file", + "request": "launch", + "program": "${workspaceFolder}/../../node_modules/vitest/vitest.mjs", + "args": [ + "run", + "--config", + "${workspaceFolder}/vitest.config.ts", + "${file}" + ], + "cwd": "${workspaceFolder}", + "console": "integratedTerminal", + "internalConsoleOptions": "neverOpen", + "env": { + "POWERTOOLS_DEV": "true" } } ] diff --git a/packages/psuRestoreValidationLambda/.vscode/settings.json b/packages/psuRestoreValidationLambda/.vscode/settings.json index 3501264944..915c268c04 100644 --- a/packages/psuRestoreValidationLambda/.vscode/settings.json +++ b/packages/psuRestoreValidationLambda/.vscode/settings.json @@ -1,7 +1,3 @@ { - "jest.jestCommandLine": "/workspaces/eps-prescription-status-update-api/node_modules/.bin/jest --no-cache", - "jest.nodeEnv": { - "POWERTOOLS_DEV": true, - "NODE_OPTIONS": "--experimental-vm-modules" - } + "testing.automaticallyOpenPeekView": "never" } diff --git a/packages/psuRestoreValidationLambda/package.json b/packages/psuRestoreValidationLambda/package.json index 9137464265..f3b5999fe6 100644 --- a/packages/psuRestoreValidationLambda/package.json +++ b/packages/psuRestoreValidationLambda/package.json @@ -7,7 +7,7 @@ "main": "lib/src/index.js", "type": "module", "scripts": { - "unit": "POWERTOOLS_DEV=true NODE_OPTIONS=--experimental-vm-modules jest --no-cache --coverage", + "unit": "POWERTOOLS_DEV=true vitest run --config vitest.config.ts --coverage", "lint": "eslint --max-warnings 0 --fix --config ../../eslint.config.mjs .", "compile": "tsc --build", "test": "npm run compile && npm run unit", diff --git a/packages/psuRestoreValidationLambda/tests/compareTable.test.ts b/packages/psuRestoreValidationLambda/tests/compareTable.test.ts index 6512d54fb4..e725b6821a 100644 --- a/packages/psuRestoreValidationLambda/tests/compareTable.test.ts +++ b/packages/psuRestoreValidationLambda/tests/compareTable.test.ts @@ -1,17 +1,17 @@ import {DynamoDBDocumentClient} from "@aws-sdk/lib-dynamodb" -import {jest} from "@jest/globals" +import {beforeEach, describe, expect, it, vi, type Mocked} from "vitest" import {Logger} from "@aws-lambda-powertools/logger" -const mockSend = jest.fn() +const mockSend = vi.fn() const mockDocumentClient = { send: mockSend -} as unknown as jest.Mocked +} as unknown as Mocked const mockLogger: Partial = { - info: jest.fn(), - debug: jest.fn(), - error: jest.fn(), - warn: jest.fn() + info: vi.fn(), + debug: vi.fn(), + error: vi.fn(), + warn: vi.fn() } const SOURCE_ITEM = { @@ -24,9 +24,9 @@ const {compareTables} = await import("../src/compareTable") describe("Compare table function", () => { beforeEach(() => { - jest.resetModules() - jest.clearAllMocks() - jest.resetAllMocks() + vi.resetModules() + vi.clearAllMocks() + vi.resetAllMocks() }) // eslint-disable-next-line @typescript-eslint/no-explicit-any diff --git a/packages/psuRestoreValidationLambda/tests/handler.test.ts b/packages/psuRestoreValidationLambda/tests/handler.test.ts index 957c0735ed..4330979686 100644 --- a/packages/psuRestoreValidationLambda/tests/handler.test.ts +++ b/packages/psuRestoreValidationLambda/tests/handler.test.ts @@ -1,17 +1,18 @@ import {EventBridgeEvent} from "aws-lambda" import { - jest, + beforeAll, expect, describe, - it -} from "@jest/globals" + it, + vi +} from "vitest" import {backupEventCompletedDetail} from "../src/types" import {Backup} from "@aws-sdk/client-backup" import {mockContext} from "@psu-common/testing" -const mockCompareTables = jest.fn() -jest.unstable_mockModule("../src/compareTable", () => { +const mockCompareTables = vi.fn() +vi.mock("../src/compareTable", () => { return { compareTables: mockCompareTables } @@ -49,7 +50,7 @@ const dummyEvent: EventBridgeEvent<"Restore Job State Change", backupEventComple describe("Unit test for psuRestoreValidationLambda", function () { let mockPutRestoreValidationResult: unknown beforeAll(()=> { - mockPutRestoreValidationResult = jest + mockPutRestoreValidationResult = vi .spyOn( Backup.prototype, "putRestoreValidationResult") .mockResolvedValue("success" as never) diff --git a/packages/psuRestoreValidationLambda/vitest.config.ts b/packages/psuRestoreValidationLambda/vitest.config.ts new file mode 100644 index 0000000000..823e470724 --- /dev/null +++ b/packages/psuRestoreValidationLambda/vitest.config.ts @@ -0,0 +1,6 @@ +import {defineConfig, mergeConfig} from "vitest/config" +import defaultConfig from "../../vitest.default.config.ts" + +export default mergeConfig(defaultConfig, defineConfig({ + root: "./" +})) diff --git a/packages/statusLambda/.vscode/launch.json b/packages/statusLambda/.vscode/launch.json index 7c9b0b4b3a..6ac9e98546 100644 --- a/packages/statusLambda/.vscode/launch.json +++ b/packages/statusLambda/.vscode/launch.json @@ -1,34 +1,39 @@ { - // Use IntelliSense to learn about possible attributes. - // Hover to view descriptions of existing attributes. - // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 "version": "0.2.0", "configurations": [ { "type": "node", - "name": "vscode-jest-tests.v2", + "name": "vitest: all tests", "request": "launch", + "program": "${workspaceFolder}/../../node_modules/vitest/vitest.mjs", "args": [ - "--runInBand", - "--watchAll=false", - "--testNamePattern", - "${jest.testNamePattern}", - "--runTestsByPath", - "${jest.testFile}", + "run", "--config", - "${workspaceFolder}/jest.debug.config.ts" + "${workspaceFolder}/vitest.config.ts" ], "cwd": "${workspaceFolder}", "console": "integratedTerminal", "internalConsoleOptions": "neverOpen", - "disableOptimisticBPs": true, - "program": "${workspaceFolder}/../../node_modules/.bin/jest", - "windows": { - "program": "${workspaceFolder}/node_modules/jest/bin/jest" - }, "env": { - "POWERTOOLS_DEV": true, - "NODE_OPTIONS": "--experimental-vm-modules" + "POWERTOOLS_DEV": "true" + } + }, + { + "type": "node", + "name": "vitest: current file", + "request": "launch", + "program": "${workspaceFolder}/../../node_modules/vitest/vitest.mjs", + "args": [ + "run", + "--config", + "${workspaceFolder}/vitest.config.ts", + "${file}" + ], + "cwd": "${workspaceFolder}", + "console": "integratedTerminal", + "internalConsoleOptions": "neverOpen", + "env": { + "POWERTOOLS_DEV": "true" } } ] diff --git a/packages/statusLambda/.vscode/settings.json b/packages/statusLambda/.vscode/settings.json index 3501264944..915c268c04 100644 --- a/packages/statusLambda/.vscode/settings.json +++ b/packages/statusLambda/.vscode/settings.json @@ -1,7 +1,3 @@ { - "jest.jestCommandLine": "/workspaces/eps-prescription-status-update-api/node_modules/.bin/jest --no-cache", - "jest.nodeEnv": { - "POWERTOOLS_DEV": true, - "NODE_OPTIONS": "--experimental-vm-modules" - } + "testing.automaticallyOpenPeekView": "never" } diff --git a/packages/statusLambda/package.json b/packages/statusLambda/package.json index 1b27da7a7d..c20dc20de0 100644 --- a/packages/statusLambda/package.json +++ b/packages/statusLambda/package.json @@ -6,7 +6,7 @@ "author": "NHS Digital", "license": "MIT", "scripts": { - "unit": "POWERTOOLS_DEV=true NODE_OPTIONS=--experimental-vm-modules jest --no-cache --coverage", + "unit": "POWERTOOLS_DEV=true vitest run --config vitest.config.ts --coverage", "lint": "eslint --max-warnings 0 --fix --config ../../eslint.config.mjs .", "compile": "tsc", "test": "npm run compile && npm run unit", diff --git a/packages/statusLambda/tests/test-handler.test.ts b/packages/statusLambda/tests/test-handler.test.ts index 45b274af25..ab9e34b29e 100644 --- a/packages/statusLambda/tests/test-handler.test.ts +++ b/packages/statusLambda/tests/test-handler.test.ts @@ -3,11 +3,12 @@ import {Logger} from "@aws-lambda-powertools/logger" import axios from "axios" import MockAdapter from "axios-mock-adapter" import { - jest, + afterEach, expect, describe, - it -} from "@jest/globals" + it, + vi +} from "vitest" import {handler} from "../src/statusLambda" import {mockAPIGatewayProxyEvent, mockContext} from "@psu-common/testing" @@ -51,7 +52,7 @@ describe("Unit test for status check", function () { }) it("appends trace id's to the logger", async () => { - const mockAppendKeys = jest.spyOn(Logger.prototype, "appendKeys") + const mockAppendKeys = vi.spyOn(Logger.prototype, "appendKeys") await handler(mockAPIGatewayProxyEvent, mockContext) diff --git a/packages/statusLambda/vitest.config.ts b/packages/statusLambda/vitest.config.ts new file mode 100644 index 0000000000..823e470724 --- /dev/null +++ b/packages/statusLambda/vitest.config.ts @@ -0,0 +1,6 @@ +import {defineConfig, mergeConfig} from "vitest/config" +import defaultConfig from "../../vitest.default.config.ts" + +export default mergeConfig(defaultConfig, defineConfig({ + root: "./" +})) From a8ff4adf061b37dcead2891836725b6923c1c186 Mon Sep 17 00:00:00 2001 From: tstephen-nhs <231503406+tstephen-nhs@users.noreply.github.com> Date: Tue, 31 Mar 2026 15:56:49 +0000 Subject: [PATCH 03/20] chore: all updatePrescriptionStatus tests now passing --- package-lock.json | 222 ++++++++---------- packages/nhsNotifyLambda/vitest.config.ts | 9 + packages/postDatedLambda/vitest.config.ts | 9 + .../.vscode/launch.json | 43 ++-- .../.vscode/settings.json | 6 +- .../updatePrescriptionStatus/package.json | 2 +- .../tests/testDatabaseClient.test.ts | 66 +++--- .../tests/testHandler.test.ts | 81 ++++--- .../tests/testPrescriptionIntercept.test.ts | 80 ++++--- .../tests/testSqsClient.test.ts | 94 ++++---- .../testUpdatePrescriptionStatus.test.ts | 49 ++-- .../tests/utils/testUtils.ts | 54 ++--- .../tests/utils/testValidateNhsNumber.test.ts | 1 + .../testRequestContentValidation.test.ts | 7 +- .../testRequestFieldValidation.test.ts | 2 +- .../testRequestValidationViaHandler.test.ts | 38 +-- .../updatePrescriptionStatus/vitest.config.ts | 9 + 17 files changed, 413 insertions(+), 359 deletions(-) create mode 100644 packages/nhsNotifyLambda/vitest.config.ts create mode 100644 packages/postDatedLambda/vitest.config.ts create mode 100644 packages/updatePrescriptionStatus/vitest.config.ts diff --git a/package-lock.json b/package-lock.json index f7be2f549c..bee01700d8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -352,6 +352,7 @@ "resolved": "https://registry.npmjs.org/@aws-sdk/client-secrets-manager/-/client-secrets-manager-3.1014.0.tgz", "integrity": "sha512-XRp6t0AHGxmCWwYqfELxJUiHnOIR5yUyWBNXJjeEp4t9Pzdg86pQw1aXfmfZ4sVdebT06lL9+D0NsP12ztoSlQ==", "license": "Apache-2.0", + "peer": true, "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", @@ -1052,6 +1053,7 @@ "version": "7.28.4", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", @@ -2782,6 +2784,7 @@ "node_modules/@middy/validator/node_modules/ajv": { "version": "8.17.1", "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -2894,6 +2897,7 @@ "version": "1.9.0", "dev": true, "license": "Apache-2.0", + "peer": true, "engines": { "node": ">=8.0.0" } @@ -3364,17 +3368,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@redocly/cli/node_modules/picomatch": { - "version": "4.0.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/@redocly/cli/node_modules/string-width": { "version": "4.2.3", "dev": true, @@ -3540,19 +3533,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@redocly/openapi-core/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/@redocly/respect-core": { "version": "2.24.1", "resolved": "https://registry.npmjs.org/@redocly/respect-core/-/respect-core-2.24.1.tgz", @@ -3621,19 +3601,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@redocly/respect-core/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/@rollup/rollup-android-arm-eabi": { "version": "4.60.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.60.0.tgz", @@ -4797,6 +4764,7 @@ "integrity": "sha512-jp2P3tQMSxWugkCUKLRPVUpGaL5MVFwF8RDuSRztfwgN1wmqJeMSbKlnEtQqU8UrhTmzEmZdu2I6v2dpp7XIxw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "undici-types": "~7.18.0" } @@ -5073,6 +5041,7 @@ "integrity": "sha512-k4eNDan0EIMTT/dUKc/g+rsJ6wcHYhNPdY19VoX/EOtaAG8DLtKCykhrUnuHPYvinn5jhAPgD2Qw9hXBwrahsw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "8.57.1", "@typescript-eslint/types": "8.57.1", @@ -6176,6 +6145,7 @@ "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", "dev": true, "license": "MIT", + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -6216,8 +6186,8 @@ "version": "6.14.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", - "dev": true, "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -6354,6 +6324,19 @@ "node": ">= 8" } }, + "node_modules/anymatch/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/apim-spec": { "resolved": "packages/specification", "link": true @@ -6466,6 +6449,7 @@ "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.6.tgz", "integrity": "sha512-ChTCHMouEe2kn713WHbQGcuYrr6fXTBiu460OTwWrWob16g1bXn4vtz07Ope7ewMozJAnEquLk5lWQWtBig9DQ==", "license": "MIT", + "peer": true, "dependencies": { "follow-redirects": "^1.15.11", "form-data": "^4.0.5", @@ -6670,6 +6654,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "baseline-browser-mapping": "^2.8.3", "caniuse-lite": "^1.0.30001741", @@ -7448,6 +7433,7 @@ "integrity": "sha512-S9jlY/ELKEUwwQnqWDO+f+m6sercqOPSqXM5Go94l7DOmxHVDgmSFGWEzeE/gwgTAr0W103BWt0QLe/7mabIvA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.2", @@ -7502,6 +7488,7 @@ "version": "10.1.8", "dev": true, "license": "MIT", + "peer": true, "bin": { "eslint-config-prettier": "bin/cli.js" }, @@ -7847,7 +7834,6 @@ }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", - "dev": true, "license": "MIT" }, "node_modules/fast-levenshtein": { @@ -8668,6 +8654,7 @@ "integrity": "sha512-AkXIIFcaazymvey2i/+F94XRnM6TsVLZDhBMLsd1Sf/W0wzsvvpjeyUrCZD6HGG4SDYPgDJDBKeiJTBb10WzMg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/core": "30.3.0", "@jest/types": "30.3.0", @@ -8910,19 +8897,6 @@ "fsevents": "^2.3.3" } }, - "node_modules/jest-haste-map/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/jest-junit": { "version": "16.0.0", "dev": true, @@ -9015,19 +8989,6 @@ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/jest-message-util/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/jest-mock": { "version": "30.3.0", "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-30.3.0.tgz", @@ -9222,17 +9183,6 @@ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/jest-util/node_modules/picomatch": { - "version": "4.0.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/jest-validate": { "version": "30.3.0", "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-30.3.0.tgz", @@ -9401,7 +9351,6 @@ }, "node_modules/json-schema-traverse": { "version": "0.4.1", - "dev": true, "license": "MIT" }, "node_modules/json-stable-stringify-without-jsonify": { @@ -9703,6 +9652,7 @@ "version": "6.15.0", "dev": true, "license": "MIT", + "peer": true, "funding": { "type": "opencollective", "url": "https://opencollective.com/mobx" @@ -9968,6 +9918,16 @@ "url": "https://github.com/Mermade/oas-kit?sponsor=1" } }, + "node_modules/oas-linter/node_modules/yaml": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.3.tgz", + "integrity": "sha512-vIYeF1u3CjlhAFekPPAk2h/Kv4T3mAkMox5OymRiJQB0spDP10LHvt+K7G9Ny6NuuMAb25/6n1qyUjAcGNf/AA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, "node_modules/oas-resolver": { "version": "2.5.6", "dev": true, @@ -9986,6 +9946,16 @@ "url": "https://github.com/Mermade/oas-kit?sponsor=1" } }, + "node_modules/oas-resolver/node_modules/yaml": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.3.tgz", + "integrity": "sha512-vIYeF1u3CjlhAFekPPAk2h/Kv4T3mAkMox5OymRiJQB0spDP10LHvt+K7G9Ny6NuuMAb25/6n1qyUjAcGNf/AA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, "node_modules/oas-schema-walker": { "version": "1.1.5", "dev": true, @@ -10012,6 +9982,16 @@ "url": "https://github.com/Mermade/oas-kit?sponsor=1" } }, + "node_modules/oas-validator/node_modules/yaml": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.3.tgz", + "integrity": "sha512-vIYeF1u3CjlhAFekPPAk2h/Kv4T3mAkMox5OymRiJQB0spDP10LHvt+K7G9Ny6NuuMAb25/6n1qyUjAcGNf/AA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, "node_modules/object-assign": { "version": "4.1.1", "dev": true, @@ -10282,11 +10262,13 @@ "license": "ISC" }, "node_modules/picomatch": { - "version": "2.3.1", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", "dev": true, "license": "MIT", "engines": { - "node": ">=8.6" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/jonschlinkert" @@ -10443,6 +10425,23 @@ "node": ">= 0.8.0" } }, + "node_modules/prettier": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.1.tgz", + "integrity": "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==", + "dev": true, + "license": "MIT", + "peer": true, + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, "node_modules/prettier-linter-helpers": { "version": "1.0.1", "dev": true, @@ -10617,6 +10616,7 @@ "version": "19.2.1", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=0.10.0" } @@ -10625,6 +10625,7 @@ "version": "19.2.1", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "scheduler": "^0.27.0" }, @@ -11421,6 +11422,7 @@ "integrity": "sha512-J72R4ltw0UBVUlEjTzI0gg2STOqlI9JBhQOL4Dxt7aJOnnSesy0qJDn4PYfMCafk9cWOaVg129Pesl5o+DIh0Q==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@emotion/is-prop-valid": "1.4.0", "@emotion/unitless": "0.10.0", @@ -11493,6 +11495,16 @@ "url": "https://github.com/Mermade/oas-kit?sponsor=1" } }, + "node_modules/swagger2openapi/node_modules/yaml": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.3.tgz", + "integrity": "sha512-vIYeF1u3CjlhAFekPPAk2h/Kv4T3mAkMox5OymRiJQB0spDP10LHvt+K7G9Ny6NuuMAb25/6n1qyUjAcGNf/AA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, "node_modules/synckit": { "version": "0.11.12", "dev": true, @@ -11592,19 +11604,6 @@ "url": "https://github.com/sponsors/SuperchupuDev" } }, - "node_modules/tinyglobby/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/tinypool": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.1.1.tgz", @@ -11733,6 +11732,7 @@ "version": "10.9.2", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@cspotcode/source-map-support": "^0.8.0", "@tsconfig/node10": "^1.0.7", @@ -11832,6 +11832,7 @@ "version": "5.9.3", "dev": true, "license": "Apache-2.0", + "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -11899,6 +11900,7 @@ "integrity": "sha512-XZzOmihLIr8AD1b9hL9ccNMzEMWt/dE2u7NyTY9jJG6YNiNthaD5XtUHVF2uCXZ15ng+z2hT3MVuxnUYhq6k1g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "8.57.0", "@typescript-eslint/types": "8.57.0", @@ -12149,6 +12151,7 @@ "integrity": "sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "esbuild": "^0.27.0", "fdir": "^6.5.0", @@ -12261,19 +12264,6 @@ } } }, - "node_modules/vite/node_modules/picomatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", - "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/vite/node_modules/postcss": { "version": "8.5.8", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.8.tgz", @@ -12309,6 +12299,7 @@ "integrity": "sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@types/chai": "^5.2.2", "@vitest/expect": "3.2.4", @@ -12376,19 +12367,6 @@ } } }, - "node_modules/vitest/node_modules/picomatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", - "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/walker": { "version": "1.0.8", "dev": true, @@ -12653,14 +12631,6 @@ "dev": true, "license": "ISC" }, - "node_modules/yaml": { - "version": "1.10.2", - "dev": true, - "license": "ISC", - "engines": { - "node": ">= 6" - } - }, "node_modules/yaml-ast-parser": { "version": "0.0.43", "dev": true, diff --git a/packages/nhsNotifyLambda/vitest.config.ts b/packages/nhsNotifyLambda/vitest.config.ts new file mode 100644 index 0000000000..8e0a46ea72 --- /dev/null +++ b/packages/nhsNotifyLambda/vitest.config.ts @@ -0,0 +1,9 @@ +import {defineConfig, mergeConfig} from "vitest/config" +import defaultConfig from "../../vitest.default.config.ts" + +export default mergeConfig(defaultConfig, defineConfig({ + root: "./", + test: { + setupFiles: ["./.jest/setEnvVars.js"] + } +})) diff --git a/packages/postDatedLambda/vitest.config.ts b/packages/postDatedLambda/vitest.config.ts new file mode 100644 index 0000000000..8e0a46ea72 --- /dev/null +++ b/packages/postDatedLambda/vitest.config.ts @@ -0,0 +1,9 @@ +import {defineConfig, mergeConfig} from "vitest/config" +import defaultConfig from "../../vitest.default.config.ts" + +export default mergeConfig(defaultConfig, defineConfig({ + root: "./", + test: { + setupFiles: ["./.jest/setEnvVars.js"] + } +})) diff --git a/packages/updatePrescriptionStatus/.vscode/launch.json b/packages/updatePrescriptionStatus/.vscode/launch.json index 4e2a6957e9..5f8187b962 100644 --- a/packages/updatePrescriptionStatus/.vscode/launch.json +++ b/packages/updatePrescriptionStatus/.vscode/launch.json @@ -2,30 +2,39 @@ "version": "0.2.0", "configurations": [ { + "name": "vitest: all tests", "type": "node", - "name": "vscode-jest-tests.v2", "request": "launch", + "cwd": "${workspaceFolder}", + "runtimeExecutable": "${workspaceFolder}/../../node_modules/vitest/vitest.mjs", "args": [ - "--runInBand", - "--watchAll=false", - "--testNamePattern", - "${jest.testNamePattern}", - "--runTestsByPath", - "${jest.testFile}", + "run", "--config", - "${workspaceFolder}/jest.debug.config.ts" + "vitest.config.ts" ], - "cwd": "${workspaceFolder}", - "console": "integratedTerminal", - "internalConsoleOptions": "neverOpen", - "program": "${workspaceFolder}/../../node_modules/.bin/jest", - "windows": { - "program": "${workspaceFolder}/node_modules/jest/bin/jest" + "env": { + "POWERTOOLS_DEV": "true" }, + "console": "integratedTerminal", + "internalConsoleOptions": "neverOpen" + }, + { + "name": "vitest: current file", + "type": "node", + "request": "launch", + "cwd": "${workspaceFolder}", + "runtimeExecutable": "${workspaceFolder}/../../node_modules/vitest/vitest.mjs", + "args": [ + "run", + "${relativeFile}", + "--config", + "vitest.config.ts" + ], "env": { - "POWERTOOLS_DEV": "true", - "NODE_OPTIONS": "--experimental-vm-modules" - } + "POWERTOOLS_DEV": "true" + }, + "console": "integratedTerminal", + "internalConsoleOptions": "neverOpen" } ] } diff --git a/packages/updatePrescriptionStatus/.vscode/settings.json b/packages/updatePrescriptionStatus/.vscode/settings.json index 3501264944..915c268c04 100644 --- a/packages/updatePrescriptionStatus/.vscode/settings.json +++ b/packages/updatePrescriptionStatus/.vscode/settings.json @@ -1,7 +1,3 @@ { - "jest.jestCommandLine": "/workspaces/eps-prescription-status-update-api/node_modules/.bin/jest --no-cache", - "jest.nodeEnv": { - "POWERTOOLS_DEV": true, - "NODE_OPTIONS": "--experimental-vm-modules" - } + "testing.automaticallyOpenPeekView": "never" } diff --git a/packages/updatePrescriptionStatus/package.json b/packages/updatePrescriptionStatus/package.json index b686951be2..4168984a2a 100644 --- a/packages/updatePrescriptionStatus/package.json +++ b/packages/updatePrescriptionStatus/package.json @@ -7,7 +7,7 @@ "license": "MIT", "type": "module", "scripts": { - "unit": "POWERTOOLS_DEV=true NODE_OPTIONS=--experimental-vm-modules jest --no-cache --coverage", + "unit": "POWERTOOLS_DEV=true vitest run --config vitest.config.ts --coverage", "lint": "eslint --max-warnings 0 --fix --config ../../eslint.config.mjs .", "compile": "tsc", "test": "npm run compile && npm run unit", diff --git a/packages/updatePrescriptionStatus/tests/testDatabaseClient.test.ts b/packages/updatePrescriptionStatus/tests/testDatabaseClient.test.ts index c321cb09d0..cd4c3ce535 100644 --- a/packages/updatePrescriptionStatus/tests/testDatabaseClient.test.ts +++ b/packages/updatePrescriptionStatus/tests/testDatabaseClient.test.ts @@ -2,24 +2,36 @@ import { expect, describe, it, - jest -} from "@jest/globals" + vi, + beforeEach +} from "vitest" import {TransactionCanceledException} from "@aws-sdk/client-dynamodb" -import {mockDynamoDBClient} from "./utils/testUtils" import {Logger} from "@aws-lambda-powertools/logger" import {marshall} from "@aws-sdk/util-dynamodb" -const {mockSend} = mockDynamoDBClient() +const {mockSend} = vi.hoisted(() => ({mockSend: vi.fn()})) + +vi.mock( + "@aws-sdk/client-dynamodb", + async (importOriginal: () => Promise) => { + const mod = await importOriginal() + return { + ...mod, + DynamoDBClient: vi.fn().mockImplementation(() => ({send: mockSend})) + } + } +) + const {persistDataItems, getPreviousItem, rollbackDataItems} = await import("../src/utils/databaseClient") const logger = new Logger({serviceName: "updatePrescriptionStatus_TEST"}) describe("Unit test persistDataItems", () => { beforeEach(() => { - jest.resetModules() - jest.clearAllMocks() - jest.resetAllMocks() + vi.resetModules() + vi.clearAllMocks() + vi.resetAllMocks() }) it("when the conditional check fails, an error is thrown", async () => { @@ -59,7 +71,7 @@ describe("Unit test persistDataItems", () => { CancellationReasons: [{Code: "ConditionalCheckFailedException"}] }) as never ) - const loggerSpy = jest.spyOn(logger, "error") + const loggerSpy = vi.spyOn(logger, "error") await expect(persistDataItems(dataItems, logger)).rejects.toThrow( new TransactionCanceledException({ @@ -104,7 +116,7 @@ describe("Unit test persistDataItems", () => { } ] - const loggerSpy = jest.spyOn(logger, "error") + const loggerSpy = vi.spyOn(logger, "error") const result = await persistDataItems(dataItems, logger) expect(result).toBe(true) @@ -127,7 +139,7 @@ describe("Unit test persistDataItems", () => { } const dataItems = Array(150).fill(dataItem) - const loggerSpy = jest.spyOn(logger, "error") + const loggerSpy = vi.spyOn(logger, "error") const result = await persistDataItems(dataItems, logger) expect(result).toBe(true) @@ -165,7 +177,7 @@ describe("Unit test persistDataItems", () => { } ] - const loggerSpy = jest.spyOn(logger, "error") + const loggerSpy = vi.spyOn(logger, "error") mockSend.mockRejectedValue( new Error("General error") as never ) @@ -178,9 +190,9 @@ describe("Unit test persistDataItems", () => { describe("Unit test getPreviousItem", () => { beforeEach(() => { - jest.resetModules() - jest.clearAllMocks() - jest.resetAllMocks() + vi.resetModules() + vi.clearAllMocks() + vi.resetAllMocks() }) const initialItem = { @@ -304,7 +316,7 @@ describe("Unit test getPreviousItem", () => { it("Should return undefined and log error when there is an error", async () => { mockSend.mockRejectedValue("Something went wrong" as never) - const loggerSpy = jest.spyOn(logger, "error") + const loggerSpy = vi.spyOn(logger, "error") const result = await getPreviousItem(currentItem, logger) expect(result).toEqual({ current: currentItem, @@ -318,9 +330,9 @@ describe("Unit test getPreviousItem", () => { describe("Unit test rollbackDataItems", () => { beforeEach(() => { - jest.resetModules() - jest.clearAllMocks() - jest.resetAllMocks() + vi.resetModules() + vi.clearAllMocks() + vi.resetAllMocks() }) const makeItem = (overrides = {}) => ({ @@ -344,8 +356,8 @@ describe("Unit test rollbackDataItems", () => { // success for each conditioned delete mockSend.mockImplementation(async () => Promise.resolve()) - const loggerWarn = jest.spyOn(logger, "warn") - const loggerError = jest.spyOn(logger, "error") + const loggerWarn = vi.spyOn(logger, "warn") + const loggerError = vi.spyOn(logger, "error") const result = await rollbackDataItems(items, logger) expect(result).toBe(true) @@ -368,8 +380,8 @@ describe("Unit test rollbackDataItems", () => { }) )) - const loggerWarn = jest.spyOn(logger, "warn") - const loggerError = jest.spyOn(logger, "error") + const loggerWarn = vi.spyOn(logger, "warn") + const loggerError = vi.spyOn(logger, "error") const result = await rollbackDataItems(items, logger) expect(result).toBe(true) // still overall success (safe to skip) @@ -383,7 +395,7 @@ describe("Unit test rollbackDataItems", () => { mockSend.mockImplementationOnce(async () => Promise.reject(new Error("error"))) - const loggerError = jest.spyOn(logger, "error") + const loggerError = vi.spyOn(logger, "error") const result = await rollbackDataItems(items, logger) expect(result).toBe(false) @@ -405,8 +417,8 @@ describe("Unit test rollbackDataItems", () => { )) .mockImplementationOnce(async () => Promise.resolve()) // C: delete ok - const loggerWarn = jest.spyOn(logger, "warn") - const loggerError = jest.spyOn(logger, "error") + const loggerWarn = vi.spyOn(logger, "warn") + const loggerError = vi.spyOn(logger, "error") const result = await rollbackDataItems(items, logger) expect(result).toBe(true) @@ -416,8 +428,8 @@ describe("Unit test rollbackDataItems", () => { }) it("does not fail if there are zero items", async () => { - const loggerWarn = jest.spyOn(logger, "warn") - const loggerError = jest.spyOn(logger, "error") + const loggerWarn = vi.spyOn(logger, "warn") + const loggerError = vi.spyOn(logger, "error") const result = await rollbackDataItems([], logger) expect(result).toBe(true) diff --git a/packages/updatePrescriptionStatus/tests/testHandler.test.ts b/packages/updatePrescriptionStatus/tests/testHandler.test.ts index 67b6f2222f..b6fae8c679 100644 --- a/packages/updatePrescriptionStatus/tests/testHandler.test.ts +++ b/packages/updatePrescriptionStatus/tests/testHandler.test.ts @@ -5,8 +5,9 @@ import { expect, describe, it, - jest -} from "@jest/globals" + vi, + beforeEach +} from "vitest" import { APPLICATION_NAME, @@ -16,7 +17,6 @@ import { generateBody, generateExpectedItems, generateMockEvent, - mockDynamoDBClient, TASK_VALUES, getTestPrescriptions } from "./utils/testUtils" @@ -36,29 +36,41 @@ import { timeoutResponse } from "../src/utils/responses" import {QueryCommand, TransactionCanceledException, TransactWriteItemsCommand} from "@aws-sdk/client-dynamodb" -import {LOG_MESSAGES} from "@psu-common/utilities" -const {mockSend: dynamoDBMockSend} = mockDynamoDBClient() +const {dynamoDBMockSend, mockPushPrescriptionToNotificationSQS, mockGetParametersByName, mockInitiatedSSMProvider} = + vi.hoisted(() => { + const mockGetParametersByName = vi.fn(async () => Promise.resolve( + {[process.env.ENABLE_NOTIFICATIONS_PARAM!]: "false"} + )) + return { + dynamoDBMockSend: vi.fn(), + mockPushPrescriptionToNotificationSQS: vi.fn().mockImplementation(async () => Promise.resolve()), + mockGetParametersByName, + mockInitiatedSSMProvider: {getParametersByName: mockGetParametersByName} + } + }) + +vi.mock("@aws-sdk/client-dynamodb", async (importOriginal) => { + const mod = await importOriginal() + return { + ...mod, + DynamoDBClient: vi.fn().mockImplementation(() => ({send: dynamoDBMockSend})) + } +}) -const mockPushPrescriptionToNotificationSQS = jest.fn().mockImplementation(async () => Promise.resolve()) -jest.unstable_mockModule("../src/utils/sqsClient", async () => ({ +vi.mock("../src/utils/sqsClient", async () => ({ __esModule: true, pushPrescriptionToNotificationSQS: mockPushPrescriptionToNotificationSQS })) -const mockGetParametersByName = jest.fn(async () => Promise.resolve( - {[process.env.ENABLE_NOTIFICATIONS_PARAM!]: "false"} -)) - -const mockInitiatedSSMProvider = { - getParametersByName: mockGetParametersByName -} - -jest.unstable_mockModule("@psu-common/utilities", async () => ({ - getTestPrescriptions: getTestPrescriptions, - initiatedSSMProvider: mockInitiatedSSMProvider, - LOG_MESSAGES: LOG_MESSAGES -})) +vi.mock("@psu-common/utilities", async (importOriginal) => { + const mod = await importOriginal() + return { + ...mod, + getTestPrescriptions: getTestPrescriptions, + initiatedSSMProvider: mockInitiatedSSMProvider + } +}) const {handler, logger} = await import("../src/updatePrescriptionStatus") @@ -68,12 +80,27 @@ const ORIGINAL_ENV = {...process.env} describe("Integration tests for updatePrescriptionStatus handler", () => { beforeEach(() => { - jest.resetModules() + vi.resetModules() process.env = {...ORIGINAL_ENV} - jest.clearAllMocks() - jest.resetAllMocks() - jest.clearAllTimers() - jest.useFakeTimers().setSystemTime(DEFAULT_DATE) + vi.clearAllMocks() + vi.clearAllTimers() + vi.useFakeTimers().setSystemTime(DEFAULT_DATE) + + dynamoDBMockSend.mockReset() + dynamoDBMockSend.mockImplementation(async (command: unknown) => { + if (command instanceof QueryCommand) { + return {Items: []} + } + return {} + }) + + mockPushPrescriptionToNotificationSQS.mockReset() + mockPushPrescriptionToNotificationSQS.mockImplementation(async () => Promise.resolve()) + + mockGetParametersByName.mockReset() + mockGetParametersByName.mockImplementation(async () => Promise.resolve( + {[process.env.ENABLE_NOTIFICATIONS_PARAM!]: "false"} + )) }) it("when request doesn't have correct resourceType and type, expect 400 status code and appropriate message", async () => { @@ -267,7 +294,7 @@ describe("Integration tests for updatePrescriptionStatus handler", () => { const event: APIGatewayProxyEvent = generateMockEvent(requestDispatched) const eventHandler: Promise = handler(event, {}) - await jest.advanceTimersByTimeAsync(LAMBDA_TIMEOUT_MS) + await vi.advanceTimersByTimeAsync(LAMBDA_TIMEOUT_MS) const response = await eventHandler expect(response.statusCode).toBe(504) @@ -427,7 +454,7 @@ describe("Integration tests for updatePrescriptionStatus handler", () => { it("when updates already exist for an item, logs transitions", async () => { const body = generateBody() const mockEvent: APIGatewayProxyEvent = generateMockEvent(body) - const loggerSpy = jest.spyOn(logger, "info") + const loggerSpy = vi.spyOn(logger, "info") dynamoDBMockSend.mockImplementation( async (command) => { diff --git a/packages/updatePrescriptionStatus/tests/testPrescriptionIntercept.test.ts b/packages/updatePrescriptionStatus/tests/testPrescriptionIntercept.test.ts index b5512745d8..a707949724 100644 --- a/packages/updatePrescriptionStatus/tests/testPrescriptionIntercept.test.ts +++ b/packages/updatePrescriptionStatus/tests/testPrescriptionIntercept.test.ts @@ -4,37 +4,49 @@ import { expect, it, describe, - jest, - beforeEach -} from "@jest/globals" + vi, + beforeEach, + afterEach +} from "vitest" import { DEFAULT_DATE, FULL_URL_1, generateBody, generateExpectedItems, generateMockEvent, - mockDynamoDBClient, TASK_VALUES, getTestPrescriptions } from "./utils/testUtils" import {GetItemCommand, TransactionCanceledException, TransactWriteItemsCommand} from "@aws-sdk/client-dynamodb" -import {LOG_MESSAGES} from "@psu-common/utilities" -export const mockGetParametersByName = jest.fn(async () => { - return {} +const {mockSend, mockGetParametersByName, mockInitiatedSSMProvider} = vi.hoisted(() => { + const mockGetParametersByName = vi.fn(async () => ({})) + return { + mockSend: vi.fn(), + mockGetParametersByName, + mockInitiatedSSMProvider: {getParametersByName: mockGetParametersByName} + } }) -const mockInitiatedSSMProvider = { - getParametersByName: mockGetParametersByName -} +export {mockGetParametersByName} + +vi.mock("@aws-sdk/client-dynamodb", async (importOriginal) => { + const mod = await importOriginal() + return { + ...mod, + DynamoDBClient: vi.fn().mockImplementation(() => ({send: mockSend})) + } +}) -jest.unstable_mockModule("@psu-common/utilities", async () => ({ - initiatedSSMProvider: mockInitiatedSSMProvider, - getTestPrescriptions: getTestPrescriptions, // Use the mocked version defined in testUtils.ts - LOG_MESSAGES: LOG_MESSAGES -})) +vi.mock("@psu-common/utilities", async (importOriginal) => { + const mod = await importOriginal() + return { + ...mod, + initiatedSSMProvider: mockInitiatedSSMProvider, + getTestPrescriptions: getTestPrescriptions + } +}) -const {mockSend} = mockDynamoDBClient() process.env.ENVIRONMENT = "int" function resetDynamoMock() { @@ -78,11 +90,11 @@ function expectGetItemCommand(prescriptionID: string, taskID: string) { describe("testPrescription1Intercept", () => { beforeEach(async () => { - jest.useFakeTimers().setSystemTime(DEFAULT_DATE) + vi.useFakeTimers().setSystemTime(DEFAULT_DATE) const {resetTestPrescriptions} = await import("../src/updatePrescriptionStatus") resetTestPrescriptions() resetDynamoMock() - jest.clearAllMocks() + vi.clearAllMocks() }) it("Return 500 and write to DynamoDB when test prescription 1 is submitted for the first time", async () => { @@ -94,7 +106,7 @@ describe("testPrescription1Intercept", () => { expectedItems.input.TransactItems = [expectedItems.input.TransactItems[1]] const {handler, logger} = await import("../src/updatePrescriptionStatus") - const loggerInfo = jest.spyOn(logger, "info") + const loggerInfo = vi.spyOn(logger, "info") const response: APIGatewayProxyResult = await handler(event, {}) expect(response.statusCode).toEqual(500) @@ -112,7 +124,7 @@ describe("testPrescription1Intercept", () => { const event: APIGatewayProxyEvent = generateMockEvent(body) const {handler, logger} = await import("../src/updatePrescriptionStatus") - const loggerInfo = jest.spyOn(logger, "info") + const loggerInfo = vi.spyOn(logger, "info") const first_submission_response: APIGatewayProxyResult = await handler(event, {}) expect(first_submission_response.statusCode).toEqual(500) @@ -136,11 +148,11 @@ describe("testPrescription1Intercept", () => { describe("testPrescription2Intercept", () => { beforeEach(async () => { - jest.useFakeTimers().setSystemTime(DEFAULT_DATE) + vi.useFakeTimers().setSystemTime(DEFAULT_DATE) const {resetTestPrescriptions} = await import("../src/updatePrescriptionStatus") resetTestPrescriptions() resetDynamoMock() - jest.clearAllMocks() + vi.clearAllMocks() }) it("Return 500 and write to DynamoDB when test prescription 2 is submitted for the first time", async () => { @@ -152,7 +164,7 @@ describe("testPrescription2Intercept", () => { expectedItems.input.TransactItems = [expectedItems.input.TransactItems[3]] const {handler, logger} = await import("../src/updatePrescriptionStatus") - const loggerInfo = jest.spyOn(logger, "info") + const loggerInfo = vi.spyOn(logger, "info") const response: APIGatewayProxyResult = await handler(event, {}) expect(response.statusCode).toEqual(500) @@ -172,7 +184,7 @@ describe("testPrescription2Intercept", () => { const event: APIGatewayProxyEvent = generateMockEvent(body) const {handler, logger} = await import("../src/updatePrescriptionStatus") - const loggerInfo = jest.spyOn(logger, "info") + const loggerInfo = vi.spyOn(logger, "info") const first_submission_response: APIGatewayProxyResult = await handler(event, {}) expect(first_submission_response.statusCode).toEqual(500) @@ -204,16 +216,16 @@ describe("testPrescription2Intercept", () => { describe("testPrescription3Intercept", () => { beforeEach(async () => { - jest.useFakeTimers().setSystemTime(DEFAULT_DATE) - jest.resetModules() + vi.useFakeTimers().setSystemTime(DEFAULT_DATE) + vi.resetModules() const {resetTestPrescriptions} = await import("../src/updatePrescriptionStatus") resetTestPrescriptions() resetDynamoMock() - jest.clearAllMocks() + vi.clearAllMocks() }) afterEach(() => { - jest.resetModules() + vi.resetModules() }) it("Return 400 when test prescription 3 is submitted", async () => { @@ -222,7 +234,7 @@ describe("testPrescription3Intercept", () => { const event: APIGatewayProxyEvent = generateMockEvent(body) const {handler, logger} = await import("../src/updatePrescriptionStatus") - const loggerInfo = jest.spyOn(logger, "info") + const loggerInfo = vi.spyOn(logger, "info") const response: APIGatewayProxyResult = await handler(event, {}) expect(response.statusCode).toEqual(400) @@ -233,16 +245,16 @@ describe("testPrescription3Intercept", () => { describe("testPrescription4Intercept", () => { beforeEach(async () => { - jest.useFakeTimers().setSystemTime(DEFAULT_DATE) - jest.resetModules() + vi.useFakeTimers().setSystemTime(DEFAULT_DATE) + vi.resetModules() const {resetTestPrescriptions} = await import("../src/updatePrescriptionStatus") resetTestPrescriptions() resetDynamoMock() - jest.clearAllMocks() + vi.clearAllMocks() }) afterEach(() => { - jest.resetModules() + vi.resetModules() }) it("Return 400 when test prescription 4 is submitted", async () => { @@ -251,7 +263,7 @@ describe("testPrescription4Intercept", () => { const event: APIGatewayProxyEvent = generateMockEvent(body) const {handler, logger} = await import("../src/updatePrescriptionStatus") - const loggerInfo = jest.spyOn(logger, "info") + const loggerInfo = vi.spyOn(logger, "info") const response: APIGatewayProxyResult = await handler(event, {}) console.log(response) expect(loggerInfo).toHaveBeenCalledWith( diff --git a/packages/updatePrescriptionStatus/tests/testSqsClient.test.ts b/packages/updatePrescriptionStatus/tests/testSqsClient.test.ts index f720533a4e..40e0ac85af 100644 --- a/packages/updatePrescriptionStatus/tests/testSqsClient.test.ts +++ b/packages/updatePrescriptionStatus/tests/testSqsClient.test.ts @@ -2,47 +2,51 @@ import { describe, it, expect, - jest -} from "@jest/globals" -import {SpiedFunction} from "jest-mock" - + vi, + beforeEach +} from "vitest" +import type {MockInstance} from "vitest" import {Logger} from "@aws-lambda-powertools/logger" -import {LogItemMessage, LogItemExtraInput} from "@aws-lambda-powertools/logger/lib/cjs/types/Logger" import {SendMessageBatchCommand} from "@aws-sdk/client-sqs" -import {createMockDataItem, mockSQSClient} from "./utils/testUtils" +import {createMockDataItem} from "./utils/testUtils" -const {mockSend} = mockSQSClient() +const {mockSend, mockGetSecret, mockInitiatedSSMProvider} = vi.hoisted(() => { + const mockGetParametersByName = vi.fn(async () => ({ + [process.env.ENABLED_SITE_ODS_CODES_PARAM!]: "FA565", + // eslint-disable-next-line max-len + [process.env.ENABLED_SYSTEMS_PARAM!]: "Internal Test System,Apotec Ltd - Apotec CRM - Production,CrxPatientApp,nhsPrescriptionApp,Titan PSU Prod", + [process.env.BLOCKED_SITE_ODS_CODES_PARAM!]: "B3J1Z" + })) -const mockGetSecret = jest.fn().mockImplementation(async () => { - return {"salt": "salt"} + return { + mockSend: vi.fn(), + mockGetSecret: vi.fn().mockImplementation(async () => ({salt: "salt"})), + mockInitiatedSSMProvider: {getParametersByName: mockGetParametersByName} + } }) -jest.unstable_mockModule( - "@aws-lambda-powertools/parameters/secrets", - async () => ({ - __esModule: true, - getSecret: mockGetSecret - }) -) -export const mockGetParametersByName = jest.fn(async () => { - // eslint-disable-next-line max-len - let enabledString: string = "Internal Test System,Apotec Ltd - Apotec CRM - Production,CrxPatientApp,nhsPrescriptionApp,Titan PSU Prod" +vi.mock("@aws-sdk/client-sqs", async (importOriginal: () => Promise) => { + const mod = await importOriginal() return { - [process.env.ENABLED_SITE_ODS_CODES_PARAM!]: "FA565", - [process.env.ENABLED_SYSTEMS_PARAM!]: enabledString, - [process.env.BLOCKED_SITE_ODS_CODES_PARAM!]: "B3J1Z" + ...mod, + SQSClient: vi.fn().mockImplementation(() => ({send: mockSend})) } }) -const mockInitiatedSSMProvider = { - getParametersByName: mockGetParametersByName -} - -jest.unstable_mockModule("@psu-common/utilities", async () => ({ - initiatedSSMProvider: mockInitiatedSSMProvider +vi.mock("@aws-lambda-powertools/parameters/secrets", async () => ({ + __esModule: true, + getSecret: mockGetSecret })) +vi.mock("@psu-common/utilities", async (importOriginal: () => Promise) => { + const mod = await importOriginal() + return { + ...mod, + initiatedSSMProvider: mockInitiatedSSMProvider + } +}) + const { pushPrescriptionToNotificationSQS, saltedHash @@ -53,22 +57,22 @@ const ORIGINAL_ENV = {...process.env} describe("Unit tests for pushPrescriptionToNotificationSQS", () => { let logger: Logger - let infoSpy: SpiedFunction<(input: LogItemMessage, ...extraInput: LogItemExtraInput) => void> - let errorSpy: SpiedFunction<(input: LogItemMessage, ...extraInput: LogItemExtraInput) => void> - let warnSpy: SpiedFunction<(input: LogItemMessage, ...extraInput: LogItemExtraInput) => void> + let infoSpy: MockInstance + let errorSpy: MockInstance + let warnSpy: MockInstance beforeEach(() => { - jest.resetModules() - jest.clearAllMocks() + vi.resetModules() + vi.clearAllMocks() // Reset environment process.env = {...ORIGINAL_ENV} // Fresh logger and spies logger = new Logger({serviceName: "test-service"}) - infoSpy = jest.spyOn(logger, "info") - errorSpy = jest.spyOn(logger, "error") - warnSpy = jest.spyOn(logger, "warn") + infoSpy = vi.spyOn(logger, "info") + errorSpy = vi.spyOn(logger, "error") + warnSpy = vi.spyOn(logger, "warn") }) it("throws if the SQS URL is not configured", async () => { @@ -372,18 +376,18 @@ describe("Unit tests for pushPrescriptionToNotificationSQS", () => { describe("Unit tests for getSaltValue", () => { let getSaltValue: (logger: Logger) => Promise let logger: Logger - let errorSpy: SpiedFunction<(input: LogItemMessage, ...extraInput: LogItemExtraInput) => void> - let warnSpy: SpiedFunction<(input: LogItemMessage, ...extraInput: LogItemExtraInput) => void> + let errorSpy: MockInstance + let warnSpy: MockInstance const fallbackSalt = "DEV SALT" beforeEach(async () => { - jest.resetModules() - jest.clearAllMocks() + vi.resetModules() + vi.clearAllMocks() process.env = {...ORIGINAL_ENV} logger = new Logger({serviceName: "test-service"}) - errorSpy = jest.spyOn(logger, "error") - warnSpy = jest.spyOn(logger, "warn"); + errorSpy = vi.spyOn(logger, "error") + warnSpy = vi.spyOn(logger, "warn"); ({getSaltValue} = await import("../src/utils/sqsClient")) }) @@ -443,11 +447,11 @@ describe("Unit tests for getSaltValue", () => { }) describe("Unit tests for checkSiteOrSystemIsNotifyEnabled", () => { let logger: Logger - let infoSpy: SpiedFunction<(input: LogItemMessage, ...extraInput: LogItemExtraInput) => void> + let infoSpy: MockInstance beforeEach(() => { // Fresh logger and spies logger = new Logger({serviceName: "test-service"}) - infoSpy = jest.spyOn(logger, "info") + infoSpy = vi.spyOn(logger, "info") }) it("includes an item with an enabled ODS code", async () => { @@ -543,7 +547,7 @@ describe("Unit tests for checkSiteOrSystemIsNotifyEnabled", () => { }) function expectLogReceivedAndAllowed( - infoSpy: SpiedFunction<(input: LogItemMessage, ...extraInput: LogItemExtraInput) => void>, + infoSpy: MockInstance, numItemsReceived: number, numItemsAllowed: number) { expect(infoSpy).toHaveBeenCalledWith( diff --git a/packages/updatePrescriptionStatus/tests/testUpdatePrescriptionStatus.test.ts b/packages/updatePrescriptionStatus/tests/testUpdatePrescriptionStatus.test.ts index a03d391b60..03c1cd59a8 100644 --- a/packages/updatePrescriptionStatus/tests/testUpdatePrescriptionStatus.test.ts +++ b/packages/updatePrescriptionStatus/tests/testUpdatePrescriptionStatus.test.ts @@ -3,8 +3,9 @@ import { expect, describe, it, - jest -} from "@jest/globals" + vi, + beforeAll +} from "vitest" import {BundleEntry} from "fhir/r4" @@ -12,38 +13,46 @@ import {badRequest, conflictDuplicate} from "../src/utils/responses" import { DEFAULT_DATE, X_REQUEST_ID, - mockInternalDependency, validTask, getTestPrescriptions } from "./utils/testUtils" import {APIGatewayProxyEvent} from "aws-lambda" -import * as content from "../src/validation/content" import {TransactionCanceledException} from "@aws-sdk/client-dynamodb" -import {LOG_MESSAGES} from "@psu-common/utilities" -const mockValidateEntry = mockInternalDependency("../../src/validation/content", content, "validateEntry") - -const mockGetParametersByName = jest.fn(async () => Promise.resolve( - {[process.env.ENABLE_NOTIFICATIONS_PARAM!]: "false"} -)) +const {mockValidateEntry, mockInitiatedSSMProvider} = vi.hoisted(() => { + const mockGetParametersByName = vi.fn(async () => Promise.resolve( + {[process.env.ENABLE_NOTIFICATIONS_PARAM!]: "false"} + )) + return { + mockValidateEntry: vi.fn(), + mockInitiatedSSMProvider: {getParametersByName: mockGetParametersByName} + } +}) -const mockInitiatedSSMProvider = { - getParametersByName: mockGetParametersByName -} +vi.mock("../src/validation/content", async (importOriginal) => { + const mod = await importOriginal() + return { + ...mod, + validateEntry: mockValidateEntry + } +}) -jest.unstable_mockModule("@psu-common/utilities", async () => ({ - getTestPrescriptions: getTestPrescriptions, - initiatedSSMProvider: mockInitiatedSSMProvider, - LOG_MESSAGES: LOG_MESSAGES -})) +vi.mock("@psu-common/utilities", async (importOriginal) => { + const mod = await importOriginal() + return { + ...mod, + getTestPrescriptions: getTestPrescriptions, + initiatedSSMProvider: mockInitiatedSSMProvider + } +}) const {castEventBody, getXRequestID, validateEntries, handleTransactionCancelledException, buildDataItems, TTL_DELTA} = await import("../src/updatePrescriptionStatus") describe("Unit test getXRequestID", () => { beforeAll(() => { - jest.useFakeTimers().setSystemTime(DEFAULT_DATE) + vi.useFakeTimers().setSystemTime(DEFAULT_DATE) }) it("when event has x-request-id, return it and no response entry", async () => { @@ -78,7 +87,7 @@ describe("Unit test getXRequestID", () => { describe("Unit test castEventBody", () => { beforeAll(() => { - jest.useFakeTimers().setSystemTime(DEFAULT_DATE) + vi.useFakeTimers().setSystemTime(DEFAULT_DATE) }) it("when body doesn't have correct resourceType and type, return undefined and a response entry", async () => { diff --git a/packages/updatePrescriptionStatus/tests/utils/testUtils.ts b/packages/updatePrescriptionStatus/tests/utils/testUtils.ts index ef7137cb6c..7042710ba7 100644 --- a/packages/updatePrescriptionStatus/tests/utils/testUtils.ts +++ b/packages/updatePrescriptionStatus/tests/utils/testUtils.ts @@ -1,9 +1,7 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ import {APIGatewayProxyEvent} from "aws-lambda" -import {jest} from "@jest/globals" -import * as dynamo from "@aws-sdk/client-dynamodb" -import * as sqs from "@aws-sdk/client-sqs" +import {vi, expect} from "vitest" import { LINE_ITEM_ID_CODESYSTEM, @@ -159,42 +157,26 @@ export function generateExpectedItems(itemCount: number = 1) { return {input: {TransactItems: items}} } -// Uses unstable jest method to enable mocking while using ESM. To be replaced in future. -export function mockInternalDependency(modulePath: string, module: object, dependency: string) { - const mockDependency = jest.fn() - jest.unstable_mockModule(modulePath, () => ({ - ...module, - [dependency]: mockDependency - })) - return mockDependency +// Deprecated: use vi.hoisted() + vi.mock() in the consuming test file instead. +export function mockInternalDependency(): never { + throw new Error( + "mockInternalDependency() is not supported with Vitest. " + + "Use vi.hoisted() + vi.mock() in the test file instead." + ) } -// Uses unstable jest method to enable mocking while using ESM. To be replaced in future. -export function mockDynamoDBClient() { - const mockSend = jest.fn() - jest.unstable_mockModule("@aws-sdk/client-dynamodb", () => { - return { - ...dynamo, - DynamoDBClient: jest.fn().mockImplementation(() => ({ - send: mockSend - })) - } - }) - return {mockSend} +export function mockDynamoDBClient(): never { + throw new Error( + "mockDynamoDBClient() is not supported with Vitest. " + + "Use vi.hoisted() + vi.mock() in the test file instead." + ) } -// Similarly mock the SQS client -export function mockSQSClient() { - const mockSend = jest.fn() - jest.unstable_mockModule("@aws-sdk/client-sqs", () => { - return { - ...sqs, - SQSClient: jest.fn().mockImplementation(() => ({ - send: mockSend - })) - } - }) - return {mockSend} +export function mockSQSClient(): never { + throw new Error( + "mockSQSClient() is not supported with Vitest. " + + "Use vi.hoisted() + vi.mock() in the test file instead." + ) } export function createMockDataItem(overrides: Partial): PSUDataItem { @@ -222,7 +204,7 @@ const mockPrescriptions = new Map([ ["TEST_PRESCRIPTIONS_PARAM_4", [TASK_VALUES[0].prescriptionID]] ]) -export const getTestPrescriptions = jest.fn() +export const getTestPrescriptions = vi.fn() .mockName("getTestPrescriptions") .mockImplementation((param: unknown) => { return Promise.resolve(mockPrescriptions.get(param as string) || []) diff --git a/packages/updatePrescriptionStatus/tests/utils/testValidateNhsNumber.test.ts b/packages/updatePrescriptionStatus/tests/utils/testValidateNhsNumber.test.ts index 4cfea67304..ab4acaba5f 100644 --- a/packages/updatePrescriptionStatus/tests/utils/testValidateNhsNumber.test.ts +++ b/packages/updatePrescriptionStatus/tests/utils/testValidateNhsNumber.test.ts @@ -1,5 +1,6 @@ // https://github.com/tbrd/nhs-numbers +import {describe, it, expect} from "vitest" import {generateInvalidNhsNumbers, generateValidNhsNumbers} from "./nhsNumber" import {validateNhsNumber} from "../../src/utils/nhsNumber" diff --git a/packages/updatePrescriptionStatus/tests/validation/testRequestContentValidation.test.ts b/packages/updatePrescriptionStatus/tests/validation/testRequestContentValidation.test.ts index 813a04215a..7534454fc8 100644 --- a/packages/updatePrescriptionStatus/tests/validation/testRequestContentValidation.test.ts +++ b/packages/updatePrescriptionStatus/tests/validation/testRequestContentValidation.test.ts @@ -2,8 +2,9 @@ import { expect, describe, it, - jest -} from "@jest/globals" + vi, + beforeEach +} from "vitest" import {BundleEntry, Task} from "fhir/r4" import { @@ -36,7 +37,7 @@ import { describe("Unit test for overall task validation", () => { beforeEach(() => { - jest.useFakeTimers().setSystemTime(DEFAULT_DATE) + vi.useFakeTimers().setSystemTime(DEFAULT_DATE) }) it("When task is valid, should return true with no issues.", async () => { const expectedOutcome = {valid: true, issues: undefined} diff --git a/packages/updatePrescriptionStatus/tests/validation/testRequestFieldValidation.test.ts b/packages/updatePrescriptionStatus/tests/validation/testRequestFieldValidation.test.ts index 888e145cf8..122c3ca47b 100644 --- a/packages/updatePrescriptionStatus/tests/validation/testRequestFieldValidation.test.ts +++ b/packages/updatePrescriptionStatus/tests/validation/testRequestFieldValidation.test.ts @@ -1,5 +1,5 @@ -import {expect, describe, it} from "@jest/globals" +import {expect, describe, it} from "vitest" import {BundleEntry, Task} from "fhir/r4" import {taskFields, validateFields} from "../../src/validation/fields" diff --git a/packages/updatePrescriptionStatus/tests/validation/testRequestValidationViaHandler.test.ts b/packages/updatePrescriptionStatus/tests/validation/testRequestValidationViaHandler.test.ts index 9292e6275d..b8a70faa49 100644 --- a/packages/updatePrescriptionStatus/tests/validation/testRequestValidationViaHandler.test.ts +++ b/packages/updatePrescriptionStatus/tests/validation/testRequestValidationViaHandler.test.ts @@ -5,8 +5,9 @@ import { expect, describe, it, - jest -} from "@jest/globals" + vi, + beforeEach +} from "vitest" import { DEFAULT_DATE, @@ -21,28 +22,31 @@ import {ONE_DAY_IN_MS} from "../../src/validation/content" import requestSingleItem from "../../../specification/examples/request-dispatched.json" import requestMultipleItems from "../../../specification/examples/request-multiple-items.json" import {accepted, badRequest, bundleWrap} from "../../src/utils/responses" -import {LOG_MESSAGES} from "@psu-common/utilities" -const mockGetParametersByName = jest.fn(async () => Promise.resolve( - {[process.env.ENABLE_NOTIFICATIONS_PARAM!]: "false"} -)) - -const mockInitiatedSSMProvider = { - getParametersByName: mockGetParametersByName -} +const {mockInitiatedSSMProvider} = vi.hoisted(() => { + const mockGetParametersByName = vi.fn(async () => Promise.resolve( + {[process.env.ENABLE_NOTIFICATIONS_PARAM!]: "false"} + )) + return { + mockInitiatedSSMProvider: {getParametersByName: mockGetParametersByName} + } +}) -jest.unstable_mockModule("@psu-common/utilities", async () => ({ - getTestPrescriptions: getTestPrescriptions, - initiatedSSMProvider: mockInitiatedSSMProvider, - LOG_MESSAGES: LOG_MESSAGES -})) +vi.mock("@psu-common/utilities", async (importOriginal) => { + const mod = await importOriginal() + return { + ...mod, + getTestPrescriptions: getTestPrescriptions, + initiatedSSMProvider: mockInitiatedSSMProvider + } +}) const {handler} = await import("../../src/updatePrescriptionStatus") describe("Integration tests for validation via updatePrescriptionStatus handler", () => { beforeEach(() => { - jest.resetModules() - jest.useFakeTimers().setSystemTime(DEFAULT_DATE) + vi.resetModules() + vi.useFakeTimers().setSystemTime(DEFAULT_DATE) }) // eslint-disable-next-line max-len diff --git a/packages/updatePrescriptionStatus/vitest.config.ts b/packages/updatePrescriptionStatus/vitest.config.ts new file mode 100644 index 0000000000..8e0a46ea72 --- /dev/null +++ b/packages/updatePrescriptionStatus/vitest.config.ts @@ -0,0 +1,9 @@ +import {defineConfig, mergeConfig} from "vitest/config" +import defaultConfig from "../../vitest.default.config.ts" + +export default mergeConfig(defaultConfig, defineConfig({ + root: "./", + test: { + setupFiles: ["./.jest/setEnvVars.js"] + } +})) From ecc55419f2a11ea5e629e02912f11ca0f35201c9 Mon Sep 17 00:00:00 2001 From: tstephen-nhs <231503406+tstephen-nhs@users.noreply.github.com> Date: Tue, 31 Mar 2026 16:00:28 +0000 Subject: [PATCH 04/20] chore: add yaml required by redocly --- package-lock.json | 18 ++++++++++++++++++ packages/specification/package.json | 3 +++ 2 files changed, 21 insertions(+) diff --git a/package-lock.json b/package-lock.json index bee01700d8..cace8ba3d0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12631,6 +12631,21 @@ "dev": true, "license": "ISC" }, + "node_modules/yaml": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.3.tgz", + "integrity": "sha512-AvbaCLOO2Otw/lW5bmh9d/WEdcDFdQp2Z2ZUH3pX9U2ihyUY0nvLv7J6TrWowklRGPYbB/IuIMfYgxaCPg5Bpg==", + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" + } + }, "node_modules/yaml-ast-parser": { "version": "0.0.43", "dev": true, @@ -12915,6 +12930,9 @@ "name": "apim-spec", "version": "0.0.1", "license": "MIT", + "dependencies": { + "yaml": "^2.8.3" + }, "devDependencies": { "@redocly/cli": "^2.24.1" }, diff --git a/packages/specification/package.json b/packages/specification/package.json index 6a21db175c..08c4a8bff5 100644 --- a/packages/specification/package.json +++ b/packages/specification/package.json @@ -19,5 +19,8 @@ "homepage": "https://github.com/NHSDigital/eps-prescription-status-update-api", "devDependencies": { "@redocly/cli": "^2.24.1" + }, + "dependencies": { + "yaml": "^2.8.3" } } From 60e360677e6ce1e2335acf12c2abc8ebab6be137 Mon Sep 17 00:00:00 2001 From: tstephen-nhs <231503406+tstephen-nhs@users.noreply.github.com> Date: Tue, 31 Mar 2026 16:32:31 +0000 Subject: [PATCH 05/20] chore: migrated nhsNotifyLambda tests passing --- packages/nhsNotifyLambda/.vscode/launch.json | 65 ++++---- .../nhsNotifyLambda/.vscode/settings.json | 6 +- packages/nhsNotifyLambda/package.json | 2 +- packages/nhsNotifyLambda/tests/notify.test.ts | 14 +- .../nhsNotifyLambda/tests/testAuth.test.ts | 19 ++- packages/nhsNotifyLambda/tests/testHelpers.ts | 28 ++-- .../tests/testNhsNotifyLambda.test.ts | 58 ++++--- .../nhsNotifyLambda/tests/testSecrets.test.ts | 11 +- .../nhsNotifyLambda/tests/testUtils.test.ts | 147 ++++++++++-------- packages/nhsNotifyLambda/vitest.config.ts | 1 + 10 files changed, 195 insertions(+), 156 deletions(-) diff --git a/packages/nhsNotifyLambda/.vscode/launch.json b/packages/nhsNotifyLambda/.vscode/launch.json index 7c9b0b4b3a..031eba02bb 100644 --- a/packages/nhsNotifyLambda/.vscode/launch.json +++ b/packages/nhsNotifyLambda/.vscode/launch.json @@ -1,35 +1,40 @@ { - // Use IntelliSense to learn about possible attributes. - // Hover to view descriptions of existing attributes. - // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 "version": "0.2.0", "configurations": [ - { - "type": "node", - "name": "vscode-jest-tests.v2", - "request": "launch", - "args": [ - "--runInBand", - "--watchAll=false", - "--testNamePattern", - "${jest.testNamePattern}", - "--runTestsByPath", - "${jest.testFile}", - "--config", - "${workspaceFolder}/jest.debug.config.ts" - ], - "cwd": "${workspaceFolder}", - "console": "integratedTerminal", - "internalConsoleOptions": "neverOpen", - "disableOptimisticBPs": true, - "program": "${workspaceFolder}/../../node_modules/.bin/jest", - "windows": { - "program": "${workspaceFolder}/node_modules/jest/bin/jest" - }, - "env": { - "POWERTOOLS_DEV": true, - "NODE_OPTIONS": "--experimental-vm-modules" - } - } + { + "name": "vitest: all tests", + "type": "node", + "request": "launch", + "cwd": "${workspaceFolder}", + "runtimeExecutable": "${workspaceFolder}/../../node_modules/vitest/vitest.mjs", + "args": [ + "run", + "--config", + "vitest.config.ts" + ], + "env": { + "POWERTOOLS_DEV": "true" + }, + "console": "integratedTerminal", + "internalConsoleOptions": "neverOpen" + }, + { + "name": "vitest: current file", + "type": "node", + "request": "launch", + "cwd": "${workspaceFolder}", + "runtimeExecutable": "${workspaceFolder}/../../node_modules/vitest/vitest.mjs", + "args": [ + "run", + "${relativeFile}", + "--config", + "vitest.config.ts" + ], + "env": { + "POWERTOOLS_DEV": "true" + }, + "console": "integratedTerminal", + "internalConsoleOptions": "neverOpen" + } ] } diff --git a/packages/nhsNotifyLambda/.vscode/settings.json b/packages/nhsNotifyLambda/.vscode/settings.json index 3501264944..915c268c04 100644 --- a/packages/nhsNotifyLambda/.vscode/settings.json +++ b/packages/nhsNotifyLambda/.vscode/settings.json @@ -1,7 +1,3 @@ { - "jest.jestCommandLine": "/workspaces/eps-prescription-status-update-api/node_modules/.bin/jest --no-cache", - "jest.nodeEnv": { - "POWERTOOLS_DEV": true, - "NODE_OPTIONS": "--experimental-vm-modules" - } + "testing.automaticallyOpenPeekView": "never" } diff --git a/packages/nhsNotifyLambda/package.json b/packages/nhsNotifyLambda/package.json index 651d35c203..edc51483fe 100644 --- a/packages/nhsNotifyLambda/package.json +++ b/packages/nhsNotifyLambda/package.json @@ -7,7 +7,7 @@ "license": "MIT", "type": "module", "scripts": { - "unit": "POWERTOOLS_DEV=true NODE_OPTIONS=--experimental-vm-modules jest --no-cache --coverage", + "unit": "POWERTOOLS_DEV=true vitest run --config vitest.config.ts --coverage", "lint": "eslint --max-warnings 0 --fix --config ../../eslint.config.mjs .", "compile": "tsc", "test": "npm run compile && npm run unit", diff --git a/packages/nhsNotifyLambda/tests/notify.test.ts b/packages/nhsNotifyLambda/tests/notify.test.ts index 61a200a0a5..6cbe1e66b7 100644 --- a/packages/nhsNotifyLambda/tests/notify.test.ts +++ b/packages/nhsNotifyLambda/tests/notify.test.ts @@ -1,4 +1,4 @@ -import {jest, describe, it} from "@jest/globals" +import {vi, describe, it} from "vitest" import {Logger} from "@aws-lambda-powertools/logger" import {logNotificationRequest} from "../src/utils/notify" @@ -7,13 +7,11 @@ import {LOG_MESSAGES} from "@psu-common/utilities" // Mock crypto.randomUUID const mockUUID = "550e8400-e29b-41d4-a716-446655440000" -globalThis.crypto = { - randomUUID: () => mockUUID -} as unknown as Crypto +vi.spyOn(globalThis.crypto, "randomUUID").mockReturnValue(mockUUID) -const mockInfo = jest.fn() -const mockError = jest.fn() -const mockWarn = jest.fn() +const mockInfo = vi.fn() +const mockError = vi.fn() +const mockWarn = vi.fn() describe("logNotificationRequest", () => { let mockLogger: Logger @@ -70,7 +68,7 @@ describe("logNotificationRequest", () => { data = [dataItem1, dataItem2] - jest.clearAllMocks() + vi.clearAllMocks() }) it("should log legacy notification request summary", () => { diff --git a/packages/nhsNotifyLambda/tests/testAuth.test.ts b/packages/nhsNotifyLambda/tests/testAuth.test.ts index c2956d03f7..1ded41cda6 100644 --- a/packages/nhsNotifyLambda/tests/testAuth.test.ts +++ b/packages/nhsNotifyLambda/tests/testAuth.test.ts @@ -1,12 +1,15 @@ -import {jest} from "@jest/globals" +import {vi} from "vitest" import nock from "nock" import {Logger} from "@aws-lambda-powertools/logger" import axios, {AxiosInstance} from "axios" -const mockImportPKCS8 = jest.fn() -const mockSignJWTConstructor = jest.fn() -jest.unstable_mockModule("jose", async () => ({ +const {mockImportPKCS8, mockSignJWTConstructor} = vi.hoisted(() => ({ + mockImportPKCS8: vi.fn(), + mockSignJWTConstructor: vi.fn() +})) + +vi.mock("jose", async () => ({ __esModule: true, importPKCS8: mockImportPKCS8, SignJWT: mockSignJWTConstructor @@ -31,7 +34,7 @@ describe("tokenExchange", () => { let axiosInstance: AxiosInstance beforeEach(() => { - jest.clearAllMocks() + vi.clearAllMocks() logger = new Logger({serviceName: "test-service"}) axiosInstance = axios.create({baseURL: host}) @@ -56,7 +59,7 @@ describe("tokenExchange", () => { setExpirationTime: function () { return this }, - sign: jest.fn().mockImplementation(() => Promise.resolve("signed.jwt.token")) + sign: vi.fn().mockImplementation(() => Promise.resolve("signed.jwt.token")) } mockSignJWTConstructor.mockImplementation(() => fakeJwtInstance) @@ -101,7 +104,7 @@ describe("tokenExchange", () => { setExpirationTime() { return this }, - sign: jest.fn().mockImplementation(() => Promise.resolve("jwt-tkn")) + sign: vi.fn().mockImplementation(() => Promise.resolve("jwt-tkn")) })) nock(`${host}`) @@ -131,7 +134,7 @@ describe("tokenExchange", () => { setExpirationTime() { return this }, - sign: jest.fn().mockImplementation(() => Promise.resolve("jwt-tkn")) + sign: vi.fn().mockImplementation(() => Promise.resolve("jwt-tkn")) })) nock(`${host}`) diff --git a/packages/nhsNotifyLambda/tests/testHelpers.ts b/packages/nhsNotifyLambda/tests/testHelpers.ts index ce64f090d7..b7e3d0dc24 100644 --- a/packages/nhsNotifyLambda/tests/testHelpers.ts +++ b/packages/nhsNotifyLambda/tests/testHelpers.ts @@ -1,25 +1,27 @@ -import {jest} from "@jest/globals" - -import * as sqs from "@aws-sdk/client-sqs" +import {vi} from "vitest" +import type {Message} from "@aws-sdk/client-sqs" import {PSUDataItem} from "@psu-common/commonTypes" import {NotifyDataItemMessage} from "../src/utils" +const {mockSend} = vi.hoisted(() => ({mockSend: vi.fn()})) + +vi.mock("@aws-sdk/client-sqs", async (importOriginal) => { + const sqs = await importOriginal() + return { + ...sqs, + SQSClient: vi.fn().mockImplementation(() => ({ + send: mockSend + })) + } +}) + // Similarly mock the SQS client export function mockSQSClient() { - const mockSend = jest.fn() - jest.unstable_mockModule("@aws-sdk/client-sqs", () => { - return { - ...sqs, - SQSClient: jest.fn().mockImplementation(() => ({ - send: mockSend - })) - } - }) return {mockSend} } -export function constructMessage(overrides: Partial = {}): sqs.Message { +export function constructMessage(overrides: Partial = {}): Message { return { MessageId: "messageId", Attributes: { diff --git a/packages/nhsNotifyLambda/tests/testNhsNotifyLambda.test.ts b/packages/nhsNotifyLambda/tests/testNhsNotifyLambda.test.ts index 5917e22507..4d66da705e 100644 --- a/packages/nhsNotifyLambda/tests/testNhsNotifyLambda.test.ts +++ b/packages/nhsNotifyLambda/tests/testNhsNotifyLambda.test.ts @@ -1,15 +1,39 @@ import { - jest, + vi, describe, it, beforeAll, + beforeEach, afterEach -} from "@jest/globals" +} from "vitest" import {constructPSUDataItem, constructPSUDataItemMessage} from "./testHelpers" -const mockGetParameter = jest.fn().mockImplementation(() => "parameter_value") -jest.unstable_mockModule( +const { + mockGetParameter, + mockAddPrescriptionMessagesToNotificationStateStore, + mockRemoveSQSMessages, + mockReportQueueStatus, + mockDrainQueue, + mockCheckCooldownForUpdate, + mockMakeBatchNotifyRequest, + mockInfo, + mockError, + mockWarn +} = vi.hoisted(() => ({ + mockGetParameter: vi.fn().mockImplementation(() => "parameter_value"), + mockAddPrescriptionMessagesToNotificationStateStore: vi.fn(), + mockRemoveSQSMessages: vi.fn(), + mockReportQueueStatus: vi.fn(), + mockDrainQueue: vi.fn(), + mockCheckCooldownForUpdate: vi.fn(), + mockMakeBatchNotifyRequest: vi.fn(), + mockInfo: vi.fn(), + mockError: vi.fn(), + mockWarn: vi.fn() +})) + +vi.mock( "@aws-lambda-powertools/parameters/ssm", async () => ({ __esModule: true, @@ -17,14 +41,7 @@ jest.unstable_mockModule( }) ) -const mockAddPrescriptionMessagesToNotificationStateStore = jest.fn() -const mockRemoveSQSMessages = jest.fn() -const mockReportQueueStatus = jest.fn() -const mockDrainQueue = jest.fn() -const mockCheckCooldownForUpdate = jest.fn() -const mockMakeBatchNotifyRequest = jest.fn() - -jest.unstable_mockModule( +vi.mock( "../src/utils", async () => ({ __esModule: true, @@ -37,14 +54,11 @@ jest.unstable_mockModule( }) ) -const mockInfo = jest.fn() -const mockError = jest.fn() -const mockWarn = jest.fn() -jest.unstable_mockModule( +vi.mock( "@aws-lambda-powertools/logger", async () => ({ __esModule: true, - Logger: jest.fn().mockImplementation(() => ({ + Logger: vi.fn().mockImplementation(() => ({ info: mockInfo, error: mockError, warn: mockWarn @@ -62,11 +76,15 @@ import {mockEventBridgeEvent} from "@psu-common/testing" const ORIGINAL_ENV = {...process.env} describe("Unit test for NHS Notify lambda handler", () => { + beforeEach(() => { + mockGetParameter.mockReset() + mockGetParameter.mockImplementation(() => "parameter_value") + }) + afterEach(() => { process.env = {...ORIGINAL_ENV} - jest.clearAllMocks() - jest.restoreAllMocks() + vi.clearAllMocks() }) it("When the getParameter call fails, the handler throws an error", async () => { @@ -293,7 +311,7 @@ describe("Unit test for NHS Notify lambda handler", () => { Promise.resolve({messages: [msg], isEmpty: false}) ) - const nowSpy = jest.spyOn(Date, "now") + const nowSpy = vi.spyOn(Date, "now") .mockImplementationOnce(() => 0) // start time .mockImplementationOnce(() => (14 * 60 * 1000) + 1) diff --git a/packages/nhsNotifyLambda/tests/testSecrets.test.ts b/packages/nhsNotifyLambda/tests/testSecrets.test.ts index f6aede7985..bed9ddb389 100644 --- a/packages/nhsNotifyLambda/tests/testSecrets.test.ts +++ b/packages/nhsNotifyLambda/tests/testSecrets.test.ts @@ -1,7 +1,10 @@ -import {jest} from "@jest/globals" +import {vi} from "vitest" -const mockGetSecret = jest.fn<() => Promise>() -jest.unstable_mockModule( +const {mockGetSecret} = vi.hoisted(() => ({ + mockGetSecret: vi.fn<() => Promise>() +})) + +vi.mock( "@aws-lambda-powertools/parameters/secrets", async () => ({ __esModule: true, @@ -16,7 +19,7 @@ describe("loadSecrets", () => { process.env.API_KEY_SECRET = "api-key-secret-name" process.env.PRIVATE_KEY_SECRET = "private-key-secret-name" process.env.KID_SECRET = "kid-secret-name" - jest.clearAllMocks() + vi.clearAllMocks() }) it("should load and trim secrets successfully", async () => { diff --git a/packages/nhsNotifyLambda/tests/testUtils.test.ts b/packages/nhsNotifyLambda/tests/testUtils.test.ts index b3c2c3355d..cb07ce5fc6 100644 --- a/packages/nhsNotifyLambda/tests/testUtils.test.ts +++ b/packages/nhsNotifyLambda/tests/testUtils.test.ts @@ -1,5 +1,5 @@ -import {jest} from "@jest/globals" -import {SpiedFunction} from "jest-mock" +import {vi} from "vitest" + import nock from "nock" import axiosRetry from "axios-retry" @@ -13,25 +13,36 @@ import {constructMessage, constructPSUDataItemMessage, mockSQSClient} from "./te const {mockSend: sqsMockSend} = mockSQSClient() const TEST_URL = "https://example.com" -const mockGetParametersByName = jest.fn(async () => Promise.resolve( - { - [process.env.NOTIFY_API_BASE_URL_PARAM!]: TEST_URL, - [process.env.MAKE_REAL_NOTIFY_REQUESTS_PARAM!]: "true" - } -)) - -jest.unstable_mockModule( +const { + mockGetParametersByName, + mockGetSecret, + mockTokenExchange, + mockNotifyRequestMaxItems, + mockNotifyRequestMaxBytes +} = vi.hoisted(() => ({ + mockGetParametersByName: vi.fn(async () => Promise.resolve( + { + [process.env.NOTIFY_API_BASE_URL_PARAM!]: "https://example.com", + [process.env.MAKE_REAL_NOTIFY_REQUESTS_PARAM!]: "true" + } + )), + mockGetSecret: vi.fn().mockImplementation(() => "secret_value"), + mockTokenExchange: vi.fn().mockImplementation(() => Promise.resolve("bearer token")), + mockNotifyRequestMaxItems: 5, + mockNotifyRequestMaxBytes: 5 * 1024 * 1024 +})) + +vi.mock( "@aws-lambda-powertools/parameters/ssm", async () => ({ __esModule: true, - SSMProvider: jest.fn().mockImplementation(() => ({ + SSMProvider: vi.fn().mockImplementation(() => ({ getParametersByName: mockGetParametersByName })) }) ) -const mockGetSecret = jest.fn().mockImplementation(() => "secret_value") -jest.unstable_mockModule( +vi.mock( "@aws-lambda-powertools/parameters/secrets", async () => ({ __esModule: true, @@ -39,8 +50,7 @@ jest.unstable_mockModule( }) ) -const mockTokenExchange = jest.fn().mockImplementation(() => Promise.resolve("bearer token")) -jest.unstable_mockModule( +vi.mock( "../src/utils/auth", async () => ({ __esModule: true, @@ -48,9 +58,7 @@ jest.unstable_mockModule( }) ) -let mockNotifyRequestMaxItems = 5 -let mockNotifyRequestMaxBytes = 5 * 1024 * 1024 // 5 MB -jest.unstable_mockModule( +vi.mock( "../src/utils/constants", async () => ({ __esModule: true, @@ -70,23 +78,25 @@ const { handleNotifyRequests } = await import("../src/utils") +type Spy = ReturnType + const ORIGINAL_ENV = {...process.env} describe("NHS notify lambda helper functions", () => { describe("drainQueue", () => { let logger: Logger - let errorSpy: SpiedFunction<(msg: string, ...meta: Array) => void> - let infoSpy: SpiedFunction<(msg: string, ...meta: Array) => void> + let errorSpy: Spy + let infoSpy: Spy beforeEach(() => { - jest.resetModules() - jest.clearAllMocks() + vi.resetModules() + vi.clearAllMocks() process.env = {...ORIGINAL_ENV} logger = new Logger({serviceName: "test-service"}) - errorSpy = jest.spyOn(logger, "error") - infoSpy = jest.spyOn(logger, "info") + errorSpy = vi.spyOn(logger, "error") + infoSpy = vi.spyOn(logger, "info") }) it("Does not throw an error when the SQS fetch succeeds", async () => { @@ -266,7 +276,7 @@ describe("NHS notify lambda helper functions", () => { } sqsMockSend.mockResolvedValueOnce(duplicateMessagesResponse as never) - const warnSpy = jest.spyOn(logger, "warn") + const warnSpy = vi.spyOn(logger, "warn") const result = await drainQueue(logger) expect(result.messages).toHaveLength(1) @@ -284,17 +294,17 @@ describe("NHS notify lambda helper functions", () => { describe("removeSQSMessages", () => { let logger: Logger - let errorSpy: SpiedFunction<(msg: string, ...meta: Array) => void> - let infoSpy: SpiedFunction<(msg: string, ...meta: Array) => void> + let errorSpy: Spy + let infoSpy: Spy beforeEach(() => { - jest.resetModules() - jest.clearAllMocks() + vi.resetModules() + vi.clearAllMocks() process.env = {...ORIGINAL_ENV} logger = new Logger({serviceName: "test-service"}) - errorSpy = jest.spyOn(logger, "error") - infoSpy = jest.spyOn(logger, "info") + errorSpy = vi.spyOn(logger, "error") + infoSpy = vi.spyOn(logger, "info") }) it("deletes messages in a single batch successfully", async () => { @@ -380,20 +390,20 @@ describe("NHS notify lambda helper functions", () => { describe("addPrescriptionMessagesToNotificationStateStore", () => { let logger: Logger - let infoSpy: SpiedFunction<(msg: string, ...meta: Array) => void> - let errorSpy: SpiedFunction<(msg: string, ...meta: Array) => void> - let sendSpy: ReturnType + let infoSpy: Spy + let errorSpy: Spy + let sendSpy = vi.spyOn(DynamoDBDocumentClient.prototype, "send") beforeEach(() => { - jest.resetModules() - jest.clearAllMocks() + vi.resetModules() + vi.clearAllMocks() process.env = {...ORIGINAL_ENV} logger = new Logger({serviceName: "test-service"}) - infoSpy = jest.spyOn(logger, "info") - errorSpy = jest.spyOn(logger, "error") - sendSpy = jest.spyOn(DynamoDBDocumentClient.prototype, "send") + infoSpy = vi.spyOn(logger, "info") + errorSpy = vi.spyOn(logger, "error") + sendSpy = vi.spyOn(DynamoDBDocumentClient.prototype, "send") }) it("throws and logs error if TABLE_NAME is not set", async () => { @@ -461,20 +471,20 @@ describe("NHS notify lambda helper functions", () => { describe("checkCooldownForUpdate", () => { let logger: Logger - let infoSpy: SpiedFunction<(msg: string, ...meta: Array) => void> - let errorSpy: SpiedFunction<(msg: string, ...meta: Array) => void> - let sendSpy: ReturnType + let infoSpy: Spy + let errorSpy: Spy + let sendSpy = vi.spyOn(DynamoDBDocumentClient.prototype, "send") beforeEach(async () => { - jest.resetModules() - jest.clearAllMocks() + vi.resetModules() + vi.clearAllMocks() process.env = {...ORIGINAL_ENV} logger = new Logger({serviceName: "test-service"}) - infoSpy = jest.spyOn(logger, "info") - errorSpy = jest.spyOn(logger, "error") - sendSpy = jest.spyOn(DynamoDBDocumentClient.prototype, "send") + infoSpy = vi.spyOn(logger, "info") + errorSpy = vi.spyOn(logger, "error") + sendSpy = vi.spyOn(DynamoDBDocumentClient.prototype, "send") }) afterAll(() => { @@ -586,25 +596,29 @@ describe("NHS notify lambda helper functions", () => { describe("handleNotifyRequests", () => { let logger: Logger - let errorSpy: SpiedFunction<(msg: string, ...meta: Array) => void> - let infoSpy: SpiedFunction<(msg: string, ...meta: Array) => void> + let errorSpy: Spy + let infoSpy: Spy beforeEach(() => { process.env = {...ORIGINAL_ENV} - jest.resetModules() - jest.clearAllMocks() + vi.resetModules() + vi.clearAllMocks() nock.cleanAll() logger = new Logger({serviceName: "test-service"}) - errorSpy = jest.spyOn(logger, "error") - infoSpy = jest.spyOn(logger, "info") + errorSpy = vi.spyOn(logger, "error") + infoSpy = vi.spyOn(logger, "info") }) afterEach(() => { process.env = {...ORIGINAL_ENV} - jest.runOnlyPendingTimers() - jest.useRealTimers() + try { + vi.runOnlyPendingTimers() + } catch { + // Ignore when fake timers were not enabled in a test. + } + vi.useRealTimers() }) it("sends a batch and maps successful messages correctly", async () => { @@ -704,9 +718,9 @@ describe("NHS notify lambda helper functions", () => { .post("/comms/v1/message-batches") .reply(500, "Internal Server Error") - jest.useFakeTimers() + vi.useFakeTimers() // force retryDelay to 0 so retries happen immediately in tests - jest.spyOn(axiosRetry, "exponentialDelay").mockImplementation(() => 0) + vi.spyOn(axiosRetry, "exponentialDelay").mockImplementation(() => 0) const resultPromise = handleNotifyRequests( logger, @@ -715,7 +729,7 @@ describe("NHS notify lambda helper functions", () => { ) // flush retries immediately - await jest.runAllTimersAsync() + await vi.runAllTimersAsync() const result = await resultPromise expect(result).toMatchObject([ @@ -830,7 +844,7 @@ describe("NHS notify lambda helper functions", () => { }) it("retries after 425/429 with Retry-After header", async () => { - jest.useFakeTimers({advanceTimers: true}) + vi.useFakeTimers() const data = [ constructPSUDataItemMessage({ @@ -876,9 +890,8 @@ describe("NHS notify lambda helper functions", () => { "plan-retry", data ) + await vi.runAllTimersAsync() const result = await resultPromise - jest.runAllTicks() - jest.useRealTimers() expect(result).toHaveLength(2) }) @@ -1077,17 +1090,17 @@ describe("NHS notify lambda helper functions", () => { describe("reportQueueStatus", () => { let logger: Logger - let infoSpy: SpiedFunction<(msg: string, ...meta: Array) => void> - let errorSpy: SpiedFunction<(msg: string, ...meta: Array) => void> + let infoSpy: Spy + let errorSpy: Spy beforeEach(() => { - jest.resetModules() - jest.clearAllMocks() + vi.resetModules() + vi.clearAllMocks() process.env = {...ORIGINAL_ENV} logger = new Logger({serviceName: "test-service"}) - infoSpy = jest.spyOn(logger, "info") - errorSpy = jest.spyOn(logger, "error") + infoSpy = vi.spyOn(logger, "info") + errorSpy = vi.spyOn(logger, "error") }) it("logs current queue attributes when SQS returns attributes", async () => { diff --git a/packages/nhsNotifyLambda/vitest.config.ts b/packages/nhsNotifyLambda/vitest.config.ts index 8e0a46ea72..03ed957a28 100644 --- a/packages/nhsNotifyLambda/vitest.config.ts +++ b/packages/nhsNotifyLambda/vitest.config.ts @@ -4,6 +4,7 @@ import defaultConfig from "../../vitest.default.config.ts" export default mergeConfig(defaultConfig, defineConfig({ root: "./", test: { + globals: true, setupFiles: ["./.jest/setEnvVars.js"] } })) From e20aa352ac6c114fb01ce1dd199b439ecb9071f8 Mon Sep 17 00:00:00 2001 From: tstephen-nhs <231503406+tstephen-nhs@users.noreply.github.com> Date: Tue, 31 Mar 2026 16:48:58 +0000 Subject: [PATCH 06/20] chore: migrated postDatedLambda tests passing --- packages/postDatedLambda/.vscode/launch.json | 65 ++++++++++--------- .../postDatedLambda/.vscode/settings.json | 6 +- packages/postDatedLambda/package.json | 2 +- .../tests/testBusinessLogic.test.ts | 20 +++--- .../tests/testDatabaseClient.test.ts | 35 +++++----- .../postDatedLambda/tests/testMain.test.ts | 23 ++++--- .../tests/testOrchestration.test.ts | 59 +++++++++++------ .../postDatedLambda/tests/testSqs.test.ts | 49 +++++++------- packages/postDatedLambda/vitest.config.ts | 2 + 9 files changed, 141 insertions(+), 120 deletions(-) diff --git a/packages/postDatedLambda/.vscode/launch.json b/packages/postDatedLambda/.vscode/launch.json index 7c9b0b4b3a..031eba02bb 100644 --- a/packages/postDatedLambda/.vscode/launch.json +++ b/packages/postDatedLambda/.vscode/launch.json @@ -1,35 +1,40 @@ { - // Use IntelliSense to learn about possible attributes. - // Hover to view descriptions of existing attributes. - // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 "version": "0.2.0", "configurations": [ - { - "type": "node", - "name": "vscode-jest-tests.v2", - "request": "launch", - "args": [ - "--runInBand", - "--watchAll=false", - "--testNamePattern", - "${jest.testNamePattern}", - "--runTestsByPath", - "${jest.testFile}", - "--config", - "${workspaceFolder}/jest.debug.config.ts" - ], - "cwd": "${workspaceFolder}", - "console": "integratedTerminal", - "internalConsoleOptions": "neverOpen", - "disableOptimisticBPs": true, - "program": "${workspaceFolder}/../../node_modules/.bin/jest", - "windows": { - "program": "${workspaceFolder}/node_modules/jest/bin/jest" - }, - "env": { - "POWERTOOLS_DEV": true, - "NODE_OPTIONS": "--experimental-vm-modules" - } - } + { + "name": "vitest: all tests", + "type": "node", + "request": "launch", + "cwd": "${workspaceFolder}", + "runtimeExecutable": "${workspaceFolder}/../../node_modules/vitest/vitest.mjs", + "args": [ + "run", + "--config", + "vitest.config.ts" + ], + "env": { + "POWERTOOLS_DEV": "true" + }, + "console": "integratedTerminal", + "internalConsoleOptions": "neverOpen" + }, + { + "name": "vitest: current file", + "type": "node", + "request": "launch", + "cwd": "${workspaceFolder}", + "runtimeExecutable": "${workspaceFolder}/../../node_modules/vitest/vitest.mjs", + "args": [ + "run", + "${relativeFile}", + "--config", + "vitest.config.ts" + ], + "env": { + "POWERTOOLS_DEV": "true" + }, + "console": "integratedTerminal", + "internalConsoleOptions": "neverOpen" + } ] } diff --git a/packages/postDatedLambda/.vscode/settings.json b/packages/postDatedLambda/.vscode/settings.json index 3501264944..915c268c04 100644 --- a/packages/postDatedLambda/.vscode/settings.json +++ b/packages/postDatedLambda/.vscode/settings.json @@ -1,7 +1,3 @@ { - "jest.jestCommandLine": "/workspaces/eps-prescription-status-update-api/node_modules/.bin/jest --no-cache", - "jest.nodeEnv": { - "POWERTOOLS_DEV": true, - "NODE_OPTIONS": "--experimental-vm-modules" - } + "testing.automaticallyOpenPeekView": "never" } diff --git a/packages/postDatedLambda/package.json b/packages/postDatedLambda/package.json index bce1fbc316..0afa4af25c 100644 --- a/packages/postDatedLambda/package.json +++ b/packages/postDatedLambda/package.json @@ -7,7 +7,7 @@ "license": "MIT", "type": "module", "scripts": { - "unit": "POWERTOOLS_DEV=true NODE_OPTIONS=--experimental-vm-modules jest --no-cache --coverage", + "unit": "POWERTOOLS_DEV=true NODE_OPTIONS=--max-old-space-size=8192 vitest run --config vitest.config.ts --coverage", "lint": "eslint --max-warnings 0 --fix --config ../../eslint.config.mjs .", "compile": "tsc", "test": "npm run compile && npm run unit", diff --git a/packages/postDatedLambda/tests/testBusinessLogic.test.ts b/packages/postDatedLambda/tests/testBusinessLogic.test.ts index 095a1593ef..dde0dd6733 100644 --- a/packages/postDatedLambda/tests/testBusinessLogic.test.ts +++ b/packages/postDatedLambda/tests/testBusinessLogic.test.ts @@ -3,8 +3,8 @@ import { describe, it, afterEach, - jest -} from "@jest/globals" + vi +} from "vitest" import {Logger} from "@aws-lambda-powertools/logger" @@ -21,7 +21,7 @@ async function loadBusinessLogic( envOverrides = {} ): Promise { // Makes sure that the environment is set before import each time - jest.resetModules() + vi.resetModules() process.env = {...ORIGINAL_ENV, ...envOverrides} return import("../src/businessLogic") } @@ -77,7 +77,7 @@ function createMessage( afterEach(() => { process.env = {...ORIGINAL_ENV} - jest.useRealTimers() + vi.useRealTimers() }) describe("businessLogic", () => { @@ -185,8 +185,8 @@ describe("businessLogic", () => { }) it("should classify a message as immature when LastModified is in the future", async () => { - jest.useFakeTimers() - jest.setSystemTime(new Date("2026-01-01T12:00:00.000Z")) + vi.useFakeTimers() + vi.setSystemTime(new Date("2026-01-01T12:00:00.000Z")) const {determineAction} = await loadBusinessLogic() const logger = new Logger({serviceName: "post-dated-tests"}) const message = createMessage({ @@ -203,8 +203,8 @@ describe("businessLogic", () => { }) it("should classify a message as matured when LastModified is in the past", async () => { - jest.useFakeTimers() - jest.setSystemTime(new Date("2026-01-03T12:00:00.000Z")) + vi.useFakeTimers() + vi.setSystemTime(new Date("2026-01-03T12:00:00.000Z")) const {determineAction} = await loadBusinessLogic() const logger = new Logger({serviceName: "post-dated-tests"}) const message = createMessage({ @@ -221,8 +221,8 @@ describe("businessLogic", () => { }) it("should use the provided most recent record when determining maturity", async () => { - jest.useFakeTimers() - jest.setSystemTime(new Date("2026-01-05T12:00:00.000Z")) + vi.useFakeTimers() + vi.setSystemTime(new Date("2026-01-05T12:00:00.000Z")) const {determineAction} = await loadBusinessLogic() const logger = new Logger({serviceName: "post-dated-tests"}) const message = createMessage({ diff --git a/packages/postDatedLambda/tests/testDatabaseClient.test.ts b/packages/postDatedLambda/tests/testDatabaseClient.test.ts index 5d2e938ea7..3c28eb486c 100644 --- a/packages/postDatedLambda/tests/testDatabaseClient.test.ts +++ b/packages/postDatedLambda/tests/testDatabaseClient.test.ts @@ -2,30 +2,27 @@ import { expect, describe, it, - jest -} from "@jest/globals" - -import * as dynamo from "@aws-sdk/client-dynamodb" + vi, + beforeEach +} from "vitest" import {Logger} from "@aws-lambda-powertools/logger" import {createMockPostModifiedDataItem} from "./testUtils" -// Uses unstable jest method to enable mocking while using ESM. To be replaced in future. -export function mockDynamoDBClient() { - const mockSend = jest.fn() - jest.unstable_mockModule("@aws-sdk/client-dynamodb", () => { - return { - ...dynamo, - DynamoDBClient: jest.fn().mockImplementation(() => ({ - send: mockSend - })) - } - }) - return {mockSend} -} - -const {mockSend} = mockDynamoDBClient() +const {mockSend} = vi.hoisted(() => ({ + mockSend: vi.fn() +})) + +vi.mock("@aws-sdk/client-dynamodb", async () => { + const dynamo = await vi.importActual("@aws-sdk/client-dynamodb") + return { + ...dynamo, + DynamoDBClient: vi.fn().mockImplementation(() => ({ + send: mockSend + })) + } +}) const { getRecentDataItemByPrescriptionID, enrichMessagesWithMostRecentDataItem diff --git a/packages/postDatedLambda/tests/testMain.test.ts b/packages/postDatedLambda/tests/testMain.test.ts index 6df8c8d468..e76907aeef 100644 --- a/packages/postDatedLambda/tests/testMain.test.ts +++ b/packages/postDatedLambda/tests/testMain.test.ts @@ -1,13 +1,21 @@ import { - jest, + vi, + expect, describe, it, beforeAll, afterEach -} from "@jest/globals" +} from "vitest" -const mockReportQueueStatus = jest.fn() -jest.unstable_mockModule( +const { + mockReportQueueStatus, + mockProcessPostDatedQueue +} = vi.hoisted(() => ({ + mockReportQueueStatus: vi.fn(), + mockProcessPostDatedQueue: vi.fn() +})) + +vi.mock( "../src/sqs", async () => ({ __esModule: true, @@ -15,8 +23,7 @@ jest.unstable_mockModule( }) ) -const mockProcessPostDatedQueue = jest.fn() -jest.unstable_mockModule( +vi.mock( "../src/orchestration", async () => ({ __esModule: true, @@ -37,8 +44,8 @@ describe("Unit test for post-dated lambda handler", () => { afterEach(() => { process.env = {...ORIGINAL_ENV} - jest.clearAllMocks() - jest.restoreAllMocks() + vi.clearAllMocks() + vi.restoreAllMocks() }) it("should run the lambda handler successfully", async () => { diff --git a/packages/postDatedLambda/tests/testOrchestration.test.ts b/packages/postDatedLambda/tests/testOrchestration.test.ts index 0dbed78a38..8e0c2866e9 100644 --- a/packages/postDatedLambda/tests/testOrchestration.test.ts +++ b/packages/postDatedLambda/tests/testOrchestration.test.ts @@ -2,32 +2,46 @@ import { expect, describe, it, - jest -} from "@jest/globals" + vi, + beforeEach, + afterEach +} from "vitest" // Mock the imports from local modules -const mockDetermineAction = jest.fn() -const mockComputeTimeUntilMaturity = jest.fn().mockReturnValue(300) -jest.unstable_mockModule("../src/businessLogic", () => { +const { + mockDetermineAction, + mockComputeTimeUntilMaturity, + mockEnrichMessagesWithMostRecentDataItem, + mockReceivePostDatedSQSMessages, + mockReportQueueStatus, + mockForwardSQSMessageToNotificationQueue, + mockRemoveSQSMessage, + mockReturnMessageToQueue +} = vi.hoisted(() => ({ + mockDetermineAction: vi.fn(), + mockComputeTimeUntilMaturity: vi.fn().mockReturnValue(300), + mockEnrichMessagesWithMostRecentDataItem: vi.fn(), + mockReceivePostDatedSQSMessages: vi.fn(), + mockReportQueueStatus: vi.fn(), + mockForwardSQSMessageToNotificationQueue: vi.fn(), + mockRemoveSQSMessage: vi.fn(), + mockReturnMessageToQueue: vi.fn() +})) + +vi.mock("../src/businessLogic", () => { return { determineAction: mockDetermineAction, computeTimeUntilMaturity: mockComputeTimeUntilMaturity } }) -const mockEnrichMessagesWithMostRecentDataItem = jest.fn() -jest.unstable_mockModule("../src/databaseClient", () => { +vi.mock("../src/databaseClient", () => { return { enrichMessagesWithMostRecentDataItem: mockEnrichMessagesWithMostRecentDataItem } }) -const mockReceivePostDatedSQSMessages = jest.fn() -const mockReportQueueStatus = jest.fn() -const mockForwardSQSMessageToNotificationQueue = jest.fn() -const mockRemoveSQSMessage = jest.fn() -const mockReturnMessageToQueue = jest.fn() -jest.unstable_mockModule("../src/sqs", () => { +vi.mock("../src/sqs", () => { return { receivePostDatedSQSMessages: mockReceivePostDatedSQSMessages, reportQueueStatus: mockReportQueueStatus, @@ -66,7 +80,7 @@ function enrich(messages: Array): Array { describe("processMessages", () => { beforeEach(() => { - jest.clearAllMocks() + vi.clearAllMocks() mockForwardSQSMessageToNotificationQueue.mockReturnValue(Promise.resolve("forwarded-id")) mockRemoveSQSMessage.mockReturnValue(Promise.resolve()) mockReturnMessageToQueue.mockReturnValue(Promise.resolve()) @@ -125,12 +139,17 @@ describe("orchestration", () => { describe("processPostDatedQueue", () => { beforeEach(() => { - jest.clearAllMocks() + vi.clearAllMocks() mockForwardSQSMessageToNotificationQueue.mockReturnValue(Promise.resolve("forwarded-id")) mockRemoveSQSMessage.mockReturnValue(Promise.resolve()) mockReturnMessageToQueue.mockReturnValue(Promise.resolve()) }) + afterEach(() => { + vi.useRealTimers() + vi.restoreAllMocks() + }) + it("should process the SQS queue correctly", async () => { const mockMessages: Array = [ {MessageId: "1", Body: "Message 1", prescriptionData: createMockPostModifiedDataItem({})}, @@ -157,7 +176,6 @@ describe("orchestration", () => { }) it("Should stop processing if the max runtime is exceeded", async () => { - jest.useFakeTimers() const mockMessages: Array = [ {MessageId: "1", Body: "Message 1", prescriptionData: createMockPostModifiedDataItem({})}, {MessageId: "2", Body: "Message 2", prescriptionData: createMockPostModifiedDataItem({})}, @@ -171,14 +189,13 @@ describe("orchestration", () => { mockEnrichMessagesWithMostRecentDataItem.mockReturnValue(enrich(mockMessages)) const {MAX_QUEUE_RUNTIME} = await import("../src/orchestration") mockDetermineAction.mockReturnValue(PostDatedProcessingResult.FORWARD_TO_NOTIFICATIONS) + vi.spyOn(Date, "now") + .mockReturnValueOnce(0) + .mockReturnValueOnce(MAX_QUEUE_RUNTIME + 1000) - const promise = processPostDatedQueue(logger) - // Overrun by a second - jest.advanceTimersByTime(MAX_QUEUE_RUNTIME + 1000) - await promise + await processPostDatedQueue(logger) expect(mockReportQueueStatus).toHaveBeenCalled() - jest.useRealTimers() }) it("should continue processing batches until message count drops below threshold", async () => { diff --git a/packages/postDatedLambda/tests/testSqs.test.ts b/packages/postDatedLambda/tests/testSqs.test.ts index 94cdd74a6d..98b2d66c34 100644 --- a/packages/postDatedLambda/tests/testSqs.test.ts +++ b/packages/postDatedLambda/tests/testSqs.test.ts @@ -2,30 +2,29 @@ import { describe, it, expect, - jest -} from "@jest/globals" -import {SpiedFunction} from "jest-mock" + vi, + beforeEach +} from "vitest" import {Logger} from "@aws-lambda-powertools/logger" -import {LogItemMessage, LogItemExtraInput} from "@aws-lambda-powertools/logger/lib/cjs/types/Logger" -import * as sqs from "@aws-sdk/client-sqs" import {PostDatedSQSMessage} from "../src/types" import {createMockPostModifiedDataItem} from "./testUtils" -export function mockSQSClient() { - const mockSend = jest.fn() - jest.unstable_mockModule("@aws-sdk/client-sqs", () => { - return { - ...sqs, - SQSClient: jest.fn().mockImplementation(() => ({ - send: mockSend - })) - } - }) - return {mockSend} -} +type Spy = ReturnType + +const {mockSend} = vi.hoisted(() => ({ + mockSend: vi.fn() +})) -const {mockSend} = mockSQSClient() +vi.mock("@aws-sdk/client-sqs", async () => { + const sqs = await vi.importActual("@aws-sdk/client-sqs") + return { + ...sqs, + SQSClient: vi.fn().mockImplementation(() => ({ + send: mockSend + })) + } +}) const { getPostDatedQueueUrl, @@ -40,13 +39,12 @@ const ORIGINAL_ENV = {...process.env} describe("sqs", () => { let logger: Logger - let infoSpy: SpiedFunction<(input: LogItemMessage, ...extraInput: LogItemExtraInput) => void> - let errorSpy: SpiedFunction<(input: LogItemMessage, ...extraInput: LogItemExtraInput) => void> - // let warnSpy: SpiedFunction<(input: LogItemMessage, ...extraInput: LogItemExtraInput) => void> + let infoSpy: Spy + let errorSpy: Spy beforeEach(() => { - jest.resetModules() - jest.clearAllMocks() + vi.resetModules() + vi.clearAllMocks() // Reset environment process.env = {...ORIGINAL_ENV} @@ -54,9 +52,8 @@ describe("sqs", () => { // Fresh logger and spies logger = new Logger({serviceName: "test-service"}) - infoSpy = jest.spyOn(logger, "info") - errorSpy = jest.spyOn(logger, "error") - // warnSpy = jest.spyOn(logger, "warn") + infoSpy = vi.spyOn(logger, "info") + errorSpy = vi.spyOn(logger, "error") }) describe("getPostDatedQueueUrl", () => { diff --git a/packages/postDatedLambda/vitest.config.ts b/packages/postDatedLambda/vitest.config.ts index 8e0a46ea72..ed2af24a8b 100644 --- a/packages/postDatedLambda/vitest.config.ts +++ b/packages/postDatedLambda/vitest.config.ts @@ -4,6 +4,8 @@ import defaultConfig from "../../vitest.default.config.ts" export default mergeConfig(defaultConfig, defineConfig({ root: "./", test: { + minWorkers: 1, + maxWorkers: 1, setupFiles: ["./.jest/setEnvVars.js"] } })) From 31641d9cf799a61a976d5dd07da7a9f0fc916791 Mon Sep 17 00:00:00 2001 From: tstephen-nhs <231503406+tstephen-nhs@users.noreply.github.com> Date: Tue, 31 Mar 2026 17:01:34 +0000 Subject: [PATCH 07/20] chore: npm audit fix --- package-lock.json | 90 +++++++++++++++++++++++++++++++---------------- 1 file changed, 60 insertions(+), 30 deletions(-) diff --git a/package-lock.json b/package-lock.json index cace8ba3d0..de3ddf56e8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2031,9 +2031,9 @@ } }, "node_modules/@eslint/config-array/node_modules/brace-expansion": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz", - "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", + "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3273,9 +3273,9 @@ } }, "node_modules/@redocly/cli/node_modules/brace-expansion": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz", - "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", + "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4994,9 +4994,9 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/brace-expansion": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz", - "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", + "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5189,9 +5189,9 @@ } }, "node_modules/@typescript-eslint/parser/node_modules/brace-expansion": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz", - "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", + "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5464,9 +5464,9 @@ } }, "node_modules/@typescript-eslint/type-utils/node_modules/brace-expansion": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz", - "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", + "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", "dev": true, "license": "MIT", "dependencies": { @@ -5558,9 +5558,9 @@ } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz", - "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", + "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", "dev": true, "license": "MIT", "dependencies": { @@ -6415,7 +6415,10 @@ } }, "node_modules/aws-sdk": { - "version": "2.1692.0", + "version": "2.1693.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.1693.0.tgz", + "integrity": "sha512-cJmb8xEnVLT+R6fBS5sn/EFJiX7tUnDaPtOPZ1vFbOJtd0fnZn/Ky2XGgsvvoeliWeH7mL3TWSX5zXXGSQV6gQ==", + "deprecated": "The AWS SDK for JavaScript (v2) has reached end-of-support, and no longer receives updates. Please migrate your code to use AWS SDK for JavaScript (v3). More info https://a.co/cUPnyil", "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { @@ -6629,7 +6632,9 @@ "license": "MIT" }, "node_modules/brace-expansion": { - "version": "2.0.2", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.3.tgz", + "integrity": "sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA==", "dev": true, "license": "MIT", "dependencies": { @@ -7082,6 +7087,19 @@ "node": ">= 0.6" } }, + "node_modules/core-js": { + "version": "3.49.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.49.0.tgz", + "integrity": "sha512-es1U2+YTtzpwkxVLwAFdSpaIMyQaq0PBgm3YD1W3Qpsn1NAmO3KSgZfu+oGSWVu6NvLHoHCV/aYcsE5wiB7ALg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "peer": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, "node_modules/cpsuLambda": { "resolved": "packages/cpsuLambda", "link": true @@ -7224,7 +7242,9 @@ } }, "node_modules/diff": { - "version": "4.0.2", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.4.tgz", + "integrity": "sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ==", "dev": true, "license": "BSD-3-Clause", "engines": { @@ -7236,7 +7256,9 @@ "license": "MIT" }, "node_modules/dompurify": { - "version": "3.2.7", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.3.3.tgz", + "integrity": "sha512-Oj6pzI2+RqBfFG+qOaOLbFXLQ90ARpcGG6UePL82bJLtdsa6CYJD7nmiU8MW9nQNOtCHV3lZ/Bzq1X0QYbBZCA==", "dev": true, "license": "(MPL-2.0 OR Apache-2.0)", "optionalDependencies": { @@ -7585,16 +7607,16 @@ } }, "node_modules/eslint/node_modules/brace-expansion": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.2.tgz", - "integrity": "sha512-Pdk8c9poy+YhOgVWw1JNN22/HcivgKWwpxKq04M/jTmHyCZn12WPJebZxdjSa5TmBqISrUSgNYU3eRORljfCCw==", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", + "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", "dev": true, "license": "MIT", "dependencies": { "balanced-match": "^4.0.2" }, "engines": { - "node": "20 || >=22" + "node": "18 || 20 || >=22" } }, "node_modules/eslint/node_modules/eslint-visitor-keys": { @@ -8227,7 +8249,9 @@ "link": true }, "node_modules/handlebars": { - "version": "4.7.8", + "version": "4.7.9", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.9.tgz", + "integrity": "sha512-4E71E0rpOaQuJR2A3xDZ+GM1HyWYv1clR58tC8emQNeQe3RH7MAzSbat+V0wG78LQBo6m6bzSG/L4pBuCsgnUQ==", "dev": true, "license": "MIT", "dependencies": { @@ -10226,7 +10250,9 @@ "license": "ISC" }, "node_modules/path-to-regexp": { - "version": "8.3.0", + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.4.1.tgz", + "integrity": "sha512-fvU78fIjZ+SBM9YwCknCvKOUKkLVqtWDVctl0s7xIqfmfb38t2TT4ZU2gHm+Z8xGwgW+QWEU3oQSAzIbo89Ggw==", "dev": true, "license": "MIT", "funding": { @@ -11083,7 +11109,9 @@ } }, "node_modules/sinon/node_modules/diff": { - "version": "5.2.0", + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.2.tgz", + "integrity": "sha512-vtcDfH3TOjP8UekytvnHH1o1P4FcUdt4eQ1Y+Abap1tk/OB2MWQvcwS2ClCd1zuIhc3JKOx6p3kod8Vfys3E+A==", "dev": true, "license": "BSD-3-Clause", "engines": { @@ -11533,7 +11561,9 @@ } }, "node_modules/test-exclude/node_modules/brace-expansion": { - "version": "1.1.12", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.13.tgz", + "integrity": "sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w==", "dev": true, "license": "MIT", "dependencies": { From dec021fb3b5b938f473443802fb42307bd2219e1 Mon Sep 17 00:00:00 2001 From: tstephen-nhs <231503406+tstephen-nhs@users.noreply.github.com> Date: Wed, 8 Apr 2026 13:20:57 +0000 Subject: [PATCH 08/20] chore: lintts --- .../nhsNotifyUpdateCallback/tests/testHelpers.test.ts | 5 +++-- .../tests/compareTable.test.ts | 9 ++++++++- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/packages/nhsNotifyUpdateCallback/tests/testHelpers.test.ts b/packages/nhsNotifyUpdateCallback/tests/testHelpers.test.ts index ccb7581e85..08b54e5b6e 100644 --- a/packages/nhsNotifyUpdateCallback/tests/testHelpers.test.ts +++ b/packages/nhsNotifyUpdateCallback/tests/testHelpers.test.ts @@ -4,7 +4,8 @@ import { it, beforeEach, afterEach, - expect + expect, + type MockInstance } from "vitest" import {createHmac} from "crypto" @@ -39,7 +40,7 @@ const ORIGINAL_ENV = {...process.env} describe("helpers.ts", () => { // Keep this broad to avoid over-constraining overloaded AWS SDK client signatures in tests. - let sendSpy: any + let sendSpy: MockInstance beforeEach(() => { vi.resetModules() diff --git a/packages/psuRestoreValidationLambda/tests/compareTable.test.ts b/packages/psuRestoreValidationLambda/tests/compareTable.test.ts index e725b6821a..7ab8a94f63 100644 --- a/packages/psuRestoreValidationLambda/tests/compareTable.test.ts +++ b/packages/psuRestoreValidationLambda/tests/compareTable.test.ts @@ -1,5 +1,12 @@ import {DynamoDBDocumentClient} from "@aws-sdk/lib-dynamodb" -import {beforeEach, describe, expect, it, vi, type Mocked} from "vitest" +import { + beforeEach, + describe, + expect, + it, + vi, + type Mocked +} from "vitest" import {Logger} from "@aws-lambda-powertools/logger" const mockSend = vi.fn() From 0d261f51facce27588c91d42212fa93e792d9313 Mon Sep 17 00:00:00 2001 From: tstephen-nhs <231503406+tstephen-nhs@users.noreply.github.com> Date: Thu, 9 Apr 2026 11:24:43 +0000 Subject: [PATCH 09/20] chore: npm audit fix --- package-lock.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/package-lock.json b/package-lock.json index 625c63a507..cc54cd7daf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10739,7 +10739,9 @@ } }, "node_modules/vite": { - "version": "7.3.1", + "version": "7.3.2", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.2.tgz", + "integrity": "sha512-Bby3NOsna2jsjfLVOHKes8sGwgl4TT0E6vvpYgnAYDIF/tie7MRaFthmKuHx1NSXjiTueXH3do80FMQgvEktRg==", "dev": true, "license": "MIT", "dependencies": { From 0ca7d8f05dad59e11d5bd0aa24992a03c5bb7e5b Mon Sep 17 00:00:00 2001 From: tstephen-nhs <231503406+tstephen-nhs@users.noreply.github.com> Date: Thu, 9 Apr 2026 11:37:34 +0000 Subject: [PATCH 10/20] chore: exclude test helpers from coverage --- vitest.default.config.ts | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/vitest.default.config.ts b/vitest.default.config.ts index b8e04f1cff..13878a6f2d 100644 --- a/vitest.default.config.ts +++ b/vitest.default.config.ts @@ -10,7 +10,16 @@ const vitestConfig = defineConfig({ coverage: { provider: "v8", reportsDirectory: "coverage", - reporter: ["text", "lcov"] + reporter: ["text", "lcov"], + exclude: [ + "**/node_modules/**", + "**/lib/**", + "**/coverage/**", + "**/tests/**", + "**/*.config.ts", + "**/*.d.ts", + "**/vitest.default.config.ts" + ] } } }) From b9d43f41c5b0f6b3f5950da22a9418ee4ff53c03 Mon Sep 17 00:00:00 2001 From: tstephen-nhs <231503406+tstephen-nhs@users.noreply.github.com> Date: Thu, 9 Apr 2026 12:51:06 +0000 Subject: [PATCH 11/20] chore: sonarqube exclusions --- sonar-project.properties | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/sonar-project.properties b/sonar-project.properties index 815621e84a..0eb5a3fa1e 100644 --- a/sonar-project.properties +++ b/sonar-project.properties @@ -5,7 +5,9 @@ sonar.host.url=https://sonarcloud.io sonar.coverage.exclusions=\ **/*.test.*, \ **/mock*, \ - **/jest.*.ts, \ + **/testHelpers.ts, \ + **/testUtils.ts, \ + **/vitest.*.ts, \ **/cli/*, \ scripts/*, \ release.config.js, \ @@ -14,7 +16,9 @@ sonar.coverage.exclusions=\ sonar.cpd.exclusions=\ **/*.test.*, \ **/mock*, \ - **/jest.*.ts, \ + **/testHelpers.ts, \ + **/testUtils.ts, \ + **/vitest.*.ts, \ **/cli/*, \ scripts/*, \ release.config.js, \ From 0621a4e5683dd9cec858d19117f308e5fd809ccf Mon Sep 17 00:00:00 2001 From: tstephen-nhs <231503406+tstephen-nhs@users.noreply.github.com> Date: Thu, 9 Apr 2026 15:34:12 +0000 Subject: [PATCH 12/20] fix: jest env vars --- .../{.jest/setEnvVars.js => .vitest/setup-env.js} | 0 packages/checkPrescriptionStatusUpdates/vitest.config.ts | 2 +- .../{.jest/setEnvVars.js => .vitest/setup-env.js} | 0 packages/nhsNotifyLambda/vitest.config.ts | 2 +- .../{.jest/setEnvVars.js => .vitest/setup-env.js} | 0 packages/nhsNotifyUpdateCallback/vitest.config.ts | 2 +- .../{.jest/setEnvVars.js => .vitest/setup-env.js} | 0 packages/postDatedLambda/vitest.config.ts | 2 +- .../{.jest/setEnvVars.js => .vitest/setup-env.js} | 0 packages/updatePrescriptionStatus/vitest.config.ts | 2 +- 10 files changed, 5 insertions(+), 5 deletions(-) rename packages/checkPrescriptionStatusUpdates/{.jest/setEnvVars.js => .vitest/setup-env.js} (100%) rename packages/nhsNotifyLambda/{.jest/setEnvVars.js => .vitest/setup-env.js} (100%) rename packages/nhsNotifyUpdateCallback/{.jest/setEnvVars.js => .vitest/setup-env.js} (100%) rename packages/postDatedLambda/{.jest/setEnvVars.js => .vitest/setup-env.js} (100%) rename packages/updatePrescriptionStatus/{.jest/setEnvVars.js => .vitest/setup-env.js} (100%) diff --git a/packages/checkPrescriptionStatusUpdates/.jest/setEnvVars.js b/packages/checkPrescriptionStatusUpdates/.vitest/setup-env.js similarity index 100% rename from packages/checkPrescriptionStatusUpdates/.jest/setEnvVars.js rename to packages/checkPrescriptionStatusUpdates/.vitest/setup-env.js diff --git a/packages/checkPrescriptionStatusUpdates/vitest.config.ts b/packages/checkPrescriptionStatusUpdates/vitest.config.ts index 8e0a46ea72..e292a3df93 100644 --- a/packages/checkPrescriptionStatusUpdates/vitest.config.ts +++ b/packages/checkPrescriptionStatusUpdates/vitest.config.ts @@ -4,6 +4,6 @@ import defaultConfig from "../../vitest.default.config.ts" export default mergeConfig(defaultConfig, defineConfig({ root: "./", test: { - setupFiles: ["./.jest/setEnvVars.js"] + setupFiles: ["./.vitest/setup-env.js"] } })) diff --git a/packages/nhsNotifyLambda/.jest/setEnvVars.js b/packages/nhsNotifyLambda/.vitest/setup-env.js similarity index 100% rename from packages/nhsNotifyLambda/.jest/setEnvVars.js rename to packages/nhsNotifyLambda/.vitest/setup-env.js diff --git a/packages/nhsNotifyLambda/vitest.config.ts b/packages/nhsNotifyLambda/vitest.config.ts index 03ed957a28..3a514b3a8d 100644 --- a/packages/nhsNotifyLambda/vitest.config.ts +++ b/packages/nhsNotifyLambda/vitest.config.ts @@ -5,6 +5,6 @@ export default mergeConfig(defaultConfig, defineConfig({ root: "./", test: { globals: true, - setupFiles: ["./.jest/setEnvVars.js"] + setupFiles: ["./.vitest/setup-env.js"] } })) diff --git a/packages/nhsNotifyUpdateCallback/.jest/setEnvVars.js b/packages/nhsNotifyUpdateCallback/.vitest/setup-env.js similarity index 100% rename from packages/nhsNotifyUpdateCallback/.jest/setEnvVars.js rename to packages/nhsNotifyUpdateCallback/.vitest/setup-env.js diff --git a/packages/nhsNotifyUpdateCallback/vitest.config.ts b/packages/nhsNotifyUpdateCallback/vitest.config.ts index 8e0a46ea72..e292a3df93 100644 --- a/packages/nhsNotifyUpdateCallback/vitest.config.ts +++ b/packages/nhsNotifyUpdateCallback/vitest.config.ts @@ -4,6 +4,6 @@ import defaultConfig from "../../vitest.default.config.ts" export default mergeConfig(defaultConfig, defineConfig({ root: "./", test: { - setupFiles: ["./.jest/setEnvVars.js"] + setupFiles: ["./.vitest/setup-env.js"] } })) diff --git a/packages/postDatedLambda/.jest/setEnvVars.js b/packages/postDatedLambda/.vitest/setup-env.js similarity index 100% rename from packages/postDatedLambda/.jest/setEnvVars.js rename to packages/postDatedLambda/.vitest/setup-env.js diff --git a/packages/postDatedLambda/vitest.config.ts b/packages/postDatedLambda/vitest.config.ts index ed2af24a8b..6040afc5da 100644 --- a/packages/postDatedLambda/vitest.config.ts +++ b/packages/postDatedLambda/vitest.config.ts @@ -6,6 +6,6 @@ export default mergeConfig(defaultConfig, defineConfig({ test: { minWorkers: 1, maxWorkers: 1, - setupFiles: ["./.jest/setEnvVars.js"] + setupFiles: ["./.vitest/setup-env.js"] } })) diff --git a/packages/updatePrescriptionStatus/.jest/setEnvVars.js b/packages/updatePrescriptionStatus/.vitest/setup-env.js similarity index 100% rename from packages/updatePrescriptionStatus/.jest/setEnvVars.js rename to packages/updatePrescriptionStatus/.vitest/setup-env.js diff --git a/packages/updatePrescriptionStatus/vitest.config.ts b/packages/updatePrescriptionStatus/vitest.config.ts index 8e0a46ea72..e292a3df93 100644 --- a/packages/updatePrescriptionStatus/vitest.config.ts +++ b/packages/updatePrescriptionStatus/vitest.config.ts @@ -4,6 +4,6 @@ import defaultConfig from "../../vitest.default.config.ts" export default mergeConfig(defaultConfig, defineConfig({ root: "./", test: { - setupFiles: ["./.jest/setEnvVars.js"] + setupFiles: ["./.vitest/setup-env.js"] } })) From eab2479b0b947e09eeb2ff3ea2db7e638219cdb5 Mon Sep 17 00:00:00 2001 From: tstephen-nhs <231503406+tstephen-nhs@users.noreply.github.com> Date: Thu, 9 Apr 2026 15:40:12 +0000 Subject: [PATCH 13/20] fix: more jest references --- .devcontainer/devcontainer.json | 2 +- ...scription-status-update-api.code-workspace | 13 ++------ eslint.config.mjs | 1 - package.json | 4 --- .../capabilityStatement/jest.debug.config.ts | 9 ------ .../jest.debug.config.ts | 9 ------ .../middyErrorHandler/jest.debug.config.ts | 9 ------ .../common/utilities/jest.debug.config.ts | 9 ------ packages/cpsuLambda/jest.debug.config.ts | 9 ------ packages/gsul/jest.debug.config.ts | 9 ------ packages/nhsNotifyLambda/jest.debug.config.ts | 9 ------ .../jest.debug.config.ts | 9 ------ .../nhsd-psu-sandbox/jest.debug.config.ts | 9 ------ packages/postDatedLambda/jest.debug.config.ts | 9 ------ .../jest.debug.config.ts | 9 ------ packages/specification/.vscode/launch.json | 31 ------------------- packages/specification/.vscode/settings.json | 8 ++--- packages/specification/jest.debug.config.ts | 9 ------ packages/statusLambda/jest.debug.config.ts | 9 ------ .../jest.debug.config.ts | 9 ------ .../src/updatePrescriptionStatus.ts | 3 +- 21 files changed, 7 insertions(+), 181 deletions(-) delete mode 100644 packages/capabilityStatement/jest.debug.config.ts delete mode 100644 packages/checkPrescriptionStatusUpdates/jest.debug.config.ts delete mode 100644 packages/common/middyErrorHandler/jest.debug.config.ts delete mode 100644 packages/common/utilities/jest.debug.config.ts delete mode 100644 packages/cpsuLambda/jest.debug.config.ts delete mode 100644 packages/gsul/jest.debug.config.ts delete mode 100644 packages/nhsNotifyLambda/jest.debug.config.ts delete mode 100644 packages/nhsNotifyUpdateCallback/jest.debug.config.ts delete mode 100644 packages/nhsd-psu-sandbox/jest.debug.config.ts delete mode 100644 packages/postDatedLambda/jest.debug.config.ts delete mode 100644 packages/psuRestoreValidationLambda/jest.debug.config.ts delete mode 100644 packages/specification/.vscode/launch.json delete mode 100644 packages/specification/jest.debug.config.ts delete mode 100644 packages/statusLambda/jest.debug.config.ts delete mode 100644 packages/updatePrescriptionStatus/jest.debug.config.ts diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 1756dc9a89..f6fd2e7e9f 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -27,7 +27,7 @@ "ms-python.flake8", "eamodio.gitlens", "github.vscode-pull-request-github", - "orta.vscode-jest", + "vitest-explorer", "42crunch.vscode-openapi", "mermade.openapi-lint", "christian-kohler.npm-intellisense", diff --git a/.vscode/eps-prescription-status-update-api.code-workspace b/.vscode/eps-prescription-status-update-api.code-workspace index 06664a3e91..f0c1c29f9e 100644 --- a/.vscode/eps-prescription-status-update-api.code-workspace +++ b/.vscode/eps-prescription-status-update-api.code-workspace @@ -70,11 +70,6 @@ } ], "settings": { - "jest.disabledWorkspaceFolders": [ - "eps-prescription-status-update-monorepo", - "packages/common/testing", - "packages/specification" - ], "files.exclude": { "packages/": true }, @@ -158,11 +153,7 @@ ], "cSpell.dictionaries": ["en-GB"], "cSpell.ignorePaths": ["package-lock.json", "node_modules", ".vscode"], - "jest.jestCommandLine": "NODE_OPTIONS=--experimental-vm-modules node_modules/.bin/jest --no-cache", - "jest.nodeEnv": { - "POWERTOOLS_DEV": true - }, - "typescript.tsdk": "eps-prescription-status-update-monorepo/node_modules/typescript/lib", + "js/ts.tsdk.path": "eps-prescription-status-update-monorepo/node_modules/typescript/lib", "eslint.useFlatConfig": true, "eslint.format.enable": true }, @@ -174,7 +165,7 @@ "ms-python.flake8", "eamodio.gitlens", "github.vscode-pull-request-github", - "orta.vscode-jest", + "vitest-explorer", "42crunch.vscode-openapi", "mermade.openapi-lint", "redhat.vscode-yaml", diff --git a/eslint.config.mjs b/eslint.config.mjs index d38407fa9e..ce941ced8e 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -118,7 +118,6 @@ export default [ languageOptions: { parser: tsParser, globals: { - ...globals.jest, ...globals.node, }, }, diff --git a/package.json b/package.json index 71e3f5eb25..f666d31f7f 100644 --- a/package.json +++ b/package.json @@ -34,7 +34,6 @@ "devDependencies": { "@eslint/js": "^10.0.1", "@types/aws-lambda": "^8.10.161", - "@types/jest": "^30.0.0", "@types/node": "^25.5.0", "@vitest/coverage-v8": "^3.2.4", "@typescript-eslint/eslint-plugin": "^8.57.2", @@ -45,9 +44,6 @@ "eslint-plugin-import-newlines": "^2.0.0", "eslint-plugin-prettier": "^5.5.5", "globals": "^17.4.0", - "jest": "^30.3.0", - "jest-junit": "^16.0.0", - "ts-jest": "^29.4.6", "ts-node": "^10.9.2", "vite-tsconfig-paths": "^5.1.4", "vitest": "^3.2.4", diff --git a/packages/capabilityStatement/jest.debug.config.ts b/packages/capabilityStatement/jest.debug.config.ts deleted file mode 100644 index 96d10f6b73..0000000000 --- a/packages/capabilityStatement/jest.debug.config.ts +++ /dev/null @@ -1,9 +0,0 @@ -import config from "./jest.config" -import type {JestConfigWithTsJest} from "ts-jest" - -const debugConfig: JestConfigWithTsJest = { - ...config, - preset: "ts-jest" -} - -export default debugConfig diff --git a/packages/checkPrescriptionStatusUpdates/jest.debug.config.ts b/packages/checkPrescriptionStatusUpdates/jest.debug.config.ts deleted file mode 100644 index a306273831..0000000000 --- a/packages/checkPrescriptionStatusUpdates/jest.debug.config.ts +++ /dev/null @@ -1,9 +0,0 @@ -import config from "./jest.config" -import type {JestConfigWithTsJest} from "ts-jest" - -const debugConfig: JestConfigWithTsJest = { - ...config, - "preset": "ts-jest" -} - -export default debugConfig diff --git a/packages/common/middyErrorHandler/jest.debug.config.ts b/packages/common/middyErrorHandler/jest.debug.config.ts deleted file mode 100644 index a306273831..0000000000 --- a/packages/common/middyErrorHandler/jest.debug.config.ts +++ /dev/null @@ -1,9 +0,0 @@ -import config from "./jest.config" -import type {JestConfigWithTsJest} from "ts-jest" - -const debugConfig: JestConfigWithTsJest = { - ...config, - "preset": "ts-jest" -} - -export default debugConfig diff --git a/packages/common/utilities/jest.debug.config.ts b/packages/common/utilities/jest.debug.config.ts deleted file mode 100644 index a306273831..0000000000 --- a/packages/common/utilities/jest.debug.config.ts +++ /dev/null @@ -1,9 +0,0 @@ -import config from "./jest.config" -import type {JestConfigWithTsJest} from "ts-jest" - -const debugConfig: JestConfigWithTsJest = { - ...config, - "preset": "ts-jest" -} - -export default debugConfig diff --git a/packages/cpsuLambda/jest.debug.config.ts b/packages/cpsuLambda/jest.debug.config.ts deleted file mode 100644 index a306273831..0000000000 --- a/packages/cpsuLambda/jest.debug.config.ts +++ /dev/null @@ -1,9 +0,0 @@ -import config from "./jest.config" -import type {JestConfigWithTsJest} from "ts-jest" - -const debugConfig: JestConfigWithTsJest = { - ...config, - "preset": "ts-jest" -} - -export default debugConfig diff --git a/packages/gsul/jest.debug.config.ts b/packages/gsul/jest.debug.config.ts deleted file mode 100644 index a306273831..0000000000 --- a/packages/gsul/jest.debug.config.ts +++ /dev/null @@ -1,9 +0,0 @@ -import config from "./jest.config" -import type {JestConfigWithTsJest} from "ts-jest" - -const debugConfig: JestConfigWithTsJest = { - ...config, - "preset": "ts-jest" -} - -export default debugConfig diff --git a/packages/nhsNotifyLambda/jest.debug.config.ts b/packages/nhsNotifyLambda/jest.debug.config.ts deleted file mode 100644 index a306273831..0000000000 --- a/packages/nhsNotifyLambda/jest.debug.config.ts +++ /dev/null @@ -1,9 +0,0 @@ -import config from "./jest.config" -import type {JestConfigWithTsJest} from "ts-jest" - -const debugConfig: JestConfigWithTsJest = { - ...config, - "preset": "ts-jest" -} - -export default debugConfig diff --git a/packages/nhsNotifyUpdateCallback/jest.debug.config.ts b/packages/nhsNotifyUpdateCallback/jest.debug.config.ts deleted file mode 100644 index a306273831..0000000000 --- a/packages/nhsNotifyUpdateCallback/jest.debug.config.ts +++ /dev/null @@ -1,9 +0,0 @@ -import config from "./jest.config" -import type {JestConfigWithTsJest} from "ts-jest" - -const debugConfig: JestConfigWithTsJest = { - ...config, - "preset": "ts-jest" -} - -export default debugConfig diff --git a/packages/nhsd-psu-sandbox/jest.debug.config.ts b/packages/nhsd-psu-sandbox/jest.debug.config.ts deleted file mode 100644 index a306273831..0000000000 --- a/packages/nhsd-psu-sandbox/jest.debug.config.ts +++ /dev/null @@ -1,9 +0,0 @@ -import config from "./jest.config" -import type {JestConfigWithTsJest} from "ts-jest" - -const debugConfig: JestConfigWithTsJest = { - ...config, - "preset": "ts-jest" -} - -export default debugConfig diff --git a/packages/postDatedLambda/jest.debug.config.ts b/packages/postDatedLambda/jest.debug.config.ts deleted file mode 100644 index a306273831..0000000000 --- a/packages/postDatedLambda/jest.debug.config.ts +++ /dev/null @@ -1,9 +0,0 @@ -import config from "./jest.config" -import type {JestConfigWithTsJest} from "ts-jest" - -const debugConfig: JestConfigWithTsJest = { - ...config, - "preset": "ts-jest" -} - -export default debugConfig diff --git a/packages/psuRestoreValidationLambda/jest.debug.config.ts b/packages/psuRestoreValidationLambda/jest.debug.config.ts deleted file mode 100644 index a306273831..0000000000 --- a/packages/psuRestoreValidationLambda/jest.debug.config.ts +++ /dev/null @@ -1,9 +0,0 @@ -import config from "./jest.config" -import type {JestConfigWithTsJest} from "ts-jest" - -const debugConfig: JestConfigWithTsJest = { - ...config, - "preset": "ts-jest" -} - -export default debugConfig diff --git a/packages/specification/.vscode/launch.json b/packages/specification/.vscode/launch.json deleted file mode 100644 index 4e2a6957e9..0000000000 --- a/packages/specification/.vscode/launch.json +++ /dev/null @@ -1,31 +0,0 @@ -{ - "version": "0.2.0", - "configurations": [ - { - "type": "node", - "name": "vscode-jest-tests.v2", - "request": "launch", - "args": [ - "--runInBand", - "--watchAll=false", - "--testNamePattern", - "${jest.testNamePattern}", - "--runTestsByPath", - "${jest.testFile}", - "--config", - "${workspaceFolder}/jest.debug.config.ts" - ], - "cwd": "${workspaceFolder}", - "console": "integratedTerminal", - "internalConsoleOptions": "neverOpen", - "program": "${workspaceFolder}/../../node_modules/.bin/jest", - "windows": { - "program": "${workspaceFolder}/node_modules/jest/bin/jest" - }, - "env": { - "POWERTOOLS_DEV": "true", - "NODE_OPTIONS": "--experimental-vm-modules" - } - } - ] -} diff --git a/packages/specification/.vscode/settings.json b/packages/specification/.vscode/settings.json index 2acba7ccfa..0db3279e44 100644 --- a/packages/specification/.vscode/settings.json +++ b/packages/specification/.vscode/settings.json @@ -1,7 +1,3 @@ { - "jest.jestCommandLine": "/workspaces/eps-prescription-status-update-api/node_modules/.bin/jest --no-cache", - "jest.nodeEnv": { - "POWERTOOLS_DEV": true, - "NODE_OPTIONS": "--experimental-vm-modules" - } - } + +} diff --git a/packages/specification/jest.debug.config.ts b/packages/specification/jest.debug.config.ts deleted file mode 100644 index a306273831..0000000000 --- a/packages/specification/jest.debug.config.ts +++ /dev/null @@ -1,9 +0,0 @@ -import config from "./jest.config" -import type {JestConfigWithTsJest} from "ts-jest" - -const debugConfig: JestConfigWithTsJest = { - ...config, - "preset": "ts-jest" -} - -export default debugConfig diff --git a/packages/statusLambda/jest.debug.config.ts b/packages/statusLambda/jest.debug.config.ts deleted file mode 100644 index a306273831..0000000000 --- a/packages/statusLambda/jest.debug.config.ts +++ /dev/null @@ -1,9 +0,0 @@ -import config from "./jest.config" -import type {JestConfigWithTsJest} from "ts-jest" - -const debugConfig: JestConfigWithTsJest = { - ...config, - "preset": "ts-jest" -} - -export default debugConfig diff --git a/packages/updatePrescriptionStatus/jest.debug.config.ts b/packages/updatePrescriptionStatus/jest.debug.config.ts deleted file mode 100644 index a306273831..0000000000 --- a/packages/updatePrescriptionStatus/jest.debug.config.ts +++ /dev/null @@ -1,9 +0,0 @@ -import config from "./jest.config" -import type {JestConfigWithTsJest} from "ts-jest" - -const debugConfig: JestConfigWithTsJest = { - ...config, - "preset": "ts-jest" -} - -export default debugConfig diff --git a/packages/updatePrescriptionStatus/src/updatePrescriptionStatus.ts b/packages/updatePrescriptionStatus/src/updatePrescriptionStatus.ts index fcaf86755a..bd563e7625 100644 --- a/packages/updatePrescriptionStatus/src/updatePrescriptionStatus.ts +++ b/packages/updatePrescriptionStatus/src/updatePrescriptionStatus.ts @@ -62,7 +62,8 @@ async function loadConfig() { // AEA-4317 AEA-4365 & AEA-5913 - Env vars for INT test prescriptions const INT_ENVIRONMENT = process.env.ENVIRONMENT === "int" -// Using lazy initialization to avoid top-level await issues with Jest mocking +// Lazy-load and cache test prescriptions to avoid top-level async work. +// This also keeps module state predictable in tests, where resetTestPrescriptions() can clear the cache. export let TEST_PRESCRIPTIONS_1: Array = [] export let TEST_PRESCRIPTIONS_2: Array = [] export let TEST_PRESCRIPTIONS_3: Array = [] From 0822bc54b2c5b8a1859eaa945fb348a99230c81d Mon Sep 17 00:00:00 2001 From: tstephen-nhs <231503406+tstephen-nhs@users.noreply.github.com> Date: Thu, 9 Apr 2026 15:42:06 +0000 Subject: [PATCH 14/20] chore: regen lock file --- package-lock.json | 4034 +++++++-------------------------------------- 1 file changed, 571 insertions(+), 3463 deletions(-) diff --git a/package-lock.json b/package-lock.json index cc54cd7daf..a6b0eeda16 100644 --- a/package-lock.json +++ b/package-lock.json @@ -36,7 +36,6 @@ "devDependencies": { "@eslint/js": "^10.0.1", "@types/aws-lambda": "^8.10.161", - "@types/jest": "^30.0.0", "@types/node": "^25.5.0", "@typescript-eslint/eslint-plugin": "^8.57.2", "@typescript-eslint/parser": "^8.57.1", @@ -47,9 +46,6 @@ "eslint-plugin-import-newlines": "^2.0.0", "eslint-plugin-prettier": "^5.5.5", "globals": "^17.4.0", - "jest": "^30.3.0", - "jest-junit": "^16.0.0", - "ts-jest": "^29.4.6", "ts-node": "^10.9.2", "typescript": "^5.9.3", "typescript-eslint": "^8.57.2", @@ -1017,797 +1013,376 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/compat-data": { - "version": "7.28.4", + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/core": { - "version": "7.28.4", - "dev": true, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.27.1", "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.3", - "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-module-transforms": "^7.28.3", - "@babel/helpers": "^7.28.4", - "@babel/parser": "^7.28.4", - "@babel/template": "^7.27.2", - "@babel/traverse": "^7.28.4", - "@babel/types": "^7.28.4", - "@jridgewell/remapping": "^2.3.5", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, "engines": { "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" } }, - "node_modules/@babel/generator": { - "version": "7.28.3", + "node_modules/@babel/parser": { + "version": "7.28.4", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.28.3", - "@babel/types": "^7.28.2", - "@jridgewell/gen-mapping": "^0.3.12", - "@jridgewell/trace-mapping": "^0.3.28", - "jsesc": "^3.0.2" + "@babel/types": "^7.28.4" }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.27.2", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.27.2", - "@babel/helper-validator-option": "^7.27.1", - "browserslist": "^4.24.0", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" + "bin": { + "parser": "bin/babel-parser.js" }, "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.1", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" + "node": ">=6.0.0" } }, - "node_modules/@babel/helper-globals": { - "version": "7.28.0", - "dev": true, + "node_modules/@babel/runtime": { + "version": "7.28.4", "license": "MIT", "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-module-imports": { - "version": "7.27.1", + "node_modules/@babel/types": { + "version": "7.28.4", "dev": true, "license": "MIT", "dependencies": { - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.28.3", + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1", - "@babel/traverse": "^7.28.3" + "@jridgewell/trace-mapping": "0.3.9" }, "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" + "node": ">=12" } }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.28.6", + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", "dev": true, "license": "MIT", - "engines": { - "node": ">=6.9.0" + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" } }, - "node_modules/@babel/helper-string-parser": { - "version": "7.27.1", - "dev": true, + "node_modules/@emotion/is-prop-valid": { + "version": "1.4.0", "license": "MIT", - "engines": { - "node": ">=6.9.0" + "dependencies": { + "@emotion/memoize": "^0.9.0" } }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.27.1", + "node_modules/@emotion/memoize": { + "version": "0.9.0", + "license": "MIT" + }, + "node_modules/@emotion/unitless": { + "version": "0.10.0", + "license": "MIT" + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.4.tgz", + "integrity": "sha512-cQPwL2mp2nSmHHJlCyoXgHGhbEPMrEEU5xhkcy3Hs/O7nGZqEpZ2sUtLaL9MORLtDfRvVl2/3PAuEkYZH0Ty8Q==", + "cpu": [ + "ppc64" + ], "license": "MIT", + "optional": true, + "os": [ + "aix" + ], "engines": { - "node": ">=6.9.0" + "node": ">=18" } }, - "node_modules/@babel/helper-validator-option": { - "version": "7.27.1", - "dev": true, + "node_modules/@esbuild/android-arm": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.4.tgz", + "integrity": "sha512-X9bUgvxiC8CHAGKYufLIHGXPJWnr0OCdR0anD2e21vdvgCI8lIfqFbnoeOz7lBjdrAGUhqLZLcQo6MLhTO2DKQ==", + "cpu": [ + "arm" + ], "license": "MIT", + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=6.9.0" + "node": ">=18" } }, - "node_modules/@babel/helpers": { - "version": "7.28.4", - "dev": true, + "node_modules/@esbuild/android-arm64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.4.tgz", + "integrity": "sha512-gdLscB7v75wRfu7QSm/zg6Rx29VLdy9eTr2t44sfTW7CxwAtQghZ4ZnqHk3/ogz7xao0QAgrkradbBzcqFPasw==", + "cpu": [ + "arm64" + ], "license": "MIT", - "dependencies": { - "@babel/template": "^7.27.2", - "@babel/types": "^7.28.4" - }, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=6.9.0" + "node": ">=18" } }, - "node_modules/@babel/parser": { - "version": "7.28.4", - "dev": true, + "node_modules/@esbuild/android-x64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.4.tgz", + "integrity": "sha512-PzPFnBNVF292sfpfhiyiXCGSn9HZg5BcAz+ivBuSsl6Rk4ga1oEXAamhOXRFyMcjwr2DVtm40G65N3GLeH1Lvw==", + "cpu": [ + "x64" + ], "license": "MIT", - "dependencies": { - "@babel/types": "^7.28.4" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=6.0.0" + "node": ">=18" } }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "dev": true, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.4.tgz", + "integrity": "sha512-b7xaGIwdJlht8ZFCvMkpDN6uiSmnxxK56N2GDTMYPr2/gzvfdQN8rTfBsvVKmIVY/X7EM+/hJKEIbbHs9oA4tQ==", + "cpu": [ + "arm64" + ], "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "dev": true, + "node_modules/@esbuild/darwin-x64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.4.tgz", + "integrity": "sha512-sR+OiKLwd15nmCdqpXMnuJ9W2kpy0KigzqScqHI3Hqwr7IXxBp3Yva+yJwoqh7rE8V77tdoheRYataNKL4QrPw==", + "cpu": [ + "x64" + ], "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "dev": true, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.4.tgz", + "integrity": "sha512-jnfpKe+p79tCnm4GVav68A7tUFeKQwQyLgESwEAUzyxk/TJr4QdGog9sqWNcUbr/bZt/O/HXouspuQDd9JxFSw==", + "cpu": [ + "arm64" + ], "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "dev": true, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.4.tgz", + "integrity": "sha512-2kb4ceA/CpfUrIcTUl1wrP/9ad9Atrp5J94Lq69w7UwOMolPIGrfLSvAKJp0RTvkPPyn6CIWrNy13kyLikZRZQ==", + "cpu": [ + "x64" + ], "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.27.1", - "dev": true, + "node_modules/@esbuild/linux-arm": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.4.tgz", + "integrity": "sha512-aBYgcIxX/wd5n2ys0yESGeYMGF+pv6g0DhZr3G1ZG4jMfruU9Tl1i2Z+Wnj9/KjGz1lTLCcorqE2viePZqj4Eg==", + "cpu": [ + "arm" + ], "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "node": ">=18" } }, - "node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "dev": true, + "node_modules/@esbuild/linux-arm64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.4.tgz", + "integrity": "sha512-7nQOttdzVGth1iz57kxg9uCz57dxQLHWxopL6mYuYthohPKEK0vU0C3O21CcBK6KDlkYVcnDXY099HcCDXd9dA==", + "cpu": [ + "arm64" + ], "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.28.6", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.28.6", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/runtime": { - "version": "7.28.4", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/template": { - "version": "7.27.2", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/parser": "^7.27.2", - "@babel/types": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.28.4", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.3", - "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.28.4", - "@babel/template": "^7.27.2", - "@babel/types": "^7.28.4", - "debug": "^4.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.28.4", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@bcoe/v8-coverage": { - "version": "0.2.3", - "dev": true, - "license": "MIT" - }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.8.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "node_modules/@emnapi/core": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.9.2.tgz", - "integrity": "sha512-UC+ZhH3XtczQYfOlu3lNEkdW/p4dsJ1r/bP7H8+rhao3TTTMO1ATq/4DdIi23XuGoFY+Cz0JmCbdVl0hz9jZcA==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/wasi-threads": "1.2.1", - "tslib": "^2.4.0" - } - }, - "node_modules/@emnapi/runtime": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.9.2.tgz", - "integrity": "sha512-3U4+MIWHImeyu1wnmVygh5WlgfYDtyf0k8AbLhMFxOipihf6nrWC4syIm/SwEeec0mNSafiiNnMJwbza/Is6Lw==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@emnapi/wasi-threads": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz", - "integrity": "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==", - "dev": true, + "node_modules/@esbuild/linux-ia32": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.4.tgz", + "integrity": "sha512-oPtixtAIzgvzYcKBQM/qZ3R+9TEUd1aNJQu0HhGyqtx6oS7qTpvjheIWBbes4+qu1bNlo2V4cbkISr8q6gRBFA==", + "cpu": [ + "ia32" + ], "license": "MIT", "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@emotion/is-prop-valid": { - "version": "1.4.0", - "license": "MIT", - "dependencies": { - "@emotion/memoize": "^0.9.0" + "os": [ + "linux" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@emotion/memoize": { - "version": "0.9.0", - "license": "MIT" - }, - "node_modules/@emotion/unitless": { - "version": "0.10.0", - "license": "MIT" - }, - "node_modules/@esbuild/aix-ppc64": { + "node_modules/@esbuild/linux-loong64": { "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.4.tgz", - "integrity": "sha512-cQPwL2mp2nSmHHJlCyoXgHGhbEPMrEEU5xhkcy3Hs/O7nGZqEpZ2sUtLaL9MORLtDfRvVl2/3PAuEkYZH0Ty8Q==", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.4.tgz", + "integrity": "sha512-8mL/vh8qeCoRcFH2nM8wm5uJP+ZcVYGGayMavi8GmRJjuI3g1v6Z7Ni0JJKAJW+m0EtUuARb6Lmp4hMjzCBWzA==", "cpu": [ - "ppc64" + "loong64" ], "license": "MIT", "optional": true, "os": [ - "aix" + "linux" ], "engines": { "node": ">=18" } }, - "node_modules/@esbuild/android-arm": { + "node_modules/@esbuild/linux-mips64el": { "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.4.tgz", - "integrity": "sha512-X9bUgvxiC8CHAGKYufLIHGXPJWnr0OCdR0anD2e21vdvgCI8lIfqFbnoeOz7lBjdrAGUhqLZLcQo6MLhTO2DKQ==", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.4.tgz", + "integrity": "sha512-1RdrWFFiiLIW7LQq9Q2NES+HiD4NyT8Itj9AUeCl0IVCA459WnPhREKgwrpaIfTOe+/2rdntisegiPWn/r/aAw==", "cpu": [ - "arm" + "mips64el" ], "license": "MIT", "optional": true, "os": [ - "android" + "linux" ], "engines": { "node": ">=18" } }, - "node_modules/@esbuild/android-arm64": { + "node_modules/@esbuild/linux-ppc64": { "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.4.tgz", - "integrity": "sha512-gdLscB7v75wRfu7QSm/zg6Rx29VLdy9eTr2t44sfTW7CxwAtQghZ4ZnqHk3/ogz7xao0QAgrkradbBzcqFPasw==", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.4.tgz", + "integrity": "sha512-tLCwNG47l3sd9lpfyx9LAGEGItCUeRCWeAx6x2Jmbav65nAwoPXfewtAdtbtit/pJFLUWOhpv0FpS6GQAmPrHA==", "cpu": [ - "arm64" + "ppc64" ], "license": "MIT", "optional": true, "os": [ - "android" + "linux" ], "engines": { "node": ">=18" } }, - "node_modules/@esbuild/android-x64": { + "node_modules/@esbuild/linux-riscv64": { "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.4.tgz", - "integrity": "sha512-PzPFnBNVF292sfpfhiyiXCGSn9HZg5BcAz+ivBuSsl6Rk4ga1oEXAamhOXRFyMcjwr2DVtm40G65N3GLeH1Lvw==", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.4.tgz", + "integrity": "sha512-BnASypppbUWyqjd1KIpU4AUBiIhVr6YlHx/cnPgqEkNoVOhHg+YiSVxM1RLfiy4t9cAulbRGTNCKOcqHrEQLIw==", "cpu": [ - "x64" + "riscv64" ], "license": "MIT", "optional": true, "os": [ - "android" + "linux" ], "engines": { "node": ">=18" } }, - "node_modules/@esbuild/darwin-arm64": { + "node_modules/@esbuild/linux-s390x": { "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.4.tgz", - "integrity": "sha512-b7xaGIwdJlht8ZFCvMkpDN6uiSmnxxK56N2GDTMYPr2/gzvfdQN8rTfBsvVKmIVY/X7EM+/hJKEIbbHs9oA4tQ==", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.4.tgz", + "integrity": "sha512-+eUqgb/Z7vxVLezG8bVB9SfBie89gMueS+I0xYh2tJdw3vqA/0ImZJ2ROeWwVJN59ihBeZ7Tu92dF/5dy5FttA==", "cpu": [ - "arm64" + "s390x" ], "license": "MIT", "optional": true, "os": [ - "darwin" + "linux" ], "engines": { "node": ">=18" } }, - "node_modules/@esbuild/darwin-x64": { + "node_modules/@esbuild/linux-x64": { "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.4.tgz", - "integrity": "sha512-sR+OiKLwd15nmCdqpXMnuJ9W2kpy0KigzqScqHI3Hqwr7IXxBp3Yva+yJwoqh7rE8V77tdoheRYataNKL4QrPw==", "cpu": [ "x64" ], "license": "MIT", "optional": true, "os": [ - "darwin" + "linux" ], "engines": { "node": ">=18" } }, - "node_modules/@esbuild/freebsd-arm64": { + "node_modules/@esbuild/netbsd-arm64": { "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.4.tgz", - "integrity": "sha512-jnfpKe+p79tCnm4GVav68A7tUFeKQwQyLgESwEAUzyxk/TJr4QdGog9sqWNcUbr/bZt/O/HXouspuQDd9JxFSw==", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.4.tgz", + "integrity": "sha512-xHT8X4sb0GS8qTqiwzHqpY00C95DPAq7nAwX35Ie/s+LO9830hrMd3oX0ZMKLvy7vsonee73x0lmcdOVXFzd6Q==", "cpu": [ "arm64" ], "license": "MIT", "optional": true, "os": [ - "freebsd" + "netbsd" ], "engines": { "node": ">=18" } }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.4.tgz", - "integrity": "sha512-2kb4ceA/CpfUrIcTUl1wrP/9ad9Atrp5J94Lq69w7UwOMolPIGrfLSvAKJp0RTvkPPyn6CIWrNy13kyLikZRZQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.4.tgz", - "integrity": "sha512-aBYgcIxX/wd5n2ys0yESGeYMGF+pv6g0DhZr3G1ZG4jMfruU9Tl1i2Z+Wnj9/KjGz1lTLCcorqE2viePZqj4Eg==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.4.tgz", - "integrity": "sha512-7nQOttdzVGth1iz57kxg9uCz57dxQLHWxopL6mYuYthohPKEK0vU0C3O21CcBK6KDlkYVcnDXY099HcCDXd9dA==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.4.tgz", - "integrity": "sha512-oPtixtAIzgvzYcKBQM/qZ3R+9TEUd1aNJQu0HhGyqtx6oS7qTpvjheIWBbes4+qu1bNlo2V4cbkISr8q6gRBFA==", - "cpu": [ - "ia32" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.4.tgz", - "integrity": "sha512-8mL/vh8qeCoRcFH2nM8wm5uJP+ZcVYGGayMavi8GmRJjuI3g1v6Z7Ni0JJKAJW+m0EtUuARb6Lmp4hMjzCBWzA==", - "cpu": [ - "loong64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.4.tgz", - "integrity": "sha512-1RdrWFFiiLIW7LQq9Q2NES+HiD4NyT8Itj9AUeCl0IVCA459WnPhREKgwrpaIfTOe+/2rdntisegiPWn/r/aAw==", - "cpu": [ - "mips64el" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.4.tgz", - "integrity": "sha512-tLCwNG47l3sd9lpfyx9LAGEGItCUeRCWeAx6x2Jmbav65nAwoPXfewtAdtbtit/pJFLUWOhpv0FpS6GQAmPrHA==", - "cpu": [ - "ppc64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.4.tgz", - "integrity": "sha512-BnASypppbUWyqjd1KIpU4AUBiIhVr6YlHx/cnPgqEkNoVOhHg+YiSVxM1RLfiy4t9cAulbRGTNCKOcqHrEQLIw==", - "cpu": [ - "riscv64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.4.tgz", - "integrity": "sha512-+eUqgb/Z7vxVLezG8bVB9SfBie89gMueS+I0xYh2tJdw3vqA/0ImZJ2ROeWwVJN59ihBeZ7Tu92dF/5dy5FttA==", - "cpu": [ - "s390x" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.27.4", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-arm64": { - "version": "0.27.4", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.4.tgz", - "integrity": "sha512-xHT8X4sb0GS8qTqiwzHqpY00C95DPAq7nAwX35Ie/s+LO9830hrMd3oX0ZMKLvy7vsonee73x0lmcdOVXFzd6Q==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-x64": { + "node_modules/@esbuild/netbsd-x64": { "version": "0.27.4", "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.4.tgz", "integrity": "sha512-RugOvOdXfdyi5Tyv40kgQnI0byv66BFgAqjdgtAKqHoZTbTF2QqfQrFwa7cHEORJf6X2ht+l9ABLMP0dnKYsgg==", @@ -2165,464 +1740,80 @@ "node": ">=12" } }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", "dev": true, - "license": "ISC", - "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, + "license": "MIT", "engines": { "node": ">=8" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { - "version": "4.1.0", + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", "dev": true, "license": "MIT", "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { - "version": "5.0.0", + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", "dev": true, "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" - }, "engines": { - "node": ">=8" + "node": ">=6.0.0" } }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { - "version": "2.3.0", + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", "dev": true, - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "license": "MIT" }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { - "version": "4.1.0", + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", "dev": true, "license": "MIT", "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "dev": true, + "node_modules/@middy/core": { + "version": "7.1.2", "license": "MIT", "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/console": { - "version": "30.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "30.3.0", - "@types/node": "*", - "chalk": "^4.1.2", - "jest-message-util": "30.3.0", - "jest-util": "30.3.0", - "slash": "^3.0.0" + "node": ">=22" }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@jest/core": { - "version": "30.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/console": "30.3.0", - "@jest/pattern": "30.0.1", - "@jest/reporters": "30.3.0", - "@jest/test-result": "30.3.0", - "@jest/transform": "30.3.0", - "@jest/types": "30.3.0", - "@types/node": "*", - "ansi-escapes": "^4.3.2", - "chalk": "^4.1.2", - "ci-info": "^4.2.0", - "exit-x": "^0.2.2", - "graceful-fs": "^4.2.11", - "jest-changed-files": "30.3.0", - "jest-config": "30.3.0", - "jest-haste-map": "30.3.0", - "jest-message-util": "30.3.0", - "jest-regex-util": "30.0.1", - "jest-resolve": "30.3.0", - "jest-resolve-dependencies": "30.3.0", - "jest-runner": "30.3.0", - "jest-runtime": "30.3.0", - "jest-snapshot": "30.3.0", - "jest-util": "30.3.0", - "jest-validate": "30.3.0", - "jest-watcher": "30.3.0", - "pretty-format": "30.3.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/willfarrell" }, "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + "@aws/durable-execution-sdk-js": "^1.0.0" }, "peerDependenciesMeta": { - "node-notifier": { + "@aws/durable-execution-sdk-js": { "optional": true } } }, - "node_modules/@jest/diff-sequences": { - "version": "30.3.0", - "dev": true, + "node_modules/@middy/http-header-normalizer": { + "version": "7.2.1", "license": "MIT", "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">=22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/willfarrell" } }, - "node_modules/@jest/environment": { - "version": "30.3.0", - "dev": true, + "node_modules/@middy/input-output-logger": { + "version": "7.2.1", "license": "MIT", "dependencies": { - "@jest/fake-timers": "30.3.0", - "@jest/types": "30.3.0", - "@types/node": "*", - "jest-mock": "30.3.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@jest/expect": { - "version": "30.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "expect": "30.3.0", - "jest-snapshot": "30.3.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@jest/expect-utils": { - "version": "30.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/get-type": "30.1.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@jest/fake-timers": { - "version": "30.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "30.3.0", - "@sinonjs/fake-timers": "^15.0.0", - "@types/node": "*", - "jest-message-util": "30.3.0", - "jest-mock": "30.3.0", - "jest-util": "30.3.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@jest/fake-timers/node_modules/@sinonjs/fake-timers": { - "version": "15.1.1", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@sinonjs/commons": "^3.0.1" - } - }, - "node_modules/@jest/get-type": { - "version": "30.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@jest/globals": { - "version": "30.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/environment": "30.3.0", - "@jest/expect": "30.3.0", - "@jest/types": "30.3.0", - "jest-mock": "30.3.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@jest/pattern": { - "version": "30.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "jest-regex-util": "30.0.1" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@jest/reporters": { - "version": "30.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "30.3.0", - "@jest/test-result": "30.3.0", - "@jest/transform": "30.3.0", - "@jest/types": "30.3.0", - "@jridgewell/trace-mapping": "^0.3.25", - "@types/node": "*", - "chalk": "^4.1.2", - "collect-v8-coverage": "^1.0.2", - "exit-x": "^0.2.2", - "glob": "^10.5.0", - "graceful-fs": "^4.2.11", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^6.0.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^5.0.0", - "istanbul-reports": "^3.1.3", - "jest-message-util": "30.3.0", - "jest-util": "30.3.0", - "jest-worker": "30.3.0", - "slash": "^3.0.0", - "string-length": "^4.0.2", - "v8-to-istanbul": "^9.0.1" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/@jest/schemas": { - "version": "30.0.5", - "dev": true, - "license": "MIT", - "dependencies": { - "@sinclair/typebox": "^0.34.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@jest/snapshot-utils": { - "version": "30.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "30.3.0", - "chalk": "^4.1.2", - "graceful-fs": "^4.2.11", - "natural-compare": "^1.4.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@jest/source-map": { - "version": "30.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.25", - "callsites": "^3.1.0", - "graceful-fs": "^4.2.11" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@jest/test-result": { - "version": "30.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/console": "30.3.0", - "@jest/types": "30.3.0", - "@types/istanbul-lib-coverage": "^2.0.6", - "collect-v8-coverage": "^1.0.2" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@jest/test-sequencer": { - "version": "30.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/test-result": "30.3.0", - "graceful-fs": "^4.2.11", - "jest-haste-map": "30.3.0", - "slash": "^3.0.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@jest/transform": { - "version": "30.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.27.4", - "@jest/types": "30.3.0", - "@jridgewell/trace-mapping": "^0.3.25", - "babel-plugin-istanbul": "^7.0.1", - "chalk": "^4.1.2", - "convert-source-map": "^2.0.0", - "fast-json-stable-stringify": "^2.1.0", - "graceful-fs": "^4.2.11", - "jest-haste-map": "30.3.0", - "jest-regex-util": "30.0.1", - "jest-util": "30.3.0", - "pirates": "^4.0.7", - "slash": "^3.0.0", - "write-file-atomic": "^5.0.1" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@jest/types": { - "version": "30.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/pattern": "30.0.1", - "@jest/schemas": "30.0.5", - "@types/istanbul-lib-coverage": "^2.0.6", - "@types/istanbul-reports": "^3.0.4", - "@types/node": "*", - "@types/yargs": "^17.0.33", - "chalk": "^4.1.2" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.13", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/remapping": { - "version": "2.3.5", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.5", - "dev": true, - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.31", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@middy/core": { - "version": "7.1.2", - "license": "MIT", - "engines": { - "node": ">=22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/willfarrell" - }, - "peerDependencies": { - "@aws/durable-execution-sdk-js": "^1.0.0" - }, - "peerDependenciesMeta": { - "@aws/durable-execution-sdk-js": { - "optional": true - } - } - }, - "node_modules/@middy/http-header-normalizer": { - "version": "7.2.1", - "license": "MIT", - "engines": { - "node": ">=22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/willfarrell" - } - }, - "node_modules/@middy/input-output-logger": { - "version": "7.2.1", - "license": "MIT", - "dependencies": { - "@middy/util": "7.2.1" + "@middy/util": "7.2.1" }, "engines": { "node": ">=22" @@ -2724,19 +1915,6 @@ "node": ">=18" } }, - "node_modules/@napi-rs/wasm-runtime": { - "version": "0.2.12", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz", - "integrity": "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/core": "^1.4.3", - "@emnapi/runtime": "^1.4.3", - "@tybys/wasm-util": "^0.10.0" - } - }, "node_modules/@nhs/fhir-middy-error-handler": { "version": "2.1.75", "license": "MIT", @@ -3771,11 +2949,6 @@ "win32" ] }, - "node_modules/@sinclair/typebox": { - "version": "0.34.41", - "dev": true, - "license": "MIT" - }, "node_modules/@sinonjs/commons": { "version": "3.0.1", "dev": true, @@ -4399,59 +3572,11 @@ "dev": true, "license": "MIT" }, - "node_modules/@tybys/wasm-util": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", - "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, "node_modules/@types/aws-lambda": { "version": "8.10.161", "dev": true, "license": "MIT" }, - "node_modules/@types/babel__core": { - "version": "7.20.5", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "node_modules/@types/babel__generator": { - "version": "7.27.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__template": { - "version": "7.4.4", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__traverse": { - "version": "7.28.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.28.2" - } - }, "node_modules/@types/chai": { "version": "5.2.3", "dev": true, @@ -4481,36 +3606,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.6", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/istanbul-lib-report": { - "version": "3.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-coverage": "*" - } - }, - "node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/@types/jest": { - "version": "30.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "expect": "^30.0.0", - "pretty-format": "^30.0.0" - } - }, "node_modules/@types/json-schema": { "version": "7.0.15", "license": "MIT" @@ -4535,11 +3630,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/stack-utils": { - "version": "2.0.3", - "dev": true, - "license": "MIT" - }, "node_modules/@types/stylis": { "version": "4.2.7", "license": "MIT" @@ -4549,23 +3639,10 @@ "license": "MIT", "optional": true }, - "node_modules/@types/yargs": { - "version": "17.0.33", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@types/yargs-parser": { - "version": "21.0.3", - "dev": true, - "license": "MIT" - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.58.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.58.0.tgz", - "integrity": "sha512-RLkVSiNuUP1C2ROIWfqX+YcUfLaSnxGE/8M+Y57lopVwg9VTYYfhuz15Yf1IzCKgZj6/rIbYTmJCUSqr76r0Wg==", + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.58.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.58.0.tgz", + "integrity": "sha512-RLkVSiNuUP1C2ROIWfqX+YcUfLaSnxGE/8M+Y57lopVwg9VTYYfhuz15Yf1IzCKgZj6/rIbYTmJCUSqr76r0Wg==", "dev": true, "license": "MIT", "dependencies": { @@ -4834,276 +3911,6 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/@ungap/structured-clone": { - "version": "1.3.0", - "dev": true, - "license": "ISC" - }, - "node_modules/@unrs/resolver-binding-android-arm-eabi": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.11.1.tgz", - "integrity": "sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@unrs/resolver-binding-android-arm64": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.11.1.tgz", - "integrity": "sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@unrs/resolver-binding-darwin-arm64": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.11.1.tgz", - "integrity": "sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@unrs/resolver-binding-darwin-x64": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.11.1.tgz", - "integrity": "sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@unrs/resolver-binding-freebsd-x64": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.11.1.tgz", - "integrity": "sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@unrs/resolver-binding-linux-arm-gnueabihf": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.11.1.tgz", - "integrity": "sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-arm-musleabihf": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.11.1.tgz", - "integrity": "sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-arm64-gnu": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.11.1.tgz", - "integrity": "sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-arm64-musl": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.11.1.tgz", - "integrity": "sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-ppc64-gnu": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.11.1.tgz", - "integrity": "sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-riscv64-gnu": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.11.1.tgz", - "integrity": "sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-riscv64-musl": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.11.1.tgz", - "integrity": "sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-s390x-gnu": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.11.1.tgz", - "integrity": "sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-x64-gnu": { - "version": "1.11.1", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-x64-musl": { - "version": "1.11.1", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-wasm32-wasi": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.11.1.tgz", - "integrity": "sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==", - "cpu": [ - "wasm32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@napi-rs/wasm-runtime": "^0.2.11" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@unrs/resolver-binding-win32-arm64-msvc": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.11.1.tgz", - "integrity": "sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@unrs/resolver-binding-win32-ia32-msvc": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.11.1.tgz", - "integrity": "sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@unrs/resolver-binding-win32-x64-msvc": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.11.1.tgz", - "integrity": "sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, "node_modules/@vitest/coverage-v8": { "version": "3.2.4", "dev": true, @@ -5420,20 +4227,6 @@ "node": ">=14" } }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "dev": true, - "license": "MIT", - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/ansi-regex": { "version": "6.2.2", "dev": true, @@ -5458,29 +4251,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/anymatch": { - "version": "3.1.3", - "dev": true, - "license": "ISC", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/anymatch/node_modules/picomatch": { - "version": "2.3.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/apim-spec": { "resolved": "packages/specification", "link": true @@ -5613,95 +4383,6 @@ "axios": "0.x || 1.x" } }, - "node_modules/babel-jest": { - "version": "30.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/transform": "30.3.0", - "@types/babel__core": "^7.20.5", - "babel-plugin-istanbul": "^7.0.1", - "babel-preset-jest": "30.3.0", - "chalk": "^4.1.2", - "graceful-fs": "^4.2.11", - "slash": "^3.0.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.11.0 || ^8.0.0-0" - } - }, - "node_modules/babel-plugin-istanbul": { - "version": "7.0.1", - "dev": true, - "license": "BSD-3-Clause", - "workspaces": [ - "test/babel-8" - ], - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.3", - "istanbul-lib-instrument": "^6.0.2", - "test-exclude": "^6.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/babel-plugin-jest-hoist": { - "version": "30.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/babel__core": "^7.20.5" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/babel-preset-current-node-syntax": { - "version": "1.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-import-attributes": "^7.24.7", - "@babel/plugin-syntax-import-meta": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5" - }, - "peerDependencies": { - "@babel/core": "^7.0.0 || ^8.0.0-0" - } - }, - "node_modules/babel-preset-jest": { - "version": "30.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "babel-plugin-jest-hoist": "30.3.0", - "babel-preset-current-node-syntax": "^1.2.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.11.0 || ^8.0.0-beta.1" - } - }, "node_modules/balanced-match": { "version": "1.0.2", "license": "MIT" @@ -5724,14 +4405,6 @@ ], "license": "MIT" }, - "node_modules/baseline-browser-mapping": { - "version": "2.8.9", - "dev": true, - "license": "Apache-2.0", - "bin": { - "baseline-browser-mapping": "dist/cli.js" - } - }, "node_modules/better-ajv-errors": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/better-ajv-errors/-/better-ajv-errors-1.2.0.tgz", @@ -5762,57 +4435,6 @@ "balanced-match": "^1.0.0" } }, - "node_modules/browserslist": { - "version": "4.26.2", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "baseline-browser-mapping": "^2.8.3", - "caniuse-lite": "^1.0.30001741", - "electron-to-chromium": "^1.5.218", - "node-releases": "^2.0.21", - "update-browserslist-db": "^1.1.3" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/bs-logger": { - "version": "0.2.6", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-json-stable-stringify": "2.x" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/bser": { - "version": "2.1.1", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "node-int64": "^0.4.0" - } - }, "node_modules/buffer": { "version": "4.9.2", "license": "MIT", @@ -5822,11 +4444,6 @@ "isarray": "^1.0.0" } }, - "node_modules/buffer-from": { - "version": "1.1.2", - "dev": true, - "license": "MIT" - }, "node_modules/cac": { "version": "6.7.14", "dev": true, @@ -5880,14 +4497,6 @@ "version": "1.0.2", "license": "MIT" }, - "node_modules/callsites": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/camel-case": { "version": "4.1.2", "license": "MIT", @@ -5896,14 +4505,6 @@ "tslib": "^2.0.3" } }, - "node_modules/camelcase": { - "version": "5.3.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/camelize": { "version": "1.0.1", "license": "MIT", @@ -5911,25 +4512,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/caniuse-lite": { - "version": "1.0.30001745", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "CC-BY-4.0" - }, "node_modules/capabilityStatement": { "resolved": "packages/capabilityStatement", "link": true @@ -5990,14 +4572,6 @@ "tslib": "^2.0.3" } }, - "node_modules/char-regex": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - } - }, "node_modules/check-error": { "version": "2.1.3", "dev": true, @@ -6010,25 +4584,6 @@ "resolved": "packages/checkPrescriptionStatusUpdates", "link": true }, - "node_modules/ci-info": { - "version": "4.3.0", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/cjs-module-lexer": { - "version": "2.2.0", - "dev": true, - "license": "MIT" - }, "node_modules/classnames": { "version": "2.5.1", "license": "MIT" @@ -6100,20 +4655,6 @@ "node": ">=6" } }, - "node_modules/co": { - "version": "4.6.0", - "dev": true, - "license": "MIT", - "engines": { - "iojs": ">= 1.0.0", - "node": ">= 0.12.0" - } - }, - "node_modules/collect-v8-coverage": { - "version": "1.0.3", - "dev": true, - "license": "MIT" - }, "node_modules/color-convert": { "version": "2.0.1", "license": "MIT", @@ -6146,11 +4687,6 @@ "version": "3.0.2", "license": "MIT" }, - "node_modules/concat-map": { - "version": "0.0.1", - "dev": true, - "license": "MIT" - }, "node_modules/constant-case": { "version": "3.0.4", "license": "MIT", @@ -6160,11 +4696,6 @@ "upper-case": "^2.0.2" } }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, "node_modules/cookie": { "version": "0.7.2", "license": "MIT", @@ -6242,19 +4773,6 @@ "node_modules/decko": { "version": "1.2.0" }, - "node_modules/dedent": { - "version": "1.7.2", - "dev": true, - "license": "MIT", - "peerDependencies": { - "babel-plugin-macros": "^3.1.0" - }, - "peerDependenciesMeta": { - "babel-plugin-macros": { - "optional": true - } - } - }, "node_modules/deep-eql": { "version": "5.0.2", "dev": true, @@ -6268,14 +4786,6 @@ "dev": true, "license": "MIT" }, - "node_modules/deepmerge": { - "version": "4.3.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/define-data-property": { "version": "1.1.4", "license": "MIT", @@ -6298,14 +4808,6 @@ "node": ">=0.4.0" } }, - "node_modules/detect-newline": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/diff": { "version": "4.0.4", "dev": true, @@ -6360,35 +4862,11 @@ "dev": true, "license": "MIT" }, - "node_modules/electron-to-chromium": { - "version": "1.5.227", - "dev": true, - "license": "ISC" - }, - "node_modules/emittery": { - "version": "0.13.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sindresorhus/emittery?sponsor=1" - } - }, "node_modules/emoji-regex": { "version": "9.2.2", "dev": true, "license": "MIT" }, - "node_modules/error-ex": { - "version": "1.3.4", - "dev": true, - "license": "MIT", - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, "node_modules/es-define-property": { "version": "1.0.1", "license": "MIT", @@ -6785,57 +5263,6 @@ "node": ">=0.4.x" } }, - "node_modules/execa": { - "version": "5.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/execa/node_modules/signal-exit": { - "version": "3.0.7", - "dev": true, - "license": "ISC" - }, - "node_modules/exit-x": { - "version": "0.2.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/expect": { - "version": "30.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/expect-utils": "30.3.0", - "@jest/get-type": "30.1.0", - "jest-matcher-utils": "30.3.0", - "jest-message-util": "30.3.0", - "jest-mock": "30.3.0", - "jest-util": "30.3.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, "node_modules/expect-type": { "version": "1.3.0", "dev": true, @@ -6915,14 +5342,6 @@ "fxparser": "src/cli/cli.js" } }, - "node_modules/fb-watchman": { - "version": "2.0.2", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "bser": "2.1.1" - } - }, "node_modules/fdir": { "version": "6.5.0", "dev": true, @@ -6971,500 +5390,59 @@ "license": "MIT", "dependencies": { "flatted": "^3.2.9", - "keyv": "^4.5.4" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/flatted": { - "version": "3.4.2", - "dev": true, - "license": "ISC" - }, - "node_modules/fluent-transpiler": { - "version": "0.2.1", - "license": "MIT", - "dependencies": { - "@fluent/syntax": "0.18.1", - "change-case": "4.1.2", - "commander": "9.4.0" - }, - "bin": { - "ftl": "cli.js" - } - }, - "node_modules/fluent-transpiler/node_modules/commander": { - "version": "9.4.0", - "license": "MIT", - "engines": { - "node": "^12.20.0 || >=14" - } - }, - "node_modules/follow-redirects": { - "version": "1.15.11", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "license": "MIT", - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/for-each": { - "version": "0.3.5", - "license": "MIT", - "dependencies": { - "is-callable": "^1.2.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/foreach": { - "version": "2.0.6", - "license": "MIT" - }, - "node_modules/foreground-child": { - "version": "3.3.1", - "dev": true, - "license": "ISC", - "dependencies": { - "cross-spawn": "^7.0.6", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/form-data": { - "version": "4.0.5", - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "hasown": "^2.0.2", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "dev": true, - "license": "ISC" - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "license": "ISC", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.3.0", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-package-type": { - "version": "0.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/get-proto": { - "version": "1.0.1", - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/get-stream": { - "version": "6.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/glob": { - "version": "10.5.0", - "dev": true, - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/glob-to-regexp": { - "version": "0.4.1", - "license": "BSD-2-Clause" - }, - "node_modules/globals": { - "version": "17.4.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globrex": { - "version": "0.1.2", - "dev": true, - "license": "MIT" - }, - "node_modules/gopd": { - "version": "1.2.0", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "license": "ISC" - }, - "node_modules/gsul": { - "resolved": "packages/gsul", - "link": true - }, - "node_modules/handlebars": { - "version": "4.7.9", - "license": "MIT", - "dependencies": { - "minimist": "^1.2.5", - "neo-async": "^2.6.2", - "source-map": "^0.6.1", - "wordwrap": "^1.0.0" - }, - "bin": { - "handlebars": "bin/handlebars" - }, - "engines": { - "node": ">=0.4.7" - }, - "optionalDependencies": { - "uglify-js": "^3.1.4" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.1.0", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "license": "MIT", - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/header-case": { - "version": "2.0.4", - "license": "MIT", - "dependencies": { - "capital-case": "^1.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/html-escaper": { - "version": "2.0.2", - "dev": true, - "license": "MIT" - }, - "node_modules/http2-client": { - "version": "1.3.5", - "license": "MIT" - }, - "node_modules/https-proxy-agent": { - "version": "7.0.6", - "license": "MIT", - "dependencies": { - "agent-base": "^7.1.2", - "debug": "4" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/human-signals": { - "version": "2.1.0", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/ieee754": { - "version": "1.1.13", - "license": "BSD-3-Clause" - }, - "node_modules/ignore": { - "version": "7.0.5", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/import-local": { - "version": "3.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "dev": true, - "license": "ISC", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "license": "ISC" - }, - "node_modules/is-arguments": { - "version": "1.2.0", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-arrayish": { - "version": "0.2.1", - "dev": true, - "license": "MIT" - }, - "node_modules/is-buffer": { - "version": "2.0.5", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/is-callable": { - "version": "1.2.7", - "license": "MIT", - "engines": { - "node": ">= 0.4" + "keyv": "^4.5.4" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "engines": { + "node": ">=16" } }, - "node_modules/is-extglob": { - "version": "2.1.1", + "node_modules/flatted": { + "version": "3.4.2", "dev": true, + "license": "ISC" + }, + "node_modules/fluent-transpiler": { + "version": "0.2.1", "license": "MIT", - "engines": { - "node": ">=0.10.0" + "dependencies": { + "@fluent/syntax": "0.18.1", + "change-case": "4.1.2", + "commander": "9.4.0" + }, + "bin": { + "ftl": "cli.js" } }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", + "node_modules/fluent-transpiler/node_modules/commander": { + "version": "9.4.0", "license": "MIT", "engines": { - "node": ">=8" + "node": "^12.20.0 || >=14" } }, - "node_modules/is-generator-fn": { - "version": "2.1.0", - "dev": true, + "node_modules/follow-redirects": { + "version": "1.15.11", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], "license": "MIT", "engines": { - "node": ">=6" + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } } }, - "node_modules/is-generator-function": { - "version": "1.1.0", + "node_modules/for-each": { + "version": "0.3.5", "license": "MIT", "dependencies": { - "call-bound": "^1.0.3", - "get-proto": "^1.0.0", - "has-tostringtag": "^1.0.2", - "safe-regex-test": "^1.1.0" + "is-callable": "^1.2.7" }, "engines": { "node": ">= 0.4" @@ -7473,63 +5451,82 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-glob": { - "version": "4.0.3", + "node_modules/foreach": { + "version": "2.0.6", + "license": "MIT" + }, + "node_modules/foreground-child": { + "version": "3.3.1", "dev": true, - "license": "MIT", + "license": "ISC", "dependencies": { - "is-extglob": "^2.1.1" + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" }, "engines": { - "node": ">=0.10.0" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/is-node-process": { - "version": "1.2.0", - "license": "MIT" - }, - "node_modules/is-regex": { - "version": "1.2.1", + "node_modules/form-data": { + "version": "4.0.5", "license": "MIT", "dependencies": { - "call-bound": "^1.0.2", - "gopd": "^1.2.0", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" }, "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 6" } }, - "node_modules/is-retry-allowed": { - "version": "2.2.0", + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/is-stream": { - "version": "2.0.1", - "dev": true, + "node_modules/function-bind": { + "version": "1.1.2", "license": "MIT", - "engines": { - "node": ">=8" - }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-typed-array": { - "version": "1.1.15", + "node_modules/get-caller-file": { + "version": "2.0.5", + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", "license": "MIT", "dependencies": { - "which-typed-array": "^1.1.16" + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -7538,654 +5535,404 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/isarray": { - "version": "1.0.0", - "license": "MIT" - }, - "node_modules/isexe": { - "version": "2.0.0", - "dev": true, - "license": "ISC" - }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.2", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument": { - "version": "6.0.3", - "dev": true, - "license": "BSD-3-Clause", + "node_modules/get-proto": { + "version": "1.0.1", + "license": "MIT", "dependencies": { - "@babel/core": "^7.23.9", - "@babel/parser": "^7.23.9", - "@istanbuljs/schema": "^0.1.3", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^7.5.4" + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" }, "engines": { - "node": ">=10" + "node": ">= 0.4" } }, - "node_modules/istanbul-lib-report": { - "version": "3.0.1", + "node_modules/glob": { + "version": "10.5.0", "dev": true, - "license": "BSD-3-Clause", + "license": "ISC", "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^4.0.0", - "supports-color": "^7.1.0" + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" }, - "engines": { - "node": ">=10" + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/istanbul-lib-source-maps": { - "version": "5.0.6", + "node_modules/glob-parent": { + "version": "6.0.2", "dev": true, - "license": "BSD-3-Clause", + "license": "ISC", "dependencies": { - "@jridgewell/trace-mapping": "^0.3.23", - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0" + "is-glob": "^4.0.3" }, "engines": { - "node": ">=10" + "node": ">=10.13.0" } }, - "node_modules/istanbul-reports": { - "version": "3.2.0", + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "license": "BSD-2-Clause" + }, + "node_modules/globals": { + "version": "17.4.0", "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, + "license": "MIT", "engines": { - "node": ">=8" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/jackspeak": { - "version": "3.4.3", + "node_modules/globrex": { + "version": "0.1.2", "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^8.0.2" + "license": "MIT" + }, + "node_modules/gopd": { + "version": "1.2.0", + "license": "MIT", + "engines": { + "node": ">= 0.4" }, "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest": { - "version": "30.3.0", - "dev": true, + "node_modules/graceful-fs": { + "version": "4.2.11", + "license": "ISC" + }, + "node_modules/gsul": { + "resolved": "packages/gsul", + "link": true + }, + "node_modules/handlebars": { + "version": "4.7.9", "license": "MIT", "dependencies": { - "@jest/core": "30.3.0", - "@jest/types": "30.3.0", - "import-local": "^3.2.0", - "jest-cli": "30.3.0" + "minimist": "^1.2.5", + "neo-async": "^2.6.2", + "source-map": "^0.6.1", + "wordwrap": "^1.0.0" }, "bin": { - "jest": "bin/jest.js" + "handlebars": "bin/handlebars" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + "node": ">=0.4.7" }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } + "optionalDependencies": { + "uglify-js": "^3.1.4" } }, - "node_modules/jest-changed-files": { - "version": "30.3.0", - "dev": true, + "node_modules/has-flag": { + "version": "4.0.0", "license": "MIT", - "dependencies": { - "execa": "^5.1.1", - "jest-util": "30.3.0", - "p-limit": "^3.1.0" - }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">=8" } }, - "node_modules/jest-circus": { - "version": "30.3.0", - "dev": true, + "node_modules/has-property-descriptors": { + "version": "1.0.2", "license": "MIT", "dependencies": { - "@jest/environment": "30.3.0", - "@jest/expect": "30.3.0", - "@jest/test-result": "30.3.0", - "@jest/types": "30.3.0", - "@types/node": "*", - "chalk": "^4.1.2", - "co": "^4.6.0", - "dedent": "^1.6.0", - "is-generator-fn": "^2.1.0", - "jest-each": "30.3.0", - "jest-matcher-utils": "30.3.0", - "jest-message-util": "30.3.0", - "jest-runtime": "30.3.0", - "jest-snapshot": "30.3.0", - "jest-util": "30.3.0", - "p-limit": "^3.1.0", - "pretty-format": "30.3.0", - "pure-rand": "^7.0.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.6" + "es-define-property": "^1.0.0" }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-cli": { - "version": "30.3.0", - "dev": true, + "node_modules/has-symbols": { + "version": "1.1.0", "license": "MIT", - "dependencies": { - "@jest/core": "30.3.0", - "@jest/test-result": "30.3.0", - "@jest/types": "30.3.0", - "chalk": "^4.1.2", - "exit-x": "^0.2.2", - "import-local": "^3.2.0", - "jest-config": "30.3.0", - "jest-util": "30.3.0", - "jest-validate": "30.3.0", - "yargs": "^17.7.2" - }, - "bin": { - "jest": "bin/jest.js" - }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + "node": ">= 0.4" }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-config": { - "version": "30.3.0", - "dev": true, + "node_modules/has-tostringtag": { + "version": "1.0.2", "license": "MIT", "dependencies": { - "@babel/core": "^7.27.4", - "@jest/get-type": "30.1.0", - "@jest/pattern": "30.0.1", - "@jest/test-sequencer": "30.3.0", - "@jest/types": "30.3.0", - "babel-jest": "30.3.0", - "chalk": "^4.1.2", - "ci-info": "^4.2.0", - "deepmerge": "^4.3.1", - "glob": "^10.5.0", - "graceful-fs": "^4.2.11", - "jest-circus": "30.3.0", - "jest-docblock": "30.2.0", - "jest-environment-node": "30.3.0", - "jest-regex-util": "30.0.1", - "jest-resolve": "30.3.0", - "jest-runner": "30.3.0", - "jest-util": "30.3.0", - "jest-validate": "30.3.0", - "parse-json": "^5.2.0", - "pretty-format": "30.3.0", - "slash": "^3.0.0", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "has-symbols": "^1.0.3" }, - "peerDependencies": { - "@types/node": "*", - "esbuild-register": ">=3.4.0", - "ts-node": ">=9.0.0" + "engines": { + "node": ">= 0.4" }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "esbuild-register": { - "optional": true - }, - "ts-node": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-diff": { - "version": "30.3.0", - "dev": true, + "node_modules/hasown": { + "version": "2.0.2", "license": "MIT", "dependencies": { - "@jest/diff-sequences": "30.3.0", - "@jest/get-type": "30.1.0", - "chalk": "^4.1.2", - "pretty-format": "30.3.0" + "function-bind": "^1.1.2" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">= 0.4" } }, - "node_modules/jest-docblock": { - "version": "30.2.0", - "dev": true, + "node_modules/header-case": { + "version": "2.0.4", "license": "MIT", "dependencies": { - "detect-newline": "^3.1.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "capital-case": "^1.0.4", + "tslib": "^2.0.3" } }, - "node_modules/jest-each": { - "version": "30.3.0", + "node_modules/html-escaper": { + "version": "2.0.2", "dev": true, + "license": "MIT" + }, + "node_modules/http2-client": { + "version": "1.3.5", + "license": "MIT" + }, + "node_modules/https-proxy-agent": { + "version": "7.0.6", "license": "MIT", "dependencies": { - "@jest/get-type": "30.1.0", - "@jest/types": "30.3.0", - "chalk": "^4.1.2", - "jest-util": "30.3.0", - "pretty-format": "30.3.0" + "agent-base": "^7.1.2", + "debug": "4" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">= 14" } }, - "node_modules/jest-environment-node": { - "version": "30.3.0", + "node_modules/ieee754": { + "version": "1.1.13", + "license": "BSD-3-Clause" + }, + "node_modules/ignore": { + "version": "7.0.5", "dev": true, "license": "MIT", - "dependencies": { - "@jest/environment": "30.3.0", - "@jest/fake-timers": "30.3.0", - "@jest/types": "30.3.0", - "@types/node": "*", - "jest-mock": "30.3.0", - "jest-util": "30.3.0", - "jest-validate": "30.3.0" - }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">= 4" } }, - "node_modules/jest-haste-map": { - "version": "30.3.0", + "node_modules/imurmurhash": { + "version": "0.1.4", "dev": true, "license": "MIT", - "dependencies": { - "@jest/types": "30.3.0", - "@types/node": "*", - "anymatch": "^3.1.3", - "fb-watchman": "^2.0.2", - "graceful-fs": "^4.2.11", - "jest-regex-util": "30.0.1", - "jest-util": "30.3.0", - "jest-worker": "30.3.0", - "picomatch": "^4.0.3", - "walker": "^1.0.8" - }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "optionalDependencies": { - "fsevents": "^2.3.3" + "node": ">=0.8.19" } }, - "node_modules/jest-junit": { - "version": "16.0.0", - "dev": true, - "license": "Apache-2.0", + "node_modules/inherits": { + "version": "2.0.4", + "license": "ISC" + }, + "node_modules/is-arguments": { + "version": "1.2.0", + "license": "MIT", "dependencies": { - "mkdirp": "^1.0.4", - "strip-ansi": "^6.0.1", - "uuid": "^8.3.2", - "xml": "^1.0.1" + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" }, "engines": { - "node": ">=10.12.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-junit/node_modules/ansi-regex": { - "version": "5.0.1", + "node_modules/is-buffer": { + "version": "2.0.5", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], "license": "MIT", "engines": { - "node": ">=8" + "node": ">=4" } }, - "node_modules/jest-junit/node_modules/strip-ansi": { - "version": "6.0.1", - "dev": true, + "node_modules/is-callable": { + "version": "1.2.7", "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, "engines": { - "node": ">=8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-junit/node_modules/uuid": { - "version": "8.3.2", + "node_modules/is-extglob": { + "version": "2.1.1", "dev": true, "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" + "engines": { + "node": ">=0.10.0" } }, - "node_modules/jest-leak-detector": { - "version": "30.3.0", - "dev": true, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", "license": "MIT", - "dependencies": { - "@jest/get-type": "30.1.0", - "pretty-format": "30.3.0" - }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">=8" } }, - "node_modules/jest-matcher-utils": { - "version": "30.3.0", - "dev": true, + "node_modules/is-generator-function": { + "version": "1.1.0", "license": "MIT", "dependencies": { - "@jest/get-type": "30.1.0", - "chalk": "^4.1.2", - "jest-diff": "30.3.0", - "pretty-format": "30.3.0" + "call-bound": "^1.0.3", + "get-proto": "^1.0.0", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-message-util": { - "version": "30.3.0", + "node_modules/is-glob": { + "version": "4.0.3", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.27.1", - "@jest/types": "30.3.0", - "@types/stack-utils": "^2.0.3", - "chalk": "^4.1.2", - "graceful-fs": "^4.2.11", - "picomatch": "^4.0.3", - "pretty-format": "30.3.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.6" + "is-extglob": "^2.1.1" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">=0.10.0" } }, - "node_modules/jest-mock": { - "version": "30.3.0", - "dev": true, + "node_modules/is-node-process": { + "version": "1.2.0", + "license": "MIT" + }, + "node_modules/is-regex": { + "version": "1.2.1", "license": "MIT", "dependencies": { - "@jest/types": "30.3.0", - "@types/node": "*", - "jest-util": "30.3.0" + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-pnp-resolver": { - "version": "1.2.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - }, - "peerDependencies": { - "jest-resolve": "*" + "node": ">= 0.4" }, - "peerDependenciesMeta": { - "jest-resolve": { - "optional": true - } + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-regex-util": { - "version": "30.0.1", - "dev": true, + "node_modules/is-retry-allowed": { + "version": "2.2.0", "license": "MIT", "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-resolve": { - "version": "30.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.1.2", - "graceful-fs": "^4.2.11", - "jest-haste-map": "30.3.0", - "jest-pnp-resolver": "^1.2.3", - "jest-util": "30.3.0", - "jest-validate": "30.3.0", - "slash": "^3.0.0", - "unrs-resolver": "^1.7.11" + "node": ">=10" }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/jest-resolve-dependencies": { - "version": "30.3.0", - "dev": true, + "node_modules/is-typed-array": { + "version": "1.1.15", "license": "MIT", "dependencies": { - "jest-regex-util": "30.0.1", - "jest-snapshot": "30.3.0" + "which-typed-array": "^1.1.16" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/jest-runner": { - "version": "30.3.0", + "node_modules/isarray": { + "version": "1.0.0", + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", "dev": true, - "license": "MIT", - "dependencies": { - "@jest/console": "30.3.0", - "@jest/environment": "30.3.0", - "@jest/test-result": "30.3.0", - "@jest/transform": "30.3.0", - "@jest/types": "30.3.0", - "@types/node": "*", - "chalk": "^4.1.2", - "emittery": "^0.13.1", - "exit-x": "^0.2.2", - "graceful-fs": "^4.2.11", - "jest-docblock": "30.2.0", - "jest-environment-node": "30.3.0", - "jest-haste-map": "30.3.0", - "jest-leak-detector": "30.3.0", - "jest-message-util": "30.3.0", - "jest-resolve": "30.3.0", - "jest-runtime": "30.3.0", - "jest-util": "30.3.0", - "jest-watcher": "30.3.0", - "jest-worker": "30.3.0", - "p-limit": "^3.1.0", - "source-map-support": "0.5.13" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-runtime": { - "version": "30.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/environment": "30.3.0", - "@jest/fake-timers": "30.3.0", - "@jest/globals": "30.3.0", - "@jest/source-map": "30.0.1", - "@jest/test-result": "30.3.0", - "@jest/transform": "30.3.0", - "@jest/types": "30.3.0", - "@types/node": "*", - "chalk": "^4.1.2", - "cjs-module-lexer": "^2.1.0", - "collect-v8-coverage": "^1.0.2", - "glob": "^10.5.0", - "graceful-fs": "^4.2.11", - "jest-haste-map": "30.3.0", - "jest-message-util": "30.3.0", - "jest-mock": "30.3.0", - "jest-regex-util": "30.0.1", - "jest-resolve": "30.3.0", - "jest-snapshot": "30.3.0", - "jest-util": "30.3.0", - "slash": "^3.0.0", - "strip-bom": "^4.0.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-snapshot": { - "version": "30.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.27.4", - "@babel/generator": "^7.27.5", - "@babel/plugin-syntax-jsx": "^7.27.1", - "@babel/plugin-syntax-typescript": "^7.27.1", - "@babel/types": "^7.27.3", - "@jest/expect-utils": "30.3.0", - "@jest/get-type": "30.1.0", - "@jest/snapshot-utils": "30.3.0", - "@jest/transform": "30.3.0", - "@jest/types": "30.3.0", - "babel-preset-current-node-syntax": "^1.2.0", - "chalk": "^4.1.2", - "expect": "30.3.0", - "graceful-fs": "^4.2.11", - "jest-diff": "30.3.0", - "jest-matcher-utils": "30.3.0", - "jest-message-util": "30.3.0", - "jest-util": "30.3.0", - "pretty-format": "30.3.0", - "semver": "^7.7.2", - "synckit": "^0.11.8" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } + "license": "ISC" }, - "node_modules/jest-util": { - "version": "30.3.0", + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "30.3.0", - "@types/node": "*", - "chalk": "^4.1.2", - "ci-info": "^4.2.0", - "graceful-fs": "^4.2.11", - "picomatch": "^4.0.3" - }, + "license": "BSD-3-Clause", "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">=8" } }, - "node_modules/jest-validate": { - "version": "30.3.0", + "node_modules/istanbul-lib-report": { + "version": "3.0.1", "dev": true, - "license": "MIT", + "license": "BSD-3-Clause", "dependencies": { - "@jest/get-type": "30.1.0", - "@jest/types": "30.3.0", - "camelcase": "^6.3.0", - "chalk": "^4.1.2", - "leven": "^3.1.0", - "pretty-format": "30.3.0" + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-validate/node_modules/camelcase": { - "version": "6.3.0", - "dev": true, - "license": "MIT", "engines": { "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/jest-watcher": { - "version": "30.3.0", + "node_modules/istanbul-lib-source-maps": { + "version": "5.0.6", "dev": true, - "license": "MIT", + "license": "BSD-3-Clause", "dependencies": { - "@jest/test-result": "30.3.0", - "@jest/types": "30.3.0", - "@types/node": "*", - "ansi-escapes": "^4.3.2", - "chalk": "^4.1.2", - "emittery": "^0.13.1", - "jest-util": "30.3.0", - "string-length": "^4.0.2" + "@jridgewell/trace-mapping": "^0.3.23", + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">=10" } }, - "node_modules/jest-worker": { - "version": "30.3.0", + "node_modules/istanbul-reports": { + "version": "3.2.0", "dev": true, - "license": "MIT", + "license": "BSD-3-Clause", "dependencies": { - "@types/node": "*", - "@ungap/structured-clone": "^1.3.0", - "jest-util": "30.3.0", - "merge-stream": "^2.0.0", - "supports-color": "^8.1.1" + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" }, "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" + "node": ">=8" } }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", + "node_modules/jackspeak": { + "version": "3.4.3", "dev": true, - "license": "MIT", + "license": "BlueOak-1.0.0", "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" + "@isaacs/cliui": "^8.0.2" }, "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" } }, "node_modules/jmespath": { @@ -8224,27 +5971,11 @@ "js-yaml": "bin/js-yaml.js" } }, - "node_modules/jsesc": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/json-buffer": { "version": "3.0.1", "dev": true, "license": "MIT" }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "dev": true, - "license": "MIT" - }, "node_modules/json-pointer": { "version": "0.6.2", "license": "MIT", @@ -8276,17 +6007,6 @@ "version": "5.0.1", "license": "ISC" }, - "node_modules/json5": { - "version": "2.2.3", - "dev": true, - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/jsonpath-rfc9535": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/jsonpath-rfc9535/-/jsonpath-rfc9535-1.3.0.tgz", @@ -8337,11 +6057,6 @@ "node": ">= 0.8.0" } }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "dev": true, - "license": "MIT" - }, "node_modules/locate-path": { "version": "6.0.0", "dev": true, @@ -8356,11 +6071,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/lodash.memoize": { - "version": "4.1.2", - "dev": true, - "license": "MIT" - }, "node_modules/long": { "version": "5.3.2", "license": "Apache-2.0" @@ -8387,14 +6097,6 @@ "tslib": "^2.0.3" } }, - "node_modules/lru-cache": { - "version": "5.1.1", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" - } - }, "node_modules/lunr": { "version": "2.3.9", "license": "MIT" @@ -8436,14 +6138,6 @@ "dev": true, "license": "ISC" }, - "node_modules/makeerror": { - "version": "1.0.12", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "tmpl": "1.0.5" - } - }, "node_modules/mark.js": { "version": "8.11.1", "license": "MIT" @@ -8455,11 +6149,6 @@ "node": ">= 0.4" } }, - "node_modules/merge-stream": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, "node_modules/mime-db": { "version": "1.52.0", "license": "MIT", @@ -8477,14 +6166,6 @@ "node": ">= 0.6" } }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/minimatch": { "version": "9.0.9", "dev": true, @@ -8513,17 +6194,6 @@ "node": ">=16 || 14 >=14.17" } }, - "node_modules/mkdirp": { - "version": "1.0.4", - "dev": true, - "license": "MIT", - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/mnemonist": { "version": "0.38.3", "resolved": "https://registry.npmjs.org/mnemonist/-/mnemonist-0.38.3.tgz", @@ -8611,20 +6281,6 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/napi-postinstall": { - "version": "0.3.4", - "dev": true, - "license": "MIT", - "bin": { - "napi-postinstall": "lib/cli.js" - }, - "engines": { - "node": "^12.20.0 || ^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/napi-postinstall" - } - }, "node_modules/natural-compare": { "version": "1.4.0", "dev": true, @@ -8730,11 +6386,6 @@ "node": "4.x || >=6.0.0" } }, - "node_modules/node-int64": { - "version": "0.4.0", - "dev": true, - "license": "MIT" - }, "node_modules/node-readfiles": { "version": "0.2.0", "license": "MIT", @@ -8742,30 +6393,6 @@ "es6-promise": "^3.2.1" } }, - "node_modules/node-releases": { - "version": "2.0.21", - "dev": true, - "license": "MIT" - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/oas-kit-common": { "version": "1.0.8", "license": "BSD-3-Clause", @@ -8860,28 +6487,6 @@ "integrity": "sha512-9WXswnqINnnhOG/5SLimUlzuU1hFJUc8zkwyD59Sd+dPOMf05PmnYG/d6Q7HZ+KmgkZJa1PxRso6QdM3sTNHig==", "license": "MIT" }, - "node_modules/once": { - "version": "1.4.0", - "dev": true, - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "5.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/openapi-sampler": { "version": "1.7.1", "license": "MIT", @@ -8945,14 +6550,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/p-try": { - "version": "2.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/package-json-from-dist": { "version": "1.0.1", "dev": true, @@ -8966,23 +6563,6 @@ "tslib": "^2.0.3" } }, - "node_modules/parse-json": { - "version": "5.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/pascal-case": { "version": "3.1.2", "license": "MIT", @@ -9024,14 +6604,6 @@ "node": ">=14.0.0" } }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/path-key": { "version": "3.1.1", "dev": true, @@ -9100,73 +6672,6 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/pirates": { - "version": "4.0.7", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/find-up": { - "version": "4.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/locate-path": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/p-limit": { - "version": "2.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-dir/node_modules/p-locate": { - "version": "4.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/pluralize": { "version": "8.0.0", "license": "MIT", @@ -9259,32 +6764,8 @@ "dependencies": { "fast-diff": "^1.1.2" }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/pretty-format": { - "version": "30.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/schemas": "30.0.5", - "ansi-styles": "^5.2.0", - "react-is": "^18.3.1" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "engines": { + "node": ">=6.0.0" } }, "node_modules/prismjs": { @@ -9356,21 +6837,6 @@ "node": ">=6" } }, - "node_modules/pure-rand": { - "version": "7.0.1", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/dubzzz" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fast-check" - } - ], - "license": "MIT" - }, "node_modules/querystring": { "version": "0.2.0", "engines": { @@ -9434,11 +6900,6 @@ "react": "^19.2.1" } }, - "node_modules/react-is": { - "version": "18.3.1", - "dev": true, - "license": "MIT" - }, "node_modules/react-tabs": { "version": "6.1.0", "license": "MIT", @@ -9566,25 +7027,6 @@ "node": ">=0.10.0" } }, - "node_modules/resolve-cwd": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-from": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/ret": { "version": "0.1.15", "license": "MIT", @@ -9858,14 +7300,6 @@ "node": ">=0.3.1" } }, - "node_modules/slash": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/slugify": { "version": "1.4.7", "license": "MIT", @@ -9905,38 +7339,10 @@ "node": ">=0.10.0" } }, - "node_modules/source-map-support": { - "version": "0.5.13", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, "node_modules/sprintf-js": { "version": "1.0.3", "license": "BSD-3-Clause" }, - "node_modules/stack-utils": { - "version": "2.0.6", - "dev": true, - "license": "MIT", - "dependencies": { - "escape-string-regexp": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/stack-utils/node_modules/escape-string-regexp": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/stackback": { "version": "0.0.2", "dev": true, @@ -9965,37 +7371,6 @@ "safe-buffer": "~5.1.0" } }, - "node_modules/string-length": { - "version": "4.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/string-length/node_modules/ansi-regex": { - "version": "5.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/string-length/node_modules/strip-ansi": { - "version": "6.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/string-width": { "version": "5.1.2", "dev": true, @@ -10084,33 +7459,6 @@ "node": ">=8" } }, - "node_modules/strip-bom": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/strip-literal": { "version": "3.1.0", "dev": true, @@ -10228,58 +7576,6 @@ "url": "https://opencollective.com/synckit" } }, - "node_modules/test-exclude": { - "version": "6.0.0", - "dev": true, - "license": "ISC", - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/test-exclude/node_modules/brace-expansion": { - "version": "1.1.13", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/test-exclude/node_modules/glob": { - "version": "7.2.3", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/test-exclude/node_modules/minimatch": { - "version": "3.1.5", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/tinybench": { "version": "2.9.0", "dev": true, @@ -10329,11 +7625,6 @@ "node": ">=14.0.0" } }, - "node_modules/tmpl": { - "version": "1.0.5", - "dev": true, - "license": "BSD-3-Clause" - }, "node_modules/tr46": { "version": "0.0.3", "license": "MIT" @@ -10355,68 +7646,6 @@ "typescript": ">=4.8.4" } }, - "node_modules/ts-jest": { - "version": "29.4.6", - "dev": true, - "license": "MIT", - "dependencies": { - "bs-logger": "^0.2.6", - "fast-json-stable-stringify": "^2.1.0", - "handlebars": "^4.7.8", - "json5": "^2.2.3", - "lodash.memoize": "^4.1.2", - "make-error": "^1.3.6", - "semver": "^7.7.3", - "type-fest": "^4.41.0", - "yargs-parser": "^21.1.1" - }, - "bin": { - "ts-jest": "cli.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0" - }, - "peerDependencies": { - "@babel/core": ">=7.0.0-beta.0 <8", - "@jest/transform": "^29.0.0 || ^30.0.0", - "@jest/types": "^29.0.0 || ^30.0.0", - "babel-jest": "^29.0.0 || ^30.0.0", - "jest": "^29.0.0 || ^30.0.0", - "jest-util": "^29.0.0 || ^30.0.0", - "typescript": ">=4.3 <6" - }, - "peerDependenciesMeta": { - "@babel/core": { - "optional": true - }, - "@jest/transform": { - "optional": true - }, - "@jest/types": { - "optional": true - }, - "babel-jest": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "jest-util": { - "optional": true - } - } - }, - "node_modules/ts-jest/node_modules/type-fest": { - "version": "4.41.0", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/ts-md5": { "version": "2.0.1", "license": "MIT", @@ -10508,17 +7737,6 @@ "node": ">=4" } }, - "node_modules/type-fest": { - "version": "0.21.3", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/typescript": { "version": "5.9.3", "dev": true, @@ -10588,68 +7806,6 @@ "version": "0.0.0", "license": "MIT" }, - "node_modules/unrs-resolver": { - "version": "1.11.1", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "napi-postinstall": "^0.3.0" - }, - "funding": { - "url": "https://opencollective.com/unrs-resolver" - }, - "optionalDependencies": { - "@unrs/resolver-binding-android-arm-eabi": "1.11.1", - "@unrs/resolver-binding-android-arm64": "1.11.1", - "@unrs/resolver-binding-darwin-arm64": "1.11.1", - "@unrs/resolver-binding-darwin-x64": "1.11.1", - "@unrs/resolver-binding-freebsd-x64": "1.11.1", - "@unrs/resolver-binding-linux-arm-gnueabihf": "1.11.1", - "@unrs/resolver-binding-linux-arm-musleabihf": "1.11.1", - "@unrs/resolver-binding-linux-arm64-gnu": "1.11.1", - "@unrs/resolver-binding-linux-arm64-musl": "1.11.1", - "@unrs/resolver-binding-linux-ppc64-gnu": "1.11.1", - "@unrs/resolver-binding-linux-riscv64-gnu": "1.11.1", - "@unrs/resolver-binding-linux-riscv64-musl": "1.11.1", - "@unrs/resolver-binding-linux-s390x-gnu": "1.11.1", - "@unrs/resolver-binding-linux-x64-gnu": "1.11.1", - "@unrs/resolver-binding-linux-x64-musl": "1.11.1", - "@unrs/resolver-binding-wasm32-wasi": "1.11.1", - "@unrs/resolver-binding-win32-arm64-msvc": "1.11.1", - "@unrs/resolver-binding-win32-ia32-msvc": "1.11.1", - "@unrs/resolver-binding-win32-x64-msvc": "1.11.1" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.1.3", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "escalade": "^3.2.0", - "picocolors": "^1.1.1" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, "node_modules/updatePrescriptionStatus": { "resolved": "packages/updatePrescriptionStatus", "link": true @@ -10725,19 +7881,6 @@ "dev": true, "license": "MIT" }, - "node_modules/v8-to-istanbul": { - "version": "9.3.0", - "dev": true, - "license": "ISC", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.12", - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^2.0.0" - }, - "engines": { - "node": ">=10.12.0" - } - }, "node_modules/vite": { "version": "7.3.2", "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.2.tgz", @@ -10950,14 +8093,6 @@ } } }, - "node_modules/walker": { - "version": "1.0.8", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "makeerror": "1.0.12" - } - }, "node_modules/watchpack": { "version": "2.4.4", "license": "MIT", @@ -11122,23 +8257,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/wrappy": { - "version": "1.0.2", - "dev": true, - "license": "ISC" - }, - "node_modules/write-file-atomic": { - "version": "5.0.1", - "dev": true, - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, "node_modules/ws": { "version": "7.5.10", "license": "MIT", @@ -11158,11 +8276,6 @@ } } }, - "node_modules/xml": { - "version": "1.0.1", - "dev": true, - "license": "MIT" - }, "node_modules/xml2js": { "version": "0.6.2", "license": "MIT", @@ -11188,11 +8301,6 @@ "node": ">=10" } }, - "node_modules/yallist": { - "version": "3.1.1", - "dev": true, - "license": "ISC" - }, "node_modules/yaml": { "version": "2.8.3", "license": "ISC", From dc6bfba79c3a4c5cbb77613e9ad6bd8cbce98cfd Mon Sep 17 00:00:00 2001 From: tstephen-nhs <231503406+tstephen-nhs@users.noreply.github.com> Date: Thu, 9 Apr 2026 15:53:02 +0000 Subject: [PATCH 15/20] chore: yaml is dev dep --- packages/specification/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/specification/package.json b/packages/specification/package.json index d1d4ff25ae..1af0131868 100644 --- a/packages/specification/package.json +++ b/packages/specification/package.json @@ -18,9 +18,9 @@ }, "homepage": "https://github.com/NHSDigital/eps-prescription-status-update-api", "devDependencies": { + "yaml": "^2.8.3" }, "dependencies": { - "yaml": "^2.8.3", "@redocly/cli": "^2.25.2" } } From fe807b8fb1765b56170239ed818c794bd25472e6 Mon Sep 17 00:00:00 2001 From: tstephen-nhs <231503406+tstephen-nhs@users.noreply.github.com> Date: Thu, 9 Apr 2026 15:58:23 +0000 Subject: [PATCH 16/20] fix: sonar comments --- packages/nhsNotifyUpdateCallback/tests/testHelpers.test.ts | 7 +++---- .../src/updatePrescriptionStatus.ts | 6 +++--- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/packages/nhsNotifyUpdateCallback/tests/testHelpers.test.ts b/packages/nhsNotifyUpdateCallback/tests/testHelpers.test.ts index 08b54e5b6e..811a4b60d5 100644 --- a/packages/nhsNotifyUpdateCallback/tests/testHelpers.test.ts +++ b/packages/nhsNotifyUpdateCallback/tests/testHelpers.test.ts @@ -7,7 +7,7 @@ import { expect, type MockInstance } from "vitest" -import {createHmac} from "crypto" +import {createHmac} from "node:crypto" // Mock the getSecret call const mockGetSecret = vi.fn((secretName: string) => { @@ -25,7 +25,6 @@ vi.mock("@aws-lambda-powertools/parameters/secrets", async () => ({ })) import {DynamoDBDocumentClient, QueryCommand, UpdateCommand} from "@aws-sdk/lib-dynamodb" -import type {UpdateCommandInput} from "@aws-sdk/lib-dynamodb" import {Logger} from "@aws-lambda-powertools/logger" import {MessageStatusResponse} from "../src/types" import {generateMockChannelStatusResponse, generateMockEvent, generateMockMessageStatusResponse} from "./utilities" @@ -237,7 +236,7 @@ describe("helpers.ts", () => { await updateNotificationsTable(logger, mockResponse) const updateCmd = sendSpy.mock.calls[1][0] as UpdateCommand - const input = updateCmd.input as UpdateCommandInput + const input = updateCmd.input // Note that Javascript guarantees the order of this to be preserved, so we're okay to check values like this. // We should have only three statuses @@ -309,7 +308,7 @@ describe("helpers.ts", () => { await updateNotificationsTable(logger, mockResponse) const updateCmd = sendSpy.mock.calls[1][0] as UpdateCommand - const input = updateCmd.input as UpdateCommandInput + const input = updateCmd.input // Note that Javascript guarantees the order of this to be preserved, so we're okay to check values like this. // 5 defined key value pairs should be in there diff --git a/packages/updatePrescriptionStatus/src/updatePrescriptionStatus.ts b/packages/updatePrescriptionStatus/src/updatePrescriptionStatus.ts index bd563e7625..ef2fa51b5a 100644 --- a/packages/updatePrescriptionStatus/src/updatePrescriptionStatus.ts +++ b/packages/updatePrescriptionStatus/src/updatePrescriptionStatus.ts @@ -341,10 +341,10 @@ export function handleTransactionCancelledException( return entryTaskId === taskId }) - if (index !== -1) { - responseEntries[index] = conflictedEntry - } else { + if (index === -1) { responseEntries.push(conflictedEntry) + } else { + responseEntries[index] = conflictedEntry } taskIdSet.add(taskId) From 0679ba65e6fcfa755fe0718fed93af49304da328 Mon Sep 17 00:00:00 2001 From: tstephen-nhs <231503406+tstephen-nhs@users.noreply.github.com> Date: Thu, 9 Apr 2026 16:11:33 +0000 Subject: [PATCH 17/20] fix: global imports --- packages/nhsNotifyLambda/tests/notify.test.ts | 8 +++++++- packages/nhsNotifyLambda/tests/testAuth.test.ts | 9 ++++++++- .../nhsNotifyLambda/tests/testNhsNotifyLambda.test.ts | 1 + packages/nhsNotifyLambda/tests/testSecrets.test.ts | 8 +++++++- packages/nhsNotifyLambda/tests/testUtils.test.ts | 10 +++++++++- 5 files changed, 32 insertions(+), 4 deletions(-) diff --git a/packages/nhsNotifyLambda/tests/notify.test.ts b/packages/nhsNotifyLambda/tests/notify.test.ts index 6cbe1e66b7..25e4e7289b 100644 --- a/packages/nhsNotifyLambda/tests/notify.test.ts +++ b/packages/nhsNotifyLambda/tests/notify.test.ts @@ -1,4 +1,10 @@ -import {vi, describe, it} from "vitest" +import { + vi, + describe, + it, + expect, + beforeEach +} from "vitest" import {Logger} from "@aws-lambda-powertools/logger" import {logNotificationRequest} from "../src/utils/notify" diff --git a/packages/nhsNotifyLambda/tests/testAuth.test.ts b/packages/nhsNotifyLambda/tests/testAuth.test.ts index 1ded41cda6..40e371e999 100644 --- a/packages/nhsNotifyLambda/tests/testAuth.test.ts +++ b/packages/nhsNotifyLambda/tests/testAuth.test.ts @@ -1,4 +1,11 @@ -import {vi} from "vitest" +import { + vi, + describe, + it, + expect, + beforeAll, + beforeEach +} from "vitest" import nock from "nock" import {Logger} from "@aws-lambda-powertools/logger" diff --git a/packages/nhsNotifyLambda/tests/testNhsNotifyLambda.test.ts b/packages/nhsNotifyLambda/tests/testNhsNotifyLambda.test.ts index 4d66da705e..6e769ba8b1 100644 --- a/packages/nhsNotifyLambda/tests/testNhsNotifyLambda.test.ts +++ b/packages/nhsNotifyLambda/tests/testNhsNotifyLambda.test.ts @@ -2,6 +2,7 @@ import { vi, describe, it, + expect, beforeAll, beforeEach, afterEach diff --git a/packages/nhsNotifyLambda/tests/testSecrets.test.ts b/packages/nhsNotifyLambda/tests/testSecrets.test.ts index bed9ddb389..9785ef3791 100644 --- a/packages/nhsNotifyLambda/tests/testSecrets.test.ts +++ b/packages/nhsNotifyLambda/tests/testSecrets.test.ts @@ -1,4 +1,10 @@ -import {vi} from "vitest" +import { + vi, + describe, + it, + expect, + beforeEach +} from "vitest" const {mockGetSecret} = vi.hoisted(() => ({ mockGetSecret: vi.fn<() => Promise>() diff --git a/packages/nhsNotifyLambda/tests/testUtils.test.ts b/packages/nhsNotifyLambda/tests/testUtils.test.ts index cb07ce5fc6..cb5f1f0cb5 100644 --- a/packages/nhsNotifyLambda/tests/testUtils.test.ts +++ b/packages/nhsNotifyLambda/tests/testUtils.test.ts @@ -1,4 +1,12 @@ -import {vi} from "vitest" +import { + vi, + describe, + it, + expect, + beforeEach, + afterEach, + afterAll +} from "vitest" import nock from "nock" import axiosRetry from "axios-retry" From 39a0390bff2fa22733eff63e24c8826320c767b6 Mon Sep 17 00:00:00 2001 From: tstephen-nhs <231503406+tstephen-nhs@users.noreply.github.com> Date: Thu, 9 Apr 2026 16:16:35 +0000 Subject: [PATCH 18/20] fix: sonar comments --- .../nhsNotifyLambda/tests/testUtils.test.ts | 20 ++++++++----------- 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/packages/nhsNotifyLambda/tests/testUtils.test.ts b/packages/nhsNotifyLambda/tests/testUtils.test.ts index cb5f1f0cb5..67605dcc38 100644 --- a/packages/nhsNotifyLambda/tests/testUtils.test.ts +++ b/packages/nhsNotifyLambda/tests/testUtils.test.ts @@ -28,12 +28,10 @@ const { mockNotifyRequestMaxItems, mockNotifyRequestMaxBytes } = vi.hoisted(() => ({ - mockGetParametersByName: vi.fn(async () => Promise.resolve( - { - [process.env.NOTIFY_API_BASE_URL_PARAM!]: "https://example.com", - [process.env.MAKE_REAL_NOTIFY_REQUESTS_PARAM!]: "true" - } - )), + mockGetParametersByName: vi.fn(async () => ({ + [process.env.NOTIFY_API_BASE_URL_PARAM!]: "https://example.com", + [process.env.MAKE_REAL_NOTIFY_REQUESTS_PARAM!]: "true" + })), mockGetSecret: vi.fn().mockImplementation(() => "secret_value"), mockTokenExchange: vi.fn().mockImplementation(() => Promise.resolve("bearer token")), mockNotifyRequestMaxItems: 5, @@ -905,12 +903,10 @@ describe("NHS notify lambda helper functions", () => { }) it("uses a dummy call when the MAKE_REAL_NOTIFY_REQUESTS_PARAM is false", async () => { - mockGetParametersByName.mockImplementation(async () => Promise.resolve( - { - [process.env.NOTIFY_API_BASE_URL_PARAM!]: TEST_URL, - [process.env.MAKE_REAL_NOTIFY_REQUESTS_PARAM!]: "false" - } - )) + mockGetParametersByName.mockImplementation(async () => ({ + [process.env.NOTIFY_API_BASE_URL_PARAM!]: TEST_URL, + [process.env.MAKE_REAL_NOTIFY_REQUESTS_PARAM!]: "false" + })) const {handleNotifyRequests: fn} = await import("../src/utils") const data = [ From ac498212b8ac7bf26cb74df6e22e5be41d3cc5a0 Mon Sep 17 00:00:00 2001 From: tstephen-nhs <231503406+tstephen-nhs@users.noreply.github.com> Date: Thu, 9 Apr 2026 16:32:47 +0000 Subject: [PATCH 19/20] fix: avoid double spying --- packages/nhsNotifyLambda/tests/testUtils.test.ts | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/packages/nhsNotifyLambda/tests/testUtils.test.ts b/packages/nhsNotifyLambda/tests/testUtils.test.ts index 67605dcc38..dfcf78c343 100644 --- a/packages/nhsNotifyLambda/tests/testUtils.test.ts +++ b/packages/nhsNotifyLambda/tests/testUtils.test.ts @@ -398,7 +398,7 @@ describe("NHS notify lambda helper functions", () => { let logger: Logger let infoSpy: Spy let errorSpy: Spy - let sendSpy = vi.spyOn(DynamoDBDocumentClient.prototype, "send") + let sendSpy: Spy beforeEach(() => { vi.resetModules() @@ -409,7 +409,7 @@ describe("NHS notify lambda helper functions", () => { logger = new Logger({serviceName: "test-service"}) infoSpy = vi.spyOn(logger, "info") errorSpy = vi.spyOn(logger, "error") - sendSpy = vi.spyOn(DynamoDBDocumentClient.prototype, "send") + sendSpy = vi.spyOn(DynamoDBDocumentClient.prototype, "send") as unknown as Spy }) it("throws and logs error if TABLE_NAME is not set", async () => { @@ -479,7 +479,7 @@ describe("NHS notify lambda helper functions", () => { let logger: Logger let infoSpy: Spy let errorSpy: Spy - let sendSpy = vi.spyOn(DynamoDBDocumentClient.prototype, "send") + let sendSpy: Spy beforeEach(async () => { vi.resetModules() @@ -490,7 +490,11 @@ describe("NHS notify lambda helper functions", () => { logger = new Logger({serviceName: "test-service"}) infoSpy = vi.spyOn(logger, "info") errorSpy = vi.spyOn(logger, "error") - sendSpy = vi.spyOn(DynamoDBDocumentClient.prototype, "send") + sendSpy = vi.spyOn(DynamoDBDocumentClient.prototype, "send") as unknown as Spy + }) + + afterEach(() => { + sendSpy.mockRestore() }) afterAll(() => { From 4cff347995798332cc0a819494bcdb8d1cac21d6 Mon Sep 17 00:00:00 2001 From: tstephen-nhs <231503406+tstephen-nhs@users.noreply.github.com> Date: Thu, 9 Apr 2026 16:38:19 +0000 Subject: [PATCH 20/20] chore: remove dead code --- .../tests/utils/testUtils.ts | 22 ------------------- 1 file changed, 22 deletions(-) diff --git a/packages/updatePrescriptionStatus/tests/utils/testUtils.ts b/packages/updatePrescriptionStatus/tests/utils/testUtils.ts index 059d156b5e..90db173ce7 100644 --- a/packages/updatePrescriptionStatus/tests/utils/testUtils.ts +++ b/packages/updatePrescriptionStatus/tests/utils/testUtils.ts @@ -157,28 +157,6 @@ export function generateExpectedItems(itemCount: number = 1) { return {input: {TransactItems: items}} } -// Deprecated: use vi.hoisted() + vi.mock() in the consuming test file instead. -export function mockInternalDependency(): never { - throw new Error( - "mockInternalDependency() is not supported with Vitest. " + - "Use vi.hoisted() + vi.mock() in the test file instead." - ) -} - -export function mockDynamoDBClient(): never { - throw new Error( - "mockDynamoDBClient() is not supported with Vitest. " + - "Use vi.hoisted() + vi.mock() in the test file instead." - ) -} - -export function mockSQSClient(): never { - throw new Error( - "mockSQSClient() is not supported with Vitest. " + - "Use vi.hoisted() + vi.mock() in the test file instead." - ) -} - export function createMockDataItem(overrides: Partial): PSUDataItem { return { LastModified: "2023-01-02T00:00:00Z",