diff --git a/.env.sample b/.env.sample new file mode 100644 index 000000000..6bc0d2ddf --- /dev/null +++ b/.env.sample @@ -0,0 +1,57 @@ +NODE_ENV=development +PORT=3009 +ENVIRONMENT=local +ENFORCE_CSRF=true +SERVICE_VERSION= +PHASE_TAG=beta + +SESSION_TIMEOUT=86400000 +CONFIRMATION_SESSION_TIMEOUT=1200000 +SESSION_COOKIE_PASSWORD= +SESSION_COOKIE_TTL=2419200000 +REDIS_PASSWORD= +REDIS_USERNAME=default +REDIS_HOST=localhost +REDIS_KEY_PREFIX=forms-runner +TRACING_HEADER=x-cdp-request-id +AWS_REGION=eu-west-2 +MANAGER_URL=http://localhost:3001 +BASE_URL=http://localhost:3009 + +NOTIFY_TEMPLATE_ID= +NOTIFY_API_KEY= +FEEDBACK_LINK= + +DESIGNER_URL=http://localhost:3000 +SUBMISSION_URL=http://localhost:3002 +UPLOADER_BUCKET_NAME= +UPLOADER_URL=http://uploader.127.0.0.1.sslip.io:7300 + +GOOGLE_ANALYTICS_TRACKING_ID= +GOOGLE_ANALYTICS_CONTAINER_ID= + +USE_SINGLE_INSTANCE_CACHE=true + +SNS_ENDPOINT=http://localhost:4566 +SNS_ADAPTER_TOPIC_ARN= +SNS_SAVE_TOPIC_ARN= +SNS_FORM_TOPIC_ARN_MAP= + +LOG_ENABLED=true +LOG_LEVEL=debug +LOG_FORMAT=pino-pretty +SAFELIST='["61bca17e-fe74-40e0-9c15-a901ad120eca.mock.pstmn.io"]' +STAGING_PREFIX=staging +SERVICE_BANNER_TEXT= +GOOGLE_TAG_MANAGER_CONTAINER_ID= +SAVE_AND_EXIT_EXPIRY_IN_DAYS=28 +STORE_COMPLETED_APPLICATIONS_FOR=9 months +STORE_FEEDBACK_FOR=9 months +ORDNANCE_SURVEY_API_KEY= +ORDNANCE_SURVEY_API_SECRET= +USE_MAPS_FEATURE=false +FEEDBACK_VIA_EMAIL=defraforms@defra.gov.uk + +#PAYMENT_PROVIDER_API_KEY_TEST= + +PRIVATE_KEY_FOR_SECRETS= diff --git a/jest.setup.cjs b/jest.setup.cjs index aa4b262af..8380e97c3 100644 --- a/jest.setup.cjs +++ b/jest.setup.cjs @@ -1,25 +1,51 @@ +process.env.NODE_ENV = 'test' +process.env.PORT = '3009' +process.env.ENVIRONMENT = 'local' +process.env.ENFORCE_CSRF = 'true' +process.env.SERVICE_VERSION = 'local-dev' +process.env.PHASE_TAG = 'beta' + +process.env.SESSION_TIMEOUT = '86400000' +process.env.CONFIRMATION_SESSION_TIMEOUT = '1200000' process.env.MANAGER_URL = 'http://localhost:3001' process.env.REDIS_HOST = 'dummy' -process.env.REDIS_KEY_PREFIX = 'forms-designer' +process.env.REDIS_KEY_PREFIX = 'forms-runner' process.env.REDIS_PASSWORD = 'dummy' process.env.REDIS_USERNAME = 'dummy' process.env.SESSION_COOKIE_PASSWORD = 'test-env-session-cookie-password' +process.env.SESSION_COOKIE_TTL = '2419200000' +process.env.TRACING_HEADER = 'x-cdp-request-id' +process.env.AWS_REGION = 'eu-west-2' process.env.NOTIFY_TEMPLATE_ID = 'dummy' process.env.NOTIFY_API_KEY = 'dummy' +process.env.FEEDBACK_LINK = 'http://test.com' process.env.DESIGNER_URL = 'https://forms-designer' process.env.SUBMISSION_URL = 'https://test-submission-api.cdp-int.defra.cloud' process.env.UPLOADER_URL = 'https://test-uploader.cdp-int.defra.cloud' process.env.UPLOADER_BUCKET_NAME = 'dummy-bucket' process.env.GOOGLE_TAG_MANAGER_CONTAINER_ID = 'GTM-XXXXXXXX' +process.env.GOOGLE_ANALYTICS_TRACKING_ID = '12345' process.env.GOOGLE_ANALYTICS_CONTAINER_ID = 'YYYYYYYYYY' +process.env.USE_SINGLE_INSTANCE_CACHE = 'true' process.env.BASE_URL = 'http://localhost:3009' process.env.SNS_ADAPTER_TOPIC_ARN = 'arn:aws:sns:eu-west-2:123456789012:test-adapter-topic' process.env.SNS_SAVE_TOPIC_ARN = 'arn:aws:sns:eu-west-2:123456789012:test-save-topic' -process.env.SNS_ADAPTER_TOPIC_ARN = - 'arn:aws:sns:eu-west-2:123456789012:test-adapter-topic' process.env.SNS_ENDPOINT = 'http://localhost:4566' +process.env.LOG_ENABLED = 'true' +process.env.LOG_LEVEL = 'debug' +process.env.LOG_FORMAT = 'pino-pretty' +process.env.SAFELIST = '["61bca17e-fe74-40e0-9c15-a901ad120eca.mock.pstmn.io"]' +process.env.STAGING_PREFIX = 'staging' +process.env.SERVICE_BANNER_TEXT = '' +process.env.SAVE_AND_EXIT_EXPIRY_IN_DAYS = '28' +process.env.STORE_COMPLETED_APPLICATIONS_FOR = '9 months' +process.env.STORE_FEEDBACK_FOR = '9 months' +process.env.ORDNANCE_SURVEY_API_KEY = 'dummy-ordnance-survey-api-key' +process.env.ORDNANCE_SURVEY_API_SECRET = 'dummy-ordnance-survey-api-secret' +process.env.USE_MAPS_FEATURE = 'false' +process.env.FEEDBACK_VIA_EMAIL = 'defraforms@defra.gov.uk' process.env.PRIVATE_KEY_FOR_SECRETS = 'dummy-private-key' process.env.SNS_FORM_TOPIC_ARN_MAP = '{"507f1f77bcf86cd799439099":"arn:aws:sns:eu-west-2:123456789012:form-specific-topic"}' diff --git a/package-lock.json b/package-lock.json index 5b4fb43d5..04af5cbb6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -747,13 +747,13 @@ } }, "node_modules/@aws-sdk/xml-builder": { - "version": "3.972.11", - "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.972.11.tgz", - "integrity": "sha512-iitV/gZKQMvY9d7ovmyFnFuTHbBAtrmLnvaSb/3X8vOKyevwtpmEtyc8AdhVWZe0pI/1GsHxlEvQeOePFzy7KQ==", + "version": "3.972.16", + "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.972.16.tgz", + "integrity": "sha512-iu2pyvaqmeatIJLURLqx9D+4jKAdTH20ntzB6BFwjyN7V960r4jK32mx0Zf7YbtOYAbmbtQfDNuL60ONinyw7A==", "license": "Apache-2.0", "dependencies": { "@smithy/types": "^4.13.1", - "fast-xml-parser": "5.4.1", + "fast-xml-parser": "5.5.8", "tslib": "^2.6.2" }, "engines": { @@ -6099,9 +6099,9 @@ } }, "node_modules/@eslint/config-array/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.13.tgz", + "integrity": "sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w==", "dev": true, "license": "MIT", "dependencies": { @@ -6173,9 +6173,9 @@ } }, "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.13.tgz", + "integrity": "sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w==", "dev": true, "license": "MIT", "dependencies": { @@ -9743,9 +9743,9 @@ } }, "node_modules/@stylistic/eslint-plugin/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", "dev": true, "license": "MIT", "engines": { @@ -11349,9 +11349,9 @@ } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz", - "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", + "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", "dev": true, "license": "MIT", "dependencies": { @@ -13190,9 +13190,9 @@ } }, "node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.3.tgz", + "integrity": "sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA==", "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" @@ -17413,9 +17413,9 @@ } }, "node_modules/eslint-plugin-react/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.13.tgz", + "integrity": "sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w==", "dev": true, "license": "MIT", "dependencies": { @@ -17501,9 +17501,9 @@ } }, "node_modules/eslint/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.13.tgz", + "integrity": "sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w==", "dev": true, "license": "MIT", "dependencies": { @@ -17951,9 +17951,9 @@ "license": "MIT" }, "node_modules/express/node_modules/path-to-regexp": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", - "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.13.tgz", + "integrity": "sha512-A/AGNMFN3c8bOlvV9RreMdrv7jsmF9XIfDeCd87+I8RNg6s78BhJxMu69NEMHBSJFxKidViTEdruRwEk/WIKqA==", "license": "MIT" }, "node_modules/express/node_modules/range-parser": { @@ -18062,9 +18062,9 @@ } }, "node_modules/fast-xml-parser": { - "version": "5.5.6", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.5.6.tgz", - "integrity": "sha512-3+fdZyBRVg29n4rXP0joHthhcHdPUHaIC16cuyyd1iLsuaO6Vea36MPrxgAzbZna8lhvZeRL8Bc9GP56/J9xEw==", + "version": "5.5.9", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.5.9.tgz", + "integrity": "sha512-jldvxr1MC6rtiZKgrFnDSvT8xuH+eJqxqOBThUVjYrxssYTo1avZLGql5l0a0BAERR01CadYzZ83kVEkbyDg+g==", "funding": [ { "type": "github", @@ -18074,8 +18074,8 @@ "license": "MIT", "dependencies": { "fast-xml-builder": "^1.1.4", - "path-expression-matcher": "^1.1.3", - "strnum": "^2.1.2" + "path-expression-matcher": "^1.2.0", + "strnum": "^2.2.2" }, "bin": { "fxparser": "src/cli/cli.js" @@ -18882,9 +18882,9 @@ "license": "BSD-2-Clause" }, "node_modules/glob/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.13.tgz", + "integrity": "sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w==", "dev": true, "license": "MIT", "dependencies": { @@ -22036,9 +22036,9 @@ } }, "node_modules/jest-util/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", "dev": true, "license": "MIT", "engines": { @@ -26429,9 +26429,9 @@ } }, "node_modules/path-expression-matcher": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/path-expression-matcher/-/path-expression-matcher-1.1.3.tgz", - "integrity": "sha512-qdVgY8KXmVdJZRSS1JdEPOKPdTiEK/pi0RkcT2sw1RhXxohdujUlJFPuS1TSkevZ9vzd3ZlL7ULl1MHGTApKzQ==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/path-expression-matcher/-/path-expression-matcher-1.2.0.tgz", + "integrity": "sha512-DwmPWeFn+tq7TiyJ2CxezCAirXjFxvaiD03npak3cRjlP9+OjTmSy1EpIrEbh+l6JgUundniloMLDQ/6VTdhLQ==", "funding": [ { "type": "github", @@ -26499,9 +26499,9 @@ "license": "ISC" }, "node_modules/path-to-regexp": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz", - "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==", + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.4.1.tgz", + "integrity": "sha512-fvU78fIjZ+SBM9YwCknCvKOUKkLVqtWDVctl0s7xIqfmfb38t2TT4ZU2gHm+Z8xGwgW+QWEU3oQSAzIbo89Ggw==", "dev": true, "license": "MIT", "funding": { @@ -26548,9 +26548,9 @@ "license": "ISC" }, "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", "license": "MIT", "engines": { "node": ">=8.6" @@ -30645,9 +30645,9 @@ } }, "node_modules/serialize-javascript": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-7.0.4.tgz", - "integrity": "sha512-DuGdB+Po43Q5Jxwpzt1lhyFSYKryqoNjQSA9M92tyw0lyHIOur+XCalOUe0KTJpyqzT8+fQ5A0Jf7vCx/NKmIg==", + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-7.0.5.tgz", + "integrity": "sha512-F4LcB0UqUl1zErq+1nYEEzSHJnIwb3AF2XWB94b+afhrekOUijwooAYqFyRbjYkm2PAKBabx6oYv/xDxNi8IBw==", "license": "BSD-3-Clause", "engines": { "node": ">=20.0.0" @@ -30669,9 +30669,9 @@ } }, "node_modules/serve-handler/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.13.tgz", + "integrity": "sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w==", "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", @@ -31689,9 +31689,9 @@ } }, "node_modules/strnum": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.2.0.tgz", - "integrity": "sha512-Y7Bj8XyJxnPAORMZj/xltsfo55uOiyHcU2tnAVzHUnSJR/KsEX+9RoDeXEnsXtl/CX4fAcrt64gZ13aGaWPeBg==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.2.2.tgz", + "integrity": "sha512-DnR90I+jtXNSTXWdwrEy9FakW7UX+qUZg28gj5fk2vxxl7uS/3bpI4fjFYVmdK9etptYBPNkpahuQnEwhwECqA==", "funding": [ { "type": "github", @@ -32330,15 +32330,14 @@ } }, "node_modules/terser-webpack-plugin": { - "version": "5.3.16", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.16.tgz", - "integrity": "sha512-h9oBFCWrq78NyWWVcSwZarJkZ01c2AyGrzs1crmHZO3QUg9D61Wu4NPjBy69n7JqylFF5y+CsUZYmYEIZ3mR+Q==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.4.0.tgz", + "integrity": "sha512-Bn5vxm48flOIfkdl5CaD2+1CiUVbonWQ3KQPyP7/EuIl9Gbzq/gQFOzaMFUEgVjB1396tcK0SG8XcNJ/2kDH8g==", "license": "MIT", "dependencies": { "@jridgewell/trace-mapping": "^0.3.25", "jest-worker": "^27.4.5", "schema-utils": "^4.3.0", - "serialize-javascript": "^6.0.2", "terser": "^5.31.1" }, "engines": { @@ -32424,9 +32423,9 @@ } }, "node_modules/test-exclude/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.13.tgz", + "integrity": "sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w==", "dev": true, "license": "MIT", "dependencies": { @@ -32529,9 +32528,9 @@ } }, "node_modules/tinyglobby/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", "dev": true, "license": "MIT", "engines": { @@ -32758,9 +32757,9 @@ } }, "node_modules/ts-declaration-location/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", "dev": true, "license": "MIT", "engines": { @@ -34646,15 +34645,18 @@ "license": "ISC" }, "node_modules/yaml": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.1.tgz", - "integrity": "sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw==", + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.3.tgz", + "integrity": "sha512-AvbaCLOO2Otw/lW5bmh9d/WEdcDFdQp2Z2ZUH3pX9U2ihyUY0nvLv7J6TrWowklRGPYbB/IuIMfYgxaCPg5Bpg==", "license": "ISC", "bin": { "yaml": "bin.mjs" }, "engines": { "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" } }, "node_modules/yargs": { diff --git a/src/config/index.ts b/src/config/index.ts index 840922288..03221577a 100644 --- a/src/config/index.ts +++ b/src/config/index.ts @@ -29,15 +29,15 @@ export const config = convict({ */ port: { format: 'port', - default: 3009, + default: null, env: 'PORT' - }, + } as SchemaObj, env: { doc: 'The application environment.', format: ['production', 'development', 'test'], - default: 'development', + default: null, env: 'NODE_ENV' - }, + } as SchemaObj<'production' | 'development' | 'test'>, cdpEnvironment: { doc: 'The CDP environment the app is currently in, with the addition of "local"', format: [ @@ -50,14 +50,23 @@ export const config = convict({ 'ext-test', 'prod' ], - default: 'local', + default: null, env: 'ENVIRONMENT' - }, + } as SchemaObj< + | 'local' + | 'infra-dev' + | 'management' + | 'dev' + | 'test' + | 'perf-test' + | 'ext-test' + | 'prod' + >, enforceCsrf: { format: Boolean, default: true, env: 'ENFORCE_CSRF' - }, + } as SchemaObj, /** * Helper flags @@ -89,15 +98,14 @@ export const config = convict({ serviceVersion: { doc: 'The service version, this variable is injected into your docker container in CDP environments', format: String, - nullable: true, default: null, env: 'SERVICE_VERSION' } as SchemaObj, phaseTag: { format: String, - default: 'beta', // Accepts "alpha" |"beta" | "" + default: null, // Accepts "alpha" |"beta" | "" env: 'PHASE_TAG' - }, + } as SchemaObj, /** * Session storage @@ -105,14 +113,14 @@ export const config = convict({ */ sessionTimeout: { format: Number, - default: oneHour * 24, // 1 day + default: oneHour * 24, env: 'SESSION_TIMEOUT' - }, + } as SchemaObj, confirmationSessionTimeout: { format: Number, default: oneMinute * 20, env: 'CONFIRMATION_SESSION_TIMEOUT' - }, + } as SchemaObj, sessionCookiePassword: { format: String, default: null, @@ -148,7 +156,7 @@ export const config = convict({ useSingleInstanceCache: { doc: 'Redis use single cache (non-clustered)', format: Boolean, - default: !isProduction, + default: null, env: 'USE_SINGLE_INSTANCE_CACHE' } as SchemaObj }, @@ -156,7 +164,7 @@ export const config = convict({ header: { doc: 'Tracing header name', format: String, - default: 'x-cdp-request-id', + default: null, env: 'TRACING_HEADER' } as SchemaObj }, @@ -166,7 +174,7 @@ export const config = convict({ */ awsRegion: { format: String, - default: 'eu-west-2', + default: null, env: 'AWS_REGION' } as SchemaObj, snsAdapterTopicArn: { @@ -187,7 +195,7 @@ export const config = convict({ snsFormTopicArnMap: { doc: 'JSON object mapping formId to SNS topic ARN for per-form additional topic routing', format: String, - default: '', + default: null, env: 'SNS_FORM_TOPIC_ARN_MAP' } as SchemaObj, @@ -226,9 +234,9 @@ export const config = convict({ uploaderBucketName: { format: String, - default: 'files', + default: null, env: 'UPLOADER_BUCKET_NAME' - }, + } as SchemaObj, /** * Logging @@ -237,19 +245,19 @@ export const config = convict({ enabled: { doc: 'Is logging enabled', format: Boolean, - default: !isTest, + default: null, env: 'LOG_ENABLED' - }, + } as SchemaObj, level: { doc: 'Logging level', format: ['fatal', 'error', 'warn', 'info', 'debug', 'trace', 'silent'], - default: 'info', + default: null, env: 'LOG_LEVEL' } as SchemaObj, format: { doc: 'Format to output logs in.', format: ['ecs', 'pino-pretty'], - default: isProduction ? 'ecs' : 'pino-pretty', + default: null, env: 'LOG_FORMAT' } as SchemaObj<'ecs' | 'pino-pretty'>, redact: { @@ -263,94 +271,90 @@ export const config = convict({ safelist: { format: Array, - default: ['61bca17e-fe74-40e0-9c15-a901ad120eca.mock.pstmn.io'], + default: null, env: 'SAFELIST' - }, + } as SchemaObj, stagingPrefix: { doc: 'Prefix for staging files in S3', format: String, - default: 'staging', + default: null, env: 'STAGING_PREFIX' - }, + } as SchemaObj, serviceBannerText: { doc: 'Service banner text used to show a maintenance message on all pages when set', format: String, - default: '', + default: null, env: 'SERVICE_BANNER_TEXT' - }, + } as SchemaObj, googleTagManagerContainerId: { doc: 'Google Tag Manager container ID to be used when a user has opted in to additional cookies', format: String, - default: '', + default: null, env: 'GOOGLE_TAG_MANAGER_CONTAINER_ID' - }, + } as SchemaObj, googleAnalyticsContainerId: { doc: 'Google Analytics container ID suffix (from the GA4 measurement ID, without the G- prefix) used to display the exact cookie name on the cookies page', format: String, - default: '', + default: null, env: 'GOOGLE_ANALYTICS_CONTAINER_ID' - }, + } as SchemaObj, saveAndExitExpiryDays: { format: Number, - default: 28, + default: null, env: 'SAVE_AND_EXIT_EXPIRY_IN_DAYS' - }, + } as SchemaObj, storeCompletedApplicationsFor: { format: String, - default: '9 months', + default: null, env: 'STORE_COMPLETED_APPLICATIONS_FOR' - }, + } as SchemaObj, storeFeedbackFor: { format: String, - default: '9 months', + default: null, env: 'STORE_FEEDBACK_FOR' - }, + } as SchemaObj, ordnanceSurveyApiKey: { doc: 'The ordnance survey api key used by the postcode lookup and maps plugin', format: String, - nullable: true, - default: undefined, + default: null, env: 'ORDNANCE_SURVEY_API_KEY' - } as SchemaObj, + } as SchemaObj, ordnanceSurveyApiSecret: { doc: 'The ordnance survey api secret used by the maps plugin', format: String, - nullable: true, - default: undefined, + default: null, env: 'ORDNANCE_SURVEY_API_SECRET' - } as SchemaObj, + } as SchemaObj, useMapsFeature: { doc: 'Feature flag to control maps', format: Boolean, - default: false, + default: null, env: 'USE_MAPS_FEATURE' - }, + } as SchemaObj, feedbackViaEmail: { doc: 'The email address (not including the mailto prefix) for feedback when the built-in CSAT form is disabled.', format: String, - nullable: false, - default: 'defraforms@defra.gov.uk', + default: null, env: 'FEEDBACK_VIA_EMAIL' - } as SchemaObj, + } as SchemaObj, privateKeyForSecrets: { doc: 'The private key used to decrypt secret values', format: String, - nullable: true, - default: undefined, + default: null, env: 'PRIVATE_KEY_FOR_SECRETS' - } as SchemaObj + } as SchemaObj }) config.validate({ allowed: 'strict' }) diff --git a/src/server/services/helpers/crypto.test.js b/src/server/services/helpers/crypto.test.js index 7b894a337..a6b460c55 100644 --- a/src/server/services/helpers/crypto.test.js +++ b/src/server/services/helpers/crypto.test.js @@ -16,6 +16,7 @@ jest.mock('node:crypto', () => ({ describe('crypto helpers', () => { describe('decryptSecret', () => { it('should throw is private key is missing', () => { + // @ts-expect-error - testing behaviour when the private key is missing jest.mocked(config.get).mockImplementationOnce((key) => { if (key === 'privateKeyForSecrets') return undefined return 'mock-value'