-
-
-
 }})
-
-
-
- Contact us
- To learn more about becoming a partner!
-
-
+ class="grid-container usa-section usa-section__home usa-prose grid-container padding-bottom-10">
+
+
diff --git a/gulpfile.js b/gulpfile.js
index e1bf8ba5c..f6389f3c9 100644
--- a/gulpfile.js
+++ b/gulpfile.js
@@ -82,7 +82,7 @@ const javascripts = () => {
paths.src + 'javascripts/totalMessagesChart.js',
paths.src + 'javascripts/activityChart.js',
paths.src + 'javascripts/sidenav.js',
-
+ paths.src + 'javascripts/validation.js',
])
.pipe(plugins.prettyerror())
.pipe(
diff --git a/notifications_utils/request_helper.py b/notifications_utils/request_helper.py
index 5c3317744..dfc4c0c70 100644
--- a/notifications_utils/request_helper.py
+++ b/notifications_utils/request_helper.py
@@ -75,11 +75,13 @@ class ResponseHeaderMiddleware(object):
if SPAN_ID_HEADER.lower() not in lower_existing_header_names:
headers.append((SPAN_ID_HEADER, str(req.span_id)))
- # Some dynamic scan findings
- headers.append(("Cross-Origin-Opener-Policy", "same-origin"))
- headers.append(("Cross-Origin-Embedder-Policy", "require-corp"))
- headers.append(("Cross-Origin-Resource-Policy", "same-origin"))
- headers.append(("Cross-Origin-Opener-Policy", "same-origin"))
+ # Set COOP once (needed for security)
+ if "cross-origin-opener-policy" not in lower_existing_header_names:
+ headers.append(("Cross-Origin-Opener-Policy", "same-origin"))
+
+ # Ensure `Cross-Origin-Resource-Policy: cross-origin` is set
+ if "cross-origin-resource-policy" not in lower_existing_header_names:
+ headers.append(("Cross-Origin-Resource-Policy", "cross-origin"))
# svg content type should not contain charset
found_svg = False
diff --git a/package-lock.json b/package-lock.json
index 448ffe299..833ac49cb 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -10,9 +10,9 @@
"license": "CC0",
"dependencies": {
"@rollup/plugin-commonjs": "^28.0.3",
- "@rollup/plugin-node-resolve": "^16.0.0",
+ "@rollup/plugin-node-resolve": "^16.0.1",
"@rollup/stream": "^3.0.1",
- "@uswds/uswds": "^3.11.0",
+ "@uswds/uswds": "^3.12.0",
"cbor-js": "0.1.0",
"d3": "^7.9.0",
"govuk_frontend_toolkit": "^9.0.1",
@@ -21,17 +21,17 @@
"hogan": "1.0.2",
"jquery": "3.7.1",
"morphdom": "^2.7.4",
- "playwright": "^1.51.0",
+ "playwright": "^1.51.1",
"python": "^0.0.4",
"query-command-supported": "1.0.0",
- "sass-embedded": "^1.85.1",
+ "sass-embedded": "^1.86.0",
"textarea-caret": "3.1.0",
"timeago": "1.6.7",
"vinyl-buffer": "^1.0.1",
"vinyl-source-stream": "^2.0.0"
},
"devDependencies": {
- "@babel/core": "^7.26.9",
+ "@babel/core": "^7.26.10",
"@babel/preset-env": "^7.26.9",
"@uswds/compile": "^1.2.1",
"backstopjs": "^6.3.25",
@@ -50,7 +50,7 @@
"jest-environment-jsdom": "^29.2.2",
"jshint": "2.13.6",
"jshint-stylish": "2.2.1",
- "rollup": "^4.34.9",
+ "rollup": "^4.36.0",
"rollup-plugin-commonjs": "10.1.0",
"rollup-plugin-node-resolve": "5.2.0"
},
@@ -97,22 +97,22 @@
}
},
"node_modules/@babel/core": {
- "version": "7.26.9",
- "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.9.tgz",
- "integrity": "sha512-lWBYIrF7qK5+GjY5Uy+/hEgp8OJWOD/rpy74GplYRhEauvbHDeFB8t5hPOZxCZ0Oxf4Cc36tK51/l3ymJysrKw==",
+ "version": "7.26.10",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.10.tgz",
+ "integrity": "sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@ampproject/remapping": "^2.2.0",
"@babel/code-frame": "^7.26.2",
- "@babel/generator": "^7.26.9",
+ "@babel/generator": "^7.26.10",
"@babel/helper-compilation-targets": "^7.26.5",
"@babel/helper-module-transforms": "^7.26.0",
- "@babel/helpers": "^7.26.9",
- "@babel/parser": "^7.26.9",
+ "@babel/helpers": "^7.26.10",
+ "@babel/parser": "^7.26.10",
"@babel/template": "^7.26.9",
- "@babel/traverse": "^7.26.9",
- "@babel/types": "^7.26.9",
+ "@babel/traverse": "^7.26.10",
+ "@babel/types": "^7.26.10",
"convert-source-map": "^2.0.0",
"debug": "^4.1.0",
"gensync": "^1.0.0-beta.2",
@@ -128,14 +128,14 @@
}
},
"node_modules/@babel/generator": {
- "version": "7.26.9",
- "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.9.tgz",
- "integrity": "sha512-kEWdzjOAUMW4hAyrzJ0ZaTOu9OmpyDIQicIh0zg0EEcEkYXZb2TjtBhnHi2ViX7PKwZqF4xwqfAm299/QMP3lg==",
+ "version": "7.26.10",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.10.tgz",
+ "integrity": "sha512-rRHT8siFIXQrAYOYqZQVsAr8vJ+cBNqcVAY6m5V8/4QqzaPl+zDBe6cLEPRDuNOUf3ww8RfJVlOyQMoSI+5Ang==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/parser": "^7.26.9",
- "@babel/types": "^7.26.9",
+ "@babel/parser": "^7.26.10",
+ "@babel/types": "^7.26.10",
"@jridgewell/gen-mapping": "^0.3.5",
"@jridgewell/trace-mapping": "^0.3.25",
"jsesc": "^3.0.2"
@@ -382,27 +382,27 @@
}
},
"node_modules/@babel/helpers": {
- "version": "7.26.9",
- "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.9.tgz",
- "integrity": "sha512-Mz/4+y8udxBKdmzt/UjPACs4G3j5SshJJEFFKxlCGPydG4JAHXxjWjAwjd09tf6oINvl1VfMJo+nB7H2YKQ0dA==",
+ "version": "7.26.10",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.10.tgz",
+ "integrity": "sha512-UPYc3SauzZ3JGgj87GgZ89JVdC5dj0AoetR5Bw6wj4niittNyFh6+eOGonYvJ1ao6B8lEa3Q3klS7ADZ53bc5g==",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/template": "^7.26.9",
- "@babel/types": "^7.26.9"
+ "@babel/types": "^7.26.10"
},
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/@babel/parser": {
- "version": "7.26.9",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.9.tgz",
- "integrity": "sha512-81NWa1njQblgZbQHxWHpxxCzNsa3ZwvFqpUg7P+NNUU6f3UU2jBEg4OlF/J6rl8+PQGh1q6/zWScd001YwcA5A==",
+ "version": "7.26.10",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.10.tgz",
+ "integrity": "sha512-6aQR2zGE/QFi8JpDLjUZEPYOs7+mhKXm86VaKFiLP35JQwQb6bwUE+XbvkH0EptsYhbNBSUGaUBLKqxH1xSgsA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/types": "^7.26.9"
+ "@babel/types": "^7.26.10"
},
"bin": {
"parser": "bin/babel-parser.js"
@@ -1692,17 +1692,17 @@
}
},
"node_modules/@babel/traverse": {
- "version": "7.26.9",
- "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.9.tgz",
- "integrity": "sha512-ZYW7L+pL8ahU5fXmNbPF+iZFHCv5scFak7MZ9bwaRPLUhHh7QQEMjZUg0HevihoqCM5iSYHN61EyCoZvqC+bxg==",
+ "version": "7.26.10",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.10.tgz",
+ "integrity": "sha512-k8NuDrxr0WrPH5Aupqb2LCVURP/S0vBEn5mK6iH+GIYob66U5EtoZvcdudR2jQ4cmTwhEwW1DLB+Yyas9zjF6A==",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/code-frame": "^7.26.2",
- "@babel/generator": "^7.26.9",
- "@babel/parser": "^7.26.9",
+ "@babel/generator": "^7.26.10",
+ "@babel/parser": "^7.26.10",
"@babel/template": "^7.26.9",
- "@babel/types": "^7.26.9",
+ "@babel/types": "^7.26.10",
"debug": "^4.3.1",
"globals": "^11.1.0"
},
@@ -1711,9 +1711,9 @@
}
},
"node_modules/@babel/types": {
- "version": "7.26.9",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.9.tgz",
- "integrity": "sha512-Y3IR1cRnOxOCDvMmNiym7XpXQ93iGDDPHx+Zj+NM+rg0fBaShfQLkg+hKPaZCEvg5N/LeCo4+Rj/i3FuJsIQaw==",
+ "version": "7.26.10",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.10.tgz",
+ "integrity": "sha512-emqcG3vHrpxUKTrxcblR36dcrcoRDvKmnL/dCL6ZsHaShW80qxCAcNhzQZrpeM765VzEos+xOi4s+r4IXzTwdQ==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -2273,9 +2273,10 @@
}
},
"node_modules/@rollup/plugin-node-resolve": {
- "version": "16.0.0",
- "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-16.0.0.tgz",
- "integrity": "sha512-0FPvAeVUT/zdWoO0jnb/V5BlBsUSNfkIOtFHzMO4H9MOklrmQFY6FduVHKucNb/aTFxvnGhj4MNj/T1oNdDfNg==",
+ "version": "16.0.1",
+ "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-16.0.1.tgz",
+ "integrity": "sha512-tk5YCxJWIG81umIvNkSod2qK5KyQW19qcBF/B78n1bjtOON6gzKoVeSzAE8yHCZEDmqkHKkxplExA8KzdJLJpA==",
+ "license": "MIT",
"dependencies": {
"@rollup/pluginutils": "^5.0.1",
"@types/resolve": "1.20.2",
@@ -2341,9 +2342,9 @@
}
},
"node_modules/@rollup/rollup-android-arm-eabi": {
- "version": "4.34.9",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.34.9.tgz",
- "integrity": "sha512-qZdlImWXur0CFakn2BJ2znJOdqYZKiedEPEVNTBrpfPjc/YuTGcaYZcdmNFTkUj3DU0ZM/AElcM8Ybww3xVLzA==",
+ "version": "4.36.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.36.0.tgz",
+ "integrity": "sha512-jgrXjjcEwN6XpZXL0HUeOVGfjXhPyxAbbhD0BlXUB+abTOpbPiN5Wb3kOT7yb+uEtATNYF5x5gIfwutmuBA26w==",
"cpu": [
"arm"
],
@@ -2354,9 +2355,9 @@
]
},
"node_modules/@rollup/rollup-android-arm64": {
- "version": "4.34.9",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.34.9.tgz",
- "integrity": "sha512-4KW7P53h6HtJf5Y608T1ISKvNIYLWRKMvfnG0c44M6In4DQVU58HZFEVhWINDZKp7FZps98G3gxwC1sb0wXUUg==",
+ "version": "4.36.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.36.0.tgz",
+ "integrity": "sha512-NyfuLvdPdNUfUNeYKUwPwKsE5SXa2J6bCt2LdB/N+AxShnkpiczi3tcLJrm5mA+eqpy0HmaIY9F6XCa32N5yzg==",
"cpu": [
"arm64"
],
@@ -2367,9 +2368,9 @@
]
},
"node_modules/@rollup/rollup-darwin-arm64": {
- "version": "4.34.9",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.34.9.tgz",
- "integrity": "sha512-0CY3/K54slrzLDjOA7TOjN1NuLKERBgk9nY5V34mhmuu673YNb+7ghaDUs6N0ujXR7fz5XaS5Aa6d2TNxZd0OQ==",
+ "version": "4.36.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.36.0.tgz",
+ "integrity": "sha512-JQ1Jk5G4bGrD4pWJQzWsD8I1n1mgPXq33+/vP4sk8j/z/C2siRuxZtaUA7yMTf71TCZTZl/4e1bfzwUmFb3+rw==",
"cpu": [
"arm64"
],
@@ -2380,9 +2381,9 @@
]
},
"node_modules/@rollup/rollup-darwin-x64": {
- "version": "4.34.9",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.34.9.tgz",
- "integrity": "sha512-eOojSEAi/acnsJVYRxnMkPFqcxSMFfrw7r2iD9Q32SGkb/Q9FpUY1UlAu1DH9T7j++gZ0lHjnm4OyH2vCI7l7Q==",
+ "version": "4.36.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.36.0.tgz",
+ "integrity": "sha512-6c6wMZa1lrtiRsbDziCmjE53YbTkxMYhhnWnSW8R/yqsM7a6mSJ3uAVT0t8Y/DGt7gxUWYuFM4bwWk9XCJrFKA==",
"cpu": [
"x64"
],
@@ -2393,9 +2394,9 @@
]
},
"node_modules/@rollup/rollup-freebsd-arm64": {
- "version": "4.34.9",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.34.9.tgz",
- "integrity": "sha512-2lzjQPJbN5UnHm7bHIUKFMulGTQwdvOkouJDpPysJS+QFBGDJqcfh+CxxtG23Ik/9tEvnebQiylYoazFMAgrYw==",
+ "version": "4.36.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.36.0.tgz",
+ "integrity": "sha512-KXVsijKeJXOl8QzXTsA+sHVDsFOmMCdBRgFmBb+mfEb/7geR7+C8ypAml4fquUt14ZyVXaw2o1FWhqAfOvA4sg==",
"cpu": [
"arm64"
],
@@ -2406,9 +2407,9 @@
]
},
"node_modules/@rollup/rollup-freebsd-x64": {
- "version": "4.34.9",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.34.9.tgz",
- "integrity": "sha512-SLl0hi2Ah2H7xQYd6Qaiu01kFPzQ+hqvdYSoOtHYg/zCIFs6t8sV95kaoqjzjFwuYQLtOI0RZre/Ke0nPaQV+g==",
+ "version": "4.36.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.36.0.tgz",
+ "integrity": "sha512-dVeWq1ebbvByI+ndz4IJcD4a09RJgRYmLccwlQ8bPd4olz3Y213uf1iwvc7ZaxNn2ab7bjc08PrtBgMu6nb4pQ==",
"cpu": [
"x64"
],
@@ -2419,9 +2420,9 @@
]
},
"node_modules/@rollup/rollup-linux-arm-gnueabihf": {
- "version": "4.34.9",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.34.9.tgz",
- "integrity": "sha512-88I+D3TeKItrw+Y/2ud4Tw0+3CxQ2kLgu3QvrogZ0OfkmX/DEppehus7L3TS2Q4lpB+hYyxhkQiYPJ6Mf5/dPg==",
+ "version": "4.36.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.36.0.tgz",
+ "integrity": "sha512-bvXVU42mOVcF4le6XSjscdXjqx8okv4n5vmwgzcmtvFdifQ5U4dXFYaCB87namDRKlUL9ybVtLQ9ztnawaSzvg==",
"cpu": [
"arm"
],
@@ -2432,9 +2433,9 @@
]
},
"node_modules/@rollup/rollup-linux-arm-musleabihf": {
- "version": "4.34.9",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.34.9.tgz",
- "integrity": "sha512-3qyfWljSFHi9zH0KgtEPG4cBXHDFhwD8kwg6xLfHQ0IWuH9crp005GfoUUh/6w9/FWGBwEHg3lxK1iHRN1MFlA==",
+ "version": "4.36.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.36.0.tgz",
+ "integrity": "sha512-JFIQrDJYrxOnyDQGYkqnNBtjDwTgbasdbUiQvcU8JmGDfValfH1lNpng+4FWlhaVIR4KPkeddYjsVVbmJYvDcg==",
"cpu": [
"arm"
],
@@ -2445,9 +2446,9 @@
]
},
"node_modules/@rollup/rollup-linux-arm64-gnu": {
- "version": "4.34.9",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.34.9.tgz",
- "integrity": "sha512-6TZjPHjKZUQKmVKMUowF3ewHxctrRR09eYyvT5eFv8w/fXarEra83A2mHTVJLA5xU91aCNOUnM+DWFMSbQ0Nxw==",
+ "version": "4.36.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.36.0.tgz",
+ "integrity": "sha512-KqjYVh3oM1bj//5X7k79PSCZ6CvaVzb7Qs7VMWS+SlWB5M8p3FqufLP9VNp4CazJ0CsPDLwVD9r3vX7Ci4J56A==",
"cpu": [
"arm64"
],
@@ -2458,9 +2459,9 @@
]
},
"node_modules/@rollup/rollup-linux-arm64-musl": {
- "version": "4.34.9",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.34.9.tgz",
- "integrity": "sha512-LD2fytxZJZ6xzOKnMbIpgzFOuIKlxVOpiMAXawsAZ2mHBPEYOnLRK5TTEsID6z4eM23DuO88X0Tq1mErHMVq0A==",
+ "version": "4.36.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.36.0.tgz",
+ "integrity": "sha512-QiGnhScND+mAAtfHqeT+cB1S9yFnNQ/EwCg5yE3MzoaZZnIV0RV9O5alJAoJKX/sBONVKeZdMfO8QSaWEygMhw==",
"cpu": [
"arm64"
],
@@ -2471,9 +2472,9 @@
]
},
"node_modules/@rollup/rollup-linux-loongarch64-gnu": {
- "version": "4.34.9",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.34.9.tgz",
- "integrity": "sha512-dRAgTfDsn0TE0HI6cmo13hemKpVHOEyeciGtvlBTkpx/F65kTvShtY/EVyZEIfxFkV5JJTuQ9tP5HGBS0hfxIg==",
+ "version": "4.36.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.36.0.tgz",
+ "integrity": "sha512-1ZPyEDWF8phd4FQtTzMh8FQwqzvIjLsl6/84gzUxnMNFBtExBtpL51H67mV9xipuxl1AEAerRBgBwFNpkw8+Lg==",
"cpu": [
"loong64"
],
@@ -2484,9 +2485,9 @@
]
},
"node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
- "version": "4.34.9",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.34.9.tgz",
- "integrity": "sha512-PHcNOAEhkoMSQtMf+rJofwisZqaU8iQ8EaSps58f5HYll9EAY5BSErCZ8qBDMVbq88h4UxaNPlbrKqfWP8RfJA==",
+ "version": "4.36.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.36.0.tgz",
+ "integrity": "sha512-VMPMEIUpPFKpPI9GZMhJrtu8rxnp6mJR3ZzQPykq4xc2GmdHj3Q4cA+7avMyegXy4n1v+Qynr9fR88BmyO74tg==",
"cpu": [
"ppc64"
],
@@ -2497,9 +2498,9 @@
]
},
"node_modules/@rollup/rollup-linux-riscv64-gnu": {
- "version": "4.34.9",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.34.9.tgz",
- "integrity": "sha512-Z2i0Uy5G96KBYKjeQFKbbsB54xFOL5/y1P5wNBsbXB8yE+At3oh0DVMjQVzCJRJSfReiB2tX8T6HUFZ2k8iaKg==",
+ "version": "4.36.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.36.0.tgz",
+ "integrity": "sha512-ttE6ayb/kHwNRJGYLpuAvB7SMtOeQnVXEIpMtAvx3kepFQeowVED0n1K9nAdraHUPJ5hydEMxBpIR7o4nrm8uA==",
"cpu": [
"riscv64"
],
@@ -2510,9 +2511,9 @@
]
},
"node_modules/@rollup/rollup-linux-s390x-gnu": {
- "version": "4.34.9",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.34.9.tgz",
- "integrity": "sha512-U+5SwTMoeYXoDzJX5dhDTxRltSrIax8KWwfaaYcynuJw8mT33W7oOgz0a+AaXtGuvhzTr2tVKh5UO8GVANTxyQ==",
+ "version": "4.36.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.36.0.tgz",
+ "integrity": "sha512-4a5gf2jpS0AIe7uBjxDeUMNcFmaRTbNv7NxI5xOCs4lhzsVyGR/0qBXduPnoWf6dGC365saTiwag8hP1imTgag==",
"cpu": [
"s390x"
],
@@ -2523,9 +2524,9 @@
]
},
"node_modules/@rollup/rollup-linux-x64-gnu": {
- "version": "4.34.9",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.34.9.tgz",
- "integrity": "sha512-FwBHNSOjUTQLP4MG7y6rR6qbGw4MFeQnIBrMe161QGaQoBQLqSUEKlHIiVgF3g/mb3lxlxzJOpIBhaP+C+KP2A==",
+ "version": "4.36.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.36.0.tgz",
+ "integrity": "sha512-5KtoW8UWmwFKQ96aQL3LlRXX16IMwyzMq/jSSVIIyAANiE1doaQsx/KRyhAvpHlPjPiSU/AYX/8m+lQ9VToxFQ==",
"cpu": [
"x64"
],
@@ -2536,9 +2537,9 @@
]
},
"node_modules/@rollup/rollup-linux-x64-musl": {
- "version": "4.34.9",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.34.9.tgz",
- "integrity": "sha512-cYRpV4650z2I3/s6+5/LONkjIz8MBeqrk+vPXV10ORBnshpn8S32bPqQ2Utv39jCiDcO2eJTuSlPXpnvmaIgRA==",
+ "version": "4.36.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.36.0.tgz",
+ "integrity": "sha512-sycrYZPrv2ag4OCvaN5js+f01eoZ2U+RmT5as8vhxiFz+kxwlHrsxOwKPSA8WyS+Wc6Epid9QeI/IkQ9NkgYyQ==",
"cpu": [
"x64"
],
@@ -2549,9 +2550,9 @@
]
},
"node_modules/@rollup/rollup-win32-arm64-msvc": {
- "version": "4.34.9",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.34.9.tgz",
- "integrity": "sha512-z4mQK9dAN6byRA/vsSgQiPeuO63wdiDxZ9yg9iyX2QTzKuQM7T4xlBoeUP/J8uiFkqxkcWndWi+W7bXdPbt27Q==",
+ "version": "4.36.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.36.0.tgz",
+ "integrity": "sha512-qbqt4N7tokFwwSVlWDsjfoHgviS3n/vZ8LK0h1uLG9TYIRuUTJC88E1xb3LM2iqZ/WTqNQjYrtmtGmrmmawB6A==",
"cpu": [
"arm64"
],
@@ -2562,9 +2563,9 @@
]
},
"node_modules/@rollup/rollup-win32-ia32-msvc": {
- "version": "4.34.9",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.34.9.tgz",
- "integrity": "sha512-KB48mPtaoHy1AwDNkAJfHXvHp24H0ryZog28spEs0V48l3H1fr4i37tiyHsgKZJnCmvxsbATdZGBpbmxTE3a9w==",
+ "version": "4.36.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.36.0.tgz",
+ "integrity": "sha512-t+RY0JuRamIocMuQcfwYSOkmdX9dtkr1PbhKW42AMvaDQa+jOdpUYysroTF/nuPpAaQMWp7ye+ndlmmthieJrQ==",
"cpu": [
"ia32"
],
@@ -2575,9 +2576,9 @@
]
},
"node_modules/@rollup/rollup-win32-x64-msvc": {
- "version": "4.34.9",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.34.9.tgz",
- "integrity": "sha512-AyleYRPU7+rgkMWbEh71fQlrzRfeP6SyMnRf9XX4fCdDPAJumdSBqYEcWPMzVQ4ScAl7E4oFfK0GUVn77xSwbw==",
+ "version": "4.36.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.36.0.tgz",
+ "integrity": "sha512-aRXd7tRZkWLqGbChgcMMDEHjOKudo1kChb1Jt1IfR8cY/KIpgNviLeJy5FUb9IpSuQj8dU2fAYNMPW/hLKOSTw==",
"cpu": [
"x64"
],
@@ -3188,12 +3189,12 @@
}
},
"node_modules/@uswds/uswds": {
- "version": "3.11.0",
- "resolved": "https://registry.npmjs.org/@uswds/uswds/-/uswds-3.11.0.tgz",
- "integrity": "sha512-ze0MNXaZhgXLyNICpclm5g4pOGyU4/FE0DQTP5G19mHWB914vrCJvOxyTo2n1qGVMVwJtf6MtpBCnghAC8WaZA==",
+ "version": "3.12.0",
+ "resolved": "https://registry.npmjs.org/@uswds/uswds/-/uswds-3.12.0.tgz",
+ "integrity": "sha512-ZdHNwiJhE0Ve489khIIjvsEpWjjn/WfCqRMaEAs8Sb2Xqnb1aN7CCHX36KHrzdkzml6c8DXUwhH/ph62FjE8Pw==",
+ "license": "SEE LICENSE IN LICENSE.md",
"dependencies": {
- "receptor": "1.0.0",
- "resolve-id-refs": "0.1.0"
+ "receptor": "1.0.0"
},
"engines": {
"node": ">= 4"
@@ -10620,12 +10621,12 @@
}
},
"node_modules/playwright": {
- "version": "1.51.0",
- "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.51.0.tgz",
- "integrity": "sha512-442pTfGM0xxfCYxuBa/Pu6B2OqxqqaYq39JS8QDMGThUvIOCd6s0ANDog3uwA0cHavVlnTQzGCN7Id2YekDSXA==",
+ "version": "1.51.1",
+ "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.51.1.tgz",
+ "integrity": "sha512-kkx+MB2KQRkyxjYPc3a0wLZZoDczmppyGJIvQ43l+aZihkaVvmu/21kiyaHeHjiFxjxNNFnUncKmcGIyOojsaw==",
"license": "Apache-2.0",
"dependencies": {
- "playwright-core": "1.51.0"
+ "playwright-core": "1.51.1"
},
"bin": {
"playwright": "cli.js"
@@ -10638,9 +10639,9 @@
}
},
"node_modules/playwright-core": {
- "version": "1.51.0",
- "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.51.0.tgz",
- "integrity": "sha512-x47yPE3Zwhlil7wlNU/iktF7t2r/URR3VLbH6EknJd/04Qc/PSJ0EY3CMXipmglLG+zyRxW6HNo2EGbKLHPWMg==",
+ "version": "1.51.1",
+ "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.51.1.tgz",
+ "integrity": "sha512-/crRMj8+j/Nq5s8QcvegseuyeZPxpQCZb6HNk3Sos3BlZyAknRjoyJPFWkpNn8v0+P3WiwqFF8P+zQo4eqiNuw==",
"license": "Apache-2.0",
"bin": {
"playwright-core": "cli.js"
@@ -11507,11 +11508,6 @@
"node": ">=8"
}
},
- "node_modules/resolve-id-refs": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/resolve-id-refs/-/resolve-id-refs-0.1.0.tgz",
- "integrity": "sha512-hNS03NEmVpJheF7yfyagNh57XuKc0z+NkSO0oBbeO67o6IJKoqlDfnNIxhjp7aTWwjmSWZQhtiGrOgZXVyM90w=="
- },
"node_modules/resolve-options": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/resolve-options/-/resolve-options-1.1.0.tgz",
@@ -11567,9 +11563,9 @@
"license": "Unlicense"
},
"node_modules/rollup": {
- "version": "4.34.9",
- "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.34.9.tgz",
- "integrity": "sha512-nF5XYqWWp9hx/LrpC8sZvvvmq0TeTjQgaZHYmAgwysT9nh8sWnZhBnM8ZyVbbJFIQBLwHDNoMqsBZBbUo4U8sQ==",
+ "version": "4.36.0",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.36.0.tgz",
+ "integrity": "sha512-zwATAXNQxUcd40zgtQG0ZafcRK4g004WtEl7kbuhTWPvf07PsfohXl39jVUvPF7jvNAIkKPQ2XrsDlWuxBd++Q==",
"license": "MIT",
"dependencies": {
"@types/estree": "1.0.6"
@@ -11582,25 +11578,25 @@
"npm": ">=8.0.0"
},
"optionalDependencies": {
- "@rollup/rollup-android-arm-eabi": "4.34.9",
- "@rollup/rollup-android-arm64": "4.34.9",
- "@rollup/rollup-darwin-arm64": "4.34.9",
- "@rollup/rollup-darwin-x64": "4.34.9",
- "@rollup/rollup-freebsd-arm64": "4.34.9",
- "@rollup/rollup-freebsd-x64": "4.34.9",
- "@rollup/rollup-linux-arm-gnueabihf": "4.34.9",
- "@rollup/rollup-linux-arm-musleabihf": "4.34.9",
- "@rollup/rollup-linux-arm64-gnu": "4.34.9",
- "@rollup/rollup-linux-arm64-musl": "4.34.9",
- "@rollup/rollup-linux-loongarch64-gnu": "4.34.9",
- "@rollup/rollup-linux-powerpc64le-gnu": "4.34.9",
- "@rollup/rollup-linux-riscv64-gnu": "4.34.9",
- "@rollup/rollup-linux-s390x-gnu": "4.34.9",
- "@rollup/rollup-linux-x64-gnu": "4.34.9",
- "@rollup/rollup-linux-x64-musl": "4.34.9",
- "@rollup/rollup-win32-arm64-msvc": "4.34.9",
- "@rollup/rollup-win32-ia32-msvc": "4.34.9",
- "@rollup/rollup-win32-x64-msvc": "4.34.9",
+ "@rollup/rollup-android-arm-eabi": "4.36.0",
+ "@rollup/rollup-android-arm64": "4.36.0",
+ "@rollup/rollup-darwin-arm64": "4.36.0",
+ "@rollup/rollup-darwin-x64": "4.36.0",
+ "@rollup/rollup-freebsd-arm64": "4.36.0",
+ "@rollup/rollup-freebsd-x64": "4.36.0",
+ "@rollup/rollup-linux-arm-gnueabihf": "4.36.0",
+ "@rollup/rollup-linux-arm-musleabihf": "4.36.0",
+ "@rollup/rollup-linux-arm64-gnu": "4.36.0",
+ "@rollup/rollup-linux-arm64-musl": "4.36.0",
+ "@rollup/rollup-linux-loongarch64-gnu": "4.36.0",
+ "@rollup/rollup-linux-powerpc64le-gnu": "4.36.0",
+ "@rollup/rollup-linux-riscv64-gnu": "4.36.0",
+ "@rollup/rollup-linux-s390x-gnu": "4.36.0",
+ "@rollup/rollup-linux-x64-gnu": "4.36.0",
+ "@rollup/rollup-linux-x64-musl": "4.36.0",
+ "@rollup/rollup-win32-arm64-msvc": "4.36.0",
+ "@rollup/rollup-win32-ia32-msvc": "4.36.0",
+ "@rollup/rollup-win32-x64-msvc": "4.36.0",
"fsevents": "~2.3.2"
}
},
@@ -11709,9 +11705,9 @@
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
},
"node_modules/sass-embedded": {
- "version": "1.85.1",
- "resolved": "https://registry.npmjs.org/sass-embedded/-/sass-embedded-1.85.1.tgz",
- "integrity": "sha512-0i+3h2Df/c71afluxC1SXqyyMmJlnKWfu9ZGdzwuKRM1OftEa2XM2myt5tR36CF3PanYrMjFKtRIj8PfSf838w==",
+ "version": "1.86.0",
+ "resolved": "https://registry.npmjs.org/sass-embedded/-/sass-embedded-1.86.0.tgz",
+ "integrity": "sha512-Ibq5DzxjSf9f/IJmKeHVeXlVqiZWdRJF+RXy6v6UupvMYVMU5Ei+teSFBvvpPD5bB2QhhnU/OJlSM0EBCtfr9g==",
"license": "MIT",
"dependencies": {
"@bufbuild/protobuf": "^2.0.0",
@@ -11730,32 +11726,32 @@
"node": ">=16.0.0"
},
"optionalDependencies": {
- "sass-embedded-android-arm": "1.85.1",
- "sass-embedded-android-arm64": "1.85.1",
- "sass-embedded-android-ia32": "1.85.1",
- "sass-embedded-android-riscv64": "1.85.1",
- "sass-embedded-android-x64": "1.85.1",
- "sass-embedded-darwin-arm64": "1.85.1",
- "sass-embedded-darwin-x64": "1.85.1",
- "sass-embedded-linux-arm": "1.85.1",
- "sass-embedded-linux-arm64": "1.85.1",
- "sass-embedded-linux-ia32": "1.85.1",
- "sass-embedded-linux-musl-arm": "1.85.1",
- "sass-embedded-linux-musl-arm64": "1.85.1",
- "sass-embedded-linux-musl-ia32": "1.85.1",
- "sass-embedded-linux-musl-riscv64": "1.85.1",
- "sass-embedded-linux-musl-x64": "1.85.1",
- "sass-embedded-linux-riscv64": "1.85.1",
- "sass-embedded-linux-x64": "1.85.1",
- "sass-embedded-win32-arm64": "1.85.1",
- "sass-embedded-win32-ia32": "1.85.1",
- "sass-embedded-win32-x64": "1.85.1"
+ "sass-embedded-android-arm": "1.86.0",
+ "sass-embedded-android-arm64": "1.86.0",
+ "sass-embedded-android-ia32": "1.86.0",
+ "sass-embedded-android-riscv64": "1.86.0",
+ "sass-embedded-android-x64": "1.86.0",
+ "sass-embedded-darwin-arm64": "1.86.0",
+ "sass-embedded-darwin-x64": "1.86.0",
+ "sass-embedded-linux-arm": "1.86.0",
+ "sass-embedded-linux-arm64": "1.86.0",
+ "sass-embedded-linux-ia32": "1.86.0",
+ "sass-embedded-linux-musl-arm": "1.86.0",
+ "sass-embedded-linux-musl-arm64": "1.86.0",
+ "sass-embedded-linux-musl-ia32": "1.86.0",
+ "sass-embedded-linux-musl-riscv64": "1.86.0",
+ "sass-embedded-linux-musl-x64": "1.86.0",
+ "sass-embedded-linux-riscv64": "1.86.0",
+ "sass-embedded-linux-x64": "1.86.0",
+ "sass-embedded-win32-arm64": "1.86.0",
+ "sass-embedded-win32-ia32": "1.86.0",
+ "sass-embedded-win32-x64": "1.86.0"
}
},
"node_modules/sass-embedded-android-arm": {
- "version": "1.85.1",
- "resolved": "https://registry.npmjs.org/sass-embedded-android-arm/-/sass-embedded-android-arm-1.85.1.tgz",
- "integrity": "sha512-GkcgUGMZtEF9gheuE1dxCU0ZSAifuaFXi/aX7ZXvjtdwmTl9Zc/OHR9oiUJkc8IW9UI7H8TuwlTAA8+SwgwIeQ==",
+ "version": "1.86.0",
+ "resolved": "https://registry.npmjs.org/sass-embedded-android-arm/-/sass-embedded-android-arm-1.86.0.tgz",
+ "integrity": "sha512-NS8v6BCbzskXUMBtzfuB+j2yQMgiwg5edKHTYfQU7gAWai2hkRhS06YNEMff3aRxV0IFInxPRHOobd8xWPHqeA==",
"cpu": [
"arm"
],
@@ -11769,9 +11765,9 @@
}
},
"node_modules/sass-embedded-android-arm64": {
- "version": "1.85.1",
- "resolved": "https://registry.npmjs.org/sass-embedded-android-arm64/-/sass-embedded-android-arm64-1.85.1.tgz",
- "integrity": "sha512-27oRheqNA3SJM2hAxpVbs7mCKUwKPWmEEhyiNFpBINb5ELVLg+Ck5RsGg+SJmo130ul5YX0vinmVB5uPWc8X5w==",
+ "version": "1.86.0",
+ "resolved": "https://registry.npmjs.org/sass-embedded-android-arm64/-/sass-embedded-android-arm64-1.86.0.tgz",
+ "integrity": "sha512-r7MZtlAI2VFUnKE8B5UOrpoE6OGpdf1dIB6ndoxb3oiURgMyfTVU7yvJcL12GGvtVwQ2boCj6dq//Lqq9CXPlQ==",
"cpu": [
"arm64"
],
@@ -11785,9 +11781,9 @@
}
},
"node_modules/sass-embedded-android-ia32": {
- "version": "1.85.1",
- "resolved": "https://registry.npmjs.org/sass-embedded-android-ia32/-/sass-embedded-android-ia32-1.85.1.tgz",
- "integrity": "sha512-f3x16NyRgtXFksIaO/xXKrUhttUBv8V0XsAR2Dhdb/yz4yrDrhzw9Wh8fmw7PlQqECcQvFaoDr3XIIM6lKzasw==",
+ "version": "1.86.0",
+ "resolved": "https://registry.npmjs.org/sass-embedded-android-ia32/-/sass-embedded-android-ia32-1.86.0.tgz",
+ "integrity": "sha512-UjfElrGaOTNOnxLZLxf6MFndFIe7zyK+81f83BioZ7/jcoAd6iCHZT8yQMvu8wINyVodPcaXZl8KxlKcl62VAA==",
"cpu": [
"ia32"
],
@@ -11801,9 +11797,9 @@
}
},
"node_modules/sass-embedded-android-riscv64": {
- "version": "1.85.1",
- "resolved": "https://registry.npmjs.org/sass-embedded-android-riscv64/-/sass-embedded-android-riscv64-1.85.1.tgz",
- "integrity": "sha512-IP6OijpJ8Mqo7XqCe0LsuZVbAxEFVboa0kXqqR5K55LebEplsTIA2GnmRyMay3Yr/2FVGsZbCb6Wlgkw23eCiA==",
+ "version": "1.86.0",
+ "resolved": "https://registry.npmjs.org/sass-embedded-android-riscv64/-/sass-embedded-android-riscv64-1.86.0.tgz",
+ "integrity": "sha512-TsqCLxHWLFS2mbpUkL/nge3jSkaPK2VmLkkoi5iO/EQT4SFvm1lNUgPwlLXu9DplZ+aqGVzRS9Y6Psjv+qW7kw==",
"cpu": [
"riscv64"
],
@@ -11817,9 +11813,9 @@
}
},
"node_modules/sass-embedded-android-x64": {
- "version": "1.85.1",
- "resolved": "https://registry.npmjs.org/sass-embedded-android-x64/-/sass-embedded-android-x64-1.85.1.tgz",
- "integrity": "sha512-Mh7CA53wR3ADvXAYipFc/R3vV4PVOzoKwWzPxmq+7i8UZrtsVjKONxGtqWe9JG1mna0C9CRZAx0sv/BzbOJxWg==",
+ "version": "1.86.0",
+ "resolved": "https://registry.npmjs.org/sass-embedded-android-x64/-/sass-embedded-android-x64-1.86.0.tgz",
+ "integrity": "sha512-8Q263GgwGjz7Jkf7Eghp7NrwqskDL95WO9sKrNm9iOd2re/M48W7RN/lpdcZwrUnEOhueks0RRyYyZYBNRz8Tg==",
"cpu": [
"x64"
],
@@ -11833,9 +11829,9 @@
}
},
"node_modules/sass-embedded-darwin-arm64": {
- "version": "1.85.1",
- "resolved": "https://registry.npmjs.org/sass-embedded-darwin-arm64/-/sass-embedded-darwin-arm64-1.85.1.tgz",
- "integrity": "sha512-msWxzhvcP9hqGVegxVePVEfv9mVNTlUgGr6k7O7Ihji702mbtrH/lKwF4aRkkt4g1j7tv10+JtQXmTNi/pi9kA==",
+ "version": "1.86.0",
+ "resolved": "https://registry.npmjs.org/sass-embedded-darwin-arm64/-/sass-embedded-darwin-arm64-1.86.0.tgz",
+ "integrity": "sha512-d8oMEaIweq1tjrb/BT43igDviOMS1TeDpc51QF7vAHkt9drSjPmqEmbqStdFYPAGZj1j0RA4WCRoVl6jVixi/w==",
"cpu": [
"arm64"
],
@@ -11849,9 +11845,9 @@
}
},
"node_modules/sass-embedded-darwin-x64": {
- "version": "1.85.1",
- "resolved": "https://registry.npmjs.org/sass-embedded-darwin-x64/-/sass-embedded-darwin-x64-1.85.1.tgz",
- "integrity": "sha512-J4UFHUiyI9Z+mwYMwz11Ky9TYr3hY1fCxeQddjNGL/+ovldtb0yAIHvoVM0BGprQDm5JqhtUk8KyJ3RMJqpaAA==",
+ "version": "1.86.0",
+ "resolved": "https://registry.npmjs.org/sass-embedded-darwin-x64/-/sass-embedded-darwin-x64-1.86.0.tgz",
+ "integrity": "sha512-5NLRtn0ZUDBkfpKOsgLGl9B34po4Qui8Nff/lXTO+YkxBQFX4GoMkYNk9EJqHwoLLzICsxIhNDMMDiPGz7Fdrw==",
"cpu": [
"x64"
],
@@ -11865,9 +11861,9 @@
}
},
"node_modules/sass-embedded-linux-arm": {
- "version": "1.85.1",
- "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm/-/sass-embedded-linux-arm-1.85.1.tgz",
- "integrity": "sha512-X0fDh95nNSw1wfRlnkE4oscoEA5Au4nnk785s9jghPFkTBg+A+5uB6trCjf0fM22+Iw6kiP4YYmDdw3BqxAKLQ==",
+ "version": "1.86.0",
+ "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm/-/sass-embedded-linux-arm-1.86.0.tgz",
+ "integrity": "sha512-b6wm0+Il+blJDleRXAqA6JISGMjRb0/thTEg4NWgmiJwUoZjDycj5FTbfYPnLXjCEIMGaYmW3patrJ3JMJcT3Q==",
"cpu": [
"arm"
],
@@ -11881,9 +11877,9 @@
}
},
"node_modules/sass-embedded-linux-arm64": {
- "version": "1.85.1",
- "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm64/-/sass-embedded-linux-arm64-1.85.1.tgz",
- "integrity": "sha512-jGadetB03BMFG2rq3OXub/uvC/lGpbQOiLGEz3NLb2nRZWyauRhzDtvZqkr6BEhxgIWtMtz2020yD8ZJSw/r2w==",
+ "version": "1.86.0",
+ "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm64/-/sass-embedded-linux-arm64-1.86.0.tgz",
+ "integrity": "sha512-50A+0rhahRDRkKkv+qS7GDAAkW1VPm2RCX4zY4JWydhV4NwMXr6HbkLnsJ2MGixCyibPh59iflMpNBhe7SEMNg==",
"cpu": [
"arm64"
],
@@ -11897,9 +11893,9 @@
}
},
"node_modules/sass-embedded-linux-ia32": {
- "version": "1.85.1",
- "resolved": "https://registry.npmjs.org/sass-embedded-linux-ia32/-/sass-embedded-linux-ia32-1.85.1.tgz",
- "integrity": "sha512-7HlYY90d9mitDtNi5s+S+5wYZrTVbkBH2/kf7ixrzh2BFfT0YM81UHLJRnGX93y9aOMBL6DSZAIfkt1RsV9bkQ==",
+ "version": "1.86.0",
+ "resolved": "https://registry.npmjs.org/sass-embedded-linux-ia32/-/sass-embedded-linux-ia32-1.86.0.tgz",
+ "integrity": "sha512-h0mr9w71TV3BRPk9JHr0flnRCznhkraY14gaj5T+t78vUFByOUMxp4hTr+JpZAR5mv0mIeoMwrQYwWJoqKI0mw==",
"cpu": [
"ia32"
],
@@ -11913,9 +11909,9 @@
}
},
"node_modules/sass-embedded-linux-musl-arm": {
- "version": "1.85.1",
- "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm/-/sass-embedded-linux-musl-arm-1.85.1.tgz",
- "integrity": "sha512-5vcdEqE8QZnu6i6shZo7x2N36V7YUoFotWj2rGekII5ty7Nkaj+VtZhUEOp9tAzEOlaFuDp5CyO1kUCvweT64A==",
+ "version": "1.86.0",
+ "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm/-/sass-embedded-linux-musl-arm-1.86.0.tgz",
+ "integrity": "sha512-KZU70jBMVykC9HzS+o2FhrJaprFLDk3LWXVPtBFxgLlkcQ/apCkUCh2WVNViLhI2U4NrMSnTvd4kDnC/0m8qIw==",
"cpu": [
"arm"
],
@@ -11929,9 +11925,9 @@
}
},
"node_modules/sass-embedded-linux-musl-arm64": {
- "version": "1.85.1",
- "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm64/-/sass-embedded-linux-musl-arm64-1.85.1.tgz",
- "integrity": "sha512-FLkIT0p18XOkR6wryJ13LqGBDsrYev2dRk9dtiU18NCpNXruKsdBQ1ZnWHVKB3h1dA9lFyEEisC0sooKdNfeOQ==",
+ "version": "1.86.0",
+ "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm64/-/sass-embedded-linux-musl-arm64-1.86.0.tgz",
+ "integrity": "sha512-5OZjiJIUyhvKJIGNDEjyRUWDe+W91hq4Bji27sy8gdEuDzPWLx4NzwpKwsBUALUfyW/J5dxgi0ZAQnI3HieyQg==",
"cpu": [
"arm64"
],
@@ -11945,9 +11941,9 @@
}
},
"node_modules/sass-embedded-linux-musl-ia32": {
- "version": "1.85.1",
- "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-ia32/-/sass-embedded-linux-musl-ia32-1.85.1.tgz",
- "integrity": "sha512-N1093T84zQJor1yyIAdYScB5eAuQarGK1tKgZ4uTnxVlgA7Xi1lXV8Eh7ox9sDqKCaWkVQ3MjqU26vYRBeRWyw==",
+ "version": "1.86.0",
+ "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-ia32/-/sass-embedded-linux-musl-ia32-1.86.0.tgz",
+ "integrity": "sha512-vq9wJ7kaELrsNU6Ld6kvrIHxoIUWaD+5T6TQVj4SJP/iw1NjonyCDMQGGs6UgsIEzvaIwtlSlDbRewAq+4PchA==",
"cpu": [
"ia32"
],
@@ -11961,9 +11957,9 @@
}
},
"node_modules/sass-embedded-linux-musl-riscv64": {
- "version": "1.85.1",
- "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-riscv64/-/sass-embedded-linux-musl-riscv64-1.85.1.tgz",
- "integrity": "sha512-WRsZS/7qlfYXsa93FBpSruieuURIu7ySfFhzYfF1IbKrNAGwmbduutkHZh2ddm5/vQMvQ0Rdosgv+CslaQHMcw==",
+ "version": "1.86.0",
+ "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-riscv64/-/sass-embedded-linux-musl-riscv64-1.86.0.tgz",
+ "integrity": "sha512-UZJPu4zKe3phEzoSVRh5jcSicBBPe+jEbVNALHSSz881iOAYnDQXHITGeQ4mM1/7e/LTyryHk6EPBoaLOv6JrA==",
"cpu": [
"riscv64"
],
@@ -11977,9 +11973,9 @@
}
},
"node_modules/sass-embedded-linux-musl-x64": {
- "version": "1.85.1",
- "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-x64/-/sass-embedded-linux-musl-x64-1.85.1.tgz",
- "integrity": "sha512-+OlLIilA5TnP0YEqTQ8yZtkW+bJIQYvzoGoNLUEskeyeGuOiIyn2CwL6G4JQB4xZQFaxPHb7JD3EueFkQbH0Pw==",
+ "version": "1.86.0",
+ "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-x64/-/sass-embedded-linux-musl-x64-1.86.0.tgz",
+ "integrity": "sha512-8taAgbWMk4QHneJcouWmWZJlmKa2O03g4I/CFo4bfMPL87bibY90pAsSDd+C+t81g0+2aK0/lY/BoB0r3qXLiA==",
"cpu": [
"x64"
],
@@ -11993,9 +11989,9 @@
}
},
"node_modules/sass-embedded-linux-riscv64": {
- "version": "1.85.1",
- "resolved": "https://registry.npmjs.org/sass-embedded-linux-riscv64/-/sass-embedded-linux-riscv64-1.85.1.tgz",
- "integrity": "sha512-mKKlOwMGLN7yP1p0gB5yG/HX4fYLnpWaqstNuOOXH+fOzTaNg0+1hALg0H0CDIqypPO74M5MS9T6FAJZGdT6dQ==",
+ "version": "1.86.0",
+ "resolved": "https://registry.npmjs.org/sass-embedded-linux-riscv64/-/sass-embedded-linux-riscv64-1.86.0.tgz",
+ "integrity": "sha512-yREY6o2sLwiiA03MWHVpnUliLscz0flEmFW/wzxYZJDqg9eZteB3hUWgZD63eLm2PTZsYxDQpjAHpa48nnIEmA==",
"cpu": [
"riscv64"
],
@@ -12009,9 +12005,9 @@
}
},
"node_modules/sass-embedded-linux-x64": {
- "version": "1.85.1",
- "resolved": "https://registry.npmjs.org/sass-embedded-linux-x64/-/sass-embedded-linux-x64-1.85.1.tgz",
- "integrity": "sha512-uKRTv0z8NgtHV7xSren78+yoWB79sNi7TMqI7Bxd8fcRNIgHQSA8QBdF8led2ETC004hr8h71BrY60RPO+SSvA==",
+ "version": "1.86.0",
+ "resolved": "https://registry.npmjs.org/sass-embedded-linux-x64/-/sass-embedded-linux-x64-1.86.0.tgz",
+ "integrity": "sha512-sH0F8np9PTgTbFcJWxfr1NzPkL5ID2NcpMtZyKPTdnn9NkE/L2UwXSo6xOvY0Duc4Hg+58wSrDnj6KbvdeHCPg==",
"cpu": [
"x64"
],
@@ -12025,9 +12021,9 @@
}
},
"node_modules/sass-embedded-win32-arm64": {
- "version": "1.85.1",
- "resolved": "https://registry.npmjs.org/sass-embedded-win32-arm64/-/sass-embedded-win32-arm64-1.85.1.tgz",
- "integrity": "sha512-/GMiZXBOc6AEMBC3g25Rp+x8fq9Z6Ql7037l5rajBPhZ+DdFwtdHY0Ou3oIU6XuWUwD06U3ii4XufXVFhsP6PA==",
+ "version": "1.86.0",
+ "resolved": "https://registry.npmjs.org/sass-embedded-win32-arm64/-/sass-embedded-win32-arm64-1.86.0.tgz",
+ "integrity": "sha512-4O1XVUxLTIjMOvrziYwEZgvFqC5sF6t0hTAPJ+h2uiAUZg9Joo0PvuEedXurjISgDBsb5W5DTL9hH9q1BbP4cQ==",
"cpu": [
"arm64"
],
@@ -12041,9 +12037,9 @@
}
},
"node_modules/sass-embedded-win32-ia32": {
- "version": "1.85.1",
- "resolved": "https://registry.npmjs.org/sass-embedded-win32-ia32/-/sass-embedded-win32-ia32-1.85.1.tgz",
- "integrity": "sha512-L+4BWkKKBGFOKVQ2PQ5HwFfkM5FvTf1Xx2VSRvEWt9HxPXp6SPDho6zC8fqNQ3hSjoaoASEIJcSvgfdQYO0gdg==",
+ "version": "1.86.0",
+ "resolved": "https://registry.npmjs.org/sass-embedded-win32-ia32/-/sass-embedded-win32-ia32-1.86.0.tgz",
+ "integrity": "sha512-zuSP2axkGm4VaJWt38P464H+4424Swr9bzFNfbbznxe3Ue4RuqSBqwiLiYdg9Q1cecTQ2WGH7G7WO56KK7WLwg==",
"cpu": [
"ia32"
],
@@ -12057,9 +12053,9 @@
}
},
"node_modules/sass-embedded-win32-x64": {
- "version": "1.85.1",
- "resolved": "https://registry.npmjs.org/sass-embedded-win32-x64/-/sass-embedded-win32-x64-1.85.1.tgz",
- "integrity": "sha512-/FO0AGKWxVfCk4GKsC0yXWBpUZdySe3YAAbQQL0lL6xUd1OiUY8Kow6g4Kc1TB/+z0iuQKKTqI/acJMEYl4iTQ==",
+ "version": "1.86.0",
+ "resolved": "https://registry.npmjs.org/sass-embedded-win32-x64/-/sass-embedded-win32-x64-1.86.0.tgz",
+ "integrity": "sha512-GVX0CHtukr3kjqfqretSlPiJzV7V4JxUjpRZV+yC9gUMTiDErilJh2Chw1r0+MYiYvumCDUSDlticmvJs7v0tA==",
"cpu": [
"x64"
],
diff --git a/package.json b/package.json
index d3a43d0e3..11d3eeb36 100644
--- a/package.json
+++ b/package.json
@@ -26,9 +26,9 @@
},
"dependencies": {
"@rollup/plugin-commonjs": "^28.0.3",
- "@rollup/plugin-node-resolve": "^16.0.0",
+ "@rollup/plugin-node-resolve": "^16.0.1",
"@rollup/stream": "^3.0.1",
- "@uswds/uswds": "^3.11.0",
+ "@uswds/uswds": "^3.12.0",
"cbor-js": "0.1.0",
"d3": "^7.9.0",
"govuk_frontend_toolkit": "^9.0.1",
@@ -37,17 +37,17 @@
"hogan": "1.0.2",
"jquery": "3.7.1",
"morphdom": "^2.7.4",
- "playwright": "^1.51.0",
+ "playwright": "^1.51.1",
"python": "^0.0.4",
"query-command-supported": "1.0.0",
- "sass-embedded": "^1.85.1",
+ "sass-embedded": "^1.86.0",
"textarea-caret": "3.1.0",
"timeago": "1.6.7",
"vinyl-buffer": "^1.0.1",
"vinyl-source-stream": "^2.0.0"
},
"devDependencies": {
- "@babel/core": "^7.26.9",
+ "@babel/core": "^7.26.10",
"@babel/preset-env": "^7.26.9",
"@uswds/compile": "^1.2.1",
"backstopjs": "^6.3.25",
@@ -66,7 +66,7 @@
"jest-environment-jsdom": "^29.2.2",
"jshint": "2.13.6",
"jshint-stylish": "2.2.1",
- "rollup": "^4.34.9",
+ "rollup": "^4.36.0",
"rollup-plugin-commonjs": "10.1.0",
"rollup-plugin-node-resolve": "5.2.0"
}
diff --git a/poetry.lock b/poetry.lock
index 6677be33e..e8eddabb8 100644
--- a/poetry.lock
+++ b/poetry.lock
@@ -619,43 +619,47 @@ toml = ["tomli ; python_full_version <= \"3.11.0a6\""]
[[package]]
name = "cryptography"
-version = "44.0.1"
+version = "44.0.2"
description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers."
optional = false
python-versions = "!=3.9.0,!=3.9.1,>=3.7"
groups = ["main", "dev"]
files = [
- {file = "cryptography-44.0.1-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:bf688f615c29bfe9dfc44312ca470989279f0e94bb9f631f85e3459af8efc009"},
- {file = "cryptography-44.0.1-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd7c7e2d71d908dc0f8d2027e1604102140d84b155e658c20e8ad1304317691f"},
- {file = "cryptography-44.0.1-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:887143b9ff6bad2b7570da75a7fe8bbf5f65276365ac259a5d2d5147a73775f2"},
- {file = "cryptography-44.0.1-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:322eb03ecc62784536bc173f1483e76747aafeb69c8728df48537eb431cd1911"},
- {file = "cryptography-44.0.1-cp37-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:21377472ca4ada2906bc313168c9dc7b1d7ca417b63c1c3011d0c74b7de9ae69"},
- {file = "cryptography-44.0.1-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:df978682c1504fc93b3209de21aeabf2375cb1571d4e61907b3e7a2540e83026"},
- {file = "cryptography-44.0.1-cp37-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:eb3889330f2a4a148abead555399ec9a32b13b7c8ba969b72d8e500eb7ef84cd"},
- {file = "cryptography-44.0.1-cp37-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:8e6a85a93d0642bd774460a86513c5d9d80b5c002ca9693e63f6e540f1815ed0"},
- {file = "cryptography-44.0.1-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:6f76fdd6fd048576a04c5210d53aa04ca34d2ed63336d4abd306d0cbe298fddf"},
- {file = "cryptography-44.0.1-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:6c8acf6f3d1f47acb2248ec3ea261171a671f3d9428e34ad0357148d492c7864"},
- {file = "cryptography-44.0.1-cp37-abi3-win32.whl", hash = "sha256:24979e9f2040c953a94bf3c6782e67795a4c260734e5264dceea65c8f4bae64a"},
- {file = "cryptography-44.0.1-cp37-abi3-win_amd64.whl", hash = "sha256:fd0ee90072861e276b0ff08bd627abec29e32a53b2be44e41dbcdf87cbee2b00"},
- {file = "cryptography-44.0.1-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:a2d8a7045e1ab9b9f803f0d9531ead85f90c5f2859e653b61497228b18452008"},
- {file = "cryptography-44.0.1-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b8272f257cf1cbd3f2e120f14c68bff2b6bdfcc157fafdee84a1b795efd72862"},
- {file = "cryptography-44.0.1-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1e8d181e90a777b63f3f0caa836844a1182f1f265687fac2115fcf245f5fbec3"},
- {file = "cryptography-44.0.1-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:436df4f203482f41aad60ed1813811ac4ab102765ecae7a2bbb1dbb66dcff5a7"},
- {file = "cryptography-44.0.1-cp39-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:4f422e8c6a28cf8b7f883eb790695d6d45b0c385a2583073f3cec434cc705e1a"},
- {file = "cryptography-44.0.1-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:72198e2b5925155497a5a3e8c216c7fb3e64c16ccee11f0e7da272fa93b35c4c"},
- {file = "cryptography-44.0.1-cp39-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:2a46a89ad3e6176223b632056f321bc7de36b9f9b93b2cc1cccf935a3849dc62"},
- {file = "cryptography-44.0.1-cp39-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:53f23339864b617a3dfc2b0ac8d5c432625c80014c25caac9082314e9de56f41"},
- {file = "cryptography-44.0.1-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:888fcc3fce0c888785a4876ca55f9f43787f4c5c1cc1e2e0da71ad481ff82c5b"},
- {file = "cryptography-44.0.1-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:00918d859aa4e57db8299607086f793fa7813ae2ff5a4637e318a25ef82730f7"},
- {file = "cryptography-44.0.1-cp39-abi3-win32.whl", hash = "sha256:9b336599e2cb77b1008cb2ac264b290803ec5e8e89d618a5e978ff5eb6f715d9"},
- {file = "cryptography-44.0.1-cp39-abi3-win_amd64.whl", hash = "sha256:e403f7f766ded778ecdb790da786b418a9f2394f36e8cc8b796cc056ab05f44f"},
- {file = "cryptography-44.0.1-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:1f9a92144fa0c877117e9748c74501bea842f93d21ee00b0cf922846d9d0b183"},
- {file = "cryptography-44.0.1-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:610a83540765a8d8ce0f351ce42e26e53e1f774a6efb71eb1b41eb01d01c3d12"},
- {file = "cryptography-44.0.1-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:5fed5cd6102bb4eb843e3315d2bf25fede494509bddadb81e03a859c1bc17b83"},
- {file = "cryptography-44.0.1-pp310-pypy310_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:f4daefc971c2d1f82f03097dc6f216744a6cd2ac0f04c68fb935ea2ba2a0d420"},
- {file = "cryptography-44.0.1-pp310-pypy310_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:94f99f2b943b354a5b6307d7e8d19f5c423a794462bde2bf310c770ba052b1c4"},
- {file = "cryptography-44.0.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:d9c5b9f698a83c8bd71e0f4d3f9f839ef244798e5ffe96febfa9714717db7af7"},
- {file = "cryptography-44.0.1.tar.gz", hash = "sha256:f51f5705ab27898afda1aaa430f34ad90dc117421057782022edf0600bec5f14"},
+ {file = "cryptography-44.0.2-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:efcfe97d1b3c79e486554efddeb8f6f53a4cdd4cf6086642784fa31fc384e1d7"},
+ {file = "cryptography-44.0.2-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29ecec49f3ba3f3849362854b7253a9f59799e3763b0c9d0826259a88efa02f1"},
+ {file = "cryptography-44.0.2-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc821e161ae88bfe8088d11bb39caf2916562e0a2dc7b6d56714a48b784ef0bb"},
+ {file = "cryptography-44.0.2-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:3c00b6b757b32ce0f62c574b78b939afab9eecaf597c4d624caca4f9e71e7843"},
+ {file = "cryptography-44.0.2-cp37-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:7bdcd82189759aba3816d1f729ce42ffded1ac304c151d0a8e89b9996ab863d5"},
+ {file = "cryptography-44.0.2-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:4973da6ca3db4405c54cd0b26d328be54c7747e89e284fcff166132eb7bccc9c"},
+ {file = "cryptography-44.0.2-cp37-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:4e389622b6927d8133f314949a9812972711a111d577a5d1f4bee5e58736b80a"},
+ {file = "cryptography-44.0.2-cp37-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:f514ef4cd14bb6fb484b4a60203e912cfcb64f2ab139e88c2274511514bf7308"},
+ {file = "cryptography-44.0.2-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:1bc312dfb7a6e5d66082c87c34c8a62176e684b6fe3d90fcfe1568de675e6688"},
+ {file = "cryptography-44.0.2-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:3b721b8b4d948b218c88cb8c45a01793483821e709afe5f622861fc6182b20a7"},
+ {file = "cryptography-44.0.2-cp37-abi3-win32.whl", hash = "sha256:51e4de3af4ec3899d6d178a8c005226491c27c4ba84101bfb59c901e10ca9f79"},
+ {file = "cryptography-44.0.2-cp37-abi3-win_amd64.whl", hash = "sha256:c505d61b6176aaf982c5717ce04e87da5abc9a36a5b39ac03905c4aafe8de7aa"},
+ {file = "cryptography-44.0.2-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:8e0ddd63e6bf1161800592c71ac794d3fb8001f2caebe0966e77c5234fa9efc3"},
+ {file = "cryptography-44.0.2-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:81276f0ea79a208d961c433a947029e1a15948966658cf6710bbabb60fcc2639"},
+ {file = "cryptography-44.0.2-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a1e657c0f4ea2a23304ee3f964db058c9e9e635cc7019c4aa21c330755ef6fd"},
+ {file = "cryptography-44.0.2-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:6210c05941994290f3f7f175a4a57dbbb2afd9273657614c506d5976db061181"},
+ {file = "cryptography-44.0.2-cp39-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:d1c3572526997b36f245a96a2b1713bf79ce99b271bbcf084beb6b9b075f29ea"},
+ {file = "cryptography-44.0.2-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:b042d2a275c8cee83a4b7ae30c45a15e6a4baa65a179a0ec2d78ebb90e4f6699"},
+ {file = "cryptography-44.0.2-cp39-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:d03806036b4f89e3b13b6218fefea8d5312e450935b1a2d55f0524e2ed7c59d9"},
+ {file = "cryptography-44.0.2-cp39-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:c7362add18b416b69d58c910caa217f980c5ef39b23a38a0880dfd87bdf8cd23"},
+ {file = "cryptography-44.0.2-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:8cadc6e3b5a1f144a039ea08a0bdb03a2a92e19c46be3285123d32029f40a922"},
+ {file = "cryptography-44.0.2-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:6f101b1f780f7fc613d040ca4bdf835c6ef3b00e9bd7125a4255ec574c7916e4"},
+ {file = "cryptography-44.0.2-cp39-abi3-win32.whl", hash = "sha256:3dc62975e31617badc19a906481deacdeb80b4bb454394b4098e3f2525a488c5"},
+ {file = "cryptography-44.0.2-cp39-abi3-win_amd64.whl", hash = "sha256:5f6f90b72d8ccadb9c6e311c775c8305381db88374c65fa1a68250aa8a9cb3a6"},
+ {file = "cryptography-44.0.2-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:af4ff3e388f2fa7bff9f7f2b31b87d5651c45731d3e8cfa0944be43dff5cfbdb"},
+ {file = "cryptography-44.0.2-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:0529b1d5a0105dd3731fa65680b45ce49da4d8115ea76e9da77a875396727b41"},
+ {file = "cryptography-44.0.2-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:7ca25849404be2f8e4b3c59483d9d3c51298a22c1c61a0e84415104dacaf5562"},
+ {file = "cryptography-44.0.2-pp310-pypy310_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:268e4e9b177c76d569e8a145a6939eca9a5fec658c932348598818acf31ae9a5"},
+ {file = "cryptography-44.0.2-pp310-pypy310_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:9eb9d22b0a5d8fd9925a7764a054dca914000607dff201a24c791ff5c799e1fa"},
+ {file = "cryptography-44.0.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:2bf7bf75f7df9715f810d1b038870309342bff3069c5bd8c6b96128cb158668d"},
+ {file = "cryptography-44.0.2-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:909c97ab43a9c0c0b0ada7a1281430e4e5ec0458e6d9244c0e821bbf152f061d"},
+ {file = "cryptography-44.0.2-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:96e7a5e9d6e71f9f4fca8eebfd603f8e86c5225bb18eb621b2c1e50b290a9471"},
+ {file = "cryptography-44.0.2-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:d1b3031093a366ac767b3feb8bcddb596671b3aaff82d4050f984da0c248b615"},
+ {file = "cryptography-44.0.2-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:04abd71114848aa25edb28e225ab5f268096f44cf0127f3d36975bdf1bdf3390"},
+ {file = "cryptography-44.0.2.tar.gz", hash = "sha256:c63454aa261a0cf0c5b4718349629793e9e634993538db841165b3df74f37ec0"},
]
[package.dependencies]
@@ -668,7 +672,7 @@ nox = ["nox (>=2024.4.15)", "nox[uv] (>=2024.3.2) ; python_version >= \"3.8\""]
pep8test = ["check-sdist ; python_version >= \"3.8\"", "click (>=8.0.1)", "mypy (>=1.4)", "ruff (>=0.3.6)"]
sdist = ["build (>=1.0.0)"]
ssh = ["bcrypt (>=3.1.5)"]
-test = ["certifi (>=2024)", "cryptography-vectors (==44.0.1)", "pretend (>=0.7)", "pytest (>=7.4.0)", "pytest-benchmark (>=4.0)", "pytest-cov (>=2.10.1)", "pytest-xdist (>=3.5.0)"]
+test = ["certifi (>=2024)", "cryptography-vectors (==44.0.2)", "pretend (>=0.7)", "pytest (>=7.4.0)", "pytest-benchmark (>=4.0)", "pytest-cov (>=2.10.1)", "pytest-xdist (>=3.5.0)"]
test-randomorder = ["pytest-randomly"]
[[package]]
@@ -862,14 +866,14 @@ typing = ["typing-extensions (>=4.12.2) ; python_version < \"3.11\""]
[[package]]
name = "flake8"
-version = "7.1.1"
+version = "7.1.2"
description = "the modular source code checker: pep8 pyflakes and co"
optional = false
python-versions = ">=3.8.1"
groups = ["dev"]
files = [
- {file = "flake8-7.1.1-py2.py3-none-any.whl", hash = "sha256:597477df7860daa5aa0fdd84bf5208a043ab96b8e96ab708770ae0364dd03213"},
- {file = "flake8-7.1.1.tar.gz", hash = "sha256:049d058491e228e03e67b390f311bbf88fce2dbaa8fa673e7aea87b7198b8d38"},
+ {file = "flake8-7.1.2-py2.py3-none-any.whl", hash = "sha256:1cbc62e65536f65e6d754dfe6f1bada7f5cf392d6f5db3c2b85892466c3e7c1a"},
+ {file = "flake8-7.1.2.tar.gz", hash = "sha256:c586ffd0b41540951ae41af572e6790dbd49fc12b3aa2541685d253d9bd504bd"},
]
[package.dependencies]
@@ -1825,41 +1829,41 @@ files = [
[[package]]
name = "newrelic"
-version = "10.6.0"
+version = "10.7.0"
description = "New Relic Python Agent"
optional = false
python-versions = ">=3.7"
groups = ["main"]
files = [
- {file = "newrelic-10.6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0192ae5b6d624b1dbd5bb5808e0b0846e109d614b38ddfab6328e87bb261d889"},
- {file = "newrelic-10.6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f2cfa6aee9668f6e19c3eba77c851dddbd0bc4c87af2551ad6a56f17a3d5fbe"},
- {file = "newrelic-10.6.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:c532a2ec39b1f8fbeba7b557ae2d0cb3440012a0ecbbd138b6a137ecd90224c9"},
- {file = "newrelic-10.6.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b282a069984e3bf3bc810eaf988165eb0e8dccc99b3c34d7c0f34c7649093fbe"},
- {file = "newrelic-10.6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5682142c7f94ca1294b51e3c49cb3ef64580ce36ff223efa23fbc2f34e7fb392"},
- {file = "newrelic-10.6.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6cc7d1df935239613582d592253fbe3a961f372c9f2568e4e8b0937caf8f072b"},
- {file = "newrelic-10.6.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:659991fc2f5149b4f7711e7f51c0a76ac1bdef7ca0b5f1b4806c21ed05553963"},
- {file = "newrelic-10.6.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c657a50cc831d80bff310022106e1086c224b50a114241cb61194921498bcd5c"},
- {file = "newrelic-10.6.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8af1c6cea8ffdb185fcfe871f61ab2de8471c71b1d417f07a93e6fe7713f012a"},
- {file = "newrelic-10.6.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3af6f16cfa95d187a37be26ef44f73b15c33b3600c14d4936fc77666a26192e6"},
- {file = "newrelic-10.6.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a64e99fe3bb0a5bb9f942053291214659345064f79355f1cb1753b2ae3989792"},
- {file = "newrelic-10.6.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:120bce9635c39e8f444e127132e08cf536a042138c5688c6bce27dbfd44caf6f"},
- {file = "newrelic-10.6.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b539ebb8e624b797a4dd35ef742a11148f16d8d9b4da5b4b4c77c33a354e9206"},
- {file = "newrelic-10.6.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:abe82936cd60d9ebfb3573311c9ca4c22682f3ca5a27baa2bf5f9e26a7a4ed7e"},
- {file = "newrelic-10.6.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f3a9c60cd1b4b76acab30306d30b95b90fd19eaa38c34ef84dcaade7a6894426"},
- {file = "newrelic-10.6.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:eb69b15f2f917fd7874e05f0444752ae1cc1eb63028814ab77033babfc6329e5"},
- {file = "newrelic-10.6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c8ca468375f5959867fda7bbe90f2d80ca32aae6c5d632e3234e32064013e439"},
- {file = "newrelic-10.6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:319c4df59515d214ae91fd6c46cc7fc120217ffc38a080689fd9930b3b2a7530"},
- {file = "newrelic-10.6.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:23fc4539240bb8a5c131d56f0d2d982c253ee2adf6e2dff945daaab07ef5e527"},
- {file = "newrelic-10.6.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:89b304474705254d94cfc82d58a505f18c5bba029aaec32fba15ba582cb2c849"},
- {file = "newrelic-10.6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:465f4f8be765121a6e1d215184b61b8c6c5bb24106f7e3f1443cffe14f647e8f"},
- {file = "newrelic-10.6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:579d146ff0309e93af712759df8732e7d23a7c676dc1e38c2ac32af46be15f5d"},
- {file = "newrelic-10.6.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:07b31b0970ad4b160a9481f1bd908250aa39ee8d7f2a4fa1d88b13c360361241"},
- {file = "newrelic-10.6.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:2c9f39b6b1154dfa21831d7632b53cd1fa1a2b4069a273dead1a40186621688e"},
- {file = "newrelic-10.6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8ba77efcbf1aaa902cdc546480fa05af6e907e4334798b53ab08f34be1d13a9c"},
- {file = "newrelic-10.6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eaf6f29b82845355faa32e719d246a63b29d2b8cbd406cc31a4991dc213c4813"},
- {file = "newrelic-10.6.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:275d930c60cb534e26dd2aaa61e5c25b6312d63fef011055203d3f6a26e20863"},
- {file = "newrelic-10.6.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:43a8aafc4a5d844192872a94d9033f4721693a6c0950750f5a0b0e448821831b"},
- {file = "newrelic-10.6.0.tar.gz", hash = "sha256:46d6f39a9cb89cca2440211e272e6a13bb89802865a4c2b2cd9d613c1488c3ba"},
+ {file = "newrelic-10.7.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:08e959814e0b23a8f96383955cceecb6180dc66f240279c45ee8484058f96eb4"},
+ {file = "newrelic-10.7.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e12b7e88e0d78497b4e3dfca0411a76a548ee15842b9d6ef971035bbdc91693"},
+ {file = "newrelic-10.7.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:4125d02c016c3b4a0f88d5ce184d78d4101531d1f76525f7f1ee750e453603f1"},
+ {file = "newrelic-10.7.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:680a75e3dd37e86bf1eef2b77408dd1953c94a7b803b56e6f8c3f42164580e35"},
+ {file = "newrelic-10.7.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:877b53049be9dfb3ad2845f00c57a3eb1aadeaec700f09a8f6c7fec1f6e71c2b"},
+ {file = "newrelic-10.7.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f02916527900f6d209682d3dd77c964fb38ca7d84c31a293085e4a84fa35957d"},
+ {file = "newrelic-10.7.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:683b5158203e28e46b348f9657054eb25cfb7367e21524a457235d9c5a5cc4ed"},
+ {file = "newrelic-10.7.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:dac3003f22e1edd564f7d7556c84f1fb2f61140c46040befa626bdc8f69a4a89"},
+ {file = "newrelic-10.7.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4fd86115079045e5a9630168ae1a48fdef7f2782c9268d1f04a7ae7716a6129d"},
+ {file = "newrelic-10.7.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ecf6a0b560b10c72fd592c1dcb6ea8812e7876d6e30709b6c5184fdd4e399d62"},
+ {file = "newrelic-10.7.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:30b1c668beb12b9627bac6b037f9a2e3f374e678a75c57f63566a4a7ea055e9e"},
+ {file = "newrelic-10.7.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:9319828bc2b46b9a25a88a97fab1a9e05a4c9d4bed484206f59e04e2f7cbd1cd"},
+ {file = "newrelic-10.7.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6855485d0de0f02271f67617c7a63b44c44f46e50763f37a016a1a117ae8af56"},
+ {file = "newrelic-10.7.0-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e78adc209e24cc223ac19104616caa3b8cb789d1ed97d082472d3b7e9d04023d"},
+ {file = "newrelic-10.7.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bc1f090a115688fe7829e7aea1dcf37913a24450813908d9ce6b4eb0831cbbbf"},
+ {file = "newrelic-10.7.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:cf6b8f12abf9c984a4e62b0de66d85e2c5153f367dd6d4149544d931e59bcb8d"},
+ {file = "newrelic-10.7.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:64708227cf2d56f96f1d2697b23cc5be4952bbd790f0ba63164bedcdbbb457fc"},
+ {file = "newrelic-10.7.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a03832922d05530088aab9acb84bc7758cc8196305852652abb6face3c346ede"},
+ {file = "newrelic-10.7.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:e97b3239159d9a178c07043e9da56e841de2b56b947070b7038ddcb93f99fba0"},
+ {file = "newrelic-10.7.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:32f089e276f36b73de62c61ba7648d77de70893fe4d9a7c15f95e20f4978f461"},
+ {file = "newrelic-10.7.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:83bdce11a0a5929ed5ab5db420f54224662c97fbce4fb6efbe27633ad54d30e2"},
+ {file = "newrelic-10.7.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a6b906d8098cd15639f02152a3c94c879c5a841b177b7ee2e6e13ca3a0f37cf"},
+ {file = "newrelic-10.7.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:96f805812a912a8a4008b6f28e109e0d8943c80dd136980a9d3914be5e75a416"},
+ {file = "newrelic-10.7.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:8d47f6041c3f28844eaa9cdf0905415fe5fc617ee6623c391532830a1205133e"},
+ {file = "newrelic-10.7.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ad5b78a6997ce237185e3911d9a616de0781f600031d53ecce1edeafcca0c79"},
+ {file = "newrelic-10.7.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:772a3c1b5fae12253629771cf677197be48c481c4c6ee7a6233a469dc7e37057"},
+ {file = "newrelic-10.7.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:650e1818ee404ace26efb2935e6326dbcbf754fbea496710da3889e224c4bcf1"},
+ {file = "newrelic-10.7.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:fd2f3d2d290555764b587d35700069581dece2158b73e865f9adc6ccbba4375b"},
+ {file = "newrelic-10.7.0.tar.gz", hash = "sha256:ac9716c115ddcf54b54115391a84ed2c318ae943b4f598b4d0248cd6edb12414"},
]
[package.extras]
@@ -1895,48 +1899,67 @@ requests = ">=2.0.0"
[[package]]
name = "numpy"
-version = "1.26.4"
+version = "2.2.3"
description = "Fundamental package for array computing in Python"
optional = false
-python-versions = ">=3.9"
+python-versions = ">=3.10"
groups = ["main"]
files = [
- {file = "numpy-1.26.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9ff0f4f29c51e2803569d7a51c2304de5554655a60c5d776e35b4a41413830d0"},
- {file = "numpy-1.26.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e4ee3380d6de9c9ec04745830fd9e2eccb3e6cf790d39d7b98ffd19b0dd754a"},
- {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d209d8969599b27ad20994c8e41936ee0964e6da07478d6c35016bc386b66ad4"},
- {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ffa75af20b44f8dba823498024771d5ac50620e6915abac414251bd971b4529f"},
- {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:62b8e4b1e28009ef2846b4c7852046736bab361f7aeadeb6a5b89ebec3c7055a"},
- {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a4abb4f9001ad2858e7ac189089c42178fcce737e4169dc61321660f1a96c7d2"},
- {file = "numpy-1.26.4-cp310-cp310-win32.whl", hash = "sha256:bfe25acf8b437eb2a8b2d49d443800a5f18508cd811fea3181723922a8a82b07"},
- {file = "numpy-1.26.4-cp310-cp310-win_amd64.whl", hash = "sha256:b97fe8060236edf3662adfc2c633f56a08ae30560c56310562cb4f95500022d5"},
- {file = "numpy-1.26.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c66707fabe114439db9068ee468c26bbdf909cac0fb58686a42a24de1760c71"},
- {file = "numpy-1.26.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:edd8b5fe47dab091176d21bb6de568acdd906d1887a4584a15a9a96a1dca06ef"},
- {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab55401287bfec946ced39700c053796e7cc0e3acbef09993a9ad2adba6ca6e"},
- {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:666dbfb6ec68962c033a450943ded891bed2d54e6755e35e5835d63f4f6931d5"},
- {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:96ff0b2ad353d8f990b63294c8986f1ec3cb19d749234014f4e7eb0112ceba5a"},
- {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:60dedbb91afcbfdc9bc0b1f3f402804070deed7392c23eb7a7f07fa857868e8a"},
- {file = "numpy-1.26.4-cp311-cp311-win32.whl", hash = "sha256:1af303d6b2210eb850fcf03064d364652b7120803a0b872f5211f5234b399f20"},
- {file = "numpy-1.26.4-cp311-cp311-win_amd64.whl", hash = "sha256:cd25bcecc4974d09257ffcd1f098ee778f7834c3ad767fe5db785be9a4aa9cb2"},
- {file = "numpy-1.26.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b3ce300f3644fb06443ee2222c2201dd3a89ea6040541412b8fa189341847218"},
- {file = "numpy-1.26.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:03a8c78d01d9781b28a6989f6fa1bb2c4f2d51201cf99d3dd875df6fbd96b23b"},
- {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9fad7dcb1aac3c7f0584a5a8133e3a43eeb2fe127f47e3632d43d677c66c102b"},
- {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:675d61ffbfa78604709862923189bad94014bef562cc35cf61d3a07bba02a7ed"},
- {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ab47dbe5cc8210f55aa58e4805fe224dac469cde56b9f731a4c098b91917159a"},
- {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1dda2e7b4ec9dd512f84935c5f126c8bd8b9f2fc001e9f54af255e8c5f16b0e0"},
- {file = "numpy-1.26.4-cp312-cp312-win32.whl", hash = "sha256:50193e430acfc1346175fcbdaa28ffec49947a06918b7b92130744e81e640110"},
- {file = "numpy-1.26.4-cp312-cp312-win_amd64.whl", hash = "sha256:08beddf13648eb95f8d867350f6a018a4be2e5ad54c8d8caed89ebca558b2818"},
- {file = "numpy-1.26.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7349ab0fa0c429c82442a27a9673fc802ffdb7c7775fad780226cb234965e53c"},
- {file = "numpy-1.26.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:52b8b60467cd7dd1e9ed082188b4e6bb35aa5cdd01777621a1658910745b90be"},
- {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5241e0a80d808d70546c697135da2c613f30e28251ff8307eb72ba696945764"},
- {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f870204a840a60da0b12273ef34f7051e98c3b5961b61b0c2c1be6dfd64fbcd3"},
- {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:679b0076f67ecc0138fd2ede3a8fd196dddc2ad3254069bcb9faf9a79b1cebcd"},
- {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:47711010ad8555514b434df65f7d7b076bb8261df1ca9bb78f53d3b2db02e95c"},
- {file = "numpy-1.26.4-cp39-cp39-win32.whl", hash = "sha256:a354325ee03388678242a4d7ebcd08b5c727033fcff3b2f536aea978e15ee9e6"},
- {file = "numpy-1.26.4-cp39-cp39-win_amd64.whl", hash = "sha256:3373d5d70a5fe74a2c1bb6d2cfd9609ecf686d47a2d7b1d37a8f3b6bf6003aea"},
- {file = "numpy-1.26.4-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:afedb719a9dcfc7eaf2287b839d8198e06dcd4cb5d276a3df279231138e83d30"},
- {file = "numpy-1.26.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95a7476c59002f2f6c590b9b7b998306fba6a5aa646b1e22ddfeaf8f78c3a29c"},
- {file = "numpy-1.26.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7e50d0a0cc3189f9cb0aeb3a6a6af18c16f59f004b866cd2be1c14b36134a4a0"},
- {file = "numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010"},
+ {file = "numpy-2.2.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:cbc6472e01952d3d1b2772b720428f8b90e2deea8344e854df22b0618e9cce71"},
+ {file = "numpy-2.2.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cdfe0c22692a30cd830c0755746473ae66c4a8f2e7bd508b35fb3b6a0813d787"},
+ {file = "numpy-2.2.3-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:e37242f5324ffd9f7ba5acf96d774f9276aa62a966c0bad8dae692deebec7716"},
+ {file = "numpy-2.2.3-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:95172a21038c9b423e68be78fd0be6e1b97674cde269b76fe269a5dfa6fadf0b"},
+ {file = "numpy-2.2.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5b47c440210c5d1d67e1cf434124e0b5c395eee1f5806fdd89b553ed1acd0a3"},
+ {file = "numpy-2.2.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0391ea3622f5c51a2e29708877d56e3d276827ac5447d7f45e9bc4ade8923c52"},
+ {file = "numpy-2.2.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f6b3dfc7661f8842babd8ea07e9897fe3d9b69a1d7e5fbb743e4160f9387833b"},
+ {file = "numpy-2.2.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:1ad78ce7f18ce4e7df1b2ea4019b5817a2f6a8a16e34ff2775f646adce0a5027"},
+ {file = "numpy-2.2.3-cp310-cp310-win32.whl", hash = "sha256:5ebeb7ef54a7be11044c33a17b2624abe4307a75893c001a4800857956b41094"},
+ {file = "numpy-2.2.3-cp310-cp310-win_amd64.whl", hash = "sha256:596140185c7fa113563c67c2e894eabe0daea18cf8e33851738c19f70ce86aeb"},
+ {file = "numpy-2.2.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:16372619ee728ed67a2a606a614f56d3eabc5b86f8b615c79d01957062826ca8"},
+ {file = "numpy-2.2.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5521a06a3148686d9269c53b09f7d399a5725c47bbb5b35747e1cb76326b714b"},
+ {file = "numpy-2.2.3-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:7c8dde0ca2f77828815fd1aedfdf52e59071a5bae30dac3b4da2a335c672149a"},
+ {file = "numpy-2.2.3-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:77974aba6c1bc26e3c205c2214f0d5b4305bdc719268b93e768ddb17e3fdd636"},
+ {file = "numpy-2.2.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d42f9c36d06440e34226e8bd65ff065ca0963aeecada587b937011efa02cdc9d"},
+ {file = "numpy-2.2.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2712c5179f40af9ddc8f6727f2bd910ea0eb50206daea75f58ddd9fa3f715bb"},
+ {file = "numpy-2.2.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c8b0451d2ec95010d1db8ca733afc41f659f425b7f608af569711097fd6014e2"},
+ {file = "numpy-2.2.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d9b4a8148c57ecac25a16b0e11798cbe88edf5237b0df99973687dd866f05e1b"},
+ {file = "numpy-2.2.3-cp311-cp311-win32.whl", hash = "sha256:1f45315b2dc58d8a3e7754fe4e38b6fce132dab284a92851e41b2b344f6441c5"},
+ {file = "numpy-2.2.3-cp311-cp311-win_amd64.whl", hash = "sha256:9f48ba6f6c13e5e49f3d3efb1b51c8193215c42ac82610a04624906a9270be6f"},
+ {file = "numpy-2.2.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:12c045f43b1d2915eca6b880a7f4a256f59d62df4f044788c8ba67709412128d"},
+ {file = "numpy-2.2.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:87eed225fd415bbae787f93a457af7f5990b92a334e346f72070bf569b9c9c95"},
+ {file = "numpy-2.2.3-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:712a64103d97c404e87d4d7c47fb0c7ff9acccc625ca2002848e0d53288b90ea"},
+ {file = "numpy-2.2.3-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:a5ae282abe60a2db0fd407072aff4599c279bcd6e9a2475500fc35b00a57c532"},
+ {file = "numpy-2.2.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5266de33d4c3420973cf9ae3b98b54a2a6d53a559310e3236c4b2b06b9c07d4e"},
+ {file = "numpy-2.2.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b787adbf04b0db1967798dba8da1af07e387908ed1553a0d6e74c084d1ceafe"},
+ {file = "numpy-2.2.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:34c1b7e83f94f3b564b35f480f5652a47007dd91f7c839f404d03279cc8dd021"},
+ {file = "numpy-2.2.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:4d8335b5f1b6e2bce120d55fb17064b0262ff29b459e8493d1785c18ae2553b8"},
+ {file = "numpy-2.2.3-cp312-cp312-win32.whl", hash = "sha256:4d9828d25fb246bedd31e04c9e75714a4087211ac348cb39c8c5f99dbb6683fe"},
+ {file = "numpy-2.2.3-cp312-cp312-win_amd64.whl", hash = "sha256:83807d445817326b4bcdaaaf8e8e9f1753da04341eceec705c001ff342002e5d"},
+ {file = "numpy-2.2.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:7bfdb06b395385ea9b91bf55c1adf1b297c9fdb531552845ff1d3ea6e40d5aba"},
+ {file = "numpy-2.2.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:23c9f4edbf4c065fddb10a4f6e8b6a244342d95966a48820c614891e5059bb50"},
+ {file = "numpy-2.2.3-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:a0c03b6be48aaf92525cccf393265e02773be8fd9551a2f9adbe7db1fa2b60f1"},
+ {file = "numpy-2.2.3-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:2376e317111daa0a6739e50f7ee2a6353f768489102308b0d98fcf4a04f7f3b5"},
+ {file = "numpy-2.2.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8fb62fe3d206d72fe1cfe31c4a1106ad2b136fcc1606093aeab314f02930fdf2"},
+ {file = "numpy-2.2.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:52659ad2534427dffcc36aac76bebdd02b67e3b7a619ac67543bc9bfe6b7cdb1"},
+ {file = "numpy-2.2.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1b416af7d0ed3271cad0f0a0d0bee0911ed7eba23e66f8424d9f3dfcdcae1304"},
+ {file = "numpy-2.2.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:1402da8e0f435991983d0a9708b779f95a8c98c6b18a171b9f1be09005e64d9d"},
+ {file = "numpy-2.2.3-cp313-cp313-win32.whl", hash = "sha256:136553f123ee2951bfcfbc264acd34a2fc2f29d7cdf610ce7daf672b6fbaa693"},
+ {file = "numpy-2.2.3-cp313-cp313-win_amd64.whl", hash = "sha256:5b732c8beef1d7bc2d9e476dbba20aaff6167bf205ad9aa8d30913859e82884b"},
+ {file = "numpy-2.2.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:435e7a933b9fda8126130b046975a968cc2d833b505475e588339e09f7672890"},
+ {file = "numpy-2.2.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:7678556eeb0152cbd1522b684dcd215250885993dd00adb93679ec3c0e6e091c"},
+ {file = "numpy-2.2.3-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:2e8da03bd561504d9b20e7a12340870dfc206c64ea59b4cfee9fceb95070ee94"},
+ {file = "numpy-2.2.3-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:c9aa4496fd0e17e3843399f533d62857cef5900facf93e735ef65aa4bbc90ef0"},
+ {file = "numpy-2.2.3-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f4ca91d61a4bf61b0f2228f24bbfa6a9facd5f8af03759fe2a655c50ae2c6610"},
+ {file = "numpy-2.2.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:deaa09cd492e24fd9b15296844c0ad1b3c976da7907e1c1ed3a0ad21dded6f76"},
+ {file = "numpy-2.2.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:246535e2f7496b7ac85deffe932896a3577be7af8fb7eebe7146444680297e9a"},
+ {file = "numpy-2.2.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:daf43a3d1ea699402c5a850e5313680ac355b4adc9770cd5cfc2940e7861f1bf"},
+ {file = "numpy-2.2.3-cp313-cp313t-win32.whl", hash = "sha256:cf802eef1f0134afb81fef94020351be4fe1d6681aadf9c5e862af6602af64ef"},
+ {file = "numpy-2.2.3-cp313-cp313t-win_amd64.whl", hash = "sha256:aee2512827ceb6d7f517c8b85aa5d3923afe8fc7a57d028cffcd522f1c6fd082"},
+ {file = "numpy-2.2.3-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:3c2ec8a0f51d60f1e9c0c5ab116b7fc104b165ada3f6c58abf881cb2eb16044d"},
+ {file = "numpy-2.2.3-pp310-pypy310_pp73-macosx_14_0_x86_64.whl", hash = "sha256:ed2cf9ed4e8ebc3b754d398cba12f24359f018b416c380f577bbae112ca52fc9"},
+ {file = "numpy-2.2.3-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:39261798d208c3095ae4f7bc8eaeb3481ea8c6e03dc48028057d3cbdbdb8937e"},
+ {file = "numpy-2.2.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:783145835458e60fa97afac25d511d00a1eca94d4a8f3ace9fe2043003c678e4"},
+ {file = "numpy-2.2.3.tar.gz", hash = "sha256:dbdc15f0c81611925f382dfa97b3bd0bc2c1ce19d4fe50482cb0ddc12ba30020"},
]
[[package]]
@@ -2167,14 +2190,14 @@ testing = ["pytest", "pytest-benchmark"]
[[package]]
name = "pre-commit"
-version = "3.8.0"
+version = "4.1.0"
description = "A framework for managing and maintaining multi-language pre-commit hooks."
optional = false
python-versions = ">=3.9"
groups = ["dev"]
files = [
- {file = "pre_commit-3.8.0-py2.py3-none-any.whl", hash = "sha256:9a90a53bf82fdd8778d58085faf8d83df56e40dfe18f45b19446e26bf1b3a63f"},
- {file = "pre_commit-3.8.0.tar.gz", hash = "sha256:8bb6494d4a20423842e198980c9ecf9f96607a07ea29549e180eef9ae80fe7af"},
+ {file = "pre_commit-4.1.0-py2.py3-none-any.whl", hash = "sha256:d29e7cb346295bcc1cc75fc3e92e343495e3ea0196c9ec6ba53f49f10ab6ae7b"},
+ {file = "pre_commit-4.1.0.tar.gz", hash = "sha256:ae3f018575a588e30dfddfab9a05448bfbd6b73d78709617b5a2b853549716d4"},
]
[package.dependencies]
@@ -2614,16 +2637,19 @@ cli = ["click (>=5.0)"]
[[package]]
name = "python-json-logger"
-version = "2.0.7"
-description = "A python library adding a json log formatter"
+version = "3.3.0"
+description = "JSON Log Formatter for the Python Logging Package"
optional = false
-python-versions = ">=3.6"
+python-versions = ">=3.8"
groups = ["main"]
files = [
- {file = "python-json-logger-2.0.7.tar.gz", hash = "sha256:23e7ec02d34237c5aa1e29a070193a4ea87583bb4e7f8fd06d3de8264c4b2e1c"},
- {file = "python_json_logger-2.0.7-py3-none-any.whl", hash = "sha256:f380b826a991ebbe3de4d897aeec42760035ac760345e57b812938dc8b35e2bd"},
+ {file = "python_json_logger-3.3.0-py3-none-any.whl", hash = "sha256:dd980fae8cffb24c13caf6e158d3d61c0d6d22342f932cb6e9deedab3d35eec7"},
+ {file = "python_json_logger-3.3.0.tar.gz", hash = "sha256:12b7e74b17775e7d565129296105bbe3910842d9d0eb083fc83a6a617aa8df84"},
]
+[package.extras]
+dev = ["backports.zoneinfo ; python_version < \"3.9\"", "black", "build", "freezegun", "mdx_truly_sane_lists", "mike", "mkdocs", "mkdocs-awesome-pages-plugin", "mkdocs-gen-files", "mkdocs-literate-nav", "mkdocs-material (>=8.5)", "mkdocstrings[python]", "msgspec ; implementation_name != \"pypy\"", "mypy", "orjson ; implementation_name != \"pypy\"", "pylint", "pytest", "tzdata", "validate-pyproject[all]"]
+
[[package]]
name = "python-slugify"
version = "8.0.4"
@@ -2738,14 +2764,14 @@ toml = ["tomli (>=2.0.1)"]
[[package]]
name = "redis"
-version = "5.2.0"
+version = "5.2.1"
description = "Python client for Redis database and key-value store"
optional = false
python-versions = ">=3.8"
groups = ["main"]
files = [
- {file = "redis-5.2.0-py3-none-any.whl", hash = "sha256:ae174f2bb3b1bf2b09d54bf3e51fbc1469cf6c10aa03e21141f51969801a7897"},
- {file = "redis-5.2.0.tar.gz", hash = "sha256:0b1087665a771b1ff2e003aa5bdd354f15a70c9e25d5a7dbf9c722c16528a7b0"},
+ {file = "redis-5.2.1-py3-none-any.whl", hash = "sha256:ee7e1056b9aea0f04c6c2ed59452947f34c4940ee025f5dd83e6a6418b6989e4"},
+ {file = "redis-5.2.1.tar.gz", hash = "sha256:16f2e22dff21d5125e8481515e386711a34cbec50f0e44413dd7d9c060a54e0f"},
]
[package.extras]
@@ -3295,4 +3321,4 @@ files = [
[metadata]
lock-version = "2.1"
python-versions = "^3.12.2"
-content-hash = "f80e4d189974fbf18727e7c017b9a56cb0a4583ddc33d64c0026ba78016dfe0c"
+content-hash = "3ae29fdc9d8ea519fe34c0862a447d1401823b00610dc67bce69b668d948986c"
diff --git a/pyproject.toml b/pyproject.toml
index b8cb29731..a2efc54b0 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -43,17 +43,17 @@ boto3 = "^1.34.156"
botocore = "^1.35.99"
cachetools = "^5.4.0"
cffi = "^1.16.0"
-cryptography = "^44.0.1"
+cryptography = "^44.0.2"
flask-redis = "^0.4.0"
geojson = "^3.1.0"
jmespath = "^1.0.1"
mistune = "0.8.4"
-numpy = "^1.26.4"
+numpy = "^2.2.3"
ordered-set = "^4.1.0"
phonenumbers = "^8.13.52"
pycparser = "^2.22"
-python-json-logger = "^2.0.7"
-redis = "^5.0.8"
+python-json-logger = "^3.3.0"
+redis = "^5.2.1"
regex = "^2024.7.24"
s3transfer = "^0.10.2"
shapely = "^2.0.5"
@@ -78,7 +78,7 @@ black = "^24.2.0"
coverage = "*"
detect-secrets = "^1.5.0"
freezegun = "^1.5.1"
-flake8 = "^7.1.0"
+flake8 = "^7.1.2"
flake8-bugbear = "^24.1.17"
flake8-print = "^5.0.0"
flake8-pytest-style = "^2.0.0"
@@ -86,7 +86,7 @@ isort = "^5.13.2"
jinja2-cli = {version = "==0.8.2", extras = ["yaml"]}
moto = "*"
pip-audit = "*"
-pre-commit = "^3.8.0"
+pre-commit = "^4.1.0"
pytest = "^8.3.2"
pytest-env = "^1.1.3"
pytest-mock = "^3.14.0"
diff --git a/tests/app/main/test_validators.py b/tests/app/main/test_validators.py
index 09100f710..aaa79ad40 100644
--- a/tests/app/main/test_validators.py
+++ b/tests/app/main/test_validators.py
@@ -71,15 +71,13 @@ def test_sms_character_validation(client_request, msg):
(
"∆ abc 📲 def 📵 ghi",
(
- "You cannot use ∆, 📲 or 📵 in text messages. "
- "They will not show up properly on everyone’s phones."
+ "Please remove the unaccepted character ∆, 📲 and 📵 in your message, then save again"
),
),
(
"📵",
(
- "You cannot use 📵 in text messages. "
- "It will not show up properly on everyone’s phones."
+ "Please remove the unaccepted character 📵 in your message, then save again"
),
),
],
diff --git a/tests/app/main/views/organizations/test_organizations.py b/tests/app/main/views/organizations/test_organizations.py
index 0e781ab82..f04937e9b 100644
--- a/tests/app/main/views/organizations/test_organizations.py
+++ b/tests/app/main/views/organizations/test_organizations.py
@@ -824,7 +824,7 @@ def test_manage_org_users_should_show_live_search_if_more_than_7_users(
assert not page.select_one("[data-force-focus]")
assert textbox["class"] == ["usa-input"]
assert (
- normalize_spaces(page.select_one("label[for=search]").text)
+ normalize_spaces(page.select_one("label[class=usa-label]").text)
== "Search by name or email address"
)
@@ -982,20 +982,13 @@ def test_view_organization_settings(
page = client_request.get(endpoint, org_id=organization_one["id"])
radios = page.select("input[type=radio]")
+ labels = page.select("label.usa-radio__label") # Select all radio labels in order
for index, option in enumerate(expected_options):
option_values = {
"value": radios[index]["value"],
- "label": normalize_spaces(
- page.select_one("label[for={}]".format(radios[index]["id"])).text
- ),
+ "label": normalize_spaces(labels[index].text), # Match labels using index
}
- if "hint" in option:
- option_values["hint"] = normalize_spaces(
- page.select_one(
- "label[for={}] + .usa-hint".format(radios[index]["id"])
- ).text
- )
assert option_values == option
if expected_selected:
@@ -1082,7 +1075,7 @@ def test_update_organization_sector_sends_service_id_data_to_api_client(
client_request.post(
"main.edit_organization_type",
org_id=organization_one["id"],
- _data={"organization_type": "federal"},
+ _data={"organization_type": "state"},
_expected_status=302,
_expected_redirect=url_for(
"main.organization_settings",
@@ -1093,7 +1086,7 @@ def test_update_organization_sector_sends_service_id_data_to_api_client(
mock_update_organization.assert_called_once_with(
organization_one["id"],
cached_service_ids=["12345", "67890", SERVICE_ONE_ID],
- organization_type="federal",
+ organization_type="state",
)
diff --git a/tests/app/main/views/service_settings/test_service_settings.py b/tests/app/main/views/service_settings/test_service_settings.py
index a9895ef99..6c4e42fac 100644
--- a/tests/app/main/views/service_settings/test_service_settings.py
+++ b/tests/app/main/views/service_settings/test_service_settings.py
@@ -466,14 +466,32 @@ def test_show_switch_service_to_count_as_live_page(
"main.service_switch_count_as_live",
service_id=SERVICE_ONE_ID,
)
- assert page.select_one("[checked]")["value"] == selected
- assert (
- page.select_one(
- "label[for={}]".format(page.select_one("[checked]")["id"])
- ).text.strip()
- == labelled
+
+ client_request.login(platform_admin_user)
+ page = client_request.get(
+ "main.service_switch_count_as_live",
+ service_id=SERVICE_ONE_ID,
)
+ # Find the checked radio button
+ checked_input = page.select_one("[checked]")
+
+ # Ensure we actually found a checked input
+ assert checked_input is not None, "No checked radio button found"
+
+ # Check that the selected value is as expected
+ assert checked_input["value"] == selected
+
+ # Find all labels
+ labels = page.select("label.usa-radio__label")
+
+ # Extract label text and see if it matches the expected label
+ label_texts = [label.text.strip() for label in labels]
+
+ assert (
+ labelled in label_texts
+ ), f"Expected label '{labelled}' not found. Found labels: {label_texts}"
+
@pytest.mark.parametrize(
("post_data", "expected_persisted_value"),
@@ -1320,7 +1338,7 @@ def test_shows_delete_link_for_error_on_post_request_for_edit_email_reply_to_add
== "Error: Enter a valid email address"
)
assert (
- page.select_one("input#email_address").get("value")
+ page.select_one("input#reply-to-email-address").get("value")
== "not a valid email address"
)
@@ -2372,11 +2390,13 @@ def test_send_files_by_email_contact_details_prefills_the_form_with_the_existing
page = client_request.get(
"main.send_files_by_email_contact_details", service_id=SERVICE_ONE_ID
)
+
assert page.find(
"input", attrs={"name": "contact_details_type", "value": contact_details_type}
).has_attr("checked")
+
assert (
- page.find("input", {"id": contact_details_type}).get("value")
+ page.find("input", {"name": contact_details_type}).get("value")
== contact_details_value
)
diff --git a/tests/app/main/views/test_activity.py b/tests/app/main/views/test_activity.py
index 8d583223e..753931ce5 100644
--- a/tests/app/main/views/test_activity.py
+++ b/tests/app/main/views/test_activity.py
@@ -388,7 +388,10 @@ def test_search_recipient_form(
query_dict = parse_qs(url.query)
assert query_dict == {}
- assert page.select_one("label[for=to]").text.strip() == expected_search_box_label
+ assert (
+ page.select_one("label:contains('Search by')").text.strip()
+ == expected_search_box_label
+ )
recipient_inputs = page.select("input[name=to]")
assert len(recipient_inputs) == 2
@@ -421,7 +424,10 @@ def test_api_users_are_told_they_can_search_by_reference_when_service_has_api_ke
service_id=SERVICE_ONE_ID,
message_type=message_type,
)
- assert page.select_one("label[for=to]").text.strip() == expected_search_box_label
+ assert (
+ page.select_one("label:contains('Search by')").text.strip()
+ == expected_search_box_label
+ )
@pytest.mark.parametrize(
@@ -448,7 +454,11 @@ def test_api_users_are_not_told_they_can_search_by_reference_when_service_has_no
service_id=SERVICE_ONE_ID,
message_type=message_type,
)
- assert page.select_one("label[for=to]").text.strip() == expected_search_box_label
+
+ assert (
+ page.select_one("label:contains('Search by')").text.strip()
+ == expected_search_box_label
+ )
def test_should_show_notifications_for_a_service_with_next_previous(
diff --git a/tests/app/main/views/test_dashboard.py b/tests/app/main/views/test_dashboard.py
index 32d6b9bee..167f602fc 100644
--- a/tests/app/main/views/test_dashboard.py
+++ b/tests/app/main/views/test_dashboard.py
@@ -1,5 +1,4 @@
import copy
-import json
from datetime import datetime
from unittest.mock import patch
from zoneinfo import ZoneInfo
@@ -9,7 +8,6 @@ from flask import url_for
from freezegun import freeze_time
from app.main.views.dashboard import (
- aggregate_notifications_stats,
aggregate_status_types,
aggregate_template_usage,
format_monthly_stats_to_list,
@@ -17,12 +15,7 @@ from app.main.views.dashboard import (
get_local_daily_stats_for_last_x_days,
get_tuples_of_financial_years,
)
-from tests import (
- organization_json,
- service_json,
- validate_route_permission,
- validate_route_permission_with_client,
-)
+from tests import organization_json, service_json, validate_route_permission
from tests.conftest import (
ORGANISATION_ID,
SERVICE_ONE_ID,
@@ -330,287 +323,6 @@ def test_inbound_messages_not_visible_to_service_without_permissions(
assert mock_get_inbound_sms_summary.called is False
-def test_inbound_messages_shows_count_of_messages_when_there_are_messages(
- client_request,
- mocker,
- service_one,
- mock_get_service_templates_when_no_templates_exist,
- mock_get_jobs,
- mock_get_scheduled_job_stats,
- mock_get_service_statistics,
- mock_get_template_statistics,
- mock_get_annual_usage_for_service,
- mock_get_free_sms_fragment_limit,
- mock_get_inbound_sms_summary,
-):
- service_one["permissions"] = ["inbound_sms"]
- mocker.patch(
- "app.service_api_client.get_service_message_ratio",
- return_value=mock_service_message_ratio,
- )
- page = client_request.get(
- "main.service_dashboard",
- service_id=SERVICE_ONE_ID,
- )
- mock_get_jobs.assert_called_with(SERVICE_ONE_ID)
- mocker.patch("app.job_api_client.get_jobs", return_value=MOCK_JOBS)
- banner = page.select("a.banner-dashboard")[1]
- assert (
- normalize_spaces(banner.text)
- == "9,999 text messages received latest message just now"
- )
- assert banner["href"] == url_for("main.inbox", service_id=SERVICE_ONE_ID)
-
-
-def test_inbound_messages_shows_count_of_messages_when_there_are_no_messages(
- client_request,
- mocker,
- service_one,
- mock_get_service_templates_when_no_templates_exist,
- mock_get_jobs,
- mock_get_scheduled_job_stats,
- mock_get_service_statistics,
- mock_get_template_statistics,
- mock_get_annual_usage_for_service,
- mock_get_free_sms_fragment_limit,
- mock_get_inbound_sms_summary_with_no_messages,
-):
- service_one["permissions"] = ["inbound_sms"]
- mocker.patch(
- "app.service_api_client.get_service_message_ratio",
- return_value=mock_service_message_ratio,
- )
- page = client_request.get(
- "main.service_dashboard",
- service_id=SERVICE_ONE_ID,
- )
- mock_get_jobs.assert_called_with(SERVICE_ONE_ID)
- mocker.patch("app.job_api_client.get_jobs", return_value=MOCK_JOBS)
- banner = page.select("a.banner-dashboard")[1]
- assert normalize_spaces(banner.text) == "0 text messages received"
- assert banner["href"] == url_for("main.inbox", service_id=SERVICE_ONE_ID)
-
-
-@pytest.mark.parametrize(
- ("index", "expected_row"),
- enumerate(
- [
- "(202) 867-5300 message-1 1 hour ago",
- "(202) 867-5300 message-2 1 hour ago",
- "(202) 867-5300 message-3 1 hour ago",
- "(202) 867-5302 message-4 3 hours ago",
- "+33(0)1 12345678 message-5 5 hours ago",
- "(202) 555-0104 message-6 7 hours ago",
- "(202) 555-0104 message-7 9 hours ago",
- ]
- ),
-)
-def test_inbox_showing_inbound_messages(
- client_request,
- service_one,
- mock_get_service_templates_when_no_templates_exist,
- mock_get_service_statistics,
- mock_get_template_statistics,
- mock_get_annual_usage_for_service,
- mock_get_most_recent_inbound_sms,
- index,
- expected_row,
-):
- service_one["permissions"] = ["inbound_sms"]
-
- page = client_request.get(
- "main.inbox",
- service_id=SERVICE_ONE_ID,
- )
-
- rows = page.select("tbody tr")
- assert len(rows) == 8
- assert normalize_spaces(rows[index].text) == expected_row
- assert page.select_one("a[download]")["href"] == url_for(
- "main.inbox_download",
- service_id=SERVICE_ONE_ID,
- )
-
-
-def test_get_inbound_sms_shows_page_links(
- client_request,
- service_one,
- mock_get_service_templates_when_no_templates_exist,
- mock_get_service_statistics,
- mock_get_template_statistics,
- mock_get_annual_usage_for_service,
- mock_get_most_recent_inbound_sms,
- mock_get_inbound_number_for_service,
-):
- service_one["permissions"] = ["inbound_sms"]
-
- page = client_request.get(
- "main.inbox",
- service_id=SERVICE_ONE_ID,
- page=2,
- )
-
- assert "Next page" in page.find("li", {"class": "next-page"}).text
- assert "Previous page" in page.find("li", {"class": "previous-page"}).text
-
-
-def test_empty_inbox(
- client_request,
- service_one,
- mock_get_service_templates_when_no_templates_exist,
- mock_get_service_statistics,
- mock_get_template_statistics,
- mock_get_annual_usage_for_service,
- mock_get_most_recent_inbound_sms_with_no_messages,
- mock_get_inbound_number_for_service,
-):
- service_one["permissions"] = ["inbound_sms"]
-
- page = client_request.get(
- "main.inbox",
- service_id=SERVICE_ONE_ID,
- )
-
- assert normalize_spaces(page.select("tbody tr")) == (
- "When users text your service’s phone number (2028675301) you’ll see the messages here"
- )
- assert not page.select("a[download]")
- assert not page.select("li.next-page")
- assert not page.select("li.previous-page")
-
-
-@pytest.mark.parametrize(
- "endpoint",
- [
- "main.inbox",
- "main.inbox_updates",
- ],
-)
-def test_inbox_not_accessible_to_service_without_permissions(
- client_request,
- service_one,
- endpoint,
-):
- service_one["permissions"] = []
- client_request.get(
- endpoint,
- service_id=SERVICE_ONE_ID,
- _expected_status=403,
- )
-
-
-def test_anyone_can_see_inbox(
- client_request,
- api_user_active,
- service_one,
- mocker,
- mock_get_most_recent_inbound_sms_with_no_messages,
- mock_get_inbound_number_for_service,
-):
- service_one["permissions"] = ["inbound_sms"]
-
- validate_route_permission_with_client(
- mocker,
- client_request,
- "GET",
- 200,
- url_for("main.inbox", service_id=service_one["id"]),
- ["view_activity"],
- api_user_active,
- service_one,
- )
-
-
-def test_view_inbox_updates(
- client_request,
- service_one,
- mocker,
- mock_get_most_recent_inbound_sms_with_no_messages,
-):
- service_one["permissions"] += ["inbound_sms"]
-
- mock_get_partials = mocker.patch(
- "app.main.views.dashboard.get_inbox_partials",
- return_value={"messages": "foo"},
- )
-
- response = client_request.get_response(
- "main.inbox_updates",
- service_id=SERVICE_ONE_ID,
- )
-
- assert json.loads(response.get_data(as_text=True)) == {"messages": "foo"}
-
- mock_get_partials.assert_called_once_with(SERVICE_ONE_ID)
-
-
-@freeze_time("2016-07-01 16:00")
-def test_download_inbox(
- client_request,
- mock_get_inbound_sms,
-):
- response = client_request.get_response(
- "main.inbox_download",
- service_id=SERVICE_ONE_ID,
- )
- assert response.headers["Content-Type"] == ("text/csv; " "charset=utf-8")
- assert response.headers["Content-Disposition"] == (
- "inline; " 'filename="Received text messages 07-01-2016.csv"'
- )
- assert response.get_data(as_text=True) == (
- "Phone number,Message,Received\r\n"
- "(202) 867-5300,message-1,07-01-2016 11:00 America/New_York\r\n"
- "(202) 867-5300,message-2,07-01-2016 10:59 America/New_York\r\n"
- "(202) 867-5300,message-3,07-01-2016 10:59 America/New_York\r\n"
- "(202) 867-5302,message-4,07-01-2016 08:59 America/New_York\r\n"
- "+33(0)1 12345678,message-5,07-01-2016 06:59 America/New_York\r\n"
- "(202) 555-0104,message-6,07-01-2016 04:59 America/New_York\r\n"
- "(202) 555-0104,message-7,07-01-2016 02:59 America/New_York\r\n"
- "+68212345,message-8,07-01-2016 02:59 America/New_York\r\n"
- )
-
-
-@freeze_time("2016-07-01 13:00")
-@pytest.mark.parametrize(
- ("message_content", "expected_cell"),
- [
- ("=2+5", "2+5"),
- ("==2+5", "2+5"),
- ("-2+5", "2+5"),
- ("+2+5", "2+5"),
- ("@2+5", "2+5"),
- ("looks safe,=2+5", '"looks safe,=2+5"'),
- ],
-)
-def test_download_inbox_strips_formulae(
- mocker,
- client_request,
- fake_uuid,
- message_content,
- expected_cell,
-):
- mocker.patch(
- "app.service_api_client.get_inbound_sms",
- return_value={
- "has_next": False,
- "data": [
- {
- "user_number": "elevenchars",
- "notify_number": "foo",
- "content": message_content,
- "created_at": datetime.utcnow().isoformat(),
- "id": fake_uuid,
- }
- ],
- },
- )
- response = client_request.get_response(
- "main.inbox_download",
- service_id=SERVICE_ONE_ID,
- )
- assert expected_cell in response.get_data(as_text=True).split("\r\n")[1]
-
-
def test_should_show_recent_templates_on_dashboard(
client_request,
mocker,
@@ -697,26 +409,6 @@ def test_should_not_show_recent_templates_on_dashboard_if_only_one_template_used
assert expected_count == 50, f"Expected count to be 50, but got {expected_count}"
-@freeze_time("2016-07-01 12:00") # 4 months into 2016 financial year
-@pytest.mark.parametrize(
- "extra_args",
- [
- {},
- {"year": "2016"},
- ],
-)
-def test_should_show_redirect_from_template_history(
- client_request,
- extra_args,
-):
- client_request.get(
- "main.template_history",
- service_id=SERVICE_ONE_ID,
- _expected_status=301,
- **extra_args,
- )
-
-
@freeze_time("2017-01-01 12:00")
@pytest.mark.parametrize(
"extra_args",
@@ -761,29 +453,9 @@ def test_should_show_monthly_breakdown_of_template_usage(
)
-def test_anyone_can_see_monthly_breakdown(
- client_request,
- api_user_active,
- service_one,
- mocker,
- mock_get_monthly_notification_stats,
-):
- validate_route_permission_with_client(
- mocker,
- client_request,
- "GET",
- 200,
- url_for("main.monthly", service_id=service_one["id"]),
- ["view_activity"],
- api_user_active,
- service_one,
- )
-
-
@pytest.mark.parametrize(
"endpoint",
[
- "main.monthly",
"main.template_usage",
],
)
@@ -806,16 +478,6 @@ def test_stats_pages_show_last_3_years(
)
-def test_monthly_has_equal_length_tables(
- client_request,
- service_one,
- mock_get_monthly_notification_stats,
-):
- page = client_request.get("main.monthly", service_id=service_one["id"])
-
- assert page.select_one(".table-field-headings th").get("width") == "33%"
-
-
@freeze_time("2016-01-01 11:09:00.061258")
def test_should_show_upcoming_jobs_on_dashboard(
mocker,
@@ -1463,14 +1125,6 @@ def test_aggregate_template_stats():
assert expected[1]["template_type"] == "sms"
-def test_aggregate_notifications_stats():
- expected = aggregate_notifications_stats(copy.deepcopy(stub_template_stats))
- assert expected == {
- "sms": {"requested": 100, "delivered": 50, "failed": 0},
- "email": {"requested": 200, "delivered": 0, "failed": 100},
- }
-
-
def test_get_dashboard_totals_adds_percentages():
stats = {
"sms": {"requested": 3, "delivered": 0, "failed": 2},
@@ -1859,22 +1513,22 @@ def test_service_dashboard_shows_batched_jobs(
def test_simple_local_conversion(mock_dt):
stats_utc = {
"2025-02-24T15:00:00Z": {
- "sms": {"delivered": 1, "failure": 0, "pending": 0, "requested": 1},
+ "sms": {"delivered": 1, "failure": 0, "pending": 0, "requested": 1},
"email": {"delivered": 0, "failure": 0, "pending": 0, "requested": 0},
},
"2025-02-25T07:00:00Z": {
- "sms": {"delivered": 2, "failure": 0, "pending": 0, "requested": 2},
+ "sms": {"delivered": 2, "failure": 0, "pending": 0, "requested": 2},
"email": {"delivered": 0, "failure": 0, "pending": 0, "requested": 0},
},
}
# Mock today's date in local time: 2025-02-25 at 10:00
- mock_dt.now.return_value = datetime(2025, 2, 25, 10, 0, 0, tzinfo=ZoneInfo("America/New_York"))
+ mock_dt.now.return_value = datetime(
+ 2025, 2, 25, 10, 0, 0, tzinfo=ZoneInfo("America/New_York")
+ )
local_stats = get_local_daily_stats_for_last_x_days(
- stats_utc,
- "America/New_York",
- days=2
+ stats_utc, "America/New_York", days=2
)
assert len(local_stats) == 2
@@ -1909,7 +1563,7 @@ def test_no_timestamps_returns_zeroed_days():
def test_timestamp_in_future_time_zone():
stats_utc = {
"2025-02-25T01:00:00Z": {
- "sms": {"delivered": 5, "failure": 0, "pending": 0, "requested": 5},
+ "sms": {"delivered": 5, "failure": 0, "pending": 0, "requested": 5},
"email": {"delivered": 0, "failure": 0, "pending": 0, "requested": 0},
}
}
@@ -1931,15 +1585,15 @@ def test_timestamp_in_future_time_zone():
def test_many_timestamps_one_local_day():
stats_utc = {
"2025-02-24T05:00:00Z": {
- "sms": {"delivered": 2, "failure": 1, "pending": 0, "requested": 3},
+ "sms": {"delivered": 2, "failure": 1, "pending": 0, "requested": 3},
"email": {"delivered": 0, "failure": 0, "pending": 0, "requested": 0},
},
"2025-02-24T09:30:00Z": {
- "sms": {"delivered": 1, "failure": 0, "pending": 0, "requested": 1},
+ "sms": {"delivered": 1, "failure": 0, "pending": 0, "requested": 1},
"email": {"delivered": 2, "failure": 0, "pending": 0, "requested": 2},
},
"2025-02-24T16:59:59Z": {
- "sms": {"delivered": 4, "failure": 0, "pending": 0, "requested": 4},
+ "sms": {"delivered": 4, "failure": 0, "pending": 0, "requested": 4},
"email": {"delivered": 0, "failure": 0, "pending": 0, "requested": 0},
},
}
@@ -1965,18 +1619,22 @@ def test_local_conversion_phoenix():
"""Test aggregator logic in Mountain Time, no DST (America/Phoenix)."""
stats_utc = {
"2025-02-25T01:00:00Z": {
- "sms": {"delivered": 1, "failure": 0, "pending": 0, "requested": 1},
+ "sms": {"delivered": 1, "failure": 0, "pending": 0, "requested": 1},
"email": {"delivered": 0, "failure": 0, "pending": 0, "requested": 0},
},
"2025-02-25T12:00:00Z": {
- "sms": {"delivered": 2, "failure": 0, "pending": 0, "requested": 2},
+ "sms": {"delivered": 2, "failure": 0, "pending": 0, "requested": 2},
"email": {"delivered": 1, "failure": 0, "pending": 0, "requested": 1},
},
}
with patch("app.main.views.dashboard.datetime", wraps=datetime) as mock_dt:
- mock_dt.now.return_value = datetime(2025, 2, 25, 12, 0, 0, tzinfo=ZoneInfo("America/Phoenix"))
- local_stats = get_local_daily_stats_for_last_x_days(stats_utc, "America/Phoenix", days=1)
+ mock_dt.now.return_value = datetime(
+ 2025, 2, 25, 12, 0, 0, tzinfo=ZoneInfo("America/Phoenix")
+ )
+ local_stats = get_local_daily_stats_for_last_x_days(
+ stats_utc, "America/Phoenix", days=1
+ )
assert len(local_stats) == 1
(day_key,) = local_stats.keys()
@@ -1988,18 +1646,22 @@ def test_local_conversion_honolulu():
"""Test aggregator logic in Hawaii (Pacific/Honolulu)."""
stats_utc = {
"2025-02-25T03:00:00Z": {
- "sms": {"delivered": 2, "failure": 0, "pending": 0, "requested": 2},
+ "sms": {"delivered": 2, "failure": 0, "pending": 0, "requested": 2},
"email": {"delivered": 0, "failure": 0, "pending": 0, "requested": 0},
},
"2025-02-25T21:00:00Z": {
- "sms": {"delivered": 1, "failure": 0, "pending": 0, "requested": 1},
+ "sms": {"delivered": 1, "failure": 0, "pending": 0, "requested": 1},
"email": {"delivered": 2, "failure": 0, "pending": 0, "requested": 2},
},
}
with patch("app.main.views.dashboard.datetime", wraps=datetime) as mock_dt:
- mock_dt.now.return_value = datetime(2025, 2, 25, 12, 0, 0, tzinfo=ZoneInfo("Pacific/Honolulu"))
- local_stats = get_local_daily_stats_for_last_x_days(stats_utc, "Pacific/Honolulu", days=1)
+ mock_dt.now.return_value = datetime(
+ 2025, 2, 25, 12, 0, 0, tzinfo=ZoneInfo("Pacific/Honolulu")
+ )
+ local_stats = get_local_daily_stats_for_last_x_days(
+ stats_utc, "Pacific/Honolulu", days=1
+ )
assert len(local_stats) == 1
(day_key,) = local_stats.keys()
diff --git a/tests/app/main/views/test_manage_users.py b/tests/app/main/views/test_manage_users.py
index 2f6b3a226..7b0b1d9e4 100644
--- a/tests/app/main/views/test_manage_users.py
+++ b/tests/app/main/views/test_manage_users.py
@@ -197,7 +197,7 @@ def test_should_show_live_search_if_more_than_7_users(
"usa-input",
]
assert (
- normalize_spaces(page.select_one("label[for=search]").text)
+ normalize_spaces(page.select_one("label:contains('Search by')").text)
== "Search by name or email address"
)
@@ -447,7 +447,7 @@ def test_invite_user_has_correct_email_field(
client_request.login(platform_admin_user)
email_field = client_request.get(
"main.invite_user", service_id=SERVICE_ONE_ID
- ).select_one("#email_address")
+ ).select_one("#email-address")
assert email_field["spellcheck"] == "false"
assert "autocomplete" not in email_field
diff --git a/tests/app/main/views/test_register.py b/tests/app/main/views/test_register.py
index a55307a2b..64ff5bd4c 100644
--- a/tests/app/main/views/test_register.py
+++ b/tests/app/main/views/test_register.py
@@ -17,8 +17,8 @@ def test_render_register_returns_template_with_form(client_request, mocker):
page = client_request.get_url("/register")
assert page.find("input", attrs={"name": "auth_type"}).attrs["value"] == "sms_auth"
- assert page.select_one("#email_address")["spellcheck"] == "false"
- assert page.select_one("#email_address")["autocomplete"] == "email"
+ assert page.select_one("#email-address")["spellcheck"] == "false"
+ assert page.select_one("#email-address")["autocomplete"] == "email"
assert page.select_one("#password")["autocomplete"] == "new-password"
assert "Create an account" in page.text
diff --git a/tests/app/main/views/test_send.py b/tests/app/main/views/test_send.py
index 0ab770c18..d957fa393 100644
--- a/tests/app/main/views/test_send.py
+++ b/tests/app/main/views/test_send.py
@@ -1519,9 +1519,11 @@ def test_link_to_upload_not_offered_when_entering_personalisation(
step_index=1,
)
+ # print(page.prettify()) # Print the full HTML response
+
# We’re entering personalization
assert page.select_one("input[type=text]")["name"] == "placeholder_value"
- assert page.select_one("label[for=phone-number]").text.strip() == "name"
+ assert page.select_one("label").text.strip() == "name"
# No ‘Upload’ link shown
assert len(page.select("main a")) == 0
assert "Upload" not in page.select_one("main").text
diff --git a/tests/app/main/views/test_templates.py b/tests/app/main/views/test_templates.py
index eed5085ec..b057580ab 100644
--- a/tests/app/main/views/test_templates.py
+++ b/tests/app/main/views/test_templates.py
@@ -1748,7 +1748,7 @@ def test_can_create_email_template_with_emoji(
@pytest.mark.parametrize(
("template_type", "expected_error"),
[
- ("sms", ("You cannot use 🍜 in text messages.")),
+ ("sms", ("Please remove the unaccepted character 🍜 in your message, then save again")),
],
)
def test_should_not_create_sms_template_with_emoji(
@@ -1772,14 +1772,15 @@ def test_should_not_create_sms_template_with_emoji(
},
_expected_status=200,
)
- assert expected_error in page.text
+ # print(page.main.prettify())
+ assert expected_error in normalize_spaces(page.select_one("#template_content-error").text)
assert mock_create_service_template.called is False
@pytest.mark.parametrize(
("template_type", "expected_error"),
[
- ("sms", ("You cannot use 🍔 in text messages.")),
+ ("sms", ("Please remove the unaccepted character 🍔 in your message, then save again")),
],
)
def test_should_not_update_sms_template_with_emoji(
@@ -2031,7 +2032,7 @@ def test_set_template_sender(
"sms",
False,
"Ẅ" * 70,
- "Will be charged as 1 text message. Use of characters outside the IEC_8859-1 character set may increase the message fragment count, resulting in additional charges, and these IEC_8859-1 characters may not display properly on some older mobile devices.", # noqa E501
+ "Will be charged as 1 text message.", # noqa E501
None,
),
(
@@ -2059,7 +2060,7 @@ def test_set_template_sender(
"sms",
False,
"Hello ((name))",
- "Will be charged as 1 text message (not including personalization)",
+ "Will be charged as 1 text message (not including personalization).",
None,
),
(
@@ -2067,7 +2068,7 @@ def test_set_template_sender(
"sms",
False,
f'Hello (( {"a" * 999} ))',
- "Will be charged as 1 text message (not including personalization)",
+ "Will be charged as 1 text message (not including personalization).",
None,
),
],
diff --git a/tests/app/main/views/test_tour.py b/tests/app/main/views/test_tour.py
index c6316d0a7..9a1774a13 100644
--- a/tests/app/main/views/test_tour.py
+++ b/tests/app/main/views/test_tour.py
@@ -175,7 +175,7 @@ def test_should_show_empty_text_box(
# shouldn’t also be set on the textbox itself
assert "data-module" not in textbox
- assert normalize_spaces(page.select_one("label[for=phone-number]").text) == "one"
+ assert normalize_spaces(page.select_one("label").text) == "one"
def test_should_prefill_answers_for_get_tour_step(
diff --git a/tests/app/test_navigation.py b/tests/app/test_navigation.py
index 9b0e961b5..4e9ef54c0 100644
--- a/tests/app/test_navigation.py
+++ b/tests/app/test_navigation.py
@@ -116,16 +116,12 @@ EXCLUDED_ENDPOINTS = tuple(
"history",
"how_to_pay",
"inbound_sms_admin",
- "inbox",
- "inbox_download",
- "inbox_updates",
"index",
"information_risk_management",
"information_security",
"integration_testing",
"invite_org_user",
"invite_user",
- "join_notify",
"link_service_to_organization",
"live_services",
"live_services_csv",
@@ -134,10 +130,10 @@ EXCLUDED_ENDPOINTS = tuple(
"manage_template_folder",
"manage_users",
"message_status",
- "monthly",
"multiple_languages",
"new_password",
"notifications_sent_by_service",
+ "notify_service_ending",
"old_guest_list",
"old_integration_testing",
"old_service_dashboard",
@@ -183,7 +179,6 @@ EXCLUDED_ENDPOINTS = tuple(
"service_confirm_delete_email_reply_to",
"service_confirm_delete_sms_sender",
"service_dashboard",
- "service_dashboard_updates",
"service_delete_email_reply_to",
"service_delete_sms_sender",
"service_edit_email_reply_to",
@@ -217,7 +212,6 @@ EXCLUDED_ENDPOINTS = tuple(
"studio",
"support",
"suspend_service",
- "template_history",
"template_usage",
"test_feature_flags",
"tour_step",
diff --git a/tests/end_to_end/test_landing_and_sign_in_pages.py b/tests/end_to_end/test_landing_and_sign_in_pages.py
index 3741a3a19..4686876d4 100644
--- a/tests/end_to_end/test_landing_and_sign_in_pages.py
+++ b/tests/end_to_end/test_landing_and_sign_in_pages.py
@@ -40,7 +40,6 @@ def test_landing_page(end_to_end_context):
content_headers = [
"Government texting made easy",
"Key features",
- "Who can use Notify.gov",
]
for content_header in content_headers:
diff --git a/tests/javascripts/validation.test.js b/tests/javascripts/validation.test.js
new file mode 100644
index 000000000..fb6b1a67e
--- /dev/null
+++ b/tests/javascripts/validation.test.js
@@ -0,0 +1,62 @@
+const { showError, hideError, getFieldLabel, attachValidation } = require("../../app/assets/javascripts/validation.js");
+
+describe("Form Validation", () => {
+ let form, input, submitButton;
+
+ beforeEach(() => {
+ document.body.innerHTML = `
+
+ `;
+
+ form = document.querySelector(".send-one-off-form");
+ input = document.getElementById("test-input");
+ submitButton = form.querySelector("button");
+
+ // Manually attach validation logic for Jest
+ attachValidation();
+ });
+
+ afterEach(() => {
+ document.body.innerHTML = ""; // Clean up DOM after each test
+ });
+
+ test("Displays an error message when input is empty", async () => {
+ form.dispatchEvent(new Event("submit", { bubbles: true }));
+
+ // Wait for the timeout to complete
+ await new Promise(resolve => setTimeout(resolve, 20));
+
+ const errorMessage = document.getElementById("test-input-error");
+ expect(errorMessage).not.toBeNull();
+ expect(errorMessage.textContent).toBe("Error: Test Input is required.");
+ expect(input.classList.contains("usa-input--error")).toBe(true);
+});
+
+ test("Removes error message when input is filled", () => {
+ // Trigger validation first
+ form.dispatchEvent(new Event("submit", { bubbles: true }));
+
+ // Simulate user typing to remove the error
+ input.value = "Some text";
+ input.dispatchEvent(new Event("input", { bubbles: true }));
+
+ const errorMessage = document.getElementById("test-input-error");
+ expect(errorMessage).not.toBeNull();
+ expect(errorMessage.style.display).toBe("none");
+ expect(input.classList.contains("usa-input--error")).toBe(false);
+ });
+
+ test("Focus moves to first invalid input", async () => {
+ const spy = jest.spyOn(input, "focus");
+
+ form.dispatchEvent(new Event("submit", { bubbles: true }));
+
+ await new Promise((resolve) => setTimeout(resolve, 10)); // Allow DOM updates
+
+ expect(spy).toHaveBeenCalled();
+ });
+});
diff --git a/urls.js b/urls.js
index a7221a5d9..23349f264 100644
--- a/urls.js
+++ b/urls.js
@@ -42,12 +42,8 @@ const sublinks = [
path: '/about/security',
},
{
- label: 'Join Notify',
- path: '/join-notify',
- },
- {
- label: 'Contact',
- path: '/contact',
+ label: 'Notify.gov Service Ending',
+ path: '/notify-service-ending',
},
// Add more links here as needed