From e58ba71449f58441021307a4e40bac8c431b7d80 Mon Sep 17 00:00:00 2001 From: ScottFullerton-NHSE <61320159+ScottFullerton-NHSE@users.noreply.github.com> Date: Tue, 27 May 2025 09:35:04 +0100 Subject: [PATCH 1/4] CCM-9871: Update Redoc to v2.5.0 (#941) --- package.json | 3 +- pnpm-lock.yaml | 1537 +++++++++++++++++++++++++++--------------------- 2 files changed, 884 insertions(+), 656 deletions(-) diff --git a/package.json b/package.json index 36f84b6fd..433f80fe0 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "devDependencies": { "@babel/core": "^7.25.2", "@babel/eslint-parser": "^7.25.1", - "@redocly/cli": "^1.25.3", + "@redocly/cli": "^1.34.3", "eslint": "^8.57.1", "eslint-config-airbnb-base": "^15.0.0", "eslint-config-prettier": "^8.5.0", @@ -48,6 +48,7 @@ "typescript": "^5.5.4" }, "dependencies": { + "ajv": "4.11.8 - 8", "jsrsasign": "^11.1.0", "jsrsasign-util": "^1.0.5" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c3858724c..614a072bb 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,22 +1,17 @@ lockfileVersion: 5.4 specifiers: - '@playwright/test': ^1.42.1 - '@redocly/cli': ^1.10.6 - '@types/node': ^20.12.2 - '@typescript-eslint/eslint-plugin': ^5.44.0 - '@typescript-eslint/parser': ^7.17.0 - eslint: ^8.28.0 - eslint-config-airbnb: ^19.0.4 + '@babel/core': ^7.25.2 + '@babel/eslint-parser': ^7.25.1 + '@redocly/cli': ^1.34.3 + ajv: 4.11.8 - 8 + eslint: ^8.57.1 eslint-config-airbnb-base: ^15.0.0 eslint-config-prettier: ^8.5.0 eslint-formatter-gitlab: ^3.0.0 - eslint-import-resolver-typescript: ^3.5.2 eslint-plugin-html: ^6.2.0 eslint-plugin-import: ^2.26.0 eslint-plugin-jsx-a11y: ^6.6.1 - eslint-plugin-react: ^7.31.11 - eslint-plugin-react-hooks: ^4.6.0 eslint-plugin-security: ^1.5.0 eslint-plugin-sonarjs: ^0.16.0 eslint-plugin-unicorn: ^45.0.1 @@ -28,54 +23,147 @@ specifiers: license-checker: ^25.0.1 minimist: ^1.2.2 newman: ^6.1.2 - playwright: ^1.42.1 - react-is: ^18.2.0 sinon: ^17.0.1 typescript: ^5.5.4 dependencies: + ajv: 6.12.6 jsrsasign: 11.1.0 jsrsasign-util: 1.0.5 - playwright: 1.45.3 devDependencies: - '@playwright/test': 1.45.3 - '@redocly/cli': 1.18.1 - '@types/node': 20.14.12 - '@typescript-eslint/eslint-plugin': 5.62.0_gdzsajg5b2i45zm6j25ky43zii - '@typescript-eslint/parser': 7.17.0_qusgslmwnowdaqieuropes6b5q - eslint: 8.57.0 - eslint-config-airbnb: 19.0.4_rkj5pdb7oeft273slftvhkzequ - eslint-config-airbnb-base: 15.0.0_jrbq5spb6ym3vlo5mnlvtmgpyy - eslint-config-prettier: 8.10.0_eslint@8.57.0 - eslint-formatter-gitlab: 3.0.0_eslint@8.57.0 - eslint-import-resolver-typescript: 3.6.1_v5rw2ov7t7riomm6bxikk4ok4a + '@babel/core': 7.27.1 + '@babel/eslint-parser': 7.27.1_mqcsltiofq5aw2s45vjrvem2lm + '@redocly/cli': 1.34.3_ajv@6.12.6 + eslint: 8.57.1 + eslint-config-airbnb-base: 15.0.0_unjw4kdf4fotpociz7fwijpbcy + eslint-config-prettier: 8.10.0_eslint@8.57.1 + eslint-formatter-gitlab: 3.0.0_eslint@8.57.1 eslint-plugin-html: 6.2.0 - eslint-plugin-import: 2.29.1_nneewum65j2qxmblkey6rl7qby - eslint-plugin-jsx-a11y: 6.9.0_eslint@8.57.0 - eslint-plugin-react: 7.35.0_eslint@8.57.0 - eslint-plugin-react-hooks: 4.6.2_eslint@8.57.0 + eslint-plugin-import: 2.29.1_eslint@8.57.1 + eslint-plugin-jsx-a11y: 6.9.0_eslint@8.57.1 eslint-plugin-security: 1.7.1 - eslint-plugin-sonarjs: 0.16.0_eslint@8.57.0 - eslint-plugin-unicorn: 45.0.2_eslint@8.57.0 + eslint-plugin-sonarjs: 0.16.0_eslint@8.57.1 + eslint-plugin-unicorn: 45.0.2_eslint@8.57.1 eslint-plugin-workspaces: 0.7.0 - eslint-plugin-yml: 1.14.0_eslint@8.57.0 + eslint-plugin-yml: 1.14.0_eslint@8.57.1 hbs-cli: 1.4.1 license-checker: 25.0.1 minimist: 1.2.8 newman: 6.1.3 - react-is: 18.3.1 sinon: 17.0.1 typescript: 5.5.4 packages: - /@babel/code-frame/7.24.7: - resolution: {integrity: sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==} + /@ampproject/remapping/2.3.0: + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 + dev: true + + /@babel/code-frame/7.27.1: + resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.27.1 + js-tokens: 4.0.0 + picocolors: 1.1.1 + dev: true + + /@babel/compat-data/7.27.2: + resolution: {integrity: sha512-TUtMJYRPyUb/9aU8f3K0mjmjf6M9N5Woshn2CS6nqJSeJtTtQcpLUXjGt9vbF8ZGff0El99sWkLgzwW3VXnxZQ==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/core/7.27.1: + resolution: {integrity: sha512-IaaGWsQqfsQWVLqMn9OB92MNN7zukfVA4s7KKAI0KfrrDsZ0yhi5uV4baBuLuN7n3vsZpwP8asPPcVwApxvjBQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.27.1 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-module-transforms': 7.27.1_@babel+core@7.27.1 + '@babel/helpers': 7.27.1 + '@babel/parser': 7.27.2 + '@babel/template': 7.27.2 + '@babel/traverse': 7.27.1 + '@babel/types': 7.27.1 + convert-source-map: 2.0.0 + debug: 4.3.5 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/eslint-parser/7.27.1_mqcsltiofq5aw2s45vjrvem2lm: + resolution: {integrity: sha512-q8rjOuadH0V6Zo4XLMkJ3RMQ9MSBqwaDByyYB0izsYdaIWGNLmEblbCOf1vyFHICcg16CD7Fsi51vcQnYxmt6Q==} + engines: {node: ^10.13.0 || ^12.13.0 || >=14.0.0} + peerDependencies: + '@babel/core': ^7.11.0 + eslint: ^7.5.0 || ^8.0.0 || ^9.0.0 + dependencies: + '@babel/core': 7.27.1 + '@nicolo-ribaudo/eslint-scope-5-internals': 5.1.1-v1 + eslint: 8.57.1 + eslint-visitor-keys: 2.1.0 + semver: 6.3.1 + dev: true + + /@babel/generator/7.27.1: + resolution: {integrity: sha512-UnJfnIpc/+JO0/+KRVQNGU+y5taA5vCbwN8+azkX6beii/ZF+enZJSOKo11ZSzGJjlNfJHfQtmQT8H+9TXPG2w==} engines: {node: '>=6.9.0'} dependencies: - '@babel/highlight': 7.24.7 - picocolors: 1.0.1 + '@babel/parser': 7.27.2 + '@babel/types': 7.27.1 + '@jridgewell/gen-mapping': 0.3.8 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 3.0.2 + dev: true + + /@babel/helper-compilation-targets/7.27.2: + resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/compat-data': 7.27.2 + '@babel/helper-validator-option': 7.27.1 + browserslist: 4.24.5 + lru-cache: 5.1.1 + semver: 6.3.1 + dev: true + + /@babel/helper-module-imports/7.27.1: + resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/traverse': 7.27.1 + '@babel/types': 7.27.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-module-transforms/7.27.1_@babel+core@7.27.1: + resolution: {integrity: sha512-9yHn519/8KvTU5BjTVEEeIM3w9/2yXNKoD82JifINImhpKkARMJKPP59kLo+BafpdN5zgNeIcS4jsGDmd3l58g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.27.1 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + '@babel/traverse': 7.27.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/helper-string-parser/7.27.1: + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + engines: {node: '>=6.9.0'} dev: true /@babel/helper-validator-identifier/7.24.7: @@ -83,14 +171,30 @@ packages: engines: {node: '>=6.9.0'} dev: true - /@babel/highlight/7.24.7: - resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==} + /@babel/helper-validator-identifier/7.27.1: + resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-validator-option/7.27.1: + resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helpers/7.27.1: + resolution: {integrity: sha512-FCvFTm0sWV8Fxhpp2McP5/W53GPllQ9QeQ7SiqGWjMf/LVG07lFa5+pgK05IRhVwtvafT22KF+ZSnM9I545CvQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-validator-identifier': 7.24.7 - chalk: 2.4.2 - js-tokens: 4.0.0 - picocolors: 1.0.1 + '@babel/template': 7.27.2 + '@babel/types': 7.27.1 + dev: true + + /@babel/parser/7.27.2: + resolution: {integrity: sha512-QYLs8299NA7WM/bZAdp+CviYYkVoYXlDW2rzliy3chxd1PQjej7JORuMJDJXJUb9g0TT+B99EwaVLKmX+sPXWw==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.27.1 dev: true /@babel/runtime/7.24.8: @@ -100,20 +204,36 @@ packages: regenerator-runtime: 0.14.1 dev: true - /@cfaester/enzyme-adapter-react-18/0.8.0_nnrd3gsncyragczmpvfhocinkq: - resolution: {integrity: sha512-3Z3ThTUouHwz8oIyhTYQljEMNRFtlVyc3VOOHCbxs47U6cnXs8K9ygi/c1tv49s7MBlTXeIcuN+Ttd9aPtILFQ==} - peerDependencies: - enzyme: ^3.11.0 - react: '>=18' - react-dom: '>=18' + /@babel/template/7.27.2: + resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} + engines: {node: '>=6.9.0'} dependencies: - enzyme-shallow-equal: 1.0.7 - function.prototype.name: 1.1.6 - has: 1.0.4 - react: 18.3.1 - react-dom: 18.3.1_react@18.3.1 - react-is: 18.3.1 - react-shallow-renderer: 16.15.0_react@18.3.1 + '@babel/code-frame': 7.27.1 + '@babel/parser': 7.27.2 + '@babel/types': 7.27.1 + dev: true + + /@babel/traverse/7.27.1: + resolution: {integrity: sha512-ZCYtZciz1IWJB4U61UPu4KEaqyfj+r5T1Q5mqPo+IBpcG9kHv30Z0aD8LXPgC1trYa6rK0orRyAhqUgk4MjmEg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.27.1 + '@babel/parser': 7.27.2 + '@babel/template': 7.27.2 + '@babel/types': 7.27.1 + debug: 4.3.5 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/types/7.27.1: + resolution: {integrity: sha512-+EzkxvLNfiUeKMgy/3luqfsCWFRXLb7U6wNQTk60tovuckwB15B191tJWvpp4HjiQWdJkCxO3Wbvc6jlk3Xb2Q==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 dev: true /@colors/colors/1.5.0: @@ -137,13 +257,13 @@ packages: resolution: {integrity: sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==} dev: true - /@eslint-community/eslint-utils/4.4.0_eslint@8.57.0: + /@eslint-community/eslint-utils/4.4.0_eslint@8.57.1: resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 dependencies: - eslint: 8.57.0 + eslint: 8.57.1 eslint-visitor-keys: 3.4.3 dev: true @@ -169,8 +289,8 @@ packages: - supports-color dev: true - /@eslint/js/8.57.0: - resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} + /@eslint/js/8.57.1: + resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true @@ -182,8 +302,13 @@ packages: resolution: {integrity: sha512-R11tGE6yIFwqpaIqcfkcg7AICXzFg14+5h5v0TfF/9+RMDL6jhzCy/pxHVOfbALGdtVYdt6JdR21tuxEgl34dw==} dev: true - /@humanwhocodes/config-array/0.11.14: - resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} + /@faker-js/faker/7.6.0: + resolution: {integrity: sha512-XK6BTq1NDMo9Xqw/YkYyGjSsg44fbNwYRx7QK2CuoQgyy+f1rrTDHoExVM5PsyXCtfl2vs2vVJ0MN0yN6LppRw==} + engines: {node: '>=14.0.0', npm: '>=6.0.0'} + dev: true + + /@humanwhocodes/config-array/0.13.0: + resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} engines: {node: '>=10.10.0'} deprecated: Use @eslint/config-array instead dependencies: @@ -199,6 +324,11 @@ packages: engines: {node: '>=12.22'} dev: true + /@humanwhocodes/momoa/2.0.4: + resolution: {integrity: sha512-RE815I4arJFtt+FVeU1Tgp9/Xvecacji8w/V6XtXsWWH/wz/eNkNbhb+ny/+PlVZjV0rxQpRSQKNKE3lcktHEA==} + engines: {node: '>=10.10.0'} + dev: true + /@humanwhocodes/object-schema/2.0.3: resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} deprecated: Use @eslint/object-schema instead @@ -216,6 +346,13 @@ packages: wrap-ansi-cjs: /wrap-ansi/7.0.0 dev: true + /@jest/schemas/29.6.3: + resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@sinclair/typebox': 0.27.8 + dev: true + /@joshuajaco/get-monorepo-packages/1.2.1: resolution: {integrity: sha512-3I32bp/UB4UmLqEj/yrBEWTYuCzojn8nR34PZ9Jwb2OeHV95l4Kw0ax1xnnA4yYWU1E1krM2RIWghP3U725dGQ==} dependencies: @@ -223,6 +360,60 @@ packages: load-json-file: 4.0.0 dev: true + /@jridgewell/gen-mapping/0.3.8: + resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.5.0 + '@jridgewell/trace-mapping': 0.3.25 + dev: true + + /@jridgewell/resolve-uri/3.1.2: + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + dev: true + + /@jridgewell/set-array/1.2.1: + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + dev: true + + /@jridgewell/sourcemap-codec/1.5.0: + resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + dev: true + + /@jridgewell/trace-mapping/0.3.25: + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.0 + dev: true + + /@jsep-plugin/assignment/1.3.0_jsep@1.4.0: + resolution: {integrity: sha512-VVgV+CXrhbMI3aSusQyclHkenWSAm95WaiKrMxRFam3JSUiIaQjoMIw2sEs/OX4XifnqeQUN4DYbJjlA8EfktQ==} + engines: {node: '>= 10.16.0'} + peerDependencies: + jsep: ^0.4.0||^1.0.0 + dependencies: + jsep: 1.4.0 + dev: true + + /@jsep-plugin/regex/1.0.4_jsep@1.4.0: + resolution: {integrity: sha512-q7qL4Mgjs1vByCaTnDFcBnV9HS7GVPJX5vyVoCgZHNSC9rjwIlmbXG5sUuorR5ndfHAIlJ8pVStxvjXHbNvtUg==} + engines: {node: '>= 10.16.0'} + peerDependencies: + jsep: ^0.4.0||^1.0.0 + dependencies: + jsep: 1.4.0 + dev: true + + /@nicolo-ribaudo/eslint-scope-5-internals/5.1.1-v1: + resolution: {integrity: sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==} + dependencies: + eslint-scope: 5.1.1 + dev: true + /@nodelib/fs.scandir/2.1.5: resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -244,6 +435,164 @@ packages: fastq: 1.17.1 dev: true + /@opentelemetry/api-logs/0.53.0: + resolution: {integrity: sha512-8HArjKx+RaAI8uEIgcORbZIPklyh1YLjPSBus8hjRmvLi6DeFzgOcdZ7KwPabKj8mXF8dX0hyfAyGfycz0DbFw==} + engines: {node: '>=14'} + dependencies: + '@opentelemetry/api': 1.9.0 + dev: true + + /@opentelemetry/api/1.9.0: + resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==} + engines: {node: '>=8.0.0'} + dev: true + + /@opentelemetry/context-async-hooks/1.26.0_@opentelemetry+api@1.9.0: + resolution: {integrity: sha512-HedpXXYzzbaoutw6DFLWLDket2FwLkLpil4hGCZ1xYEIMTcivdfwEOISgdbLEWyG3HW52gTq2V9mOVJrONgiwg==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + dependencies: + '@opentelemetry/api': 1.9.0 + dev: true + + /@opentelemetry/core/1.26.0_@opentelemetry+api@1.9.0: + resolution: {integrity: sha512-1iKxXXE8415Cdv0yjG3G6hQnB5eVEsJce3QaawX8SjDn0mAS0ZM8fAbZZJD4ajvhC15cePvosSCut404KrIIvQ==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/semantic-conventions': 1.27.0 + dev: true + + /@opentelemetry/exporter-trace-otlp-http/0.53.0_@opentelemetry+api@1.9.0: + resolution: {integrity: sha512-m7F5ZTq+V9mKGWYpX8EnZ7NjoqAU7VemQ1E2HAG+W/u0wpY1x0OmbxAXfGKFHCspdJk8UKlwPGrpcB8nay3P8A==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.0.0 + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.26.0_@opentelemetry+api@1.9.0 + '@opentelemetry/otlp-exporter-base': 0.53.0_@opentelemetry+api@1.9.0 + '@opentelemetry/otlp-transformer': 0.53.0_@opentelemetry+api@1.9.0 + '@opentelemetry/resources': 1.26.0_@opentelemetry+api@1.9.0 + '@opentelemetry/sdk-trace-base': 1.26.0_@opentelemetry+api@1.9.0 + dev: true + + /@opentelemetry/otlp-exporter-base/0.53.0_@opentelemetry+api@1.9.0: + resolution: {integrity: sha512-UCWPreGQEhD6FjBaeDuXhiMf6kkBODF0ZQzrk/tuQcaVDJ+dDQ/xhJp192H9yWnKxVpEjFrSSLnpqmX4VwX+eA==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.0.0 + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.26.0_@opentelemetry+api@1.9.0 + '@opentelemetry/otlp-transformer': 0.53.0_@opentelemetry+api@1.9.0 + dev: true + + /@opentelemetry/otlp-transformer/0.53.0_@opentelemetry+api@1.9.0: + resolution: {integrity: sha512-rM0sDA9HD8dluwuBxLetUmoqGJKSAbWenwD65KY9iZhUxdBHRLrIdrABfNDP7aiTjcgK8XFyTn5fhDz7N+W6DA==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/api-logs': 0.53.0 + '@opentelemetry/core': 1.26.0_@opentelemetry+api@1.9.0 + '@opentelemetry/resources': 1.26.0_@opentelemetry+api@1.9.0 + '@opentelemetry/sdk-logs': 0.53.0_@opentelemetry+api@1.9.0 + '@opentelemetry/sdk-metrics': 1.26.0_@opentelemetry+api@1.9.0 + '@opentelemetry/sdk-trace-base': 1.26.0_@opentelemetry+api@1.9.0 + protobufjs: 7.4.0 + dev: true + + /@opentelemetry/propagator-b3/1.26.0_@opentelemetry+api@1.9.0: + resolution: {integrity: sha512-vvVkQLQ/lGGyEy9GT8uFnI047pajSOVnZI2poJqVGD3nJ+B9sFGdlHNnQKophE3lHfnIH0pw2ubrCTjZCgIj+Q==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.26.0_@opentelemetry+api@1.9.0 + dev: true + + /@opentelemetry/propagator-jaeger/1.26.0_@opentelemetry+api@1.9.0: + resolution: {integrity: sha512-DelFGkCdaxA1C/QA0Xilszfr0t4YbGd3DjxiCDPh34lfnFr+VkkrjV9S8ZTJvAzfdKERXhfOxIKBoGPJwoSz7Q==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.26.0_@opentelemetry+api@1.9.0 + dev: true + + /@opentelemetry/resources/1.26.0_@opentelemetry+api@1.9.0: + resolution: {integrity: sha512-CPNYchBE7MBecCSVy0HKpUISEeJOniWqcHaAHpmasZ3j9o6V3AyBzhRc90jdmemq0HOxDr6ylhUbDhBqqPpeNw==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.26.0_@opentelemetry+api@1.9.0 + '@opentelemetry/semantic-conventions': 1.27.0 + dev: true + + /@opentelemetry/sdk-logs/0.53.0_@opentelemetry+api@1.9.0: + resolution: {integrity: sha512-dhSisnEgIj/vJZXZV6f6KcTnyLDx/VuQ6l3ejuZpMpPlh9S1qMHiZU9NMmOkVkwwHkMy3G6mEBwdP23vUZVr4g==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.4.0 <1.10.0' + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/api-logs': 0.53.0 + '@opentelemetry/core': 1.26.0_@opentelemetry+api@1.9.0 + '@opentelemetry/resources': 1.26.0_@opentelemetry+api@1.9.0 + dev: true + + /@opentelemetry/sdk-metrics/1.26.0_@opentelemetry+api@1.9.0: + resolution: {integrity: sha512-0SvDXmou/JjzSDOjUmetAAvcKQW6ZrvosU0rkbDGpXvvZN+pQF6JbK/Kd4hNdK4q/22yeruqvukXEJyySTzyTQ==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.3.0 <1.10.0' + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.26.0_@opentelemetry+api@1.9.0 + '@opentelemetry/resources': 1.26.0_@opentelemetry+api@1.9.0 + dev: true + + /@opentelemetry/sdk-trace-base/1.26.0_@opentelemetry+api@1.9.0: + resolution: {integrity: sha512-olWQldtvbK4v22ymrKLbIcBi9L2SpMO84sCPY54IVsJhP9fRsxJT194C/AVaAuJzLE30EdhhM1VmvVYR7az+cw==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 1.26.0_@opentelemetry+api@1.9.0 + '@opentelemetry/resources': 1.26.0_@opentelemetry+api@1.9.0 + '@opentelemetry/semantic-conventions': 1.27.0 + dev: true + + /@opentelemetry/sdk-trace-node/1.26.0_@opentelemetry+api@1.9.0: + resolution: {integrity: sha512-Fj5IVKrj0yeUwlewCRwzOVcr5avTuNnMHWf7GPc1t6WaT78J6CJyF3saZ/0RkZfdeNO8IcBl/bNcWMVZBMRW8Q==} + engines: {node: '>=14'} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/context-async-hooks': 1.26.0_@opentelemetry+api@1.9.0 + '@opentelemetry/core': 1.26.0_@opentelemetry+api@1.9.0 + '@opentelemetry/propagator-b3': 1.26.0_@opentelemetry+api@1.9.0 + '@opentelemetry/propagator-jaeger': 1.26.0_@opentelemetry+api@1.9.0 + '@opentelemetry/sdk-trace-base': 1.26.0_@opentelemetry+api@1.9.0 + semver: 7.6.3 + dev: true + + /@opentelemetry/semantic-conventions/1.27.0: + resolution: {integrity: sha512-sAay1RrB+ONOem0OZanAR1ZI/k7yDpnOQSQmTMuGImUQb2y8EbSaCJ94FQluM74xoU03vlb2d2U90hZluL6nQg==} + engines: {node: '>=14'} + dev: true + /@pkgjs/parseargs/0.11.0: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} @@ -251,14 +600,6 @@ packages: dev: true optional: true - /@playwright/test/1.45.3: - resolution: {integrity: sha512-UKF4XsBfy+u3MFWEH44hva1Q8Da28G6RFtR2+5saw+jgAFQV5yYnB1fu68Mz7fO+5GJF3wgwAIs0UelU8TxFrA==} - engines: {node: '>=18'} - hasBin: true - dependencies: - playwright: 1.45.3 - dev: true - /@postman/form-data/3.1.1: resolution: {integrity: sha512-vjh8Q2a8S6UCm/KKs31XFJqEEgmbjBmpPNVV2eVav6905wyFAwaUOBGA1NPBI4ERH9MMZc6w0umFgM6WbEPMdg==} engines: {node: '>= 6'} @@ -284,72 +625,151 @@ packages: safe-buffer: 5.2.1 dev: true - /@redocly/ajv/8.11.0: - resolution: {integrity: sha512-9GWx27t7xWhDIR02PA18nzBdLcKQRgc46xNQvjFkrYk4UOmvKhJ/dawwiX0cCOeetN5LcaaiqQbVOWYK62SGHw==} + /@protobufjs/aspromise/1.1.2: + resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} + dev: true + + /@protobufjs/base64/1.1.2: + resolution: {integrity: sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==} + dev: true + + /@protobufjs/codegen/2.0.4: + resolution: {integrity: sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==} + dev: true + + /@protobufjs/eventemitter/1.1.0: + resolution: {integrity: sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==} + dev: true + + /@protobufjs/fetch/1.1.0: + resolution: {integrity: sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==} + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/inquire': 1.1.0 + dev: true + + /@protobufjs/float/1.0.2: + resolution: {integrity: sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==} + dev: true + + /@protobufjs/inquire/1.1.0: + resolution: {integrity: sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==} + dev: true + + /@protobufjs/path/1.1.2: + resolution: {integrity: sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==} + dev: true + + /@protobufjs/pool/1.1.0: + resolution: {integrity: sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==} + dev: true + + /@protobufjs/utf8/1.1.0: + resolution: {integrity: sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==} + dev: true + + /@redocly/ajv/8.11.2: + resolution: {integrity: sha512-io1JpnwtIcvojV7QKDUSIuMN/ikdOUd1ReEnUnMKGfDVridQZ31J0MmIuqwuRjWDZfmvr+Q0MqCcfHM2gTivOg==} dependencies: fast-deep-equal: 3.1.3 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 - uri-js: 4.4.1 + uri-js-replace: 1.0.1 dev: true - /@redocly/cli/1.18.1: - resolution: {integrity: sha512-+bRKj46R9wvTzMdnoYfMueJ9/ek0NprEsQNowV7XcHgOXifeFFikRtBFcpkwqCNxaQ/nWAJn4LHZaFcssbcHow==} - engines: {node: '>=14.19.0', npm: '>=7.0.0'} + /@redocly/cli/1.34.3_ajv@6.12.6: + resolution: {integrity: sha512-GJNBTMfm5wTCtH6K+RtPQZuGbqflMclXqAZ5My12tfux6xFDMW1l0MNd5RMpnIS1aeFcDX++P1gnnROWlesj4w==} + engines: {node: '>=18.17.0', npm: '>=9.5.0'} hasBin: true dependencies: - '@redocly/openapi-core': 1.18.1 + '@opentelemetry/api': 1.9.0 + '@opentelemetry/exporter-trace-otlp-http': 0.53.0_@opentelemetry+api@1.9.0 + '@opentelemetry/resources': 1.26.0_@opentelemetry+api@1.9.0 + '@opentelemetry/sdk-trace-node': 1.26.0_@opentelemetry+api@1.9.0 + '@opentelemetry/semantic-conventions': 1.27.0 + '@redocly/config': 0.22.2 + '@redocly/openapi-core': 1.34.3 + '@redocly/respect-core': 1.34.3_ajv@6.12.6 abort-controller: 3.0.0 chokidar: 3.6.0 colorette: 1.4.0 core-js: 3.37.1 + dotenv: 16.5.0 form-data: 4.0.0 get-port-please: 3.1.2 glob: 7.2.3 handlebars: 4.7.8 mobx: 6.13.1 - node-fetch: 2.7.0 pluralize: 8.0.0 react: 18.3.1 react-dom: 18.3.1_react@18.3.1 - redoc: 2.1.5_mzjea7mep7mcjf3n4cxnj6lfiu + redoc: 2.5.0_mzjea7mep7mcjf3n4cxnj6lfiu semver: 7.6.3 simple-websocket: 9.1.0 styled-components: 6.1.12_nnrd3gsncyragczmpvfhocinkq yargs: 17.0.1 transitivePeerDependencies: + - ajv - bufferutil - encoding - - enzyme - react-native - supports-color - utf-8-validate dev: true - /@redocly/config/0.7.0: - resolution: {integrity: sha512-6GKxTo/9df0654Mtivvr4lQnMOp+pRj9neVywmI5+BwfZLTtkJnj2qB3D6d8FHTr4apsNOf6zTa5FojX0Evh4g==} + /@redocly/config/0.22.2: + resolution: {integrity: sha512-roRDai8/zr2S9YfmzUfNhKjOF0NdcOIqF7bhf4MVC5UxpjIysDjyudvlAiVbpPHp3eDRWbdzUgtkK1a7YiDNyQ==} dev: true - /@redocly/openapi-core/1.18.1: - resolution: {integrity: sha512-y2ZR3aaVF80XRVoFP0Dp2z5DeCOilPTuS7V4HnHIYZdBTfsqzjkO169h5JqAaifnaLsLBhe3YArdgLb7W7wW6Q==} - engines: {node: '>=14.19.0', npm: '>=7.0.0'} + /@redocly/openapi-core/1.34.3: + resolution: {integrity: sha512-3arRdUp1fNx55itnjKiUhO6t4Mf91TsrTIYINDNLAZPS0TPd5YpiXRctwjel0qqWoOOhjA34cZ3m4dksLDFUYg==} + engines: {node: '>=18.17.0', npm: '>=9.5.0'} dependencies: - '@redocly/ajv': 8.11.0 - '@redocly/config': 0.7.0 + '@redocly/ajv': 8.11.2 + '@redocly/config': 0.22.2 colorette: 1.4.0 https-proxy-agent: 7.0.5 js-levenshtein: 1.1.6 js-yaml: 4.1.0 - lodash.isequal: 4.5.0 minimatch: 5.1.6 - node-fetch: 2.7.0 pluralize: 8.0.0 yaml-ast-parser: 0.0.43 transitivePeerDependencies: - - encoding - supports-color dev: true + /@redocly/respect-core/1.34.3_ajv@6.12.6: + resolution: {integrity: sha512-vo/gu7dRGwTVsRueVSjVk04jOQuL0w22RBJRdRUWkfyse791tYXgMCOx35ijKekL83Q/7Okxf/YX6UY1v5CAug==} + engines: {node: '>=18.17.0', npm: '>=9.5.0'} + dependencies: + '@faker-js/faker': 7.6.0 + '@redocly/ajv': 8.11.2 + '@redocly/openapi-core': 1.34.3 + better-ajv-errors: 1.2.0_ajv@6.12.6 + colorette: 2.0.20 + concat-stream: 2.0.0 + cookie: 0.7.2 + dotenv: 16.4.5 + form-data: 4.0.0 + jest-diff: 29.7.0 + jest-matcher-utils: 29.7.0 + js-yaml: 4.1.0 + json-pointer: 0.6.2 + jsonpath-plus: 10.3.0 + open: 10.1.2 + openapi-sampler: 1.6.1 + outdent: 0.8.0 + set-cookie-parser: 2.7.1 + undici: 6.21.3 + transitivePeerDependencies: + - ajv + - supports-color + dev: true + + /@sinclair/typebox/0.27.8: + resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + dev: true + /@sinonjs/commons/2.0.0: resolution: {integrity: sha512-uLa0j859mMrg2slwQYdO/AkrOfmH+X6LTVmNTS9CqexuE2IvVORIkSpJLqePAbEnKJ77aMmCwr1NUZ57120Xcg==} dependencies: @@ -398,187 +818,15 @@ packages: resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} dev: true - /@types/semver/7.5.8: - resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} - dev: true - /@types/stylis/4.2.5: resolution: {integrity: sha512-1Xve+NMN7FWjY14vLoY5tL3BVEQ/n42YLwaqJIPYhotZ9uBHt87VceMwWQpzmdEt2TNXIorIFG+YeCUUW7RInw==} dev: true - /@typescript-eslint/eslint-plugin/5.62.0_gdzsajg5b2i45zm6j25ky43zii: - resolution: {integrity: sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - '@typescript-eslint/parser': ^5.0.0 - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@eslint-community/regexpp': 4.11.0 - '@typescript-eslint/parser': 7.17.0_qusgslmwnowdaqieuropes6b5q - '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/type-utils': 5.62.0_qusgslmwnowdaqieuropes6b5q - '@typescript-eslint/utils': 5.62.0_qusgslmwnowdaqieuropes6b5q - debug: 4.3.5 - eslint: 8.57.0 - graphemer: 1.4.0 - ignore: 5.3.1 - natural-compare-lite: 1.4.0 - semver: 7.6.3 - tsutils: 3.21.0_typescript@5.5.4 - typescript: 5.5.4 - transitivePeerDependencies: - - supports-color - dev: true - - /@typescript-eslint/parser/7.17.0_qusgslmwnowdaqieuropes6b5q: - resolution: {integrity: sha512-puiYfGeg5Ydop8eusb/Hy1k7QmOU6X3nvsqCgzrB2K4qMavK//21+PzNE8qeECgNOIoertJPUC1SpegHDI515A==} - engines: {node: ^18.18.0 || >=20.0.0} - peerDependencies: - eslint: ^8.56.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/scope-manager': 7.17.0 - '@typescript-eslint/types': 7.17.0 - '@typescript-eslint/typescript-estree': 7.17.0_typescript@5.5.4 - '@typescript-eslint/visitor-keys': 7.17.0 - debug: 4.3.5 - eslint: 8.57.0 - typescript: 5.5.4 - transitivePeerDependencies: - - supports-color - dev: true - - /@typescript-eslint/scope-manager/5.62.0: - resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/visitor-keys': 5.62.0 - dev: true - - /@typescript-eslint/scope-manager/7.17.0: - resolution: {integrity: sha512-0P2jTTqyxWp9HiKLu/Vemr2Rg1Xb5B7uHItdVZ6iAenXmPo4SZ86yOPCJwMqpCyaMiEHTNqizHfsbmCFT1x9SA==} - engines: {node: ^18.18.0 || >=20.0.0} - dependencies: - '@typescript-eslint/types': 7.17.0 - '@typescript-eslint/visitor-keys': 7.17.0 - dev: true - - /@typescript-eslint/type-utils/5.62.0_qusgslmwnowdaqieuropes6b5q: - resolution: {integrity: sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: '*' - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/typescript-estree': 5.62.0_typescript@5.5.4 - '@typescript-eslint/utils': 5.62.0_qusgslmwnowdaqieuropes6b5q - debug: 4.3.5 - eslint: 8.57.0 - tsutils: 3.21.0_typescript@5.5.4 - typescript: 5.5.4 - transitivePeerDependencies: - - supports-color - dev: true - - /@typescript-eslint/types/5.62.0: - resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true - - /@typescript-eslint/types/7.17.0: - resolution: {integrity: sha512-a29Ir0EbyKTKHnZWbNsrc/gqfIBqYPwj3F2M+jWE/9bqfEHg0AMtXzkbUkOG6QgEScxh2+Pz9OXe11jHDnHR7A==} - engines: {node: ^18.18.0 || >=20.0.0} - dev: true - - /@typescript-eslint/typescript-estree/5.62.0_typescript@5.5.4: - resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/visitor-keys': 5.62.0 - debug: 4.3.5 - globby: 11.1.0 - is-glob: 4.0.3 - semver: 7.6.3 - tsutils: 3.21.0_typescript@5.5.4 - typescript: 5.5.4 - transitivePeerDependencies: - - supports-color - dev: true - - /@typescript-eslint/typescript-estree/7.17.0_typescript@5.5.4: - resolution: {integrity: sha512-72I3TGq93t2GoSBWI093wmKo0n6/b7O4j9o8U+f65TVD0FS6bI2180X5eGEr8MA8PhKMvYe9myZJquUT2JkCZw==} - engines: {node: ^18.18.0 || >=20.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/types': 7.17.0 - '@typescript-eslint/visitor-keys': 7.17.0 - debug: 4.3.5 - globby: 11.1.0 - is-glob: 4.0.3 - minimatch: 9.0.5 - semver: 7.6.3 - ts-api-utils: 1.3.0_typescript@5.5.4 - typescript: 5.5.4 - transitivePeerDependencies: - - supports-color - dev: true - - /@typescript-eslint/utils/5.62.0_qusgslmwnowdaqieuropes6b5q: - resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - dependencies: - '@eslint-community/eslint-utils': 4.4.0_eslint@8.57.0 - '@types/json-schema': 7.0.15 - '@types/semver': 7.5.8 - '@typescript-eslint/scope-manager': 5.62.0 - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/typescript-estree': 5.62.0_typescript@5.5.4 - eslint: 8.57.0 - eslint-scope: 5.1.1 - semver: 7.6.3 - transitivePeerDependencies: - - supports-color - - typescript - dev: true - - /@typescript-eslint/visitor-keys/5.62.0: - resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - '@typescript-eslint/types': 5.62.0 - eslint-visitor-keys: 3.4.3 - dev: true - - /@typescript-eslint/visitor-keys/7.17.0: - resolution: {integrity: sha512-RVGC9UhPOCsfCdI9pU++K4nD7to+jTcMIbXTSOcrLqUEW6gF2pU1UUbYJKc9cvcRSK1UDeMJ7pdMxf4bhMpV/A==} - engines: {node: ^18.18.0 || >=20.0.0} - dependencies: - '@typescript-eslint/types': 7.17.0 - eslint-visitor-keys: 3.4.3 + /@types/trusted-types/2.0.7: + resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} + requiresBuild: true dev: true + optional: true /@ungap/structured-clone/1.2.0: resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} @@ -625,7 +873,6 @@ packages: fast-json-stable-stringify: 2.1.0 json-schema-traverse: 0.4.1 uri-js: 4.4.1 - dev: true /ansi-regex/5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} @@ -651,6 +898,11 @@ packages: color-convert: 2.0.1 dev: true + /ansi-styles/5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + dev: true + /ansi-styles/6.2.1: resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} engines: {node: '>=12'} @@ -714,28 +966,11 @@ packages: array-uniq: 1.0.3 dev: true - /array-union/2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} - dev: true - /array-uniq/1.0.3: resolution: {integrity: sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==} engines: {node: '>=0.10.0'} dev: true - /array.prototype.findlast/1.2.5: - resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-errors: 1.3.0 - es-object-atoms: 1.0.0 - es-shim-unscopables: 1.0.2 - dev: true - /array.prototype.findlastindex/1.2.5: resolution: {integrity: sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==} engines: {node: '>= 0.4'} @@ -768,17 +1003,6 @@ packages: es-shim-unscopables: 1.0.2 dev: true - /array.prototype.tosorted/1.1.4: - resolution: {integrity: sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-errors: 1.3.0 - es-shim-unscopables: 1.0.2 - dev: true - /arraybuffer.prototype.slice/1.0.3: resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} engines: {node: '>= 0.4'} @@ -870,6 +1094,20 @@ packages: tweetnacl: 0.14.5 dev: true + /better-ajv-errors/1.2.0_ajv@6.12.6: + resolution: {integrity: sha512-UW+IsFycygIo7bclP9h5ugkNH8EjCSgqyFB/yQ4Hqqa1OEYDtb0uFIkYE0b6+CjkgJYVM5UKI/pJPxjYe9EZlA==} + engines: {node: '>= 12.13.0'} + peerDependencies: + ajv: 4.11.8 - 8 + dependencies: + '@babel/code-frame': 7.27.1 + '@humanwhocodes/momoa': 2.0.4 + ajv: 6.12.6 + chalk: 4.1.2 + jsonpointer: 5.0.1 + leven: 3.1.0 + dev: true + /binary-extensions/2.3.0: resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} @@ -905,11 +1143,33 @@ packages: base64-js: 1.5.1 dev: true + /browserslist/4.24.5: + resolution: {integrity: sha512-FDToo4Wo82hIdgc1CQ+NQD0hEhmpPjrZ3hiUgwgOG6IuTdlpr8jdjyG24P6cNP1yJpTLzS5OcGgSw0xmDU1/Tw==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + dependencies: + caniuse-lite: 1.0.30001718 + electron-to-chromium: 1.5.155 + node-releases: 2.0.19 + update-browserslist-db: 1.1.3_browserslist@4.24.5 + dev: true + + /buffer-from/1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + dev: true + /builtin-modules/3.3.0: resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} engines: {node: '>=6'} dev: true + /bundle-name/4.1.0: + resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} + engines: {node: '>=18'} + dependencies: + run-applescript: 7.0.0 + dev: true + /call-bind/1.0.7: resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} engines: {node: '>= 0.4'} @@ -934,6 +1194,10 @@ packages: resolution: {integrity: sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==} dev: true + /caniuse-lite/1.0.30001718: + resolution: {integrity: sha512-AflseV1ahcSunK53NfEs9gFWgOEmzr0f+kaMFA4xiLZlr9Hzt7HxcSpIFcnNCUkz6R6dWKa54rUz3HUmI3nVcw==} + dev: true + /caseless/0.12.0: resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} dev: true @@ -1049,6 +1313,10 @@ packages: resolution: {integrity: sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==} dev: true + /colorette/2.0.20: + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + dev: true + /colors/1.4.0: resolution: {integrity: sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==} engines: {node: '>=0.1.90'} @@ -1075,10 +1343,29 @@ packages: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} dev: true + /concat-stream/2.0.0: + resolution: {integrity: sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==} + engines: {'0': node >= 6.0} + dependencies: + buffer-from: 1.1.2 + inherits: 2.0.4 + readable-stream: 3.6.2 + typedarray: 0.0.6 + dev: true + /confusing-browser-globals/1.0.11: resolution: {integrity: sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==} dev: true + /convert-source-map/2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + dev: true + + /cookie/0.7.2: + resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} + engines: {node: '>= 0.6'} + dev: true + /core-js/1.2.7: resolution: {integrity: sha512-ZiPp9pZlgxpWRu0M+YWbm6+aQ84XEfH1JRXvfOc/fILWI0VKhLC2LX13X1NYq4fULzLMq7Hfh43CSo2/aIaUPA==} deprecated: core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js. @@ -1232,6 +1519,19 @@ packages: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} dev: true + /default-browser-id/5.0.0: + resolution: {integrity: sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==} + engines: {node: '>=18'} + dev: true + + /default-browser/5.2.1: + resolution: {integrity: sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==} + engines: {node: '>=18'} + dependencies: + bundle-name: 4.1.0 + default-browser-id: 5.0.0 + dev: true + /define-data-property/1.1.4: resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} engines: {node: '>= 0.4'} @@ -1241,6 +1541,11 @@ packages: gopd: 1.0.1 dev: true + /define-lazy-prop/3.0.0: + resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} + engines: {node: '>=12'} + dev: true + /define-properties/1.2.1: resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} engines: {node: '>= 0.4'} @@ -1269,6 +1574,11 @@ packages: wrappy: 1.0.2 dev: true + /diff-sequences/29.6.3: + resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dev: true + /diff/5.2.0: resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} engines: {node: '>=0.3.1'} @@ -1281,13 +1591,6 @@ packages: path-type: 3.0.0 dev: true - /dir-glob/3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} - engines: {node: '>=8'} - dependencies: - path-type: 4.0.0 - dev: true - /doctrine/2.1.0: resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} engines: {node: '>=0.10.0'} @@ -1321,8 +1624,10 @@ packages: domelementtype: 2.3.0 dev: true - /dompurify/3.1.6: - resolution: {integrity: sha512-cTOAhc36AalkjtBpfG6O8JimdTMWNXjiePT2xQH/ppBGi/4uIpmj8eKyIkMJErXWARyINV/sB38yf8JCLF5pbQ==} + /dompurify/3.2.6: + resolution: {integrity: sha512-/2GogDQlohXPZe6D6NOgQvXLPSYBqIWMnZ8zzOhn09REE4eyAzb+Hed3jhoM9OkuaJ8P6ZGTTVWQKAi8ieIzfQ==} + optionalDependencies: + '@types/trusted-types': 2.0.7 dev: true /domutils/2.8.0: @@ -1333,6 +1638,16 @@ packages: domhandler: 4.3.1 dev: true + /dotenv/16.4.5: + resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} + engines: {node: '>=12'} + dev: true + + /dotenv/16.5.0: + resolution: {integrity: sha512-m/C+AwOAr9/W1UOIZUo232ejMNnJAJtYQjUbHoNTBNTJSvqzzDh7vnrei3o3r3m9blf6ZoDkvcw0VmozNRFJxg==} + engines: {node: '>=12'} + dev: true + /eastasianwidth/0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} dev: true @@ -1344,6 +1659,10 @@ packages: safer-buffer: 2.1.2 dev: true + /electron-to-chromium/1.5.155: + resolution: {integrity: sha512-ps5KcGGmwL8VaeJlvlDlu4fORQpv3+GIcF5I3f9tUKUlJ/wsysh6HU8P5L1XWRYeXfA0oJd4PyM8ds8zTFf6Ng==} + dev: true + /emoji-regex/8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} dev: true @@ -1352,14 +1671,6 @@ packages: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} dev: true - /enhanced-resolve/5.17.1: - resolution: {integrity: sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==} - engines: {node: '>=10.13.0'} - dependencies: - graceful-fs: 4.2.11 - tapable: 2.2.1 - dev: true - /entities/2.2.0: resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} dev: true @@ -1369,13 +1680,6 @@ packages: engines: {node: '>=0.12'} dev: true - /enzyme-shallow-equal/1.0.7: - resolution: {integrity: sha512-/um0GFqUXnpM9SvKtje+9Tjoz3f1fpBC3eXRFrNs8kpYn69JljciYP7KZTqM/YQbUY9KUjvKB4jo/q+L6WGGvg==} - dependencies: - hasown: 2.0.2 - object-is: 1.1.6 - dev: true - /error-ex/1.3.2: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} dependencies: @@ -1520,6 +1824,11 @@ packages: engines: {node: '>=6'} dev: true + /escalade/3.2.0: + resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} + engines: {node: '>=6'} + dev: true + /escape-string-regexp/1.0.5: resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} engines: {node: '>=0.8.0'} @@ -1530,17 +1839,17 @@ packages: engines: {node: '>=10'} dev: true - /eslint-compat-utils/0.5.1_eslint@8.57.0: + /eslint-compat-utils/0.5.1_eslint@8.57.1: resolution: {integrity: sha512-3z3vFexKIEnjHE3zCMRo6fn/e44U7T1khUjg+Hp0ZQMCigh28rALD0nPFBcGZuiLC5rLZa2ubQHDRln09JfU2Q==} engines: {node: '>=12'} peerDependencies: eslint: '>=6.0.0' dependencies: - eslint: 8.57.0 + eslint: 8.57.1 semver: 7.6.3 dev: true - /eslint-config-airbnb-base/15.0.0_jrbq5spb6ym3vlo5mnlvtmgpyy: + /eslint-config-airbnb-base/15.0.0_unjw4kdf4fotpociz7fwijpbcy: resolution: {integrity: sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig==} engines: {node: ^10.12.0 || >=12.0.0} peerDependencies: @@ -1548,115 +1857,43 @@ packages: eslint-plugin-import: ^2.25.2 dependencies: confusing-browser-globals: 1.0.11 - eslint: 8.57.0 - eslint-plugin-import: 2.29.1_nneewum65j2qxmblkey6rl7qby + eslint: 8.57.1 + eslint-plugin-import: 2.29.1_eslint@8.57.1 object.assign: 4.1.5 object.entries: 1.1.8 semver: 6.3.1 dev: true - /eslint-config-airbnb/19.0.4_rkj5pdb7oeft273slftvhkzequ: - resolution: {integrity: sha512-T75QYQVQX57jiNgpF9r1KegMICE94VYwoFQyMGhrvc+lB8YF2E/M/PYDaQe1AJcWaEgqLE+ErXV1Og/+6Vyzew==} - engines: {node: ^10.12.0 || ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^7.32.0 || ^8.2.0 - eslint-plugin-import: ^2.25.3 - eslint-plugin-jsx-a11y: ^6.5.1 - eslint-plugin-react: ^7.28.0 - eslint-plugin-react-hooks: ^4.3.0 - dependencies: - eslint: 8.57.0 - eslint-config-airbnb-base: 15.0.0_jrbq5spb6ym3vlo5mnlvtmgpyy - eslint-plugin-import: 2.29.1_nneewum65j2qxmblkey6rl7qby - eslint-plugin-jsx-a11y: 6.9.0_eslint@8.57.0 - eslint-plugin-react: 7.35.0_eslint@8.57.0 - eslint-plugin-react-hooks: 4.6.2_eslint@8.57.0 - object.assign: 4.1.5 - object.entries: 1.1.8 - dev: true - - /eslint-config-prettier/8.10.0_eslint@8.57.0: + /eslint-config-prettier/8.10.0_eslint@8.57.1: resolution: {integrity: sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==} hasBin: true peerDependencies: eslint: '>=7.0.0' dependencies: - eslint: 8.57.0 + eslint: 8.57.1 dev: true - /eslint-formatter-gitlab/3.0.0_eslint@8.57.0: + /eslint-formatter-gitlab/3.0.0_eslint@8.57.1: resolution: {integrity: sha512-fqZ2G45rgbrHcFunqmwuG5Qo6QAOlxEsR+KdOP08T1Xegw5tJhHh9KFWMSct8q6x8xCMUyYGHypZd342bLUttA==} peerDependencies: - eslint: ^5 || ^6 || ^7 || ^8 - dependencies: - chalk: 4.1.2 - eslint: 8.57.0 - js-yaml: 4.1.0 - dev: true - - /eslint-import-resolver-node/0.3.9: - resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} - dependencies: - debug: 3.2.7 - is-core-module: 2.15.0 - resolve: 1.22.8 - transitivePeerDependencies: - - supports-color - dev: true - - /eslint-import-resolver-typescript/3.6.1_v5rw2ov7t7riomm6bxikk4ok4a: - resolution: {integrity: sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - eslint: '*' - eslint-plugin-import: '*' - dependencies: - debug: 4.3.5 - enhanced-resolve: 5.17.1 - eslint: 8.57.0 - eslint-module-utils: 2.8.1_nneewum65j2qxmblkey6rl7qby - eslint-plugin-import: 2.29.1_nneewum65j2qxmblkey6rl7qby - fast-glob: 3.3.2 - get-tsconfig: 4.7.6 - is-core-module: 2.15.0 - is-glob: 4.0.3 - transitivePeerDependencies: - - '@typescript-eslint/parser' - - eslint-import-resolver-node - - eslint-import-resolver-webpack - - supports-color + eslint: ^5 || ^6 || ^7 || ^8 + dependencies: + chalk: 4.1.2 + eslint: 8.57.1 + js-yaml: 4.1.0 dev: true - /eslint-module-utils/2.8.1_nneewum65j2qxmblkey6rl7qby: - resolution: {integrity: sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: '*' - eslint-import-resolver-node: '*' - eslint-import-resolver-typescript: '*' - eslint-import-resolver-webpack: '*' - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - eslint: - optional: true - eslint-import-resolver-node: - optional: true - eslint-import-resolver-typescript: - optional: true - eslint-import-resolver-webpack: - optional: true + /eslint-import-resolver-node/0.3.9: + resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} dependencies: - '@typescript-eslint/parser': 7.17.0_qusgslmwnowdaqieuropes6b5q debug: 3.2.7 - eslint: 8.57.0 - eslint-import-resolver-typescript: 3.6.1_v5rw2ov7t7riomm6bxikk4ok4a + is-core-module: 2.15.0 + resolve: 1.22.8 transitivePeerDependencies: - supports-color dev: true - /eslint-module-utils/2.8.1_pqk7zv6fiitje2mogc4etjt6ku: + /eslint-module-utils/2.8.1_rfhnpyqadzbw26eiqc3hoihdgi: resolution: {integrity: sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==} engines: {node: '>=4'} peerDependencies: @@ -1677,11 +1914,9 @@ packages: eslint-import-resolver-webpack: optional: true dependencies: - '@typescript-eslint/parser': 7.17.0_qusgslmwnowdaqieuropes6b5q debug: 3.2.7 - eslint: 8.57.0 + eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.1_v5rw2ov7t7riomm6bxikk4ok4a transitivePeerDependencies: - supports-color dev: true @@ -1692,7 +1927,7 @@ packages: htmlparser2: 7.2.0 dev: true - /eslint-plugin-import/2.29.1_nneewum65j2qxmblkey6rl7qby: + /eslint-plugin-import/2.29.1_eslint@8.57.1: resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==} engines: {node: '>=4'} peerDependencies: @@ -1702,16 +1937,15 @@ packages: '@typescript-eslint/parser': optional: true dependencies: - '@typescript-eslint/parser': 7.17.0_qusgslmwnowdaqieuropes6b5q array-includes: 3.1.8 array.prototype.findlastindex: 1.2.5 array.prototype.flat: 1.3.2 array.prototype.flatmap: 1.3.2 debug: 3.2.7 doctrine: 2.1.0 - eslint: 8.57.0 + eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.1_pqk7zv6fiitje2mogc4etjt6ku + eslint-module-utils: 2.8.1_rfhnpyqadzbw26eiqc3hoihdgi hasown: 2.0.2 is-core-module: 2.15.0 is-glob: 4.0.3 @@ -1727,7 +1961,7 @@ packages: - supports-color dev: true - /eslint-plugin-jsx-a11y/6.9.0_eslint@8.57.0: + /eslint-plugin-jsx-a11y/6.9.0_eslint@8.57.1: resolution: {integrity: sha512-nOFOCaJG2pYqORjK19lqPqxMO/JpvdCZdPtNdxY3kvom3jTvkAbOvQvD8wuD0G8BYR0IGAGYDlzqWJOh/ybn2g==} engines: {node: '>=4.0'} peerDependencies: @@ -1742,7 +1976,7 @@ packages: damerau-levenshtein: 1.0.8 emoji-regex: 9.2.2 es-iterator-helpers: 1.0.19 - eslint: 8.57.0 + eslint: 8.57.1 hasown: 2.0.2 jsx-ast-utils: 3.3.5 language-tags: 1.0.9 @@ -1752,68 +1986,32 @@ packages: string.prototype.includes: 2.0.0 dev: true - /eslint-plugin-react-hooks/4.6.2_eslint@8.57.0: - resolution: {integrity: sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==} - engines: {node: '>=10'} - peerDependencies: - eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 - dependencies: - eslint: 8.57.0 - dev: true - - /eslint-plugin-react/7.35.0_eslint@8.57.0: - resolution: {integrity: sha512-v501SSMOWv8gerHkk+IIQBkcGRGrO2nfybfj5pLxuJNFTPxxA3PSryhXTK+9pNbtkggheDdsC0E9Q8CuPk6JKA==} - engines: {node: '>=4'} - peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 - dependencies: - array-includes: 3.1.8 - array.prototype.findlast: 1.2.5 - array.prototype.flatmap: 1.3.2 - array.prototype.tosorted: 1.1.4 - doctrine: 2.1.0 - es-iterator-helpers: 1.0.19 - eslint: 8.57.0 - estraverse: 5.3.0 - hasown: 2.0.2 - jsx-ast-utils: 3.3.5 - minimatch: 3.1.2 - object.entries: 1.1.8 - object.fromentries: 2.0.8 - object.values: 1.2.0 - prop-types: 15.8.1 - resolve: 2.0.0-next.5 - semver: 6.3.1 - string.prototype.matchall: 4.0.11 - string.prototype.repeat: 1.0.0 - dev: true - /eslint-plugin-security/1.7.1: resolution: {integrity: sha512-sMStceig8AFglhhT2LqlU5r+/fn9OwsA72O5bBuQVTssPCdQAOQzL+oMn/ZcpeUY6KcNfLJArgcrsSULNjYYdQ==} dependencies: safe-regex: 2.1.1 dev: true - /eslint-plugin-sonarjs/0.16.0_eslint@8.57.0: + /eslint-plugin-sonarjs/0.16.0_eslint@8.57.1: resolution: {integrity: sha512-al8ojAzcQW8Eu0tWn841ldhPpPcjrJ59TzzTfAVWR45bWvdAASCmrGl8vK0MWHyKVDdC0i17IGbtQQ1KgxLlVA==} engines: {node: '>=14'} peerDependencies: eslint: ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: - eslint: 8.57.0 + eslint: 8.57.1 dev: true - /eslint-plugin-unicorn/45.0.2_eslint@8.57.0: + /eslint-plugin-unicorn/45.0.2_eslint@8.57.1: resolution: {integrity: sha512-Y0WUDXRyGDMcKLiwgL3zSMpHrXI00xmdyixEGIg90gHnj0PcHY4moNv3Ppje/kDivdAy5vUeUr7z211ImPv2gw==} engines: {node: '>=14.18'} peerDependencies: eslint: '>=8.28.0' dependencies: '@babel/helper-validator-identifier': 7.24.7 - '@eslint-community/eslint-utils': 4.4.0_eslint@8.57.0 + '@eslint-community/eslint-utils': 4.4.0_eslint@8.57.1 ci-info: 3.9.0 clean-regexp: 1.0.0 - eslint: 8.57.0 + eslint: 8.57.1 esquery: 1.6.0 indent-string: 4.0.0 is-builtin-module: 3.2.1 @@ -1835,15 +2033,15 @@ packages: '@joshuajaco/get-monorepo-packages': 1.2.1 dev: true - /eslint-plugin-yml/1.14.0_eslint@8.57.0: + /eslint-plugin-yml/1.14.0_eslint@8.57.1: resolution: {integrity: sha512-ESUpgYPOcAYQO9czugcX5OqRvn/ydDVwGCPXY4YjPqc09rHaUVUA6IE6HLQys4rXk/S+qx3EwTd1wHCwam/OWQ==} engines: {node: ^14.17.0 || >=16.0.0} peerDependencies: eslint: '>=6.0.0' dependencies: debug: 4.3.5 - eslint: 8.57.0 - eslint-compat-utils: 0.5.1_eslint@8.57.0 + eslint: 8.57.1 + eslint-compat-utils: 0.5.1_eslint@8.57.1 lodash: 4.17.21 natural-compare: 1.4.0 yaml-eslint-parser: 1.2.3 @@ -1867,21 +2065,27 @@ packages: estraverse: 5.3.0 dev: true + /eslint-visitor-keys/2.1.0: + resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} + engines: {node: '>=10'} + dev: true + /eslint-visitor-keys/3.4.3: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /eslint/8.57.0: - resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} + /eslint/8.57.1: + resolution: {integrity: sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. hasBin: true dependencies: - '@eslint-community/eslint-utils': 4.4.0_eslint@8.57.0 + '@eslint-community/eslint-utils': 4.4.0_eslint@8.57.1 '@eslint-community/regexpp': 4.11.0 '@eslint/eslintrc': 2.1.4 - '@eslint/js': 8.57.0 - '@humanwhocodes/config-array': 0.11.14 + '@eslint/js': 8.57.1 + '@humanwhocodes/config-array': 0.13.0 '@humanwhocodes/module-importer': 1.0.1 '@nodelib/fs.walk': 1.2.8 '@ungap/structured-clone': 1.2.0 @@ -1977,22 +2181,9 @@ packages: /fast-deep-equal/3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - dev: true - - /fast-glob/3.3.2: - resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} - engines: {node: '>=8.6.0'} - dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.7 - dev: true /fast-json-stable-stringify/2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - dev: true /fast-levenshtein/2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} @@ -2002,6 +2193,13 @@ packages: resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} dev: true + /fast-xml-parser/4.5.3: + resolution: {integrity: sha512-RKihhV+SHsIUGXObeVy9AXiBbFwkVk7Syp8XgwN5U3JV416+Gwp/GO9i0JYKmikykgz/UHRrrV4ROuZEo/T0ig==} + hasBin: true + dependencies: + strnum: 1.1.2 + dev: true + /fastq/1.17.1: resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} dependencies: @@ -2107,13 +2305,6 @@ packages: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} dev: true - /fsevents/2.3.2: - resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - requiresBuild: true - optional: true - /fsevents/2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -2140,6 +2331,11 @@ packages: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} dev: true + /gensync/1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + dev: true + /get-caller-file/2.0.5: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} @@ -2174,12 +2370,6 @@ packages: get-intrinsic: 1.2.4 dev: true - /get-tsconfig/4.7.6: - resolution: {integrity: sha512-ZAqrLlu18NbDdRaHq+AKXzAmqIUPswPWKUchfytdAjiRFnCe5ojG2bstg6mRiZabkKfCoL/e98pbBELIV/YCeA==} - dependencies: - resolve-pkg-maps: 1.0.0 - dev: true - /getpass/0.1.7: resolution: {integrity: sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==} dependencies: @@ -2232,6 +2422,11 @@ packages: path-is-absolute: 1.0.1 dev: true + /globals/11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + dev: true + /globals/13.24.0: resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} engines: {node: '>=8'} @@ -2247,18 +2442,6 @@ packages: gopd: 1.0.1 dev: true - /globby/11.1.0: - resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} - engines: {node: '>=10'} - dependencies: - array-union: 2.1.0 - dir-glob: 3.0.1 - fast-glob: 3.3.2 - ignore: 5.3.1 - merge2: 1.4.1 - slash: 3.0.0 - dev: true - /globby/7.1.1: resolution: {integrity: sha512-yANWAN2DUcBtuus5Cpd+SKROzXHs2iVXFZt/Ykrfz6SAXqacLX25NZpltE+39ceMexYF4TtEadjuSTw8+3wX4g==} engines: {node: '>=4'} @@ -2295,7 +2478,7 @@ packages: source-map: 0.6.1 wordwrap: 1.0.0 optionalDependencies: - uglify-js: 3.19.0 + uglify-js: 3.19.3 dev: true /har-schema/2.0.0: @@ -2349,11 +2532,6 @@ packages: has-symbols: 1.0.3 dev: true - /has/1.0.4: - resolution: {integrity: sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==} - engines: {node: '>= 0.4.0'} - dev: true - /hasown/2.0.2: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} @@ -2570,6 +2748,12 @@ packages: has-tostringtag: 1.0.2 dev: true + /is-docker/3.0.0: + resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasBin: true + dev: true + /is-extglob/2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} @@ -2600,6 +2784,14 @@ packages: is-extglob: 2.1.1 dev: true + /is-inside-container/1.0.0: + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} + engines: {node: '>=14.16'} + hasBin: true + dependencies: + is-docker: 3.0.0 + dev: true + /is-map/2.0.3: resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} engines: {node: '>= 0.4'} @@ -2691,6 +2883,13 @@ packages: get-intrinsic: 1.2.4 dev: true + /is-wsl/3.1.0: + resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} + engines: {node: '>=16'} + dependencies: + is-inside-container: 1.0.0 + dev: true + /isarray/2.0.5: resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} dev: true @@ -2722,6 +2921,31 @@ packages: '@pkgjs/parseargs': 0.11.0 dev: true + /jest-diff/29.7.0: + resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + chalk: 4.1.2 + diff-sequences: 29.6.3 + jest-get-type: 29.6.3 + pretty-format: 29.7.0 + dev: true + + /jest-get-type/29.6.3: + resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dev: true + + /jest-matcher-utils/29.7.0: + resolution: {integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + chalk: 4.1.2 + jest-diff: 29.7.0 + jest-get-type: 29.6.3 + pretty-format: 29.7.0 + dev: true + /jose/4.14.4: resolution: {integrity: sha512-j8GhLiKmUAh+dsFXlX1aJCbt5KMibuKb+d7j1JaOJG6s2UjX1PQlW+OKB/sD4a/5ZYF4RcmYmLSndOoU3Lt/3g==} dev: true @@ -2754,6 +2978,11 @@ packages: resolution: {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==} dev: true + /jsep/1.4.0: + resolution: {integrity: sha512-B7qPcEVE3NVkmSJbaYxvv4cHkVW7DQsZz13pUMrfS8z8Q/BuShN+gcTXrUlPiGqM2/t/EEaI030bpxMqY8gMlw==} + engines: {node: '>= 10.16.0'} + dev: true + /jsesc/0.5.0: resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} hasBin: true @@ -2785,7 +3014,6 @@ packages: /json-schema-traverse/0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - dev: true /json-schema-traverse/1.0.0: resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} @@ -2810,10 +3038,31 @@ packages: minimist: 1.2.8 dev: true + /json5/2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + dev: true + /jsonc-parser/3.3.1: resolution: {integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==} dev: false + /jsonpath-plus/10.3.0: + resolution: {integrity: sha512-8TNmfeTCk2Le33A3vRRwtuworG/L5RrgMvdjhKZxvyShO+mBu2fP50OWUjRLNtvw344DdDarFh9buFAZs5ujeA==} + engines: {node: '>=18.0.0'} + hasBin: true + dependencies: + '@jsep-plugin/assignment': 1.3.0_jsep@1.4.0 + '@jsep-plugin/regex': 1.0.4_jsep@1.4.0 + jsep: 1.4.0 + dev: true + + /jsonpointer/5.0.1: + resolution: {integrity: sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==} + engines: {node: '>=0.10.0'} + dev: true + /jsprim/2.0.2: resolution: {integrity: sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ==} engines: {'0': node >=0.6.0} @@ -2866,6 +3115,11 @@ packages: language-subtag-registry: 0.3.23 dev: true + /leven/3.1.0: + resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} + engines: {node: '>=6'} + dev: true + /levn/0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} @@ -2929,10 +3183,6 @@ packages: resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} dev: true - /lodash.isequal/4.5.0: - resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} - dev: true - /lodash.merge/4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} dev: true @@ -2941,6 +3191,10 @@ packages: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} dev: true + /long/5.3.2: + resolution: {integrity: sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==} + dev: true + /loose-envify/1.4.0: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true @@ -2953,6 +3207,12 @@ packages: engines: {node: 20 || >=22} dev: true + /lru-cache/5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + dependencies: + yallist: 3.1.1 + dev: true + /lru-cache/6.0.0: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} engines: {node: '>=10'} @@ -2974,19 +3234,6 @@ packages: hasBin: true dev: true - /merge2/1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} - dev: true - - /micromatch/4.0.7: - resolution: {integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==} - engines: {node: '>=8.6'} - dependencies: - braces: 3.0.3 - picomatch: 2.3.1 - dev: true - /mime-db/1.52.0: resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} engines: {node: '>= 0.6'} @@ -3034,13 +3281,6 @@ packages: brace-expansion: 2.0.1 dev: true - /minimatch/9.0.5: - resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} - engines: {node: '>=16 || 14 >=14.17'} - dependencies: - brace-expansion: 2.0.1 - dev: true - /minimist/1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} dev: true @@ -3130,10 +3370,6 @@ packages: hasBin: true dev: true - /natural-compare-lite/1.4.0: - resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} - dev: true - /natural-compare/1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} dev: true @@ -3214,6 +3450,10 @@ packages: es6-promise: 3.3.1 dev: true + /node-releases/2.0.19: + resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} + dev: true + /nopt/4.0.3: resolution: {integrity: sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==} hasBin: true @@ -3367,6 +3607,16 @@ packages: wrappy: 1.0.2 dev: true + /open/10.1.2: + resolution: {integrity: sha512-cxN6aIDPz6rm8hbebcP7vrQNhvRcveZoJU72Y7vskh4oIm+BZwBECnx5nTmrlres1Qapvx27Qo1Auukpf8PKXw==} + engines: {node: '>=18'} + dependencies: + default-browser: 5.2.1 + define-lazy-prop: 3.0.0 + is-inside-container: 1.0.0 + is-wsl: 3.1.0 + dev: true + /openapi-sampler/1.5.1: resolution: {integrity: sha512-tIWIrZUKNAsbqf3bd9U1oH6JEXo8LNYuDlXw26By67EygpjT+ArFnsxxyTMjFWRfbqo5ozkvgSQDK69Gd8CddA==} dependencies: @@ -3374,6 +3624,14 @@ packages: json-pointer: 0.6.2 dev: true + /openapi-sampler/1.6.1: + resolution: {integrity: sha512-s1cIatOqrrhSj2tmJ4abFYZQK6l5v+V4toO5q1Pa0DyN8mtyqy2I+Qrj5W9vOELEtybIMQs/TBZGVO/DtTFK8w==} + dependencies: + '@types/json-schema': 7.0.15 + fast-xml-parser: 4.5.3 + json-pointer: 0.6.2 + dev: true + /optionator/0.9.4: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} @@ -3404,6 +3662,10 @@ packages: os-tmpdir: 1.0.2 dev: true + /outdent/0.8.0: + resolution: {integrity: sha512-KiOAIsdpUTcAXuykya5fnVVT+/5uS0Q1mrkRHcF89tpieSmY33O/tmc54CqwA+bfhbtEfZUNLHaPUiB9X3jt1A==} + dev: true + /p-limit/2.3.0: resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} engines: {node: '>=6'} @@ -3460,7 +3722,7 @@ packages: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} dependencies: - '@babel/code-frame': 7.24.7 + '@babel/code-frame': 7.27.1 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 @@ -3513,11 +3775,6 @@ packages: pify: 3.0.0 dev: true - /path-type/4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} - dev: true - /perfect-scrollbar/1.5.5: resolution: {integrity: sha512-dzalfutyP3e/FOpdlhVryN4AJ5XDVauVWxybSkLZmakFE2sS3y3pc4JnSprw8tGmHvkaG5Edr5T7LBTZ+WWU2g==} dev: true @@ -3526,8 +3783,8 @@ packages: resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} dev: true - /picocolors/1.0.1: - resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} + /picocolors/1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} dev: true /picomatch/2.3.1: @@ -3540,20 +3797,6 @@ packages: engines: {node: '>=4'} dev: true - /playwright-core/1.45.3: - resolution: {integrity: sha512-+ym0jNbcjikaOwwSZycFbwkWgfruWvYlJfThKYAlImbxUgdWFO2oW70ojPm4OpE4t6TAo2FY/smM+hpVTtkhDA==} - engines: {node: '>=18'} - hasBin: true - - /playwright/1.45.3: - resolution: {integrity: sha512-QhVaS+lpluxCaioejDZ95l4Y4jSFCsBvl2UZkpeXlzxmqS+aABr5c82YmfMHrL6x27nvrvykJAFpkzT2eWdJww==} - engines: {node: '>=18'} - hasBin: true - dependencies: - playwright-core: 1.45.3 - optionalDependencies: - fsevents: 2.3.2 - /pluralize/8.0.0: resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} engines: {node: '>=4'} @@ -3580,7 +3823,7 @@ packages: engines: {node: ^10 || ^12 || >=14} dependencies: nanoid: 3.3.7 - picocolors: 1.0.1 + picocolors: 1.1.1 source-map-js: 1.2.0 dev: true @@ -3688,6 +3931,15 @@ packages: engines: {node: '>= 0.8.0'} dev: true + /pretty-format/29.7.0: + resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/schemas': 29.6.3 + ansi-styles: 5.2.0 + react-is: 18.3.1 + dev: true + /pretty-ms/7.0.1: resolution: {integrity: sha512-973driJZvxiGOQ5ONsFhOF/DtzPMOMtgC11kCpUrPGMTgqp2q/1gwzCquocrN33is0VZ5GFHXZYMM9l6h67v2Q==} engines: {node: '>=10'} @@ -3708,6 +3960,25 @@ packages: react-is: 16.13.1 dev: true + /protobufjs/7.4.0: + resolution: {integrity: sha512-mRUWCc3KUU4w1jU8sGxICXH/gNS94DvI1gxqDvBzhj1JpcsimQkYiOJfwsPUykUI5ZaspFbSgmBLER8IrQ3tqw==} + engines: {node: '>=12.0.0'} + requiresBuild: true + dependencies: + '@protobufjs/aspromise': 1.1.2 + '@protobufjs/base64': 1.1.2 + '@protobufjs/codegen': 2.0.4 + '@protobufjs/eventemitter': 1.1.0 + '@protobufjs/fetch': 1.1.0 + '@protobufjs/float': 1.0.2 + '@protobufjs/inquire': 1.1.0 + '@protobufjs/path': 1.1.2 + '@protobufjs/pool': 1.1.0 + '@protobufjs/utf8': 1.1.0 + '@types/node': 20.14.12 + long: 5.3.2 + dev: true + /psl/1.9.0: resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} dev: true @@ -3715,7 +3986,6 @@ packages: /punycode/2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} - dev: true /qs/6.5.3: resolution: {integrity: sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==} @@ -3754,16 +4024,6 @@ packages: resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} dev: true - /react-shallow-renderer/16.15.0_react@18.3.1: - resolution: {integrity: sha512-oScf2FqQ9LFVQgA73vr86xl2NaOIX73rh+YFqcOp68CWj56tSfgtGKrEbyhCj0rSijyG9M1CYprTh39fBi5hzA==} - peerDependencies: - react: ^16.0.0 || ^17.0.0 || ^18.0.0 - dependencies: - object-assign: 4.1.1 - react: 18.3.1 - react-is: 18.3.1 - dev: true - /react-tabs/6.0.2_react@18.3.1: resolution: {integrity: sha512-aQXTKolnM28k3KguGDBSAbJvcowOQr23A+CUJdzJtOSDOtTwzEaJA+1U4KwhNL9+Obe+jFS7geuvA7ICQPXOnQ==} peerDependencies: @@ -3850,22 +4110,21 @@ packages: picomatch: 2.3.1 dev: true - /redoc/2.1.5_mzjea7mep7mcjf3n4cxnj6lfiu: - resolution: {integrity: sha512-POSbVg+7WLf+/5/c6GWLxL7+9t2D+1WlZdLN0a6qaCQc+ih3XYzteRBkXEN5kjrYrRNjdspfxTZkDLN5WV3Tzg==} + /redoc/2.5.0_mzjea7mep7mcjf3n4cxnj6lfiu: + resolution: {integrity: sha512-NpYsOZ1PD9qFdjbLVBZJWptqE+4Y6TkUuvEOqPUmoH7AKOmPcE+hYjotLxQNTqVoWL4z0T2uxILmcc8JGDci+Q==} engines: {node: '>=6.9', npm: '>=3.0.0'} peerDependencies: core-js: ^3.1.4 mobx: ^6.0.4 - react: ^16.8.4 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.4 || ^17.0.0 || ^18.0.0 + react: ^16.8.4 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.4 || ^17.0.0 || ^18.0.0 || ^19.0.0 styled-components: ^4.1.1 || ^5.1.1 || ^6.0.5 dependencies: - '@cfaester/enzyme-adapter-react-18': 0.8.0_nnrd3gsncyragczmpvfhocinkq - '@redocly/openapi-core': 1.18.1 + '@redocly/openapi-core': 1.34.3 classnames: 2.5.1 core-js: 3.37.1 decko: 1.2.0 - dompurify: 3.1.6 + dompurify: 3.2.6 eventemitter3: 5.0.1 json-pointer: 0.6.2 lunr: 2.3.9 @@ -3889,7 +4148,6 @@ packages: url-template: 2.0.8 transitivePeerDependencies: - encoding - - enzyme - react-native - supports-color dev: true @@ -3956,10 +4214,6 @@ packages: engines: {node: '>=4'} dev: true - /resolve-pkg-maps/1.0.0: - resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} - dev: true - /resolve/1.22.8: resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} hasBin: true @@ -3969,15 +4223,6 @@ packages: supports-preserve-symlinks-flag: 1.0.0 dev: true - /resolve/2.0.0-next.5: - resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} - hasBin: true - dependencies: - is-core-module: 2.15.0 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - dev: true - /reusify/1.0.4: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} @@ -3991,6 +4236,11 @@ packages: glob: 7.2.3 dev: true + /run-applescript/7.0.0: + resolution: {integrity: sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==} + engines: {node: '>=18'} + dev: true + /run-parallel/1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} dependencies: @@ -4074,6 +4324,10 @@ packages: uuid: 3.4.0 dev: true + /set-cookie-parser/2.7.1: + resolution: {integrity: sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==} + dev: true + /set-function-length/1.2.2: resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} engines: {node: '>= 0.4'} @@ -4195,11 +4449,6 @@ packages: engines: {node: '>=0.10.0'} dev: true - /slash/3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} - dev: true - /slide/1.1.6: resolution: {integrity: sha512-NwrtjCg+lZoqhFU8fOwl4ay2ei8PaqCBOUV3/ektPY9trO1yQ1oXEfmHAhKArUVUr/hOHvy5f6AdP17dCM0zMw==} dev: true @@ -4323,31 +4572,6 @@ packages: es-abstract: 1.23.3 dev: true - /string.prototype.matchall/4.0.11: - resolution: {integrity: sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==} - engines: {node: '>= 0.4'} - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-errors: 1.3.0 - es-object-atoms: 1.0.0 - get-intrinsic: 1.2.4 - gopd: 1.0.1 - has-symbols: 1.0.3 - internal-slot: 1.0.7 - regexp.prototype.flags: 1.5.2 - set-function-name: 2.0.2 - side-channel: 1.0.6 - dev: true - - /string.prototype.repeat/1.0.0: - resolution: {integrity: sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==} - dependencies: - define-properties: 1.2.1 - es-abstract: 1.23.3 - dev: true - /string.prototype.trim/1.2.9: resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} engines: {node: '>= 0.4'} @@ -4412,6 +4636,10 @@ packages: engines: {node: '>=8'} dev: true + /strnum/1.1.2: + resolution: {integrity: sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA==} + dev: true + /styled-components/6.1.12_nnrd3gsncyragczmpvfhocinkq: resolution: {integrity: sha512-n/O4PzRPhbYI0k1vKKayfti3C/IGcPf+DqcrOB7O/ab9x4u/zjqraneT5N45+sIe87cxrCApXM8Bna7NYxwoTA==} engines: {node: '>= 16'} @@ -4474,11 +4702,6 @@ packages: - encoding dev: true - /tapable/2.2.1: - resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} - engines: {node: '>=6'} - dev: true - /teleport-javascript/1.0.0: resolution: {integrity: sha512-j1llvWVFyEn/6XIFDfX5LAU43DXe0GCt3NfXDwJ8XpRRMkS+i50SAkonAONBy+vxwPFBd50MFU8a2uj8R/ccLg==} dev: true @@ -4503,15 +4726,6 @@ packages: engines: {node: '>=0.6'} dev: true - /ts-api-utils/1.3.0_typescript@5.5.4: - resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} - engines: {node: '>=16'} - peerDependencies: - typescript: '>=4.2.0' - dependencies: - typescript: 5.5.4 - dev: true - /tsconfig-paths/3.15.0: resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} dependencies: @@ -4521,24 +4735,10 @@ packages: strip-bom: 3.0.0 dev: true - /tslib/1.14.1: - resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} - dev: true - /tslib/2.6.2: resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} dev: true - /tsutils/3.21.0_typescript@5.5.4: - resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} - engines: {node: '>= 6'} - peerDependencies: - typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' - dependencies: - tslib: 1.14.1 - typescript: 5.5.4 - dev: true - /tweetnacl/0.14.5: resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==} dev: true @@ -4614,14 +4814,18 @@ packages: possible-typed-array-names: 1.0.0 dev: true + /typedarray/0.0.6: + resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} + dev: true + /typescript/5.5.4: resolution: {integrity: sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==} engines: {node: '>=14.17'} hasBin: true dev: true - /uglify-js/3.19.0: - resolution: {integrity: sha512-wNKHUY2hYYkf6oSFfhwwiHo4WCHzHmzcXsqXYTN9ja3iApYIFbb2U6ics9hBcYLHcYGQoAlwnZlTrf3oF+BL/Q==} + /uglify-js/3.19.3: + resolution: {integrity: sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==} engines: {node: '>=0.8.0'} hasBin: true requiresBuild: true @@ -4645,16 +4849,35 @@ packages: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} dev: true + /undici/6.21.3: + resolution: {integrity: sha512-gBLkYIlEnSp8pFbT64yFgGE6UIB9tAkhukC23PmMDCe5Nd+cRqKxSjw5y54MK2AZMgZfJWMaNE4nYUHgi1XEOw==} + engines: {node: '>=18.17'} + dev: true + /universalify/0.2.0: resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} engines: {node: '>= 4.0.0'} dev: true + /update-browserslist-db/1.1.3_browserslist@4.24.5: + resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + dependencies: + browserslist: 4.24.5 + escalade: 3.2.0 + picocolors: 1.1.1 + dev: true + + /uri-js-replace/1.0.1: + resolution: {integrity: sha512-W+C9NWNLFOoBI2QWDp4UT9pv65r2w5Cx+3sTYFvtMdDBxkKt1syCqsUdSFAChbEe1uK5TfS04wt/nGwmaeIQ0g==} + dev: true + /uri-js/4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} dependencies: punycode: 2.3.1 - dev: true /url-parse/1.5.10: resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} @@ -4839,6 +5062,10 @@ packages: engines: {node: '>=10'} dev: true + /yallist/3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + dev: true + /yallist/4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} dev: true From a3a6ef8310bed9404009d31f849774856687bc3b Mon Sep 17 00:00:00 2001 From: skaram-nhs Date: Thu, 29 May 2025 09:36:25 +0100 Subject: [PATCH 2/4] CCM-9960: Update node in docker (#946) --- sandbox/Dockerfile | 2 +- sandbox/package-lock.json | 82 +++++++++++++++++++++++++-------------- 2 files changed, 54 insertions(+), 30 deletions(-) diff --git a/sandbox/Dockerfile b/sandbox/Dockerfile index 8ccce031d..c091d2c3f 100644 --- a/sandbox/Dockerfile +++ b/sandbox/Dockerfile @@ -1,4 +1,4 @@ -FROM node:20.15.0 +FROM node:22.16.0 COPY . /sandbox diff --git a/sandbox/package-lock.json b/sandbox/package-lock.json index 646f88c82..8dd1074f9 100644 --- a/sandbox/package-lock.json +++ b/sandbox/package-lock.json @@ -161,6 +161,27 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@noble/hashes": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", + "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", + "dev": true, + "engines": { + "node": "^14.21.3 || >=16" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/@paralleldrive/cuid2": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@paralleldrive/cuid2/-/cuid2-2.2.2.tgz", + "integrity": "sha512-ZOBkgDwEdoYVlSeRbYYXs0S9MejQofiVYoTbKzy/6GQa39/q5tQU2IX46+shYnUkpEl3wc+J6wRlar7r2EK2xA==", + "dev": true, + "dependencies": { + "@noble/hashes": "^1.1.5" + } + }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", @@ -660,9 +681,9 @@ "dev": true }, "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, "dependencies": { "path-key": "^3.1.0", @@ -1046,15 +1067,18 @@ } }, "node_modules/formidable": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/formidable/-/formidable-3.5.1.tgz", - "integrity": "sha512-WJWKelbRHN41m5dumb0/k8TeAx7Id/y3a+Z7QfhxP/htI9Js5zYaEDtG8uMgG0vM0lOlqnmjE99/kfpOYi/0Og==", + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-3.5.4.tgz", + "integrity": "sha512-YikH+7CUTOtP44ZTnUhR7Ic2UASBPOqmaRkRKxRbywPTe5VxF7RRCck4af9wutiZ/QKM5nME9Bie2fFaPz5Gug==", "dev": true, "dependencies": { + "@paralleldrive/cuid2": "^2.2.2", "dezalgo": "^1.0.4", - "hexoid": "^1.0.0", "once": "^1.4.0" }, + "engines": { + "node": ">=14.0.0" + }, "funding": { "url": "https://ko-fi.com/tunnckoCore/commissions" } @@ -1264,15 +1288,6 @@ "he": "bin/he" } }, - "node_modules/hexoid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hexoid/-/hexoid-1.0.0.tgz", - "integrity": "sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/hosted-git-info": { "version": "2.8.9", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", @@ -3580,6 +3595,21 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "@noble/hashes": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", + "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", + "dev": true + }, + "@paralleldrive/cuid2": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@paralleldrive/cuid2/-/cuid2-2.2.2.tgz", + "integrity": "sha512-ZOBkgDwEdoYVlSeRbYYXs0S9MejQofiVYoTbKzy/6GQa39/q5tQU2IX46+shYnUkpEl3wc+J6wRlar7r2EK2xA==", + "dev": true, + "requires": { + "@noble/hashes": "^1.1.5" + } + }, "@pkgjs/parseargs": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", @@ -3958,9 +3988,9 @@ "dev": true }, "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, "requires": { "path-key": "^3.1.0", @@ -4248,13 +4278,13 @@ } }, "formidable": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/formidable/-/formidable-3.5.1.tgz", - "integrity": "sha512-WJWKelbRHN41m5dumb0/k8TeAx7Id/y3a+Z7QfhxP/htI9Js5zYaEDtG8uMgG0vM0lOlqnmjE99/kfpOYi/0Og==", + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-3.5.4.tgz", + "integrity": "sha512-YikH+7CUTOtP44ZTnUhR7Ic2UASBPOqmaRkRKxRbywPTe5VxF7RRCck4af9wutiZ/QKM5nME9Bie2fFaPz5Gug==", "dev": true, "requires": { + "@paralleldrive/cuid2": "^2.2.2", "dezalgo": "^1.0.4", - "hexoid": "^1.0.0", "once": "^1.4.0" } }, @@ -4393,12 +4423,6 @@ "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "dev": true }, - "hexoid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hexoid/-/hexoid-1.0.0.tgz", - "integrity": "sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==", - "dev": true - }, "hosted-git-info": { "version": "2.8.9", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", From 02c1f9ec6953bbd271d82e500309ce557e2904db Mon Sep 17 00:00:00 2001 From: Ian Hodges Date: Fri, 30 May 2025 14:53:18 +0100 Subject: [PATCH 3/4] CCM-10077 Relax api contact details validation (#940) --- .../post_v1_message-batches/validation.md | 86 +++---- .../post_v1_single-message/validation.md | 70 ++--- .../post_v1_message-batches/validation.md | 54 ++-- .../sandbox/post_v1_messages/validation.md | 54 ++-- sandbox/__test__/batch_send.spec.js | 230 +++-------------- sandbox/__test__/messages.spec.js | 240 +++--------------- sandbox/handlers/config.js | 5 +- .../override_contact_details.js | 166 ++++-------- .../400_UnableToProcessMessageBatch.yaml | 7 - .../messages/400_UnableToProcessMessage.yaml | 7 - .../test_400_invalid_contact_details.py | 42 +-- .../test_400_invalid_contact_details.py | 52 +--- ..._invalid_contact_details_address_lines.rst | 22 ++ ..._contact_details_address_lines_too_few.rst | 22 -- ...contact_details_address_lines_too_many.rst | 2 +- ...valid_contact_details_address_postcode.rst | 12 +- .../test_invalid_contact_details_email.rst | 10 +- .../test_invalid_contact_details_sms.rst | 12 +- .../test_invalid_personalisation.rst | 6 +- tests/lib/constants/constants.py | 8 - .../test_field_validation.py | 38 ++- .../create_messages/test_field_validation.py | 38 ++- 22 files changed, 354 insertions(+), 829 deletions(-) create mode 100644 tests/docs/partials/validation/test_invalid_contact_details_address_lines.rst delete mode 100644 tests/docs/partials/validation/test_invalid_contact_details_address_lines_too_few.rst diff --git a/docs/tests/post_v1_message-batches/validation.md b/docs/tests/post_v1_message-batches/validation.md index a639aaa5d..b55daa774 100644 --- a/docs/tests/post_v1_message-batches/validation.md +++ b/docs/tests/post_v1_message-batches/validation.md @@ -33,11 +33,11 @@ Below is a table showing the required attributes and their locations as seen in | nhsNumber | /data/attributes/messages/0/recipient/nhsNumber | -## Scenario: An API consumer submitting a request with an invalid address postcode receives a 400 ‘Invalid Value’ response +## Scenario: An API consumer submitting a request with a non-string array address lines receives a 400 ‘Invalid Value’ response -A valid contact detail must be structured in this format: { sms: value, email: value, address: { lines: [], postcode: value } } +A valid address lines contact detail must be structured in this format: { address: { lines: Value } } where Value is a string array -**Given** the API consumer provides an message body with an invalid postcode +**Given** the API consumer provides a message body with a non-string array address lines
**When** the request is submitted
@@ -48,34 +48,34 @@ A valid contact detail must be structured in this format: { sms: value, email: v - Response returns a 400 ‘Invalid Value’ error - Response returns the expected error message body with references to the invalid attribute -| Value | Description | -|-----------|------------------------------------------------| -| LS1 6AECD | Used to ensure only valid postcode is accepted | +| Value | Description | +|---------|--------------------------------------------------------------| +| [1,2] | Used to ensure only a string array address lines is accepted | -## Scenario: An API consumer submitting a request with invalid address lines (too few) receives a 400 ‘Too few items’ response +## Scenario: An API consumer submitting a request with a non-string address postcode receives a 400 ‘Invalid Value’ response -A valid contact detail must be structured in this format: { address: { lines: [ Value1, Value2 ], postcode: value } } +A valid address postcode contact detail must be structured in this format: { address: { postcode: Value } } where Value is a string -**Given** the API consumer provides an message body with with too few address lines +**Given** the API consumer provides a message body with a non-string address postcode
**When** the request is submitted
-**Then** the response returns a 400 too few items error +**Then** the response returns a 400 invalid value error
**Asserts** -- Response returns a 400 ‘Too few items’ error +- Response returns a 400 ‘Invalid Value’ error - Response returns the expected error message body with references to the invalid attribute | Value | Description | |---------|-----------------------------------------------------------| -| [ “1” ] | Used to ensure list of less than 2 values is not accepted | +| [] | Used to ensure only a string address postcode is accepted | ## Scenario: An API consumer submitting a request with invalid address lines (too many) receives a 400 ‘Invalid Value’ response -A valid contact detail must be structured in this format: { address: { lines: [ Value1, Value2 ], postcode: value } } +A valid contact detail must be structured in this format: { address: { lines: [ Value1, Value2 ], postcode: Value } } **Given** the API consumer provides an message body with with too many address lines
@@ -93,11 +93,11 @@ A valid contact detail must be structured in this format: { address: { lines: [ | [ “1”, “2”, “3”, “4”, “5”, “6” ] | Used to ensure list of more than 5 values is not accepted | -## Scenario: An API consumer submitting a request with an invalid email receives a 400 ‘Invalid Value’ response +## Scenario: An API consumer submitting a request with a non-string email address receives a 400 ‘Invalid Value’ response -A valid contact detail must be structured in this format: { email: Value } +A valid email contact detail must be structured in this format: { email: Value } where Value is a string -**Given** the API consumer provides an message body with an invalid email address +**Given** the API consumer provides a message body with a non-string email address
**When** the request is submitted
@@ -108,16 +108,16 @@ A valid contact detail must be structured in this format: { email: Value } - Response returns a 400 ‘Invalid Value’ error - Response returns the expected error message body with references to the invalid attribute -| Value | Description | -|---------------------|------------------------------------------------------| -| invalidEmailAddress | Used to ensure invalid email address is not accepted | +| Value | Description | +|---------|--------------------------------------------------------| +| [] | Used to ensure only a string email address is accepted | -## Scenario: An API consumer submitting a request with an invalid email receives a 400 ‘Invalid Value’ response +## Scenario: An API consumer submitting a request with a non-string email address receives a 400 ‘Invalid Value’ response -A valid contact detail must be structured in this format: { email: Value } +A valid email contact detail must be structured in this format: { email: Value } where Value is a string -**Given** the API consumer provides an message body with an invalid email address +**Given** the API consumer provides a message body with a non-string email address
**When** the request is submitted
@@ -128,16 +128,16 @@ A valid contact detail must be structured in this format: { email: Value } - Response returns a 400 ‘Invalid Value’ error - Response returns the expected error message body with references to the invalid attribute -| Value | Description | -|---------------------|------------------------------------------------------| -| invalidEmailAddress | Used to ensure invalid email address is not accepted | +| Value | Description | +|---------|--------------------------------------------------------| +| [] | Used to ensure only a string email address is accepted | -## Scenario: An API consumer submitting a request with an invalid sms receives a 400 ‘Invalid Value’ response +## Scenario: An API consumer submitting a request with a non-string sms receives a 400 ‘Invalid Value’ response -A valid sms contact detail must be structured in this format: { sms: value } +A valid sms contact detail must be structured in this format: { sms: Value } where Value is a string -**Given** the API consumer provides an message body with an invalid sms +**Given** the API consumer provides a message body with a non-string sms
**When** the request is submitted
@@ -148,16 +148,16 @@ A valid sms contact detail must be structured in this format: { sms: value } - Response returns a 400 ‘Invalid Value’ error - Response returns the expected error message body with references to the invalid attribute -| Value | Description | -|--------------|-----------------------------------------------------| -| 077009000021 | Used to ensure invalid phone number is not accepted | +| Value | Description | +|---------|-------------------------------------------------------| +| [] | Used to ensure only a string phone number is accepted | -## Scenario: An API consumer submitting a request with an invalid sms receives a 400 ‘Invalid Value’ response +## Scenario: An API consumer submitting a request with a non-string sms receives a 400 ‘Invalid Value’ response -A valid sms contact detail must be structured in this format: { sms: value } +A valid sms contact detail must be structured in this format: { sms: Value } where Value is a string -**Given** the API consumer provides an message body with an invalid sms +**Given** the API consumer provides a message body with a non-string sms
**When** the request is submitted
@@ -168,9 +168,9 @@ A valid sms contact detail must be structured in this format: { sms: value } - Response returns a 400 ‘Invalid Value’ error - Response returns the expected error message body with references to the invalid attribute -| Value | Description | -|--------------|-----------------------------------------------------| -| 077009000021 | Used to ensure invalid phone number is not accepted | +| Value | Description | +|---------|-------------------------------------------------------| +| [] | Used to ensure only a string phone number is accepted | ## Scenario: An API consumer submitting a request with an contact details when not allowed receives a 400 ‘Cannot set contact details’ response @@ -281,9 +281,9 @@ An NHS Number is a 10 digit number used to identify patients, for more informati - Response returns the expected error message body with references to the invalid attribute -## Scenario: An API consumer submitting a request with an invalid personalisation receives a 400 ‘Invalid value’ response +## Scenario: An API consumer submitting a request with an invalid personalisation receives a 400 ‘Invalid Value’ response -A valid personalisation must be structured in this format: { parameter: value } +A valid personalisation must be structured in this format: { parameter: Value } **Given** the API consumer provides a message body with an invalid personalisation
@@ -293,7 +293,7 @@ A valid personalisation must be structured in this format: { parameter: value }
**Asserts** -- Response returns a 400 ‘Invalid value’ error +- Response returns a 400 ‘Invalid Value’ error - Response returns the expected error message body with references to the invalid attribute | Value | Description | @@ -364,9 +364,9 @@ Below is a table showing the required attributes and their locations as seen in | nhsNumber | /data/attributes/messages/0/recipient/nhsNumber | -## Scenario: An API consumer submitting a request with an invalid personalisation receives a 400 ‘Invalid value’ response +## Scenario: An API consumer submitting a request with an invalid personalisation receives a 400 ‘Invalid Value’ response -A valid personalisation must be structured in this format: { parameter: value } +A valid personalisation must be structured in this format: { parameter: Value } **Given** the API consumer provides a message body with an invalid personalisation
@@ -376,7 +376,7 @@ A valid personalisation must be structured in this format: { parameter: value }
**Asserts** -- Response returns a 400 ‘Invalid value’ error +- Response returns a 400 ‘Invalid Value’ error - Response returns the expected error message body with references to the invalid attribute | Value | Description | diff --git a/docs/tests/post_v1_single-message/validation.md b/docs/tests/post_v1_single-message/validation.md index f60681457..9103f6de9 100644 --- a/docs/tests/post_v1_single-message/validation.md +++ b/docs/tests/post_v1_single-message/validation.md @@ -1,11 +1,11 @@ # Validation Tests -## Scenario: An API consumer submitting a request with an invalid address postcode receives a 400 ‘Invalid Value’ response +## Scenario: An API consumer submitting a request with a non-string array address lines receives a 400 ‘Invalid Value’ response -A valid contact detail must be structured in this format: { sms: value, email: value, address: { lines: [], postcode: value } } +A valid address lines contact detail must be structured in this format: { address: { lines: Value } } where Value is a string array -**Given** the API consumer provides an message body with an invalid postcode +**Given** the API consumer provides a message body with a non-string array address lines
**When** the request is submitted
@@ -16,34 +16,14 @@ A valid contact detail must be structured in this format: { sms: value, email: v - Response returns a 400 ‘Invalid Value’ error - Response returns the expected error message body with references to the invalid attribute -| Value | Description | -|-----------|------------------------------------------------| -| LS1 6AECD | Used to ensure only valid postcode is accepted | - - -## Scenario: An API consumer submitting a request with invalid address lines (too few) receives a 400 ‘Too few items’ response - -A valid contact detail must be structured in this format: { address: { lines: [ Value1, Value2 ], postcode: value } } - -**Given** the API consumer provides an message body with with too few address lines -
-**When** the request is submitted -
-**Then** the response returns a 400 too few items error -
- -**Asserts** -- Response returns a 400 ‘Too few items’ error -- Response returns the expected error message body with references to the invalid attribute - -| Value | Description | -|---------|-----------------------------------------------------------| -| [ “1” ] | Used to ensure list of less than 2 values is not accepted | +| Value | Description | +|---------|--------------------------------------------------------------| +| [1,2] | Used to ensure only a string array address lines is accepted | ## Scenario: An API consumer submitting a request with invalid address lines (too many) receives a 400 ‘Invalid Value’ response -A valid contact detail must be structured in this format: { address: { lines: [ Value1, Value2 ], postcode: value } } +A valid contact detail must be structured in this format: { address: { lines: [ Value1, Value2 ], postcode: Value } } **Given** the API consumer provides an message body with with too many address lines
@@ -61,11 +41,11 @@ A valid contact detail must be structured in this format: { address: { lines: [ | [ “1”, “2”, “3”, “4”, “5”, “6” ] | Used to ensure list of more than 5 values is not accepted | -## Scenario: An API consumer submitting a request with an invalid email receives a 400 ‘Invalid Value’ response +## Scenario: An API consumer submitting a request with a non-string email address receives a 400 ‘Invalid Value’ response -A valid contact detail must be structured in this format: { email: Value } +A valid email contact detail must be structured in this format: { email: Value } where Value is a string -**Given** the API consumer provides an message body with an invalid email address +**Given** the API consumer provides a message body with a non-string email address
**When** the request is submitted
@@ -76,16 +56,16 @@ A valid contact detail must be structured in this format: { email: Value } - Response returns a 400 ‘Invalid Value’ error - Response returns the expected error message body with references to the invalid attribute -| Value | Description | -|---------------------|------------------------------------------------------| -| invalidEmailAddress | Used to ensure invalid email address is not accepted | +| Value | Description | +|---------|--------------------------------------------------------| +| [] | Used to ensure only a string email address is accepted | -## Scenario: An API consumer submitting a request with an invalid sms receives a 400 ‘Invalid Value’ response +## Scenario: An API consumer submitting a request with a non-string sms receives a 400 ‘Invalid Value’ response -A valid sms contact detail must be structured in this format: { sms: value } +A valid sms contact detail must be structured in this format: { sms: Value } where Value is a string -**Given** the API consumer provides an message body with an invalid sms +**Given** the API consumer provides a message body with a non-string sms
**When** the request is submitted
@@ -96,9 +76,9 @@ A valid sms contact detail must be structured in this format: { sms: value } - Response returns a 400 ‘Invalid Value’ error - Response returns the expected error message body with references to the invalid attribute -| Value | Description | -|--------------|-----------------------------------------------------| -| 077009000021 | Used to ensure invalid phone number is not accepted | +| Value | Description | +|---------|-------------------------------------------------------| +| [] | Used to ensure only a string phone number is accepted | ## Scenario: An API consumer submitting a request with an contact details when not allowed receives a 400 ‘Cannot set contact details’ response @@ -192,9 +172,9 @@ An NHS Number is a 10 digit number used to identify patients, for more informati - Response returns the expected error message body with references to the invalid attribute -## Scenario: An API consumer submitting a request with an invalid personalisation receives a 400 ‘Invalid value’ response +## Scenario: An API consumer submitting a request with an invalid personalisation receives a 400 ‘Invalid Value’ response -A valid personalisation must be structured in this format: { parameter: value } +A valid personalisation must be structured in this format: { parameter: Value } **Given** the API consumer provides a message body with an invalid personalisation
@@ -204,7 +184,7 @@ A valid personalisation must be structured in this format: { parameter: value }
**Asserts** -- Response returns a 400 ‘Invalid value’ error +- Response returns a 400 ‘Invalid Value’ error - Response returns the expected error message body with references to the invalid attribute | Value | Description | @@ -259,9 +239,9 @@ Below is a table showing the required attributes and their locations as seen in | nhsNumber | /data/attributes/recipient/nhsNumber | -## Scenario: An API consumer submitting a request with an invalid personalisation receives a 400 ‘Invalid value’ response +## Scenario: An API consumer submitting a request with an invalid personalisation receives a 400 ‘Invalid Value’ response -A valid personalisation must be structured in this format: { parameter: value } +A valid personalisation must be structured in this format: { parameter: Value } **Given** the API consumer provides a message body with an invalid personalisation
@@ -271,7 +251,7 @@ A valid personalisation must be structured in this format: { parameter: value }
**Asserts** -- Response returns a 400 ‘Invalid value’ error +- Response returns a 400 ‘Invalid Value’ error - Response returns the expected error message body with references to the invalid attribute | Value | Description | diff --git a/docs/tests/sandbox/post_v1_message-batches/validation.md b/docs/tests/sandbox/post_v1_message-batches/validation.md index 8dc7d17b9..cf95dd96f 100644 --- a/docs/tests/sandbox/post_v1_message-batches/validation.md +++ b/docs/tests/sandbox/post_v1_message-batches/validation.md @@ -129,29 +129,29 @@ Below is a table showing the required attributes and their locations as seen in | nhsNumber | /data/attributes/messages/0/recipient/nhsNumber | -## Scenario: An API consumer submitting a request with invalid address lines (too few) receives a 400 ‘Too few items’ response +## Scenario: An API consumer submitting a request with a non-string array address lines receives a 400 ‘Invalid Value’ response -A valid contact detail must be structured in this format: { address: { lines: [ Value1, Value2 ], postcode: value } } +A valid address lines contact detail must be structured in this format: { address: { lines: Value } } where Value is a string array -**Given** the API consumer provides an message body with with too few address lines +**Given** the API consumer provides a message body with a non-string array address lines
**When** the request is submitted
-**Then** the response returns a 400 too few items error +**Then** the response returns a 400 invalid value error
**Asserts** -- Response returns a 400 ‘Too few items’ error +- Response returns a 400 ‘Invalid Value’ error - Response returns the expected error message body with references to the invalid attribute -| Value | Description | -|---------|-----------------------------------------------------------| -| [ “1” ] | Used to ensure list of less than 2 values is not accepted | +| Value | Description | +|---------|--------------------------------------------------------------| +| [1,2] | Used to ensure only a string array address lines is accepted | ## Scenario: An API consumer submitting a request with invalid address lines (too many) receives a 400 ‘Invalid Value’ response -A valid contact detail must be structured in this format: { address: { lines: [ Value1, Value2 ], postcode: value } } +A valid contact detail must be structured in this format: { address: { lines: [ Value1, Value2 ], postcode: Value } } **Given** the API consumer provides an message body with with too many address lines
@@ -183,11 +183,11 @@ A valid contact detail must be structured in this format: { address: { lines: [ - Response returns the expected error message body -## Scenario: An API consumer submitting a request with an invalid email receives a 400 ‘Invalid Value’ response +## Scenario: An API consumer submitting a request with a non-string email address receives a 400 ‘Invalid Value’ response -A valid contact detail must be structured in this format: { email: Value } +A valid email contact detail must be structured in this format: { email: Value } where Value is a string -**Given** the API consumer provides an message body with an invalid email address +**Given** the API consumer provides a message body with a non-string email address
**When** the request is submitted
@@ -198,9 +198,9 @@ A valid contact detail must be structured in this format: { email: Value } - Response returns a 400 ‘Invalid Value’ error - Response returns the expected error message body with references to the invalid attribute -| Value | Description | -|---------------------|------------------------------------------------------| -| invalidEmailAddress | Used to ensure invalid email address is not accepted | +| Value | Description | +|---------|--------------------------------------------------------| +| [] | Used to ensure only a string email address is accepted | ## Scenario: An API consumer submitting a request with an invalid message batch reference receives a 400 ‘Invalid Value’ response @@ -251,9 +251,9 @@ An NHS Number is a 10 digit number used to identify patients, for more informati - Response returns the expected error message body with references to the invalid attribute -## Scenario: An API consumer submitting a request with an invalid personalisation receives a 400 ‘Invalid value’ response +## Scenario: An API consumer submitting a request with an invalid personalisation receives a 400 ‘Invalid Value’ response -A valid personalisation must be structured in this format: { parameter: value } +A valid personalisation must be structured in this format: { parameter: Value } **Given** the API consumer provides a message body with an invalid personalisation
@@ -263,7 +263,7 @@ A valid personalisation must be structured in this format: { parameter: value }
**Asserts** -- Response returns a 400 ‘Invalid value’ error +- Response returns a 400 ‘Invalid Value’ error - Response returns the expected error message body with references to the invalid attribute | Value | Description | @@ -288,11 +288,11 @@ The routing plan must be in a UUID format, for more information on UUID, look [h - Response returns the expected error message body with references to the invalid attribute -## Scenario: An API consumer submitting a request with an invalid sms receives a 400 ‘Invalid Value’ response +## Scenario: An API consumer submitting a request with a non-string sms receives a 400 ‘Invalid Value’ response -A valid sms contact detail must be structured in this format: { sms: value } +A valid sms contact detail must be structured in this format: { sms: Value } where Value is a string -**Given** the API consumer provides an message body with an invalid sms +**Given** the API consumer provides a message body with a non-string sms
**When** the request is submitted
@@ -303,9 +303,9 @@ A valid sms contact detail must be structured in this format: { sms: value } - Response returns a 400 ‘Invalid Value’ error - Response returns the expected error message body with references to the invalid attribute -| Value | Description | -|--------------|-----------------------------------------------------| -| 077009000021 | Used to ensure invalid phone number is not accepted | +| Value | Description | +|---------|-------------------------------------------------------| +| [] | Used to ensure only a string phone number is accepted | ## Scenario: An API consumer submitting a request with an invalid message value receives a 400 ‘Invalid Value’ response @@ -336,9 +336,9 @@ A valid sms contact detail must be structured in this format: { sms: value } - Response returns the expected error message body with references to the invalid attribute -## Scenario: An API consumer submitting a request with an invalid personalisation receives a 400 ‘Invalid value’ response +## Scenario: An API consumer submitting a request with an invalid personalisation receives a 400 ‘Invalid Value’ response -A valid personalisation must be structured in this format: { parameter: value } +A valid personalisation must be structured in this format: { parameter: Value } **Given** the API consumer provides a message body with an invalid personalisation
@@ -348,7 +348,7 @@ A valid personalisation must be structured in this format: { parameter: value }
**Asserts** -- Response returns a 400 ‘Invalid value’ error +- Response returns a 400 ‘Invalid Value’ error - Response returns the expected error message body with references to the invalid attribute | Value | Description | diff --git a/docs/tests/sandbox/post_v1_messages/validation.md b/docs/tests/sandbox/post_v1_messages/validation.md index 475d93a1f..ded2fb523 100644 --- a/docs/tests/sandbox/post_v1_messages/validation.md +++ b/docs/tests/sandbox/post_v1_messages/validation.md @@ -62,29 +62,29 @@ Below is a table showing the required attributes and their locations as seen in | nhsNumber | /data/attributes/recipient/nhsNumber | -## Scenario: An API consumer submitting a request with invalid address lines (too few) receives a 400 ‘Too few items’ response +## Scenario: An API consumer submitting a request with a non-string array address lines receives a 400 ‘Invalid Value’ response -A valid contact detail must be structured in this format: { address: { lines: [ Value1, Value2 ], postcode: value } } +A valid address lines contact detail must be structured in this format: { address: { lines: Value } } where Value is a string array -**Given** the API consumer provides an message body with with too few address lines +**Given** the API consumer provides a message body with a non-string array address lines
**When** the request is submitted
-**Then** the response returns a 400 too few items error +**Then** the response returns a 400 invalid value error
**Asserts** -- Response returns a 400 ‘Too few items’ error +- Response returns a 400 ‘Invalid Value’ error - Response returns the expected error message body with references to the invalid attribute -| Value | Description | -|---------|-----------------------------------------------------------| -| [ “1” ] | Used to ensure list of less than 2 values is not accepted | +| Value | Description | +|---------|--------------------------------------------------------------| +| [1,2] | Used to ensure only a string array address lines is accepted | ## Scenario: An API consumer submitting a request with invalid address lines (too many) receives a 400 ‘Invalid Value’ response -A valid contact detail must be structured in this format: { address: { lines: [ Value1, Value2 ], postcode: value } } +A valid contact detail must be structured in this format: { address: { lines: [ Value1, Value2 ], postcode: Value } } **Given** the API consumer provides an message body with with too many address lines
@@ -116,11 +116,11 @@ A valid contact detail must be structured in this format: { address: { lines: [ - Response returns the expected error message body -## Scenario: An API consumer submitting a request with an invalid email receives a 400 ‘Invalid Value’ response +## Scenario: An API consumer submitting a request with a non-string email address receives a 400 ‘Invalid Value’ response -A valid contact detail must be structured in this format: { email: Value } +A valid email contact detail must be structured in this format: { email: Value } where Value is a string -**Given** the API consumer provides an message body with an invalid email address +**Given** the API consumer provides a message body with a non-string email address
**When** the request is submitted
@@ -131,9 +131,9 @@ A valid contact detail must be structured in this format: { email: Value } - Response returns a 400 ‘Invalid Value’ error - Response returns the expected error message body with references to the invalid attribute -| Value | Description | -|---------------------|------------------------------------------------------| -| invalidEmailAddress | Used to ensure invalid email address is not accepted | +| Value | Description | +|---------|--------------------------------------------------------| +| [] | Used to ensure only a string email address is accepted | ## Scenario: An API consumer submitting a request with an invalid message reference receives a 400 ‘Invalid Value’ response @@ -168,9 +168,9 @@ An NHS Number is a 10 digit number used to identify patients, for more informati - Response returns the expected error message body with references to the invalid attribute -## Scenario: An API consumer submitting a request with an invalid personalisation receives a 400 ‘Invalid value’ response +## Scenario: An API consumer submitting a request with an invalid personalisation receives a 400 ‘Invalid Value’ response -A valid personalisation must be structured in this format: { parameter: value } +A valid personalisation must be structured in this format: { parameter: Value } **Given** the API consumer provides a message body with an invalid personalisation
@@ -180,7 +180,7 @@ A valid personalisation must be structured in this format: { parameter: value }
**Asserts** -- Response returns a 400 ‘Invalid value’ error +- Response returns a 400 ‘Invalid Value’ error - Response returns the expected error message body with references to the invalid attribute | Value | Description | @@ -205,11 +205,11 @@ The routing plan must be in a UUID format, for more information on UUID, look [h - Response returns the expected error message body with references to the invalid attribute -## Scenario: An API consumer submitting a request with an invalid sms receives a 400 ‘Invalid Value’ response +## Scenario: An API consumer submitting a request with a non-string sms receives a 400 ‘Invalid Value’ response -A valid sms contact detail must be structured in this format: { sms: value } +A valid sms contact detail must be structured in this format: { sms: Value } where Value is a string -**Given** the API consumer provides an message body with an invalid sms +**Given** the API consumer provides a message body with a non-string sms
**When** the request is submitted
@@ -220,9 +220,9 @@ A valid sms contact detail must be structured in this format: { sms: value } - Response returns a 400 ‘Invalid Value’ error - Response returns the expected error message body with references to the invalid attribute -| Value | Description | -|--------------|-----------------------------------------------------| -| 077009000021 | Used to ensure invalid phone number is not accepted | +| Value | Description | +|---------|-------------------------------------------------------| +| [] | Used to ensure only a string phone number is accepted | ## Scenario: An API consumer submitting a request with an contact details when not allowed receives a 400 ‘Cannot set contact details’ response @@ -239,9 +239,9 @@ A valid sms contact detail must be structured in this format: { sms: value } - Response returns the expected error message body with references to the invalid attribute -## Scenario: An API consumer submitting a request with an invalid personalisation receives a 400 ‘Invalid value’ response +## Scenario: An API consumer submitting a request with an invalid personalisation receives a 400 ‘Invalid Value’ response -A valid personalisation must be structured in this format: { parameter: value } +A valid personalisation must be structured in this format: { parameter: Value } **Given** the API consumer provides a message body with an invalid personalisation
@@ -251,7 +251,7 @@ A valid personalisation must be structured in this format: { parameter: value }
**Asserts** -- Response returns a 400 ‘Invalid value’ error +- Response returns a 400 ‘Invalid Value’ error - Response returns the expected error message body with references to the invalid attribute | Value | Description | diff --git a/sandbox/__test__/batch_send.spec.js b/sandbox/__test__/batch_send.spec.js index d5a1c2941..4b9ca1c49 100644 --- a/sandbox/__test__/batch_send.spec.js +++ b/sandbox/__test__/batch_send.spec.js @@ -996,7 +996,7 @@ describe("/api/v1/send", () => { recipient: { nhsNumber: "1", contactDetails: { - sms: "11111111111", + sms: 1234, }, }, }, @@ -1006,12 +1006,12 @@ describe("/api/v1/send", () => { }) .expect(400, { message: - "Invalid recipient contact details. Field 'sms': Input failed format check", + "Invalid recipient contact details. Field 'sms': 'sms' is not a string", errors: [ { code: 'CM_INVALID_VALUE', field: "/data/attributes/messages/0/recipient/contactDetails/sms", - message: "Input failed format check", + message: "'sms' is not a string", title: "Invalid value", statusCode: 400, }, @@ -1020,7 +1020,7 @@ describe("/api/v1/send", () => { .expect("Content-Type", /json/, done); }); - it("returns a 400 when invalid value for sms alternate contact detail is provided", (done) => { + it("returns a 200 when email alternate contact detail is provided", (done) => { request(server) .post("/api/v1/send") .set({ Authorization: "allowedContactDetailOverride" }) @@ -1036,48 +1036,7 @@ describe("/api/v1/send", () => { recipient: { nhsNumber: "1", contactDetails: { - sms: { - hello: 1, - }, - }, - }, - }, - ], - }, - }, - }) - .expect(400, { - message: "Invalid recipient contact details. Field 'sms': Input is not a string", - errors: [ - { - code: 'CM_INVALID_VALUE', - field: "/data/attributes/messages/0/recipient/contactDetails/sms", - message: "Input is not a string", - title: "Invalid value", - statusCode: 400, - }, - ], - }) - .expect("Content-Type", /json/, done); - }); - - it("returns a 200 when sms alternate contact detail is provided", (done) => { - request(server) - .post("/api/v1/send") - .set({ Authorization: "allowedContactDetailOverride" }) - .send({ - data: { - type: "MessageBatch", - attributes: { - routingPlanId: "b838b13c-f98c-4def-93f0-515d4e4f4ee1", - messageBatchReference: "request-id", - messages: [ - { - messageReference: "1", - recipient: { - nhsNumber: "1", - contactDetails: { - email: "hello", + email: "test@test.com", }, }, }, @@ -1105,7 +1064,7 @@ describe("/api/v1/send", () => { recipient: { nhsNumber: "1", contactDetails: { - email: "invalidEmailAddress", + email: 1234, }, }, }, @@ -1115,53 +1074,12 @@ describe("/api/v1/send", () => { }) .expect(400, { message: - "Invalid recipient contact details. Field 'email': Input failed format check", + "Invalid recipient contact details. Field 'email': 'email' is not a string", errors: [ { code: 'CM_INVALID_VALUE', field: "/data/attributes/messages/0/recipient/contactDetails/email", - message: "Input failed format check", - title: "Invalid value", - statusCode: 400, - }, - ], - }) - .expect("Content-Type", /json/, done); - }); - - it("returns a 400 when invalid value for email alternate contact detail is provided", (done) => { - request(server) - .post("/api/v1/send") - .set({ Authorization: "allowedContactDetailOverride" }) - .send({ - data: { - type: "MessageBatch", - attributes: { - routingPlanId: "b838b13c-f98c-4def-93f0-515d4e4f4ee1", - messageBatchReference: "request-id", - messages: [ - { - messageReference: "1", - recipient: { - nhsNumber: "1", - contactDetails: { - email: { - hello: 1, - }, - }, - }, - }, - ], - }, - }, - }) - .expect(400, { - message: "Invalid recipient contact details. Field 'email': Input is not a string", - errors: [ - { - code: 'CM_INVALID_VALUE', - field: "/data/attributes/messages/0/recipient/contactDetails/email", - message: "Input is not a string", + message: "'email' is not a string", title: "Invalid value", statusCode: 400, }, @@ -1308,13 +1226,13 @@ describe("/api/v1/send", () => { }) .expect(400, { message: - "Invalid recipient contact details. Field 'address': 'lines' is missing", + "Invalid recipient contact details. Field 'address': 'lines' is not a string array", errors: [ { - code: 'CM_MISSING_VALUE', + code: 'CM_INVALID_VALUE', field: "/data/attributes/messages/0/recipient/contactDetails/address", - message: "`lines` is missing", - title: "Missing value", + message: "'lines' is not a string array", + title: "Invalid value", statusCode: 400, }, ], @@ -1322,7 +1240,7 @@ describe("/api/v1/send", () => { .expect("Content-Type", /json/, done); }); - it("returns a 400 when too few lines is provided in address alternate contact detail is provided", (done) => { + it("returns a 400 when too many lines is provided in address alternate contact detail is provided", (done) => { request(server) .post("/api/v1/send") .set({ Authorization: "allowedContactDetailOverride" }) @@ -1339,7 +1257,7 @@ describe("/api/v1/send", () => { nhsNumber: "1", contactDetails: { address: { - lines: ["1"], + lines: ["1", "2", "3", "4", "5", "6"], postcode: "hello", }, }, @@ -1350,22 +1268,21 @@ describe("/api/v1/send", () => { }, }) .expect(400, { - message: - "Invalid recipient contact details. Field 'address': Too few address lines were provided", + message: "Invalid recipient contact details. Field 'address': Too many address lines were provided", errors: [ { - code: 'CM_TOO_FEW_ITEMS', + code: 'CM_INVALID_VALUE', field: "/data/attributes/messages/0/recipient/contactDetails/address", - message: "Too few address lines were provided", - title: "Too few items", + message: "Too many address lines were provided", + title: "Invalid value", statusCode: 400, - } - ] + }, + ], }) .expect("Content-Type", /json/, done); }); - it("returns a 400 when too many lines is provided in address alternate contact detail is provided", (done) => { + it("returns a 400 when lines contains non-string value in address alternate contact detail is provided", (done) => { request(server) .post("/api/v1/send") .set({ Authorization: "allowedContactDetailOverride" }) @@ -1382,7 +1299,7 @@ describe("/api/v1/send", () => { nhsNumber: "1", contactDetails: { address: { - lines: ["1", "2", "3", "4", "5", "6"], + lines: ["1", "2", 3, "4", "5"], postcode: "hello", }, }, @@ -1393,12 +1310,12 @@ describe("/api/v1/send", () => { }, }) .expect(400, { - message: "Invalid recipient contact details. Field 'address': Too many address lines were provided", + message: "Invalid recipient contact details. Field 'address': 'lines' is not a string array", errors: [ { code: 'CM_INVALID_VALUE', field: "/data/attributes/messages/0/recipient/contactDetails/address", - message: "Too many address lines were provided", + message: "'lines' is not a string array", title: "Invalid value", statusCode: 400, }, @@ -1407,7 +1324,7 @@ describe("/api/v1/send", () => { .expect("Content-Type", /json/, done); }); - it("returns a 400 when lines contains non-string value in address alternate contact detail is provided", (done) => { + it("returns a 200 when no postcode is provided in address alternate contact detail is provided", (done) => { request(server) .post("/api/v1/send") .set({ Authorization: "allowedContactDetailOverride" }) @@ -1424,8 +1341,7 @@ describe("/api/v1/send", () => { nhsNumber: "1", contactDetails: { address: { - lines: ["1", "2", 3, "4", "5"], - postcode: "hello", + lines: ["1", "2"], }, }, }, @@ -1434,22 +1350,11 @@ describe("/api/v1/send", () => { }, }, }) - .expect(400, { - message: "Invalid recipient contact details. Field 'address': Lines contain non-string or empty line", - errors: [ - { - code: 'CM_INVALID_VALUE', - field: "/data/attributes/messages/0/recipient/contactDetails/address", - message: "Lines contain non-string or empty line", - title: "Invalid value", - statusCode: 400, - }, - ], - }) + .expect(200) .expect("Content-Type", /json/, done); }); - it("returns a 400 when no postcode is provided in address alternate contact detail is provided", (done) => { + it("returns a 200 when no lines is provided in address alternate contact detail is provided", (done) => { request(server) .post("/api/v1/send") .set({ Authorization: "allowedContactDetailOverride" }) @@ -1466,7 +1371,7 @@ describe("/api/v1/send", () => { nhsNumber: "1", contactDetails: { address: { - lines: ["1", "2"], + postcode: "hello", }, }, }, @@ -1475,19 +1380,7 @@ describe("/api/v1/send", () => { }, }, }) - .expect(400, { - message: - "Invalid recipient contact details. Field 'address': 'postcode' is missing", - errors: [ - { - code: 'CM_MISSING_VALUE', - field: "/data/attributes/messages/0/recipient/contactDetails/address", - message: "`postcode` is missing", - title: "Missing value", - statusCode: 400, - }, - ], - }) + .expect(200) .expect("Content-Type", /json/, done); }); @@ -1780,51 +1673,6 @@ describe("/api/v1/send", () => { .expect("Content-Type", /json/, done); }); - it("returns a 400 when no lastName is provided in name alternate contact detail is provided", (done) => { - request(server) - .post("/api/v1/send") - .set({ Authorization: "allowedContactDetailOverride" }) - .send({ - data: { - type: "MessageBatch", - attributes: { - routingPlanId: "b838b13c-f98c-4def-93f0-515d4e4f4ee1", - messageBatchReference: "request-id", - messages: [ - { - messageReference: "1", - recipient: { - nhsNumber: "1", - contactDetails: { - name: { - prefix: "Mr", - firstName: "John", - middleNames: "Little", - suffix: "Jr" - }, - }, - }, - }, - ], - }, - }, - }) - .expect(400, { - message: - "Invalid recipient contact details. Field 'name': 'lastName' is missing", - errors: [ - { - code: 'CM_MISSING_VALUE', - field: "/data/attributes/messages/0/recipient/contactDetails/name", - message: "`lastName` is missing", - title: "Missing value", - statusCode: 400, - }, - ], - }) - .expect("Content-Type", /json/, done); - }); - it("returns a 400 when lastName contains non-string value in name alternate contact detail is provided", (done) => { request(server) .post("/api/v1/send") @@ -1856,12 +1704,12 @@ describe("/api/v1/send", () => { }, }) .expect(400, { - message: "Invalid recipient contact details. Field 'name': 'lastName' must be a non-empty string", + message: "Invalid recipient contact details. Field 'name': 'lastName' is not a string", errors: [ { code: 'CM_INVALID_VALUE', field: "/data/attributes/messages/0/recipient/contactDetails/name", - message: "'lastName' must be a non-empty string", + message: "'lastName' is not a string", title: "Invalid value", statusCode: 400, }, @@ -1932,10 +1780,10 @@ describe("/api/v1/send", () => { nhsNumber: "1", contactDetails: { address: { - lines: ["1"], + lines: ["1", "2", "3", "4", "5", "6"], postcode: [], }, - email: "invalidEmailAddress", + email: 1234, }, }, }, @@ -1945,20 +1793,20 @@ describe("/api/v1/send", () => { }) .expect(400, { message: - "Invalid recipient contact details. Field 'email': Input failed format check. Field 'address': Too few address lines were provided", + "Invalid recipient contact details. Field 'email': 'email' is not a string. Field 'address': Too many address lines were provided", errors: [ { code: 'CM_INVALID_VALUE', field: "/data/attributes/messages/0/recipient/contactDetails/email", - message: "Input failed format check", + message: "'email' is not a string", title: "Invalid value", statusCode: 400, }, { - code: 'CM_TOO_FEW_ITEMS', + code: 'CM_INVALID_VALUE', field: "/data/attributes/messages/0/recipient/contactDetails/address", - message: "Too few address lines were provided", - title: "Too few items", + message: "Too many address lines were provided", + title: "Invalid value", statusCode: 400, }, ], diff --git a/sandbox/__test__/messages.spec.js b/sandbox/__test__/messages.spec.js index d47d18d0e..ac943f583 100644 --- a/sandbox/__test__/messages.spec.js +++ b/sandbox/__test__/messages.spec.js @@ -681,42 +681,6 @@ describe("/api/v1/messages", () => { .expect("Content-Type", /json/, done); }); - it("returns a 400 when invalid sms alternate contact detail is provided", (done) => { - request(server) - .post("/api/v1/messages") - .set({ Authorization: "allowedContactDetailOverride" }) - .send({ - data: { - type: "Message", - attributes: { - routingPlanId: "b838b13c-f98c-4def-93f0-515d4e4f4ee1", - messageReference: "b5bb84b9-a522-41e9-aa8b-ad1b6a454243", - recipient: { - nhsNumber: "1", - contactDetails: { - sms: "11111111111", - }, - }, - personalisation: {}, - }, - }, - }) - .expect(400, { - message: - "Invalid recipient contact details. Field 'sms': Input failed format check", - errors: [ - { - code: 'CM_INVALID_VALUE', - field: "/data/attributes/recipient/contactDetails/sms", - message: "Input failed format check", - title: "Invalid value", - statusCode: 400, - }, - ], - }) - .expect("Content-Type", /json/, done); - }); - it("returns a 400 when invalid value for sms alternate contact detail is provided", (done) => { request(server) .post("/api/v1/messages") @@ -740,12 +704,12 @@ describe("/api/v1/messages", () => { }, }) .expect(400, { - message: "Invalid recipient contact details. Field 'sms': Input is not a string", + message: "Invalid recipient contact details. Field 'sms': 'sms' is not a string", errors: [ { code: 'CM_INVALID_VALUE', field: "/data/attributes/recipient/contactDetails/sms", - message: "Input is not a string", + message: "'sms' is not a string", title: "Invalid value", statusCode: 400, }, @@ -778,42 +742,6 @@ describe("/api/v1/messages", () => { .expect("Content-Type", /json/, done); }); - it("returns a 400 when invalid email alternate contact detail is provided", (done) => { - request(server) - .post("/api/v1/messages") - .set({ Authorization: "allowedContactDetailOverride" }) - .send({ - data: { - type: "Message", - attributes: { - routingPlanId: "b838b13c-f98c-4def-93f0-515d4e4f4ee1", - messageReference: "b5bb84b9-a522-41e9-aa8b-ad1b6a454243", - recipient: { - nhsNumber: "1", - contactDetails: { - email: "invalidEmailAddress", - }, - }, - personalisation: {}, - }, - }, - }) - .expect(400, { - message: - "Invalid recipient contact details. Field 'email': Input failed format check", - errors: [ - { - code: 'CM_INVALID_VALUE', - field: "/data/attributes/recipient/contactDetails/email", - message: "Input failed format check", - title: "Invalid value", - statusCode: 400, - }, - ], - }) - .expect("Content-Type", /json/, done); - }); - it("returns a 400 when invalid value for email alternate contact detail is provided", (done) => { request(server) .post("/api/v1/messages") @@ -837,12 +765,12 @@ describe("/api/v1/messages", () => { }, }) .expect(400, { - message: "Invalid recipient contact details. Field 'email': Input is not a string", + message: "Invalid recipient contact details. Field 'email': 'email' is not a string", errors: [ { code: 'CM_INVALID_VALUE', field: "/data/attributes/recipient/contactDetails/email", - message: "Input is not a string", + message: "'email' is not a string", title: "Invalid value", statusCode: 400, }, @@ -973,13 +901,13 @@ describe("/api/v1/messages", () => { }) .expect(400, { message: - "Invalid recipient contact details. Field 'address': 'lines' is missing", + "Invalid recipient contact details. Field 'address': 'lines' is not a string array", errors: [ { - code: 'CM_MISSING_VALUE', + code: 'CM_INVALID_VALUE', field: "/data/attributes/recipient/contactDetails/address", - message: "`lines` is missing", - title: "Missing value", + message: "'lines' is not a string array", + title: "Invalid value", statusCode: 400, }, ], @@ -987,7 +915,7 @@ describe("/api/v1/messages", () => { .expect("Content-Type", /json/, done); }); - it("returns a 400 when too few lines is provided in address alternate contact detail is provided", (done) => { + it("returns a 400 when too many lines is provided in address alternate contact detail is provided", (done) => { request(server) .post("/api/v1/messages") .set({ Authorization: "allowedContactDetailOverride" }) @@ -1001,7 +929,7 @@ describe("/api/v1/messages", () => { nhsNumber: "1", contactDetails: { address: { - lines: ["1"], + lines: ["1", "2", "3", "4", "5", "6"], postcode: "hello", }, }, @@ -1011,22 +939,21 @@ describe("/api/v1/messages", () => { }, }) .expect(400, { - message: - "Invalid recipient contact details. Field 'address': Too few address lines were provided", + message: "Invalid recipient contact details. Field 'address': Too many address lines were provided", errors: [ { - code: 'CM_TOO_FEW_ITEMS', + code: 'CM_INVALID_VALUE', field: "/data/attributes/recipient/contactDetails/address", - message: "Too few address lines were provided", - title: "Too few items", + message: "Too many address lines were provided", + title: "Invalid value", statusCode: 400, - } - ] + }, + ], }) .expect("Content-Type", /json/, done); }); - it("returns a 400 when too many lines is provided in address alternate contact detail is provided", (done) => { + it("returns a 400 when lines contains non-string value in address alternate contact detail is provided", (done) => { request(server) .post("/api/v1/messages") .set({ Authorization: "allowedContactDetailOverride" }) @@ -1040,7 +967,7 @@ describe("/api/v1/messages", () => { nhsNumber: "1", contactDetails: { address: { - lines: ["1", "2", "3", "4", "5", "6"], + lines: ["1", "2", 3, "4", "5"], postcode: "hello", }, }, @@ -1050,12 +977,12 @@ describe("/api/v1/messages", () => { }, }) .expect(400, { - message: "Invalid recipient contact details. Field 'address': Too many address lines were provided", + message: "Invalid recipient contact details. Field 'address': 'lines' is not a string array", errors: [ { code: 'CM_INVALID_VALUE', field: "/data/attributes/recipient/contactDetails/address", - message: "Too many address lines were provided", + message: "'lines' is not a string array", title: "Invalid value", statusCode: 400, }, @@ -1064,7 +991,7 @@ describe("/api/v1/messages", () => { .expect("Content-Type", /json/, done); }); - it("returns a 400 when lines contains non-string value in address alternate contact detail is provided", (done) => { + it("returns a 201 when no postcode is provided in address alternate contact detail is provided", (done) => { request(server) .post("/api/v1/messages") .set({ Authorization: "allowedContactDetailOverride" }) @@ -1078,8 +1005,7 @@ describe("/api/v1/messages", () => { nhsNumber: "1", contactDetails: { address: { - lines: ["1", "2", 3, "4", "5"], - postcode: "hello", + lines: ["1", "2"], }, }, }, @@ -1087,22 +1013,11 @@ describe("/api/v1/messages", () => { }, }, }) - .expect(400, { - message: "Invalid recipient contact details. Field 'address': Lines contain non-string or empty line", - errors: [ - { - code: 'CM_INVALID_VALUE', - field: "/data/attributes/recipient/contactDetails/address", - message: "Lines contain non-string or empty line", - title: "Invalid value", - statusCode: 400, - }, - ], - }) + .expect(201) .expect("Content-Type", /json/, done); }); - it("returns a 400 when no postcode is provided in address alternate contact detail is provided", (done) => { + it("returns a 201 when no lines is provided in address alternate contact detail is provided", (done) => { request(server) .post("/api/v1/messages") .set({ Authorization: "allowedContactDetailOverride" }) @@ -1116,7 +1031,7 @@ describe("/api/v1/messages", () => { nhsNumber: "1", contactDetails: { address: { - lines: ["1", "2"], + postcode: "hello", }, }, }, @@ -1124,19 +1039,7 @@ describe("/api/v1/messages", () => { }, }, }) - .expect(400, { - message: - "Invalid recipient contact details. Field 'address': 'postcode' is missing", - errors: [ - { - code: 'CM_MISSING_VALUE', - field: "/data/attributes/recipient/contactDetails/address", - message: "`postcode` is missing", - title: "Missing value", - statusCode: 400, - }, - ], - }) + .expect(201) .expect("Content-Type", /json/, done); }); @@ -1208,32 +1111,6 @@ describe("/api/v1/messages", () => { .expect("Content-Type", /json/, done); }); - it("returns a 201 when only lastName is provided for name alternate contact details", (done) => { - request(server) - .post("/api/v1/messages") - .set({ Authorization: "allowedContactDetailOverride" }) - .send({ - data: { - type: "Message", - attributes: { - routingPlanId: "b838b13c-f98c-4def-93f0-515d4e4f4ee1", - messageReference: "b5bb84b9-a522-41e9-aa8b-ad1b6a454243", - recipient: { - nhsNumber: "1", - contactDetails: { - name: { - lastName: "Smith" - }, - }, - }, - personalisation: {}, - }, - }, - }) - .expect(201) - .expect("Content-Type", /json/, done); - }); - it("returns a 400 when string for name alternate contact detail is provided", (done) => { request(server) .post("/api/v1/messages") @@ -1427,47 +1304,6 @@ describe("/api/v1/messages", () => { .expect("Content-Type", /json/, done); }); - it("returns a 400 when no lastName is provided in name alternate contact detail is provided", (done) => { - request(server) - .post("/api/v1/messages") - .set({ Authorization: "allowedContactDetailOverride" }) - .send({ - data: { - type: "Message", - attributes: { - routingPlanId: "b838b13c-f98c-4def-93f0-515d4e4f4ee1", - messageReference: "b5bb84b9-a522-41e9-aa8b-ad1b6a454243", - recipient: { - nhsNumber: "1", - contactDetails: { - name: { - prefix: "Mr", - firstName: "John", - middleNames: "Little", - suffix: "Jr" - }, - }, - }, - personalisation: {}, - }, - }, - }) - .expect(400, { - message: - "Invalid recipient contact details. Field 'name': 'lastName' is missing", - errors: [ - { - code: 'CM_MISSING_VALUE', - field: "/data/attributes/recipient/contactDetails/name", - message: "`lastName` is missing", - title: "Missing value", - statusCode: 400, - }, - ], - }) - .expect("Content-Type", /json/, done); - }); - it("returns a 400 when lastName contains non-string value in name alternate contact detail is provided", (done) => { request(server) .post("/api/v1/messages") @@ -1495,12 +1331,12 @@ describe("/api/v1/messages", () => { }, }) .expect(400, { - message: "Invalid recipient contact details. Field 'name': 'lastName' must be a non-empty string", + message: "Invalid recipient contact details. Field 'name': 'lastName' is not a string", errors: [ { code: 'CM_INVALID_VALUE', field: "/data/attributes/recipient/contactDetails/name", - message: "'lastName' must be a non-empty string", + message: "'lastName' is not a string", title: "Invalid value", statusCode: 400, }, @@ -1526,7 +1362,7 @@ describe("/api/v1/messages", () => { prefix: "Mr", firstName: "John", middleNames: "Little", - lastName: "", + lastName: 1234, suffix: "Jr" }, }, @@ -1536,12 +1372,12 @@ describe("/api/v1/messages", () => { }, }) .expect(400, { - message: "Invalid recipient contact details. Field 'name': 'lastName' must be a non-empty string", + message: "Invalid recipient contact details. Field 'name': 'lastName' is not a string", errors: [ { code: 'CM_INVALID_VALUE', field: "/data/attributes/recipient/contactDetails/name", - message: "'lastName' must be a non-empty string", + message: "'lastName' is not a string", title: "Invalid value", statusCode: 400, }, @@ -1605,10 +1441,10 @@ describe("/api/v1/messages", () => { nhsNumber: "1", contactDetails: { address: { - lines: ["1"], + lines: ["1", "2", "3", "4", "5", "6"], postcode: [], }, - email: "invalidEmailAddress", + email: 1234, }, }, personalisation: {}, @@ -1617,20 +1453,20 @@ describe("/api/v1/messages", () => { }) .expect(400, { message: - "Invalid recipient contact details. Field 'email': Input failed format check. Field 'address': Too few address lines were provided", + "Invalid recipient contact details. Field 'email': 'email' is not a string. Field 'address': Too many address lines were provided", errors: [ { code: 'CM_INVALID_VALUE', field: "/data/attributes/recipient/contactDetails/email", - message: "Input failed format check", + message: "'email' is not a string", title: "Invalid value", statusCode: 400, }, { - code: 'CM_TOO_FEW_ITEMS', + code: 'CM_INVALID_VALUE', field: "/data/attributes/recipient/contactDetails/address", - message: "Too few address lines were provided", - title: "Too few items", + message: "Too many address lines were provided", + title: "Invalid value", statusCode: 400, }, ], diff --git a/sandbox/handlers/config.js b/sandbox/handlers/config.js index cb3e2f3e5..c30d12cc5 100644 --- a/sandbox/handlers/config.js +++ b/sandbox/handlers/config.js @@ -25,8 +25,6 @@ const validSendingGroupIds = { [globalFreeTextSmsSendingGroupId]: "xoERWoahq12cq8WMXya4yed9hZtZbMxJ" }; -const invalidEmailAddress = "invalidEmailAddress"; - const duplicateTemplates = [ { name: "EMAIL_TEMPLATE", @@ -68,6 +66,5 @@ export { globalFreeTextSmsSendingGroupId, noDefaultOdsClientAuth, noOdsChangeClientAuth, - notAllowedContactDetailOverride, - invalidEmailAddress + notAllowedContactDetailOverride } diff --git a/sandbox/handlers/error_scenarios/override_contact_details.js b/sandbox/handlers/error_scenarios/override_contact_details.js index b9189dc5c..c9cd9f5f5 100644 --- a/sandbox/handlers/error_scenarios/override_contact_details.js +++ b/sandbox/handlers/error_scenarios/override_contact_details.js @@ -1,8 +1,5 @@ import { notAllowedContactDetailOverride } from "../config.js"; -const invalidPhoneNumber = "11111111111"; -const invalidEmailAddress = "invalidEmailAddress"; - function validationSuccess() { return { valid: true, @@ -20,28 +17,16 @@ function smsValidation(sms, path) { if (!sms) { return validationSuccess(); } - if (sms === invalidPhoneNumber) { - return validationFailure([ - { - title: "Invalid value", - code: 'CM_INVALID_VALUE', - field: `${path}/recipient/contactDetails/sms`, - message: "Input failed format check", - statusCode: 400, - }, - `Field 'sms': Input failed format check`, - ]); - } if (typeof sms !== "string") { return validationFailure([ { title: "Invalid value", code: 'CM_INVALID_VALUE', field: `${path}/recipient/contactDetails/sms`, - message: "Input is not a string", + message: "'sms' is not a string", statusCode: 400, }, - `Field 'sms': Input is not a string`, + `Field 'sms': 'sms' is not a string`, ]); } return validationSuccess(); @@ -51,28 +36,16 @@ function emailValidation(email, path) { if (!email) { return validationSuccess(); } - if (email === invalidEmailAddress) { - return validationFailure([ - { - title: "Invalid value", - code: 'CM_INVALID_VALUE', - field: `${path}/recipient/contactDetails/email`, - message: "Input failed format check", - statusCode: 400, - }, - `Field 'email': Input failed format check`, - ]); - } if (typeof email !== "string") { return validationFailure([ { title: "Invalid value", code: 'CM_INVALID_VALUE', field: `${path}/recipient/contactDetails/email`, - message: "Input is not a string", + message: "'email' is not a string", statusCode: 400, }, - `Field 'email': Input is not a string`, + `Field 'email': 'email' is not a string`, ]); } return validationSuccess(); @@ -96,83 +69,48 @@ function addressValidation(address, path) { ]); } - if (!address.lines) { - return validationFailure([ - { - title: "Missing value", - code: 'CM_MISSING_VALUE', - field: `${path}/recipient/contactDetails/address`, - message: "`lines` is missing", - statusCode: 400, - }, - `Field 'address': 'lines' is missing`, - ]); - } - if (!Array.isArray(address.lines)) { - return validationFailure([ - { - title: "Missing value", - code: 'CM_MISSING_VALUE', - field: `${path}/recipient/contactDetails/address`, - message: "`lines` is missing", - statusCode: 400, - }, - `Field 'address': 'lines' is missing`, - ]); - } - - if (address.lines.some((line) => typeof line !== "string")) { - return validationFailure([ - { - title: "Invalid value", - code: 'CM_INVALID_VALUE', - field: `${path}/recipient/contactDetails/address`, - message: "Lines contain non-string or empty line", - statusCode: 400, - }, - `Field 'address': Lines contain non-string or empty line`, - ]); - } + if ("lines" in address) { + if (!Array.isArray(address.lines)) { + return validationFailure([ + { + title: "Invalid value", + code: 'CM_INVALID_VALUE', + field: `${path}/recipient/contactDetails/address`, + message: "'lines' is not a string array", + statusCode: 400, + }, + `Field 'address': 'lines' is not a string array`, + ]); + } - if (address.lines.length < 2) { - return validationFailure([ - { - code: 'CM_TOO_FEW_ITEMS', - title: "Too few items", - field: `${path}/recipient/contactDetails/address`, - message: "Too few address lines were provided", - statusCode: 400, - }, - `Field 'address': Too few address lines were provided`, - ]); - } - if (address.lines.length > 5) { - return validationFailure([ - { - title: "Invalid value", - code: 'CM_INVALID_VALUE', - field: `${path}/recipient/contactDetails/address`, - message: "Too many address lines were provided", - statusCode: 400, - }, - `Field 'address': Too many address lines were provided`, - ]); - } + if (address.lines.some((line) => typeof line !== "string")) { + return validationFailure([ + { + title: "Invalid value", + code: 'CM_INVALID_VALUE', + field: `${path}/recipient/contactDetails/address`, + message: "'lines' is not a string array", + statusCode: 400, + }, + `Field 'address': 'lines' is not a string array`, + ]); + } - if (!address.postcode) { - return validationFailure([ - { - title: "Missing value", - code: 'CM_MISSING_VALUE', - field: `${path}/recipient/contactDetails/address`, - message: "`postcode` is missing", - statusCode: 400, - }, - `Field 'address': 'postcode' is missing`, - ]); + if (address.lines.length > 5) { + return validationFailure([ + { + title: "Invalid value", + code: 'CM_INVALID_VALUE', + field: `${path}/recipient/contactDetails/address`, + message: "Too many address lines were provided", + statusCode: 400, + }, + `Field 'address': Too many address lines were provided`, + ]); + } } - if (typeof address.postcode !== "string") { + if ("postcode" in address && typeof address.postcode !== "string") { return validationFailure([ { title: "Invalid value", @@ -188,7 +126,6 @@ function addressValidation(address, path) { } function nameValidation(name, path) { - if (!name) { return validationSuccess(); } @@ -245,29 +182,16 @@ function nameValidation(name, path) { ]); } - if (typeof name.lastName === "undefined") { - return validationFailure([ - { - title: "Missing value", - code: 'CM_MISSING_VALUE', - field: `${path}/recipient/contactDetails/name`, - message: "`lastName` is missing", - statusCode: 400, - }, - `Field 'name': 'lastName' is missing`, - ]); - } - - if (typeof name.lastName !== "string" || name.lastName.trim() === "") { + if ("lastName" in name && typeof name.lastName !== "string") { return validationFailure([ { title: "Invalid value", code: 'CM_INVALID_VALUE', field: `${path}/recipient/contactDetails/name`, - message: "'lastName' must be a non-empty string", + message: "'lastName' is not a string", statusCode: 400, }, - `Field 'name': 'lastName' must be a non-empty string`, + `Field 'name': 'lastName' is not a string`, ]); } diff --git a/specification/responses/4xx/message_batches/400_UnableToProcessMessageBatch.yaml b/specification/responses/4xx/message_batches/400_UnableToProcessMessageBatch.yaml index 45553bb2b..6b3f02829 100644 --- a/specification/responses/4xx/message_batches/400_UnableToProcessMessageBatch.yaml +++ b/specification/responses/4xx/message_batches/400_UnableToProcessMessageBatch.yaml @@ -44,13 +44,6 @@ description: |+ -d '{"data":{"type":"MessageBatch","attributes":{"routingPlanId":"b838b13c-f98c-4def-93f0-515d4e4f4ee1","messageBatchReference":"346e3fc3-0b55-4c0d-bec9-0cc5aa431836","messages":[{"messageReference":"da0b1495-c7cb-468c-9d81-07dee089d728","recipient":{"nhsNumber":"9990548609","contactDetails":{"sms":"07777000000"}},"personalisation":{}}]}}}' \ https://sandbox.api.service.nhs.uk/comms/v1/message-batches ``` - - Contact detail validation errors can be triggered with the following values. - - | Field | Value | Description | - | ---------- | ----- | ----------- | - | sms | 11111111111 | Returns 'Input failed format check' error with a pointer to sms. | - | email | invalidEmailAddress | Returns 'Input failed format check' error with a pointer to email. | content: application/vnd.api+json: schema: diff --git a/specification/responses/4xx/messages/400_UnableToProcessMessage.yaml b/specification/responses/4xx/messages/400_UnableToProcessMessage.yaml index 65d2dd229..a2562cc3f 100644 --- a/specification/responses/4xx/messages/400_UnableToProcessMessage.yaml +++ b/specification/responses/4xx/messages/400_UnableToProcessMessage.yaml @@ -42,13 +42,6 @@ description: |+ -d '{"data": {"type": "Message","attributes": {"routingPlanId": "b838b13c-f98c-4def-93f0-515d4e4f4ee1","messageReference": "da0b1495-c7cb-468c-9d81-07dee089d728","recipient": {"nhsNumber": "9990548609","contactDetails": {"sms": "07777000000"}},"personalisation": {}}}}' \ https://sandbox.api.service.nhs.uk/comms/v1/messages ``` - - Contact detail validation errors can be triggered with the following values. - - | Field | Value | Description | - | ---------- | ----- | ----------- | - | sms | 11111111111 | Returns 'Input failed format check' error with a pointer to sms. | - | email | invalidEmailAddress | Returns 'Input failed format check' error with a pointer to email. | content: application/vnd.api+json: schema: diff --git a/tests/api/message_batches/field_validation/test_400_invalid_contact_details.py b/tests/api/message_batches/field_validation/test_400_invalid_contact_details.py index d7d1e2811..2b8b8d0f3 100644 --- a/tests/api/message_batches/field_validation/test_400_invalid_contact_details.py +++ b/tests/api/message_batches/field_validation/test_400_invalid_contact_details.py @@ -18,7 +18,7 @@ def test_invalid_sms_contact_details(url, bearer_token): data = Generators.generate_valid_create_message_batch_body("dev") data["data"]["attributes"]["messages"][0]["recipient"] = { "contactDetails": { - "sms": "077009000021" + "sms": 1234 } } @@ -33,7 +33,7 @@ def test_invalid_sms_contact_details(url, bearer_token): 400, Generators.generate_invalid_value_error_custom_detail( "/data/attributes/messages/0/recipient/contactDetails/sms", - "Input failed format check" + "'sms' is not a string" ), None ) @@ -51,7 +51,7 @@ def test_invalid_sms_contact_details_second_message(url, bearer_token): data = Generators.generate_valid_create_message_batch_body("dev") data["data"]["attributes"]["messages"][1]["recipient"] = { "contactDetails": { - "sms": "077009000021" + "sms": 1234 } } @@ -66,7 +66,7 @@ def test_invalid_sms_contact_details_second_message(url, bearer_token): 400, Generators.generate_invalid_value_error_custom_detail( "/data/attributes/messages/1/recipient/contactDetails/sms", - "Input failed format check" + "'sms' is not a string" ), None ) @@ -84,7 +84,7 @@ def test_invalid_email_contact_details(url, bearer_token): data = Generators.generate_valid_create_message_batch_body("dev") data["data"]["attributes"]["messages"][0]["recipient"] = { "contactDetails": { - "email": "invalidEmailAddress" + "email": 1234 } } @@ -99,7 +99,7 @@ def test_invalid_email_contact_details(url, bearer_token): 400, Generators.generate_invalid_value_error_custom_detail( "/data/attributes/messages/0/recipient/contactDetails/email", - "Input failed format check" + "'email' is not a string" ), None ) @@ -117,7 +117,7 @@ def test_invalid_email_contact_details_third_message(url, bearer_token): data = Generators.generate_valid_create_message_batch_body("dev") data["data"]["attributes"]["messages"][2]["recipient"] = { "contactDetails": { - "email": "invalidEmailAddress" + "email": 1234 } } @@ -131,7 +131,7 @@ def test_invalid_email_contact_details_third_message(url, bearer_token): 400, Generators.generate_invalid_value_error_custom_detail( "/data/attributes/messages/2/recipient/contactDetails/email", - "Input failed format check" + "'email' is not a string" ), None ) @@ -141,15 +141,15 @@ def test_invalid_email_contact_details_third_message(url, bearer_token): @pytest.mark.devtest @pytest.mark.inttest @pytest.mark.prodtest -def test_invalid_address_contact_details_too_few_lines(url, bearer_token): +def test_invalid_address_contact_details_too_many_lines(url, bearer_token): """ - .. include:: ../partials/validation/test_invalid_contact_details_address_lines_too_few.rst + .. include:: ../partials/validation/test_invalid_contact_details_address_lines_too_many.rst """ headers = Generators.generate_valid_headers(bearer_token.value) data = Generators.generate_valid_create_message_batch_body("dev") data["data"]["attributes"]["messages"][0]["recipient"]["contactDetails"] = { "address": { - "lines": ["1"], + "lines": ["1", "2", "3", "4", "5", "6"], "postcode": "LS1 6AE" } } @@ -163,9 +163,9 @@ def test_invalid_address_contact_details_too_few_lines(url, bearer_token): Assertions.assert_error_with_optional_correlation_id( resp, 400, - Generators.generate_too_few_items_error_custom_detail( + Generators.generate_invalid_value_error_custom_detail( "/data/attributes/messages/0/recipient/contactDetails/address", - "Too few address lines were provided" + "Too many address lines were provided" ), None ) @@ -175,15 +175,15 @@ def test_invalid_address_contact_details_too_few_lines(url, bearer_token): @pytest.mark.devtest @pytest.mark.inttest @pytest.mark.prodtest -def test_invalid_address_contact_details_too_many_lines(url, bearer_token): +def test_invalid_address_contact_details_lines_not_string_array(url, bearer_token): """ - .. include:: ../partials/validation/test_invalid_contact_details_address_lines_too_many.rst + .. include:: ../partials/validation/test_invalid_contact_details_address_lines.rst """ headers = Generators.generate_valid_headers(bearer_token.value) data = Generators.generate_valid_create_message_batch_body("dev") data["data"]["attributes"]["messages"][0]["recipient"]["contactDetails"] = { "address": { - "lines": ["1", "2", "3", "4", "5", "6"], + "lines": [1, 2, 3], "postcode": "LS1 6AE" } } @@ -199,7 +199,7 @@ def test_invalid_address_contact_details_too_many_lines(url, bearer_token): 400, Generators.generate_invalid_value_error_custom_detail( "/data/attributes/messages/0/recipient/contactDetails/address", - "Too many address lines were provided" + "'lines' is not a string array" ), None ) @@ -209,7 +209,7 @@ def test_invalid_address_contact_details_too_many_lines(url, bearer_token): @pytest.mark.devtest @pytest.mark.inttest @pytest.mark.prodtest -def test_invalid_address_contact_details_postcode(url, bearer_token): +def test_invalid_address_contact_details_postcode_not_string(url, bearer_token): """ .. include:: ../partials/validation/test_invalid_contact_details_address_postcode.rst """ @@ -217,8 +217,8 @@ def test_invalid_address_contact_details_postcode(url, bearer_token): data = Generators.generate_valid_create_message_batch_body("dev") data["data"]["attributes"]["messages"][0]["recipient"]["contactDetails"] = { "address": { - "lines": ["1", "2", "3", "4", "5"], - "postcode": "LS1 6AECD" + "lines": ["1", "2"], + "postcode": [] } } @@ -233,7 +233,7 @@ def test_invalid_address_contact_details_postcode(url, bearer_token): 400, Generators.generate_invalid_value_error_custom_detail( "/data/attributes/messages/0/recipient/contactDetails/address", - "Postcode input failed format check" + "'postcode' is not a string" ), None ) diff --git a/tests/api/single_message/field_validation/test_400_invalid_contact_details.py b/tests/api/single_message/field_validation/test_400_invalid_contact_details.py index a9214d0e9..08b92fbe1 100644 --- a/tests/api/single_message/field_validation/test_400_invalid_contact_details.py +++ b/tests/api/single_message/field_validation/test_400_invalid_contact_details.py @@ -16,7 +16,7 @@ def test_invalid_sms_contact_details(url, bearer_token): """ headers = Generators.generate_valid_headers(bearer_token.value) data = Generators.generate_valid_create_message_body("dev") - data["data"]["attributes"]["recipient"]["contactDetails"] = {"sms": "11111111111"} + data["data"]["attributes"]["recipient"]["contactDetails"] = {"sms": 1234} resp = requests.post( f"{url}{MESSAGES_ENDPOINT}", @@ -29,7 +29,7 @@ def test_invalid_sms_contact_details(url, bearer_token): 400, Generators.generate_invalid_value_error_custom_detail( "/data/attributes/recipient/contactDetails/sms", - "Input failed format check" + "'sms' is not a string" ), None ) @@ -45,7 +45,7 @@ def test_invalid_email_contact_details(url, bearer_token): """ headers = Generators.generate_valid_headers(bearer_token.value) data = Generators.generate_valid_create_message_body("dev") - data["data"]["attributes"]["recipient"]["contactDetails"] = {"email": "invalidEmailAddress"} + data["data"]["attributes"]["recipient"]["contactDetails"] = {"email": 1234} resp = requests.post( f"{url}{MESSAGES_ENDPOINT}", @@ -58,41 +58,7 @@ def test_invalid_email_contact_details(url, bearer_token): 400, Generators.generate_invalid_value_error_custom_detail( "/data/attributes/recipient/contactDetails/email", - "Input failed format check" - ), - None - ) - - -@pytest.mark.test -@pytest.mark.devtest -@pytest.mark.inttest -@pytest.mark.prodtest -def test_invalid_address_contact_details_too_few_lines(url, bearer_token): - """ - .. include :: /partials/validation/test_invalid_contact_details_address_lines_too_few.rst - """ - headers = Generators.generate_valid_headers(bearer_token.value) - data = Generators.generate_valid_create_message_body("dev") - data["data"]["attributes"]["recipient"]["contactDetails"] = { - "address": { - "lines": ["1"], - "postcode": "test" - } - } - - resp = requests.post( - f"{url}{MESSAGES_ENDPOINT}", - headers=headers, - json=data - ) - - Assertions.assert_error_with_optional_correlation_id( - resp, - 400, - Generators.generate_too_few_items_error_custom_detail( - "/data/attributes/recipient/contactDetails/address", - "Too few address lines were provided" + "'email' is not a string" ), None ) @@ -136,16 +102,16 @@ def test_invalid_address_contact_details_too_many_lines(url, bearer_token): @pytest.mark.devtest @pytest.mark.inttest @pytest.mark.prodtest -def test_invalid_address_contact_details_postcode(url, bearer_token): +def test_invalid_address_contact_details_lines_not_string_array(url, bearer_token): """ - .. include :: /partials/validation/test_invalid_contact_details_address_postcode.rst + .. include:: /partials/validation/test_invalid_contact_details_address_lines.rst """ headers = Generators.generate_valid_headers(bearer_token.value) data = Generators.generate_valid_create_message_body("dev") data["data"]["attributes"]["recipient"]["contactDetails"] = { "address": { - "lines": ["1", "2", "3", "4", "5"], - "postcode": "LS1 6AECD" + "lines": [1, 2, 3], + "postcode": "test" } } @@ -160,7 +126,7 @@ def test_invalid_address_contact_details_postcode(url, bearer_token): 400, Generators.generate_invalid_value_error_custom_detail( "/data/attributes/recipient/contactDetails/address", - "Postcode input failed format check" + "'lines' is not a string array" ), None ) diff --git a/tests/docs/partials/validation/test_invalid_contact_details_address_lines.rst b/tests/docs/partials/validation/test_invalid_contact_details_address_lines.rst new file mode 100644 index 000000000..e7a166652 --- /dev/null +++ b/tests/docs/partials/validation/test_invalid_contact_details_address_lines.rst @@ -0,0 +1,22 @@ +Scenario: An API consumer submitting a request with a non-string array address lines receives a 400 'Invalid Value' response +============================================================================================================================ + +A valid address lines contact detail must be structured in this format: { address: { lines: Value } } where Value is a string array + +| **Given** the API consumer provides a message body with a non-string array address lines +| **When** the request is submitted +| **Then** the response returns a 400 invalid value error + +**Asserts** +- Response returns a 400 'Invalid Value' error +- Response returns the expected error message body with references to the invalid attribute + +.. list-table:: + :widths: 50 50 + :header-rows: 1 + + * - Value + - Description + * - [1,2] + - Used to ensure only a string array address lines is accepted + diff --git a/tests/docs/partials/validation/test_invalid_contact_details_address_lines_too_few.rst b/tests/docs/partials/validation/test_invalid_contact_details_address_lines_too_few.rst deleted file mode 100644 index 61132ebd1..000000000 --- a/tests/docs/partials/validation/test_invalid_contact_details_address_lines_too_few.rst +++ /dev/null @@ -1,22 +0,0 @@ -Scenario: An API consumer submitting a request with invalid address lines (too few) receives a 400 'Too few items' response -============================================================================================================================ - -A valid contact detail must be structured in this format: { address: { lines: [ Value1, Value2 ], postcode: value } } - -| **Given** the API consumer provides an message body with with too few address lines -| **When** the request is submitted -| **Then** the response returns a 400 too few items error - -**Asserts** -- Response returns a 400 'Too few items' error -- Response returns the expected error message body with references to the invalid attribute - -.. list-table:: - :widths: 50 50 - :header-rows: 1 - - * - Value - - Description - * - [ "1" ] - - Used to ensure list of less than 2 values is not accepted - diff --git a/tests/docs/partials/validation/test_invalid_contact_details_address_lines_too_many.rst b/tests/docs/partials/validation/test_invalid_contact_details_address_lines_too_many.rst index 3727100ce..126ec7407 100644 --- a/tests/docs/partials/validation/test_invalid_contact_details_address_lines_too_many.rst +++ b/tests/docs/partials/validation/test_invalid_contact_details_address_lines_too_many.rst @@ -1,7 +1,7 @@ Scenario: An API consumer submitting a request with invalid address lines (too many) receives a 400 'Invalid Value' response =============================================================================================================================== -A valid contact detail must be structured in this format: { address: { lines: [ Value1, Value2 ], postcode: value } } +A valid contact detail must be structured in this format: { address: { lines: [ Value1, Value2 ], postcode: Value } } | **Given** the API consumer provides an message body with with too many address lines | **When** the request is submitted diff --git a/tests/docs/partials/validation/test_invalid_contact_details_address_postcode.rst b/tests/docs/partials/validation/test_invalid_contact_details_address_postcode.rst index 051f1b19e..1c05951f0 100644 --- a/tests/docs/partials/validation/test_invalid_contact_details_address_postcode.rst +++ b/tests/docs/partials/validation/test_invalid_contact_details_address_postcode.rst @@ -1,9 +1,9 @@ -Scenario: An API consumer submitting a request with an invalid address postcode receives a 400 'Invalid Value' response -=========================================================================================================================== +Scenario: An API consumer submitting a request with a non-string address postcode receives a 400 'Invalid Value' response +========================================================================================================================= -A valid contact detail must be structured in this format: { sms: value, email: value, address: { lines: [], postcode: value } } +A valid address postcode contact detail must be structured in this format: { address: { postcode: Value } } where Value is a string -| **Given** the API consumer provides an message body with an invalid postcode +| **Given** the API consumer provides a message body with a non-string address postcode | **When** the request is submitted | **Then** the response returns a 400 invalid value error @@ -17,6 +17,6 @@ A valid contact detail must be structured in this format: { sms: value, email: v * - Value - Description - * - LS1 6AECD - - Used to ensure only valid postcode is accepted + * - [] + - Used to ensure only a string address postcode is accepted diff --git a/tests/docs/partials/validation/test_invalid_contact_details_email.rst b/tests/docs/partials/validation/test_invalid_contact_details_email.rst index a2cf7e596..6eff865a0 100644 --- a/tests/docs/partials/validation/test_invalid_contact_details_email.rst +++ b/tests/docs/partials/validation/test_invalid_contact_details_email.rst @@ -1,9 +1,9 @@ -Scenario: An API consumer submitting a request with an invalid email receives a 400 'Invalid Value' response +Scenario: An API consumer submitting a request with a non-string email address receives a 400 'Invalid Value' response ====================================================================================================================== -A valid contact detail must be structured in this format: { email: Value } +A valid email contact detail must be structured in this format: { email: Value } where Value is a string -| **Given** the API consumer provides an message body with an invalid email address +| **Given** the API consumer provides a message body with a non-string email address | **When** the request is submitted | **Then** the response returns a 400 invalid value error @@ -17,6 +17,6 @@ A valid contact detail must be structured in this format: { email: Value } * - Value - Description - * - invalidEmailAddress - - Used to ensure invalid email address is not accepted + * - [] + - Used to ensure only a string email address is accepted diff --git a/tests/docs/partials/validation/test_invalid_contact_details_sms.rst b/tests/docs/partials/validation/test_invalid_contact_details_sms.rst index 0c52652f8..2c62f53d3 100644 --- a/tests/docs/partials/validation/test_invalid_contact_details_sms.rst +++ b/tests/docs/partials/validation/test_invalid_contact_details_sms.rst @@ -1,9 +1,9 @@ -Scenario: An API consumer submitting a request with an invalid sms receives a 400 'Invalid Value' response -====================================================================================================================== +Scenario: An API consumer submitting a request with a non-string sms receives a 400 'Invalid Value' response +============================================================================================================ -A valid sms contact detail must be structured in this format: { sms: value } +A valid sms contact detail must be structured in this format: { sms: Value } where Value is a string -| **Given** the API consumer provides an message body with an invalid sms +| **Given** the API consumer provides a message body with a non-string sms | **When** the request is submitted | **Then** the response returns a 400 invalid value error @@ -17,6 +17,6 @@ A valid sms contact detail must be structured in this format: { sms: value } * - Value - Description - * - 077009000021 - - Used to ensure invalid phone number is not accepted + * - [] + - Used to ensure only a string phone number is accepted diff --git a/tests/docs/partials/validation/test_invalid_personalisation.rst b/tests/docs/partials/validation/test_invalid_personalisation.rst index c40050bac..ecff04908 100644 --- a/tests/docs/partials/validation/test_invalid_personalisation.rst +++ b/tests/docs/partials/validation/test_invalid_personalisation.rst @@ -1,14 +1,14 @@ -Scenario: An API consumer submitting a request with an invalid personalisation receives a 400 'Invalid value' response +Scenario: An API consumer submitting a request with an invalid personalisation receives a 400 'Invalid Value' response ====================================================================================================================== -A valid personalisation must be structured in this format: { parameter: value } +A valid personalisation must be structured in this format: { parameter: Value } | **Given** the API consumer provides a message body with an invalid personalisation | **When** the request is submitted | **Then** the response returns a 400 invalid value error **Asserts** -- Response returns a 400 'Invalid value' error +- Response returns a 400 'Invalid Value' error - Response returns the expected error message body with references to the invalid attribute .. list-table:: diff --git a/tests/lib/constants/constants.py b/tests/lib/constants/constants.py index 021189639..1ad914d0b 100644 --- a/tests/lib/constants/constants.py +++ b/tests/lib/constants/constants.py @@ -109,14 +109,6 @@ def __init__(self, code, status, title, detail, links={}): "The property at the specified location is required, but was not present in the request." ) -# too few address lines -ERROR_TOO_FEW_ADDRESS_LINES = Error( - "CM_MISSING_VALUE", - "400", - "Missing value", - "Too few address lines were provided" -) - # null value constants ERROR_NULL_VALUE = Error( "CM_NULL_VALUE", diff --git a/tests/sandbox/message_batches/create_message_batches/test_field_validation.py b/tests/sandbox/message_batches/create_message_batches/test_field_validation.py index a51e1235e..51e83b006 100644 --- a/tests/sandbox/message_batches/create_message_batches/test_field_validation.py +++ b/tests/sandbox/message_batches/create_message_batches/test_field_validation.py @@ -554,7 +554,7 @@ def test_invalid_sms_contact_details(nhsd_apim_proxy_url, correlation_id): "recipient": { "nhsNumber": "9990548609", "contactDetails": { - "sms": "11111111111" + "sms": 1234 } }, } @@ -568,7 +568,7 @@ def test_invalid_sms_contact_details(nhsd_apim_proxy_url, correlation_id): 400, Generators.generate_invalid_value_error_custom_detail( "/data/attributes/messages/0/recipient/contactDetails/sms", - "Input failed format check" + "'sms' is not a string" ), correlation_id ) @@ -595,7 +595,7 @@ def test_invalid_email_contact_details(nhsd_apim_proxy_url, correlation_id): "recipient": { "nhsNumber": "9990548609", "contactDetails": { - "email": "invalidEmailAddress" + "email": 1234 } }, } @@ -609,7 +609,7 @@ def test_invalid_email_contact_details(nhsd_apim_proxy_url, correlation_id): 400, Generators.generate_invalid_value_error_custom_detail( "/data/attributes/messages/0/recipient/contactDetails/email", - "Input failed format check" + "'email' is not a string" ), correlation_id ) @@ -617,9 +617,9 @@ def test_invalid_email_contact_details(nhsd_apim_proxy_url, correlation_id): @pytest.mark.sandboxtest @pytest.mark.parametrize("correlation_id", constants.CORRELATION_ID) -def test_invalid_address_contact_details_too_few_lines(nhsd_apim_proxy_url, correlation_id): +def test_invalid_address_contact_details_too_many_lines(nhsd_apim_proxy_url, correlation_id): """ - .. include:: ../../partials/validation/test_invalid_contact_details_address_lines_too_few.rst + .. include:: ../../partials/validation/test_invalid_contact_details_address_lines_too_many.rst """ resp = requests.post(f"{nhsd_apim_proxy_url}{MESSAGE_BATCHES_ENDPOINT}", headers={ **headers, @@ -638,7 +638,12 @@ def test_invalid_address_contact_details_too_few_lines(nhsd_apim_proxy_url, corr "contactDetails": { "address": { "lines": [ - "1" + "1", + "2", + "3", + "4", + "5", + "6" ], "postcode": "test" } @@ -653,9 +658,9 @@ def test_invalid_address_contact_details_too_few_lines(nhsd_apim_proxy_url, corr Assertions.assert_error_with_optional_correlation_id( resp, 400, - Generators.generate_too_few_items_error_custom_detail( + Generators.generate_invalid_value_error_custom_detail( "/data/attributes/messages/0/recipient/contactDetails/address", - "Too few address lines were provided" + "Too many address lines were provided" ), correlation_id ) @@ -663,9 +668,9 @@ def test_invalid_address_contact_details_too_few_lines(nhsd_apim_proxy_url, corr @pytest.mark.sandboxtest @pytest.mark.parametrize("correlation_id", constants.CORRELATION_ID) -def test_invalid_address_contact_details_too_many_lines(nhsd_apim_proxy_url, correlation_id): +def test_invalid_address_contact_details_lines_not_string_array(nhsd_apim_proxy_url, correlation_id): """ - .. include:: ../../partials/validation/test_invalid_contact_details_address_lines_too_many.rst + .. include:: ../../partials/validation/test_invalid_contact_details_address_lines.rst """ resp = requests.post(f"{nhsd_apim_proxy_url}{MESSAGE_BATCHES_ENDPOINT}", headers={ **headers, @@ -683,14 +688,7 @@ def test_invalid_address_contact_details_too_many_lines(nhsd_apim_proxy_url, cor "nhsNumber": "9990548609", "contactDetails": { "address": { - "lines": [ - "1", - "2", - "3", - "4", - "5", - "6" - ], + "lines": [1, 2, 3], "postcode": "test" } } @@ -706,7 +704,7 @@ def test_invalid_address_contact_details_too_many_lines(nhsd_apim_proxy_url, cor 400, Generators.generate_invalid_value_error_custom_detail( "/data/attributes/messages/0/recipient/contactDetails/address", - "Too many address lines were provided" + "'lines' is not a string array" ), correlation_id ) diff --git a/tests/sandbox/messages/create_messages/test_field_validation.py b/tests/sandbox/messages/create_messages/test_field_validation.py index 811fd20e3..707d83f6f 100644 --- a/tests/sandbox/messages/create_messages/test_field_validation.py +++ b/tests/sandbox/messages/create_messages/test_field_validation.py @@ -334,7 +334,7 @@ def test_invalid_sms_contact_details(nhsd_apim_proxy_url, correlation_id): "recipient": { "nhsNumber": "9990548609", "contactDetails": { - "sms": "11111111111" + "sms": 1234 } }, } @@ -346,7 +346,7 @@ def test_invalid_sms_contact_details(nhsd_apim_proxy_url, correlation_id): 400, Generators.generate_invalid_value_error_custom_detail( "/data/attributes/recipient/contactDetails/sms", - "Input failed format check" + "'sms' is not a string" ), correlation_id ) @@ -370,7 +370,7 @@ def test_invalid_email_contact_details(nhsd_apim_proxy_url, correlation_id): "recipient": { "nhsNumber": "9990548609", "contactDetails": { - "email": "invalidEmailAddress" + "email": 1234 } }, } @@ -382,7 +382,7 @@ def test_invalid_email_contact_details(nhsd_apim_proxy_url, correlation_id): 400, Generators.generate_invalid_value_error_custom_detail( "/data/attributes/recipient/contactDetails/email", - "Input failed format check" + "'email' is not a string" ), correlation_id ) @@ -390,9 +390,9 @@ def test_invalid_email_contact_details(nhsd_apim_proxy_url, correlation_id): @pytest.mark.sandboxtest @pytest.mark.parametrize("correlation_id", constants.CORRELATION_ID) -def test_invalid_address_contact_details_too_few_lines(nhsd_apim_proxy_url, correlation_id): +def test_invalid_address_contact_details_too_many_lines(nhsd_apim_proxy_url, correlation_id): """ - .. include:: ../../partials/validation/test_invalid_contact_details_address_lines_too_few.rst + .. include:: ../../partials/validation/test_invalid_contact_details_address_lines_too_many.rst """ resp = requests.post(f"{nhsd_apim_proxy_url}{MESSAGES_ENDPOINT}", headers={ **headers, @@ -408,7 +408,12 @@ def test_invalid_address_contact_details_too_few_lines(nhsd_apim_proxy_url, corr "contactDetails": { "address": { "lines": [ - "1" + "1", + "2", + "3", + "4", + "5", + "6" ], "postcode": "test" } @@ -421,9 +426,9 @@ def test_invalid_address_contact_details_too_few_lines(nhsd_apim_proxy_url, corr Assertions.assert_error_with_optional_correlation_id( resp, 400, - Generators.generate_too_few_items_error_custom_detail( + Generators.generate_invalid_value_error_custom_detail( "/data/attributes/recipient/contactDetails/address", - "Too few address lines were provided" + "Too many address lines were provided" ), correlation_id ) @@ -431,9 +436,9 @@ def test_invalid_address_contact_details_too_few_lines(nhsd_apim_proxy_url, corr @pytest.mark.sandboxtest @pytest.mark.parametrize("correlation_id", constants.CORRELATION_ID) -def test_invalid_address_contact_details_too_many_lines(nhsd_apim_proxy_url, correlation_id): +def test_invalid_address_contact_details_lines_not_string_array(nhsd_apim_proxy_url, correlation_id): """ - .. include:: ../../partials/validation/test_invalid_contact_details_address_lines_too_many.rst + .. include:: ../../partials/validation/test_invalid_contact_details_address_lines.rst """ resp = requests.post(f"{nhsd_apim_proxy_url}{MESSAGES_ENDPOINT}", headers={ **headers, @@ -448,14 +453,7 @@ def test_invalid_address_contact_details_too_many_lines(nhsd_apim_proxy_url, cor "nhsNumber": "9990548609", "contactDetails": { "address": { - "lines": [ - "1", - "2", - "3", - "4", - "5", - "6" - ], + "lines": [1, 2, 3], "postcode": "test" } } @@ -469,7 +467,7 @@ def test_invalid_address_contact_details_too_many_lines(nhsd_apim_proxy_url, cor 400, Generators.generate_invalid_value_error_custom_detail( "/data/attributes/recipient/contactDetails/address", - "Too many address lines were provided" + "'lines' is not a string array" ), correlation_id ) From e6fad721dd80813913c59eea3fa57e6aede110c2 Mon Sep 17 00:00:00 2001 From: Alex Nuttall Date: Thu, 5 Jun 2025 10:17:24 +0100 Subject: [PATCH 4/4] +minor