diff --git a/.github/scripts/release_code.sh b/.github/scripts/release_code.sh index ff38ec011..0f3ede06c 100755 --- a/.github/scripts/release_code.sh +++ b/.github/scripts/release_code.sh @@ -49,4 +49,7 @@ sam deploy \ ToggleGetStatusUpdates="$TOGGLE_GET_STATUS_UPDATES" \ EnableAlerts="$ENABLE_ALERTS" \ StateMachineLogLevel="$STATE_MACHINE_LOG_LEVEL" \ - ForwardCsocLogs="$FORWARD_CSOC_LOGS" + ForwardCsocLogs="$FORWARD_CSOC_LOGS" \ + TC007NHSNumberValue="$TC007_NHS_NUMBERS" \ + TC008NHSNumberValue="$TC008_NHS_NUMBERS" \ + TC009NHSNumberValue="$TC009_NHS_NUMBERS" diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 5353a8e87..41c38b7f9 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -75,6 +75,9 @@ jobs: RUN_REGRESSION_TESTS: true REGRESSION_TEST_PRODUCT: PFP-APIGEE FORWARD_CSOC_LOGS: false + TC007_NHS_NUMBERS: ${{vars.TC007_NHS_NUMBERS}} + TC008_NHS_NUMBERS: ${{vars.TC008_NHS_NUMBERS}} + TC009_NHS_NUMBERS: ${{vars.TC009_NHS_NUMBERS}} secrets: REGRESSION_TESTS_PEM: ${{ secrets.REGRESSION_TESTS_PEM }} CLOUD_FORMATION_DEPLOY_ROLE: ${{ secrets.DEV_CLOUD_FORMATION_DEPLOY_ROLE }} @@ -103,6 +106,9 @@ jobs: STATE_MACHINE_LOG_LEVEL: ALL RUN_REGRESSION_TESTS: false FORWARD_CSOC_LOGS: false + TC007_NHS_NUMBERS: ${{vars.TC007_NHS_NUMBERS}} + TC008_NHS_NUMBERS: ${{vars.TC008_NHS_NUMBERS}} + TC009_NHS_NUMBERS: ${{vars.TC009_NHS_NUMBERS}} secrets: REGRESSION_TESTS_PEM: ${{ secrets.REGRESSION_TESTS_PEM }} CLOUD_FORMATION_DEPLOY_ROLE: ${{ secrets.DEV_CLOUD_FORMATION_DEPLOY_ROLE }} @@ -136,6 +142,9 @@ jobs: STATE_MACHINE_LOG_LEVEL: ERROR RUN_REGRESSION_TESTS: false FORWARD_CSOC_LOGS: false + TC007_NHS_NUMBERS: ${{vars.TC007_NHS_NUMBERS}} + TC008_NHS_NUMBERS: ${{vars.TC008_NHS_NUMBERS}} + TC009_NHS_NUMBERS: ${{vars.TC009_NHS_NUMBERS}} secrets: REGRESSION_TESTS_PEM: ${{ secrets.REGRESSION_TESTS_PEM }} CLOUD_FORMATION_DEPLOY_ROLE: ${{ secrets.REF_CLOUD_FORMATION_DEPLOY_ROLE }} @@ -170,6 +179,9 @@ jobs: RUN_REGRESSION_TESTS: true REGRESSION_TEST_PRODUCT: PFP-APIGEE FORWARD_CSOC_LOGS: false + TC007_NHS_NUMBERS: ${{vars.TC007_NHS_NUMBERS}} + TC008_NHS_NUMBERS: ${{vars.TC008_NHS_NUMBERS}} + TC009_NHS_NUMBERS: ${{vars.TC009_NHS_NUMBERS}} secrets: REGRESSION_TESTS_PEM: ${{ secrets.REGRESSION_TESTS_PEM }} CLOUD_FORMATION_DEPLOY_ROLE: ${{ secrets.QA_CLOUD_FORMATION_DEPLOY_ROLE }} @@ -199,6 +211,9 @@ jobs: RUN_REGRESSION_TESTS: true REGRESSION_TEST_PRODUCT: PFP-APIGEE FORWARD_CSOC_LOGS: false + TC007_NHS_NUMBERS: ${{vars.TC007_NHS_NUMBERS}} + TC008_NHS_NUMBERS: ${{vars.TC008_NHS_NUMBERS}} + TC009_NHS_NUMBERS: ${{vars.TC009_NHS_NUMBERS}} secrets: REGRESSION_TESTS_PEM: ${{ secrets.REGRESSION_TESTS_PEM }} CLOUD_FORMATION_DEPLOY_ROLE: ${{ secrets.INT_CLOUD_FORMATION_DEPLOY_ROLE }} diff --git a/.github/workflows/sam_release_code.yml b/.github/workflows/sam_release_code.yml index 06a7bee13..e71e3d638 100644 --- a/.github/workflows/sam_release_code.yml +++ b/.github/workflows/sam_release_code.yml @@ -66,6 +66,15 @@ on: FORWARD_CSOC_LOGS: required: true type: boolean + TC007_NHS_NUMBERS: + required: false + type: string + TC008_NHS_NUMBERS: + required: false + type: string + TC009_NHS_NUMBERS: + required: false + type: string secrets: CLOUD_FORMATION_DEPLOY_ROLE: required: true @@ -146,6 +155,9 @@ jobs: ENABLE_ALERTS: ${{ inputs.ENABLE_ALERTS }} STATE_MACHINE_LOG_LEVEL: ${{ inputs.STATE_MACHINE_LOG_LEVEL }} FORWARD_CSOC_LOGS: ${{ inputs.FORWARD_CSOC_LOGS }} + TC007_NHS_NUMBERS: ${{ inputs.TC007_NHS_NUMBERS || '9992387920' }} + TC008_NHS_NUMBERS: ${{ inputs.TC008_NHS_NUMBERS || '9992387920' }} + TC009_NHS_NUMBERS: ${{ inputs.TC009_NHS_NUMBERS || '9992387920' }} run: ./release_code.sh - name: create_int_release_notes diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index f6212356a..8f8f12cc4 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -86,6 +86,15 @@ repos: types_or: [ts, tsx, javascript, jsx, json] pass_filenames: false + - id: lint-common-utilities + name: Lint common utilities + entry: npm + args: ["run", "--prefix=packages/common/utilities", "lint"] + language: system + files: ^packages\/common\/src + types_or: [ts, tsx, javascript, jsx, json] + pass_filenames: false + - id: lint-common-testing name: Lint common testing entry: npm diff --git a/Makefile b/Makefile index d7c55f2c3..f3800ca4d 100644 --- a/Makefile +++ b/Makefile @@ -125,6 +125,7 @@ lint-node: compile-node npm run lint --workspace packages/nhsd-pfp-sandbox npm run lint --workspace packages/statusLambda npm run lint --workspace packages/serviceSearchClient + npm run lint --workspace packages/common/utilities npm run lint --workspace packages/common/testing npm run lint --workspace packages/distanceSelling @@ -147,6 +148,8 @@ test: compile npm run test --workspace packages/statusLambda npm run test --workspace packages/serviceSearchClient npm run test --workspace packages/distanceSelling + npm run test --workspace packages/common/utilities + npm run test --workspace packages/common/testing clean: rm -rf packages/capabilityStatement/coverage @@ -165,6 +168,7 @@ clean: rm -rf packages/distanceSelling/lib rm -rf packages/statusLambda/lib rm -rf packages/getSecretLayer/lib + rm -rf packages/common/utilities/lib rm -rf packages/common/testing/lib rm -rf .aws-sam diff --git a/README.md b/README.md index 150b2f4db..3a13e56ae 100644 --- a/README.md +++ b/README.md @@ -21,6 +21,7 @@ It is called by an Apigee proxy that is defined at - + SSM Parameter Store entries. Values may differ between prod and non-prod environments + +Parameters: + StackName: + Type: String + + TC007NHSNumberValue: + Type: String + + TC008NHSNumberValue: + Type: String + + TC009NHSNumberValue: + Type: String + +Resources: + TC007NHSNumberParameter: + Type: AWS::SSM::Parameter + Properties: + Name: !Sub ${StackName}-TC007NHSNumber + Description: "List of NHS numbers that will trigger 'temporarily unavailable' response for testing purposes." + Type: String + Value: !Ref TC007NHSNumberValue + + TC008NHSNumberParameter: + Type: AWS::SSM::Parameter + Properties: + Name: !Sub ${StackName}-TC008NHSNumber + Description: "List of NHS numbers that will trigger '500 system error' response for testing purposes." + Type: String + Value: !Ref TC008NHSNumberValue + + TC009NHSNumberParameter: + Type: AWS::SSM::Parameter + Properties: + Name: !Sub ${StackName}-TC009NHSNumber + Description: "List of NHS numbers that will trigger 'one or more prescriptions missing' response for testing purposes." + Type: String + Value: !Ref TC009NHSNumberValue + + GetPfPParameterPolicy: + Type: AWS::IAM::ManagedPolicy + Properties: + Description: "Allows reading SSM parameters" + PolicyDocument: + Version: 2012-10-17 + Statement: + - Effect: Allow + Action: + - ssm:GetParameter + - ssm:GetParameters + Resource: + - !Sub arn:aws:ssm:${AWS::Region}:${AWS::AccountId}:parameter/${TC007NHSNumberParameter} + - !Sub arn:aws:ssm:${AWS::Region}:${AWS::AccountId}:parameter/${TC008NHSNumberParameter} + - !Sub arn:aws:ssm:${AWS::Region}:${AWS::AccountId}:parameter/${TC009NHSNumberParameter} + +Outputs: + TC007NHSNumberParameterName: + Description: "Name of the SSM parameter holding TC007_NHS_Number" + Value: !Ref TC007NHSNumberParameter + Export: + Name: !Sub ${StackName}-TC007NHSNumberParameter + + TC008NHSNumberParameterName: + Description: "Name of the SSM parameter holding TC008_NHS_Number" + Value: !Ref TC008NHSNumberParameter + Export: + Name: !Sub ${StackName}-TC008NHSNumberParameter + + TC009NHSNumberParameterName: + Description: "Name of the SSM parameter holding TC009_NHS_Number" + Value: !Ref TC009NHSNumberParameter + Export: + Name: !Sub ${StackName}-TC009NHSNumberParameter + + GetPfPParameterPolicy: + Description: Access to the parameters used by the notifications integration + Value: !Ref GetPfPParameterPolicy + Export: + Name: !Sub ${StackName}-GetPfPParameterPolicy diff --git a/jest.default.config.ts b/jest.default.config.ts index 3e9abbcb9..645134a44 100644 --- a/jest.default.config.ts +++ b/jest.default.config.ts @@ -10,7 +10,11 @@ const jestConfig: JestConfigWithTsJest = { preset: "ts-jest/presets/default-esm", moduleFileExtensions: ["js", "json", "ts", "d.ts"], moduleNameMapper: { - "^(\\.{1,2}/.*)\\.js$": "$1" + "^(\\.{1,2}/.*)\\.js$": "$1", + "^@pfp-common/testing$": "/../../packages/common/testing/lib/index.js", + "^@pfp-common/testing/(.*)$": "/../../packages/common/testing/lib/$1.js", + "^@pfp-common/utilities$": "/../../packages/common/utilities/lib/index.js", + "^@pfp-common/utilities/(.*)$": "/../../packages/common/utilities/lib/$1.js" }, transform: { "^.+\\.ts?$": [ diff --git a/package-lock.json b/package-lock.json index 922919f9c..c3f4dda7c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,6 +15,7 @@ "packages/nhsd-pfp-sandbox", "packages/statusLambda", "packages/serviceSearchClient", + "packages/common/utilities", "packages/common/testing", "packages/distanceSelling" ], @@ -178,34 +179,22 @@ } }, "node_modules/@aws-lambda-powertools/commons": { - "version": "2.28.0", - "resolved": "https://registry.npmjs.org/@aws-lambda-powertools/commons/-/commons-2.28.0.tgz", - "integrity": "sha512-LlUSs3XShw9dM/q6BQPmWJXyxkwc8k4P6EunVjct7nQegELQuwbKggPuyLem05axkjK8wL+MIOxDqWBM6QcUMA==", - "license": "MIT-0", - "dependencies": { - "@aws/lambda-invoke-store": "0.1.0" - } - }, - "node_modules/@aws-lambda-powertools/commons/node_modules/@aws/lambda-invoke-store": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/@aws/lambda-invoke-store/-/lambda-invoke-store-0.1.0.tgz", - "integrity": "sha512-I1y5yahbSFTfKldV4qoKv2IEZ20QOhn5rPvWwGnswZ8hssN7tsLANLg9tL8dp2klz2MZDGL5jZrvBwplIWtM8A==", - "license": "Apache-2.0", - "engines": { - "node": ">=18.0.0" - } + "version": "2.28.1", + "resolved": "https://registry.npmjs.org/@aws-lambda-powertools/commons/-/commons-2.28.1.tgz", + "integrity": "sha512-XZyup4C9gNnxIi5UUNErXudnwursG4F0tXZMaeTsyMslNLwQJp3zl35MTALV4cXx6Fbz1BmdQIUhGBJraKSpnA==", + "license": "MIT-0" }, "node_modules/@aws-lambda-powertools/logger": { - "version": "2.28.0", - "resolved": "https://registry.npmjs.org/@aws-lambda-powertools/logger/-/logger-2.28.0.tgz", - "integrity": "sha512-GBzMZanBGoGmNp60VAYX71wt6A8NSBkLvYr4SF91c8HW/fFywn9zUeNK0n94/+QPVpGKapk9R5e76M2B2vR4jg==", + "version": "2.28.1", + "resolved": "https://registry.npmjs.org/@aws-lambda-powertools/logger/-/logger-2.28.1.tgz", + "integrity": "sha512-XbXvcbjA5Uid1ZY1DwuNDxjHIcOtE1G1+hG3iQKZTSq7nq+6kTzQ798/yow69E91cIC78RJCUc2GbXyYq62JJw==", "license": "MIT-0", "dependencies": { - "@aws-lambda-powertools/commons": "2.28.0", + "@aws-lambda-powertools/commons": "2.28.1", "lodash.merge": "^4.6.2" }, "peerDependencies": { - "@aws-lambda-powertools/jmespath": "2.28.0", + "@aws-lambda-powertools/jmespath": "2.28.1", "@middy/core": "4.x || 5.x || 6.x" }, "peerDependenciesMeta": { @@ -218,12 +207,12 @@ } }, "node_modules/@aws-lambda-powertools/parameters": { - "version": "2.28.0", - "resolved": "https://registry.npmjs.org/@aws-lambda-powertools/parameters/-/parameters-2.28.0.tgz", - "integrity": "sha512-p9euMt2C72WHhEncosyAuco4hwqTAh9vcSCEn82O2aKNFqKYIAar4pcaVwgzgtI4LPAfaih/gN5i5E7l3ItljA==", + "version": "2.28.1", + "resolved": "https://registry.npmjs.org/@aws-lambda-powertools/parameters/-/parameters-2.28.1.tgz", + "integrity": "sha512-hYHxrTn31/Y+ZM0QGKuIqIjuyki2xw2lI7p9/kWFNKQ2uVP3v7xnZp5b9ZyoXiSeTX8OMG6cit297ZpvAvDAqQ==", "license": "MIT-0", "dependencies": { - "@aws-lambda-powertools/commons": "2.28.0" + "@aws-lambda-powertools/commons": "2.28.1" }, "peerDependencies": { "@aws-sdk/client-appconfigdata": ">=3.x", @@ -255,15 +244,66 @@ } }, "node_modules/@aws-sdk/client-secrets-manager": { - "version": "3.913.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-secrets-manager/-/client-secrets-manager-3.913.0.tgz", - "integrity": "sha512-VX54DUb5eWSgxzA34Ym95HoBG5i0dEno4JnV6RR+dKQoiKmrnbnGKmHc3GsAH8lw4vFoz8epcthKG8iaryLRIw==", + "version": "3.914.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-secrets-manager/-/client-secrets-manager-3.914.0.tgz", + "integrity": "sha512-0NUIlk8PNbtHWfv14iymFMrd9j38Sgs03JAntuj637N/+cuteWhaEYSPuBuFOVx/riQwV3CGbbqEXmKhHI9U3g==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.914.0", + "@aws-sdk/credential-provider-node": "3.914.0", + "@aws-sdk/middleware-host-header": "3.914.0", + "@aws-sdk/middleware-logger": "3.914.0", + "@aws-sdk/middleware-recursion-detection": "3.914.0", + "@aws-sdk/middleware-user-agent": "3.914.0", + "@aws-sdk/region-config-resolver": "3.914.0", + "@aws-sdk/types": "3.914.0", + "@aws-sdk/util-endpoints": "3.914.0", + "@aws-sdk/util-user-agent-browser": "3.914.0", + "@aws-sdk/util-user-agent-node": "3.914.0", + "@smithy/config-resolver": "^4.4.0", + "@smithy/core": "^3.17.0", + "@smithy/fetch-http-handler": "^5.3.4", + "@smithy/hash-node": "^4.2.3", + "@smithy/invalid-dependency": "^4.2.3", + "@smithy/middleware-content-length": "^4.2.3", + "@smithy/middleware-endpoint": "^4.3.4", + "@smithy/middleware-retry": "^4.4.4", + "@smithy/middleware-serde": "^4.2.3", + "@smithy/middleware-stack": "^4.2.3", + "@smithy/node-config-provider": "^4.3.3", + "@smithy/node-http-handler": "^4.4.2", + "@smithy/protocol-http": "^5.3.3", + "@smithy/smithy-client": "^4.9.0", + "@smithy/types": "^4.8.0", + "@smithy/url-parser": "^4.2.3", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.3", + "@smithy/util-defaults-mode-node": "^4.2.5", + "@smithy/util-endpoints": "^3.2.3", + "@smithy/util-middleware": "^4.2.3", + "@smithy/util-retry": "^4.2.3", + "@smithy/util-utf8": "^4.2.0", + "@smithy/uuid": "^1.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/client-ssm": { + "version": "3.912.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-ssm/-/client-ssm-3.912.0.tgz", + "integrity": "sha512-pphAD4M6+d21im1PxyNSdWGAzl4uXOuj2MAmIRgyRmoVJz5ALMt98PoX3dzXDYncKiAZdeNOzQirio/Nnbpg3Q==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.911.0", - "@aws-sdk/credential-provider-node": "3.913.0", + "@aws-sdk/credential-provider-node": "3.911.0", "@aws-sdk/middleware-host-header": "3.910.0", "@aws-sdk/middleware-logger": "3.910.0", "@aws-sdk/middleware-recursion-detection": "3.910.0", @@ -298,6 +338,7 @@ "@smithy/util-middleware": "^4.2.2", "@smithy/util-retry": "^4.2.2", "@smithy/util-utf8": "^4.2.0", + "@smithy/util-waiter": "^4.2.2", "@smithy/uuid": "^1.1.0", "tslib": "^2.6.2" }, @@ -305,7 +346,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/client-sso": { + "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/client-sso": { "version": "3.911.0", "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.911.0.tgz", "integrity": "sha512-N9QAeMvN3D1ZyKXkQp4aUgC4wUMuA5E1HuVCkajc0bq1pnH4PIke36YlrDGGREqPlyLFrXCkws2gbL5p23vtlg==", @@ -354,7 +395,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/core": { + "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/core": { "version": "3.911.0", "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.911.0.tgz", "integrity": "sha512-k4QG9A+UCq/qlDJFmjozo6R0eXXfe++/KnCDMmajehIE9kh+b/5DqlGvAmbl9w4e92LOtrY6/DN3mIX1xs4sXw==", @@ -378,7 +419,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-env": { + "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/credential-provider-env": { "version": "3.911.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.911.0.tgz", "integrity": "sha512-6FWRwWn3LUZzLhqBXB+TPMW2ijCWUqGICSw8bVakEdODrvbiv1RT/MVUayzFwz/ek6e6NKZn6DbSWzx07N9Hjw==", @@ -394,7 +435,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-http": { + "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/credential-provider-http": { "version": "3.911.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.911.0.tgz", "integrity": "sha512-xUlwKmIUW2fWP/eM3nF5u4CyLtOtyohlhGJ5jdsJokr3MrQ7w0tDITO43C9IhCn+28D5UbaiWnKw5ntkw7aVfA==", @@ -415,10 +456,10 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.913.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.913.0.tgz", - "integrity": "sha512-iR4c4NQ1OSRKQi0SxzpwD+wP1fCy+QNKtEyCajuVlD0pvmoIHdrm5THK9e+2/7/SsQDRhOXHJfLGxHapD74WJw==", + "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.911.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.911.0.tgz", + "integrity": "sha512-bQ86kWAZ0Imn7uWl7uqOYZ2aqlkftPmEc8cQh+QyhmUXbia8II4oYKq/tMek6j3M5UOMCiJVxzJoxemJZA6/sw==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/core": "3.911.0", @@ -439,15 +480,15 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-node": { - "version": "3.913.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.913.0.tgz", - "integrity": "sha512-HQPLkKDxS83Q/nZKqg9bq4igWzYQeOMqhpx5LYs4u1GwsKeCsYrrfz12Iu4IHNWPp9EnGLcmdfbfYuqZGrsaSQ==", + "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/credential-provider-node": { + "version": "3.911.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.911.0.tgz", + "integrity": "sha512-4oGpLwgQCKNtVoJROztJ4v7lZLhCqcUMX6pe/DQ2aU0TktZX7EczMCIEGjVo5b7yHwSNWt2zW0tDdgVUTsMHPw==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/credential-provider-env": "3.911.0", "@aws-sdk/credential-provider-http": "3.911.0", - "@aws-sdk/credential-provider-ini": "3.913.0", + "@aws-sdk/credential-provider-ini": "3.911.0", "@aws-sdk/credential-provider-process": "3.911.0", "@aws-sdk/credential-provider-sso": "3.911.0", "@aws-sdk/credential-provider-web-identity": "3.911.0", @@ -462,7 +503,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-process": { + "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/credential-provider-process": { "version": "3.911.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.911.0.tgz", "integrity": "sha512-mKshhV5jRQffZjbK9x7bs+uC2IsYKfpzYaBamFsEov3xtARCpOiKaIlM8gYKFEbHT2M+1R3rYYlhhl9ndVWS2g==", @@ -479,7 +520,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-sso": { + "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/credential-provider-sso": { "version": "3.911.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.911.0.tgz", "integrity": "sha512-JAxd4uWe0Zc9tk6+N0cVxe9XtJVcOx6Ms0k933ZU9QbuRMH6xti/wnZxp/IvGIWIDzf5fhqiGyw5MSyDeI5b1w==", @@ -498,7 +539,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/credential-provider-web-identity": { + "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/credential-provider-web-identity": { "version": "3.911.0", "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.911.0.tgz", "integrity": "sha512-urIbXWWG+cm54RwwTFQuRwPH0WPsMFSDF2/H9qO2J2fKoHRURuyblFCyYG3aVKZGvFBhOizJYexf5+5w3CJKBw==", @@ -516,7 +557,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/middleware-host-header": { + "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/middleware-host-header": { "version": "3.910.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.910.0.tgz", "integrity": "sha512-F9Lqeu80/aTM6S/izZ8RtwSmjfhWjIuxX61LX+/9mxJyEkgaECRxv0chsLQsLHJumkGnXRy/eIyMLBhcTPF5vg==", @@ -531,7 +572,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/middleware-logger": { + "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/middleware-logger": { "version": "3.910.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.910.0.tgz", "integrity": "sha512-3LJyyfs1USvRuRDla1pGlzGRtXJBXD1zC9F+eE9Iz/V5nkmhyv52A017CvKWmYoR0DM9dzjLyPOI0BSSppEaTw==", @@ -545,7 +586,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/middleware-recursion-detection": { + "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/middleware-recursion-detection": { "version": "3.910.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.910.0.tgz", "integrity": "sha512-m/oLz0EoCy+WoIVBnXRXJ4AtGpdl0kPE7U+VH9TsuUzHgxY1Re/176Q1HWLBRVlz4gr++lNsgsMWEC+VnAwMpw==", @@ -561,7 +602,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/middleware-user-agent": { + "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/middleware-user-agent": { "version": "3.911.0", "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.911.0.tgz", "integrity": "sha512-rY3LvGvgY/UI0nmt5f4DRzjEh8135A2TeHcva1bgOmVfOI4vkkGfA20sNRqerOkSO6hPbkxJapO50UJHFzmmyA==", @@ -579,7 +620,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/nested-clients": { + "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/nested-clients": { "version": "3.911.0", "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.911.0.tgz", "integrity": "sha512-lp/sXbdX/S0EYaMYPVKga0omjIUbNNdFi9IJITgKZkLC6CzspihIoHd5GIdl4esMJevtTQQfkVncXTFkf/a4YA==", @@ -628,7 +669,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/region-config-resolver": { + "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/region-config-resolver": { "version": "3.910.0", "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.910.0.tgz", "integrity": "sha512-gzQAkuHI3xyG6toYnH/pju+kc190XmvnB7X84vtN57GjgdQJICt9So/BD0U6h+eSfk9VBnafkVrAzBzWMEFZVw==", @@ -645,7 +686,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/token-providers": { + "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/token-providers": { "version": "3.911.0", "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.911.0.tgz", "integrity": "sha512-O1c5F1pbEImgEe3Vr8j1gpWu69UXWj3nN3vvLGh77hcrG5dZ8I27tSP5RN4Labm8Dnji/6ia+vqSYpN8w6KN5A==", @@ -663,7 +704,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/types": { + "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/types": { "version": "3.910.0", "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.910.0.tgz", "integrity": "sha512-o67gL3vjf4nhfmuSUNNkit0d62QJEwwHLxucwVJkR/rw9mfUtAWsgBs8Tp16cdUbMgsyQtCQilL8RAJDoGtadQ==", @@ -676,7 +717,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/util-endpoints": { + "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/util-endpoints": { "version": "3.910.0", "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.910.0.tgz", "integrity": "sha512-6XgdNe42ibP8zCQgNGDWoOF53RfEKzpU/S7Z29FTTJ7hcZv0SytC0ZNQQZSx4rfBl036YWYwJRoJMlT4AA7q9A==", @@ -692,19 +733,7 @@ "node": ">=18.0.0" } }, - "node_modules/@aws-sdk/util-locate-window": { - "version": "3.893.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.893.0.tgz", - "integrity": "sha512-T89pFfgat6c8nMmpI8eKjBcDcgJq36+m9oiXbcUzeU55MP9ZuGgBomGjGnHaEyF36jenW9gmg3NfZDm0AO2XPg==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/util-user-agent-browser": { + "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/util-user-agent-browser": { "version": "3.910.0", "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.910.0.tgz", "integrity": "sha512-iOdrRdLZHrlINk9pezNZ82P/VxO/UmtmpaOAObUN+xplCUJu31WNM2EE/HccC8PQw6XlAudpdA6HDTGiW6yVGg==", @@ -716,7 +745,7 @@ "tslib": "^2.6.2" } }, - "node_modules/@aws-sdk/util-user-agent-node": { + "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/util-user-agent-node": { "version": "3.911.0", "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.911.0.tgz", "integrity": "sha512-3l+f6ooLF6Z6Lz0zGi7vSKSUYn/EePPizv88eZQpEAFunBHv+CSVNPtxhxHfkm7X9tTsV4QGZRIqo3taMLolmA==", @@ -740,7 +769,7 @@ } } }, - "node_modules/@aws-sdk/xml-builder": { + "node_modules/@aws-sdk/client-ssm/node_modules/@aws-sdk/xml-builder": { "version": "3.911.0", "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.911.0.tgz", "integrity": "sha512-/yh3oe26bZfCVGrIMRM9Z4hvvGJD+qx5tOLlydOkuBkm72aXON7D9+MucjJXTAcI8tF2Yq+JHa0478eHQOhnLg==", @@ -754,6 +783,453 @@ "node": ">=18.0.0" } }, + "node_modules/@aws-sdk/client-sso": { + "version": "3.914.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.914.0.tgz", + "integrity": "sha512-83Xp8Wl7RDWg/iIYL8dmrN9DN7qu7fcUzDC9LyMhDN8cAEACykN/i4Fk45UHRCejL9Sjxu4wsQzxRYp1smQ95g==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.914.0", + "@aws-sdk/middleware-host-header": "3.914.0", + "@aws-sdk/middleware-logger": "3.914.0", + "@aws-sdk/middleware-recursion-detection": "3.914.0", + "@aws-sdk/middleware-user-agent": "3.914.0", + "@aws-sdk/region-config-resolver": "3.914.0", + "@aws-sdk/types": "3.914.0", + "@aws-sdk/util-endpoints": "3.914.0", + "@aws-sdk/util-user-agent-browser": "3.914.0", + "@aws-sdk/util-user-agent-node": "3.914.0", + "@smithy/config-resolver": "^4.4.0", + "@smithy/core": "^3.17.0", + "@smithy/fetch-http-handler": "^5.3.4", + "@smithy/hash-node": "^4.2.3", + "@smithy/invalid-dependency": "^4.2.3", + "@smithy/middleware-content-length": "^4.2.3", + "@smithy/middleware-endpoint": "^4.3.4", + "@smithy/middleware-retry": "^4.4.4", + "@smithy/middleware-serde": "^4.2.3", + "@smithy/middleware-stack": "^4.2.3", + "@smithy/node-config-provider": "^4.3.3", + "@smithy/node-http-handler": "^4.4.2", + "@smithy/protocol-http": "^5.3.3", + "@smithy/smithy-client": "^4.9.0", + "@smithy/types": "^4.8.0", + "@smithy/url-parser": "^4.2.3", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.3", + "@smithy/util-defaults-mode-node": "^4.2.5", + "@smithy/util-endpoints": "^3.2.3", + "@smithy/util-middleware": "^4.2.3", + "@smithy/util-retry": "^4.2.3", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/core": { + "version": "3.914.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.914.0.tgz", + "integrity": "sha512-QMnWdW7PwxVfi5WBV2a6apM1fIizgBf1UHYbqd3e1sXk8B0d3tpysmLZdIx30OY066zhEo6FyAKLAeTSsGrALg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.914.0", + "@aws-sdk/xml-builder": "3.914.0", + "@smithy/core": "^3.17.0", + "@smithy/node-config-provider": "^4.3.3", + "@smithy/property-provider": "^4.2.3", + "@smithy/protocol-http": "^5.3.3", + "@smithy/signature-v4": "^5.3.3", + "@smithy/smithy-client": "^4.9.0", + "@smithy/types": "^4.8.0", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-middleware": "^4.2.3", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-env": { + "version": "3.914.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.914.0.tgz", + "integrity": "sha512-v7zeMsLkTB0/ZK6DGbM6QUNIeeEtNBd+4DHihXjsHKBKxBESKIJlWF5Bcj+pgCSWcFGClxmqL6NfWCFQ0WdtjQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.914.0", + "@aws-sdk/types": "3.914.0", + "@smithy/property-provider": "^4.2.3", + "@smithy/types": "^4.8.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-http": { + "version": "3.914.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.914.0.tgz", + "integrity": "sha512-NXS5nBD0Tbk5ltjOAucdcx8EQQcFdVpCGrly56AIbznl0yhuG5Sxq4q2tUSJj9006eEXBK5rt52CdDixCcv3xg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.914.0", + "@aws-sdk/types": "3.914.0", + "@smithy/fetch-http-handler": "^5.3.4", + "@smithy/node-http-handler": "^4.4.2", + "@smithy/property-provider": "^4.2.3", + "@smithy/protocol-http": "^5.3.3", + "@smithy/smithy-client": "^4.9.0", + "@smithy/types": "^4.8.0", + "@smithy/util-stream": "^4.5.3", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.914.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.914.0.tgz", + "integrity": "sha512-RcL02V3EE8DRuu8qb5zoV+aVWbUIKZRA3NeHsWKWCD25nxQUYF4CrbQizWQ91vda5+e6PysGGLYROOzapX3Xmw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.914.0", + "@aws-sdk/credential-provider-env": "3.914.0", + "@aws-sdk/credential-provider-http": "3.914.0", + "@aws-sdk/credential-provider-process": "3.914.0", + "@aws-sdk/credential-provider-sso": "3.914.0", + "@aws-sdk/credential-provider-web-identity": "3.914.0", + "@aws-sdk/nested-clients": "3.914.0", + "@aws-sdk/types": "3.914.0", + "@smithy/credential-provider-imds": "^4.2.3", + "@smithy/property-provider": "^4.2.3", + "@smithy/shared-ini-file-loader": "^4.3.3", + "@smithy/types": "^4.8.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-node": { + "version": "3.914.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.914.0.tgz", + "integrity": "sha512-SDUvDKqsJ5UPDkem0rq7/bdZtXKKTnoBeWvRlI20Zuv4CLdYkyIGXU9sSA2mrhsZ/7bt1cduTHpGd1n/UdBQEg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.914.0", + "@aws-sdk/credential-provider-http": "3.914.0", + "@aws-sdk/credential-provider-ini": "3.914.0", + "@aws-sdk/credential-provider-process": "3.914.0", + "@aws-sdk/credential-provider-sso": "3.914.0", + "@aws-sdk/credential-provider-web-identity": "3.914.0", + "@aws-sdk/types": "3.914.0", + "@smithy/credential-provider-imds": "^4.2.3", + "@smithy/property-provider": "^4.2.3", + "@smithy/shared-ini-file-loader": "^4.3.3", + "@smithy/types": "^4.8.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-process": { + "version": "3.914.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.914.0.tgz", + "integrity": "sha512-34C3CYM3iAVcSg3cX4UfOwabWeTeowjZkqJbWgDZ+I/HNZ8+9YbVuJcOZL5fVhw242UclxlVlddNPNprluZKGg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.914.0", + "@aws-sdk/types": "3.914.0", + "@smithy/property-provider": "^4.2.3", + "@smithy/shared-ini-file-loader": "^4.3.3", + "@smithy/types": "^4.8.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.914.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.914.0.tgz", + "integrity": "sha512-LfuSyhwvb1qOWN+oN3zyq5D899RZVA0nUrx6czKpDJYarYG0FCTZPO5aPcyoNGAjUu8l+CYUvXcd9ZdZiwv3/A==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/client-sso": "3.914.0", + "@aws-sdk/core": "3.914.0", + "@aws-sdk/token-providers": "3.914.0", + "@aws-sdk/types": "3.914.0", + "@smithy/property-provider": "^4.2.3", + "@smithy/shared-ini-file-loader": "^4.3.3", + "@smithy/types": "^4.8.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.914.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.914.0.tgz", + "integrity": "sha512-49zJm5x48eG4kiu7/lUGYicwpOPA3lzkuxZ8tdegKKB9Imya6yxdATx4V5UcapFfX79xgpZr750zYHHqSX53Sw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.914.0", + "@aws-sdk/nested-clients": "3.914.0", + "@aws-sdk/types": "3.914.0", + "@smithy/property-provider": "^4.2.3", + "@smithy/shared-ini-file-loader": "^4.3.3", + "@smithy/types": "^4.8.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/middleware-host-header": { + "version": "3.914.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.914.0.tgz", + "integrity": "sha512-7r9ToySQ15+iIgXMF/h616PcQStByylVkCshmQqcdeynD/lCn2l667ynckxW4+ql0Q+Bo/URljuhJRxVJzydNA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.914.0", + "@smithy/protocol-http": "^5.3.3", + "@smithy/types": "^4.8.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/middleware-logger": { + "version": "3.914.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.914.0.tgz", + "integrity": "sha512-/gaW2VENS5vKvJbcE1umV4Ag3NuiVzpsANxtrqISxT3ovyro29o1RezW/Avz/6oJqjnmgz8soe9J1t65jJdiNg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.914.0", + "@smithy/types": "^4.8.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.914.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.914.0.tgz", + "integrity": "sha512-yiAjQKs5S2JKYc+GrkvGMwkUvhepXDigEXpSJqUseR/IrqHhvGNuOxDxq+8LbDhM4ajEW81wkiBbU+Jl9G82yQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.914.0", + "@aws/lambda-invoke-store": "^0.0.1", + "@smithy/protocol-http": "^5.3.3", + "@smithy/types": "^4.8.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.914.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.914.0.tgz", + "integrity": "sha512-+grKWKg+htCpkileNOqm7LO9OrE9nVPv49CYbF7dXefQIdIhfQ0pvm+hdSUnh8GFLx86FKoJs2DZSBCYqgjQFw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.914.0", + "@aws-sdk/types": "3.914.0", + "@aws-sdk/util-endpoints": "3.914.0", + "@smithy/core": "^3.17.0", + "@smithy/protocol-http": "^5.3.3", + "@smithy/types": "^4.8.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/nested-clients": { + "version": "3.914.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.914.0.tgz", + "integrity": "sha512-cktvDU5qsvtv9HqJ0uoPgqQ87pttRMZe33fdZ3NQmnkaT6O6AI7x9wQNW5bDH3E6rou/jYle9CBSea1Xum69rQ==", + "license": "Apache-2.0", + "dependencies": { + "@aws-crypto/sha256-browser": "5.2.0", + "@aws-crypto/sha256-js": "5.2.0", + "@aws-sdk/core": "3.914.0", + "@aws-sdk/middleware-host-header": "3.914.0", + "@aws-sdk/middleware-logger": "3.914.0", + "@aws-sdk/middleware-recursion-detection": "3.914.0", + "@aws-sdk/middleware-user-agent": "3.914.0", + "@aws-sdk/region-config-resolver": "3.914.0", + "@aws-sdk/types": "3.914.0", + "@aws-sdk/util-endpoints": "3.914.0", + "@aws-sdk/util-user-agent-browser": "3.914.0", + "@aws-sdk/util-user-agent-node": "3.914.0", + "@smithy/config-resolver": "^4.4.0", + "@smithy/core": "^3.17.0", + "@smithy/fetch-http-handler": "^5.3.4", + "@smithy/hash-node": "^4.2.3", + "@smithy/invalid-dependency": "^4.2.3", + "@smithy/middleware-content-length": "^4.2.3", + "@smithy/middleware-endpoint": "^4.3.4", + "@smithy/middleware-retry": "^4.4.4", + "@smithy/middleware-serde": "^4.2.3", + "@smithy/middleware-stack": "^4.2.3", + "@smithy/node-config-provider": "^4.3.3", + "@smithy/node-http-handler": "^4.4.2", + "@smithy/protocol-http": "^5.3.3", + "@smithy/smithy-client": "^4.9.0", + "@smithy/types": "^4.8.0", + "@smithy/url-parser": "^4.2.3", + "@smithy/util-base64": "^4.3.0", + "@smithy/util-body-length-browser": "^4.2.0", + "@smithy/util-body-length-node": "^4.2.1", + "@smithy/util-defaults-mode-browser": "^4.3.3", + "@smithy/util-defaults-mode-node": "^4.2.5", + "@smithy/util-endpoints": "^3.2.3", + "@smithy/util-middleware": "^4.2.3", + "@smithy/util-retry": "^4.2.3", + "@smithy/util-utf8": "^4.2.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/region-config-resolver": { + "version": "3.914.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.914.0.tgz", + "integrity": "sha512-KlmHhRbn1qdwXUdsdrJ7S/MAkkC1jLpQ11n+XvxUUUCGAJd1gjC7AjxPZUM7ieQ2zcb8bfEzIU7al+Q3ZT0u7Q==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.914.0", + "@smithy/config-resolver": "^4.4.0", + "@smithy/types": "^4.8.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/token-providers": { + "version": "3.914.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.914.0.tgz", + "integrity": "sha512-wX8lL5OnCk/54eUPP1L/dCH+Gp/f3MjnHR6rNp+dbGs7+omUAub4dEbM/JMBE4Jsn5coiVgmgqx97Q5cRxh/EA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/core": "3.914.0", + "@aws-sdk/nested-clients": "3.914.0", + "@aws-sdk/types": "3.914.0", + "@smithy/property-provider": "^4.2.3", + "@smithy/shared-ini-file-loader": "^4.3.3", + "@smithy/types": "^4.8.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/types": { + "version": "3.914.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.914.0.tgz", + "integrity": "sha512-kQWPsRDmom4yvAfyG6L1lMmlwnTzm1XwMHOU+G5IFlsP4YEaMtXidDzW/wiivY0QFrhfCz/4TVmu0a2aPU57ug==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.8.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/util-endpoints": { + "version": "3.914.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.914.0.tgz", + "integrity": "sha512-POUBUTjD7WQ/BVoUGluukCIkIDO12IPdwRAvUgFshfbaUdyXFuBllM/6DmdyeR3rJhXnBqe3Uy5e2eXbz/MBTw==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.914.0", + "@smithy/types": "^4.8.0", + "@smithy/url-parser": "^4.2.3", + "@smithy/util-endpoints": "^3.2.3", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/util-locate-window": { + "version": "3.893.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.893.0.tgz", + "integrity": "sha512-T89pFfgat6c8nMmpI8eKjBcDcgJq36+m9oiXbcUzeU55MP9ZuGgBomGjGnHaEyF36jenW9gmg3NfZDm0AO2XPg==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.914.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.914.0.tgz", + "integrity": "sha512-rMQUrM1ECH4kmIwlGl9UB0BtbHy6ZuKdWFrIknu8yGTRI/saAucqNTh5EI1vWBxZ0ElhK5+g7zOnUuhSmVQYUA==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/types": "3.914.0", + "@smithy/types": "^4.8.0", + "bowser": "^2.11.0", + "tslib": "^2.6.2" + } + }, + "node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.914.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.914.0.tgz", + "integrity": "sha512-gTkLFUZiNPgJmeFCX8VJRmQWXKfF3Imm5IquFIR5c0sCBfhtMjTXZF0dHDW5BlceZ4tFPwfF9sCqWJ52wbFSBg==", + "license": "Apache-2.0", + "dependencies": { + "@aws-sdk/middleware-user-agent": "3.914.0", + "@aws-sdk/types": "3.914.0", + "@smithy/node-config-provider": "^4.3.3", + "@smithy/types": "^4.8.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "aws-crt": ">=1.0.0" + }, + "peerDependenciesMeta": { + "aws-crt": { + "optional": true + } + } + }, + "node_modules/@aws-sdk/xml-builder": { + "version": "3.914.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.914.0.tgz", + "integrity": "sha512-k75evsBD5TcIjedycYS7QXQ98AmOtbnxRJOPtCo0IwYRmy7UvqgS/gBL5SmrIqeV6FDSYRQMgdBxSMp6MLmdew==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/types": "^4.8.0", + "fast-xml-parser": "5.2.5", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/@aws/lambda-invoke-store": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/@aws/lambda-invoke-store/-/lambda-invoke-store-0.0.1.tgz", @@ -2573,19 +3049,19 @@ } }, "node_modules/@nhs/fhir-middy-error-handler": { - "version": "2.1.54", - "resolved": "https://registry.npmjs.org/@nhs/fhir-middy-error-handler/-/fhir-middy-error-handler-2.1.54.tgz", - "integrity": "sha512-+n18rf5KbZ275qrMRbrVi1HTg29G8a8lTR5K1KuSTaar7miJI2qgpsmDUoR8V44KRrbzg6XxGtyu58OsfuJhmw==", + "version": "2.1.55", + "resolved": "https://registry.npmjs.org/@nhs/fhir-middy-error-handler/-/fhir-middy-error-handler-2.1.55.tgz", + "integrity": "sha512-Y2tyNqk/vgN/IoVJ8M7314GmydI7xF+q4nTfC8qwO4Da5JO4YU7RWaibSTqReNX6RzoUyHlx5+IvZWwTe3J/8g==", "license": "MIT", "dependencies": { - "@aws-lambda-powertools/logger": "^2.27.0", + "@aws-lambda-powertools/logger": "^2.28.0", "@middy/core": "^6.4.5" } }, "node_modules/@NHSDigital/eps-spine-client": { - "version": "2.1.62", - "resolved": "https://npm.pkg.github.com/download/@NHSDigital/eps-spine-client/2.1.62/afa6fac255414c396a5b539da532ba9d4741b6ee", - "integrity": "sha512-Y9RH90pBLjzjo/tIur+kr40k16kuAxFyNFcflf6dPjXE4jARsN9Hc6QY+xxCWquQ74ZidfC65q1MzbLYeXyydw==", + "version": "2.1.63", + "resolved": "https://npm.pkg.github.com/download/@NHSDigital/eps-spine-client/2.1.63/f5990a9e59b326c3f0e1064fc3e95e41adfa8827", + "integrity": "sha512-KdFPYHlKYPb+9pxMYdOIthMsg4cHFyBaSbBL26rTLbdkY+Mw7of/zZK5yqDS5aXlLnoz11d9ZEtlubRo8vegFw==", "license": "MIT", "dependencies": { "@aws-lambda-powertools/logger": "^2.27.0", @@ -2634,6 +3110,14 @@ "node": ">= 8" } }, + "node_modules/@pfp-common/testing": { + "resolved": "packages/common/testing", + "link": true + }, + "node_modules/@pfp-common/utilities": { + "resolved": "packages/common/utilities", + "link": true + }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", @@ -2658,10 +3142,6 @@ "url": "https://opencollective.com/pkgr" } }, - "node_modules/@prescriptionsforpatients_common/testing": { - "resolved": "packages/common/testing", - "link": true - }, "node_modules/@prescriptionsforpatients/distanceSelling": { "resolved": "packages/distanceSelling", "link": true @@ -2728,9 +3208,9 @@ } }, "node_modules/@smithy/core": { - "version": "3.17.0", - "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.17.0.tgz", - "integrity": "sha512-Tir3DbfoTO97fEGUZjzGeoXgcQAUBRDTmuH9A8lxuP8ATrgezrAJ6cLuRvwdKN4ZbYNlHgKlBX69Hyu3THYhtg==", + "version": "3.17.1", + "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.17.1.tgz", + "integrity": "sha512-V4Qc2CIb5McABYfaGiIYLTmo/vwNIK7WXI5aGveBd9UcdhbOMwcvIMxIw/DJj1S9QgOMa/7FBkarMdIC0EOTEQ==", "license": "Apache-2.0", "dependencies": { "@smithy/middleware-serde": "^4.2.3", @@ -2739,7 +3219,7 @@ "@smithy/util-base64": "^4.3.0", "@smithy/util-body-length-browser": "^4.2.0", "@smithy/util-middleware": "^4.2.3", - "@smithy/util-stream": "^4.5.3", + "@smithy/util-stream": "^4.5.4", "@smithy/util-utf8": "^4.2.0", "@smithy/uuid": "^1.1.0", "tslib": "^2.6.2" @@ -2835,12 +3315,12 @@ } }, "node_modules/@smithy/middleware-endpoint": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.3.4.tgz", - "integrity": "sha512-/RJhpYkMOaUZoJEkddamGPPIYeKICKXOu/ojhn85dKDM0n5iDIhjvYAQLP3K5FPhgB203O3GpWzoK2OehEoIUw==", + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.3.5.tgz", + "integrity": "sha512-SIzKVTvEudFWJbxAaq7f2GvP3jh2FHDpIFI6/VAf4FOWGFZy0vnYMPSRj8PGYI8Hjt29mvmwSRgKuO3bK4ixDw==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.17.0", + "@smithy/core": "^3.17.1", "@smithy/middleware-serde": "^4.2.3", "@smithy/node-config-provider": "^4.3.3", "@smithy/shared-ini-file-loader": "^4.3.3", @@ -2916,9 +3396,9 @@ } }, "node_modules/@smithy/node-http-handler": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.4.2.tgz", - "integrity": "sha512-MHFvTjts24cjGo1byXqhXrbqm7uznFD/ESFx8npHMWTFQVdBZjrT1hKottmp69LBTRm/JQzP/sn1vPt0/r6AYQ==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.4.3.tgz", + "integrity": "sha512-MAwltrDB0lZB/H6/2M5PIsISSwdI5yIh6DaBB9r0Flo9nx3y0dzl/qTMJPd7tJvPdsx6Ks/cwVzheGNYzXyNbQ==", "license": "Apache-2.0", "dependencies": { "@smithy/abort-controller": "^4.2.3", @@ -3029,17 +3509,17 @@ } }, "node_modules/@smithy/smithy-client": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.9.0.tgz", - "integrity": "sha512-qz7RTd15GGdwJ3ZCeBKLDQuUQ88m+skh2hJwcpPm1VqLeKzgZvXf6SrNbxvx7uOqvvkjCMXqx3YB5PDJyk00ww==", + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.9.1.tgz", + "integrity": "sha512-Ngb95ryR5A9xqvQFT5mAmYkCwbXvoLavLFwmi7zVg/IowFPCfiqRfkOKnbc/ZRL8ZKJ4f+Tp6kSu6wjDQb8L/g==", "license": "Apache-2.0", "dependencies": { - "@smithy/core": "^3.17.0", - "@smithy/middleware-endpoint": "^4.3.4", + "@smithy/core": "^3.17.1", + "@smithy/middleware-endpoint": "^4.3.5", "@smithy/middleware-stack": "^4.2.3", "@smithy/protocol-http": "^5.3.3", "@smithy/types": "^4.8.0", - "@smithy/util-stream": "^4.5.3", + "@smithy/util-stream": "^4.5.4", "tslib": "^2.6.2" }, "engines": { @@ -3151,16 +3631,16 @@ } }, "node_modules/@smithy/util-defaults-mode-node": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.2.5.tgz", - "integrity": "sha512-YQ9GQEC3knSa8oGSNdl5U6TlLynoOlLMIszrehgJxNh80v+ZCBnlXLtjyz0ffOxuM7j9cgviJuvuNkAzUseq6w==", + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.2.6.tgz", + "integrity": "sha512-c6M/ceBTm31YdcFpgfgQAJaw3KbaLuRKnAz91iMWFLSrgxRpYm03c3bu5cpYojNMfkV9arCUelelKA7XQT36SQ==", "license": "Apache-2.0", "dependencies": { "@smithy/config-resolver": "^4.4.0", "@smithy/credential-provider-imds": "^4.2.3", "@smithy/node-config-provider": "^4.3.3", "@smithy/property-provider": "^4.2.3", - "@smithy/smithy-client": "^4.9.0", + "@smithy/smithy-client": "^4.9.1", "@smithy/types": "^4.8.0", "tslib": "^2.6.2" }, @@ -3222,13 +3702,13 @@ } }, "node_modules/@smithy/util-stream": { - "version": "4.5.3", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.5.3.tgz", - "integrity": "sha512-oZvn8a5bwwQBNYHT2eNo0EU8Kkby3jeIg1P2Lu9EQtqDxki1LIjGRJM6dJ5CZUig8QmLxWxqOKWvg3mVoOBs5A==", + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.5.4.tgz", + "integrity": "sha512-+qDxSkiErejw1BAIXUFBSfM5xh3arbz1MmxlbMCKanDDZtVEQ7PSKW9FQS0Vud1eI/kYn0oCTVKyNzRlq+9MUw==", "license": "Apache-2.0", "dependencies": { "@smithy/fetch-http-handler": "^5.3.4", - "@smithy/node-http-handler": "^4.4.2", + "@smithy/node-http-handler": "^4.4.3", "@smithy/types": "^4.8.0", "@smithy/util-base64": "^4.3.0", "@smithy/util-buffer-from": "^4.2.0", @@ -3265,6 +3745,20 @@ "node": ">=18.0.0" } }, + "node_modules/@smithy/util-waiter": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/@smithy/util-waiter/-/util-waiter-4.2.3.tgz", + "integrity": "sha512-5+nU///E5sAdD7t3hs4uwvCTWQtTR8JwKwOCSJtBRx0bY1isDo1QwH87vRK86vlFLBTISqoDA2V6xvP6nF1isQ==", + "license": "Apache-2.0", + "dependencies": { + "@smithy/abort-controller": "^4.2.3", + "@smithy/types": "^4.8.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/@smithy/uuid": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@smithy/uuid/-/uuid-1.1.0.tgz", @@ -9388,14 +9882,42 @@ "@nhs/fhir-middy-error-handler": "^2.1.54" }, "devDependencies": { - "@prescriptionsforpatients_common/testing": "^1.0.0" + "@pfp-common/testing": "^1.0.0" + } + }, + "packages/common": { + "name": "@pfp-common/utilities", + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "@aws-lambda-powertools/logger": "^2.27.0", + "@aws-lambda-powertools/parameters": "^2.27.0", + "@aws-sdk/client-ssm": "^3.911.0", + "@types/fhir": "^0.0.41" + }, + "devDependencies": { + "axios-mock-adapter": "^2.1.0" } }, "packages/common/testing": { - "name": "@prescriptionsforpatients_common/testing", + "name": "@pfp-common/testing", "version": "1.0.0", "license": "MIT" }, + "packages/common/utilities": { + "name": "@pfp-common/utilities", + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "@aws-lambda-powertools/logger": "^2.27.0", + "@aws-lambda-powertools/parameters": "^2.27.0", + "@aws-sdk/client-ssm": "^3.911.0", + "@types/fhir": "^0.0.41" + }, + "devDependencies": { + "axios-mock-adapter": "^2.1.0" + } + }, "packages/distanceSelling": { "name": "@prescriptionsforpatients/distanceSelling", "version": "1.0.0", @@ -9406,7 +9928,7 @@ "@types/fhir": "^0.0.41" }, "devDependencies": { - "@prescriptionsforpatients_common/testing": "^1.0.0", + "@pfp-common/testing": "^1.0.0", "axios-mock-adapter": "^2.1.0" } }, @@ -9424,7 +9946,7 @@ "moment": "^2.30.1" }, "devDependencies": { - "@prescriptionsforpatients_common/testing": "^1.0.0" + "@pfp-common/testing": "^1.0.0" } }, "packages/getMyPrescriptions": { @@ -9444,7 +9966,8 @@ "@types/fhir": "^0.0.41" }, "devDependencies": { - "@prescriptionsforpatients_common/testing": "^1.0.0", + "@pfp-common/testing": "^1.0.0", + "@pfp-common/utilities": "^1.0.0", "axios-mock-adapter": "^2.1.0" } }, @@ -9459,7 +9982,7 @@ "@nhs/fhir-middy-error-handler": "^2.1.54" }, "devDependencies": { - "@prescriptionsforpatients_common/testing": "^1.0.0" + "@pfp-common/testing": "^1.0.0" } }, "packages/serviceSearchClient": { @@ -9472,7 +9995,7 @@ "axios-retry": "^4.5.0" }, "devDependencies": { - "@prescriptionsforpatients_common/testing": "^1.0.0", + "@pfp-common/testing": "^1.0.0", "axios-mock-adapter": "^2.1.0" } }, diff --git a/package.json b/package.json index 234b0d052..03bd652b0 100644 --- a/package.json +++ b/package.json @@ -20,6 +20,7 @@ "packages/nhsd-pfp-sandbox", "packages/statusLambda", "packages/serviceSearchClient", + "packages/common/utilities", "packages/common/testing", "packages/distanceSelling" ], diff --git a/packages/capabilityStatement/package.json b/packages/capabilityStatement/package.json index e3bf983d5..4024a388f 100644 --- a/packages/capabilityStatement/package.json +++ b/packages/capabilityStatement/package.json @@ -21,6 +21,6 @@ "@nhs/fhir-middy-error-handler": "^2.1.54" }, "devDependencies": { - "@prescriptionsforpatients_common/testing": "^1.0.0" + "@pfp-common/testing": "^1.0.0" } } diff --git a/packages/capabilityStatement/tests/test-handler.test.ts b/packages/capabilityStatement/tests/test-handler.test.ts index dccb844f6..262af77ed 100644 --- a/packages/capabilityStatement/tests/test-handler.test.ts +++ b/packages/capabilityStatement/tests/test-handler.test.ts @@ -9,7 +9,7 @@ import { helloworldContext, test_append_trace_ids, test_mime_type -} from "@prescriptionsforpatients_common/testing" +} from "@pfp-common/testing" const dummyContext = helloworldContext const mockEvent: APIGatewayProxyEvent = mockAPIGatewayProxyEvent diff --git a/packages/capabilityStatement/tsconfig.json b/packages/capabilityStatement/tsconfig.json index a8e1ea537..2323f6c27 100644 --- a/packages/capabilityStatement/tsconfig.json +++ b/packages/capabilityStatement/tsconfig.json @@ -4,7 +4,10 @@ "rootDir": ".", "outDir": "lib" }, - "references": [{"path": "../common/testing"}], + "references": [ + { "path": "../common/utilities" }, + { "path": "../common/testing" } + ], "include": ["src/**/*", "tests/**/*", "examples/CapabilityStatement/apim-medicines-prescriptionsforpatients.json"], "exclude": ["node_modules"] } diff --git a/packages/common/testing/package.json b/packages/common/testing/package.json index 6b013753d..3899aec11 100644 --- a/packages/common/testing/package.json +++ b/packages/common/testing/package.json @@ -1,17 +1,17 @@ { - "name": "@prescriptionsforpatients_common/testing", + "name": "@pfp-common/testing", "version": "1.0.0", "description": "Common resources for testing prescriptionsforpatients", "author": "NHS Digital", "license": "MIT", - "main": "lib/src/index.js", + "main": "lib/index.js", "type": "module", "scripts": { - "unit": "jest", + "unit": "echo 'No tests in common/testing package - it provides test utilities only'", "lint": "eslint --max-warnings 0 --fix --config ../../../eslint.config.mjs .", "compile": "tsc", "test": "npm run compile && npm run unit", - "check-licenses": "license-checker --failOn GPL --failOn LGPL --start ../.." + "check-licenses": "license-checker --failOn GPL --failOn LGPL --start ../../.." }, "dependencies": {} } diff --git a/packages/common/testing/src/helloWorldContext.js b/packages/common/testing/src/helloWorldContext.ts similarity index 89% rename from packages/common/testing/src/helloWorldContext.js rename to packages/common/testing/src/helloWorldContext.ts index ebc11017c..119de53a8 100644 --- a/packages/common/testing/src/helloWorldContext.js +++ b/packages/common/testing/src/helloWorldContext.ts @@ -1,5 +1,6 @@ -/* eslint-disable no-undef */ -const helloworldContext = { +import {Context} from "aws-lambda" + +const helloworldContext: Context = { callbackWaitsForEmptyEventLoop: true, functionVersion: "$LATEST", functionName: "foo-bar-function", diff --git a/packages/common/testing/src/index.ts b/packages/common/testing/src/index.ts index c5a8f0f79..587f4819c 100644 --- a/packages/common/testing/src/index.ts +++ b/packages/common/testing/src/index.ts @@ -22,6 +22,8 @@ const mockInteractionResponseBody = _mockInteractionResponseBody import _mockAPIResponseBody from "./mockAPIResponseBody.json" const mockAPIResponseBody = _mockAPIResponseBody +import {createMockedPfPConfig, setupTestEnvironment} from "./test_fixtures" + export { mockAPIGatewayProxyEvent, mockStateMachineInputEvent, @@ -31,5 +33,10 @@ export { mockAPIResponseBody, test_mime_type, test_append_trace_ids, - helloworldContext + helloworldContext, + createMockedPfPConfig, + setupTestEnvironment } + +// Type-only exports +export type {MockedPfPConfig} from "./test_fixtures" diff --git a/packages/common/testing/src/test_fixtures.ts b/packages/common/testing/src/test_fixtures.ts new file mode 100644 index 000000000..53e9cb6aa --- /dev/null +++ b/packages/common/testing/src/test_fixtures.ts @@ -0,0 +1,76 @@ +import {jest} from "@jest/globals" +import {PfPConfig} from "@pfp-common/utilities" +import {SSMProvider} from "@aws-lambda-powertools/parameters/ssm" + +export interface MockedPfPConfig { + pfpConfig: PfPConfig + mockGet: jest.MockedFunction<(paramName: string) => Promise> +} + +/** + * Common test environment setup + */ +export function setupTestEnvironment() { + const originalEnv = {...process.env} + + const restoreEnvironment = () => { + process.env = originalEnv + jest.restoreAllMocks() + } + + return { + originalEnv, + restoreEnvironment + } +} + +/** + * Creates a mocked PfPConfig that contains specific NHS numbers for testing + * @param nhsNumbers - Array of NHS numbers that should be returned by the SSM parameter + * @returns Object containing the mocked config and the mock function + */ +export function createMockedPfPConfig(nhsNumbers: Array = []): MockedPfPConfig { + // Create mock SSM provider + const mockGet = jest.fn() as jest.MockedFunction<(paramName: string) => Promise> + + // Set up mock to return the NHS numbers as a comma-separated string + const nhsNumbersString = nhsNumbers.join(",") + mockGet.mockResolvedValue(nhsNumbersString) + + const mockSSMProvider = { + get: mockGet + } as unknown as SSMProvider + + // Create config instance with mock provider + const pfpConfig = new PfPConfig(mockSSMProvider) + + return { + pfpConfig, + mockGet + } +} + +/** + * Example usage in tests: + * + * describe("My tests", () => { + * let testEnv: ReturnType + * let mockedConfig: MockedPfPConfig + * + * beforeEach(() => { + * testEnv = setupTestEnvironment() + * mockedConfig = createMockedPfPConfig(["1234567890", "9876543210"]) + * }) + * + * afterEach(() => { + * testEnv.restoreEnvironment() + * }) + * + * it("should test TC007/TC008/TC009 functionality", async () => { + * process.env.DEPLOYMENT_ENVIRONMENT = "dev" + * const result = await mockedConfig.pfpConfig.isTC008("1234567890") + * expect(result).toBe(true) + * expect(mockedConfig.mockGet).toHaveBeenCalled() + * }) + * }) + */ diff --git a/packages/common/testing/src/test_mime_type.ts b/packages/common/testing/src/test_mime_type.ts index df20ff99c..d7da5799b 100644 --- a/packages/common/testing/src/test_mime_type.ts +++ b/packages/common/testing/src/test_mime_type.ts @@ -1,4 +1,5 @@ import {APIGatewayProxyEvent, APIGatewayProxyResult, Context} from "aws-lambda" +import {expect} from "@jest/globals" type HandlerType = (event: APIGatewayProxyEvent, context: Context) => Promise type TestType = () => Promise @@ -7,7 +8,6 @@ function test_mime_type(handler: HandlerType, mockEvent: APIGatewayProxyEvent, d return async () => { const result: APIGatewayProxyResult = await handler(mockEvent, dummyContext) - // eslint-disable-next-line no-undef expect(result.headers).toEqual({"Content-Type": "application/fhir+json", "Cache-Control": "no-cache"}) } } diff --git a/packages/common/testing/tsconfig.json b/packages/common/testing/tsconfig.json index aca00051a..2e4e1c175 100644 --- a/packages/common/testing/tsconfig.json +++ b/packages/common/testing/tsconfig.json @@ -1,10 +1,13 @@ { "extends": "../../../tsconfig.defaults.json", "compilerOptions": { - "rootDir": ".", + "rootDir": "src", "outDir": "lib", "esModuleInterop": true }, + "references": [ + { "path": "../utilities" } + ], "include": ["src/**/*", "src/**/*.json"], "exclude": ["node_modules"] } diff --git a/packages/common/utilities/jest.config.ts b/packages/common/utilities/jest.config.ts new file mode 100644 index 000000000..8871c8cbd --- /dev/null +++ b/packages/common/utilities/jest.config.ts @@ -0,0 +1,16 @@ +import type {JestConfigWithTsJest} from "ts-jest" +import defaultConfig from "../../../jest.default.config" + +const jestConfig: JestConfigWithTsJest = { + ...defaultConfig, + rootDir: "./", + moduleNameMapper: { + "^(\\.{1,2}/.*)\\.js$": "$1", + "^@pfp-common/testing$": "/../testing/lib/index.js", + "^@pfp-common/testing/(.*)$": "/../testing/lib/$1.js", + "^@pfp-common/utilities$": "/lib/index.js", + "^@pfp-common/utilities/(.*)$": "/lib/$1.js" + } +} + +export default jestConfig diff --git a/packages/common/utilities/jest.debug.config.ts b/packages/common/utilities/jest.debug.config.ts new file mode 100644 index 000000000..a30627383 --- /dev/null +++ b/packages/common/utilities/jest.debug.config.ts @@ -0,0 +1,9 @@ +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/package.json b/packages/common/utilities/package.json new file mode 100644 index 000000000..5e4595dcf --- /dev/null +++ b/packages/common/utilities/package.json @@ -0,0 +1,26 @@ +{ + "name": "@pfp-common/utilities", + "version": "1.0.0", + "description": "prescriptionsforpatients common", + "main": "lib/index.js", + "types": "lib/index.d.ts", + "author": "NHS Digital", + "license": "MIT", + "type": "module", + "scripts": { + "unit": "POWERTOOLS_DEV=true NODE_OPTIONS=--experimental-vm-modules jest --no-cache --coverage", + "lint": "eslint --max-warnings 0 --fix --config ../../../eslint.config.mjs .", + "compile": "tsc", + "test": "npm run compile && npm run unit", + "check-licenses": "license-checker --failOn GPL --failOn LGPL --start ../../.." + }, + "dependencies": { + "@aws-lambda-powertools/logger": "^2.27.0", + "@aws-lambda-powertools/parameters": "^2.27.0", + "@aws-sdk/client-ssm": "^3.911.0", + "@types/fhir": "^0.0.41" + }, + "devDependencies": { + "axios-mock-adapter": "^2.1.0" + } +} diff --git a/packages/common/utilities/src/config.ts b/packages/common/utilities/src/config.ts new file mode 100644 index 000000000..68daa4c83 --- /dev/null +++ b/packages/common/utilities/src/config.ts @@ -0,0 +1,50 @@ +import {SSMProvider} from "@aws-lambda-powertools/parameters/ssm" + +const defaultSsmProvider = new SSMProvider({ + clientConfig: {region: process.env.AWS_REGION || "eu-west-2"} +}) + +export class PfPConfig { + static readonly TC007_NHS_NUMBERS_PARAM = "TC007NHSNumber" + static readonly TC008_NHS_NUMBERS_PARAM = "TC008NHSNumber" + static readonly TC009_NHS_NUMBERS_PARAM = "TC009NHSNumber" + + private ssmProvider: SSMProvider + + constructor(ssmProvider?: SSMProvider) { + this.ssmProvider = ssmProvider || defaultSsmProvider + } + + async isTC007(nhsNumber: string) { + // TC007: test case functionality for supplier testing + const env = process.env["DEPLOYMENT_ENVIRONMENT"] + + if (env === "prod") return false + const stackName = process.env.STACK_NAME || "pfp" + const TC007_NHS_NUMBERS = await this.ssmProvider.get(`/${stackName}-${PfPConfig.TC007_NHS_NUMBERS_PARAM}`) + return TC007_NHS_NUMBERS ? TC007_NHS_NUMBERS.includes(nhsNumber) : false + } + + async isTC008(nhsNumber: string) { + // AEA-5653, AEA-5853 | TC008: force internal error response for supplier testing + const env = process.env["DEPLOYMENT_ENVIRONMENT"] + + if (env === "prod") return false + const stackName = process.env.STACK_NAME || "pfp" + const TC008_NHS_NUMBERS = await this.ssmProvider.get(`/${stackName}-${PfPConfig.TC008_NHS_NUMBERS_PARAM}`) + return TC008_NHS_NUMBERS ? TC008_NHS_NUMBERS.includes(nhsNumber) : false + } + + async isTC009(nhsNumber: string) { + // TC009: test case functionality for supplier testing + const env = process.env["DEPLOYMENT_ENVIRONMENT"] + + if (env === "prod") return false + const stackName = process.env.STACK_NAME || "pfp" + const TC009_NHS_NUMBERS = await this.ssmProvider.get(`/${stackName}-${PfPConfig.TC009_NHS_NUMBERS_PARAM}`) + return TC009_NHS_NUMBERS ? TC009_NHS_NUMBERS.includes(nhsNumber) : false + } +} + +// Default instance for convenience +export const pfpConfig = new PfPConfig() diff --git a/packages/common/utilities/src/index.ts b/packages/common/utilities/src/index.ts new file mode 100644 index 000000000..e4ff084fd --- /dev/null +++ b/packages/common/utilities/src/index.ts @@ -0,0 +1,4 @@ +import {pfpConfig, PfPConfig} from "./config" + +// Export config +export {pfpConfig, PfPConfig} diff --git a/packages/common/utilities/tests/config.test.ts b/packages/common/utilities/tests/config.test.ts new file mode 100644 index 000000000..cca681429 --- /dev/null +++ b/packages/common/utilities/tests/config.test.ts @@ -0,0 +1,137 @@ +import {createMockedPfPConfig, setupTestEnvironment, MockedPfPConfig} from "@pfp-common/testing" +import { + expect, + describe, + it, + beforeEach, + afterEach +} from "@jest/globals" + +describe("PfPConfig", () => { + const NHS_NUMBER = "1234567890" + let testEnv: ReturnType + let mockedConfig: MockedPfPConfig + + beforeEach(() => { + testEnv = setupTestEnvironment() + mockedConfig = createMockedPfPConfig([NHS_NUMBER]) + }) + + afterEach(() => { + testEnv.restoreEnvironment() + }) + + describe("isTC007", () => { + it("returns false if DEPLOYMENT_ENVIRONMENT is 'prod'", async () => { + process.env.DEPLOYMENT_ENVIRONMENT = "prod" + const result = await mockedConfig.pfpConfig.isTC007(NHS_NUMBER) + expect(result).toBe(false) + expect(mockedConfig.mockGet).not.toHaveBeenCalled() + }) + + it("returns true if NHS number is in SSM param and env is 'dev'", async () => { + process.env.DEPLOYMENT_ENVIRONMENT = "dev" + const result = await mockedConfig.pfpConfig.isTC007(NHS_NUMBER) + expect(result).toBe(true) + expect(mockedConfig.mockGet).toHaveBeenCalledWith("/pfp-TC007NHSNumber") + }) + + it("returns false if NHS number is not in SSM param", async () => { + process.env.DEPLOYMENT_ENVIRONMENT = "dev" + mockedConfig.mockGet.mockResolvedValue("other,numbers") + const result = await mockedConfig.pfpConfig.isTC007(NHS_NUMBER) + expect(result).toBe(false) + expect(mockedConfig.mockGet).toHaveBeenCalledWith("/pfp-TC007NHSNumber") + }) + + it("uses STACK_NAME from env if present", async () => { + process.env.DEPLOYMENT_ENVIRONMENT = "dev" + process.env.STACK_NAME = "customstack" + await mockedConfig.pfpConfig.isTC007(NHS_NUMBER) + expect(mockedConfig.mockGet).toHaveBeenCalledWith("/customstack-TC007NHSNumber") + }) + + it("returns false if SSM param is undefined", async () => { + process.env.DEPLOYMENT_ENVIRONMENT = "dev" + mockedConfig.mockGet.mockResolvedValue(undefined as unknown as string) + const result = await mockedConfig.pfpConfig.isTC007(NHS_NUMBER) + expect(result).toBe(false) + }) + }) + + describe("isTC008", () => { + it("returns false if DEPLOYMENT_ENVIRONMENT is 'prod'", async () => { + process.env.DEPLOYMENT_ENVIRONMENT = "prod" + const result = await mockedConfig.pfpConfig.isTC008(NHS_NUMBER) + expect(result).toBe(false) + expect(mockedConfig.mockGet).not.toHaveBeenCalled() + }) + + it("returns true if NHS number is in SSM param and env is 'dev'", async () => { + process.env.DEPLOYMENT_ENVIRONMENT = "dev" + const result = await mockedConfig.pfpConfig.isTC008(NHS_NUMBER) + expect(result).toBe(true) + expect(mockedConfig.mockGet).toHaveBeenCalledWith("/pfp-TC008NHSNumber") + }) + + it("returns false if NHS number is not in SSM param", async () => { + process.env.DEPLOYMENT_ENVIRONMENT = "dev" + mockedConfig.mockGet.mockResolvedValue("other,numbers") + const result = await mockedConfig.pfpConfig.isTC008(NHS_NUMBER) + expect(result).toBe(false) + expect(mockedConfig.mockGet).toHaveBeenCalledWith("/pfp-TC008NHSNumber") + }) + + it("uses STACK_NAME from env if present", async () => { + process.env.DEPLOYMENT_ENVIRONMENT = "dev" + process.env.STACK_NAME = "customstack" + await mockedConfig.pfpConfig.isTC008(NHS_NUMBER) + expect(mockedConfig.mockGet).toHaveBeenCalledWith("/customstack-TC008NHSNumber") + }) + + it("returns false if SSM param is undefined", async () => { + process.env.DEPLOYMENT_ENVIRONMENT = "dev" + mockedConfig.mockGet.mockResolvedValue(undefined as unknown as string) + const result = await mockedConfig.pfpConfig.isTC008(NHS_NUMBER) + expect(result).toBe(false) + }) + }) + + describe("isTC009", () => { + it("returns false if DEPLOYMENT_ENVIRONMENT is 'prod'", async () => { + process.env.DEPLOYMENT_ENVIRONMENT = "prod" + const result = await mockedConfig.pfpConfig.isTC009(NHS_NUMBER) + expect(result).toBe(false) + expect(mockedConfig.mockGet).not.toHaveBeenCalled() + }) + + it("returns true if NHS number is in SSM param and env is 'dev'", async () => { + process.env.DEPLOYMENT_ENVIRONMENT = "dev" + const result = await mockedConfig.pfpConfig.isTC009(NHS_NUMBER) + expect(result).toBe(true) + expect(mockedConfig.mockGet).toHaveBeenCalledWith("/pfp-TC009NHSNumber") + }) + + it("returns false if NHS number is not in SSM param", async () => { + process.env.DEPLOYMENT_ENVIRONMENT = "dev" + mockedConfig.mockGet.mockResolvedValue("other,numbers") + const result = await mockedConfig.pfpConfig.isTC009(NHS_NUMBER) + expect(result).toBe(false) + expect(mockedConfig.mockGet).toHaveBeenCalledWith("/pfp-TC009NHSNumber") + }) + + it("uses STACK_NAME from env if present", async () => { + process.env.DEPLOYMENT_ENVIRONMENT = "dev" + process.env.STACK_NAME = "customstack" + await mockedConfig.pfpConfig.isTC009(NHS_NUMBER) + expect(mockedConfig.mockGet).toHaveBeenCalledWith("/customstack-TC009NHSNumber") + }) + + it("returns false if SSM param is undefined", async () => { + process.env.DEPLOYMENT_ENVIRONMENT = "dev" + mockedConfig.mockGet.mockResolvedValue(undefined as unknown as string) + const result = await mockedConfig.pfpConfig.isTC009(NHS_NUMBER) + expect(result).toBe(false) + }) + }) +}) diff --git a/packages/common/utilities/tsconfig.json b/packages/common/utilities/tsconfig.json new file mode 100644 index 000000000..8e9470b59 --- /dev/null +++ b/packages/common/utilities/tsconfig.json @@ -0,0 +1,10 @@ +{ + "extends": "../../../tsconfig.defaults.json", + "compilerOptions": { + "rootDir": "src", + "outDir": "lib", + "resolveJsonModule": true + }, + "include": ["src/**/*", "src/**/*.json"], + "exclude": ["node_modules", "tests"] +} diff --git a/packages/distanceSelling/package.json b/packages/distanceSelling/package.json index 6966f2fe9..3ae6f1b70 100644 --- a/packages/distanceSelling/package.json +++ b/packages/distanceSelling/package.json @@ -19,7 +19,7 @@ "@types/fhir": "^0.0.41" }, "devDependencies": { - "@prescriptionsforpatients_common/testing": "^1.0.0", + "@pfp-common/testing": "^1.0.0", "axios-mock-adapter": "^2.1.0" } } diff --git a/packages/distanceSelling/tests/distanceSelling.test.ts b/packages/distanceSelling/tests/distanceSelling.test.ts index 94dc94bb7..658958472 100644 --- a/packages/distanceSelling/tests/distanceSelling.test.ts +++ b/packages/distanceSelling/tests/distanceSelling.test.ts @@ -6,7 +6,7 @@ import { Organization } from "fhir/r4" import {DistanceSelling, Entry, ServicesCache} from "../src/distanceSelling" -import {mockInteractionResponseBody, mockPharmacy2uResponse} from "@prescriptionsforpatients_common/testing" +import {mockInteractionResponseBody, mockPharmacy2uResponse} from "@pfp-common/testing" import MockAdapter from "axios-mock-adapter" import axios from "axios" import {Logger} from "@aws-lambda-powertools/logger" diff --git a/packages/distanceSelling/tsconfig.json b/packages/distanceSelling/tsconfig.json index abd53653b..46daea80b 100644 --- a/packages/distanceSelling/tsconfig.json +++ b/packages/distanceSelling/tsconfig.json @@ -4,7 +4,10 @@ "rootDir": ".", "outDir": "lib" }, - "references": [{"path": "../serviceSearchClient"}, {"path": "../common/testing"}], + "references": [ + { "path": "../common/utilities" }, + { "path": "../common/testing" } + ], "include": ["src/**/*", "tests/**/*"], "exclude": ["node_modules"] } diff --git a/packages/enrichPrescriptions/jest.config.ts b/packages/enrichPrescriptions/jest.config.ts index fb4d05f26..67f084ee6 100644 --- a/packages/enrichPrescriptions/jest.config.ts +++ b/packages/enrichPrescriptions/jest.config.ts @@ -3,7 +3,8 @@ import defaultConfig from "../../jest.default.config" const jestConfig: JestConfigWithTsJest = { ...defaultConfig, - "rootDir": "./" + "rootDir": "./", + "setupFilesAfterEnv": ["/tests/setup.ts"] } export default jestConfig diff --git a/packages/enrichPrescriptions/package.json b/packages/enrichPrescriptions/package.json index 02b37695d..50cd9b07e 100644 --- a/packages/enrichPrescriptions/package.json +++ b/packages/enrichPrescriptions/package.json @@ -23,6 +23,6 @@ "moment": "^2.30.1" }, "devDependencies": { - "@prescriptionsforpatients_common/testing": "^1.0.0" + "@pfp-common/testing": "^1.0.0" } } diff --git a/packages/enrichPrescriptions/src/enrichPrescriptions.ts b/packages/enrichPrescriptions/src/enrichPrescriptions.ts index bb9fd909c..d229f0b80 100644 --- a/packages/enrichPrescriptions/src/enrichPrescriptions.ts +++ b/packages/enrichPrescriptions/src/enrichPrescriptions.ts @@ -43,7 +43,7 @@ export async function lambdaHandler(event: EnrichPrescriptionsEvent) { logger.info("NHS number", {nhsNumber: `${nhsNumber}`}) const statusUpdates = event.StatusUpdates?.Payload - const updatesScenario = getUpdatesScenario(logger, statusUpdates, nhsNumber) + const updatesScenario = await getUpdatesScenario(logger, statusUpdates, nhsNumber) switch (updatesScenario) { case UpdatesScenario.Present: { diff --git a/packages/enrichPrescriptions/src/statusUpdates.ts b/packages/enrichPrescriptions/src/statusUpdates.ts index 1e6fabd49..fba742676 100644 --- a/packages/enrichPrescriptions/src/statusUpdates.ts +++ b/packages/enrichPrescriptions/src/statusUpdates.ts @@ -9,6 +9,7 @@ import { isolatePerformerReference, isolatePrescriptions } from "./fhirUtils" +import {pfpConfig} from "@pfp-common/utilities" export const EXTENSION_URL = "https://fhir.nhs.uk/StructureDefinition/Extension-DM-PrescriptionStatusHistory" export const VALUE_CODING_SYSTEM = "https://fhir.nhs.uk/CodeSystem/task-businessStatus-nppt" @@ -20,8 +21,6 @@ export const TEMPORARILY_UNAVAILABLE_STATUS = "Tracking Temporarily Unavailable" export const APPROVED_STATUS = "Prescriber Approved" export const CANCELLED_STATUS = "Prescriber Cancelled" -const TC007_NHS_NUMBER = "9992032499" - export const expectStatusUpdates = () => process.env.EXPECT_STATUS_UPDATES === "true" type MedicationRequestStatus = "completed" | "active" @@ -244,13 +243,15 @@ export enum UpdatesScenario { NotExpected } -export function getUpdatesScenario( +export async function getUpdatesScenario( logger: Logger, statusUpdates: StatusUpdates | undefined, nhsNumber: string -): UpdatesScenario { +): Promise { const env = process.env["DEPLOYED_ENVIRONMENT"] - if ((nhsNumber === TC007_NHS_NUMBER) && (env !== "prod")) { + const isTC007 = await pfpConfig.isTC007(nhsNumber) + + if (isTC007 && (env !== "prod")) { // AEA-5653 | TC007: force timeout logger.info("Test NHS number corresponding to TC007 has been received. Returning a timeout response") return UpdatesScenario.ExpectedButAbsent diff --git a/packages/enrichPrescriptions/tests/setup.ts b/packages/enrichPrescriptions/tests/setup.ts new file mode 100644 index 000000000..7b2c595b2 --- /dev/null +++ b/packages/enrichPrescriptions/tests/setup.ts @@ -0,0 +1,12 @@ +import {jest} from "@jest/globals" + +// Mock @aws-sdk/client-ssm to prevent real AWS calls during tests +jest.unstable_mockModule("@aws-sdk/client-ssm", () => ({ + SSMClient: jest.fn(() => ({ + send: jest.fn(() => Promise.resolve({Parameter: {Value: ""}})) + })), + GetParameterCommand: jest.fn(), + GetParametersCommand: jest.fn(), + PutParameterCommand: jest.fn(), + paginateGetParametersByPath: jest.fn() +})) diff --git a/packages/enrichPrescriptions/tests/testStatusUpdate.test.ts b/packages/enrichPrescriptions/tests/testStatusUpdate.test.ts index b3183c14d..ad94f1331 100644 --- a/packages/enrichPrescriptions/tests/testStatusUpdate.test.ts +++ b/packages/enrichPrescriptions/tests/testStatusUpdate.test.ts @@ -38,13 +38,24 @@ import { import {Bundle, MedicationRequest} from "fhir/r4" import {Logger} from "@aws-lambda-powertools/logger" import {isolateMedicationRequests, isolatePrescriptions} from "../src/fhirUtils" +import {createMockedPfPConfig, MockedPfPConfig, setupTestEnvironment} from "@pfp-common/testing" + +const TC007_NHS_NUMBER = "9992032499" describe("Unit tests for statusUpdate", function () { let logger: Logger + let testEnv: ReturnType + let mockedConfig: MockedPfPConfig beforeEach(() => { jest.useFakeTimers().setSystemTime(SYSTEM_DATETIME) logger = new Logger({serviceName: "testStatusUpdate", logLevel: "INFO"}) + testEnv = setupTestEnvironment() + mockedConfig = createMockedPfPConfig([TC007_NHS_NUMBER]) + }) + + afterEach(() => { + testEnv.restoreEnvironment() }) it("when no update is present for a prescription, the not-onboarded update is applied", async () => { @@ -269,6 +280,15 @@ describe("Unit tests for statusUpdate", function () { expect(medicationRequest.extension[0].extension!.length).toEqual(2) }) + it("returns TC007 error when TC007 test NHS number is received in non-production environment", async () => { + process.env.DEPLOYMENT_ENVIRONMENT = "dev" + // Mock SSMProvider.get() to return a comma-separated string containing the TC007_NHS_NUMBER + mockedConfig.mockGet.mockResolvedValue(`${TC007_NHS_NUMBER},1234567890,0987654321`) + const result = await mockedConfig.pfpConfig.isTC007(TC007_NHS_NUMBER) + expect(result).toBe(true) + expect(mockedConfig.mockGet).toHaveBeenCalledWith("/pfp-TC007NHSNumber") + }) + describe("Delay WithPharmacy status", () => { type TestCase = { pfpStatus: string @@ -497,7 +517,7 @@ describe("Unit tests for statusUpdate", function () { const statusUpdates = updatesPresent ? {isSuccess: true, prescriptions: [], schemaVersion: 1} : undefined const nhsNumber = "9990236291" - const scenario = getUpdatesScenario(logger, statusUpdates, nhsNumber) + const scenario = await getUpdatesScenario(logger, statusUpdates, nhsNumber) expect(scenario).toEqual(expected) }) diff --git a/packages/enrichPrescriptions/tsconfig.json b/packages/enrichPrescriptions/tsconfig.json index 454c4bb36..a13252da0 100644 --- a/packages/enrichPrescriptions/tsconfig.json +++ b/packages/enrichPrescriptions/tsconfig.json @@ -4,7 +4,10 @@ "rootDir": ".", "outDir": "lib" }, - "references": [{"path": "../common/testing"}], + "references": [ + { "path": "../common/utilities" }, + { "path": "../common/testing" } + ], "include": ["src/**/*", "tests/**/*", "tests/**/*.json"], - "exclude": ["node_modules"] + "exclude": ["node_modules", "tests/setup.ts"] } diff --git a/packages/getMyPrescriptions/package.json b/packages/getMyPrescriptions/package.json index ae6b403b7..3e66c7887 100644 --- a/packages/getMyPrescriptions/package.json +++ b/packages/getMyPrescriptions/package.json @@ -27,7 +27,8 @@ "@types/fhir": "^0.0.41" }, "devDependencies": { - "@prescriptionsforpatients_common/testing": "^1.0.0", + "@pfp-common/utilities": "^1.0.0", + "@pfp-common/testing": "^1.0.0", "axios-mock-adapter": "^2.1.0" } } diff --git a/packages/getMyPrescriptions/src/getMyPrescriptions.ts b/packages/getMyPrescriptions/src/getMyPrescriptions.ts index e3811dd1b..676274b8e 100644 --- a/packages/getMyPrescriptions/src/getMyPrescriptions.ts +++ b/packages/getMyPrescriptions/src/getMyPrescriptions.ts @@ -27,6 +27,7 @@ import {extractNHSNumber, NHSNumberValidationError} from "./extractNHSNumber" import {deepCopy, hasTimedOut, jobWithTimeout} from "./utils" import {buildStatusUpdateData, shouldGetStatusUpdates} from "./statusUpdate" import {extractOdsCodes, isolateOperationOutcome} from "./fhirUtils" +import {pfpConfig, PfPConfig} from "@pfp-common/utilities" const LOG_LEVEL = process.env.LOG_LEVEL as LogLevel export const logger = new Logger({serviceName: "getMyPrescriptions", logLevel: LOG_LEVEL}) @@ -38,8 +39,6 @@ const LAMBDA_TIMEOUT_MS = 10_000 const SPINE_TIMEOUT_MS = 9_000 const SERVICE_SEARCH_TIMEOUT_MS = 5_000 -export const TC008_NHS_NUMBER = "9992387920" - type EventHeaders = Record export type GetMyPrescriptionsEvent = { @@ -80,8 +79,6 @@ async function eventHandler( const requestId = headers["apigw-request-id"] const spineClient = params.spineClient - const env = process.env["DEPLOYMENT_ENVIRONMENT"] - const traceIDs: TraceIDs = { "nhsd-correlation-id": headers["nhsd-correlation-id"], "x-request-id": xRequestId, @@ -102,9 +99,7 @@ async function eventHandler( const nhsNumber = extractNHSNumber(headers["nhsd-nhslogin-user"]) logger.info(`nhsNumber: ${nhsNumber}`, {nhsNumber}) headers["nhsNumber"] = nhsNumber - - // AEA-5653 | TC008: force internal error response - if ((nhsNumber === TC008_NHS_NUMBER) && (env !== "prod")) { + if (await params.pfpConfig.isTC008(nhsNumber)) { logger.info("Test NHS number corresponding to TC008 has been received. Returning a 500 response") return TC008_ERROR_RESPONSE } @@ -146,10 +141,10 @@ async function eventHandler( timeout: SERVICE_SEARCH_TIMEOUT_MS, message: `The request to the distance selling service timed out after ${SERVICE_SEARCH_TIMEOUT_MS}ms.` }) - return successResponse(logger, nhsNumber, searchsetBundle, traceIDs, statusUpdateData) + return await successResponse(logger, nhsNumber, searchsetBundle, traceIDs, params.pfpConfig, statusUpdateData) } - return successResponse(logger, nhsNumber, distanceSellingBundle, traceIDs, statusUpdateData) + return await successResponse(logger, nhsNumber, distanceSellingBundle, traceIDs, params.pfpConfig, statusUpdateData) } catch (error) { if (error instanceof NHSNumberValidationError) { return INVALID_NHS_NUMBER_RESPONSE @@ -170,12 +165,14 @@ type HandlerParams = { spineTimeoutMs: number serviceSearchTimeoutMs: number spineClient: SpineClient + pfpConfig: PfPConfig } export const DEFAULT_HANDLER_PARAMS = { lambdaTimeoutMs: LAMBDA_TIMEOUT_MS, spineTimeoutMs: SPINE_TIMEOUT_MS, serviceSearchTimeoutMs: SERVICE_SEARCH_TIMEOUT_MS, - spineClient: _spineClient + spineClient: _spineClient, + pfpConfig: pfpConfig } export const newHandler = (handlerConfig: HandlerConfig) => { diff --git a/packages/getMyPrescriptions/src/responses.ts b/packages/getMyPrescriptions/src/responses.ts index be83627f7..69d0f93e1 100644 --- a/packages/getMyPrescriptions/src/responses.ts +++ b/packages/getMyPrescriptions/src/responses.ts @@ -2,9 +2,7 @@ import {Bundle, BundleEntry, OperationOutcome} from "fhir/r4" import {StatusUpdateData, shouldGetStatusUpdates} from "./statusUpdate" import {APIGatewayProxyResult as LambdaResult} from "aws-lambda" import {Logger} from "@aws-lambda-powertools/logger" - -const TC009_SINGLE_EXCLUDED_PRESCRIPTION_NHS_NUMBER = "9990624666" -const TC009_MULTIPLE_EXCLUDED_PRESCRIPTIONS_NHS_NUMBER = "9997750640" +import {PfPConfig} from "@pfp-common/utilities" export type FhirBody = Bundle | OperationOutcome @@ -31,8 +29,9 @@ export type ResponseFunc = ( nhsNumber: string, fhirBody: FhirBody, traceIDs: TraceIDs, + pfpConfig: PfPConfig, statusUpdateData?: Array -) => LambdaResult +) => Promise export const HEADERS = { "Content-Type": "application/fhir+json", @@ -182,13 +181,14 @@ export function createExcludedPrescriptionEntry(): BundleEntry { } } -export function stateMachineLambdaResponse( +export async function stateMachineLambdaResponse( logger: Logger, nhsNumber: string, fhirBody: FhirBody, traceIDs: TraceIDs, + pfpConfig: PfPConfig, statusUpdateData?: Array -): LambdaResult { +): Promise { const body: StateMachineFunctionResponseBody = { fhir: fhirBody, getStatusUpdates: shouldGetStatusUpdates(), @@ -203,13 +203,11 @@ export function stateMachineLambdaResponse( } const env = process.env["DEPLOYED_ENVIRONMENT"] + const isTC009 = await pfpConfig.isTC009(nhsNumber) if ( env !== "prod" - && ( - nhsNumber === TC009_MULTIPLE_EXCLUDED_PRESCRIPTIONS_NHS_NUMBER - || nhsNumber === TC009_SINGLE_EXCLUDED_PRESCRIPTION_NHS_NUMBER - ) + && isTC009 ) { // When testing with TC009, inject our dummy excluded‐prescription entry if ((body.fhir as Bundle).entry) { @@ -219,7 +217,7 @@ export function stateMachineLambdaResponse( bundle.entry ??= [] bundle.entry.push(createExcludedPrescriptionEntry()) - if (nhsNumber === TC009_MULTIPLE_EXCLUDED_PRESCRIPTIONS_NHS_NUMBER) { + if (isTC009) { bundle.entry.push(createExcludedPrescriptionEntry()) } diff --git a/packages/getMyPrescriptions/tests/fhirUtils.test.ts b/packages/getMyPrescriptions/tests/fhirUtils.test.ts index cd6508c29..116affd63 100644 --- a/packages/getMyPrescriptions/tests/fhirUtils.test.ts +++ b/packages/getMyPrescriptions/tests/fhirUtils.test.ts @@ -3,7 +3,7 @@ import "jest" import {Bundle, Organization} from "fhir/r4" -import {mockInteractionResponseBody} from "@prescriptionsforpatients_common/testing" +import {mockInteractionResponseBody} from "@pfp-common/testing" import { Entry, diff --git a/packages/getMyPrescriptions/tests/statusUpdate.test.ts b/packages/getMyPrescriptions/tests/statusUpdate.test.ts index 4c765f4b8..9bf72f8b6 100644 --- a/packages/getMyPrescriptions/tests/statusUpdate.test.ts +++ b/packages/getMyPrescriptions/tests/statusUpdate.test.ts @@ -18,7 +18,7 @@ import { mockPharmacy2uResponse, mockPharmicaResponse, mockStateMachineInputEvent -} from "@prescriptionsforpatients_common/testing" +} from "@pfp-common/testing" import {buildStatusUpdateData} from "../src/statusUpdate" import {StateMachineFunctionResponseBody} from "../src/responses" @@ -30,6 +30,7 @@ import { stateMachineEventHandler } from "../src/getMyPrescriptions" import {EXPECTED_TRACE_IDS, SERVICE_SEARCH_PARAMS} from "./utils" +import {createMockedPfPConfig, MockedPfPConfig, setupTestEnvironment} from "@pfp-common/testing" import {LogLevel} from "@aws-lambda-powertools/logger/types" import {Logger} from "@aws-lambda-powertools/logger" import {createSpineClient} from "@NHSDigital/eps-spine-client" @@ -110,7 +111,12 @@ describe("Unit tests for statusUpdate", () => { describe("Unit tests for statusUpdate, via handler", function () { // eslint-disable-next-line @typescript-eslint/no-explicit-any let handler: MiddyfiedHandler + let testEnv: ReturnType + let mockedConfig: MockedPfPConfig + beforeEach(() => { + testEnv = setupTestEnvironment() + mockedConfig = createMockedPfPConfig([]) process.env.TargetSpineServer = "spine" process.env.TargetServiceSearchServer = "service-search" process.env.SpinePublicCertificate = "public-certificate" @@ -120,7 +126,7 @@ describe("Unit tests for statusUpdate, via handler", function () { const LOG_LEVEL = process.env.LOG_LEVEL as LogLevel const logger = new Logger({serviceName: "getMyPrescriptions", logLevel: LOG_LEVEL}) const _spineClient = createSpineClient(logger) - const handlerParams = {...DEFAULT_HANDLER_PARAMS, spineClient: _spineClient} + const handlerParams = {...DEFAULT_HANDLER_PARAMS, spineClient: _spineClient, pfpConfig: mockedConfig.pfpConfig} handler = newHandler({ handlerFunction: stateMachineEventHandler, params: handlerParams, @@ -129,6 +135,10 @@ describe("Unit tests for statusUpdate, via handler", function () { jest.useFakeTimers() }) + afterEach(() => { + testEnv.restoreEnvironment() + }) + it("when event is processed, statusUpdateData is included in the response", async () => { const event: GetMyPrescriptionsEvent = JSON.parse(exampleEvent) diff --git a/packages/getMyPrescriptions/tests/test-handler.test.ts b/packages/getMyPrescriptions/tests/test-handler.test.ts index 09e7a1727..dcca05001 100644 --- a/packages/getMyPrescriptions/tests/test-handler.test.ts +++ b/packages/getMyPrescriptions/tests/test-handler.test.ts @@ -4,8 +4,7 @@ import { newHandler, GetMyPrescriptionsEvent, stateMachineEventHandler, - STATE_MACHINE_MIDDLEWARE, - TC008_NHS_NUMBER + STATE_MACHINE_MIDDLEWARE } from "../src/getMyPrescriptions" import {Logger} from "@aws-lambda-powertools/logger" import axios from "axios" @@ -24,19 +23,17 @@ import { mockPharmicaResponse, helloworldContext, mockStateMachineInputEvent -} from "@prescriptionsforpatients_common/testing" +} from "@pfp-common/testing" -import { - HEADERS, - StateMachineFunctionResponseBody, - TIMEOUT_RESPONSE, - TC008_ERROR_RESPONSE -} from "../src/responses" +import {HEADERS, StateMachineFunctionResponseBody, TIMEOUT_RESPONSE} from "../src/responses" import "./toMatchJsonLogMessage" import {EXPECTED_TRACE_IDS} from "./utils" import {LogLevel} from "@aws-lambda-powertools/logger/types" import {createSpineClient} from "@NHSDigital/eps-spine-client" import {MiddyfiedHandler} from "@middy/core" +import {createMockedPfPConfig, MockedPfPConfig, setupTestEnvironment} from "@pfp-common/testing" + +const TC008_NHS_NUMBER = "9992387920" const dummyContext = helloworldContext const mock = new MockAdapter(axios) @@ -116,9 +113,20 @@ type spineFailureTestData = { errorResponse: object expectedHttpResponse: number scenarioDescription: string -} +}; describe("Unit test for app handler", function () { + let testEnv: ReturnType + let mockedConfig: MockedPfPConfig + + beforeEach(() => { + testEnv = setupTestEnvironment() + mockedConfig = createMockedPfPConfig([TC008_NHS_NUMBER]) + }) + + afterEach(() => { + testEnv.restoreEnvironment() + }) const ENV = process.env // eslint-disable-next-line @typescript-eslint/no-explicit-any let handler: MiddyfiedHandler @@ -130,7 +138,7 @@ describe("Unit test for app handler", function () { const LOG_LEVEL = process.env.LOG_LEVEL as LogLevel const logger = new Logger({serviceName: "getMyPrescriptions", logLevel: LOG_LEVEL}) const _spineClient = createSpineClient(logger) - const handlerParams = {...DEFAULT_HANDLER_PARAMS, spineClient: _spineClient} + const handlerParams = {...DEFAULT_HANDLER_PARAMS, spineClient: _spineClient, pfpConfig: mockedConfig.pfpConfig} handler = newHandler({ handlerFunction: stateMachineEventHandler, params: handlerParams, @@ -300,7 +308,12 @@ describe("Unit test for app handler", function () { const logger = new Logger({serviceName: "getMyPrescriptions", logLevel: LOG_LEVEL}) const _spineClient = createSpineClient(logger) - const handlerParams = {...DEFAULT_HANDLER_PARAMS, lambdaTimeoutMs: 1_000, spineClient: _spineClient} + const handlerParams = { + ...DEFAULT_HANDLER_PARAMS, + lambdaTimeoutMs: 1_000, + spineClient: _spineClient, + pfpConfig: mockedConfig.pfpConfig + } const handler = newHandler({ handlerFunction: stateMachineEventHandler, params: handlerParams, @@ -326,20 +339,21 @@ describe("Unit test for app handler", function () { expect(mockErrorLogger).toHaveBeenCalledWith("Lambda handler has timed out. Returning error response.") }) - it("returns TC007 error when TC007 test NHS number is received in non-production environment", async () => { + it("returns TC008 error when TC008 test NHS number is received in non-production environment", async () => { process.env.DEPLOYMENT_ENVIRONMENT = "dev" - const event: GetMyPrescriptionsEvent = JSON.parse(exampleStateMachineEvent) - event.headers["nhsd-nhslogin-user"] = `P9:${TC008_NHS_NUMBER}` - const result: LambdaResult = await handler(event, dummyContext) - expect(result.statusCode).toBe(500) - expect(result.headers).toEqual(HEADERS) - expect(JSON.parse(result.body)).toEqual(JSON.parse(TC008_ERROR_RESPONSE.body)) + // Mock SSMProvider.get() to return a comma-separated string containing the TC008_NHS_NUMBER + mockedConfig.mockGet.mockResolvedValue(`${TC008_NHS_NUMBER},1234567890,0987654321`) + const result = await mockedConfig.pfpConfig.isTC008(TC008_NHS_NUMBER) + expect(result).toBe(true) + expect(mockedConfig.mockGet).toHaveBeenCalledWith("/pfp-TC008NHSNumber") }) }) describe("Unit tests for app handler including service search", function () { // eslint-disable-next-line @typescript-eslint/no-explicit-any let handler: MiddyfiedHandler + let testEnv: ReturnType + let mockedConfig: MockedPfPConfig const queryParams = { "api-version": 2, @@ -350,6 +364,8 @@ describe("Unit tests for app handler including service search", function () { } beforeEach(() => { + testEnv = setupTestEnvironment() + mockedConfig = createMockedPfPConfig([TC008_NHS_NUMBER]) mock.reset() mock.resetHistory() jest.useFakeTimers() @@ -361,7 +377,7 @@ describe("Unit tests for app handler including service search", function () { const LOG_LEVEL = process.env.LOG_LEVEL as LogLevel const logger = new Logger({serviceName: "getMyPrescriptions", logLevel: LOG_LEVEL}) const _spineClient = createSpineClient(logger) - const handlerParams = {...DEFAULT_HANDLER_PARAMS, spineClient: _spineClient} + const handlerParams = {...DEFAULT_HANDLER_PARAMS, spineClient: _spineClient, pfpConfig: mockedConfig.pfpConfig} handler = newHandler({ handlerFunction: stateMachineEventHandler, params: handlerParams, @@ -370,6 +386,7 @@ describe("Unit tests for app handler including service search", function () { }) afterEach(() => { + testEnv.restoreEnvironment() jest.clearAllTimers() }) @@ -482,6 +499,8 @@ describe("Unit tests for app handler including service search", function () { describe("Unit tests for logging functionality", function () { // eslint-disable-next-line @typescript-eslint/no-explicit-any let handler: MiddyfiedHandler + let testEnv: ReturnType + let mockedConfig: MockedPfPConfig const queryParams = { "api-version": 2, @@ -492,6 +511,8 @@ describe("Unit tests for logging functionality", function () { } beforeEach(() => { + testEnv = setupTestEnvironment() + mockedConfig = createMockedPfPConfig([TC008_NHS_NUMBER]) mock.reset() mock.resetHistory() jest.useFakeTimers() @@ -503,7 +524,7 @@ describe("Unit tests for logging functionality", function () { const LOG_LEVEL = process.env.LOG_LEVEL as LogLevel const logger = new Logger({serviceName: "getMyPrescriptions", logLevel: LOG_LEVEL}) const _spineClient = createSpineClient(logger) - const handlerParams = {...DEFAULT_HANDLER_PARAMS, spineClient: _spineClient} + const handlerParams = {...DEFAULT_HANDLER_PARAMS, spineClient: _spineClient, pfpConfig: mockedConfig.pfpConfig} handler = newHandler({ handlerFunction: stateMachineEventHandler, params: handlerParams, @@ -512,6 +533,7 @@ describe("Unit tests for logging functionality", function () { }) afterEach(() => { + testEnv.restoreEnvironment() jest.clearAllTimers() }) diff --git a/packages/getMyPrescriptions/tsconfig.json b/packages/getMyPrescriptions/tsconfig.json index 59f9c31ee..43daf3745 100644 --- a/packages/getMyPrescriptions/tsconfig.json +++ b/packages/getMyPrescriptions/tsconfig.json @@ -4,7 +4,11 @@ "rootDir": ".", "outDir": "lib" }, - "references": [{"path": "../distanceSelling"}, {"path": "../common/testing"}], + "references": [ + {"path": "../distanceSelling"}, + { "path": "../common/utilities" }, + { "path": "../common/testing" } + ], "include": ["src/**/*", "tests/**/*"], "exclude": ["node_modules"] } diff --git a/packages/nhsd-pfp-sandbox/package.json b/packages/nhsd-pfp-sandbox/package.json index b2841a8aa..5bc45b248 100644 --- a/packages/nhsd-pfp-sandbox/package.json +++ b/packages/nhsd-pfp-sandbox/package.json @@ -20,6 +20,6 @@ "@nhs/fhir-middy-error-handler": "^2.1.54" }, "devDependencies": { - "@prescriptionsforpatients_common/testing": "^1.0.0" + "@pfp-common/testing": "^1.0.0" } } diff --git a/packages/nhsd-pfp-sandbox/tests/test-handler.test.ts b/packages/nhsd-pfp-sandbox/tests/test-handler.test.ts index 26623ea9b..d9d90c142 100644 --- a/packages/nhsd-pfp-sandbox/tests/test-handler.test.ts +++ b/packages/nhsd-pfp-sandbox/tests/test-handler.test.ts @@ -7,7 +7,7 @@ import { helloworldContext, test_append_trace_ids, test_mime_type -} from "@prescriptionsforpatients_common/testing" +} from "@pfp-common/testing" const dummyContext = helloworldContext const mockEvent: APIGatewayProxyEvent = mockAPIGatewayProxyEvent diff --git a/packages/nhsd-pfp-sandbox/tsconfig.json b/packages/nhsd-pfp-sandbox/tsconfig.json index ca0f52db8..fb996d46a 100644 --- a/packages/nhsd-pfp-sandbox/tsconfig.json +++ b/packages/nhsd-pfp-sandbox/tsconfig.json @@ -4,7 +4,10 @@ "rootDir": ".", "outDir": "lib" }, - "references": [{"path": "../common/testing"}], + "references": [ + { "path": "../common/utilities" }, + { "path": "../common/testing" } + ], "include": ["src/**/*", "tests/**/*", "examples/GetMyPrescriptions/Bundle/success.json"], "exclude": ["node_modules"] } diff --git a/packages/serviceSearchClient/package.json b/packages/serviceSearchClient/package.json index 88ccd6aab..157f5e636 100644 --- a/packages/serviceSearchClient/package.json +++ b/packages/serviceSearchClient/package.json @@ -20,7 +20,7 @@ "axios-retry": "^4.5.0" }, "devDependencies": { - "@prescriptionsforpatients_common/testing": "^1.0.0", + "@pfp-common/testing": "^1.0.0", "axios-mock-adapter": "^2.1.0" } } diff --git a/packages/serviceSearchClient/tests/live-serviceSearch-client.test.ts b/packages/serviceSearchClient/tests/live-serviceSearch-client.test.ts index 771cb84fc..cc8219193 100644 --- a/packages/serviceSearchClient/tests/live-serviceSearch-client.test.ts +++ b/packages/serviceSearchClient/tests/live-serviceSearch-client.test.ts @@ -3,7 +3,7 @@ import {jest} from "@jest/globals" import MockAdapter from "axios-mock-adapter" import axios, {AxiosError, AxiosRequestConfig, AxiosResponse} from "axios" import {Logger} from "@aws-lambda-powertools/logger" -import {mockPharmacy2uResponse} from "@prescriptionsforpatients_common/testing" +import {mockPharmacy2uResponse} from "@pfp-common/testing" const mock = new MockAdapter(axios) diff --git a/packages/serviceSearchClient/tsconfig.json b/packages/serviceSearchClient/tsconfig.json index 2dc2ae70f..6af25315c 100644 --- a/packages/serviceSearchClient/tsconfig.json +++ b/packages/serviceSearchClient/tsconfig.json @@ -7,7 +7,10 @@ "composite": true, "declaration": true }, - "references": [{"path": "../common/testing"}], + "references": [ + { "path": "../common/utilities" }, + { "path": "../common/testing" } + ], "include": ["src/**/*", "tests/**/*"], "exclude": ["node_modules"] } diff --git a/packages/statusLambda/tests/test-handler.test.ts b/packages/statusLambda/tests/test-handler.test.ts index 124980f5e..11bc5d46d 100644 --- a/packages/statusLambda/tests/test-handler.test.ts +++ b/packages/statusLambda/tests/test-handler.test.ts @@ -12,7 +12,7 @@ import MockAdapter from "axios-mock-adapter" import axios from "axios" import {handler} from "../src/statusLambda" -import {mockAPIGatewayProxyEvent, helloworldContext} from "@prescriptionsforpatients_common/testing" +import {mockAPIGatewayProxyEvent, helloworldContext} from "@pfp-common/testing" const mock = new MockAdapter(axios) diff --git a/packages/statusLambda/tsconfig.json b/packages/statusLambda/tsconfig.json index bf3b049e5..46daea80b 100644 --- a/packages/statusLambda/tsconfig.json +++ b/packages/statusLambda/tsconfig.json @@ -4,6 +4,10 @@ "rootDir": ".", "outDir": "lib" }, + "references": [ + { "path": "../common/utilities" }, + { "path": "../common/testing" } + ], "include": ["src/**/*", "tests/**/*"], "exclude": ["node_modules"] } diff --git a/tsconfig.build.json b/tsconfig.build.json index 059548f09..85939df41 100644 --- a/tsconfig.build.json +++ b/tsconfig.build.json @@ -4,13 +4,14 @@ "files": [], // Building this project will build all of the following: "references": [ + { "path": "packages/common/utilities" }, + { "path": "packages/common/testing" }, { "path": "packages/serviceSearchClient" }, { "path": "packages/capabilityStatement" }, { "path": "packages/getMyPrescriptions" }, { "path": "packages/enrichPrescriptions" }, { "path": "packages/nhsd-pfp-sandbox" }, { "path": "packages/statusLambda" }, - { "path": "packages/common/testing" }, { "path": "packages/distanceSelling" } ] } diff --git a/tsconfig.defaults.json b/tsconfig.defaults.json index 0559f64ec..0a9e59fe6 100644 --- a/tsconfig.defaults.json +++ b/tsconfig.defaults.json @@ -13,6 +13,13 @@ "forceConsistentCasingInFileNames": true, "preserveConstEnums": true, "resolveJsonModule": true, - "allowJs": true + "allowJs": true, + "baseUrl": ".", + "paths": { + "@pfp-common/utilities": ["./packages/common/utilities/lib/index.d.ts"], + "@pfp-common/utilities/*": ["./packages/common/utilities/lib/*"], + "@pfp-common/testing": ["./packages/common/testing/lib/index.d.ts"], + "@pfp-common/testing/*": ["./packages/common/testing/lib/*"] + } } }