From b5cce2a85a7bf7a803f195325e417132db1a4ff0 Mon Sep 17 00:00:00 2001 From: Kenneth Kehl <@kkehl@flexion.us> Date: Mon, 10 Jun 2024 10:53:09 -0700 Subject: [PATCH 01/58] add debug for investigating stack trace in logs --- app/__init__.py | 23 +++-- poetry.lock | 112 ++++++++++++++++++++++++- tests/app/main/views/test_dashboard.py | 28 +++---- 3 files changed, 141 insertions(+), 22 deletions(-) diff --git a/app/__init__.py b/app/__init__.py index e99a5ae51..0168af4b2 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -350,11 +350,23 @@ def make_session_permanent(): def create_beta_url(url): - url_created = urlparse(url) - url_list = list(url_created) - url_list[1] = "beta.notify.gov" - url_for_redirect = urlunparse(url_list) - return url_for_redirect + url_created = None + try: + url_created = urlparse(url) + url_list = list(url_created) + url_list[1] = "beta.notify.gov" + url_for_redirect = urlunparse(url_list) + return url_for_redirect + except ValueError: + # This might be happening due to IPv6, see issue # 1395. + # If we see "'RequestContext' object has no attribute 'service'" in the logs + # we can search around that timestamp and find this output, hopefully. + # It may be sufficient to just catch and log, and prevent the stack trace from being in the logs + # but we need to confirm the root cause first. + current_app.logger.error( + f"create_beta_url orig_url: {url} \ + url_created = {str(url_created)} url_for_redirect {str(url_for_redirect)}" + ) def redirect_notify_to_beta(): @@ -362,6 +374,7 @@ def redirect_notify_to_beta(): current_app.config["NOTIFY_ENVIRONMENT"] == "production" and "beta.notify.gov" not in request.url ): + # TODO add debug here to trace what is going on with the URL for the 'RequestContext' error url_to_beta = create_beta_url(request.url) return redirect(url_to_beta, 302) diff --git a/poetry.lock b/poetry.lock index 0289c6df4..f1925017b 100644 --- a/poetry.lock +++ b/poetry.lock @@ -85,6 +85,17 @@ charset-normalizer = ["charset-normalizer"] html5lib = ["html5lib"] lxml = ["lxml"] +[[package]] +name = "bidict" +version = "0.23.1" +description = "The bidirectional mapping library for Python." +optional = false +python-versions = ">=3.8" +files = [ + {file = "bidict-0.23.1-py3-none-any.whl", hash = "sha256:5dae8d4d79b552a71cbabc7deb25dfe8ce710b17ff41711e13010ead2abfc3e5"}, + {file = "bidict-0.23.1.tar.gz", hash = "sha256:03069d763bc387bbd20e7d49914e75fc4132a41937fa3405417e1a5a2d006d71"}, +] + [[package]] name = "black" version = "24.4.2" @@ -887,6 +898,24 @@ redis = ">=2.7.6" dev = ["coverage", "pre-commit", "pytest", "pytest-mock"] tests = ["coverage", "pytest", "pytest-mock"] +[[package]] +name = "flask-socketio" +version = "5.3.6" +description = "Socket.IO integration for Flask applications" +optional = false +python-versions = ">=3.6" +files = [ + {file = "Flask-SocketIO-5.3.6.tar.gz", hash = "sha256:bb8f9f9123ef47632f5ce57a33514b0c0023ec3696b2384457f0fcaa5b70501c"}, + {file = "Flask_SocketIO-5.3.6-py3-none-any.whl", hash = "sha256:9e62d2131842878ae6bfdd7067dfc3be397c1f2b117ab1dc74e6fe74aad7a579"}, +] + +[package.dependencies] +Flask = ">=0.9" +python-socketio = ">=5.0.2" + +[package.extras] +docs = ["sphinx"] + [[package]] name = "flask-talisman" version = "1.1.0" @@ -1049,6 +1078,17 @@ setproctitle = ["setproctitle"] testing = ["coverage", "eventlet", "gevent", "pytest", "pytest-cov"] tornado = ["tornado (>=0.2)"] +[[package]] +name = "h11" +version = "0.14.0" +description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" +optional = false +python-versions = ">=3.7" +files = [ + {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, + {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, +] + [[package]] name = "html5lib" version = "1.1" @@ -2385,6 +2425,25 @@ files = [ [package.extras] cli = ["click (>=5.0)"] +[[package]] +name = "python-engineio" +version = "4.9.1" +description = "Engine.IO server and client for Python" +optional = false +python-versions = ">=3.6" +files = [ + {file = "python_engineio-4.9.1-py3-none-any.whl", hash = "sha256:f995e702b21f6b9ebde4e2000cd2ad0112ba0e5116ec8d22fe3515e76ba9dddd"}, + {file = "python_engineio-4.9.1.tar.gz", hash = "sha256:7631cf5563086076611e494c643b3fa93dd3a854634b5488be0bba0ef9b99709"}, +] + +[package.dependencies] +simple-websocket = ">=0.10.0" + +[package.extras] +asyncio-client = ["aiohttp (>=3.4)"] +client = ["requests (>=2.21.0)", "websocket-client (>=0.54.0)"] +docs = ["sphinx"] + [[package]] name = "python-json-logger" version = "2.0.7" @@ -2413,6 +2472,26 @@ text-unidecode = ">=1.3" [package.extras] unidecode = ["Unidecode (>=1.1.1)"] +[[package]] +name = "python-socketio" +version = "5.11.2" +description = "Socket.IO server and client for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "python-socketio-5.11.2.tar.gz", hash = "sha256:ae6a1de5c5209ca859dc574dccc8931c4be17ee003e74ce3b8d1306162bb4a37"}, + {file = "python_socketio-5.11.2-py3-none-any.whl", hash = "sha256:b9f22a8ff762d7a6e123d16a43ddb1a27d50f07c3c88ea999334f2f89b0ad52b"}, +] + +[package.dependencies] +bidict = ">=0.21.0" +python-engineio = ">=4.8.0" + +[package.extras] +asyncio-client = ["aiohttp (>=3.4)"] +client = ["requests (>=2.21.0)", "websocket-client (>=0.54.0)"] +docs = ["sphinx"] + [[package]] name = "pytz" version = "2024.1" @@ -2767,6 +2846,23 @@ numpy = ">=1.14,<3" docs = ["matplotlib", "numpydoc (==1.1.*)", "sphinx", "sphinx-book-theme", "sphinx-remove-toctrees"] test = ["pytest", "pytest-cov"] +[[package]] +name = "simple-websocket" +version = "1.0.0" +description = "Simple WebSocket server and client for Python" +optional = false +python-versions = ">=3.6" +files = [ + {file = "simple-websocket-1.0.0.tar.gz", hash = "sha256:17d2c72f4a2bd85174a97e3e4c88b01c40c3f81b7b648b0cc3ce1305968928c8"}, + {file = "simple_websocket-1.0.0-py3-none-any.whl", hash = "sha256:1d5bf585e415eaa2083e2bcf02a3ecf91f9712e7b3e6b9fa0b461ad04e0837bc"}, +] + +[package.dependencies] +wsproto = "*" + +[package.extras] +docs = ["sphinx"] + [[package]] name = "six" version = "1.16.0" @@ -2944,6 +3040,20 @@ MarkupSafe = ">=2.1.1" [package.extras] watchdog = ["watchdog (>=2.3)"] +[[package]] +name = "wsproto" +version = "1.2.0" +description = "WebSockets state-machine based protocol implementation" +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "wsproto-1.2.0-py3-none-any.whl", hash = "sha256:b9acddd652b585d75b20477888c56642fdade28bdfd3579aa24a4d2c037dd736"}, + {file = "wsproto-1.2.0.tar.gz", hash = "sha256:ad565f26ecb92588a3e43bc3d96164de84cd9902482b130d0ddbaa9664a85065"}, +] + +[package.dependencies] +h11 = ">=0.9.0,<1" + [[package]] name = "wtforms" version = "3.1.2" @@ -3002,4 +3112,4 @@ files = [ [metadata] lock-version = "2.0" python-versions = "^3.12.2" -content-hash = "e96b87c048826ecb23d826c45b516aee60532cd2677a22332dc86fef498a411d" +content-hash = "ce5863177e0d58f7e4affdb2d7c4a23721a6eb3199183cd92874c0315c0d6afa" diff --git a/tests/app/main/views/test_dashboard.py b/tests/app/main/views/test_dashboard.py index 285444b1b..e83dacbae 100644 --- a/tests/app/main/views/test_dashboard.py +++ b/tests/app/main/views/test_dashboard.py @@ -1893,26 +1893,22 @@ def app_with_socketio(): ( SERVICE_ONE_ID, {"start_date": "2024-01-01", "days": 7}, - {"service_id": SERVICE_ONE_ID, "start_date": "2024-01-01", "days": 7} + {"service_id": SERVICE_ONE_ID, "start_date": "2024-01-01", "days": 7}, ), ( SERVICE_TWO_ID, {"start_date": "2023-06-01", "days": 7}, - {"service_id": SERVICE_TWO_ID, "start_date": "2023-06-01", "days": 7} + {"service_id": SERVICE_TWO_ID, "start_date": "2023-06-01", "days": 7}, ), - ] + ], ) def test_fetch_daily_stats( - app_with_socketio, mocker, - service_id, - date_range, - expected_call_args + app_with_socketio, mocker, service_id, date_range, expected_call_args ): app, socketio = app_with_socketio mocker.patch( - "app.main.views.dashboard.get_stats_date_range", - return_value=date_range + "app.main.views.dashboard.get_stats_date_range", return_value=date_range ) mock_service_api = mocker.patch( @@ -1920,9 +1916,9 @@ def test_fetch_daily_stats( return_value={ date_range["start_date"]: { "email": {"delivered": 0, "failure": 0, "requested": 0}, - "sms": {"delivered": 0, "failure": 1, "requested": 1} + "sms": {"delivered": 0, "failure": 1, "requested": 1}, }, - } + }, ) client = SocketIOTestClient(app, socketio) @@ -1930,22 +1926,22 @@ def test_fetch_daily_stats( connected = client.is_connected() assert connected, "Client should be connected" - client.emit('fetch_daily_stats', service_id) + client.emit("fetch_daily_stats", service_id) received = client.get_received() assert received, "Should receive a response message" - assert received[0]['name'] == 'daily_stats_update' - assert received[0]['args'][0] == { + assert received[0]["name"] == "daily_stats_update" + assert received[0]["args"][0] == { date_range["start_date"]: { "email": {"delivered": 0, "failure": 0, "requested": 0}, - "sms": {"delivered": 0, "failure": 1, "requested": 1} + "sms": {"delivered": 0, "failure": 1, "requested": 1}, }, } mock_service_api.assert_called_once_with( service_id, start_date=expected_call_args["start_date"], - days=expected_call_args["days"] + days=expected_call_args["days"], ) finally: client.disconnect() From 8d305898827e10c45a9b7e8df8da204d33ea3441 Mon Sep 17 00:00:00 2001 From: alexjanousekGSA Date: Tue, 2 Jul 2024 12:40:58 -0600 Subject: [PATCH 02/58] Updated morphdom --- package-lock.json | 9 +++++---- package.json | 2 +- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 378cb4eb8..1267d7016 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,7 +16,7 @@ "govuk-frontend": "2.13.0", "hogan": "1.0.2", "jquery": "3.7.1", - "morphdom": "2.7.2", + "morphdom": "^2.7.3", "python": "^0.0.4", "query-command-supported": "1.0.0", "sass-embedded": "^1.77.5", @@ -11225,9 +11225,10 @@ } }, "node_modules/morphdom": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/morphdom/-/morphdom-2.7.2.tgz", - "integrity": "sha512-Dqb/lHFyTi7SZpY0a5R4I/0Edo+iPMbaUexsHHsLAByyixCDiLHPHyVoKVmrpL0THcT7V9Cgev9y21TQYq6wQg==" + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/morphdom/-/morphdom-2.7.3.tgz", + "integrity": "sha512-rvGK92GxSuPEZLY8D/JH07cG3BxyA+/F0Bxg32OoGAEFFhGWA3OqVpqPZlOgZTCR52clXrmz+z2pYSJ6gOig1w==", + "license": "MIT" }, "node_modules/ms": { "version": "2.1.2", diff --git a/package.json b/package.json index 355a79e8f..4fb7c5ec8 100644 --- a/package.json +++ b/package.json @@ -32,7 +32,7 @@ "govuk-frontend": "2.13.0", "hogan": "1.0.2", "jquery": "3.7.1", - "morphdom": "2.7.2", + "morphdom": "^2.7.3", "python": "^0.0.4", "query-command-supported": "1.0.0", "sass-embedded": "^1.77.5", From e189ac3d1afa6e73afe5a14ffe6ec3dbf8b96623 Mon Sep 17 00:00:00 2001 From: alexjanousekGSA Date: Wed, 3 Jul 2024 13:48:03 -0600 Subject: [PATCH 03/58] Updated govuk-fe-toolkit --- package-lock.json | 9 +++++---- package.json | 2 +- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index e24bb004d..eb93a2eb6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,7 +12,7 @@ "@uswds/uswds": "^3.8.1", "cbor-js": "0.1.0", "chart.js": "^4.4.3", - "govuk_frontend_toolkit": "8.1.0", + "govuk_frontend_toolkit": "^9.0.1", "govuk-frontend": "2.13.0", "hogan": "1.0.2", "jquery": "3.7.1", @@ -6420,9 +6420,10 @@ } }, "node_modules/govuk_frontend_toolkit": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/govuk_frontend_toolkit/-/govuk_frontend_toolkit-8.1.0.tgz", - "integrity": "sha512-KzuMy+xhH/QKJHYJYS4p6ZiPg1CWSd4TKJFBFzngpVnk2tbvEvfAw/yLoRmzgukd/9V4d9oDSA4dIXRFb7XvDA==" + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/govuk_frontend_toolkit/-/govuk_frontend_toolkit-9.0.1.tgz", + "integrity": "sha512-ItW0GZ4j2bgXrWg0m4Yj31gmb3HtDLWQvFMPt3ZV8YCNKviFsDvRnoerzz8PBwfK74lOPpHL+2FtYDG8XVrYpg==", + "license": "MIT" }, "node_modules/govuk-frontend": { "version": "2.13.0", diff --git a/package.json b/package.json index 41c4bb734..22b3e6191 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,7 @@ "@uswds/uswds": "^3.8.1", "cbor-js": "0.1.0", "chart.js": "^4.4.3", - "govuk_frontend_toolkit": "8.1.0", + "govuk_frontend_toolkit": "^9.0.1", "govuk-frontend": "2.13.0", "hogan": "1.0.2", "jquery": "3.7.1", From 8d7d38e321e075b1927d6f60866f021151574e2c Mon Sep 17 00:00:00 2001 From: Beverly Nguyen Date: Fri, 5 Jul 2024 16:30:41 -0700 Subject: [PATCH 04/58] update timestamp to display notification time created_at --- app/main/views/jobs.py | 1 + app/templates/views/dashboard/dashboard.html | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/app/main/views/jobs.py b/app/main/views/jobs.py index 42a4de090..fcdd91122 100644 --- a/app/main/views/jobs.py +++ b/app/main/views/jobs.py @@ -432,6 +432,7 @@ def get_job_partials(job): "partials/jobs/status.html", job=job, arrived_from_preview_page_url=arrived_from_preview_page_url, + notifications=notifications["notifications"] ), } diff --git a/app/templates/views/dashboard/dashboard.html b/app/templates/views/dashboard/dashboard.html index dd0279629..a886f43a0 100644 --- a/app/templates/views/dashboard/dashboard.html +++ b/app/templates/views/dashboard/dashboard.html @@ -69,7 +69,7 @@ {{ notification.template.name }} - {{ job.created_at | format_datetime_table }} + {{ notification.created_at|format_datetime_table }} {{ notification.created_by.name }} From e7c49f8bbbf08f5f8a9c5854c799176c092bff98 Mon Sep 17 00:00:00 2001 From: alexjanousekGSA Date: Mon, 8 Jul 2024 09:58:25 -0600 Subject: [PATCH 05/58] Removed unused file path --- gulpfile.js | 3 --- poetry.lock | 5 +++++ 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/gulpfile.js b/gulpfile.js index 7c87a2b79..f80eee6e0 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -27,7 +27,6 @@ plugins.uglify = require('gulp-uglify'); const paths = { src: 'app/assets/', dist: 'app/static/', - templates: 'app/templates/', npm: 'node_modules/', toolkit: 'node_modules/govuk_frontend_toolkit/', govuk_frontend: 'node_modules/govuk-frontend/' @@ -150,8 +149,6 @@ const images = () => { paths.govuk_frontend + 'assets/images/**/*', paths.src + 'images/**/*', paths.src + 'img/**/*', - paths.template + 'assets/images/**/*' - ]) .pipe(dest(paths.dist + 'images/')) }; diff --git a/poetry.lock b/poetry.lock index c5c45a2a1..a08ad9366 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1344,9 +1344,13 @@ files = [ {file = "lxml-5.2.2-cp36-cp36m-win_amd64.whl", hash = "sha256:edcfa83e03370032a489430215c1e7783128808fd3e2e0a3225deee278585196"}, {file = "lxml-5.2.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:28bf95177400066596cdbcfc933312493799382879da504633d16cf60bba735b"}, {file = "lxml-5.2.2-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3a745cc98d504d5bd2c19b10c79c61c7c3df9222629f1b6210c0368177589fb8"}, + {file = "lxml-5.2.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b590b39ef90c6b22ec0be925b211298e810b4856909c8ca60d27ffbca6c12e6"}, {file = "lxml-5.2.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b336b0416828022bfd5a2e3083e7f5ba54b96242159f83c7e3eebaec752f1716"}, + {file = "lxml-5.2.2-cp37-cp37m-manylinux_2_28_aarch64.whl", hash = "sha256:c2faf60c583af0d135e853c86ac2735ce178f0e338a3c7f9ae8f622fd2eb788c"}, {file = "lxml-5.2.2-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:4bc6cb140a7a0ad1f7bc37e018d0ed690b7b6520ade518285dc3171f7a117905"}, + {file = "lxml-5.2.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7ff762670cada8e05b32bf1e4dc50b140790909caa8303cfddc4d702b71ea184"}, {file = "lxml-5.2.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:57f0a0bbc9868e10ebe874e9f129d2917750adf008fe7b9c1598c0fbbfdde6a6"}, + {file = "lxml-5.2.2-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:a6d2092797b388342c1bc932077ad232f914351932353e2e8706851c870bca1f"}, {file = "lxml-5.2.2-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:60499fe961b21264e17a471ec296dcbf4365fbea611bf9e303ab69db7159ce61"}, {file = "lxml-5.2.2-cp37-cp37m-win32.whl", hash = "sha256:d9b342c76003c6b9336a80efcc766748a333573abf9350f4094ee46b006ec18f"}, {file = "lxml-5.2.2-cp37-cp37m-win_amd64.whl", hash = "sha256:b16db2770517b8799c79aa80f4053cd6f8b716f21f8aca962725a9565ce3ee40"}, @@ -2527,6 +2531,7 @@ files = [ {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, + {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef"}, {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, From 9f2115780af98a08033d7fada3f5741529871930 Mon Sep 17 00:00:00 2001 From: alexjanousekGSA Date: Mon, 8 Jul 2024 10:12:38 -0600 Subject: [PATCH 06/58] Updated certifi --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 70991fdf9..438e29d68 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -58,7 +58,7 @@ regex = "^2024.5.15" s3transfer = "^0.10.2" shapely = "^2.0.4" smartypants = "^2.0.1" -certifi = "^2024.2.2" +certifi = "^2024.7.4" charset-normalizer = "^3.3.2" click = "^8.1.7" idna = "^3.7" From 34e08d9290b8f53811918de9b294cd5c0142e952 Mon Sep 17 00:00:00 2001 From: alexjanousekGSA Date: Mon, 8 Jul 2024 10:45:05 -0600 Subject: [PATCH 07/58] Updated gulp and replaced png logo with svg --- app/templates/new/components/header.html | 2 +- package-lock.json | 2618 +++++++++++++++------- package.json | 2 +- poetry.lock | 8 +- 4 files changed, 1811 insertions(+), 819 deletions(-) diff --git a/app/templates/new/components/header.html b/app/templates/new/components/header.html index cbdc21cf7..e6edc7116 100644 --- a/app/templates/new/components/header.html +++ b/app/templates/new/components/header.html @@ -31,7 +31,7 @@ diff --git a/package-lock.json b/package-lock.json index eb93a2eb6..a4e0e0165 100644 --- a/package-lock.json +++ b/package-lock.json @@ -29,7 +29,7 @@ "@babel/preset-env": "7.24.7", "@uswds/compile": "^1.1.0", "better-npm-audit": "^3.7.3", - "gulp": "^4.0.2", + "gulp": "^5.0.0", "gulp-add-src": "^1.0.0", "gulp-babel": "8.0.0", "gulp-better-rollup": "4.0.1", @@ -1897,6 +1897,29 @@ "node": ">=0.4" } }, + "node_modules/@gulpjs/messages": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@gulpjs/messages/-/messages-1.1.0.tgz", + "integrity": "sha512-Ys9sazDatyTgZVb4xPlDufLweJ/Os2uHWOv+Caxvy2O85JcnT4M3vc73bi8pdLWlv3fdWQz3pdI9tVwo8rQQSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@gulpjs/to-absolute-glob": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@gulpjs/to-absolute-glob/-/to-absolute-glob-4.0.0.tgz", + "integrity": "sha512-kjotm7XJrJ6v+7knhPaRgaT6q8F8K2jiafwYdNHLzmV0uGLuZY43FK6smNSHUPrhq5kX2slCUy+RGG/xGqmIKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-negated-glob": "^1.0.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", @@ -2851,6 +2874,431 @@ "sass-embedded": "1.69.5" } }, + "node_modules/@uswds/compile/node_modules/ansi-colors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", + "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-wrap": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@uswds/compile/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@uswds/compile/node_modules/anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "license": "ISC", + "dependencies": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + } + }, + "node_modules/@uswds/compile/node_modules/anymatch/node_modules/normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@uswds/compile/node_modules/async-done": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/async-done/-/async-done-1.3.2.tgz", + "integrity": "sha512-uYkTP8dw2og1tu1nmza1n1CMW0qb8gWWlwqMmLb7MhBVs4BXrFziT6HXUd+/RlRA/i4H9AkofYloUbs1fwMqlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.2", + "process-nextick-args": "^2.0.0", + "stream-exhaust": "^1.0.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/@uswds/compile/node_modules/async-settle": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-settle/-/async-settle-1.0.0.tgz", + "integrity": "sha512-VPXfB4Vk49z1LHHodrEQ6Xf7W4gg1w0dAPROHngx7qgDjqmIQ+fXmwgGXTW/ITLai0YLSvWepJOP9EVpMnEAcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "async-done": "^1.2.2" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/@uswds/compile/node_modules/bach": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/bach/-/bach-1.2.0.tgz", + "integrity": "sha512-bZOOfCb3gXBXbTFXq3OZtGR88LwGeJvzu6szttaIzymOTS4ZttBNOWSv7aLZja2EMycKtRYV0Oa8SNKH/zkxvg==", + "dev": true, + "license": "MIT", + "dependencies": { + "arr-filter": "^1.1.1", + "arr-flatten": "^1.0.1", + "arr-map": "^2.0.0", + "array-each": "^1.0.0", + "array-initial": "^1.0.0", + "array-last": "^1.1.1", + "async-done": "^1.2.2", + "async-settle": "^1.0.0", + "now-and-later": "^2.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/@uswds/compile/node_modules/binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@uswds/compile/node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@uswds/compile/node_modules/camelcase": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha512-4nhGqUkc4BqbBBB4Q6zLuD7lzzrHYrjKGeYaEji/3tFR5VdJu9v+LilhGIVe8wxEJPPOeWo7eg8dwY13TZ1BNg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@uswds/compile/node_modules/chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "deprecated": "Chokidar 2 does not receive security updates since 2019. Upgrade to chokidar 3 with 15x fewer dependencies", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + }, + "optionalDependencies": { + "fsevents": "^1.2.7" + } + }, + "node_modules/@uswds/compile/node_modules/cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + } + }, + "node_modules/@uswds/compile/node_modules/copy-props": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/copy-props/-/copy-props-2.0.5.tgz", + "integrity": "sha512-XBlx8HSqrT0ObQwmSzM7WE5k8FxTV75h1DX1Z3n6NhQ/UYYAvInWYmG06vFt7hQZArE2fuO62aihiWIVQwh1sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "each-props": "^1.3.2", + "is-plain-object": "^5.0.0" + } + }, + "node_modules/@uswds/compile/node_modules/define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@uswds/compile/node_modules/each-props": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/each-props/-/each-props-1.3.2.tgz", + "integrity": "sha512-vV0Hem3zAGkJAyU7JSjixeU66rwdynTAa1vofCrSA5fEln+m67Az9CcnkVD776/fsN/UjIWmBDoNRS6t6G9RfA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.1", + "object.defaults": "^1.1.0" + } + }, + "node_modules/@uswds/compile/node_modules/each-props/node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@uswds/compile/node_modules/fast-levenshtein": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-1.1.4.tgz", + "integrity": "sha512-Ia0sQNrMPXXkqVFt6w6M1n1oKo3NfKs+mvaV811Jwir7vAk9a6PVV9VPYf6X3BU97QiLEmuW3uXH9u87zDFfdw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@uswds/compile/node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@uswds/compile/node_modules/findup-sync": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", + "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", + "dev": true, + "license": "MIT", + "dependencies": { + "detect-file": "^1.0.0", + "is-glob": "^4.0.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/@uswds/compile/node_modules/fined": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz", + "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==", + "dev": true, + "license": "MIT", + "dependencies": { + "expand-tilde": "^2.0.2", + "is-plain-object": "^2.0.3", + "object.defaults": "^1.1.0", + "object.pick": "^1.2.0", + "parse-filepath": "^1.0.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/@uswds/compile/node_modules/fined/node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@uswds/compile/node_modules/flagged-respawn": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz", + "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/@uswds/compile/node_modules/fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "deprecated": "The v1 package contains DANGEROUS / INSECURE binaries. Upgrade to safe fsevents v2", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "dependencies": { + "bindings": "^1.5.0", + "nan": "^2.12.1" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/@uswds/compile/node_modules/get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "dev": true, + "license": "ISC" + }, + "node_modules/@uswds/compile/node_modules/glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + } + }, + "node_modules/@uswds/compile/node_modules/glob-parent/node_modules/is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@uswds/compile/node_modules/glob-watcher": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-5.0.5.tgz", + "integrity": "sha512-zOZgGGEHPklZNjZQaZ9f41i7F2YwE+tS5ZHrDhbBCk3stwahn5vQxnFmBJZHoYdusR6R1bLSXeGUy/BhctwKzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "^2.0.0", + "async-done": "^1.2.0", + "chokidar": "^2.0.0", + "is-negated-glob": "^1.0.0", + "just-debounce": "^1.0.0", + "normalize-path": "^3.0.0", + "object.defaults": "^1.1.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/@uswds/compile/node_modules/gulp": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/gulp/-/gulp-4.0.2.tgz", + "integrity": "sha512-dvEs27SCZt2ibF29xYgmnwwCYZxdxhQ/+LFWlbAW8y7jt68L/65402Lz3+CKy0Ov4rOs+NERmDq7YlZaDqUIfA==", + "dev": true, + "license": "MIT", + "dependencies": { + "glob-watcher": "^5.0.3", + "gulp-cli": "^2.2.0", + "undertaker": "^1.2.1", + "vinyl-fs": "^3.0.0" + }, + "bin": { + "gulp": "bin/gulp.js" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/@uswds/compile/node_modules/gulp-cli": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/gulp-cli/-/gulp-cli-2.3.0.tgz", + "integrity": "sha512-zzGBl5fHo0EKSXsHzjspp3y5CONegCm8ErO5Qh0UzFzk2y4tMvzLWhoDokADbarfZRL2pGpRp7yt6gfJX4ph7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-colors": "^1.0.1", + "archy": "^1.0.0", + "array-sort": "^1.0.0", + "color-support": "^1.1.3", + "concat-stream": "^1.6.0", + "copy-props": "^2.0.1", + "fancy-log": "^1.3.2", + "gulplog": "^1.0.0", + "interpret": "^1.4.0", + "isobject": "^3.0.1", + "liftoff": "^3.1.0", + "matchdep": "^2.0.0", + "mute-stdout": "^1.0.0", + "pretty-hrtime": "^1.0.0", + "replace-homedir": "^1.0.0", + "semver-greatest-satisfied-range": "^1.1.0", + "v8flags": "^3.2.0", + "yargs": "^7.1.0" + }, + "bin": { + "gulp": "bin/gulp.js" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/@uswds/compile/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -2860,6 +3308,256 @@ "node": ">=8" } }, + "node_modules/@uswds/compile/node_modules/interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/@uswds/compile/node_modules/is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@uswds/compile/node_modules/is-descriptor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.3.tgz", + "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/@uswds/compile/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@uswds/compile/node_modules/is-extendable/node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@uswds/compile/node_modules/is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "number-is-nan": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@uswds/compile/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@uswds/compile/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@uswds/compile/node_modules/last-run": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/last-run/-/last-run-1.1.1.tgz", + "integrity": "sha512-U/VxvpX4N/rFvPzr3qG5EtLKEnNI0emvIQB3/ecEwv+8GHaUKbIB8vxv1Oai5FAF0d0r7LXHhLLe5K/yChm5GQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "default-resolution": "^2.0.0", + "es6-weak-map": "^2.0.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/@uswds/compile/node_modules/liftoff": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-3.1.0.tgz", + "integrity": "sha512-DlIPlJUkCV0Ips2zf2pJP0unEoT1kwYhiiPUGF3s/jtxTCjziNLoiVVh+jqWOWeFi6mmwQ5fNxvAUyPad4Dfog==", + "dev": true, + "license": "MIT", + "dependencies": { + "extend": "^3.0.0", + "findup-sync": "^3.0.0", + "fined": "^1.0.1", + "flagged-respawn": "^1.0.0", + "is-plain-object": "^2.0.4", + "object.map": "^1.0.0", + "rechoir": "^0.6.2", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/@uswds/compile/node_modules/liftoff/node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@uswds/compile/node_modules/micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "license": "MIT", + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@uswds/compile/node_modules/micromatch/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@uswds/compile/node_modules/micromatch/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@uswds/compile/node_modules/mute-stdout": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mute-stdout/-/mute-stdout-1.0.1.tgz", + "integrity": "sha512-kDcwXR4PS7caBpuRYYBUz9iVixUk3anO3f5OYFiIPwK/20vCzKCHyKoulbiDY1S53zD2bxUpxN/IJ+TnXjfvxg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/@uswds/compile/node_modules/readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/@uswds/compile/node_modules/rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "dev": true, + "dependencies": { + "resolve": "^1.1.6" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/@uswds/compile/node_modules/replace-homedir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/replace-homedir/-/replace-homedir-1.0.0.tgz", + "integrity": "sha512-CHPV/GAglbIB1tnQgaiysb8H2yCy8WQ7lcEwQ/eT+kLj0QHV8LnJW0zpqpE7RSkrMSRoa+EBoag86clf7WAgSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "homedir-polyfill": "^1.0.1", + "is-absolute": "^1.0.0", + "remove-trailing-separator": "^1.1.0" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/@uswds/compile/node_modules/sass-embedded": { "version": "1.69.5", "resolved": "https://registry.npmjs.org/sass-embedded/-/sass-embedded-1.69.5.tgz", @@ -3039,6 +3737,47 @@ "node": ">=14.0.0" } }, + "node_modules/@uswds/compile/node_modules/semver-greatest-satisfied-range": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/semver-greatest-satisfied-range/-/semver-greatest-satisfied-range-1.1.0.tgz", + "integrity": "sha512-Ny/iyOzSSa8M5ML46IAx3iXc6tfOsYU2R4AXi2UpHk60Zrgyq6eqPj/xiOfS0rRl/iiQ/rdJkVjw/5cdUyCntQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "sver-compat": "^1.5.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/@uswds/compile/node_modules/string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", + "dev": true, + "license": "MIT", + "dependencies": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@uswds/compile/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/@uswds/compile/node_modules/supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", @@ -3054,6 +3793,119 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, + "node_modules/@uswds/compile/node_modules/to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@uswds/compile/node_modules/undertaker": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/undertaker/-/undertaker-1.3.0.tgz", + "integrity": "sha512-/RXwi5m/Mu3H6IHQGww3GNt1PNXlbeCuclF2QYR14L/2CHPz3DFZkvB5hZ0N/QUkiXWCACML2jXViIQEQc2MLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "arr-flatten": "^1.0.1", + "arr-map": "^2.0.0", + "bach": "^1.0.0", + "collection-map": "^1.0.0", + "es6-weak-map": "^2.0.1", + "fast-levenshtein": "^1.0.0", + "last-run": "^1.1.0", + "object.defaults": "^1.0.0", + "object.reduce": "^1.0.0", + "undertaker-registry": "^1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/@uswds/compile/node_modules/undertaker-registry": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/undertaker-registry/-/undertaker-registry-1.0.1.tgz", + "integrity": "sha512-UR1khWeAjugW3548EfQmL9Z7pGMlBgXteQpr1IZeZBtnkCJQJIJ1Scj0mb9wQaPvUZ9Q17XqW6TIaPchJkyfqw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/@uswds/compile/node_modules/v8flags": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.2.0.tgz", + "integrity": "sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==", + "dev": true, + "license": "MIT", + "dependencies": { + "homedir-polyfill": "^1.0.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/@uswds/compile/node_modules/wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==", + "dev": true, + "license": "MIT", + "dependencies": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@uswds/compile/node_modules/y18n": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", + "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/@uswds/compile/node_modules/yargs": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.2.tgz", + "integrity": "sha512-ZEjj/dQYQy0Zx0lgLMLR8QuaqTihnxirir7EwUHp1Axq4e3+k8jXU5K0VLbNvedv1f4EWtBonDIZm0NUr+jCcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "camelcase": "^3.0.0", + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "get-caller-file": "^1.0.1", + "os-locale": "^1.4.0", + "read-pkg-up": "^1.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^1.0.2", + "which-module": "^1.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^5.0.1" + } + }, + "node_modules/@uswds/compile/node_modules/yargs-parser": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.1.tgz", + "integrity": "sha512-wpav5XYiddjXxirPoCTUPbqM0PXvJ9hiBMvuJgInvo4/lAOTZzUprArw17q2O1P2+GHhbBr18/iQwjL5Z9BqfA==", + "dev": true, + "license": "ISC", + "dependencies": { + "camelcase": "^3.0.0", + "object.assign": "^4.1.0" + } + }, "node_modules/@uswds/uswds": { "version": "3.8.1", "resolved": "https://registry.npmjs.org/@uswds/uswds/-/uswds-3.8.1.tgz", @@ -3284,7 +4136,8 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/argparse": { "version": "1.0.10", @@ -3309,6 +4162,7 @@ "resolved": "https://registry.npmjs.org/arr-filter/-/arr-filter-1.1.2.tgz", "integrity": "sha512-A2BETWCqhsecSvCkWAeVBFLH6sXEUGASuzkpjL3GR1SlL/PWL6M3J8EAAld2Uubmh39tvkJTqC9LeLHCUKmFXA==", "dev": true, + "license": "MIT", "dependencies": { "make-iterator": "^1.0.0" }, @@ -3330,6 +4184,7 @@ "resolved": "https://registry.npmjs.org/arr-map/-/arr-map-2.0.2.tgz", "integrity": "sha512-tVqVTHt+Q5Xb09qRkbu+DidW1yYzz5izWS2Xm2yFm7qJnmUfz4HPzNxbHkdRJbz2lrqI7S+z17xNYdFcBBO8Hw==", "dev": true, + "license": "MIT", "dependencies": { "make-iterator": "^1.0.0" }, @@ -3360,6 +4215,7 @@ "resolved": "https://registry.npmjs.org/array-initial/-/array-initial-1.1.0.tgz", "integrity": "sha512-BC4Yl89vneCYfpLrs5JU2aAu9/a+xWbeKhvISg9PT7eWFB9UlRvI+rKEtk6mgxWr3dSkk9gQ8hCrdqt06NXPdw==", "dev": true, + "license": "MIT", "dependencies": { "array-slice": "^1.0.0", "is-number": "^4.0.0" @@ -3373,6 +4229,7 @@ "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -3382,6 +4239,7 @@ "resolved": "https://registry.npmjs.org/array-last/-/array-last-1.3.0.tgz", "integrity": "sha512-eOCut5rXlI6aCOS7Z7kCplKRKyiFQ6dHFBem4PwlwKeNFk2/XxTrhRh5T9PyaEWGy/NHTZWbY+nsZlNFJu9rYg==", "dev": true, + "license": "MIT", "dependencies": { "is-number": "^4.0.0" }, @@ -3394,6 +4252,7 @@ "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -3403,6 +4262,7 @@ "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -3412,6 +4272,7 @@ "resolved": "https://registry.npmjs.org/array-sort/-/array-sort-1.0.0.tgz", "integrity": "sha512-ihLeJkonmdiAsD7vpgN3CRcx2J2S0TiYW+IS/5zHBI7mKUq3ySvBdzzBfD236ubDBQFiiyG3SWCPc+msQ9KoYg==", "dev": true, + "license": "MIT", "dependencies": { "default-compare": "^1.0.0", "get-value": "^2.0.6", @@ -3421,6 +4282,16 @@ "node": ">=0.10.0" } }, + "node_modules/array-sort/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/array-union": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", @@ -3435,6 +4306,7 @@ "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", "integrity": "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -3458,30 +4330,44 @@ } }, "node_modules/async-done": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/async-done/-/async-done-1.3.2.tgz", - "integrity": "sha512-uYkTP8dw2og1tu1nmza1n1CMW0qb8gWWlwqMmLb7MhBVs4BXrFziT6HXUd+/RlRA/i4H9AkofYloUbs1fwMqlw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/async-done/-/async-done-2.0.0.tgz", + "integrity": "sha512-j0s3bzYq9yKIVLKGE/tWlCpa3PfFLcrDZLTSVdnnCTGagXuXBJO4SsY9Xdk/fQBirCkH4evW5xOeJXqlAQFdsw==", "dev": true, + "license": "MIT", "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.2", - "process-nextick-args": "^2.0.0", - "stream-exhaust": "^1.0.1" + "end-of-stream": "^1.4.4", + "once": "^1.4.0", + "stream-exhaust": "^1.0.2" }, "engines": { - "node": ">= 0.10" + "node": ">= 10.13.0" } }, - "node_modules/async-settle": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/async-settle/-/async-settle-1.0.0.tgz", - "integrity": "sha512-VPXfB4Vk49z1LHHodrEQ6Xf7W4gg1w0dAPROHngx7qgDjqmIQ+fXmwgGXTW/ITLai0YLSvWepJOP9EVpMnEAcw==", + "node_modules/async-each": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.6.tgz", + "integrity": "sha512-c646jH1avxr+aVpndVMeAfYw7wAa6idufrlN3LPA4PmKS0QEGp6PIC9nwz0WQkkvBGAMEki3pFdtxaF39J9vvg==", "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "license": "MIT" + }, + "node_modules/async-settle": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/async-settle/-/async-settle-2.0.0.tgz", + "integrity": "sha512-Obu/KE8FurfQRN6ODdHN9LuXqwC+JFIM9NRyZqJJ4ZfLJmIYN9Rg0/kb+wF70VV5+fJusTMQlJ1t5rF7J/ETdg==", + "dev": true, + "license": "MIT", "dependencies": { - "async-done": "^1.2.2" + "async-done": "^2.0.0" }, "engines": { - "node": ">= 0.10" + "node": ">= 10.13.0" } }, "node_modules/asynckit": { @@ -3539,6 +4425,13 @@ "postcss": "^8.1.0" } }, + "node_modules/b4a": { + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.6.tgz", + "integrity": "sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg==", + "dev": true, + "license": "Apache-2.0" + }, "node_modules/babel-jest": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", @@ -3756,23 +4649,31 @@ } }, "node_modules/bach": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/bach/-/bach-1.2.0.tgz", - "integrity": "sha512-bZOOfCb3gXBXbTFXq3OZtGR88LwGeJvzu6szttaIzymOTS4ZttBNOWSv7aLZja2EMycKtRYV0Oa8SNKH/zkxvg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/bach/-/bach-2.0.1.tgz", + "integrity": "sha512-A7bvGMGiTOxGMpNupYl9HQTf0FFDNF4VCmks4PJpFyN1AX2pdKuxuwdvUz2Hu388wcgp+OvGFNsumBfFNkR7eg==", "dev": true, + "license": "MIT", "dependencies": { - "arr-filter": "^1.1.1", - "arr-flatten": "^1.0.1", - "arr-map": "^2.0.0", - "array-each": "^1.0.0", - "array-initial": "^1.0.0", - "array-last": "^1.1.1", - "async-done": "^1.2.2", - "async-settle": "^1.0.0", - "now-and-later": "^2.0.0" + "async-done": "^2.0.0", + "async-settle": "^2.0.0", + "now-and-later": "^3.0.0" }, "engines": { - "node": ">= 0.10" + "node": ">=10.13.0" + } + }, + "node_modules/bach/node_modules/now-and-later": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/now-and-later/-/now-and-later-3.0.0.tgz", + "integrity": "sha512-pGO4pzSdaxhWTGkfSfHx3hVzJVslFPwBp2Myq9MYN/ChfJZF87ochMAXnvz6/58RJSf5ik2q9tXprBBrk2cpcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + }, + "engines": { + "node": ">= 10.13.0" } }, "node_modules/balanced-match": { @@ -3781,11 +4682,20 @@ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true }, + "node_modules/bare-events": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.4.2.tgz", + "integrity": "sha512-qMKFd2qG/36aA4GwvKq8MxnPgCQAmBWmSyLWsJcbn8v03wvIPQ/hG1Ms8bPzndZxMDoHpxez5VOS+gC9Yi24/Q==", + "dev": true, + "license": "Apache-2.0", + "optional": true + }, "node_modules/base": { "version": "0.11.2", "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", "dev": true, + "license": "MIT", "dependencies": { "cache-base": "^1.0.1", "class-utils": "^0.3.5", @@ -3804,6 +4714,7 @@ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", "dev": true, + "license": "MIT", "dependencies": { "is-descriptor": "^1.0.0" }, @@ -3816,6 +4727,7 @@ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.3.tgz", "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==", "dev": true, + "license": "MIT", "dependencies": { "is-accessor-descriptor": "^1.0.1", "is-data-descriptor": "^1.0.1" @@ -3824,6 +4736,27 @@ "node": ">= 0.4" } }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, "node_modules/beeper": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/beeper/-/beeper-1.1.1.tgz", @@ -3876,6 +4809,44 @@ "url": "https://bevry.me/fund" } }, + "node_modules/bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "file-uri-to-path": "1.0.0" + } + }, + "node_modules/bl": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-5.1.0.tgz", + "integrity": "sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "buffer": "^6.0.3", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/bl/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/boolbase": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", @@ -3950,6 +4921,31 @@ "node-int64": "^0.4.0" } }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, "node_modules/buffer-builder": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/buffer-builder/-/buffer-builder-0.2.0.tgz", @@ -3990,6 +4986,7 @@ "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", "dev": true, + "license": "MIT", "dependencies": { "collection-visit": "^1.0.0", "component-emitter": "^1.2.1", @@ -4190,6 +5187,7 @@ "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", "dev": true, + "license": "MIT", "dependencies": { "arr-union": "^3.1.0", "define-property": "^0.2.5", @@ -4240,74 +5238,15 @@ } }, "node_modules/cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", "dev": true, + "license": "ISC", "dependencies": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wrap-ansi": "^2.0.0" - } - }, - "node_modules/cliui/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/cliui/node_modules/is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", - "dev": true, - "dependencies": { - "number-is-nan": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/cliui/node_modules/string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", - "dev": true, - "dependencies": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/cliui/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", - "dev": true, - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/cliui/node_modules/wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==", - "dev": true, - "dependencies": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" } }, "node_modules/clone": { @@ -4362,6 +5301,7 @@ "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", "integrity": "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -4377,6 +5317,7 @@ "resolved": "https://registry.npmjs.org/collection-map/-/collection-map-1.0.0.tgz", "integrity": "sha512-5D2XXSpkOnleOI21TG7p3T0bGAsZ/XknZpKBmGYyluO8pw4zA3K8ZlrBIbC4FXg3m6z/RNFiUFfT2sQK01+UHA==", "dev": true, + "license": "MIT", "dependencies": { "arr-map": "^2.0.2", "for-own": "^1.0.0", @@ -4391,6 +5332,7 @@ "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", "integrity": "sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==", "dev": true, + "license": "MIT", "dependencies": { "map-visit": "^1.0.0", "object-visit": "^1.0.0" @@ -4449,6 +5391,7 @@ "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.1.tgz", "integrity": "sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==", "dev": true, + "license": "MIT", "funding": { "url": "https://github.com/sponsors/sindresorhus" } @@ -4467,6 +5410,7 @@ "engines": [ "node >= 0.8" ], + "license": "MIT", "dependencies": { "buffer-from": "^1.0.0", "inherits": "^2.0.3", @@ -4503,18 +5447,23 @@ "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", "integrity": "sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/copy-props": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/copy-props/-/copy-props-2.0.5.tgz", - "integrity": "sha512-XBlx8HSqrT0ObQwmSzM7WE5k8FxTV75h1DX1Z3n6NhQ/UYYAvInWYmG06vFt7hQZArE2fuO62aihiWIVQwh1sw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/copy-props/-/copy-props-4.0.0.tgz", + "integrity": "sha512-bVWtw1wQLzzKiYROtvNlbJgxgBYt2bMJpkCbKmXM3xyijvcjjWXEk5nyrrT3bgJ7ODb19ZohE2T0Y3FgNPyoTw==", "dev": true, + "license": "MIT", "dependencies": { - "each-props": "^1.3.2", + "each-props": "^3.0.0", "is-plain-object": "^5.0.0" + }, + "engines": { + "node": ">= 10.13.0" } }, "node_modules/core-js-compat": { @@ -4808,6 +5757,7 @@ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -4855,6 +5805,7 @@ "resolved": "https://registry.npmjs.org/default-compare/-/default-compare-1.0.0.tgz", "integrity": "sha512-QWfXlM0EkAbqOCbD/6HjdwT19j7WCkMyiRhWilc4H9/5h/RzTF9gv5LYh1+CmDV5d1rki6KAWLtQale0xt20eQ==", "dev": true, + "license": "MIT", "dependencies": { "kind-of": "^5.0.2" }, @@ -4862,11 +5813,22 @@ "node": ">=0.10.0" } }, + "node_modules/default-compare/node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/default-resolution": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/default-resolution/-/default-resolution-2.0.0.tgz", "integrity": "sha512-2xaP6GiwVwOEbXCGoJ4ufgC76m8cj805jrghScewJC2ZDsb9U0b4BIrba+xt/Uytyd0HvQ6+WymSRTfnYj59GQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.10" } @@ -4910,6 +5872,7 @@ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", "dev": true, + "license": "MIT", "dependencies": { "is-descriptor": "^0.1.0" }, @@ -4953,6 +5916,7 @@ "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", "integrity": "sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -5073,25 +6037,17 @@ } }, "node_modules/each-props": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/each-props/-/each-props-1.3.2.tgz", - "integrity": "sha512-vV0Hem3zAGkJAyU7JSjixeU66rwdynTAa1vofCrSA5fEln+m67Az9CcnkVD776/fsN/UjIWmBDoNRS6t6G9RfA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/each-props/-/each-props-3.0.0.tgz", + "integrity": "sha512-IYf1hpuWrdzse/s/YJOrFmU15lyhSzxelNVAHTEG3DtP4QsLTWZUzcUL3HMXmKQxXpa4EIrBPpwRgj0aehdvAw==", "dev": true, + "license": "MIT", "dependencies": { - "is-plain-object": "^2.0.1", + "is-plain-object": "^5.0.0", "object.defaults": "^1.1.0" - } - }, - "node_modules/each-props/node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "dependencies": { - "isobject": "^3.0.1" }, "engines": { - "node": ">=0.10.0" + "node": ">= 10.13.0" } }, "node_modules/electron-to-chromium": { @@ -5405,6 +6361,7 @@ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", "integrity": "sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==", "dev": true, + "license": "MIT", "dependencies": { "debug": "^2.3.3", "define-property": "^0.2.5", @@ -5423,6 +6380,7 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, + "license": "MIT", "dependencies": { "ms": "2.0.0" } @@ -5431,13 +6389,15 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/expand-tilde": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", "integrity": "sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==", "dev": true, + "license": "MIT", "dependencies": { "homedir-polyfill": "^1.0.1" }, @@ -5487,6 +6447,7 @@ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", "dev": true, + "license": "MIT", "dependencies": { "is-extendable": "^0.1.0" }, @@ -5499,6 +6460,7 @@ "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", "dev": true, + "license": "MIT", "dependencies": { "array-unique": "^0.3.2", "define-property": "^1.0.0", @@ -5518,6 +6480,7 @@ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", "dev": true, + "license": "MIT", "dependencies": { "is-descriptor": "^1.0.0" }, @@ -5530,6 +6493,7 @@ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.3.tgz", "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==", "dev": true, + "license": "MIT", "dependencies": { "is-accessor-descriptor": "^1.0.1", "is-data-descriptor": "^1.0.1" @@ -5538,12 +6502,35 @@ "node": ">= 0.4" } }, + "node_modules/fancy-log": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz", + "integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-gray": "^0.1.1", + "color-support": "^1.1.3", + "parse-node-version": "^1.0.0", + "time-stamp": "^1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true }, + "node_modules/fast-fifo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", + "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", + "dev": true, + "license": "MIT" + }, "node_modules/fast-glob": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", @@ -5567,10 +6554,24 @@ "dev": true }, "node_modules/fast-levenshtein": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-1.1.4.tgz", - "integrity": "sha512-Ia0sQNrMPXXkqVFt6w6M1n1oKo3NfKs+mvaV811Jwir7vAk9a6PVV9VPYf6X3BU97QiLEmuW3uXH9u87zDFfdw==", - "dev": true + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-3.0.0.tgz", + "integrity": "sha512-hKKNajm46uNmTlhHSyZkmToAc56uZJwYq7yrciZjqOxnlfQwERDQJmHPUp7m1m9wx8vgOe8IaCKZ5Kv2k1DdCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fastest-levenshtein": "^1.0.7" + } + }, + "node_modules/fastest-levenshtein": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.9.1" + } }, "node_modules/fastq": { "version": "1.15.0", @@ -5590,6 +6591,14 @@ "bser": "2.1.1" } }, + "node_modules/file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "dev": true, + "license": "MIT", + "optional": true + }, "node_modules/fill-range": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", @@ -5616,224 +6625,46 @@ } }, "node_modules/findup-sync": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", - "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-5.0.0.tgz", + "integrity": "sha512-MzwXju70AuyflbgeOhzvQWAvvQdo1XL0A9bVvlXsYcFEBM87WR4OakL4OfZq+QRmr+duJubio+UtNQCPsVESzQ==", "dev": true, + "license": "MIT", "dependencies": { "detect-file": "^1.0.0", - "is-glob": "^4.0.0", - "micromatch": "^3.0.4", + "is-glob": "^4.0.3", + "micromatch": "^4.0.4", "resolve-dir": "^1.0.1" }, "engines": { - "node": ">= 0.10" - } - }, - "node_modules/findup-sync/node_modules/braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "dependencies": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/findup-sync/node_modules/define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "dependencies": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/findup-sync/node_modules/fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", - "dev": true, - "dependencies": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/findup-sync/node_modules/is-descriptor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.3.tgz", - "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^1.0.1", - "is-data-descriptor": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/findup-sync/node_modules/is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/findup-sync/node_modules/is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/findup-sync/node_modules/is-number/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/findup-sync/node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/findup-sync/node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/findup-sync/node_modules/micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "dependencies": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/findup-sync/node_modules/micromatch/node_modules/extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", - "dev": true, - "dependencies": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/findup-sync/node_modules/to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", - "dev": true, - "dependencies": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - }, - "engines": { - "node": ">=0.10.0" + "node": ">= 10.13.0" } }, "node_modules/fined": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz", - "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fined/-/fined-2.0.0.tgz", + "integrity": "sha512-OFRzsL6ZMHz5s0JrsEr+TpdGNCtrVtnuG3x1yzGNiQHT0yaDnXAj8V/lWcpJVrnoDpcwXcASxAZYbuXda2Y82A==", "dev": true, + "license": "MIT", "dependencies": { "expand-tilde": "^2.0.2", - "is-plain-object": "^2.0.3", + "is-plain-object": "^5.0.0", "object.defaults": "^1.1.0", - "object.pick": "^1.2.0", - "parse-filepath": "^1.0.1" + "object.pick": "^1.3.0", + "parse-filepath": "^1.0.2" }, "engines": { - "node": ">= 0.10" - } - }, - "node_modules/fined/node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" + "node": ">= 10.13.0" } }, "node_modules/flagged-respawn": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz", - "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-2.0.0.tgz", + "integrity": "sha512-Gq/a6YCi8zexmGHMuJwahTGzXlAZAOsbCVKduWXC6TlLCjjFRlExMJc4GC2NYPYZ0r/brw9P7CpRgQmlPVeOoA==", "dev": true, + "license": "MIT", "engines": { - "node": ">= 0.10" + "node": ">= 10.13.0" } }, "node_modules/flush-write-stream": { @@ -5851,6 +6682,7 @@ "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -5860,6 +6692,7 @@ "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", "integrity": "sha512-0OABksIGrxKK8K4kynWkQ7y1zounQxP+CWnyclVwj81KW3vlLlGUx57DKGcP/LH216GzqnstnPocF16Nxs0Ycg==", "dev": true, + "license": "MIT", "dependencies": { "for-in": "^1.0.1" }, @@ -5899,6 +6732,7 @@ "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", "integrity": "sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==", "dev": true, + "license": "MIT", "dependencies": { "map-cache": "^0.2.2" }, @@ -6036,6 +6870,7 @@ "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", "integrity": "sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -6116,212 +6951,17 @@ } }, "node_modules/glob-watcher": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-5.0.5.tgz", - "integrity": "sha512-zOZgGGEHPklZNjZQaZ9f41i7F2YwE+tS5ZHrDhbBCk3stwahn5vQxnFmBJZHoYdusR6R1bLSXeGUy/BhctwKzw==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-6.0.0.tgz", + "integrity": "sha512-wGM28Ehmcnk2NqRORXFOTOR064L4imSw3EeOqU5bIwUf62eXGwg89WivH6VMahL8zlQHeodzvHpXplrqzrz3Nw==", "dev": true, + "license": "MIT", "dependencies": { - "anymatch": "^2.0.0", - "async-done": "^1.2.0", - "chokidar": "^3.6.0", - "is-negated-glob": "^1.0.0", - "just-debounce": "^1.0.0", - "normalize-path": "^3.0.0", - "object.defaults": "^1.1.0" + "async-done": "^2.0.0", + "chokidar": "^3.5.3" }, "engines": { - "node": ">= 0.10" - } - }, - "node_modules/glob-watcher/node_modules/anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, - "dependencies": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - } - }, - "node_modules/glob-watcher/node_modules/anymatch/node_modules/normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", - "dev": true, - "dependencies": { - "remove-trailing-separator": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/glob-watcher/node_modules/braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "dependencies": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/glob-watcher/node_modules/define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "dependencies": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/glob-watcher/node_modules/fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", - "dev": true, - "dependencies": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/glob-watcher/node_modules/is-descriptor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.3.tgz", - "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^1.0.1", - "is-data-descriptor": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/glob-watcher/node_modules/is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "dependencies": { - "is-plain-object": "^2.0.4" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/glob-watcher/node_modules/is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/glob-watcher/node_modules/is-number/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/glob-watcher/node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/glob-watcher/node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/glob-watcher/node_modules/micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "dependencies": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/glob-watcher/node_modules/micromatch/node_modules/extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", - "dev": true, - "dependencies": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/glob-watcher/node_modules/to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", - "dev": true, - "dependencies": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - }, - "engines": { - "node": ">=0.10.0" + "node": ">= 10.13.0" } }, "node_modules/global-modules": { @@ -6329,6 +6969,7 @@ "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", "dev": true, + "license": "MIT", "dependencies": { "global-prefix": "^1.0.1", "is-windows": "^1.0.1", @@ -6343,6 +6984,7 @@ "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", "integrity": "sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==", "dev": true, + "license": "MIT", "dependencies": { "expand-tilde": "^2.0.2", "homedir-polyfill": "^1.0.1", @@ -6359,6 +7001,7 @@ "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, + "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, @@ -6440,21 +7083,22 @@ "dev": true }, "node_modules/gulp": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/gulp/-/gulp-4.0.2.tgz", - "integrity": "sha512-dvEs27SCZt2ibF29xYgmnwwCYZxdxhQ/+LFWlbAW8y7jt68L/65402Lz3+CKy0Ov4rOs+NERmDq7YlZaDqUIfA==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/gulp/-/gulp-5.0.0.tgz", + "integrity": "sha512-S8Z8066SSileaYw1S2N1I64IUc/myI2bqe2ihOBzO6+nKpvNSg7ZcWJt/AwF8LC/NVN+/QZ560Cb/5OPsyhkhg==", "dev": true, + "license": "MIT", "dependencies": { - "glob-watcher": "^5.0.3", - "gulp-cli": "^2.2.0", - "undertaker": "^1.2.1", - "vinyl-fs": "^3.0.0" + "glob-watcher": "^6.0.0", + "gulp-cli": "^3.0.0", + "undertaker": "^2.0.0", + "vinyl-fs": "^4.0.0" }, "bin": { "gulp": "bin/gulp.js" }, "engines": { - "node": ">= 0.10" + "node": ">=10.13.0" } }, "node_modules/gulp-add-src": { @@ -6633,64 +7277,142 @@ } }, "node_modules/gulp-cli": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/gulp-cli/-/gulp-cli-2.3.0.tgz", - "integrity": "sha512-zzGBl5fHo0EKSXsHzjspp3y5CONegCm8ErO5Qh0UzFzk2y4tMvzLWhoDokADbarfZRL2pGpRp7yt6gfJX4ph7A==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/gulp-cli/-/gulp-cli-3.0.0.tgz", + "integrity": "sha512-RtMIitkT8DEMZZygHK2vEuLPqLPAFB4sntSxg4NoDta7ciwGZ18l7JuhCTiS5deOJi2IoK0btE+hs6R4sfj7AA==", "dev": true, + "license": "MIT", "dependencies": { - "ansi-colors": "^1.0.1", - "archy": "^1.0.0", - "array-sort": "^1.0.0", - "color-support": "^1.1.3", - "concat-stream": "^1.6.0", - "copy-props": "^2.0.1", - "fancy-log": "^1.3.2", - "gulplog": "^1.0.0", - "interpret": "^1.4.0", - "isobject": "^3.0.1", - "liftoff": "^3.1.0", - "matchdep": "^2.0.0", - "mute-stdout": "^1.0.0", - "pretty-hrtime": "^1.0.0", - "replace-homedir": "^1.0.0", - "semver-greatest-satisfied-range": "^1.1.0", - "v8flags": "^3.2.0", - "yargs": "^7.1.0" + "@gulpjs/messages": "^1.1.0", + "chalk": "^4.1.2", + "copy-props": "^4.0.0", + "gulplog": "^2.2.0", + "interpret": "^3.1.1", + "liftoff": "^5.0.0", + "mute-stdout": "^2.0.0", + "replace-homedir": "^2.0.0", + "semver-greatest-satisfied-range": "^2.0.0", + "string-width": "^4.2.3", + "v8flags": "^4.0.0", + "yargs": "^16.2.0" }, "bin": { "gulp": "bin/gulp.js" }, "engines": { - "node": ">= 0.10" + "node": ">=10.13.0" } }, - "node_modules/gulp-cli/node_modules/ansi-colors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", - "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", + "node_modules/gulp-cli/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "license": "MIT", "dependencies": { - "ansi-wrap": "^0.1.0" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/gulp-cli/node_modules/fancy-log": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz", - "integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==", + "node_modules/gulp-cli/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", "dependencies": { - "ansi-gray": "^0.1.1", - "color-support": "^1.1.3", - "parse-node-version": "^1.0.0", - "time-stamp": "^1.0.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">= 0.10" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/gulp-cli/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/gulp-cli/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/gulp-cli/node_modules/glogg": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/glogg/-/glogg-2.2.0.tgz", + "integrity": "sha512-eWv1ds/zAlz+M1ioHsyKJomfY7jbDDPpwSkv14KQj89bycx1nvK5/2Cj/T9g7kzJcX5Bc7Yv22FjfBZS/jl94A==", + "dev": true, + "license": "MIT", + "dependencies": { + "sparkles": "^2.1.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/gulp-cli/node_modules/gulplog": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-2.2.0.tgz", + "integrity": "sha512-V2FaKiOhpR3DRXZuYdRLn/qiY0yI5XmqbTKrYbdemJ+xOh2d2MOweI/XFgMzd/9+1twdvMwllnZbWZNJ+BOm4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "glogg": "^2.2.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/gulp-cli/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/gulp-cli/node_modules/sparkles": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-2.1.0.tgz", + "integrity": "sha512-r7iW1bDw8R/cFifrD3JnQJX0K1jqT0kprL48BiBpLZLJPmAm34zsVBsK5lc7HirZYZqMW65dOXZgbAGt/I6frg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/gulp-cli/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, "node_modules/gulp-concat": { @@ -7058,22 +7780,6 @@ "node": ">=0.10.0" } }, - "node_modules/gulp-plumber/node_modules/fancy-log": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz", - "integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-gray": "^0.1.1", - "color-support": "^1.1.3", - "parse-node-version": "^1.0.0", - "time-stamp": "^1.0.0" - }, - "engines": { - "node": ">= 0.10" - } - }, "node_modules/gulp-plumber/node_modules/kind-of": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-1.1.0.tgz", @@ -7157,22 +7863,6 @@ "postcss": "^8.0.0" } }, - "node_modules/gulp-postcss/node_modules/fancy-log": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz", - "integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-gray": "^0.1.1", - "color-support": "^1.1.3", - "parse-node-version": "^1.0.0", - "time-stamp": "^1.0.0" - }, - "engines": { - "node": ">= 0.10" - } - }, "node_modules/gulp-prettyerror": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/gulp-prettyerror/-/gulp-prettyerror-2.0.0.tgz", @@ -7282,22 +7972,6 @@ "node": ">=10.0" } }, - "node_modules/gulp-svgstore/node_modules/fancy-log": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz", - "integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-gray": "^0.1.1", - "color-support": "^1.1.3", - "parse-node-version": "^1.0.0", - "time-stamp": "^1.0.0" - }, - "engines": { - "node": ">= 0.10" - } - }, "node_modules/gulp-svgstore/node_modules/replace-ext": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.1.tgz", @@ -7400,6 +8074,163 @@ "node": ">=0.4" } }, + "node_modules/gulp/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/gulp/node_modules/fs-mkdirp-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fs-mkdirp-stream/-/fs-mkdirp-stream-2.0.1.tgz", + "integrity": "sha512-UTOY+59K6IA94tec8Wjqm0FSh5OVudGNB0NL/P6fB3HiE3bYOY3VYBGijsnOHNkQSwC1FKkU77pmq7xp9CskLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.8", + "streamx": "^2.12.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/gulp/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/gulp/node_modules/glob-stream": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-8.0.2.tgz", + "integrity": "sha512-R8z6eTB55t3QeZMmU1C+Gv+t5UnNRkA55c5yo67fAVfxODxieTwsjNG7utxS/73NdP1NbDgCrhVEg2h00y4fFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@gulpjs/to-absolute-glob": "^4.0.0", + "anymatch": "^3.1.3", + "fastq": "^1.13.0", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "is-negated-glob": "^1.0.0", + "normalize-path": "^3.0.0", + "streamx": "^2.12.5" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/gulp/node_modules/lead": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/lead/-/lead-4.0.0.tgz", + "integrity": "sha512-DpMa59o5uGUWWjruMp71e6knmwKU3jRBBn1kjuLWN9EeIOxNeSAwvHf03WIl8g/ZMR2oSQC9ej3yeLBwdDc/pg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/gulp/node_modules/now-and-later": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/now-and-later/-/now-and-later-3.0.0.tgz", + "integrity": "sha512-pGO4pzSdaxhWTGkfSfHx3hVzJVslFPwBp2Myq9MYN/ChfJZF87ochMAXnvz6/58RJSf5ik2q9tXprBBrk2cpcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/gulp/node_modules/resolve-options": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-options/-/resolve-options-2.0.0.tgz", + "integrity": "sha512-/FopbmmFOQCfsCx77BRFdKOniglTiHumLgwvd6IDPihy1GKkadZbgQJBcTb2lMzSR1pndzd96b1nZrreZ7+9/A==", + "dev": true, + "license": "MIT", + "dependencies": { + "value-or-function": "^4.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/gulp/node_modules/to-through": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/to-through/-/to-through-3.0.0.tgz", + "integrity": "sha512-y8MN937s/HVhEoBU1SxfHC+wxCHkV1a9gW8eAdTadYh/bGyesZIVcbjI+mSpFbSVwQici/XjBjuUyri1dnXwBw==", + "dev": true, + "license": "MIT", + "dependencies": { + "streamx": "^2.12.5" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/gulp/node_modules/value-or-function": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/value-or-function/-/value-or-function-4.0.0.tgz", + "integrity": "sha512-aeVK81SIuT6aMJfNo9Vte8Dw0/FZINGBV8BfCraGtqVxIeLAEhJyoWs8SmvRVmXfGss2PmmOwZCuBPbZR+IYWg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/gulp/node_modules/vinyl-fs": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-4.0.0.tgz", + "integrity": "sha512-7GbgBnYfaquMk3Qu9g22x000vbYkOex32930rBnc3qByw6HfMEAoELjCjoJv4HuEQxHAurT+nvMHm6MnJllFLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fs-mkdirp-stream": "^2.0.1", + "glob-stream": "^8.0.0", + "graceful-fs": "^4.2.11", + "iconv-lite": "^0.6.3", + "is-valid-glob": "^1.0.0", + "lead": "^4.0.0", + "normalize-path": "3.0.0", + "resolve-options": "^2.0.0", + "stream-composer": "^1.0.2", + "streamx": "^2.14.0", + "to-through": "^3.0.0", + "value-or-function": "^4.0.0", + "vinyl": "^3.0.0", + "vinyl-sourcemap": "^2.0.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/gulp/node_modules/vinyl-sourcemap": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/vinyl-sourcemap/-/vinyl-sourcemap-2.0.0.tgz", + "integrity": "sha512-BAEvWxbBUXvlNoFQVFVHpybBbjW1r03WhohJzJDSfgrrK5xVYIDTan6xN14DlyImShgDRv2gl9qhM6irVMsV0Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "convert-source-map": "^2.0.0", + "graceful-fs": "^4.2.10", + "now-and-later": "^3.0.0", + "streamx": "^2.12.5", + "vinyl": "^3.0.0", + "vinyl-contents": "^2.0.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, "node_modules/gulplog": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", @@ -7495,6 +8326,7 @@ "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", "integrity": "sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==", "dev": true, + "license": "MIT", "dependencies": { "get-value": "^2.0.6", "has-values": "^1.0.0", @@ -7509,6 +8341,7 @@ "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", "integrity": "sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==", "dev": true, + "license": "MIT", "dependencies": { "is-number": "^3.0.0", "kind-of": "^4.0.0" @@ -7522,6 +8355,7 @@ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", "dev": true, + "license": "MIT", "dependencies": { "kind-of": "^3.0.2" }, @@ -7534,18 +8368,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/has-values/node_modules/kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==", - "dev": true, + "license": "MIT", "dependencies": { "is-buffer": "^1.1.5" }, @@ -7590,6 +8413,7 @@ "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", "dev": true, + "license": "MIT", "dependencies": { "parse-passwd": "^1.0.0" }, @@ -7601,7 +8425,8 @@ "version": "2.8.9", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/html-encoding-sniffer": { "version": "3.0.0", @@ -7688,6 +8513,27 @@ "node": ">=0.10.0" } }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, "node_modules/ignore": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", @@ -7759,15 +8605,17 @@ "version": "1.3.8", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/interpret": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", - "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", + "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", "dev": true, + "license": "MIT", "engines": { - "node": ">= 0.10" + "node": ">=10.13.0" } }, "node_modules/invert-kv": { @@ -7775,6 +8623,7 @@ "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", "integrity": "sha512-xgs2NH9AE66ucSq4cNG1nhSFghr5l6tdL15Pk+jl46bmmBapgoaY/AacXyaDznAqmGL99TiLSQgO/XazFSKYeQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -7806,6 +8655,7 @@ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.1.tgz", "integrity": "sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA==", "dev": true, + "license": "MIT", "dependencies": { "hasown": "^2.0.0" }, @@ -7855,6 +8705,7 @@ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.1.tgz", "integrity": "sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw==", "dev": true, + "license": "MIT", "dependencies": { "hasown": "^2.0.0" }, @@ -7867,6 +8718,7 @@ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz", "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", "dev": true, + "license": "MIT", "dependencies": { "is-accessor-descriptor": "^1.0.1", "is-data-descriptor": "^1.0.1" @@ -7880,6 +8732,7 @@ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -7970,6 +8823,7 @@ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -10224,7 +11078,8 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/just-debounce/-/just-debounce-1.1.0.tgz", "integrity": "sha512-qpcRocdkUmf+UTNBYx5w6dexX5J31AKK1OmPwH630a83DdVVUIngk55RSAiIGpQyoH0dlr872VHfPjnQnK1qDQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/keyboardevent-key-polyfill": { "version": "1.1.0", @@ -10232,10 +11087,14 @@ "integrity": "sha512-NTDqo7XhzL1fqmUzYroiyK2qGua7sOMzLav35BfNA/mPUSCtw8pZghHFMTYR9JdnJ23IQz695FcaM6EE6bpbFQ==" }, "node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==", "dev": true, + "license": "MIT", + "dependencies": { + "is-buffer": "^1.1.5" + }, "engines": { "node": ">=0.10.0" } @@ -10250,16 +11109,13 @@ } }, "node_modules/last-run": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/last-run/-/last-run-1.1.1.tgz", - "integrity": "sha512-U/VxvpX4N/rFvPzr3qG5EtLKEnNI0emvIQB3/ecEwv+8GHaUKbIB8vxv1Oai5FAF0d0r7LXHhLLe5K/yChm5GQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/last-run/-/last-run-2.0.0.tgz", + "integrity": "sha512-j+y6WhTLN4Itnf9j5ZQos1BGPCS8DAwmgMroR3OzfxAsBxam0hMw7J8M3KqZl0pLQJ1jNnwIexg5DYpC/ctwEQ==", "dev": true, - "dependencies": { - "default-resolution": "^2.0.0", - "es6-weak-map": "^2.0.1" - }, + "license": "MIT", "engines": { - "node": ">= 0.10" + "node": ">= 10.13.0" } }, "node_modules/lazystream": { @@ -10279,6 +11135,7 @@ "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", "integrity": "sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw==", "dev": true, + "license": "MIT", "dependencies": { "invert-kv": "^1.0.0" }, @@ -10308,34 +11165,22 @@ } }, "node_modules/liftoff": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-3.1.0.tgz", - "integrity": "sha512-DlIPlJUkCV0Ips2zf2pJP0unEoT1kwYhiiPUGF3s/jtxTCjziNLoiVVh+jqWOWeFi6mmwQ5fNxvAUyPad4Dfog==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-5.0.0.tgz", + "integrity": "sha512-a5BQjbCHnB+cy+gsro8lXJ4kZluzOijzJ1UVVfyJYZC+IP2pLv1h4+aysQeKuTmyO8NAqfyQAk4HWaP/HjcKTg==", "dev": true, + "license": "MIT", "dependencies": { - "extend": "^3.0.0", - "findup-sync": "^3.0.0", - "fined": "^1.0.1", - "flagged-respawn": "^1.0.0", - "is-plain-object": "^2.0.4", - "object.map": "^1.0.0", - "rechoir": "^0.6.2", - "resolve": "^1.1.7" + "extend": "^3.0.2", + "findup-sync": "^5.0.0", + "fined": "^2.0.0", + "flagged-respawn": "^2.0.0", + "is-plain-object": "^5.0.0", + "rechoir": "^0.8.0", + "resolve": "^1.20.0" }, "engines": { - "node": ">= 0.8" - } - }, - "node_modules/liftoff/node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" + "node": ">=10.13.0" } }, "node_modules/lilconfig": { @@ -10358,6 +11203,7 @@ "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", "integrity": "sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==", "dev": true, + "license": "MIT", "dependencies": { "graceful-fs": "^4.1.2", "parse-json": "^2.2.0", @@ -10374,6 +11220,7 @@ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==", "dev": true, + "license": "MIT", "dependencies": { "error-ex": "^1.2.0" }, @@ -10609,6 +11456,7 @@ "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", "dev": true, + "license": "MIT", "dependencies": { "kind-of": "^6.0.2" }, @@ -10621,6 +11469,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -10639,6 +11488,7 @@ "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -10654,6 +11504,7 @@ "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", "integrity": "sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==", "dev": true, + "license": "MIT", "dependencies": { "object-visit": "^1.0.0" }, @@ -10666,6 +11517,7 @@ "resolved": "https://registry.npmjs.org/matchdep/-/matchdep-2.0.0.tgz", "integrity": "sha512-LFgVbaHIHMqCRuCZyfCtUOq9/Lnzhi7Z0KFUE2fhD54+JN2jLh3hC02RLkqauJ3U4soU6H1J3tfj/Byk7GoEjA==", "dev": true, + "license": "MIT", "dependencies": { "findup-sync": "^2.0.0", "micromatch": "^3.0.4", @@ -10681,6 +11533,7 @@ "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", "dev": true, + "license": "MIT", "dependencies": { "arr-flatten": "^1.1.0", "array-unique": "^0.3.2", @@ -10702,6 +11555,7 @@ "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", "dev": true, + "license": "MIT", "dependencies": { "is-descriptor": "^1.0.2", "isobject": "^3.0.1" @@ -10715,6 +11569,7 @@ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", "dev": true, + "license": "MIT", "dependencies": { "extend-shallow": "^2.0.1", "is-number": "^3.0.0", @@ -10730,6 +11585,7 @@ "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz", "integrity": "sha512-vs+3unmJT45eczmcAZ6zMJtxN3l/QXeccaXQx5cu/MeJMhewVfoWZqibRkOxPnmoR59+Zy5hjabfQc6JLSah4g==", "dev": true, + "license": "MIT", "dependencies": { "detect-file": "^1.0.0", "is-glob": "^3.1.0", @@ -10745,6 +11601,7 @@ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.3.tgz", "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==", "dev": true, + "license": "MIT", "dependencies": { "is-accessor-descriptor": "^1.0.1", "is-data-descriptor": "^1.0.1" @@ -10758,6 +11615,7 @@ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dev": true, + "license": "MIT", "dependencies": { "is-plain-object": "^2.0.4" }, @@ -10770,6 +11628,7 @@ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", "integrity": "sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==", "dev": true, + "license": "MIT", "dependencies": { "is-extglob": "^2.1.0" }, @@ -10782,6 +11641,7 @@ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", "dev": true, + "license": "MIT", "dependencies": { "kind-of": "^3.0.2" }, @@ -10794,6 +11654,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", "dev": true, + "license": "MIT", "dependencies": { "is-buffer": "^1.1.5" }, @@ -10806,6 +11667,7 @@ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "dev": true, + "license": "MIT", "dependencies": { "isobject": "^3.0.1" }, @@ -10818,6 +11680,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -10827,6 +11690,7 @@ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", "dev": true, + "license": "MIT", "dependencies": { "arr-diff": "^4.0.0", "array-unique": "^0.3.2", @@ -10851,6 +11715,7 @@ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", "dev": true, + "license": "MIT", "dependencies": { "assign-symbols": "^1.0.0", "is-extendable": "^1.0.1" @@ -10864,6 +11729,7 @@ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", "dev": true, + "license": "MIT", "dependencies": { "is-number": "^3.0.0", "repeat-string": "^1.6.1" @@ -10982,6 +11848,7 @@ "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", "dev": true, + "license": "MIT", "dependencies": { "for-in": "^1.0.2", "is-extendable": "^1.0.1" @@ -10995,6 +11862,7 @@ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dev": true, + "license": "MIT", "dependencies": { "is-plain-object": "^2.0.4" }, @@ -11007,6 +11875,7 @@ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "dev": true, + "license": "MIT", "dependencies": { "isobject": "^3.0.1" }, @@ -11038,14 +11907,23 @@ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/mute-stdout": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mute-stdout/-/mute-stdout-1.0.1.tgz", - "integrity": "sha512-kDcwXR4PS7caBpuRYYBUz9iVixUk3anO3f5OYFiIPwK/20vCzKCHyKoulbiDY1S53zD2bxUpxN/IJ+TnXjfvxg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mute-stdout/-/mute-stdout-2.0.0.tgz", + "integrity": "sha512-32GSKM3Wyc8dg/p39lWPKYu8zci9mJFzV1Np9Of0ZEpe6Fhssn/FbI7ywAMd40uX+p3ZKh3T5EeCFv81qS3HmQ==", "dev": true, + "license": "MIT", "engines": { - "node": ">= 0.10" + "node": ">= 10.13.0" } }, + "node_modules/nan": { + "version": "2.20.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.20.0.tgz", + "integrity": "sha512-bk3gXBZDGILuuo/6sKtr0DQmSThYHLtNCdSdXk9YkxD/jK6X2vmCyyXBBxyqZ4XcnzTyYEAThfX3DCEnLf6igw==", + "dev": true, + "license": "MIT", + "optional": true + }, "node_modules/nanoid": { "version": "3.3.6", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", @@ -11069,6 +11947,7 @@ "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", "dev": true, + "license": "MIT", "dependencies": { "arr-diff": "^4.0.0", "array-unique": "^0.3.2", @@ -11091,6 +11970,7 @@ "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", "dev": true, + "license": "MIT", "dependencies": { "is-descriptor": "^1.0.2", "isobject": "^3.0.1" @@ -11104,6 +11984,7 @@ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", "dev": true, + "license": "MIT", "dependencies": { "assign-symbols": "^1.0.0", "is-extendable": "^1.0.1" @@ -11117,6 +11998,7 @@ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.3.tgz", "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==", "dev": true, + "license": "MIT", "dependencies": { "is-accessor-descriptor": "^1.0.1", "is-data-descriptor": "^1.0.1" @@ -11130,6 +12012,7 @@ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dev": true, + "license": "MIT", "dependencies": { "is-plain-object": "^2.0.4" }, @@ -11142,6 +12025,7 @@ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "dev": true, + "license": "MIT", "dependencies": { "isobject": "^3.0.1" }, @@ -11154,6 +12038,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -11201,6 +12086,7 @@ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "hosted-git-info": "^2.1.4", "resolve": "^1.10.0", @@ -11213,6 +12099,7 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver" } @@ -11276,6 +12163,7 @@ "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -11299,6 +12187,7 @@ "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", "integrity": "sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==", "dev": true, + "license": "MIT", "dependencies": { "copy-descriptor": "^0.1.0", "define-property": "^0.2.5", @@ -11313,6 +12202,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", "dev": true, + "license": "MIT", "dependencies": { "is-buffer": "^1.1.5" }, @@ -11334,6 +12224,7 @@ "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", "integrity": "sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==", "dev": true, + "license": "MIT", "dependencies": { "isobject": "^3.0.0" }, @@ -11364,6 +12255,7 @@ "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", "integrity": "sha512-c/K0mw/F11k4dEUBMW8naXUuBuhxRCfG7W+yFy8EcijU/rSmazOUd1XAEEe6bC0OuXY4HUKjTJv7xbxIMqdxrA==", "dev": true, + "license": "MIT", "dependencies": { "array-each": "^1.0.1", "array-slice": "^1.0.0", @@ -11379,6 +12271,7 @@ "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", "integrity": "sha512-3+mAJu2PLfnSVGHwIWubpOFLscJANBKuB/6A4CxBstc4aqwQY0FWcsppuy4jU5GSB95yES5JHSI+33AWuS4k6w==", "dev": true, + "license": "MIT", "dependencies": { "for-own": "^1.0.0", "make-iterator": "^1.0.0" @@ -11392,6 +12285,7 @@ "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", "dev": true, + "license": "MIT", "dependencies": { "isobject": "^3.0.1" }, @@ -11404,6 +12298,7 @@ "resolved": "https://registry.npmjs.org/object.reduce/-/object.reduce-1.0.1.tgz", "integrity": "sha512-naLhxxpUESbNkRqc35oQ2scZSJueHGQNUfMW/0U37IgN6tE2dgDWg3whf+NEliy3F/QysrO48XKUz/nGPe+AQw==", "dev": true, + "license": "MIT", "dependencies": { "for-own": "^1.0.0", "make-iterator": "^1.0.0" @@ -11450,6 +12345,7 @@ "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", "integrity": "sha512-PRT7ZORmwu2MEFt4/fv3Q+mEfN4zetKxufQrkShY2oGvUms9r8otu5HfdyIFHkYXjO7laNsoVGmM2MANfuTA8g==", "dev": true, + "license": "MIT", "dependencies": { "lcid": "^1.0.0" }, @@ -11528,6 +12424,7 @@ "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", "integrity": "sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q==", "dev": true, + "license": "MIT", "dependencies": { "is-absolute": "^1.0.0", "map-cache": "^0.2.0", @@ -11570,6 +12467,7 @@ "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -11604,6 +12502,7 @@ "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", "integrity": "sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -11652,6 +12551,7 @@ "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", "integrity": "sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg==", "dev": true, + "license": "MIT", "dependencies": { "path-root-regex": "^0.1.0" }, @@ -11664,6 +12564,7 @@ "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", "integrity": "sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -11709,6 +12610,7 @@ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -11718,6 +12620,7 @@ "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -11727,6 +12630,7 @@ "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", "dev": true, + "license": "MIT", "dependencies": { "pinkie": "^2.0.0" }, @@ -11837,6 +12741,7 @@ "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", "integrity": "sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -11951,6 +12856,7 @@ "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", "integrity": "sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -12068,6 +12974,13 @@ } ] }, + "node_modules/queue-tick": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz", + "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==", + "dev": true, + "license": "MIT" + }, "node_modules/rcfinder": { "version": "0.1.9", "resolved": "https://registry.npmjs.org/rcfinder/-/rcfinder-0.1.9.tgz", @@ -12106,6 +13019,7 @@ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", "integrity": "sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==", "dev": true, + "license": "MIT", "dependencies": { "load-json-file": "^1.0.0", "normalize-package-data": "^2.3.2", @@ -12120,6 +13034,7 @@ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", "integrity": "sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==", "dev": true, + "license": "MIT", "dependencies": { "find-up": "^1.0.0", "read-pkg": "^1.0.0" @@ -12133,6 +13048,7 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", "integrity": "sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==", "dev": true, + "license": "MIT", "dependencies": { "path-exists": "^2.0.0", "pinkie-promise": "^2.0.0" @@ -12146,6 +13062,7 @@ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", "integrity": "sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==", "dev": true, + "license": "MIT", "dependencies": { "pinkie-promise": "^2.0.0" }, @@ -12158,6 +13075,7 @@ "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", "integrity": "sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==", "dev": true, + "license": "MIT", "dependencies": { "graceful-fs": "^4.1.2", "pify": "^2.0.0", @@ -12213,15 +13131,16 @@ } }, "node_modules/rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", + "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", "dev": true, + "license": "MIT", "dependencies": { - "resolve": "^1.1.6" + "resolve": "^1.20.0" }, "engines": { - "node": ">= 0.10" + "node": ">= 10.13.0" } }, "node_modules/regenerate": { @@ -12262,6 +13181,7 @@ "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", "dev": true, + "license": "MIT", "dependencies": { "extend-shallow": "^3.0.2", "safe-regex": "^1.1.0" @@ -12275,6 +13195,7 @@ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", "dev": true, + "license": "MIT", "dependencies": { "assign-symbols": "^1.0.0", "is-extendable": "^1.0.1" @@ -12288,6 +13209,7 @@ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dev": true, + "license": "MIT", "dependencies": { "is-plain-object": "^2.0.4" }, @@ -12300,6 +13222,7 @@ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "dev": true, + "license": "MIT", "dependencies": { "isobject": "^3.0.1" }, @@ -12402,6 +13325,7 @@ "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -12411,6 +13335,7 @@ "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10" } @@ -12426,17 +13351,13 @@ } }, "node_modules/replace-homedir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/replace-homedir/-/replace-homedir-1.0.0.tgz", - "integrity": "sha512-CHPV/GAglbIB1tnQgaiysb8H2yCy8WQ7lcEwQ/eT+kLj0QHV8LnJW0zpqpE7RSkrMSRoa+EBoag86clf7WAgSg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/replace-homedir/-/replace-homedir-2.0.0.tgz", + "integrity": "sha512-bgEuQQ/BHW0XkkJtawzrfzHFSN70f/3cNOiHa2QsYxqrjaC30X1k74FJ6xswVBP0sr0SpGIdVFuPwfrYziVeyw==", "dev": true, - "dependencies": { - "homedir-polyfill": "^1.0.1", - "is-absolute": "^1.0.0", - "remove-trailing-separator": "^1.1.0" - }, + "license": "MIT", "engines": { - "node": ">= 0.10" + "node": ">= 10.13.0" } }, "node_modules/replacestream": { @@ -12472,7 +13393,8 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", "integrity": "sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/requires-port": { "version": "1.0.0", @@ -12514,6 +13436,7 @@ "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", "integrity": "sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==", "dev": true, + "license": "MIT", "dependencies": { "expand-tilde": "^2.0.0", "global-modules": "^1.0.0" @@ -12553,7 +13476,8 @@ "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", "integrity": "sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==", "deprecated": "https://github.com/lydell/resolve-url#deprecated", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/resolve.exports": { "version": "2.0.2", @@ -12569,6 +13493,7 @@ "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.12" } @@ -12723,6 +13648,7 @@ "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", "integrity": "sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==", "dev": true, + "license": "MIT", "dependencies": { "ret": "~0.1.10" } @@ -13106,22 +14032,24 @@ } }, "node_modules/semver-greatest-satisfied-range": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/semver-greatest-satisfied-range/-/semver-greatest-satisfied-range-1.1.0.tgz", - "integrity": "sha512-Ny/iyOzSSa8M5ML46IAx3iXc6tfOsYU2R4AXi2UpHk60Zrgyq6eqPj/xiOfS0rRl/iiQ/rdJkVjw/5cdUyCntQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/semver-greatest-satisfied-range/-/semver-greatest-satisfied-range-2.0.0.tgz", + "integrity": "sha512-lH3f6kMbwyANB7HuOWRMlLCa2itaCrZJ+SAqqkSZrZKO/cAsk2EOyaKHUtNkVLFyFW9pct22SFesFp3Z7zpA0g==", "dev": true, + "license": "MIT", "dependencies": { - "sver-compat": "^1.5.0" + "sver": "^1.8.3" }, "engines": { - "node": ">= 0.10" + "node": ">= 10.13.0" } }, "node_modules/set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/set-function-length": { "version": "1.2.2", @@ -13145,6 +14073,7 @@ "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", "dev": true, + "license": "MIT", "dependencies": { "extend-shallow": "^2.0.1", "is-extendable": "^0.1.1", @@ -13160,6 +14089,7 @@ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "dev": true, + "license": "MIT", "dependencies": { "isobject": "^3.0.1" }, @@ -13264,6 +14194,7 @@ "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", "dev": true, + "license": "MIT", "dependencies": { "base": "^0.11.1", "debug": "^2.2.0", @@ -13283,6 +14214,7 @@ "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", "dev": true, + "license": "MIT", "dependencies": { "define-property": "^1.0.0", "isobject": "^3.0.0", @@ -13297,6 +14229,7 @@ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", "dev": true, + "license": "MIT", "dependencies": { "is-descriptor": "^1.0.0" }, @@ -13309,6 +14242,7 @@ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.3.tgz", "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==", "dev": true, + "license": "MIT", "dependencies": { "is-accessor-descriptor": "^1.0.1", "is-data-descriptor": "^1.0.1" @@ -13322,6 +14256,7 @@ "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", "dev": true, + "license": "MIT", "dependencies": { "kind-of": "^3.2.0" }, @@ -13334,6 +14269,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", "dev": true, + "license": "MIT", "dependencies": { "is-buffer": "^1.1.5" }, @@ -13346,6 +14282,7 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, + "license": "MIT", "dependencies": { "ms": "2.0.0" } @@ -13354,13 +14291,15 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/snapdragon/node_modules/source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -13371,6 +14310,7 @@ "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated", "dev": true, + "license": "MIT", "dependencies": { "atob": "^2.1.2", "decode-uri-component": "^0.2.0", @@ -13449,7 +14389,8 @@ "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", "deprecated": "See https://github.com/lydell/source-map-url#deprecated", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/sourcemap-codec": { "version": "1.4.8", @@ -13472,6 +14413,7 @@ "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", "dev": true, + "license": "Apache-2.0", "dependencies": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" @@ -13481,13 +14423,15 @@ "version": "2.5.0", "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz", "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==", - "dev": true + "dev": true, + "license": "CC-BY-3.0" }, "node_modules/spdx-expression-parse": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", "dev": true, + "license": "MIT", "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" @@ -13497,7 +14441,8 @@ "version": "3.0.18", "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.18.tgz", "integrity": "sha512-xxRs31BqRYHwiMzudOrpSiHtZ8i/GeionCBDSilhYRj+9gIcI8wCZTlXZKu9vZIVqViP3dcp9qE5G6AlIaD+TQ==", - "dev": true + "dev": true, + "license": "CC0-1.0" }, "node_modules/split": { "version": "0.2.10", @@ -13516,6 +14461,7 @@ "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", "dev": true, + "license": "MIT", "dependencies": { "extend-shallow": "^3.0.0" }, @@ -13528,6 +14474,7 @@ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", "dev": true, + "license": "MIT", "dependencies": { "assign-symbols": "^1.0.0", "is-extendable": "^1.0.1" @@ -13541,6 +14488,7 @@ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dev": true, + "license": "MIT", "dependencies": { "is-plain-object": "^2.0.4" }, @@ -13553,6 +14501,7 @@ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "dev": true, + "license": "MIT", "dependencies": { "isobject": "^3.0.1" }, @@ -13571,6 +14520,7 @@ "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", "dev": true, + "license": "MIT", "engines": { "node": "*" } @@ -13601,6 +14551,7 @@ "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", "integrity": "sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==", "dev": true, + "license": "MIT", "dependencies": { "define-property": "^0.2.5", "object-copy": "^0.1.0" @@ -13618,11 +14569,22 @@ "duplexer": "~0.1.1" } }, + "node_modules/stream-composer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/stream-composer/-/stream-composer-1.0.2.tgz", + "integrity": "sha512-bnBselmwfX5K10AH6L4c8+S5lgZMWI7ZYrz2rvYjCPB2DIMC4Ig8OpxGpNJSxRZ58oti7y1IcNvjBAz9vW5m4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "streamx": "^2.13.2" + } + }, "node_modules/stream-exhaust": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/stream-exhaust/-/stream-exhaust-1.0.2.tgz", "integrity": "sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/stream-shift": { "version": "1.0.3", @@ -13643,6 +14605,21 @@ "node": ">=6.9.5" } }, + "node_modules/streamx": { + "version": "2.18.0", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.18.0.tgz", + "integrity": "sha512-LLUC1TWdjVdn1weXGcSxyTR3T4+acB6tVGXT95y0nGbca4t4o/ng1wKAGTljm9VicuCVLvRlqFYXYy5GwgM7sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-fifo": "^1.3.2", + "queue-tick": "^1.0.1", + "text-decoder": "^1.1.0" + }, + "optionalDependencies": { + "bare-events": "^2.2.0" + } + }, "node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -13763,11 +14740,22 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/sver": { + "version": "1.8.4", + "resolved": "https://registry.npmjs.org/sver/-/sver-1.8.4.tgz", + "integrity": "sha512-71o1zfzyawLfIWBOmw8brleKyvnbn73oVHNCsu51uPMz/HWiKkkXsI31JjHW5zqXEqnPYkIiHd8ZmL7FCimLEA==", + "dev": true, + "license": "MIT", + "optionalDependencies": { + "semver": "^6.3.0" + } + }, "node_modules/sver-compat": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/sver-compat/-/sver-compat-1.5.0.tgz", "integrity": "sha512-aFTHfmjwizMNlNE6dsGmoAM4lHjL0CyiobWaFiXWSlD7cIxshW422Nb8KbXCmR6z+0ZEPY+daXJrDyh/vuwTyg==", "dev": true, + "license": "MIT", "dependencies": { "es6-iterator": "^2.0.1", "es6-symbol": "^3.1.1" @@ -13795,6 +14783,16 @@ "node": ">=10.0.0" } }, + "node_modules/teex": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/teex/-/teex-1.0.1.tgz", + "integrity": "sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "streamx": "^2.12.5" + } + }, "node_modules/test-exclude": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", @@ -13809,6 +14807,16 @@ "node": ">=8" } }, + "node_modules/text-decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.1.1.tgz", + "integrity": "sha512-8zll7REEv4GDD3x4/0pW+ppIxSNs7H1J10IKFZsuOMscumCdM2a+toDGLPA3T+1+fLBql4zbt5z83GEQGGV5VA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "b4a": "^1.6.4" + } + }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", @@ -13928,6 +14936,7 @@ "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", "integrity": "sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==", "dev": true, + "license": "MIT", "dependencies": { "kind-of": "^3.0.2" }, @@ -13940,6 +14949,7 @@ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", "dev": true, + "license": "MIT", "dependencies": { "is-buffer": "^1.1.5" }, @@ -13952,6 +14962,7 @@ "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", "dev": true, + "license": "MIT", "dependencies": { "define-property": "^2.0.2", "extend-shallow": "^3.0.2", @@ -13979,6 +14990,7 @@ "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", "dev": true, + "license": "MIT", "dependencies": { "is-descriptor": "^1.0.2", "isobject": "^3.0.1" @@ -13992,6 +15004,7 @@ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", "dev": true, + "license": "MIT", "dependencies": { "assign-symbols": "^1.0.0", "is-extendable": "^1.0.1" @@ -14005,6 +15018,7 @@ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.3.tgz", "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==", "dev": true, + "license": "MIT", "dependencies": { "is-accessor-descriptor": "^1.0.1", "is-data-descriptor": "^1.0.1" @@ -14018,6 +15032,7 @@ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dev": true, + "license": "MIT", "dependencies": { "is-plain-object": "^2.0.4" }, @@ -14030,6 +15045,7 @@ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "dev": true, + "license": "MIT", "dependencies": { "isobject": "^3.0.1" }, @@ -14131,7 +15147,8 @@ "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/uglify-js": { "version": "3.17.4", @@ -14155,33 +15172,29 @@ } }, "node_modules/undertaker": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/undertaker/-/undertaker-1.3.0.tgz", - "integrity": "sha512-/RXwi5m/Mu3H6IHQGww3GNt1PNXlbeCuclF2QYR14L/2CHPz3DFZkvB5hZ0N/QUkiXWCACML2jXViIQEQc2MLg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/undertaker/-/undertaker-2.0.0.tgz", + "integrity": "sha512-tO/bf30wBbTsJ7go80j0RzA2rcwX6o7XPBpeFcb+jzoeb4pfMM2zUeSDIkY1AWqeZabWxaQZ/h8N9t35QKDLPQ==", "dev": true, + "license": "MIT", "dependencies": { - "arr-flatten": "^1.0.1", - "arr-map": "^2.0.0", - "bach": "^1.0.0", - "collection-map": "^1.0.0", - "es6-weak-map": "^2.0.1", - "fast-levenshtein": "^1.0.0", - "last-run": "^1.1.0", - "object.defaults": "^1.0.0", - "object.reduce": "^1.0.0", - "undertaker-registry": "^1.0.0" + "bach": "^2.0.1", + "fast-levenshtein": "^3.0.0", + "last-run": "^2.0.0", + "undertaker-registry": "^2.0.0" }, "engines": { - "node": ">= 0.10" + "node": ">=10.13.0" } }, "node_modules/undertaker-registry": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/undertaker-registry/-/undertaker-registry-1.0.1.tgz", - "integrity": "sha512-UR1khWeAjugW3548EfQmL9Z7pGMlBgXteQpr1IZeZBtnkCJQJIJ1Scj0mb9wQaPvUZ9Q17XqW6TIaPchJkyfqw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/undertaker-registry/-/undertaker-registry-2.0.0.tgz", + "integrity": "sha512-+hhVICbnp+rlzZMgxXenpvTxpuvA67Bfgtt+O9WOE5jo7w/dyiF1VmoZVIHvP2EkUjsyKyTwYKlLhA+j47m1Ew==", "dev": true, + "license": "MIT", "engines": { - "node": ">= 0.10" + "node": ">= 10.13.0" } }, "node_modules/unicode-canonical-property-names-ecmascript": { @@ -14229,6 +15242,7 @@ "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", "dev": true, + "license": "MIT", "dependencies": { "arr-union": "^3.1.0", "get-value": "^2.0.6", @@ -14263,6 +15277,7 @@ "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", "integrity": "sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==", "dev": true, + "license": "MIT", "dependencies": { "has-value": "^0.3.1", "isobject": "^3.0.0" @@ -14276,6 +15291,7 @@ "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", "integrity": "sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==", "dev": true, + "license": "MIT", "dependencies": { "get-value": "^2.0.3", "has-values": "^0.1.4", @@ -14290,6 +15306,7 @@ "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", "dev": true, + "license": "MIT", "dependencies": { "isarray": "1.0.0" }, @@ -14302,10 +15319,22 @@ "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", "integrity": "sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, + "node_modules/upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4", + "yarn": "*" + } + }, "node_modules/update-browserslist-db": { "version": "1.0.16", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.16.tgz", @@ -14350,7 +15379,8 @@ "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", "integrity": "sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==", "deprecated": "Please see https://github.com/lydell/urix#deprecated", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/url-parse": { "version": "1.5.10", @@ -14367,6 +15397,7 @@ "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -14398,15 +15429,13 @@ "dev": true }, "node_modules/v8flags": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.2.0.tgz", - "integrity": "sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-4.0.1.tgz", + "integrity": "sha512-fcRLaS4H/hrZk9hYwbdRM35D0U8IYMfEClhXxCivOojl+yTRAZH3Zy2sSy6qVCiGbV9YAtPssP6jaChqC9vPCg==", "dev": true, - "dependencies": { - "homedir-polyfill": "^1.0.1" - }, + "license": "MIT", "engines": { - "node": ">= 0.10" + "node": ">= 10.13.0" } }, "node_modules/validate-npm-package-license": { @@ -14414,6 +15443,7 @@ "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", "dev": true, + "license": "Apache-2.0", "dependencies": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" @@ -14433,6 +15463,37 @@ "resolved": "https://registry.npmjs.org/varint/-/varint-6.0.0.tgz", "integrity": "sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==" }, + "node_modules/vinyl": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-3.0.0.tgz", + "integrity": "sha512-rC2VRfAVVCGEgjnxHUnpIVh3AGuk62rP3tqVrn+yab0YH7UULisC085+NYH+mnqf3Wx4SpSi1RQMwudL89N03g==", + "dev": true, + "license": "MIT", + "dependencies": { + "clone": "^2.1.2", + "clone-stats": "^1.0.0", + "remove-trailing-separator": "^1.1.0", + "replace-ext": "^2.0.0", + "teex": "^1.0.1" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/vinyl-contents": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/vinyl-contents/-/vinyl-contents-2.0.0.tgz", + "integrity": "sha512-cHq6NnGyi2pZ7xwdHSW1v4Jfnho4TEGtxZHw01cmnc8+i7jgR6bRnED/LbrKan/Q7CvVLbnvA5OepnhbpjBZ5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "bl": "^5.0.0", + "vinyl": "^3.0.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, "node_modules/vinyl-fs": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-3.0.3.tgz", @@ -14667,7 +15728,8 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", "integrity": "sha512-F6+WgncZi/mJDrammbTuHe1q0R5hOXv/mBaiNA2TCNT/LTHusX0V+CJnj9XT8ki5ln2UZyyddDgHfCzyrOH7MQ==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/wrap-ansi": { "version": "7.0.0", @@ -14824,24 +15886,22 @@ } }, "node_modules/yargs": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.2.tgz", - "integrity": "sha512-ZEjj/dQYQy0Zx0lgLMLR8QuaqTihnxirir7EwUHp1Axq4e3+k8jXU5K0VLbNvedv1f4EWtBonDIZm0NUr+jCcA==", + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", "dev": true, + "license": "MIT", "dependencies": { - "camelcase": "^3.0.0", - "cliui": "^3.2.0", - "decamelize": "^1.1.1", - "get-caller-file": "^1.0.1", - "os-locale": "^1.4.0", - "read-pkg-up": "^1.0.1", + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^1.0.2", - "which-module": "^1.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^5.0.1" + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" } }, "node_modules/yargs-parser": { @@ -14853,82 +15913,14 @@ "node": ">=12" } }, - "node_modules/yargs/node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/yargs/node_modules/camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha512-4nhGqUkc4BqbBBB4Q6zLuD7lzzrHYrjKGeYaEji/3tFR5VdJu9v+LilhGIVe8wxEJPPOeWo7eg8dwY13TZ1BNg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/yargs/node_modules/get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", - "dev": true - }, - "node_modules/yargs/node_modules/is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", - "dev": true, - "dependencies": { - "number-is-nan": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/yargs/node_modules/string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", - "dev": true, - "dependencies": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/yargs/node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", - "dev": true, - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/yargs/node_modules/y18n": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", - "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==", - "dev": true - }, "node_modules/yargs/node_modules/yargs-parser": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.1.tgz", - "integrity": "sha512-wpav5XYiddjXxirPoCTUPbqM0PXvJ9hiBMvuJgInvo4/lAOTZzUprArw17q2O1P2+GHhbBr18/iQwjL5Z9BqfA==", + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", "dev": true, - "dependencies": { - "camelcase": "^3.0.0", - "object.assign": "^4.1.0" + "license": "ISC", + "engines": { + "node": ">=10" } }, "node_modules/yocto-queue": { diff --git a/package.json b/package.json index 22b3e6191..82c89301d 100644 --- a/package.json +++ b/package.json @@ -45,7 +45,7 @@ "@babel/preset-env": "7.24.7", "@uswds/compile": "^1.1.0", "better-npm-audit": "^3.7.3", - "gulp": "^4.0.2", + "gulp": "^5.0.0", "gulp-add-src": "^1.0.0", "gulp-babel": "8.0.0", "gulp-better-rollup": "4.0.1", diff --git a/poetry.lock b/poetry.lock index a08ad9366..2f1d46f21 100644 --- a/poetry.lock +++ b/poetry.lock @@ -252,13 +252,13 @@ files = [ [[package]] name = "certifi" -version = "2024.6.2" +version = "2024.7.4" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2024.6.2-py3-none-any.whl", hash = "sha256:ddc6c8ce995e6987e7faf5e3f1b02b302836a0e5d98ece18392cb1a36c72ad56"}, - {file = "certifi-2024.6.2.tar.gz", hash = "sha256:3cd43f1c6fa7dedc5899d69d3ad0398fd018ad1a17fba83ddaf78aa46c747516"}, + {file = "certifi-2024.7.4-py3-none-any.whl", hash = "sha256:c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90"}, + {file = "certifi-2024.7.4.tar.gz", hash = "sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b"}, ] [[package]] @@ -3116,4 +3116,4 @@ files = [ [metadata] lock-version = "2.0" python-versions = "^3.12.2" -content-hash = "8ad87349d57d4ff720e720067412e2656326c089ae21d51f6d96215f9546602e" +content-hash = "0ac6a41e91fc7c667eac240bbd5af3d18d61100e9d3bcb651e4ec82978d24c9b" From d08943677f01375212fdb24b077b57af73cde9e1 Mon Sep 17 00:00:00 2001 From: alexjanousekGSA Date: Tue, 9 Jul 2024 10:26:35 -0600 Subject: [PATCH 08/58] Updated checks to include a npm install --- .ds.baseline | 6 +++--- .github/workflows/checks.yml | 22 ++++++++++++++-------- 2 files changed, 17 insertions(+), 11 deletions(-) diff --git a/.ds.baseline b/.ds.baseline index bb6b3ce39..f82c96729 100644 --- a/.ds.baseline +++ b/.ds.baseline @@ -133,7 +133,7 @@ "filename": ".github/workflows/checks.yml", "hashed_secret": "5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8", "is_verified": false, - "line_number": 61, + "line_number": 67, "is_secret": false }, { @@ -141,7 +141,7 @@ "filename": ".github/workflows/checks.yml", "hashed_secret": "5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8", "is_verified": false, - "line_number": 95, + "line_number": 101, "is_secret": false } ], @@ -702,5 +702,5 @@ } ] }, - "generated_at": "2024-06-11T22:26:18Z" + "generated_at": "2024-07-09T16:26:26Z" } diff --git a/.github/workflows/checks.yml b/.github/workflows/checks.yml index f50ee1bcc..066e12fcd 100644 --- a/.github/workflows/checks.yml +++ b/.github/workflows/checks.yml @@ -23,6 +23,12 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 + - name: Set up Node.js + uses: actions/setup-node@v3 + with: + node-version: "16.15.1" + - name: Install dependencies + run: npm install - uses: ./.github/actions/setup-project - uses: jwalton/gh-find-current-pr@v1 id: findPr @@ -86,10 +92,10 @@ jobs: - name: Clone API uses: actions/checkout@v4 with: - repository: GSA/notifications-api - path: 'notifications-api' + repository: GSA/notifications-api + path: "notifications-api" - name: Install API dependencies - working-directory: 'notifications-api' + working-directory: "notifications-api" run: make bootstrap env: DATABASE_URL: postgresql://user:password@localhost:5432/test_notification_api @@ -99,7 +105,7 @@ jobs: NOTIFY_E2E_TEST_PASSWORD: ${{ secrets.NOTIFY_E2E_TEST_PASSWORD }} NOTIFY_ENVIRONMENT: development - name: Run API server - working-directory: 'notifications-api' + working-directory: "notifications-api" run: make run-procfile & env: DATABASE_URL: postgresql://user:password@localhost:5432/test_notification_api @@ -183,12 +189,12 @@ jobs: - name: Run OWASP Baseline Scan uses: zaproxy/action-baseline@v0.9.0 with: - docker_name: 'ghcr.io/zaproxy/zaproxy:weekly' - target: 'http://localhost:6012' + docker_name: "ghcr.io/zaproxy/zaproxy:weekly" + target: "http://localhost:6012" fail_action: true allow_issue_writing: false - rules_file_name: 'zap.conf' - cmd_options: '-I' + rules_file_name: "zap.conf" + cmd_options: "-I" a11y-scan: runs-on: ubuntu-20.04 From 5042ba8d507eb4e6a0d3f4ed22ce15e8fc07d0bc Mon Sep 17 00:00:00 2001 From: Beverly Nguyen Date: Wed, 10 Jul 2024 14:47:29 -0700 Subject: [PATCH 09/58] update time from created_at to processing_fisnnished --- app/main/views/dashboard.py | 1 + app/main/views/jobs.py | 1 - app/templates/views/dashboard/dashboard.html | 4 ++-- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/main/views/dashboard.py b/app/main/views/dashboard.py index ae58ff226..557ac9955 100644 --- a/app/main/views/dashboard.py +++ b/app/main/views/dashboard.py @@ -105,6 +105,7 @@ def service_dashboard(service_id): ".view_job", service_id=current_service.id, job_id=job["id"] ), "created_at": job["created_at"], + "processing_finished": job["processing_finished"], "notification_count": job["notification_count"], "created_by": job["created_by"], "notifications": aggregate_notifications_by_job.get(job["id"], []), diff --git a/app/main/views/jobs.py b/app/main/views/jobs.py index fcdd91122..42a4de090 100644 --- a/app/main/views/jobs.py +++ b/app/main/views/jobs.py @@ -432,7 +432,6 @@ def get_job_partials(job): "partials/jobs/status.html", job=job, arrived_from_preview_page_url=arrived_from_preview_page_url, - notifications=notifications["notifications"] ), } diff --git a/app/templates/views/dashboard/dashboard.html b/app/templates/views/dashboard/dashboard.html index a886f43a0..19297863c 100644 --- a/app/templates/views/dashboard/dashboard.html +++ b/app/templates/views/dashboard/dashboard.html @@ -41,7 +41,7 @@ Template - Time sent + Job status Sender @@ -69,7 +69,7 @@ {{ notification.template.name }} - {{ notification.created_at|format_datetime_table }} + {{ job.processing_finished|format_datetime_table }} {{ notification.created_by.name }} From 43a6bdaf5ccbf7cba99fa85a086dd69eede05565 Mon Sep 17 00:00:00 2001 From: Beverly Nguyen Date: Wed, 10 Jul 2024 16:40:38 -0700 Subject: [PATCH 10/58] updating the timestamp to showcase time job sent --- app/templates/partials/jobs/status.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/templates/partials/jobs/status.html b/app/templates/partials/jobs/status.html index 99b5768e8..c64da7fc3 100644 --- a/app/templates/partials/jobs/status.html +++ b/app/templates/partials/jobs/status.html @@ -37,7 +37,7 @@

Your text has been sent

- {{ job.template_name }} - {{ current_service.name }} was sent on {{ job.created_at|format_datetime_normal }} by {{ job.created_by.name }} + {{ job.template_name }} - {{ current_service.name }} was sent on {{ job.processing_started|format_datetime_normal }} by {{ job.created_by.name }}

From 058a999ed02184c362af846d297eab63f06caf62 Mon Sep 17 00:00:00 2001 From: Kenneth Kehl <@kkehl@flexion.us> Date: Thu, 11 Jul 2024 09:38:32 -0700 Subject: [PATCH 11/58] ugh --- .ds.baseline | 18 +++---- app/main/views/dashboard.py | 2 +- app/main/views/sign_out.py | 12 ++++- app/models/user.py | 7 +++ app/notify_client/__init__.py | 7 +++ app/notify_client/user_api_client.py | 4 ++ tests/app/main/test_errorhandlers.py | 1 + .../views/accounts/test_choose_accounts.py | 5 +- .../test_show_accounts_or_dashboard.py | 5 +- .../test_organization_invites.py | 19 +++++-- tests/app/main/views/test_accept_invite.py | 23 +++++++- tests/app/main/views/test_dashboard.py | 19 ++++--- tests/app/main/views/test_headers.py | 2 + tests/app/main/views/test_index.py | 32 +++++------ tests/app/main/views/test_platform_admin.py | 4 +- tests/app/main/views/test_register.py | 47 +++++++++++----- tests/app/main/views/test_sign_in.py | 21 ++++++-- tests/app/main/views/test_sign_out.py | 14 +++-- tests/app/main/views/test_two_factor.py | 54 +++++++++++++++++-- tests/app/main/views/test_verify.py | 2 + .../notify_client/test_service_api_client.py | 3 ++ tests/app/utils/test_user.py | 4 +- 22 files changed, 235 insertions(+), 70 deletions(-) diff --git a/.ds.baseline b/.ds.baseline index bb6b3ce39..ecc49e08b 100644 --- a/.ds.baseline +++ b/.ds.baseline @@ -527,7 +527,7 @@ "filename": "tests/app/main/views/organizations/test_organization_invites.py", "hashed_secret": "bdbb156d25d02fd7792865824201dda1c60f4473", "is_verified": false, - "line_number": 265, + "line_number": 274, "is_secret": false }, { @@ -535,7 +535,7 @@ "filename": "tests/app/main/views/organizations/test_organization_invites.py", "hashed_secret": "5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8", "is_verified": false, - "line_number": 273, + "line_number": 282, "is_secret": false } ], @@ -545,7 +545,7 @@ "filename": "tests/app/main/views/test_accept_invite.py", "hashed_secret": "07f0a6c13923fc3b5f0c57ffa2d29b715eb80d71", "is_verified": false, - "line_number": 607, + "line_number": 626, "is_secret": false } ], @@ -565,7 +565,7 @@ "filename": "tests/app/main/views/test_register.py", "hashed_secret": "bdbb156d25d02fd7792865824201dda1c60f4473", "is_verified": false, - "line_number": 116, + "line_number": 122, "is_secret": false }, { @@ -573,7 +573,7 @@ "filename": "tests/app/main/views/test_register.py", "hashed_secret": "5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8", "is_verified": false, - "line_number": 192, + "line_number": 201, "is_secret": false }, { @@ -581,7 +581,7 @@ "filename": "tests/app/main/views/test_register.py", "hashed_secret": "bb5b7caa27d005d38039e3797c3ddb9bcd22c3c8", "is_verified": false, - "line_number": 260, + "line_number": 274, "is_secret": false } ], @@ -591,7 +591,7 @@ "filename": "tests/app/main/views/test_sign_in.py", "hashed_secret": "8b8b69116ee882b5e987e330f55db81aba0636f9", "is_verified": false, - "line_number": 90, + "line_number": 97, "is_secret": false } ], @@ -601,7 +601,7 @@ "filename": "tests/app/main/views/test_two_factor.py", "hashed_secret": "dc66ad927c29e31c6c374231f57a4684b0687bfe", "is_verified": false, - "line_number": 267, + "line_number": 290, "is_secret": false } ], @@ -702,5 +702,5 @@ } ] }, - "generated_at": "2024-06-11T22:26:18Z" + "generated_at": "2024-07-11T16:37:23Z" } diff --git a/app/main/views/dashboard.py b/app/main/views/dashboard.py index ae58ff226..53bf069b6 100644 --- a/app/main/views/dashboard.py +++ b/app/main/views/dashboard.py @@ -36,7 +36,7 @@ from notifications_utils.recipients import format_phone_number_human_readable @socketio.on("fetch_daily_stats") def handle_fetch_daily_stats(): - service_id = session.get('service_id') + service_id = session.get("service_id") if service_id: date_range = get_stats_date_range() daily_stats = service_api_client.get_service_notification_statistics_by_day( diff --git a/app/main/views/sign_out.py b/app/main/views/sign_out.py index 5ec96e189..5806dfdd9 100644 --- a/app/main/views/sign_out.py +++ b/app/main/views/sign_out.py @@ -1,7 +1,7 @@ import os import requests -from flask import current_app, redirect, url_for +from flask import current_app, redirect, session, url_for from flask_login import current_user from app.main import main @@ -26,11 +26,19 @@ def _sign_out_at_login_dot_gov(): @main.route("/sign-out", methods=(["GET", "POST"])) def sign_out(): # An AnonymousUser does not have an id - current_app.logger.info("HIT THE REGULAR SIGN OUT") + if current_user.is_authenticated: # TODO This doesn't work yet, due to problems above. + current_user.deactivate() + + session.clear() + current_user.sign_out() + + session.permanent = False + login_dot_gov_logout_url = os.getenv("LOGIN_DOT_GOV_LOGOUT_URL") if login_dot_gov_logout_url: + current_app.config["SESSION_PERMANENT"] = False return redirect(login_dot_gov_logout_url) return redirect(url_for("main.index")) diff --git a/app/models/user.py b/app/models/user.py index 932e754c8..c22fce4b7 100644 --- a/app/models/user.py +++ b/app/models/user.py @@ -147,6 +147,13 @@ class User(JSONModel, UserMixin): else: return self + def deactivate(self): + if self.is_active: + user_data = user_api_client.deactivate_user(self.id) + return self.__class__(user_data["data"]) + else: + return self + def login(self): login_user(self) session["user_id"] = self.id diff --git a/app/notify_client/__init__.py b/app/notify_client/__init__.py index 2cad0b68a..d58cc4f4f 100644 --- a/app/notify_client/__init__.py +++ b/app/notify_client/__init__.py @@ -54,16 +54,23 @@ class NotifyAdminAPIClient(BaseAPIClient): ): abort(403) + def check_inactive_user(self): + if not current_user or not current_user.is_active: + abort(403) + def post(self, *args, **kwargs): self.check_inactive_service() + self.check_inactive_user() return super().post(*args, **kwargs) def put(self, *args, **kwargs): self.check_inactive_service() + self.check_inactive_user() return super().put(*args, **kwargs) def delete(self, *args, **kwargs): self.check_inactive_service() + self.check_inactive_user() return super().delete(*args, **kwargs) diff --git a/app/notify_client/user_api_client.py b/app/notify_client/user_api_client.py index e85225838..06d6385b2 100644 --- a/app/notify_client/user_api_client.py +++ b/app/notify_client/user_api_client.py @@ -217,6 +217,10 @@ class UserApiClient(NotifyAdminAPIClient): def activate_user(self, user_id): return self.post("/user/{}/activate".format(user_id), data=None) + @cache.delete("user-{user_id}") + def deactivate_user(self, user_id): + return self.post("/user/{}/deactivate".format(user_id), data=None) + def send_change_email_verification(self, user_id, new_email): endpoint = "/user/{}/change-email-verification".format(user_id) data = {"email": new_email} diff --git a/tests/app/main/test_errorhandlers.py b/tests/app/main/test_errorhandlers.py index d810a67a5..57537762a 100644 --- a/tests/app/main/test_errorhandlers.py +++ b/tests/app/main/test_errorhandlers.py @@ -68,6 +68,7 @@ def test_csrf_redirects_to_sign_in_page_if_not_signed_in(client_request, mocker) csrf_err = CSRFError("400 Bad Request: The CSRF tokens do not match.") mocker.patch("app.main.views.index.render_template", side_effect=csrf_err) + mocker.patch("app.notify_client.user_api_client.UserApiClient.deactivate_user") client_request.logout() client_request.get_url( "/privacy", diff --git a/tests/app/main/views/accounts/test_choose_accounts.py b/tests/app/main/views/accounts/test_choose_accounts.py index 3354104b2..1ead9dd0d 100644 --- a/tests/app/main/views/accounts/test_choose_accounts.py +++ b/tests/app/main/views/accounts/test_choose_accounts.py @@ -289,9 +289,10 @@ def test_choose_account_should_not_show_back_to_service_link_if_no_service_in_se def test_choose_account_should_not_show_back_to_service_link_if_not_signed_in( - client_request, - mock_get_service, + client_request, mock_get_service, mocker ): + + mocker.patch("app.notify_client.user_api_client.UserApiClient.deactivate_user") client_request.logout() with client_request.session_transaction() as session: diff --git a/tests/app/main/views/accounts/test_show_accounts_or_dashboard.py b/tests/app/main/views/accounts/test_show_accounts_or_dashboard.py index d28d58f22..f1d536377 100644 --- a/tests/app/main/views/accounts/test_show_accounts_or_dashboard.py +++ b/tests/app/main/views/accounts/test_show_accounts_or_dashboard.py @@ -107,9 +107,10 @@ def test_show_accounts_or_dashboard_doesnt_redirect_to_org_dashboard_if_user_not def test_show_accounts_or_dashboard_redirects_if_not_logged_in( - client_request, - notify_admin, + client_request, notify_admin, mocker ): + + mocker.patch("app.notify_client.user_api_client.UserApiClient.deactivate_user") client_request.logout() client_request.get( "main.show_accounts_or_dashboard", diff --git a/tests/app/main/views/organizations/test_organization_invites.py b/tests/app/main/views/organizations/test_organization_invites.py index c9e5da264..ebefe9178 100644 --- a/tests/app/main/views/organizations/test_organization_invites.py +++ b/tests/app/main/views/organizations/test_organization_invites.py @@ -116,6 +116,7 @@ def test_cancelled_invite_opened_by_user( mock_get_organization, fake_uuid, ): + mocker.patch("app.notify_client.user_api_client.UserApiClient.deactivate_user") client_request.logout() mock_get_user = mocker.patch( "app.user_api_client.get_user", return_value=api_user_active @@ -145,8 +146,9 @@ def test_cancelled_invite_opened_by_user( def test_user_invite_already_accepted( - client_request, mock_check_org_accepted_invite_token + client_request, mock_check_org_accepted_invite_token, mocker ): + mocker.patch("app.notify_client.user_api_client.UserApiClient.deactivate_user") client_request.logout() client_request.get( "main.accept_org_invite", @@ -169,7 +171,9 @@ def test_existing_user_invite_already_is_member_of_organization( mock_accept_org_invite, mock_add_user_to_organization, mock_update_user_attribute, + mocker, ): + mocker.patch("app.notify_client.user_api_client.UserApiClient.deactivate_user") client_request.logout() mock_update_user_attribute.reset_mock() client_request.get( @@ -201,7 +205,9 @@ def test_existing_user_invite_not_a_member_of_organization( mock_accept_org_invite, mock_add_user_to_organization, mock_update_user_attribute, + mocker, ): + mocker.patch("app.notify_client.user_api_client.UserApiClient.deactivate_user") client_request.logout() mock_update_user_attribute.reset_mock() client_request.get( @@ -232,7 +238,9 @@ def test_user_accepts_invite( mock_check_org_invite_token, mock_dont_get_user_by_email, mock_get_users_for_organization, + mocker, ): + mocker.patch("app.notify_client.user_api_client.UserApiClient.deactivate_user") client_request.logout() client_request.get( "main.accept_org_invite", @@ -246,8 +254,9 @@ def test_user_accepts_invite( def test_registration_from_org_invite_404s_if_user_not_in_session( - client_request, + client_request, mocker ): + mocker.patch("app.notify_client.user_api_client.UserApiClient.deactivate_user") client_request.logout() client_request.get( "main.register_from_org_invite", @@ -262,7 +271,7 @@ def test_registration_from_org_invite_404s_if_user_not_in_session( { "name": "Bad Mobile", "mobile_number": "not good", - "password": "validPassword!", + "password": "validPassword!", # noqa }, "The string supplied did not seem to be a phone number", ), @@ -270,7 +279,7 @@ def test_registration_from_org_invite_404s_if_user_not_in_session( { "name": "Bad Password", "mobile_number": "+12021234123", - "password": "password", + "password": "password", # noqa }, "Choose a password that’s harder to guess", ), @@ -282,7 +291,9 @@ def test_registration_from_org_invite_has_bad_data( data, error, mock_get_invited_org_user_by_id, + mocker, ): + mocker.patch("app.notify_client.user_api_client.UserApiClient.deactivate_user") client_request.logout() with client_request.session_transaction() as session: diff --git a/tests/app/main/views/test_accept_invite.py b/tests/app/main/views/test_accept_invite.py index a6d622c12..1fc355abb 100644 --- a/tests/app/main/views/test_accept_invite.py +++ b/tests/app/main/views/test_accept_invite.py @@ -133,6 +133,8 @@ def test_existing_user_accept_invite_calls_api_and_redirects_to_dashboard( mock_get_user, mock_update_user_attribute, ): + + mocker.patch("app.notify_client.user_api_client.UserApiClient.deactivate_user") client_request.logout() expected_service = service_one["id"] expected_permissions = { @@ -176,6 +178,8 @@ def test_existing_user_with_no_permissions_or_folder_permissions_accept_invite( mock_get_user, mock_update_user_attribute, ): + + mocker.patch("app.notify_client.user_api_client.UserApiClient.deactivate_user") client_request.logout() expected_service = service_one["id"] @@ -205,6 +209,8 @@ def test_if_existing_user_accepts_twice_they_redirect_to_sign_in( mock_get_service, mock_update_user_attribute, ): + + mocker.patch("app.notify_client.user_api_client.UserApiClient.deactivate_user") client_request.logout() # Logging out updates the current session ID to `None` mock_update_user_attribute.reset_mock() @@ -321,6 +327,8 @@ def test_existing_user_of_service_get_redirected_to_signin( mock_accept_invite, mock_update_user_attribute, ): + + mocker.patch("app.notify_client.user_api_client.UserApiClient.deactivate_user") client_request.logout() sample_invite["email_address"] = api_user_active["email_address"] mocker.patch("app.models.user.Users.client_method", return_value=[api_user_active]) @@ -355,6 +363,8 @@ def test_accept_invite_redirects_if_api_raises_an_error_that_they_are_already_pa mock_get_user, mock_update_user_attribute, ): + + mocker.patch("app.notify_client.user_api_client.UserApiClient.deactivate_user") client_request.logout() mocker.patch( @@ -397,6 +407,8 @@ def test_existing_signed_out_user_accept_invite_redirects_to_sign_in( mock_get_user, mock_update_user_attribute, ): + + mocker.patch("app.notify_client.user_api_client.UserApiClient.deactivate_user") client_request.logout() expected_service = service_one["id"] expected_permissions = { @@ -438,7 +450,10 @@ def test_cancelled_invited_user_accepts_invited_redirect_to_cancelled_invitation sample_invite, mock_check_invite_token, mock_update_user_attribute, + mocker, ): + + mocker.patch("app.notify_client.user_api_client.UserApiClient.deactivate_user") client_request.logout() mock_update_user_attribute.reset_mock() sample_invite["status"] = "cancelled" @@ -466,6 +481,8 @@ def test_new_user_accept_invite_with_malformed_token( service_one, mocker, ): + + mocker.patch("app.notify_client.user_api_client.UserApiClient.deactivate_user") client_request.logout() mocker.patch( api_endpoint, @@ -585,6 +602,8 @@ def test_new_invited_user_verifies_and_added_to_service( "app.main.views.verify.service_api_client.retrieve_service_invite_data", return_value={}, ) + + mocker.patch("app.notify_client.user_api_client.UserApiClient.deactivate_user") client_request.logout() # visit accept token page @@ -604,7 +623,7 @@ def test_new_invited_user_verifies_and_added_to_service( "service": sample_invite["service"], "email_address": sample_invite["email_address"], "from_user": sample_invite["from_user"], - "password": "longpassword", + "password": "longpassword", # noqa "mobile_number": "+12027890123", "name": "Invited User", "auth_type": "sms_auth", @@ -673,6 +692,8 @@ def test_new_invited_user_is_redirected_to_correct_place( "app.main.views.verify.service_api_client.retrieve_service_invite_data", return_value={}, ) + + mocker.patch("app.notify_client.user_api_client.UserApiClient.deactivate_user") client_request.logout() mocker.patch( "app.service_api_client.get_service", diff --git a/tests/app/main/views/test_dashboard.py b/tests/app/main/views/test_dashboard.py index e9036de22..475d7514e 100644 --- a/tests/app/main/views/test_dashboard.py +++ b/tests/app/main/views/test_dashboard.py @@ -1931,14 +1931,14 @@ def test_fetch_daily_stats( ) with app.test_client() as client: with client.session_transaction() as sess: - sess['service_id'] = service_id + sess["service_id"] = service_id socketio_client = SocketIOTestClient(app, socketio, flask_test_client=client) connected = socketio_client.is_connected() assert connected, "Client should be connected" - socketio_client.emit('fetch_daily_stats') + socketio_client.emit("fetch_daily_stats") received = socketio_client.get_received() mock_service_api.assert_called_once_with( @@ -1967,8 +1967,13 @@ def test_fetch_daily_stats( SERVICE_ONE_ID, USER_ONE_ID, {"start_date": "2024-01-01", "days": 7}, - {"service_id": SERVICE_ONE_ID, "user_id": USER_ONE_ID, "start_date": "2024-01-01", "days": 7}, - {"id": USER_ONE_ID, "name": "Test User"} + { + "service_id": SERVICE_ONE_ID, + "user_id": USER_ONE_ID, + "start_date": "2024-01-01", + "days": 7, + }, + {"id": USER_ONE_ID, "name": "Test User"}, ), ], ) @@ -2001,15 +2006,15 @@ def test_fetch_daily_stats_by_user( with app.test_client() as client: with client.session_transaction() as sess: - sess['service_id'] = service_id - sess['user_id'] = user_id + sess["service_id"] = service_id + sess["user_id"] = user_id socketio_client = SocketIOTestClient(app, socketio, flask_test_client=client) connected = socketio_client.is_connected() assert connected, "Client should be connected" - socketio_client.emit('fetch_daily_stats_by_user') + socketio_client.emit("fetch_daily_stats_by_user") received = socketio_client.get_received() mock_service_api.assert_called_once_with( diff --git a/tests/app/main/views/test_headers.py b/tests/app/main/views/test_headers.py index 211601d16..e31b12220 100644 --- a/tests/app/main/views/test_headers.py +++ b/tests/app/main/views/test_headers.py @@ -6,6 +6,8 @@ def test_owasp_useful_headers_set( mocker, mock_get_service_and_organization_counts, ): + + mocker.patch("app.notify_client.user_api_client.UserApiClient.deactivate_user") client_request.logout() response = client_request.get_response(".index") diff --git a/tests/app/main/views/test_index.py b/tests/app/main/views/test_index.py index 154106250..a4d57a89c 100644 --- a/tests/app/main/views/test_index.py +++ b/tests/app/main/views/test_index.py @@ -9,9 +9,10 @@ from tests.conftest import SERVICE_ONE_ID, normalize_spaces def test_non_logged_in_user_can_see_homepage( - client_request, - mock_get_service_and_organization_counts, + client_request, mock_get_service_and_organization_counts, mocker ): + + mocker.patch("app.notify_client.user_api_client.UserApiClient.deactivate_user") client_request.logout() page = client_request.get("main.index", _test_page_title=False) @@ -69,11 +70,10 @@ def test_robots(client_request): ) @freeze_time("2012-12-12 12:12") # So we don’t go out of business hours def test_hiding_pages_from_search_engines( - client_request, - mock_get_service_and_organization_counts, - endpoint, - kwargs, + client_request, mock_get_service_and_organization_counts, endpoint, kwargs, mocker ): + + mocker.patch("app.notify_client.user_api_client.UserApiClient.deactivate_user") client_request.logout() response = client_request.get_response(f"main.{endpoint}", **kwargs) assert "X-Robots-Tag" in response.headers @@ -103,11 +103,8 @@ def test_hiding_pages_from_search_engines( "billing_details", ], ) -def test_static_pages( - client_request, - mock_get_organization_by_domain, - view, -): +def test_static_pages(client_request, mock_get_organization_by_domain, view, mocker): + mocker.patch("app.notify_client.user_api_client.UserApiClient.deactivate_user") request = partial(client_request.get, "main.{}".format(view)) # Check the page loads when user is signed in @@ -130,9 +127,9 @@ def test_static_pages( ) -def test_guidance_pages_link_to_service_pages_when_signed_in( - client_request, -): +def test_guidance_pages_link_to_service_pages_when_signed_in(client_request, mocker): + + mocker.patch("app.notify_client.user_api_client.UserApiClient.deactivate_user") request = partial(client_request.get, "main.edit_and_format_messages") selector = ".list-number li a" @@ -170,7 +167,9 @@ def test_guidance_pages_link_to_service_pages_when_signed_in( ("callbacks", "documentation"), ], ) -def test_old_static_pages_redirect(client_request, view, expected_view): +def test_old_static_pages_redirect(client_request, view, expected_view, mocker): + + mocker.patch("app.notify_client.user_api_client.UserApiClient.deactivate_user") client_request.logout() client_request.get( "main.{}".format(view), @@ -243,7 +242,10 @@ def test_sms_price( mock_get_service_and_organization_counts, current_date, expected_rate, + mocker, ): + + mocker.patch("app.notify_client.user_api_client.UserApiClient.deactivate_user") client_request.logout() with freeze_time(current_date): diff --git a/tests/app/main/views/test_platform_admin.py b/tests/app/main/views/test_platform_admin.py index f5e7862a7..e617b27f8 100644 --- a/tests/app/main/views/test_platform_admin.py +++ b/tests/app/main/views/test_platform_admin.py @@ -27,7 +27,9 @@ from tests.conftest import SERVICE_ONE_ID, SERVICE_TWO_ID, normalize_spaces "main.trial_services", ], ) -def test_should_redirect_if_not_logged_in(client_request, endpoint): +def test_should_redirect_if_not_logged_in(client_request, endpoint, mocker): + + mocker.patch("app.notify_client.user_api_client.UserApiClient.deactivate_user") client_request.logout() client_request.get( endpoint, diff --git a/tests/app/main/views/test_register.py b/tests/app/main/views/test_register.py index 19d8c5a4b..b3d70deb5 100644 --- a/tests/app/main/views/test_register.py +++ b/tests/app/main/views/test_register.py @@ -10,9 +10,9 @@ from app.models.user import User from tests.conftest import normalize_spaces -def test_render_register_returns_template_with_form( - client_request, -): +def test_render_register_returns_template_with_form(client_request, mocker): + + mocker.patch("app.notify_client.user_api_client.UserApiClient.deactivate_user") client_request.logout() page = client_request.get_url("/register") @@ -58,7 +58,10 @@ def test_register_creates_new_user_and_redirects_to_continue_page( mock_login, phone_number_to_register_with, password, + mocker, ): + + mocker.patch("app.notify_client.user_api_client.UserApiClient.deactivate_user") client_request.logout() user_data = { "name": "Some One Valid", @@ -89,9 +92,9 @@ def test_register_creates_new_user_and_redirects_to_continue_page( # ) -def test_register_continue_handles_missing_session_sensibly( - client_request, -): +def test_register_continue_handles_missing_session_sensibly(client_request, mocker): + + mocker.patch("app.notify_client.user_api_client.UserApiClient.deactivate_user") client_request.logout() # session is not set client_request.get( @@ -105,7 +108,10 @@ def test_process_register_returns_200_when_mobile_number_is_invalid( mock_send_verify_code, mock_get_user_by_email_not_found, mock_login, + mocker, ): + + mocker.patch("app.notify_client.user_api_client.UserApiClient.deactivate_user") client_request.logout() page = client_request.post( "main.register", @@ -113,7 +119,7 @@ def test_process_register_returns_200_when_mobile_number_is_invalid( "name": "Bad Mobile", "email_address": "bad_mobile@example.gsa.gov", "mobile_number": "not good", - "password": "validPassword!", + "password": "validPassword!", # noqa }, _expected_status=200, ) @@ -122,9 +128,10 @@ def test_process_register_returns_200_when_mobile_number_is_invalid( def test_should_return_200_when_email_is_not_gov_uk( - client_request, - mock_get_organizations, + client_request, mock_get_organizations, mocker ): + + mocker.patch("app.notify_client.user_api_client.UserApiClient.deactivate_user") client_request.logout() page = client_request.post( "main.register", @@ -163,6 +170,8 @@ def test_should_add_user_details_to_session( mock_login, email_address, ): + + mocker.patch("app.notify_client.user_api_client.UserApiClient.deactivate_user") client_request.logout() client_request.post( "main.register", @@ -178,10 +187,10 @@ def test_should_add_user_details_to_session( def test_should_return_200_if_password_is_on_list_of_commonly_used_passwords( - client_request, - mock_get_user_by_email, - mock_login, + client_request, mock_get_user_by_email, mock_login, mocker ): + + mocker.patch("app.notify_client.user_api_client.UserApiClient.deactivate_user") client_request.logout() page = client_request.post( "main.register", @@ -189,7 +198,7 @@ def test_should_return_200_if_password_is_on_list_of_commonly_used_passwords( "name": "Bad Mobile", "email_address": "bad_mobile@example.gsa.gov", "mobile_number": "+12021234123", - "password": "password", + "password": "password", # noqa }, _expected_status=200, ) @@ -202,7 +211,10 @@ def test_register_with_existing_email_sends_emails( api_user_active, mock_get_user_by_email, mock_send_already_registered_email, + mocker, ): + + mocker.patch("app.notify_client.user_api_client.UserApiClient.deactivate_user") client_request.logout() user_data = { "name": "Already Hasaccount", @@ -244,6 +256,8 @@ def test_register_from_email_auth_invite( "app.main.views.verify.service_api_client.retrieve_service_invite_data", return_value={}, ) + + mocker.patch("app.notify_client.user_api_client.UserApiClient.deactivate_user") client_request.logout() mock_login_user = mocker.patch("app.models.user.login_user") sample_invite["auth_type"] = "email_auth" @@ -257,7 +271,7 @@ def test_register_from_email_auth_invite( "name": "invited user", "email_address": sample_invite["email_address"], "mobile_number": "2028675301", - "password": "FSLKAJHFNvdzxgfyst", + "password": "FSLKAJHFNvdzxgfyst", # noqa "service": sample_invite["service"], "auth_type": "email_auth", } @@ -331,6 +345,8 @@ def test_can_register_email_auth_without_phone_number( "app.main.views.verify.service_api_client.retrieve_service_invite_data", return_value={}, ) + + mocker.patch("app.notify_client.user_api_client.UserApiClient.deactivate_user") client_request.logout() sample_invite["auth_type"] = "email_auth" with client_request.session_transaction() as session: @@ -364,7 +380,10 @@ def test_cannot_register_with_sms_auth_and_missing_mobile_number( mock_send_verify_code, mock_get_user_by_email_not_found, mock_login, + mocker, ): + + mocker.patch("app.notify_client.user_api_client.UserApiClient.deactivate_user") client_request.logout() page = client_request.post( "main.register", diff --git a/tests/app/main/views/test_sign_in.py b/tests/app/main/views/test_sign_in.py index efa01deb7..319b41c81 100644 --- a/tests/app/main/views/test_sign_in.py +++ b/tests/app/main/views/test_sign_in.py @@ -7,7 +7,9 @@ from app.models.user import User from tests.conftest import SERVICE_ONE_ID, normalize_spaces -def test_render_sign_in_template_for_new_user(client_request): +def test_render_sign_in_template_for_new_user(client_request, mocker): + + mocker.patch("app.notify_client.user_api_client.UserApiClient.deactivate_user") client_request.logout() page = client_request.get("main.sign_in") assert normalize_spaces(page.select_one("h1").text) == "Sign in" @@ -25,7 +27,9 @@ def test_render_sign_in_template_for_new_user(client_request): assert "Sign in again" not in normalize_spaces(page.text) -def test_sign_in_explains_session_timeout(client_request): +def test_sign_in_explains_session_timeout(client_request, mocker): + + mocker.patch("app.notify_client.user_api_client.UserApiClient.deactivate_user") client_request.logout() page = client_request.get("main.sign_in", next="/foo") assert ( @@ -81,7 +85,10 @@ def test_should_return_redirect_when_user_is_pending( mock_get_user_by_email_pending, api_user_pending, mock_verify_password, + mocker, ): + + mocker.patch("app.notify_client.user_api_client.UserApiClient.deactivate_user") client_request.logout() client_request.post( "main.sign_in", @@ -107,8 +114,14 @@ def test_should_return_redirect_when_user_is_pending( ) @pytest.mark.skip("TODO is this still relevant post login.gov switch?") def test_should_attempt_redirect_when_user_is_pending( - client_request, mock_get_user_by_email_pending, mock_verify_password, redirect_url + client_request, + mock_get_user_by_email_pending, + mock_verify_password, + redirect_url, + mocker, ): + + mocker.patch("app.notify_client.user_api_client.UserApiClient.deactivate_user") client_request.logout() client_request.post( "main.sign_in", @@ -132,6 +145,8 @@ def test_when_signing_in_as_invited_user_you_cannot_accept_an_invite_for_another mock_send_verify_code, mock_get_invited_user_by_id, ): + + mocker.patch("app.notify_client.user_api_client.UserApiClient.deactivate_user") sample_invite["email_address"] = "some_other_user@user.gsa.gov" mocker.patch( diff --git a/tests/app/main/views/test_sign_out.py b/tests/app/main/views/test_sign_out.py index d70c5d0f8..5ec23edf3 100644 --- a/tests/app/main/views/test_sign_out.py +++ b/tests/app/main/views/test_sign_out.py @@ -86,12 +86,14 @@ MOCK_JOBS = { } -def test_render_sign_out_redirects_to_sign_in(client_request): +def test_render_sign_out_redirects_to_sign_in(client_request, mocker): # TODO with the change to using login.gov, we no longer redirect directly to the sign in page. # Instead we redirect to login.gov which redirects us to the sign in page. However, the # test for the expected redirect being "/" is buried in conftest and looks fragile. # After we move to login.gov officially and get rid of other forms of signing it, it should # be refactored. + + mocker.patch("app.notify_client.user_api_client.UserApiClient.deactivate_user") with client_request.session_transaction() as session: assert session client_request.get( @@ -99,7 +101,7 @@ def test_render_sign_out_redirects_to_sign_in(client_request): _expected_status=302, ) with client_request.session_transaction() as session: - assert not session + assert session.permanent is False def test_sign_out_user( @@ -119,6 +121,8 @@ def test_sign_out_user( mock_get_free_sms_fragment_limit, mock_get_inbound_sms_summary, ): + + mocker.patch("app.notify_client.user_api_client.UserApiClient.deactivate_user") with client_request.session_transaction() as session: assert session.get("user_id") is not None # Check we are logged in @@ -141,13 +145,15 @@ def test_sign_out_user( assert session.get("user_id") is None -def test_sign_out_of_two_sessions(client_request): +def test_sign_out_of_two_sessions(client_request, mocker): + + mocker.patch("app.notify_client.user_api_client.UserApiClient.deactivate_user") client_request.get( "main.sign_out", _expected_status=302, ) with client_request.session_transaction() as session: - assert not session + assert session.permanent is False client_request.get( "main.sign_out", _expected_status=302, diff --git a/tests/app/main/views/test_two_factor.py b/tests/app/main/views/test_two_factor.py index 148aece98..d1f38d1ab 100644 --- a/tests/app/main/views/test_two_factor.py +++ b/tests/app/main/views/test_two_factor.py @@ -26,8 +26,10 @@ def mock_email_validated_recently(mocker): ("email_resent", "page_title"), [(None, "Check your email"), (True, "Email resent")] ) def test_two_factor_email_sent_page( - client_request, email_resent, page_title, redirect_url, request_url + client_request, email_resent, page_title, redirect_url, request_url, mocker ): + + mocker.patch("app.notify_client.user_api_client.UserApiClient.deactivate_user") client_request.logout() page = client_request.get( f"main.{request_url}", @@ -55,6 +57,8 @@ def test_two_factor_email_sent_page( def test_should_render_two_factor_page( client_request, api_user_active, mock_get_user_by_email, mocker, redirect_url ): + + mocker.patch("app.notify_client.user_api_client.UserApiClient.deactivate_user") client_request.logout() # TODO this lives here until we work out how to # reassign the session after it is lost mid register process @@ -86,7 +90,10 @@ def test_should_login_user_and_should_redirect_to_next_url( mock_check_verify_code, mock_create_event, mock_email_validated_recently, + mocker, ): + + mocker.patch("app.notify_client.user_api_client.UserApiClient.deactivate_user") client_request.logout() with client_request.session_transaction() as session: @@ -115,6 +122,8 @@ def test_should_send_email_and_redirect_to_info_page_if_user_needs_to_revalidate mock_send_verify_code, mocker, ): + + mocker.patch("app.notify_client.user_api_client.UserApiClient.deactivate_user") client_request.logout() mocker.patch("app.user_api_client.get_user", return_value=api_user_active) @@ -149,7 +158,10 @@ def test_should_login_user_and_not_redirect_to_external_url( mock_get_services_with_one_service, mock_create_event, mock_email_validated_recently, + mocker, ): + + mocker.patch("app.notify_client.user_api_client.UserApiClient.deactivate_user") client_request.logout() with client_request.session_transaction() as session: @@ -182,7 +194,10 @@ def test_should_login_user_and_redirect_to_show_accounts( mock_create_event, mock_email_validated_recently, platform_admin, + mocker, ): + + mocker.patch("app.notify_client.user_api_client.UserApiClient.deactivate_user") client_request.logout() with client_request.session_transaction() as session: @@ -206,6 +221,8 @@ def test_should_return_200_with_sms_code_error_when_sms_code_is_wrong( mock_check_verify_code_code_not_found, mocker, ): + + mocker.patch("app.notify_client.user_api_client.UserApiClient.deactivate_user") client_request.logout() with client_request.session_transaction() as session: @@ -232,7 +249,10 @@ def test_should_login_user_when_multiple_valid_codes_exist( mock_get_services_with_one_service, mock_create_event, mock_email_validated_recently, + mocker, ): + + mocker.patch("app.notify_client.user_api_client.UserApiClient.deactivate_user") client_request.logout() with client_request.session_transaction() as session: @@ -257,7 +277,10 @@ def test_two_factor_sms_should_set_password_when_new_password_exists_in_session( mock_update_user_password, mock_create_event, mock_email_validated_recently, + mocker, ): + + mocker.patch("app.notify_client.user_api_client.UserApiClient.deactivate_user") client_request.logout() with client_request.session_transaction() as session: @@ -285,7 +308,10 @@ def test_two_factor_sms_returns_error_when_user_is_locked( mock_get_locked_user, mock_check_verify_code_code_not_found, mock_get_services_with_one_service, + mocker, ): + + mocker.patch("app.notify_client.user_api_client.UserApiClient.deactivate_user") client_request.logout() with client_request.session_transaction() as session: @@ -320,6 +346,8 @@ def test_two_factor_sms_should_activate_pending_user( mock_activate_user, mock_email_validated_recently, ): + + mocker.patch("app.notify_client.user_api_client.UserApiClient.deactivate_user") client_request.logout() mocker.patch("app.user_api_client.get_user", return_value=api_user_pending) mocker.patch("app.service_api_client.get_services", return_value={"data": []}) @@ -344,6 +372,8 @@ def test_valid_two_factor_email_link_shows_interstitial( extra_args, expected_encoded_next_arg, ): + + mocker.patch("app.notify_client.user_api_client.UserApiClient.deactivate_user") mock_check_code = mocker.patch("app.user_api_client.check_verify_code") encoded_token = valid_token.replace("%2E", ".") token_url = url_for( @@ -400,7 +430,10 @@ def test_two_factor_email_link_has_expired( mock_send_verify_code, fake_uuid, redirect_url, + mocker, ): + + mocker.patch("app.notify_client.user_api_client.UserApiClient.deactivate_user") client_request.logout() with set_config(notify_admin, "EMAIL_EXPIRY_SECONDS", -1): @@ -419,7 +452,9 @@ def test_two_factor_email_link_has_expired( assert mock_send_verify_code.called is False -def test_two_factor_email_link_is_invalid(client_request): +def test_two_factor_email_link_is_invalid(client_request, mocker): + + mocker.patch("app.notify_client.user_api_client.UserApiClient.deactivate_user") client_request.logout() token = 12345 page = client_request.post( @@ -443,8 +478,14 @@ def test_two_factor_email_link_is_invalid(client_request): ], ) def test_two_factor_email_link_is_already_used( - client_request, valid_token, mocker, mock_send_verify_code, redirect_url + client_request, + valid_token, + mocker, + mock_send_verify_code, + redirect_url, ): + + mocker.patch("app.notify_client.user_api_client.UserApiClient.deactivate_user") client_request.logout() mocker.patch( "app.user_api_client.check_verify_code", @@ -467,8 +508,13 @@ def test_two_factor_email_link_is_already_used( def test_two_factor_email_link_when_user_is_locked_out( - client_request, valid_token, mocker, mock_send_verify_code + client_request, + valid_token, + mocker, + mock_send_verify_code, ): + + mocker.patch("app.notify_client.user_api_client.UserApiClient.deactivate_user") client_request.logout() mocker.patch( "app.user_api_client.check_verify_code", return_value=(False, "Code not found") diff --git a/tests/app/main/views/test_verify.py b/tests/app/main/views/test_verify.py index 3c4a93725..4f2e39feb 100644 --- a/tests/app/main/views/test_verify.py +++ b/tests/app/main/views/test_verify.py @@ -204,6 +204,8 @@ def test_verify_email_redirects_to_sign_in_if_user_active( mock_send_verify_code, mock_check_verify_code, ): + + mocker.patch("app.notify_client.user_api_client.UserApiClient.deactivate_user") client_request.logout() token_data = {"user_id": api_user_active["id"], "secret_code": 12345} mocker.patch( diff --git a/tests/app/notify_client/test_service_api_client.py b/tests/app/notify_client/test_service_api_client.py index 815f3e5e2..bab8bdc39 100644 --- a/tests/app/notify_client/test_service_api_client.py +++ b/tests/app/notify_client/test_service_api_client.py @@ -529,6 +529,9 @@ def test_deletes_caches_when_modifying_templates( def test_deletes_cached_users_when_archiving_service( mocker, mock_get_service_templates ): + mocker.patch( + "app.notify_client.service_api_client.ServiceAPIClient.check_inactive_user" + ) mock_redis_delete = mocker.patch("app.extensions.RedisClient.delete") mock_redis_delete_by_pattern = mocker.patch( "app.extensions.RedisClient.delete_by_pattern" diff --git a/tests/app/utils/test_user.py b/tests/app/utils/test_user.py index 20d4b1d71..9d35aa507 100644 --- a/tests/app/utils/test_user.py +++ b/tests/app/utils/test_user.py @@ -94,7 +94,9 @@ def test_restrict_admin_usage( index() -def test_no_user_returns_redirect_to_sign_in(client_request): +def test_no_user_returns_redirect_to_sign_in(client_request, mocker): + + mocker.patch("app.notify_client.user_api_client.UserApiClient.deactivate_user") client_request.logout() @user_has_permissions() From 272d3217666ec4afa4290d948b1004e658776735 Mon Sep 17 00:00:00 2001 From: Kenneth Kehl <@kkehl@flexion.us> Date: Thu, 11 Jul 2024 10:27:04 -0700 Subject: [PATCH 12/58] skip e2e --- app/notify_client/__init__.py | 5 ++++- tests/end_to_end/test_accounts_page.py | 1 + 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/app/notify_client/__init__.py b/app/notify_client/__init__.py index d58cc4f4f..66ba89391 100644 --- a/app/notify_client/__init__.py +++ b/app/notify_client/__init__.py @@ -55,7 +55,10 @@ class NotifyAdminAPIClient(BaseAPIClient): abort(403) def check_inactive_user(self): - if not current_user or not current_user.is_active: + if os.getenv("NOTIFY_E2E_TEST_EMAIL"): + # allow end-to-end tests to skip check + pass + elif not current_user or not current_user.is_active: abort(403) def post(self, *args, **kwargs): diff --git a/tests/end_to_end/test_accounts_page.py b/tests/end_to_end/test_accounts_page.py index b6fe8c5ac..9ed17655a 100644 --- a/tests/end_to_end/test_accounts_page.py +++ b/tests/end_to_end/test_accounts_page.py @@ -10,6 +10,7 @@ E2E_TEST_URI = os.getenv("NOTIFY_E2E_TEST_URI") def test_add_new_service_workflow(authenticated_page, end_to_end_context): page = authenticated_page + # Prepare for adding a new service later in the test. current_date_time = datetime.datetime.now() new_service_name = "E2E Federal Test Service {now} - {browser_type}".format( From 18333b9a670c869e1896f69a9c9d2196529166f0 Mon Sep 17 00:00:00 2001 From: Kenneth Kehl <@kkehl@flexion.us> Date: Thu, 11 Jul 2024 10:35:50 -0700 Subject: [PATCH 13/58] fix import --- app/notify_client/__init__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/app/notify_client/__init__.py b/app/notify_client/__init__.py index 66ba89391..3dbdb57a4 100644 --- a/app/notify_client/__init__.py +++ b/app/notify_client/__init__.py @@ -1,3 +1,4 @@ +import os from flask import abort, has_request_context, request from flask_login import current_user from notifications_python_client import __version__ From df9efb38d43ed7174e5b2b29432a4bf18a7a2f13 Mon Sep 17 00:00:00 2001 From: Kenneth Kehl <@kkehl@flexion.us> Date: Thu, 11 Jul 2024 10:40:19 -0700 Subject: [PATCH 14/58] fix import sorting --- app/notify_client/__init__.py | 1 + tests/end_to_end/test_accounts_page.py | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/app/notify_client/__init__.py b/app/notify_client/__init__.py index 3dbdb57a4..f24f34345 100644 --- a/app/notify_client/__init__.py +++ b/app/notify_client/__init__.py @@ -1,4 +1,5 @@ import os + from flask import abort, has_request_context, request from flask_login import current_user from notifications_python_client import __version__ diff --git a/tests/end_to_end/test_accounts_page.py b/tests/end_to_end/test_accounts_page.py index 9ed17655a..b6fe8c5ac 100644 --- a/tests/end_to_end/test_accounts_page.py +++ b/tests/end_to_end/test_accounts_page.py @@ -10,7 +10,6 @@ E2E_TEST_URI = os.getenv("NOTIFY_E2E_TEST_URI") def test_add_new_service_workflow(authenticated_page, end_to_end_context): page = authenticated_page - # Prepare for adding a new service later in the test. current_date_time = datetime.datetime.now() new_service_name = "E2E Federal Test Service {now} - {browser_type}".format( From 96e94fd7d3ce80be3f1e544d012a4914e40f599c Mon Sep 17 00:00:00 2001 From: Beverly Nguyen Date: Thu, 11 Jul 2024 10:42:28 -0700 Subject: [PATCH 15/58] added conditional to datetime in table --- app/main/views/dashboard.py | 2 ++ app/templates/views/dashboard/dashboard.html | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/app/main/views/dashboard.py b/app/main/views/dashboard.py index 557ac9955..04b166fdc 100644 --- a/app/main/views/dashboard.py +++ b/app/main/views/dashboard.py @@ -106,6 +106,7 @@ def service_dashboard(service_id): ), "created_at": job["created_at"], "processing_finished": job["processing_finished"], + "processing_started": job["processing_started"], "notification_count": job["notification_count"], "created_by": job["created_by"], "notifications": aggregate_notifications_by_job.get(job["id"], []), @@ -119,6 +120,7 @@ def service_dashboard(service_id): partials=get_dashboard_partials(service_id), job_and_notifications=job_and_notifications, service_data_retention_days=service_data_retention_days, + job_response=job_response ) diff --git a/app/templates/views/dashboard/dashboard.html b/app/templates/views/dashboard/dashboard.html index 19297863c..6ad364b22 100644 --- a/app/templates/views/dashboard/dashboard.html +++ b/app/templates/views/dashboard/dashboard.html @@ -69,7 +69,7 @@ {{ notification.template.name }} - {{ job.processing_finished|format_datetime_table }} + {{ (job.processing_finished or job.processing_started)|format_datetime_table }} {{ notification.created_by.name }} From 380ed4417aae0c977a375c36c436bb26b3bf8580 Mon Sep 17 00:00:00 2001 From: Beverly Nguyen Date: Thu, 11 Jul 2024 10:43:28 -0700 Subject: [PATCH 16/58] removed job_response --- app/main/views/dashboard.py | 1 - 1 file changed, 1 deletion(-) diff --git a/app/main/views/dashboard.py b/app/main/views/dashboard.py index 04b166fdc..d725dde3b 100644 --- a/app/main/views/dashboard.py +++ b/app/main/views/dashboard.py @@ -120,7 +120,6 @@ def service_dashboard(service_id): partials=get_dashboard_partials(service_id), job_and_notifications=job_and_notifications, service_data_retention_days=service_data_retention_days, - job_response=job_response ) From 415217057f6a0bd6bf8ef6bfb7a6deec924c4cc6 Mon Sep 17 00:00:00 2001 From: alexjanousekGSA Date: Thu, 11 Jul 2024 13:21:28 -0600 Subject: [PATCH 17/58] Updated checks.yml --- .github/workflows/checks.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/checks.yml b/.github/workflows/checks.yml index 066e12fcd..d8ebf7350 100644 --- a/.github/workflows/checks.yml +++ b/.github/workflows/checks.yml @@ -24,9 +24,9 @@ jobs: steps: - uses: actions/checkout@v4 - name: Set up Node.js - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: - node-version: "16.15.1" + node-version: "22.3.0" - name: Install dependencies run: npm install - uses: ./.github/actions/setup-project From 84aada22f087d267ac976b4ca8a996ebff25fbaf Mon Sep 17 00:00:00 2001 From: Beverly Nguyen Date: Thu, 11 Jul 2024 12:32:08 -0700 Subject: [PATCH 18/58] added conditionals to datetime in status banner --- app/templates/partials/jobs/status.html | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/templates/partials/jobs/status.html b/app/templates/partials/jobs/status.html index c64da7fc3..42cf4a4b7 100644 --- a/app/templates/partials/jobs/status.html +++ b/app/templates/partials/jobs/status.html @@ -37,7 +37,9 @@

Your text has been sent

- {{ job.template_name }} - {{ current_service.name }} was sent on {{ job.processing_started|format_datetime_normal }} by {{ job.created_by.name }} + {{ job.template_name }} - {{ current_service.name }} was sent on {% if job.processing_started %} + {{ job.processing_started|format_datetime_table }} {% else %} + {{ job.created_at|format_datetime_table }} {% endif %} by {{ job.created_by.name }}

From 883df1bdcdbb86053ed4b3e0efbad92d899779c5 Mon Sep 17 00:00:00 2001 From: Beverly Nguyen Date: Thu, 11 Jul 2024 12:55:35 -0700 Subject: [PATCH 19/58] added conditionals to datetime in status banner --- app/templates/views/dashboard/dashboard.html | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/templates/views/dashboard/dashboard.html b/app/templates/views/dashboard/dashboard.html index 6ad364b22..aba7d2ac6 100644 --- a/app/templates/views/dashboard/dashboard.html +++ b/app/templates/views/dashboard/dashboard.html @@ -69,7 +69,8 @@ {{ notification.template.name }} - {{ (job.processing_finished or job.processing_started)|format_datetime_table }} + {{ (job.processing_finished if job.processing_finished else job.processing_started + if job.processing_started else job.created_at)|format_datetime_table }} {{ notification.created_by.name }} From 94e8df0470d43ce5426b27f986351e367d871e15 Mon Sep 17 00:00:00 2001 From: Carlo Costino Date: Fri, 12 Jul 2024 12:02:37 -0400 Subject: [PATCH 20/58] Update Python dependencies - 7/12/24 - and ignore idna pip-audit flag This changeset updates several Python dependencies that Dependabot has flagged. It also ignores a pip-audit report of idna, which incorrectly flagged the version we are on as having been affected by PYSEC-2024-60; this was fixed in version 3.7 of idna, which we are currently using. We will update the action again once the audit flag is corrected and/or another fix version is released (if needed). Signed-off-by: Carlo Costino --- .github/workflows/checks.yml | 2 + poetry.lock | 234 +++++++++++++++++------------------ pyproject.toml | 6 +- 3 files changed, 122 insertions(+), 120 deletions(-) diff --git a/.github/workflows/checks.yml b/.github/workflows/checks.yml index f50ee1bcc..cc5a92deb 100644 --- a/.github/workflows/checks.yml +++ b/.github/workflows/checks.yml @@ -160,6 +160,8 @@ jobs: - uses: pypa/gh-action-pip-audit@v1.0.8 with: inputs: requirements.txt + ignore-vulns: | + PYSEC-2024-60 - name: Run npm audit run: make npm-audit diff --git a/poetry.lock b/poetry.lock index eb5c0286f..ca126af0e 100644 --- a/poetry.lock +++ b/poetry.lock @@ -182,17 +182,17 @@ files = [ [[package]] name = "boto3" -version = "1.34.139" +version = "1.34.143" description = "The AWS SDK for Python" optional = false python-versions = ">=3.8" files = [ - {file = "boto3-1.34.139-py3-none-any.whl", hash = "sha256:98b2a12bcb30e679fa9f60fc74145a39db5ec2ca7b7c763f42896e3bd9b3a38d"}, - {file = "boto3-1.34.139.tar.gz", hash = "sha256:32b99f0d76ec81fdca287ace2c9744a2eb8b92cb62bf4d26d52a4f516b63a6bf"}, + {file = "boto3-1.34.143-py3-none-any.whl", hash = "sha256:0d16832f23e6bd3ae94e35ea8e625529850bfad9baccd426de96ad8f445d8e03"}, + {file = "boto3-1.34.143.tar.gz", hash = "sha256:b590ce80c65149194def43ebf0ea1cf0533945502507837389a8d22e3ecbcf05"}, ] [package.dependencies] -botocore = ">=1.34.139,<1.35.0" +botocore = ">=1.34.143,<1.35.0" jmespath = ">=0.7.1,<2.0.0" s3transfer = ">=0.10.0,<0.11.0" @@ -201,13 +201,13 @@ crt = ["botocore[crt] (>=1.21.0,<2.0a0)"] [[package]] name = "botocore" -version = "1.34.139" +version = "1.34.143" description = "Low-level, data-driven core of boto 3." optional = false python-versions = ">=3.8" files = [ - {file = "botocore-1.34.139-py3-none-any.whl", hash = "sha256:dd1e085d4caa2a4c1b7d83e3bc51416111c8238a35d498e9d3b04f3b63b086ba"}, - {file = "botocore-1.34.139.tar.gz", hash = "sha256:df023d8cf8999d574214dad4645cb90f9d2ccd1494f6ee2b57b1ab7522f6be77"}, + {file = "botocore-1.34.143-py3-none-any.whl", hash = "sha256:094aea179e8aaa1bc957ad49cc27d93b189dd3a1f3075d8b0ca7c445a2a88430"}, + {file = "botocore-1.34.143.tar.gz", hash = "sha256:059f032ec05733a836e04e869c5a15534420102f93116f3bc9a5b759b0651caf"}, ] [package.dependencies] @@ -473,63 +473,63 @@ files = [ [[package]] name = "coverage" -version = "7.5.4" +version = "7.6.0" description = "Code coverage measurement for Python" optional = false python-versions = ">=3.8" files = [ - {file = "coverage-7.5.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6cfb5a4f556bb51aba274588200a46e4dd6b505fb1a5f8c5ae408222eb416f99"}, - {file = "coverage-7.5.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2174e7c23e0a454ffe12267a10732c273243b4f2d50d07544a91198f05c48f47"}, - {file = "coverage-7.5.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2214ee920787d85db1b6a0bd9da5f8503ccc8fcd5814d90796c2f2493a2f4d2e"}, - {file = "coverage-7.5.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1137f46adb28e3813dec8c01fefadcb8c614f33576f672962e323b5128d9a68d"}, - {file = "coverage-7.5.4-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b385d49609f8e9efc885790a5a0e89f2e3ae042cdf12958b6034cc442de428d3"}, - {file = "coverage-7.5.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b4a474f799456e0eb46d78ab07303286a84a3140e9700b9e154cfebc8f527016"}, - {file = "coverage-7.5.4-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:5cd64adedf3be66f8ccee418473c2916492d53cbafbfcff851cbec5a8454b136"}, - {file = "coverage-7.5.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e564c2cf45d2f44a9da56f4e3a26b2236504a496eb4cb0ca7221cd4cc7a9aca9"}, - {file = "coverage-7.5.4-cp310-cp310-win32.whl", hash = "sha256:7076b4b3a5f6d2b5d7f1185fde25b1e54eb66e647a1dfef0e2c2bfaf9b4c88c8"}, - {file = "coverage-7.5.4-cp310-cp310-win_amd64.whl", hash = "sha256:018a12985185038a5b2bcafab04ab833a9a0f2c59995b3cec07e10074c78635f"}, - {file = "coverage-7.5.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:db14f552ac38f10758ad14dd7b983dbab424e731588d300c7db25b6f89e335b5"}, - {file = "coverage-7.5.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3257fdd8e574805f27bb5342b77bc65578e98cbc004a92232106344053f319ba"}, - {file = "coverage-7.5.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3a6612c99081d8d6134005b1354191e103ec9705d7ba2754e848211ac8cacc6b"}, - {file = "coverage-7.5.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d45d3cbd94159c468b9b8c5a556e3f6b81a8d1af2a92b77320e887c3e7a5d080"}, - {file = "coverage-7.5.4-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ed550e7442f278af76d9d65af48069f1fb84c9f745ae249c1a183c1e9d1b025c"}, - {file = "coverage-7.5.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7a892be37ca35eb5019ec85402c3371b0f7cda5ab5056023a7f13da0961e60da"}, - {file = "coverage-7.5.4-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8192794d120167e2a64721d88dbd688584675e86e15d0569599257566dec9bf0"}, - {file = "coverage-7.5.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:820bc841faa502e727a48311948e0461132a9c8baa42f6b2b84a29ced24cc078"}, - {file = "coverage-7.5.4-cp311-cp311-win32.whl", hash = "sha256:6aae5cce399a0f065da65c7bb1e8abd5c7a3043da9dceb429ebe1b289bc07806"}, - {file = "coverage-7.5.4-cp311-cp311-win_amd64.whl", hash = "sha256:d2e344d6adc8ef81c5a233d3a57b3c7d5181f40e79e05e1c143da143ccb6377d"}, - {file = "coverage-7.5.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:54317c2b806354cbb2dc7ac27e2b93f97096912cc16b18289c5d4e44fc663233"}, - {file = "coverage-7.5.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:042183de01f8b6d531e10c197f7f0315a61e8d805ab29c5f7b51a01d62782747"}, - {file = "coverage-7.5.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a6bb74ed465d5fb204b2ec41d79bcd28afccf817de721e8a807d5141c3426638"}, - {file = "coverage-7.5.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b3d45ff86efb129c599a3b287ae2e44c1e281ae0f9a9bad0edc202179bcc3a2e"}, - {file = "coverage-7.5.4-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5013ed890dc917cef2c9f765c4c6a8ae9df983cd60dbb635df8ed9f4ebc9f555"}, - {file = "coverage-7.5.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1014fbf665fef86cdfd6cb5b7371496ce35e4d2a00cda501cf9f5b9e6fced69f"}, - {file = "coverage-7.5.4-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3684bc2ff328f935981847082ba4fdc950d58906a40eafa93510d1b54c08a66c"}, - {file = "coverage-7.5.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:581ea96f92bf71a5ec0974001f900db495488434a6928a2ca7f01eee20c23805"}, - {file = "coverage-7.5.4-cp312-cp312-win32.whl", hash = "sha256:73ca8fbc5bc622e54627314c1a6f1dfdd8db69788f3443e752c215f29fa87a0b"}, - {file = "coverage-7.5.4-cp312-cp312-win_amd64.whl", hash = "sha256:cef4649ec906ea7ea5e9e796e68b987f83fa9a718514fe147f538cfeda76d7a7"}, - {file = "coverage-7.5.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cdd31315fc20868c194130de9ee6bfd99755cc9565edff98ecc12585b90be882"}, - {file = "coverage-7.5.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:02ff6e898197cc1e9fa375581382b72498eb2e6d5fc0b53f03e496cfee3fac6d"}, - {file = "coverage-7.5.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d05c16cf4b4c2fc880cb12ba4c9b526e9e5d5bb1d81313d4d732a5b9fe2b9d53"}, - {file = "coverage-7.5.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c5986ee7ea0795a4095ac4d113cbb3448601efca7f158ec7f7087a6c705304e4"}, - {file = "coverage-7.5.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5df54843b88901fdc2f598ac06737f03d71168fd1175728054c8f5a2739ac3e4"}, - {file = "coverage-7.5.4-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:ab73b35e8d109bffbda9a3e91c64e29fe26e03e49addf5b43d85fc426dde11f9"}, - {file = "coverage-7.5.4-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:aea072a941b033813f5e4814541fc265a5c12ed9720daef11ca516aeacd3bd7f"}, - {file = "coverage-7.5.4-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:16852febd96acd953b0d55fc842ce2dac1710f26729b31c80b940b9afcd9896f"}, - {file = "coverage-7.5.4-cp38-cp38-win32.whl", hash = "sha256:8f894208794b164e6bd4bba61fc98bf6b06be4d390cf2daacfa6eca0a6d2bb4f"}, - {file = "coverage-7.5.4-cp38-cp38-win_amd64.whl", hash = "sha256:e2afe743289273209c992075a5a4913e8d007d569a406ffed0bd080ea02b0633"}, - {file = "coverage-7.5.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b95c3a8cb0463ba9f77383d0fa8c9194cf91f64445a63fc26fb2327e1e1eb088"}, - {file = "coverage-7.5.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3d7564cc09dd91b5a6001754a5b3c6ecc4aba6323baf33a12bd751036c998be4"}, - {file = "coverage-7.5.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:44da56a2589b684813f86d07597fdf8a9c6ce77f58976727329272f5a01f99f7"}, - {file = "coverage-7.5.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e16f3d6b491c48c5ae726308e6ab1e18ee830b4cdd6913f2d7f77354b33f91c8"}, - {file = "coverage-7.5.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dbc5958cb471e5a5af41b0ddaea96a37e74ed289535e8deca404811f6cb0bc3d"}, - {file = "coverage-7.5.4-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:a04e990a2a41740b02d6182b498ee9796cf60eefe40cf859b016650147908029"}, - {file = "coverage-7.5.4-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:ddbd2f9713a79e8e7242d7c51f1929611e991d855f414ca9996c20e44a895f7c"}, - {file = "coverage-7.5.4-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:b1ccf5e728ccf83acd313c89f07c22d70d6c375a9c6f339233dcf792094bcbf7"}, - {file = "coverage-7.5.4-cp39-cp39-win32.whl", hash = "sha256:56b4eafa21c6c175b3ede004ca12c653a88b6f922494b023aeb1e836df953ace"}, - {file = "coverage-7.5.4-cp39-cp39-win_amd64.whl", hash = "sha256:65e528e2e921ba8fd67d9055e6b9f9e34b21ebd6768ae1c1723f4ea6ace1234d"}, - {file = "coverage-7.5.4-pp38.pp39.pp310-none-any.whl", hash = "sha256:79b356f3dd5b26f3ad23b35c75dbdaf1f9e2450b6bcefc6d0825ea0aa3f86ca5"}, - {file = "coverage-7.5.4.tar.gz", hash = "sha256:a44963520b069e12789d0faea4e9fdb1e410cdc4aab89d94f7f55cbb7fef0353"}, + {file = "coverage-7.6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:dff044f661f59dace805eedb4a7404c573b6ff0cdba4a524141bc63d7be5c7fd"}, + {file = "coverage-7.6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a8659fd33ee9e6ca03950cfdcdf271d645cf681609153f218826dd9805ab585c"}, + {file = "coverage-7.6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7792f0ab20df8071d669d929c75c97fecfa6bcab82c10ee4adb91c7a54055463"}, + {file = "coverage-7.6.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d4b3cd1ca7cd73d229487fa5caca9e4bc1f0bca96526b922d61053ea751fe791"}, + {file = "coverage-7.6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e7e128f85c0b419907d1f38e616c4f1e9f1d1b37a7949f44df9a73d5da5cd53c"}, + {file = "coverage-7.6.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a94925102c89247530ae1dab7dc02c690942566f22e189cbd53579b0693c0783"}, + {file = "coverage-7.6.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:dcd070b5b585b50e6617e8972f3fbbee786afca71b1936ac06257f7e178f00f6"}, + {file = "coverage-7.6.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d50a252b23b9b4dfeefc1f663c568a221092cbaded20a05a11665d0dbec9b8fb"}, + {file = "coverage-7.6.0-cp310-cp310-win32.whl", hash = "sha256:0e7b27d04131c46e6894f23a4ae186a6a2207209a05df5b6ad4caee6d54a222c"}, + {file = "coverage-7.6.0-cp310-cp310-win_amd64.whl", hash = "sha256:54dece71673b3187c86226c3ca793c5f891f9fc3d8aa183f2e3653da18566169"}, + {file = "coverage-7.6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c7b525ab52ce18c57ae232ba6f7010297a87ced82a2383b1afd238849c1ff933"}, + {file = "coverage-7.6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4bea27c4269234e06f621f3fac3925f56ff34bc14521484b8f66a580aacc2e7d"}, + {file = "coverage-7.6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ed8d1d1821ba5fc88d4a4f45387b65de52382fa3ef1f0115a4f7a20cdfab0e94"}, + {file = "coverage-7.6.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:01c322ef2bbe15057bc4bf132b525b7e3f7206f071799eb8aa6ad1940bcf5fb1"}, + {file = "coverage-7.6.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:03cafe82c1b32b770a29fd6de923625ccac3185a54a5e66606da26d105f37dac"}, + {file = "coverage-7.6.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0d1b923fc4a40c5832be4f35a5dab0e5ff89cddf83bb4174499e02ea089daf57"}, + {file = "coverage-7.6.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4b03741e70fb811d1a9a1d75355cf391f274ed85847f4b78e35459899f57af4d"}, + {file = "coverage-7.6.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a73d18625f6a8a1cbb11eadc1d03929f9510f4131879288e3f7922097a429f63"}, + {file = "coverage-7.6.0-cp311-cp311-win32.whl", hash = "sha256:65fa405b837060db569a61ec368b74688f429b32fa47a8929a7a2f9b47183713"}, + {file = "coverage-7.6.0-cp311-cp311-win_amd64.whl", hash = "sha256:6379688fb4cfa921ae349c76eb1a9ab26b65f32b03d46bb0eed841fd4cb6afb1"}, + {file = "coverage-7.6.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f7db0b6ae1f96ae41afe626095149ecd1b212b424626175a6633c2999eaad45b"}, + {file = "coverage-7.6.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bbdf9a72403110a3bdae77948b8011f644571311c2fb35ee15f0f10a8fc082e8"}, + {file = "coverage-7.6.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cc44bf0315268e253bf563f3560e6c004efe38f76db03a1558274a6e04bf5d5"}, + {file = "coverage-7.6.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:da8549d17489cd52f85a9829d0e1d91059359b3c54a26f28bec2c5d369524807"}, + {file = "coverage-7.6.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0086cd4fc71b7d485ac93ca4239c8f75732c2ae3ba83f6be1c9be59d9e2c6382"}, + {file = "coverage-7.6.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1fad32ee9b27350687035cb5fdf9145bc9cf0a094a9577d43e909948ebcfa27b"}, + {file = "coverage-7.6.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:044a0985a4f25b335882b0966625270a8d9db3d3409ddc49a4eb00b0ef5e8cee"}, + {file = "coverage-7.6.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:76d5f82213aa78098b9b964ea89de4617e70e0d43e97900c2778a50856dac605"}, + {file = "coverage-7.6.0-cp312-cp312-win32.whl", hash = "sha256:3c59105f8d58ce500f348c5b56163a4113a440dad6daa2294b5052a10db866da"}, + {file = "coverage-7.6.0-cp312-cp312-win_amd64.whl", hash = "sha256:ca5d79cfdae420a1d52bf177de4bc2289c321d6c961ae321503b2ca59c17ae67"}, + {file = "coverage-7.6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d39bd10f0ae453554798b125d2f39884290c480f56e8a02ba7a6ed552005243b"}, + {file = "coverage-7.6.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:beb08e8508e53a568811016e59f3234d29c2583f6b6e28572f0954a6b4f7e03d"}, + {file = "coverage-7.6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b2e16f4cd2bc4d88ba30ca2d3bbf2f21f00f382cf4e1ce3b1ddc96c634bc48ca"}, + {file = "coverage-7.6.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6616d1c9bf1e3faea78711ee42a8b972367d82ceae233ec0ac61cc7fec09fa6b"}, + {file = "coverage-7.6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad4567d6c334c46046d1c4c20024de2a1c3abc626817ae21ae3da600f5779b44"}, + {file = "coverage-7.6.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:d17c6a415d68cfe1091d3296ba5749d3d8696e42c37fca5d4860c5bf7b729f03"}, + {file = "coverage-7.6.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:9146579352d7b5f6412735d0f203bbd8d00113a680b66565e205bc605ef81bc6"}, + {file = "coverage-7.6.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:cdab02a0a941af190df8782aafc591ef3ad08824f97850b015c8c6a8b3877b0b"}, + {file = "coverage-7.6.0-cp38-cp38-win32.whl", hash = "sha256:df423f351b162a702c053d5dddc0fc0ef9a9e27ea3f449781ace5f906b664428"}, + {file = "coverage-7.6.0-cp38-cp38-win_amd64.whl", hash = "sha256:f2501d60d7497fd55e391f423f965bbe9e650e9ffc3c627d5f0ac516026000b8"}, + {file = "coverage-7.6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7221f9ac9dad9492cecab6f676b3eaf9185141539d5c9689d13fd6b0d7de840c"}, + {file = "coverage-7.6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ddaaa91bfc4477d2871442bbf30a125e8fe6b05da8a0015507bfbf4718228ab2"}, + {file = "coverage-7.6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c4cbe651f3904e28f3a55d6f371203049034b4ddbce65a54527a3f189ca3b390"}, + {file = "coverage-7.6.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:831b476d79408ab6ccfadaaf199906c833f02fdb32c9ab907b1d4aa0713cfa3b"}, + {file = "coverage-7.6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:46c3d091059ad0b9c59d1034de74a7f36dcfa7f6d3bde782c49deb42438f2450"}, + {file = "coverage-7.6.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:4d5fae0a22dc86259dee66f2cc6c1d3e490c4a1214d7daa2a93d07491c5c04b6"}, + {file = "coverage-7.6.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:07ed352205574aad067482e53dd606926afebcb5590653121063fbf4e2175166"}, + {file = "coverage-7.6.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:49c76cdfa13015c4560702574bad67f0e15ca5a2872c6a125f6327ead2b731dd"}, + {file = "coverage-7.6.0-cp39-cp39-win32.whl", hash = "sha256:482855914928c8175735a2a59c8dc5806cf7d8f032e4820d52e845d1f731dca2"}, + {file = "coverage-7.6.0-cp39-cp39-win_amd64.whl", hash = "sha256:543ef9179bc55edfd895154a51792b01c017c87af0ebaae092720152e19e42ca"}, + {file = "coverage-7.6.0-pp38.pp39.pp310-none-any.whl", hash = "sha256:6fe885135c8a479d3e37a7aae61cbd3a0fb2deccb4dda3c25f92a49189f766d6"}, + {file = "coverage-7.6.0.tar.gz", hash = "sha256:289cc803fa1dc901f84701ac10c9ee873619320f2f9aff38794db4a4a0268d51"}, ] [package.extras] @@ -591,19 +591,19 @@ test-randomorder = ["pytest-randomly"] [[package]] name = "cyclonedx-python-lib" -version = "7.5.0" +version = "7.5.1" description = "Python library for CycloneDX" optional = false python-versions = "<4.0,>=3.8" files = [ - {file = "cyclonedx_python_lib-7.5.0-py3-none-any.whl", hash = "sha256:0bb301bfee57d21a76a1288c3670d5aca9924bbe212d13d09e264dfde8cc7389"}, - {file = "cyclonedx_python_lib-7.5.0.tar.gz", hash = "sha256:28ef507c1a803e39f6932f328ca26f0fd21efbd9539175492b16325e400b4e1a"}, + {file = "cyclonedx_python_lib-7.5.1-py3-none-any.whl", hash = "sha256:9fc2c2e5facfd9530ede1f4525c903d29d91945688c5689b6d5fab46381dcab9"}, + {file = "cyclonedx_python_lib-7.5.1.tar.gz", hash = "sha256:00cfe1e58452698650ae08b8f4389f7b1ec203a3e1c50cbf6ca6d320941dfb3f"}, ] [package.dependencies] license-expression = ">=30,<31" packageurl-python = ">=0.11,<2" -py-serializable = ">=1.0.3,<2" +py-serializable = ">=1.1.0,<2.0.0" sortedcontainers = ">=2.4.0,<3.0.0" [package.extras] @@ -1112,13 +1112,13 @@ lxml = ["lxml"] [[package]] name = "humanize" -version = "4.9.0" +version = "4.10.0" description = "Python humanize utilities" optional = false python-versions = ">=3.8" files = [ - {file = "humanize-4.9.0-py3-none-any.whl", hash = "sha256:ce284a76d5b1377fd8836733b983bfb0b76f1aa1c090de2566fcf008d7f6ab16"}, - {file = "humanize-4.9.0.tar.gz", hash = "sha256:582a265c931c683a7e9b8ed9559089dea7edcf6cc95be39a3cbc2c5d5ac2bcfa"}, + {file = "humanize-4.10.0-py3-none-any.whl", hash = "sha256:39e7ccb96923e732b5c2e27aeaa3b10a8dfeeba3eb965ba7b74a3eb0e30040a6"}, + {file = "humanize-4.10.0.tar.gz", hash = "sha256:06b6eb0293e4b85e8d385397c5868926820db32b9b654b932f57fa41c23c9978"}, ] [package.extras] @@ -1126,13 +1126,13 @@ tests = ["freezegun", "pytest", "pytest-cov"] [[package]] name = "identify" -version = "2.5.36" +version = "2.6.0" description = "File identification library for Python" optional = false python-versions = ">=3.8" files = [ - {file = "identify-2.5.36-py2.py3-none-any.whl", hash = "sha256:37d93f380f4de590500d9dba7db359d0d3da95ffe7f9de1753faa159e71e7dfa"}, - {file = "identify-2.5.36.tar.gz", hash = "sha256:e5e00f54165f9047fbebeb4a560f9acfb8af4c88232be60a488e9b68d122745d"}, + {file = "identify-2.6.0-py2.py3-none-any.whl", hash = "sha256:e79ae4406387a9d300332b5fd366d8994f1525e8414984e1a59e058b2eda2dd0"}, + {file = "identify-2.6.0.tar.gz", hash = "sha256:cb171c685bdc31bcc4c1734698736a7d5b6c8bf2e0c15117f4d469c8640ae5cf"}, ] [package.extras] @@ -1577,13 +1577,13 @@ files = [ [[package]] name = "moto" -version = "5.0.10" +version = "5.0.11" description = "" optional = false python-versions = ">=3.8" files = [ - {file = "moto-5.0.10-py2.py3-none-any.whl", hash = "sha256:9ffae2f64cc8fe95b9a12d63ae7268a7d6bea9993b922905b5abd8197d852cd0"}, - {file = "moto-5.0.10.tar.gz", hash = "sha256:eff37363221c93ea44f95721ae0ddb56f977fe70437a041b6cc641ee90266279"}, + {file = "moto-5.0.11-py2.py3-none-any.whl", hash = "sha256:bdba9bec0afcde9f99b58c5271d6458dbfcda0a0a1e9beaecd808d2591db65ea"}, + {file = "moto-5.0.11.tar.gz", hash = "sha256:606b641f4c6ef69f28a84147d6d6806d052011e7ae7b0fe46ae8858e7a27a0a3"}, ] [package.dependencies] @@ -1697,40 +1697,40 @@ files = [ [[package]] name = "newrelic" -version = "9.11.0" +version = "9.12.0" description = "New Relic Python Agent" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" files = [ - {file = "newrelic-9.11.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:87670d872c3abc36203e10f93d266c8f36ad2bd06fb54e790001a409f9e2f40f"}, - {file = "newrelic-9.11.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:11653fd14f55999c5058b4dde8c721833076c0bd3efe668296725a622e9e7de8"}, - {file = "newrelic-9.11.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:72dd3eb190c62bb54aa59029f0d6ac1420c2050b3aaf88d947fc7f62ec58d97f"}, - {file = "newrelic-9.11.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:02eab15af4a08b870bcfdbc56390ecbb9dcacd144fe77f39a26d1be207bd30f0"}, - {file = "newrelic-9.11.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f477cdda9b998205084b822089b3ee4a8a2d9cd66b6f12487c9f9002566c5cb"}, - {file = "newrelic-9.11.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dcec4173cd0f83420e6f61f92955065f1d460075af5e5bf88a5fea746e3cc180"}, - {file = "newrelic-9.11.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:8664e3b9e6ee0f78806b0cf7c90656a1a86d13232c2e0be18a1b1eb452f3f5d1"}, - {file = "newrelic-9.11.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7f1e473eb0505cb91ab9a4155321eabe13a2f6b93fb3c41d6f10e5486276be60"}, - {file = "newrelic-9.11.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9f95eb366ff714bce32476d256551b853247a72398ec46a89148ef5108509aa8"}, - {file = "newrelic-9.11.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:553674a66ef2c2206852b415b74e3c2fb7ed2b92e9800b68394d577f6aa1133e"}, - {file = "newrelic-9.11.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:21e7b52d5b214bba3534ced166e6ec991117772815020bec38b0571fdcecbaf4"}, - {file = "newrelic-9.11.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:10cb7f7a78c49580602b90f367f3378264e495f2f3706734f88ced7e7ca9b033"}, - {file = "newrelic-9.11.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:34b25d1beaf19825409f3d915a5bafa87b7b9230415821422be1e78e988750b7"}, - {file = "newrelic-9.11.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2b02139458aefba86a4572cb8214f91a942103d24d5502395f64d6d7a4ad3f25"}, - {file = "newrelic-9.11.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:3283885bcf31d9cbf8facb0004508a4eaa652a62471e0b724d26f9738a291979"}, - {file = "newrelic-9.11.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:0d43a0891bf71333f6a6253cf87dea2c9009e22699a2acfd93608125a33b1936"}, - {file = "newrelic-9.11.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b7903ba71ce5a4b2840f6d3c63ecd0fb3a018d2aceb915b48133c13c4a60185f"}, - {file = "newrelic-9.11.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d88fa17a515fb002eb14570800e4bfa69ac87ac27e6e2a96bc2bc9b60c80057a"}, - {file = "newrelic-9.11.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:6ceac1d8f13da38fa1b41c8202a91d3b4345e06adb655deaae0df08911fda56f"}, - {file = "newrelic-9.11.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ffc0d8d490de0f12df70db637481aaadb8a43fb6d71ba8866dc14242aa5edad4"}, - {file = "newrelic-9.11.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f6e1bb0df8ff2b54195baac41fddc0e15ea1bdf1deb6af49153487696355181"}, - {file = "newrelic-9.11.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b5d2d0814e1aa9de5bd55797ff8c426d98200ba46ca14dbca15557d0f17cfb4e"}, - {file = "newrelic-9.11.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b33539345c7cf349b65a176a30ab38e2998b071512a7450f5c5b89ac6c097006"}, - {file = "newrelic-9.11.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:7c073f4c26539d6d74fbf4bac7f5046cac578975fb2cf77b156f802f1b39835e"}, - {file = "newrelic-9.11.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76eb4cc599645a38a459b0002696d9c84844fecb02cf07bc18a4a91f737e438e"}, - {file = "newrelic-9.11.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:35d08587e694f5c517e55fb7119f924c64569d2e7ec4968ef761fc1f7bd1f40c"}, - {file = "newrelic-9.11.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bc5c1b8a51946f64c34fc5fa29ce0221c4927a65c7f4435b3b8adeb29b9812d2"}, - {file = "newrelic-9.11.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:2010ed2793294a7e3c1057ec301d48997ed05dcef114d4c25120ac771f66bac1"}, - {file = "newrelic-9.11.0.tar.gz", hash = "sha256:94369792d61ccf21469c35cf66886c32350a180d8e782c0d28ec66411db29474"}, + {file = "newrelic-9.12.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:c349e3b611e8da446aa8045c92e986d77bcd945903bfa08092b9a7c217036fd9"}, + {file = "newrelic-9.12.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:2c8168a2bd5db45566471306ef962e925ab2c9fa92079c3f5863d4a4585dfcbd"}, + {file = "newrelic-9.12.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:4c73d470a61a9f09a204fd47a4822af0d1e52ccac36a6737f72e0cbb2a22dba6"}, + {file = "newrelic-9.12.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:0a3debb761aca68491f14fb6e5bc0100eeef1ab314073ab4696d55cd906b4bec"}, + {file = "newrelic-9.12.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:51c8c4b3d103db423640fda4d6c6b58c79558097ebd111a62e957408a4cf1c71"}, + {file = "newrelic-9.12.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:923e83e40e30fc7ca0f441bb9c745274f7236869bfbe65da487714bfcd4f46c0"}, + {file = "newrelic-9.12.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:f2bed7bfbcbd0e95b6ad1c82e30098d79678cbc6410fc2f88c439e6786c6640a"}, + {file = "newrelic-9.12.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8b4c343c0cf2a0b59467f9daf0f303d28dad6795dc75bc54582d3198e1d2b4da"}, + {file = "newrelic-9.12.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d93402402a32905950d6e646ec220bdb10a522e896c219941c92e474cfa2cdb"}, + {file = "newrelic-9.12.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a614a1da090cbfbd9f5ab3fcdafc253408d76ffc0a22a73cc16fd5c97b67b97"}, + {file = "newrelic-9.12.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d5040601cedf308faa818cc9fc5c8e48283bdcb4c02a2e1e468e67e037200f83"}, + {file = "newrelic-9.12.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0fff006b6d6eb86a25483a4aed216f98293ec44c29b497c1f18f23f05e059991"}, + {file = "newrelic-9.12.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:43cccc52c3ec9c0aa457d3d14557bb19383dbad1afe018d9063c0a7ffbe29232"}, + {file = "newrelic-9.12.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:df75838fd766252282070a5dcdc78906c4b9e0934280c601815c5eb1cc6ce6ff"}, + {file = "newrelic-9.12.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d8f3f8f8d27a1bafc3c4cc930a762d96119897f1808bccd162597b510e236de9"}, + {file = "newrelic-9.12.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:98d5bd7222dd96b0fc194dd2142827e9b70959527f2480fef61da82857b00cb2"}, + {file = "newrelic-9.12.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f83f8023a12e8b4ec217e59e1a56375ad141a2f7a620df363a688e1f1d3e93b"}, + {file = "newrelic-9.12.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec7a46b5c4e77374a1c01b637fca63c187218c153be075bc806663881c53a03e"}, + {file = "newrelic-9.12.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:12e721c19e78a7e7a1443c327acf133d94b0c12add6ec514235a668656732011"}, + {file = "newrelic-9.12.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:353a11bfa737043309025a0949cb6d7cfd7c7209cdee7abe8af774af8f44586f"}, + {file = "newrelic-9.12.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bae6dfffca34591771bc4b6c493c68c15209d2b4e3d79c46239204014a20e53d"}, + {file = "newrelic-9.12.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:be6315beacb0ac7ac99c24e38b8ef072e3930f4d06970fb2fa84da0a990c3467"}, + {file = "newrelic-9.12.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:4cb87e19a2e522417e2b421b799fe0c20cedf953a1e061fbf50bb21683e2420f"}, + {file = "newrelic-9.12.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:bde6db956d363d8d846d3d0c76d4a4a539c809cebb40e45a53d099a39cdd0ea3"}, + {file = "newrelic-9.12.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e94cacdeb15ddfc0a1f8353d896a1069da1302416b4afbf67a953f0706235be2"}, + {file = "newrelic-9.12.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:434be59492f52c9b8401adada597a5dca037cf003374d5dd461bca1db64d3ca7"}, + {file = "newrelic-9.12.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:16de826ddc4af4cf45fe607aeca7117dd08c948edd41aaf90b86c596a3f0eaac"}, + {file = "newrelic-9.12.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:61253b5cf43787b0c19d00662eb7e60d4c1018c09374e9b0825338e831cad900"}, + {file = "newrelic-9.12.0.tar.gz", hash = "sha256:e8c1ed86f9c2f0954817d4405a4fa1cb09b0cc720b3c702fa2cac1c4fffeaec1"}, ] [package.extras] @@ -1837,13 +1837,13 @@ dev = ["black", "mypy", "pytest"] [[package]] name = "packageurl-python" -version = "0.15.2" +version = "0.15.3" description = "A purl aka. Package URL parser and builder" optional = false python-versions = ">=3.7" files = [ - {file = "packageurl_python-0.15.2-py3-none-any.whl", hash = "sha256:6b81641aeedf0a73377d88a8a640e45a2a0848ffdf5447d24eeef8526c41ac92"}, - {file = "packageurl_python-0.15.2.tar.gz", hash = "sha256:9cd10eeedbc6680728c10a1585c6dd7bbad4ef4b389d80cd0ac223205e9c87df"}, + {file = "packageurl_python-0.15.3-py3-none-any.whl", hash = "sha256:96624702032239e70e61b950e14460a5b5f87ac21fc68f119414047b94f0de27"}, + {file = "packageurl_python-0.15.3.tar.gz", hash = "sha256:82e1150f1fc228e25e7b3be1c641ef96b6a0811526c0b4e4f7882a181e862607"}, ] [package.extras] @@ -1898,24 +1898,24 @@ files = [ [[package]] name = "pip" -version = "24.1.1" +version = "24.1.2" description = "The PyPA recommended tool for installing Python packages." optional = false python-versions = ">=3.8" files = [ - {file = "pip-24.1.1-py3-none-any.whl", hash = "sha256:efca15145a95e95c00608afeab66311d40bfb73bb2266a855befd705e6bb15a0"}, - {file = "pip-24.1.1.tar.gz", hash = "sha256:5aa64f65e1952733ee0a9a9b1f52496ebdb3f3077cc46f80a16d983b58d1180a"}, + {file = "pip-24.1.2-py3-none-any.whl", hash = "sha256:7cd207eed4c60b0f411b444cd1464198fe186671c323b6cd6d433ed80fc9d247"}, + {file = "pip-24.1.2.tar.gz", hash = "sha256:e5458a0b89f2755e0ee8c0c77613fe5273e05f337907874d64f13171a898a7ff"}, ] [[package]] name = "pip-api" -version = "0.0.33" +version = "0.0.34" description = "An unofficial, importable pip API" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "pip-api-0.0.33.tar.gz", hash = "sha256:1c2522ae21efcb034d89cc99f6cf1025293b31c63c29ee98b23f03a85f36bdae"}, - {file = "pip_api-0.0.33-py3-none-any.whl", hash = "sha256:b8d6eb5a87d3a9e112a20a8e9d24a6fc12d4e1c94d7595eeaf74be11ad47276c"}, + {file = "pip_api-0.0.34-py3-none-any.whl", hash = "sha256:8b2d7d7c37f2447373aa2cf8b1f60a2f2b27a84e1e9e0294a3f6ef10eb3ba6bb"}, + {file = "pip_api-0.0.34.tar.gz", hash = "sha256:9b75e958f14c5a2614bae415f2adf7eeb54d50a2cfbe7e24fd4826471bac3625"}, ] [package.dependencies] @@ -2039,13 +2039,13 @@ virtualenv = ">=20.10.0" [[package]] name = "py-serializable" -version = "1.0.3" +version = "1.1.0" description = "Library for serializing and deserializing Python Objects to and from JSON and XML." optional = false python-versions = "<4.0,>=3.8" files = [ - {file = "py_serializable-1.0.3-py3-none-any.whl", hash = "sha256:afba815f465b9fe7ab1c1a56d1aa8880c8a9e67a6e28b7ed62d4696fa369caf8"}, - {file = "py_serializable-1.0.3.tar.gz", hash = "sha256:da3cb4b1f3cc5cc5ebecdd3dadbabd5f65d764357366fa64ee9cbaf0d4b70dcf"}, + {file = "py_serializable-1.1.0-py3-none-any.whl", hash = "sha256:ae7ae4326b0d037b7e710f6e8bb1a97ece4ac2895a1f443a17ffd17f85547d76"}, + {file = "py_serializable-1.1.0.tar.gz", hash = "sha256:3311ab39063b131caca0fb75e2038153682e55576c67f24a2de72d402dccb6e0"}, ] [package.dependencies] @@ -3111,4 +3111,4 @@ files = [ [metadata] lock-version = "2.0" python-versions = "^3.12.2" -content-hash = "997ddb8a6a1e91e60aaf20793dd9a79947c2f34f1640b6dd2e300de3a392ec12" +content-hash = "78cfb6ff10239c4ad8e34c059e01c9ee7603d591c43cb06dd0a1acf8fa51f510" diff --git a/pyproject.toml b/pyproject.toml index cb4ccd40e..06e8ffe35 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -19,7 +19,7 @@ flask-talisman = "*" flask-wtf = "^1.2" govuk-bank-holidays = "^0.14" gunicorn = {version = "==22.0.0", extras = ["eventlet"]} -humanize = "~=4.9" +humanize = "~=4.10" itsdangerous = "~=2.2" jinja2 = "~=3.1" newrelic = "*" @@ -39,8 +39,8 @@ wtforms = "~=3.1" markdown = "^3.5.2" async-timeout = "^4.0.3" bleach = "^6.1.0" -boto3 = "^1.34.139" -botocore = "^1.34.139" +boto3 = "^1.34.143" +botocore = "^1.34.143" cachetools = "^5.3.3" cffi = "^1.16.0" cryptography = "^42.0.8" From 6be474ee7d61d329f813e5b46d7c77dfa4ee33fa Mon Sep 17 00:00:00 2001 From: Kenneth Kehl <@kkehl@flexion.us> Date: Fri, 12 Jul 2024 12:36:56 -0700 Subject: [PATCH 21/58] fix pending on dashboard --- app/main/views/jobs.py | 2 +- poetry.lock | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/app/main/views/jobs.py b/app/main/views/jobs.py index 42a4de090..dddf838a1 100644 --- a/app/main/views/jobs.py +++ b/app/main/views/jobs.py @@ -312,7 +312,7 @@ def get_status_filters(service, message_type, statistics): filters = [ # key, label, option ("requested", "total", "sending,delivered,failed"), - ("pending", "pending", "pending"), + ("pending", "pending", "sending,pending"), ("delivered", "delivered", "delivered"), ("failed", "failed", "failed"), ] diff --git a/poetry.lock b/poetry.lock index ca126af0e..71e030da0 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1681,6 +1681,7 @@ files = [ {file = "msgpack-1.0.8-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5fbb160554e319f7b22ecf530a80a3ff496d38e8e07ae763b9e82fadfe96f273"}, {file = "msgpack-1.0.8-cp39-cp39-win32.whl", hash = "sha256:f9af38a89b6a5c04b7d18c492c8ccf2aee7048aff1ce8437c4683bb5a1df893d"}, {file = "msgpack-1.0.8-cp39-cp39-win_amd64.whl", hash = "sha256:ed59dd52075f8fc91da6053b12e8c89e37aa043f8986efd89e61fae69dc1b011"}, + {file = "msgpack-1.0.8-py3-none-any.whl", hash = "sha256:24f727df1e20b9876fa6e95f840a2a2651e34c0ad147676356f4bf5fbb0206ca"}, {file = "msgpack-1.0.8.tar.gz", hash = "sha256:95c02b0e27e706e48d0e5426d1710ca78e0f0628d6e89d5b5a5b91a5f12274f3"}, ] From 2be7e614580fa34d3290fee63538d15dfcf6eb1a Mon Sep 17 00:00:00 2001 From: Kenneth Kehl <@kkehl@flexion.us> Date: Fri, 12 Jul 2024 13:19:14 -0700 Subject: [PATCH 22/58] code review feedback --- app/notify_client/__init__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/app/notify_client/__init__.py b/app/notify_client/__init__.py index 9324ff7df..384c2ee3d 100644 --- a/app/notify_client/__init__.py +++ b/app/notify_client/__init__.py @@ -62,6 +62,7 @@ class NotifyAdminAPIClient(BaseAPIClient): arg = str(arg) if "get-login-gov-user" in arg or "user/email" in arg or "/activate" in arg: still_signing_in = True + # TODO: Update this once E2E tests are managed by a feature flag or some other main config option. if os.getenv("NOTIFY_E2E_TEST_EMAIL"): # allow end-to-end tests to skip check pass From 18331d0c42b780ada16bb7435386d724a2366adc Mon Sep 17 00:00:00 2001 From: Kenneth Kehl <@kkehl@flexion.us> Date: Fri, 12 Jul 2024 13:34:22 -0700 Subject: [PATCH 23/58] code review feedback --- app/main/views/sign_out.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/app/main/views/sign_out.py b/app/main/views/sign_out.py index 5806dfdd9..82ba5497e 100644 --- a/app/main/views/sign_out.py +++ b/app/main/views/sign_out.py @@ -25,14 +25,10 @@ def _sign_out_at_login_dot_gov(): @main.route("/sign-out", methods=(["GET", "POST"])) def sign_out(): - # An AnonymousUser does not have an id if current_user.is_authenticated: - # TODO This doesn't work yet, due to problems above. current_user.deactivate() - session.clear() - current_user.sign_out() session.permanent = False From 228c4cdf9363bd7445bdb11311cb170ac6e5f257 Mon Sep 17 00:00:00 2001 From: Kenneth Kehl <@kkehl@flexion.us> Date: Mon, 15 Jul 2024 07:26:07 -0700 Subject: [PATCH 24/58] add handling for 90 day email check --- app/notify_client/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/notify_client/__init__.py b/app/notify_client/__init__.py index 384c2ee3d..d6a11b78d 100644 --- a/app/notify_client/__init__.py +++ b/app/notify_client/__init__.py @@ -60,7 +60,7 @@ class NotifyAdminAPIClient(BaseAPIClient): still_signing_in = False for arg in args: arg = str(arg) - if "get-login-gov-user" in arg or "user/email" in arg or "/activate" in arg: + if "get-login-gov-user" in arg or "user/email" in arg or "/activate" or "/email-code" in arg: still_signing_in = True # TODO: Update this once E2E tests are managed by a feature flag or some other main config option. if os.getenv("NOTIFY_E2E_TEST_EMAIL"): From 8489fb9e613d85488cee1d2f6e679115b1848382 Mon Sep 17 00:00:00 2001 From: Kenneth Kehl <@kkehl@flexion.us> Date: Mon, 15 Jul 2024 08:07:18 -0700 Subject: [PATCH 25/58] update flake8-pytest-style-plugin --- poetry.lock | 10 +- pyproject.toml | 2 +- .../views/accounts/test_choose_accounts.py | 2 +- .../test_service_setting_permissions.py | 2 +- .../service_settings/test_service_settings.py | 2 +- tests/app/main/views/test_accept_invite.py | 6 +- tests/app/main/views/test_dashboard.py | 2 +- tests/app/main/views/test_two_factor.py | 2 +- tests/app/models/test_template_list.py | 2 +- tests/app/s3_client/test_s3_logo_client.py | 4 +- tests/app/test_cloudfoundry_config.py | 2 +- tests/app/utils/test_csv.py | 2 +- tests/conftest.py | 402 +++++++++--------- tests/end_to_end/conftest.py | 6 +- .../clients/redis/test_redis_client.py | 8 +- .../clients/redis/test_request_cache.py | 4 +- tests/notifications_utils/conftest.py | 6 +- 17 files changed, 232 insertions(+), 232 deletions(-) diff --git a/poetry.lock b/poetry.lock index 71e030da0..710ea3526 100644 --- a/poetry.lock +++ b/poetry.lock @@ -817,13 +817,13 @@ pycodestyle = "*" [[package]] name = "flake8-pytest-style" -version = "1.7.2" +version = "2.0.0" description = "A flake8 plugin checking common style issues or inconsistencies with pytest-based tests." optional = false -python-versions = ">=3.7.2,<4.0.0" +python-versions = "<4.0.0,>=3.8.1" files = [ - {file = "flake8_pytest_style-1.7.2-py3-none-any.whl", hash = "sha256:f5d2aa3219163a052dd92226589d45fab8ea027a3269922f0c4029f548ea5cd1"}, - {file = "flake8_pytest_style-1.7.2.tar.gz", hash = "sha256:b924197c99b951315949920b0e5547f34900b1844348432e67a44ab191582109"}, + {file = "flake8_pytest_style-2.0.0-py3-none-any.whl", hash = "sha256:abcb9f56f277954014b749e5a0937fae215be01a21852e9d05e7600c3de6aae5"}, + {file = "flake8_pytest_style-2.0.0.tar.gz", hash = "sha256:919c328cacd4bc4f873ea61ab4db0d8f2c32e0db09a3c73ab46b1de497556464"}, ] [package.dependencies] @@ -3112,4 +3112,4 @@ files = [ [metadata] lock-version = "2.0" python-versions = "^3.12.2" -content-hash = "78cfb6ff10239c4ad8e34c059e01c9ee7603d591c43cb06dd0a1acf8fa51f510" +content-hash = "df3fd7d58fb974e467ccac5e6504d0085327770f947ea099ba49e1987b01ad89" diff --git a/pyproject.toml b/pyproject.toml index 06e8ffe35..26ecf2224 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -80,7 +80,7 @@ freezegun = "^1.5.1" flake8 = "^7.1.0" flake8-bugbear = "^24.1.17" flake8-print = "^5.0.0" -flake8-pytest-style = "^1.7.2" +flake8-pytest-style = "^2.0.0" isort = "^5.13.2" jinja2-cli = {version = "==0.8.2", extras = ["yaml"]} moto = "*" diff --git a/tests/app/main/views/accounts/test_choose_accounts.py b/tests/app/main/views/accounts/test_choose_accounts.py index 1ead9dd0d..77e06d6ca 100644 --- a/tests/app/main/views/accounts/test_choose_accounts.py +++ b/tests/app/main/views/accounts/test_choose_accounts.py @@ -67,7 +67,7 @@ SAMPLE_DATA = { } -@pytest.fixture() +@pytest.fixture def mock_get_orgs_and_services(mocker): return mocker.patch( "app.user_api_client.get_organizations_and_services_for_user", diff --git a/tests/app/main/views/service_settings/test_service_setting_permissions.py b/tests/app/main/views/service_settings/test_service_setting_permissions.py index 16240d716..b7c945902 100644 --- a/tests/app/main/views/service_settings/test_service_setting_permissions.py +++ b/tests/app/main/views/service_settings/test_service_setting_permissions.py @@ -7,7 +7,7 @@ from app.main.views.service_settings import PLATFORM_ADMIN_SERVICE_PERMISSIONS from tests.conftest import normalize_spaces -@pytest.fixture() +@pytest.fixture def get_service_settings_page( client_request, platform_admin_user, 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 599491e08..a9895ef99 100644 --- a/tests/app/main/views/service_settings/test_service_settings.py +++ b/tests/app/main/views/service_settings/test_service_settings.py @@ -33,7 +33,7 @@ from tests.conftest import ( FAKE_TEMPLATE_ID = uuid4() -@pytest.fixture() +@pytest.fixture def _mock_get_service_settings_page_common( mock_get_inbound_number_for_service, mock_get_free_sms_fragment_limit, diff --git a/tests/app/main/views/test_accept_invite.py b/tests/app/main/views/test_accept_invite.py index 1fc355abb..01dab9876 100644 --- a/tests/app/main/views/test_accept_invite.py +++ b/tests/app/main/views/test_accept_invite.py @@ -100,19 +100,19 @@ MOCK_JOBS = { } -@pytest.fixture() +@pytest.fixture def _mock_no_users_for_service(mocker): mocker.patch("app.models.user.Users.client_method", return_value=[]) -@pytest.fixture() +@pytest.fixture def mock_get_existing_user_by_email(mocker, api_user_active): return mocker.patch( "app.user_api_client.get_user_by_email", return_value=api_user_active ) -@pytest.fixture() +@pytest.fixture def mock_check_invite_token(mocker, sample_invite): return mocker.patch("app.invite_api_client.check_token", return_value=sample_invite) diff --git a/tests/app/main/views/test_dashboard.py b/tests/app/main/views/test_dashboard.py index 475d7514e..d2e543f6a 100644 --- a/tests/app/main/views/test_dashboard.py +++ b/tests/app/main/views/test_dashboard.py @@ -1882,7 +1882,7 @@ def test_service_dashboard_shows_batched_jobs( assert len(rows) == 1 -@pytest.fixture() +@pytest.fixture def app_with_socketio(): app = Flask("app") create_app(app) diff --git a/tests/app/main/views/test_two_factor.py b/tests/app/main/views/test_two_factor.py index d1f38d1ab..27e1ce33f 100644 --- a/tests/app/main/views/test_two_factor.py +++ b/tests/app/main/views/test_two_factor.py @@ -9,7 +9,7 @@ from tests.conftest import ( ) -@pytest.fixture() +@pytest.fixture def mock_email_validated_recently(mocker): return mocker.patch( "app.main.views.two_factor.email_needs_revalidating", return_value=False diff --git a/tests/app/models/test_template_list.py b/tests/app/models/test_template_list.py index 1a620809d..874d4fc9b 100644 --- a/tests/app/models/test_template_list.py +++ b/tests/app/models/test_template_list.py @@ -12,7 +12,7 @@ VIS_PARENT_FOLDER_ID = "bbbb222b-2b22-2b22-222b-b222b22b2222" INV_CHILD_2_FOLDER_ID = "fafe723f-1d39-4a10-865f-e551e03d8886" -@pytest.fixture() +@pytest.fixture def _mock_get_hierarchy_of_folders( mock_get_template_folders, active_user_with_permissions ): diff --git a/tests/app/s3_client/test_s3_logo_client.py b/tests/app/s3_client/test_s3_logo_client.py index 92ce34c37..dc6e419e2 100644 --- a/tests/app/s3_client/test_s3_logo_client.py +++ b/tests/app/s3_client/test_s3_logo_client.py @@ -19,14 +19,14 @@ svg_filename = "test.svg" upload_id = "test_uuid" -@pytest.fixture() +@pytest.fixture def upload_filename(fake_uuid): return EMAIL_LOGO_LOCATION_STRUCTURE.format( temp=TEMP_TAG.format(user_id=fake_uuid), unique_id=upload_id, filename=filename ) -@pytest.fixture() +@pytest.fixture def bucket_credentials(notify_admin): return notify_admin.config["LOGO_UPLOAD_BUCKET"] diff --git a/tests/app/test_cloudfoundry_config.py b/tests/app/test_cloudfoundry_config.py index 6eea0dd95..433f2c73e 100644 --- a/tests/app/test_cloudfoundry_config.py +++ b/tests/app/test_cloudfoundry_config.py @@ -13,7 +13,7 @@ bucket_credentials = { } -@pytest.fixture() +@pytest.fixture def vcap_services(): return { "aws-elasticache-redis": [{"credentials": {"uri": "redis://xxx:6379"}}], diff --git a/tests/app/utils/test_csv.py b/tests/app/utils/test_csv.py index a7e77055b..d603fcd0e 100644 --- a/tests/app/utils/test_csv.py +++ b/tests/app/utils/test_csv.py @@ -71,7 +71,7 @@ def _get_notifications_csv( return _get -@pytest.fixture() +@pytest.fixture def get_notifications_csv_mock( mocker, api_user_active, diff --git a/tests/conftest.py b/tests/conftest.py index 592ec9403..de1ff28a3 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -53,17 +53,17 @@ def notify_admin(): return app -@pytest.fixture() +@pytest.fixture def service_one(api_user_active): return service_json(SERVICE_ONE_ID, "service one", [api_user_active["id"]]) -@pytest.fixture() +@pytest.fixture def service_two(api_user_active): return service_json(SERVICE_TWO_ID, "service two", [api_user_active["id"]]) -@pytest.fixture() +@pytest.fixture def multiple_reply_to_email_addresses(mocker): def _get(service_id): return [ @@ -99,7 +99,7 @@ def multiple_reply_to_email_addresses(mocker): ) -@pytest.fixture() +@pytest.fixture def no_reply_to_email_addresses(mocker): def _get(service_id): return [] @@ -109,7 +109,7 @@ def no_reply_to_email_addresses(mocker): ) -@pytest.fixture() +@pytest.fixture def single_reply_to_email_address(mocker): def _get(service_id): return [ @@ -128,7 +128,7 @@ def single_reply_to_email_address(mocker): ) -@pytest.fixture() +@pytest.fixture def get_default_reply_to_email_address(mocker): def _get(service_id, reply_to_email_id): return { @@ -145,7 +145,7 @@ def get_default_reply_to_email_address(mocker): ) -@pytest.fixture() +@pytest.fixture def get_non_default_reply_to_email_address(mocker): def _get(service_id, reply_to_email_id): return { @@ -162,7 +162,7 @@ def get_non_default_reply_to_email_address(mocker): ) -@pytest.fixture() +@pytest.fixture def mock_add_reply_to_email_address(mocker): def _add_reply_to(service_id, email_address, is_default=False): return @@ -172,7 +172,7 @@ def mock_add_reply_to_email_address(mocker): ) -@pytest.fixture() +@pytest.fixture def mock_update_reply_to_email_address(mocker): def _update_reply_to( service_id, reply_to_email_id, email_address=None, active=None, is_default=False @@ -185,7 +185,7 @@ def mock_update_reply_to_email_address(mocker): ) -@pytest.fixture() +@pytest.fixture def multiple_sms_senders(mocker): def _get(service_id): return [ @@ -221,7 +221,7 @@ def multiple_sms_senders(mocker): return mocker.patch("app.service_api_client.get_sms_senders", side_effect=_get) -@pytest.fixture() +@pytest.fixture def multiple_sms_senders_with_diff_default(mocker): def _get(service_id): return [ @@ -257,7 +257,7 @@ def multiple_sms_senders_with_diff_default(mocker): return mocker.patch("app.service_api_client.get_sms_senders", side_effect=_get) -@pytest.fixture() +@pytest.fixture def multiple_sms_senders_no_inbound(mocker): def _get(service_id): return [ @@ -284,7 +284,7 @@ def multiple_sms_senders_no_inbound(mocker): return mocker.patch("app.service_api_client.get_sms_senders", side_effect=_get) -@pytest.fixture() +@pytest.fixture def no_sms_senders(mocker): def _get(service_id): return [] @@ -292,7 +292,7 @@ def no_sms_senders(mocker): return mocker.patch("app.service_api_client.get_sms_senders", side_effect=_get) -@pytest.fixture() +@pytest.fixture def single_sms_sender(mocker): def _get(service_id): return [ @@ -310,7 +310,7 @@ def single_sms_sender(mocker): return mocker.patch("app.service_api_client.get_sms_senders", side_effect=_get) -@pytest.fixture() +@pytest.fixture def get_default_sms_sender(mocker): def _get(service_id, sms_sender_id): return { @@ -326,7 +326,7 @@ def get_default_sms_sender(mocker): return mocker.patch("app.service_api_client.get_sms_sender", side_effect=_get) -@pytest.fixture() +@pytest.fixture def get_non_default_sms_sender(mocker): def _get(service_id, sms_sender_id): return { @@ -342,7 +342,7 @@ def get_non_default_sms_sender(mocker): return mocker.patch("app.service_api_client.get_sms_sender", side_effect=_get) -@pytest.fixture() +@pytest.fixture def mock_add_sms_sender(mocker): def _add_sms_sender( service_id, sms_sender, is_default=False, inbound_number_id=None @@ -354,7 +354,7 @@ def mock_add_sms_sender(mocker): ) -@pytest.fixture() +@pytest.fixture def mock_update_sms_sender(mocker): def _update_sms_sender( service_id, sms_sender_id, sms_sender=None, active=None, is_default=False @@ -366,7 +366,7 @@ def mock_update_sms_sender(mocker): ) -@pytest.fixture() +@pytest.fixture def multiple_available_inbound_numbers(mocker): def _get(): return { @@ -406,7 +406,7 @@ def multiple_available_inbound_numbers(mocker): ) -@pytest.fixture() +@pytest.fixture def no_available_inbound_numbers(mocker): def _get(): return {"data": []} @@ -416,12 +416,12 @@ def no_available_inbound_numbers(mocker): ) -@pytest.fixture() +@pytest.fixture def fake_uuid(): return sample_uuid() -@pytest.fixture() +@pytest.fixture def mock_get_service(mocker, api_user_active): def _get(service_id): service = service_json( @@ -432,7 +432,7 @@ def mock_get_service(mocker, api_user_active): return mocker.patch("app.service_api_client.get_service", side_effect=_get) -@pytest.fixture() +@pytest.fixture def mock_get_service_statistics(mocker, api_user_active): def _get(service_id, limit_days=None): return { @@ -445,7 +445,7 @@ def mock_get_service_statistics(mocker, api_user_active): ) -@pytest.fixture() +@pytest.fixture def mock_get_detailed_services(mocker, fake_uuid): service_one = service_json( id_=SERVICE_ONE_ID, @@ -476,7 +476,7 @@ def mock_get_detailed_services(mocker, fake_uuid): return mocker.patch("app.service_api_client.get_services", return_value=services) -@pytest.fixture() +@pytest.fixture def mock_get_live_service(mocker, api_user_active): def _get(service_id): service = service_json( @@ -487,7 +487,7 @@ def mock_get_live_service(mocker, api_user_active): return mocker.patch("app.service_api_client.get_service", side_effect=_get) -@pytest.fixture() +@pytest.fixture def mock_create_service(mocker): def _create( service_name, @@ -510,7 +510,7 @@ def mock_create_service(mocker): return mocker.patch("app.service_api_client.create_service", side_effect=_create) -@pytest.fixture() +@pytest.fixture def mock_update_service(mocker): def _update(service_id, **kwargs): service = service_json( @@ -538,7 +538,7 @@ def mock_update_service(mocker): ) -@pytest.fixture() +@pytest.fixture def mock_update_service_raise_httperror_duplicate_name(mocker): def _update(service_id, **kwargs): json_mock = Mock( @@ -563,7 +563,7 @@ TEMPLATE_ONE_ID = "b22d7d94-2197-4a7d-a8e7-fd5f9770bf48" USER_ONE_ID = "7b395b52-c6c1-469c-9d61-54166461c1ab" -@pytest.fixture() +@pytest.fixture def mock_get_services(mocker, active_user_with_permissions): def _get_services(params_dict=None): service_one = service_json( @@ -589,7 +589,7 @@ def mock_get_services(mocker, active_user_with_permissions): ) -@pytest.fixture() +@pytest.fixture def mock_get_services_with_no_services(mocker): def _get_services(params_dict=None): return {"data": []} @@ -599,7 +599,7 @@ def mock_get_services_with_no_services(mocker): ) -@pytest.fixture() +@pytest.fixture def mock_get_services_with_one_service(mocker, api_user_active): def _get_services(params_dict=None): return { @@ -620,7 +620,7 @@ def mock_get_services_with_one_service(mocker, api_user_active): ) -@pytest.fixture() +@pytest.fixture def mock_get_service_template(mocker): def _get(service_id, template_id, version=None): template = template_json( @@ -637,7 +637,7 @@ def mock_get_service_template(mocker): return mocker.patch("app.service_api_client.get_service_template", side_effect=_get) -@pytest.fixture() +@pytest.fixture def mock_get_service_template_with_priority(mocker): def _get(service_id, template_id, version=None): template = template_json( @@ -655,7 +655,7 @@ def mock_get_service_template_with_priority(mocker): return mocker.patch("app.service_api_client.get_service_template", side_effect=_get) -@pytest.fixture() +@pytest.fixture def mock_get_deleted_template(mocker): def _get(service_id, template_id, version=None): template = template_json( @@ -673,7 +673,7 @@ def mock_get_deleted_template(mocker): return mocker.patch("app.service_api_client.get_service_template", side_effect=_get) -@pytest.fixture() +@pytest.fixture def mock_get_template_version(mocker, api_user_active): def _get(service_id, template_id, version): template_version = template_version_json( @@ -684,7 +684,7 @@ def mock_get_template_version(mocker, api_user_active): return mocker.patch("app.service_api_client.get_service_template", side_effect=_get) -@pytest.fixture() +@pytest.fixture def mock_get_template_versions(mocker, api_user_active): def _get(service_id, template_id): template_version = template_version_json( @@ -697,7 +697,7 @@ def mock_get_template_versions(mocker, api_user_active): ) -@pytest.fixture() +@pytest.fixture def mock_get_service_template_with_placeholders(mocker): def _get(service_id, template_id, version=None): template = template_json( @@ -712,7 +712,7 @@ def mock_get_service_template_with_placeholders(mocker): return mocker.patch("app.service_api_client.get_service_template", side_effect=_get) -@pytest.fixture() +@pytest.fixture def mock_get_empty_service_template_with_optional_placeholder(mocker): def _get(service_id, template_id, version=None): template = template_json( @@ -726,7 +726,7 @@ def mock_get_empty_service_template_with_optional_placeholder(mocker): return mocker.patch("app.service_api_client.get_service_template", side_effect=_get) -@pytest.fixture() +@pytest.fixture def mock_get_service_template_with_multiple_placeholders(mocker): def _get(service_id, template_id, version=None): template = template_json( @@ -741,7 +741,7 @@ def mock_get_service_template_with_multiple_placeholders(mocker): return mocker.patch("app.service_api_client.get_service_template", side_effect=_get) -@pytest.fixture() +@pytest.fixture def mock_get_service_template_with_placeholders_same_as_recipient(mocker): def _get(service_id, template_id, version=None): template = template_json( @@ -756,7 +756,7 @@ def mock_get_service_template_with_placeholders_same_as_recipient(mocker): return mocker.patch("app.service_api_client.get_service_template", side_effect=_get) -@pytest.fixture() +@pytest.fixture def mock_get_service_email_template(mocker): def _get(service_id, template_id, version=None): template = template_json( @@ -773,7 +773,7 @@ def mock_get_service_email_template(mocker): return mocker.patch("app.service_api_client.get_service_template", side_effect=_get) -@pytest.fixture() +@pytest.fixture def mock_get_service_email_template_without_placeholders(mocker): def _get(service_id, template_id, version=None): template = template_json( @@ -790,7 +790,7 @@ def mock_get_service_email_template_without_placeholders(mocker): return mocker.patch("app.service_api_client.get_service_template", side_effect=_get) -@pytest.fixture() +@pytest.fixture def mock_create_service_template(mocker, fake_uuid): def _create( name, @@ -811,7 +811,7 @@ def mock_create_service_template(mocker, fake_uuid): ) -@pytest.fixture() +@pytest.fixture def mock_update_service_template(mocker): def _update(id_, name, type_, content, service, subject=None, process_type=None): template = template_json( @@ -824,7 +824,7 @@ def mock_update_service_template(mocker): ) -@pytest.fixture() +@pytest.fixture def mock_create_service_template_content_too_big(mocker): def _create( name, @@ -861,7 +861,7 @@ def mock_create_service_template_content_too_big(mocker): ) -@pytest.fixture() +@pytest.fixture def mock_update_service_template_400_content_too_big(mocker): def _update(id_, name, type_, content, service, subject=None, process_type=None): json_mock = Mock( @@ -925,7 +925,7 @@ def _template(template_type, name, parent=None, template_id=None): } -@pytest.fixture() +@pytest.fixture def mock_get_service_templates(mocker): def _create(service_id): return create_service_templates(service_id) @@ -935,7 +935,7 @@ def mock_get_service_templates(mocker): ) -@pytest.fixture() +@pytest.fixture def mock_get_more_service_templates_than_can_fit_onscreen(mocker): def _create(service_id): return create_service_templates(service_id, number_of_templates=20) @@ -945,7 +945,7 @@ def mock_get_more_service_templates_than_can_fit_onscreen(mocker): ) -@pytest.fixture() +@pytest.fixture def mock_get_service_templates_when_no_templates_exist(mocker): def _create(service_id): return {"data": []} @@ -955,7 +955,7 @@ def mock_get_service_templates_when_no_templates_exist(mocker): ) -@pytest.fixture() +@pytest.fixture def mock_get_service_templates_with_only_one_template(mocker): def _get(service_id): return { @@ -975,7 +975,7 @@ def mock_get_service_templates_with_only_one_template(mocker): ) -@pytest.fixture() +@pytest.fixture def mock_delete_service_template(mocker): def _delete(service_id, template_id): template = template_json( @@ -992,12 +992,12 @@ def mock_delete_service_template(mocker): ) -@pytest.fixture() +@pytest.fixture def mock_redact_template(mocker): return mocker.patch("app.service_api_client.redact_service_template") -@pytest.fixture() +@pytest.fixture def mock_update_service_template_sender(mocker): def _update(service_id, template_id, reply_to): return @@ -1007,12 +1007,12 @@ def mock_update_service_template_sender(mocker): ) -@pytest.fixture() +@pytest.fixture def api_user_pending(fake_uuid): return create_user(id=fake_uuid, state="pending") -@pytest.fixture() +@pytest.fixture def platform_admin_user(fake_uuid): return create_platform_admin_user( permissions={ @@ -1029,7 +1029,7 @@ def platform_admin_user(fake_uuid): ) -@pytest.fixture() +@pytest.fixture def platform_admin_user_no_service_permissions(): """ this fixture is for situations where we want to test that platform admin can access @@ -1038,17 +1038,17 @@ def platform_admin_user_no_service_permissions(): return create_platform_admin_user() -@pytest.fixture() +@pytest.fixture def api_user_active(): return create_api_user_active() -@pytest.fixture() +@pytest.fixture def api_user_active_email_auth(fake_uuid): return create_user(id=fake_uuid, auth_type="email_auth") -@pytest.fixture() +@pytest.fixture def active_user_with_permissions_no_mobile(fake_uuid): return create_service_one_admin( id=fake_uuid, @@ -1056,7 +1056,7 @@ def active_user_with_permissions_no_mobile(fake_uuid): ) -@pytest.fixture() +@pytest.fixture def api_nongov_user_active(fake_uuid): return create_service_one_admin( id=fake_uuid, @@ -1064,17 +1064,17 @@ def api_nongov_user_active(fake_uuid): ) -@pytest.fixture() +@pytest.fixture def active_user_with_permissions(fake_uuid): return create_active_user_with_permissions() -@pytest.fixture() +@pytest.fixture def active_user_empty_permissions(fake_uuid): return create_active_user_empty_permissions() -@pytest.fixture() +@pytest.fixture def active_user_with_permission_to_two_services(fake_uuid): permissions = [ "send_texts", @@ -1097,7 +1097,7 @@ def active_user_with_permission_to_two_services(fake_uuid): ) -@pytest.fixture() +@pytest.fixture def active_user_with_permission_to_other_service( active_user_with_permission_to_two_services, ): @@ -1110,22 +1110,22 @@ def active_user_with_permission_to_other_service( return active_user_with_permission_to_two_services -@pytest.fixture() +@pytest.fixture def active_caseworking_user(): return create_active_caseworking_user() -@pytest.fixture() +@pytest.fixture def active_user_view_permissions(): return create_active_user_view_permissions() -@pytest.fixture() +@pytest.fixture def active_user_no_settings_permission(): return create_active_user_no_settings_permission() -@pytest.fixture() +@pytest.fixture def api_user_locked(fake_uuid): return create_user( id=fake_uuid, @@ -1134,7 +1134,7 @@ def api_user_locked(fake_uuid): ) -@pytest.fixture() +@pytest.fixture def api_user_request_password_reset(fake_uuid): return create_user( id=fake_uuid, @@ -1142,7 +1142,7 @@ def api_user_request_password_reset(fake_uuid): ) -@pytest.fixture() +@pytest.fixture def api_user_changed_password(fake_uuid): return create_user( id=fake_uuid, @@ -1151,12 +1151,12 @@ def api_user_changed_password(fake_uuid): ) -@pytest.fixture() +@pytest.fixture def mock_send_change_email_verification(mocker): return mocker.patch("app.user_api_client.send_change_email_verification") -@pytest.fixture() +@pytest.fixture def mock_register_user(mocker, api_user_pending): def _register(name, email_address, mobile_number, password, auth_type): api_user_pending["name"] = name @@ -1169,7 +1169,7 @@ def mock_register_user(mocker, api_user_pending): return mocker.patch("app.user_api_client.register_user", side_effect=_register) -@pytest.fixture() +@pytest.fixture def mock_get_non_govuser(mocker, api_user_active): api_user_active["email_address"] = "someuser@example.com" @@ -1180,7 +1180,7 @@ def mock_get_non_govuser(mocker, api_user_active): return mocker.patch("app.user_api_client.get_user", side_effect=_get_user) -@pytest.fixture() +@pytest.fixture def mock_get_user(mocker, api_user_active): def _get_user(id_): api_user_active["id"] = id_ @@ -1189,7 +1189,7 @@ def mock_get_user(mocker, api_user_active): return mocker.patch("app.user_api_client.get_user", side_effect=_get_user) -@pytest.fixture() +@pytest.fixture def mock_get_locked_user(mocker, api_user_locked): def _get_user(id_): api_user_locked["id"] = id_ @@ -1198,12 +1198,12 @@ def mock_get_locked_user(mocker, api_user_locked): return mocker.patch("app.user_api_client.get_user", side_effect=_get_user) -@pytest.fixture() +@pytest.fixture def mock_get_user_pending(mocker, api_user_pending): return mocker.patch("app.user_api_client.get_user", return_value=api_user_pending) -@pytest.fixture() +@pytest.fixture def mock_get_user_by_email(mocker, api_user_active): def _get_user(email_address): api_user_active["email_address"] = email_address @@ -1212,7 +1212,7 @@ def mock_get_user_by_email(mocker, api_user_active): return mocker.patch("app.user_api_client.get_user_by_email", side_effect=_get_user) -@pytest.fixture() +@pytest.fixture def mock_dont_get_user_by_email(mocker): def _get_user(email_address): return None @@ -1222,7 +1222,7 @@ def mock_dont_get_user_by_email(mocker): ) -@pytest.fixture() +@pytest.fixture def mock_get_user_by_email_request_password_reset( mocker, api_user_request_password_reset ): @@ -1232,28 +1232,28 @@ def mock_get_user_by_email_request_password_reset( ) -@pytest.fixture() +@pytest.fixture def mock_get_user_by_email_user_changed_password(mocker, api_user_changed_password): return mocker.patch( "app.user_api_client.get_user_by_email", return_value=api_user_changed_password ) -@pytest.fixture() +@pytest.fixture def mock_get_user_by_email_locked(mocker, api_user_locked): return mocker.patch( "app.user_api_client.get_user_by_email", return_value=api_user_locked ) -@pytest.fixture() +@pytest.fixture def mock_get_user_by_email_pending(mocker, api_user_pending): return mocker.patch( "app.user_api_client.get_user_by_email", return_value=api_user_pending ) -@pytest.fixture() +@pytest.fixture def mock_get_user_by_email_not_found(mocker, api_user_active): def _get_user(email): json_mock = Mock(return_value={"message": "Not found", "result": "error"}) @@ -1264,7 +1264,7 @@ def mock_get_user_by_email_not_found(mocker, api_user_active): return mocker.patch("app.user_api_client.get_user_by_email", side_effect=_get_user) -@pytest.fixture() +@pytest.fixture def mock_verify_password(mocker): def _verify_password(user, password): return True @@ -1274,7 +1274,7 @@ def mock_verify_password(mocker): ) -@pytest.fixture() +@pytest.fixture def mock_update_user_password(mocker, api_user_active): def _update(user_id, password): api_user_active["id"] = user_id @@ -1283,7 +1283,7 @@ def mock_update_user_password(mocker, api_user_active): return mocker.patch("app.user_api_client.update_password", side_effect=_update) -@pytest.fixture() +@pytest.fixture def mock_update_user_attribute(mocker, api_user_active): def _update(user_id, **kwargs): api_user_active["id"] = user_id @@ -1294,7 +1294,7 @@ def mock_update_user_attribute(mocker, api_user_active): ) -@pytest.fixture() +@pytest.fixture def mock_activate_user(mocker, api_user_active): def _activate(user_id): api_user_active["id"] = user_id @@ -1303,14 +1303,14 @@ def mock_activate_user(mocker, api_user_active): return mocker.patch("app.user_api_client.activate_user", side_effect=_activate) -@pytest.fixture() +@pytest.fixture def mock_email_is_not_already_in_use(mocker): return mocker.patch( "app.user_api_client.get_user_by_email_or_none", return_value=None ) -@pytest.fixture() +@pytest.fixture def mock_revoke_api_key(mocker): def _revoke(service_id, key_id): return {} @@ -1318,7 +1318,7 @@ def mock_revoke_api_key(mocker): return mocker.patch("app.api_key_api_client.revoke_api_key", side_effect=_revoke) -@pytest.fixture() +@pytest.fixture def mock_get_api_keys(mocker, fake_uuid): def _get_keys(service_id, key_id=None): keys = { @@ -1339,7 +1339,7 @@ def mock_get_api_keys(mocker, fake_uuid): return mocker.patch("app.api_key_api_client.get_api_keys", side_effect=_get_keys) -@pytest.fixture() +@pytest.fixture def mock_get_no_api_keys(mocker): def _get_keys(service_id): keys = {"apiKeys": []} @@ -1348,7 +1348,7 @@ def mock_get_no_api_keys(mocker): return mocker.patch("app.api_key_api_client.get_api_keys", side_effect=_get_keys) -@pytest.fixture() +@pytest.fixture def mock_login(mocker, mock_get_user, mock_update_user_attribute, mock_events): def _verify_code(user_id, code, code_type): return True, "" @@ -1362,17 +1362,17 @@ def mock_login(mocker, mock_get_user, mock_update_user_attribute, mock_events): ) -@pytest.fixture() +@pytest.fixture def mock_send_verify_code(mocker): return mocker.patch("app.user_api_client.send_verify_code") -@pytest.fixture() +@pytest.fixture def mock_send_verify_email(mocker): return mocker.patch("app.user_api_client.send_verify_email") -@pytest.fixture() +@pytest.fixture def mock_check_verify_code(mocker): def _verify(user_id, code, code_type): return True, "" @@ -1380,7 +1380,7 @@ def mock_check_verify_code(mocker): return mocker.patch("app.user_api_client.check_verify_code", side_effect=_verify) -@pytest.fixture() +@pytest.fixture def mock_check_verify_code_code_not_found(mocker): def _verify(user_id, code, code_type): return False, "Code not found" @@ -1388,7 +1388,7 @@ def mock_check_verify_code_code_not_found(mocker): return mocker.patch("app.user_api_client.check_verify_code", side_effect=_verify) -@pytest.fixture() +@pytest.fixture def mock_check_verify_code_code_expired(mocker): def _verify(user_id, code, code_type): return False, "Code has expired" @@ -1396,7 +1396,7 @@ def mock_check_verify_code_code_expired(mocker): return mocker.patch("app.user_api_client.check_verify_code", side_effect=_verify) -@pytest.fixture() +@pytest.fixture def mock_create_job(mocker, api_user_active): def _create( job_id, @@ -1416,7 +1416,7 @@ def mock_create_job(mocker, api_user_active): return mocker.patch("app.job_api_client.create_job", side_effect=_create) -@pytest.fixture() +@pytest.fixture def mock_get_job(mocker, api_user_active): def _get_job(service_id, job_id): return {"data": job_json(service_id, api_user_active, job_id=job_id)} @@ -1424,7 +1424,7 @@ def mock_get_job(mocker, api_user_active): return mocker.patch("app.job_api_client.get_job", side_effect=_get_job) -@pytest.fixture() +@pytest.fixture def mock_get_job_doesnt_exist(mocker): def _get_job(service_id, job_id): raise HTTPError(response=Mock(status_code=404, json={}), message={}) @@ -1432,7 +1432,7 @@ def mock_get_job_doesnt_exist(mocker): return mocker.patch("app.job_api_client.get_job", side_effect=_get_job) -@pytest.fixture() +@pytest.fixture def mock_get_scheduled_job(mocker, api_user_active): def _get_job(service_id, job_id): return { @@ -1448,7 +1448,7 @@ def mock_get_scheduled_job(mocker, api_user_active): return mocker.patch("app.job_api_client.get_job", side_effect=_get_job) -@pytest.fixture() +@pytest.fixture def mock_get_cancelled_job(mocker, api_user_active): def _get_job(service_id, job_id): return { @@ -1464,7 +1464,7 @@ def mock_get_cancelled_job(mocker, api_user_active): return mocker.patch("app.job_api_client.get_job", side_effect=_get_job) -@pytest.fixture() +@pytest.fixture def mock_get_job_in_progress(mocker, api_user_active): def _get_job(service_id, job_id): return { @@ -1481,7 +1481,7 @@ def mock_get_job_in_progress(mocker, api_user_active): return mocker.patch("app.job_api_client.get_job", side_effect=_get_job) -@pytest.fixture() +@pytest.fixture def mock_get_job_with_sending_limits_exceeded(mocker, api_user_active): def _get_job(service_id, job_id): return { @@ -1498,17 +1498,17 @@ def mock_get_job_with_sending_limits_exceeded(mocker, api_user_active): return mocker.patch("app.job_api_client.get_job", side_effect=_get_job) -@pytest.fixture() +@pytest.fixture def mock_has_jobs(mocker): return mocker.patch("app.job_api_client.has_jobs", return_value=True) -@pytest.fixture() +@pytest.fixture def mock_has_no_jobs(mocker): return mocker.patch("app.job_api_client.has_jobs", return_value=False) -@pytest.fixture() +@pytest.fixture def mock_get_jobs(mocker, api_user_active, fake_uuid): def _get_jobs(service_id, limit_days=None, statuses=None, page=1): if statuses is None: @@ -1564,7 +1564,7 @@ def mock_get_jobs(mocker, api_user_active, fake_uuid): return mocker.patch("app.job_api_client.get_jobs", side_effect=_get_jobs) -@pytest.fixture() +@pytest.fixture def mock_get_scheduled_job_stats(mocker, api_user_active): return mocker.patch( "app.job_api_client.get_scheduled_job_stats", @@ -1576,7 +1576,7 @@ def mock_get_scheduled_job_stats(mocker, api_user_active): ) -@pytest.fixture() +@pytest.fixture def mock_get_uploads(mocker, api_user_active): def _get_uploads(service_id, limit_days=None, statuses=None, page=1): uploads = [ @@ -1608,7 +1608,7 @@ def mock_get_uploads(mocker, api_user_active): ) -@pytest.fixture() +@pytest.fixture def _mock_get_no_uploads(mocker, api_user_active): mocker.patch( "app.models.job.PaginatedUploads.client_method", @@ -1618,7 +1618,7 @@ def _mock_get_no_uploads(mocker, api_user_active): ) -@pytest.fixture() +@pytest.fixture def mock_get_no_jobs(mocker, api_user_active): return mocker.patch( "app.models.job.PaginatedJobs.client_method", @@ -1629,7 +1629,7 @@ def mock_get_no_jobs(mocker, api_user_active): ) -@pytest.fixture() +@pytest.fixture def mock_get_notifications( mocker, api_user_active, @@ -1680,7 +1680,7 @@ def mock_get_notifications( ) -@pytest.fixture() +@pytest.fixture def mock_get_notifications_with_previous_next(mocker): def _get_notifications( service_id, @@ -1705,7 +1705,7 @@ def mock_get_notifications_with_previous_next(mocker): ) -@pytest.fixture() +@pytest.fixture def mock_get_notifications_with_no_notifications(mocker): def _get_notifications( service_id, @@ -1728,7 +1728,7 @@ def mock_get_notifications_with_no_notifications(mocker): ) -@pytest.fixture() +@pytest.fixture def mock_get_inbound_sms(mocker): def _get_inbound_sms(service_id, user_number=None, page=1): return inbound_sms_json() @@ -1739,7 +1739,7 @@ def mock_get_inbound_sms(mocker): ) -@pytest.fixture() +@pytest.fixture def mock_get_inbound_sms_by_id_with_no_messages(mocker): def _get_inbound_sms_by_id(service_id, notification_id): raise HTTPError(response=Mock(status_code=404)) @@ -1750,7 +1750,7 @@ def mock_get_inbound_sms_by_id_with_no_messages(mocker): ) -@pytest.fixture() +@pytest.fixture def mock_get_most_recent_inbound_sms(mocker): def _get_most_recent_inbound_sms(service_id, user_number=None, page=1): return inbound_sms_json() @@ -1761,7 +1761,7 @@ def mock_get_most_recent_inbound_sms(mocker): ) -@pytest.fixture() +@pytest.fixture def mock_get_most_recent_inbound_sms_with_no_messages(mocker): def _get_most_recent_inbound_sms(service_id, user_number=None, page=1): return {"has_next": False, "data": []} @@ -1772,7 +1772,7 @@ def mock_get_most_recent_inbound_sms_with_no_messages(mocker): ) -@pytest.fixture() +@pytest.fixture def mock_get_inbound_sms_summary(mocker): def _get_inbound_sms_summary( service_id, @@ -1785,7 +1785,7 @@ def mock_get_inbound_sms_summary(mocker): ) -@pytest.fixture() +@pytest.fixture def mock_get_inbound_sms_summary_with_no_messages(mocker): def _get_inbound_sms_summary( service_id, @@ -1798,7 +1798,7 @@ def mock_get_inbound_sms_summary_with_no_messages(mocker): ) -@pytest.fixture() +@pytest.fixture def mock_get_inbound_number_for_service(mocker): return mocker.patch( "app.inbound_number_client.get_inbound_sms_number_for_service", @@ -1806,7 +1806,7 @@ def mock_get_inbound_number_for_service(mocker): ) -@pytest.fixture() +@pytest.fixture def mock_no_inbound_number_for_service(mocker): return mocker.patch( "app.inbound_number_client.get_inbound_sms_number_for_service", @@ -1814,7 +1814,7 @@ def mock_no_inbound_number_for_service(mocker): ) -@pytest.fixture() +@pytest.fixture def mock_has_permissions(mocker): def _has_permission(*permissions, restrict_admin_usage=False, allow_org_user=False): return True @@ -1824,7 +1824,7 @@ def mock_has_permissions(mocker): ) -@pytest.fixture() +@pytest.fixture def mock_get_users_by_service(mocker): def _get_users_for_service(service_id): return [ @@ -1843,7 +1843,7 @@ def mock_get_users_by_service(mocker): ) -@pytest.fixture() +@pytest.fixture def mock_s3_download(mocker): def _download(service_id, upload_id): return """ @@ -1855,7 +1855,7 @@ def mock_s3_download(mocker): return mocker.patch("app.main.views.send.s3download", side_effect=_download) -@pytest.fixture() +@pytest.fixture def sample_invite(mocker, service_one): id_ = USER_ONE_ID from_user = service_one["users"][0] @@ -1879,7 +1879,7 @@ def sample_invite(mocker, service_one): ) -@pytest.fixture() +@pytest.fixture def encoded_invite_data(): """ This mimics what API does when it encodes invite data in @@ -1898,7 +1898,7 @@ def encoded_invite_data(): return invite_data.decode("utf8") -@pytest.fixture() +@pytest.fixture def expired_invite(service_one): id_ = USER_ONE_ID from_user = service_one["users"][0] @@ -1922,7 +1922,7 @@ def expired_invite(service_one): ) -@pytest.fixture() +@pytest.fixture def mock_create_invite(mocker, sample_invite): def _create_invite( from_user, service_id, email_address, permissions, folder_permissions @@ -1940,7 +1940,7 @@ def mock_create_invite(mocker, sample_invite): ) -@pytest.fixture() +@pytest.fixture def mock_get_invites_for_service(mocker, service_one, sample_invite): def _get_invites(service_id): data = [] @@ -1955,7 +1955,7 @@ def mock_get_invites_for_service(mocker, service_one, sample_invite): ) -@pytest.fixture() +@pytest.fixture def mock_get_invites_without_manage_permission(mocker, service_one, sample_invite): def _get_invites(service_id): return [ @@ -1977,7 +1977,7 @@ def mock_get_invites_without_manage_permission(mocker, service_one, sample_invit ) -@pytest.fixture() +@pytest.fixture def mock_accept_invite(mocker, sample_invite): def _accept(service_id, invite_id): return sample_invite @@ -1985,7 +1985,7 @@ def mock_accept_invite(mocker, sample_invite): return mocker.patch("app.invite_api_client.accept_invite", side_effect=_accept) -@pytest.fixture() +@pytest.fixture def mock_add_user_to_service(mocker, service_one, api_user_active): def _add_user(service_id, user_id, permissions, folder_permissions): return @@ -1995,19 +1995,19 @@ def mock_add_user_to_service(mocker, service_one, api_user_active): ) -@pytest.fixture() +@pytest.fixture def mock_set_user_permissions(mocker): return mocker.patch("app.user_api_client.set_user_permissions", return_value=None) -@pytest.fixture() +@pytest.fixture def mock_remove_user_from_service(mocker): return mocker.patch( "app.service_api_client.remove_user_from_service", return_value=None ) -@pytest.fixture() +@pytest.fixture def mock_get_template_statistics(mocker, service_one, fake_uuid): template = template_json( service_one["id"], @@ -2033,7 +2033,7 @@ def mock_get_template_statistics(mocker, service_one, fake_uuid): ) -@pytest.fixture() +@pytest.fixture def mock_get_monthly_template_usage(mocker, service_one, fake_uuid): def _stats(service_id, year): return [ @@ -2053,7 +2053,7 @@ def mock_get_monthly_template_usage(mocker, service_one, fake_uuid): ) -@pytest.fixture() +@pytest.fixture def mock_get_monthly_notification_stats(mocker, service_one, fake_uuid): def _stats(service_id, year): return { @@ -2076,7 +2076,7 @@ def mock_get_monthly_notification_stats(mocker, service_one, fake_uuid): ) -@pytest.fixture() +@pytest.fixture def mock_get_annual_usage_for_service(mocker, service_one, fake_uuid): def _get_usage(service_id, year=None): return [ @@ -2111,7 +2111,7 @@ def mock_get_annual_usage_for_service(mocker, service_one, fake_uuid): ) -@pytest.fixture() +@pytest.fixture def mock_get_monthly_usage_for_service(mocker): def _get_usage(service_id, year): return [ @@ -2162,7 +2162,7 @@ def mock_get_monthly_usage_for_service(mocker): ) -@pytest.fixture() +@pytest.fixture def mock_get_annual_usage_for_service_in_future(mocker, service_one, fake_uuid): def _get_usage(service_id, year=None): return [ @@ -2189,7 +2189,7 @@ def mock_get_annual_usage_for_service_in_future(mocker, service_one, fake_uuid): ) -@pytest.fixture() +@pytest.fixture def mock_get_monthly_usage_for_service_in_future(mocker): def _get_usage(service_id, year): return [] @@ -2199,7 +2199,7 @@ def mock_get_monthly_usage_for_service_in_future(mocker): ) -@pytest.fixture() +@pytest.fixture def mock_events(mocker): def _create_event(event_type, event_data): return {"some": "data"} @@ -2207,12 +2207,12 @@ def mock_events(mocker): return mocker.patch("app.events_api_client.create_event", side_effect=_create_event) -@pytest.fixture() +@pytest.fixture def mock_send_already_registered_email(mocker): return mocker.patch("app.user_api_client.send_already_registered_email") -@pytest.fixture() +@pytest.fixture def mock_get_guest_list(mocker): def _get_guest_list(service_id): return { @@ -2225,17 +2225,17 @@ def mock_get_guest_list(mocker): ) -@pytest.fixture() +@pytest.fixture def mock_update_guest_list(mocker): return mocker.patch("app.service_api_client.update_guest_list") -@pytest.fixture() +@pytest.fixture def mock_reset_failed_login_count(mocker): return mocker.patch("app.user_api_client.reset_failed_login_count") -@pytest.fixture() +@pytest.fixture def mock_get_notification(mocker): def _get_notification( service_id, @@ -2266,7 +2266,7 @@ def mock_get_notification(mocker): ) -@pytest.fixture() +@pytest.fixture def mock_send_notification(mocker, fake_uuid): def _send_notification( service_id, *, template_id, recipient, personalisation, sender_id @@ -2278,7 +2278,7 @@ def mock_send_notification(mocker, fake_uuid): ) -@pytest.fixture() +@pytest.fixture def client(notify_admin): """ Do not use this fixture directly – use `client_request` instead @@ -2288,7 +2288,7 @@ def client(notify_admin): yield client -@pytest.fixture() +@pytest.fixture def logged_in_client( client, active_user_with_permissions, mocker, service_one, mock_login ): @@ -2299,7 +2299,7 @@ def logged_in_client( return client -@pytest.fixture() +@pytest.fixture def _os_environ(): """ clear os.environ, and restore it after the test runs @@ -2312,7 +2312,7 @@ def _os_environ(): os.environ[k] = v -@pytest.fixture() # noqa (C901 too complex) +@pytest.fixture # noqa (C901 too complex) def client_request(logged_in_client, mocker, service_one): # noqa (C901 too complex) def _get(mocker): return {"count": 0} @@ -2505,7 +2505,7 @@ def normalize_spaces(input): return normalize_spaces(" ".join(item.text for item in input)) -@pytest.fixture() +@pytest.fixture def mock_get_service_data_retention(mocker): data = { "id": str(sample_uuid()), @@ -2521,17 +2521,17 @@ def mock_get_service_data_retention(mocker): ) -@pytest.fixture() +@pytest.fixture def mock_create_service_data_retention(mocker): return mocker.patch("app.service_api_client.create_service_data_retention") -@pytest.fixture() +@pytest.fixture def mock_update_service_data_retention(mocker): return mocker.patch("app.service_api_client.update_service_data_retention") -@pytest.fixture() +@pytest.fixture def mock_get_free_sms_fragment_limit(mocker): sample_limit = 250000 return mocker.patch( @@ -2540,7 +2540,7 @@ def mock_get_free_sms_fragment_limit(mocker): ) -@pytest.fixture() +@pytest.fixture def mock_create_or_update_free_sms_fragment_limit(mocker): sample_limit = 250000 return mocker.patch( @@ -2571,7 +2571,7 @@ def set_config_values(app, dict): app.config[key] = old_values[key] -@pytest.fixture() +@pytest.fixture def valid_token(notify_admin, fake_uuid): return generate_token( json.dumps({"user_id": fake_uuid, "secret_code": "my secret"}), @@ -2580,7 +2580,7 @@ def valid_token(notify_admin, fake_uuid): ) -@pytest.fixture() +@pytest.fixture def mock_get_valid_service_inbound_api(mocker): def _get(service_id, inbound_api_id): return { @@ -2597,7 +2597,7 @@ def mock_get_valid_service_inbound_api(mocker): ) -@pytest.fixture() +@pytest.fixture def mock_get_valid_service_callback_api(mocker): def _get(service_id, callback_api_id): return { @@ -2614,7 +2614,7 @@ def mock_get_valid_service_callback_api(mocker): ) -@pytest.fixture() +@pytest.fixture def mock_get_empty_service_inbound_api(mocker): return mocker.patch( "app.service_api_client.get_service_inbound_api", @@ -2622,7 +2622,7 @@ def mock_get_empty_service_inbound_api(mocker): ) -@pytest.fixture() +@pytest.fixture def mock_get_empty_service_callback_api(mocker): return mocker.patch( "app.service_api_client.get_service_callback_api", @@ -2630,7 +2630,7 @@ def mock_get_empty_service_callback_api(mocker): ) -@pytest.fixture() +@pytest.fixture def mock_create_service_inbound_api(mocker): def _create_service_inbound_api(service_id, url, bearer_token, user_id): return @@ -2641,7 +2641,7 @@ def mock_create_service_inbound_api(mocker): ) -@pytest.fixture() +@pytest.fixture def mock_update_service_inbound_api(mocker): def _update_service_inbound_api( service_id, url, bearer_token, user_id, inbound_api_id @@ -2654,7 +2654,7 @@ def mock_update_service_inbound_api(mocker): ) -@pytest.fixture() +@pytest.fixture def mock_create_service_callback_api(mocker): def _create_service_callback_api(service_id, url, bearer_token, user_id): return @@ -2665,7 +2665,7 @@ def mock_create_service_callback_api(mocker): ) -@pytest.fixture() +@pytest.fixture def mock_update_service_callback_api(mocker): def _update_service_callback_api( service_id, url, bearer_token, user_id, callback_api_id @@ -2678,14 +2678,14 @@ def mock_update_service_callback_api(mocker): ) -@pytest.fixture() +@pytest.fixture def organization_one(api_user_active): return organization_json( ORGANISATION_ID, "organization one", [api_user_active["id"]] ) -@pytest.fixture() +@pytest.fixture def mock_get_organizations(mocker): def _get_organizations(): return [ @@ -2705,7 +2705,7 @@ def mock_get_organizations(mocker): ) -@pytest.fixture() +@pytest.fixture def mock_get_organizations_with_unusual_domains(mocker): def _get_organizations(): return [ @@ -2726,7 +2726,7 @@ def mock_get_organizations_with_unusual_domains(mocker): ) -@pytest.fixture() +@pytest.fixture def mock_get_organization(mocker): def _get_organization(org_id): return organization_json( @@ -2743,7 +2743,7 @@ def mock_get_organization(mocker): ) -@pytest.fixture() +@pytest.fixture def mock_get_organization_by_domain(mocker): def _get_organization_by_domain(domain): return organization_json(ORGANISATION_ID) @@ -2754,7 +2754,7 @@ def mock_get_organization_by_domain(mocker): ) -@pytest.fixture() +@pytest.fixture def mock_get_no_organization_by_domain(mocker): return mocker.patch( "app.organizations_client.get_organization_by_domain", @@ -2762,7 +2762,7 @@ def mock_get_no_organization_by_domain(mocker): ) -@pytest.fixture() +@pytest.fixture def mock_get_service_organization( mocker, mock_get_organization, @@ -2774,7 +2774,7 @@ def mock_get_service_organization( ) -@pytest.fixture() +@pytest.fixture def mock_update_service_organization(mocker): def _update_service_organization(service_id, org_id): return @@ -2805,7 +2805,7 @@ def _get_organization_services(organization_id): ] -@pytest.fixture() +@pytest.fixture def mock_get_organization_services(mocker, api_user_active): return mocker.patch( "app.organizations_client.get_organization_services", @@ -2813,7 +2813,7 @@ def mock_get_organization_services(mocker, api_user_active): ) -@pytest.fixture() +@pytest.fixture def mock_get_users_for_organization(mocker): def _get_users_for_organization(org_id): return [ @@ -2827,7 +2827,7 @@ def mock_get_users_for_organization(mocker): ) -@pytest.fixture() +@pytest.fixture def mock_get_invited_users_for_organization(mocker, sample_org_invite): def _get_invited_invited_users_for_organization(org_id): return [sample_org_invite] @@ -2838,7 +2838,7 @@ def mock_get_invited_users_for_organization(mocker, sample_org_invite): ) -@pytest.fixture() +@pytest.fixture def sample_org_invite(mocker, organization_one): id_ = str(UUID(bytes=b"sample_org_invit", version=4)) invited_by = organization_one["users"][0] @@ -2852,7 +2852,7 @@ def sample_org_invite(mocker, organization_one): ) -@pytest.fixture() +@pytest.fixture def mock_get_invites_for_organization(mocker, sample_org_invite): def _get_org_invites(org_id): data = [] @@ -2868,7 +2868,7 @@ def mock_get_invites_for_organization(mocker, sample_org_invite): ) -@pytest.fixture() +@pytest.fixture def mock_check_org_invite_token(mocker, sample_org_invite): def _check_org_token(token): return sample_org_invite @@ -2878,7 +2878,7 @@ def mock_check_org_invite_token(mocker, sample_org_invite): ) -@pytest.fixture() +@pytest.fixture def mock_check_org_cancelled_invite_token(mocker, sample_org_invite): def _check_org_token(token): sample_org_invite["status"] = "cancelled" @@ -2889,7 +2889,7 @@ def mock_check_org_cancelled_invite_token(mocker, sample_org_invite): ) -@pytest.fixture() +@pytest.fixture def mock_check_org_accepted_invite_token(mocker, sample_org_invite): sample_org_invite["status"] = "accepted" @@ -2901,7 +2901,7 @@ def mock_check_org_accepted_invite_token(mocker, sample_org_invite): ) -@pytest.fixture() +@pytest.fixture def mock_accept_org_invite(mocker, sample_org_invite): def _accept(organization_id, invite_id): return sample_org_invite @@ -2909,7 +2909,7 @@ def mock_accept_org_invite(mocker, sample_org_invite): return mocker.patch("app.org_invite_api_client.accept_invite", side_effect=_accept) -@pytest.fixture() +@pytest.fixture def mock_add_user_to_organization(mocker, organization_one, api_user_active): def _add_user(organization_id, user_id): return api_user_active @@ -2919,7 +2919,7 @@ def mock_add_user_to_organization(mocker, organization_one, api_user_active): ) -@pytest.fixture() +@pytest.fixture def mock_update_organization(mocker): def _update_org(org, **kwargs): return @@ -2929,7 +2929,7 @@ def mock_update_organization(mocker): ) -@pytest.fixture() +@pytest.fixture def mock_get_organizations_and_services_for_user( mocker, organization_one, api_user_active ): @@ -2942,7 +2942,7 @@ def mock_get_organizations_and_services_for_user( ) -@pytest.fixture() +@pytest.fixture def mock_get_non_empty_organizations_and_services_for_user( mocker, organization_one, api_user_active ): @@ -2989,7 +2989,7 @@ def mock_get_non_empty_organizations_and_services_for_user( ) -@pytest.fixture() +@pytest.fixture def mock_get_just_services_for_user(mocker, organization_one, api_user_active): def _make_services(name, trial_mode=False): return [ @@ -3014,7 +3014,7 @@ def mock_get_just_services_for_user(mocker, organization_one, api_user_active): ) -@pytest.fixture() +@pytest.fixture def mock_get_empty_organizations_and_one_service_for_user( mocker, organization_one, api_user_active ): @@ -3036,7 +3036,7 @@ def mock_get_empty_organizations_and_one_service_for_user( ) -@pytest.fixture() +@pytest.fixture def mock_create_event(mocker): """ This should be used whenever your code is calling `flask_login.login_user` @@ -3053,19 +3053,19 @@ def url_for_endpoint_with_token(endpoint, token, next=None): return url_for(endpoint, token=token, next=next) -@pytest.fixture() +@pytest.fixture def mock_get_template_folders(mocker): return mocker.patch( "app.template_folder_api_client.get_template_folders", return_value=[] ) -@pytest.fixture() +@pytest.fixture def mock_move_to_template_folder(mocker): return mocker.patch("app.template_folder_api_client.move_to_folder") -@pytest.fixture() +@pytest.fixture def mock_create_template_folder(mocker): return mocker.patch( "app.template_folder_api_client.create_template_folder", @@ -3073,7 +3073,7 @@ def mock_create_template_folder(mocker): ) -@pytest.fixture() +@pytest.fixture def mock_get_service_and_organization_counts(mocker): return mocker.patch( "app.status_api_client.get_count_of_live_services_and_organizations", @@ -3084,7 +3084,7 @@ def mock_get_service_and_organization_counts(mocker): ) -@pytest.fixture() +@pytest.fixture def mock_get_service_history(mocker): return mocker.patch( "app.service_api_client.get_service_history", @@ -3497,7 +3497,7 @@ def create_template( ) -@pytest.fixture() +@pytest.fixture def mock_get_invited_user_by_id(mocker, sample_invite): def _get(invited_user_id): return sample_invite @@ -3508,7 +3508,7 @@ def mock_get_invited_user_by_id(mocker, sample_invite): ) -@pytest.fixture() +@pytest.fixture def mock_get_invited_org_user_by_id(mocker, sample_org_invite): def _get(invited_org_user_id): return sample_org_invite @@ -3519,19 +3519,19 @@ def mock_get_invited_org_user_by_id(mocker, sample_org_invite): ) -@pytest.fixture() +@pytest.fixture def fake_markdown_file(): input = "#Test" return input -@pytest.fixture() +@pytest.fixture def fake_jinja_template(): input = "{% if True %}True{% endif %}" return input -@pytest.fixture() +@pytest.fixture def fake_soup_template(): input = "

Test

" return input diff --git a/tests/end_to_end/conftest.py b/tests/end_to_end/conftest.py index 30ca363f5..64e48a8fd 100644 --- a/tests/end_to_end/conftest.py +++ b/tests/end_to_end/conftest.py @@ -68,7 +68,7 @@ def login_for_end_to_end_testing(browser): context.storage_state(path=auth_state_path) -@pytest.fixture() +@pytest.fixture def end_to_end_authenticated_context(browser): # Create and load a previously authenticated context for Playwright E2E # tests. @@ -82,13 +82,13 @@ def end_to_end_authenticated_context(browser): return context -@pytest.fixture() +@pytest.fixture def end_to_end_context(browser): context = browser.new_context() return context -@pytest.fixture() +@pytest.fixture def authenticated_page(end_to_end_context): # Open a new page and go to the site. page = end_to_end_context.new_page() diff --git a/tests/notifications_utils/clients/redis/test_redis_client.py b/tests/notifications_utils/clients/redis/test_redis_client.py index ac228849d..909f7685f 100644 --- a/tests/notifications_utils/clients/redis/test_redis_client.py +++ b/tests/notifications_utils/clients/redis/test_redis_client.py @@ -8,17 +8,17 @@ from freezegun import freeze_time from notifications_utils.clients.redis.redis_client import RedisClient, prepare_value -@pytest.fixture() +@pytest.fixture def mocked_redis_pipeline(): return Mock() -@pytest.fixture() +@pytest.fixture def delete_mock(): return Mock(return_value=4) -@pytest.fixture() +@pytest.fixture def mocked_redis_client(app, mocked_redis_pipeline, delete_mock, mocker): app.config["REDIS_ENABLED"] = True @@ -46,7 +46,7 @@ def mocked_redis_client(app, mocked_redis_pipeline, delete_mock, mocker): return redis_client -@pytest.fixture() +@pytest.fixture def failing_redis_client(mocked_redis_client, delete_mock): # nota bene: using KeyError because flake8 thinks Exception # and BaseException are too broad diff --git a/tests/notifications_utils/clients/redis/test_request_cache.py b/tests/notifications_utils/clients/redis/test_request_cache.py index 472d9398b..cab88a827 100644 --- a/tests/notifications_utils/clients/redis/test_request_cache.py +++ b/tests/notifications_utils/clients/redis/test_request_cache.py @@ -4,7 +4,7 @@ from notifications_utils.clients.redis import RequestCache from notifications_utils.clients.redis.redis_client import RedisClient -@pytest.fixture() +@pytest.fixture def mocked_redis_client(app): app.config["REDIS_ENABLED"] = True redis_client = RedisClient() @@ -12,7 +12,7 @@ def mocked_redis_client(app): return redis_client -@pytest.fixture() +@pytest.fixture def cache(mocked_redis_client): return RequestCache(mocked_redis_client) diff --git a/tests/notifications_utils/conftest.py b/tests/notifications_utils/conftest.py index 0b8f3bce8..7150b1486 100644 --- a/tests/notifications_utils/conftest.py +++ b/tests/notifications_utils/conftest.py @@ -9,7 +9,7 @@ class FakeService: id = "1234" -@pytest.fixture() +@pytest.fixture def app(): flask_app = Flask(__name__) ctx = flask_app.app_context() @@ -20,7 +20,7 @@ def app(): ctx.pop() -@pytest.fixture() +@pytest.fixture def celery_app(mocker): app = Flask(__name__) app.config["CELERY"] = {"broker_url": "foo"} @@ -39,7 +39,7 @@ def sample_service(): return FakeService() -@pytest.fixture() +@pytest.fixture def rmock(): with requests_mock.mock() as rmock: yield rmock From b7782923fa7f82509bf1a3c0dc96e4e779d7e52c Mon Sep 17 00:00:00 2001 From: Kenneth Kehl <@kkehl@flexion.us> Date: Mon, 15 Jul 2024 08:34:35 -0700 Subject: [PATCH 26/58] fix --- app/notify_client/__init__.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/app/notify_client/__init__.py b/app/notify_client/__init__.py index d6a11b78d..3bbb35733 100644 --- a/app/notify_client/__init__.py +++ b/app/notify_client/__init__.py @@ -60,7 +60,12 @@ class NotifyAdminAPIClient(BaseAPIClient): still_signing_in = False for arg in args: arg = str(arg) - if "get-login-gov-user" in arg or "user/email" in arg or "/activate" or "/email-code" in arg: + if ( + "get-login-gov-user" in arg + or "user/email" in arg + or "/activate" in arg + or "/email-code" in arg + ): still_signing_in = True # TODO: Update this once E2E tests are managed by a feature flag or some other main config option. if os.getenv("NOTIFY_E2E_TEST_EMAIL"): From 361b936857f9dbebf57a4ebc63c5c652f644fbf0 Mon Sep 17 00:00:00 2001 From: Carlo Costino Date: Tue, 16 Jul 2024 11:32:08 -0400 Subject: [PATCH 27/58] Update Python dependencies - 7/16/24 This changeset updates several Python dependencies that were being picked up by Dependabot. Signed-off-by: Carlo Costino --- poetry.lock | 114 +++++++++++++++++++++++-------------------------- pyproject.toml | 10 ++--- 2 files changed, 59 insertions(+), 65 deletions(-) diff --git a/poetry.lock b/poetry.lock index 71e030da0..b96f87d44 100644 --- a/poetry.lock +++ b/poetry.lock @@ -182,17 +182,17 @@ files = [ [[package]] name = "boto3" -version = "1.34.143" +version = "1.34.144" description = "The AWS SDK for Python" optional = false python-versions = ">=3.8" files = [ - {file = "boto3-1.34.143-py3-none-any.whl", hash = "sha256:0d16832f23e6bd3ae94e35ea8e625529850bfad9baccd426de96ad8f445d8e03"}, - {file = "boto3-1.34.143.tar.gz", hash = "sha256:b590ce80c65149194def43ebf0ea1cf0533945502507837389a8d22e3ecbcf05"}, + {file = "boto3-1.34.144-py3-none-any.whl", hash = "sha256:b8433d481d50b68a0162c0379c0dd4aabfc3d1ad901800beb5b87815997511c1"}, + {file = "boto3-1.34.144.tar.gz", hash = "sha256:2f3e88b10b8fcc5f6100a9d74cd28230edc9d4fa226d99dd40a3ab38ac213673"}, ] [package.dependencies] -botocore = ">=1.34.143,<1.35.0" +botocore = ">=1.34.144,<1.35.0" jmespath = ">=0.7.1,<2.0.0" s3transfer = ">=0.10.0,<0.11.0" @@ -201,13 +201,13 @@ crt = ["botocore[crt] (>=1.21.0,<2.0a0)"] [[package]] name = "botocore" -version = "1.34.143" +version = "1.34.144" description = "Low-level, data-driven core of boto 3." optional = false python-versions = ">=3.8" files = [ - {file = "botocore-1.34.143-py3-none-any.whl", hash = "sha256:094aea179e8aaa1bc957ad49cc27d93b189dd3a1f3075d8b0ca7c445a2a88430"}, - {file = "botocore-1.34.143.tar.gz", hash = "sha256:059f032ec05733a836e04e869c5a15534420102f93116f3bc9a5b759b0651caf"}, + {file = "botocore-1.34.144-py3-none-any.whl", hash = "sha256:a2cf26e1bf10d5917a2285e50257bc44e94a1d16574f282f3274f7a5d8d1f08b"}, + {file = "botocore-1.34.144.tar.gz", hash = "sha256:4215db28d25309d59c99507f1f77df9089e5bebbad35f6e19c7c44ec5383a3e8"}, ] [package.dependencies] @@ -241,13 +241,13 @@ redis = ["redis (>=2.10.5)"] [[package]] name = "cachetools" -version = "5.3.3" +version = "5.4.0" description = "Extensible memoizing collections and decorators" optional = false python-versions = ">=3.7" files = [ - {file = "cachetools-5.3.3-py3-none-any.whl", hash = "sha256:0abad1021d3f8325b2fc1d2e9c8b9c9d57b04c3932657a72465447332c24d945"}, - {file = "cachetools-5.3.3.tar.gz", hash = "sha256:ba29e2dfa0b8b556606f097407ed1aa62080ee108ab0dc5ec9d6a723a007d105"}, + {file = "cachetools-5.4.0-py3-none-any.whl", hash = "sha256:3ae3b49a3d5e28a77a0be2b37dbcb89005058959cb2323858c2657c4a8cab474"}, + {file = "cachetools-5.4.0.tar.gz", hash = "sha256:b8adc2e7c07f105ced7bc56dbb6dfbe7c4a00acce20e2227b3f355be89bc6827"}, ] [[package]] @@ -713,13 +713,13 @@ dev = ["black", "build", "commitizen", "isort", "pip-tools", "pre-commit", "twin [[package]] name = "exceptiongroup" -version = "1.2.1" +version = "1.2.2" description = "Backport of PEP 654 (exception groups)" optional = false python-versions = ">=3.7" files = [ - {file = "exceptiongroup-1.2.1-py3-none-any.whl", hash = "sha256:5258b9ed329c5bbdd31a309f53cbfb0b155341807f6ff7606a1e801a891b29ad"}, - {file = "exceptiongroup-1.2.1.tar.gz", hash = "sha256:a4785e48b045528f5bfe627b6ad554ff32def154f42372786903b7abcfe1aa16"}, + {file = "exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b"}, + {file = "exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc"}, ] [package.extras] @@ -1681,7 +1681,6 @@ files = [ {file = "msgpack-1.0.8-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5fbb160554e319f7b22ecf530a80a3ff496d38e8e07ae763b9e82fadfe96f273"}, {file = "msgpack-1.0.8-cp39-cp39-win32.whl", hash = "sha256:f9af38a89b6a5c04b7d18c492c8ccf2aee7048aff1ce8437c4683bb5a1df893d"}, {file = "msgpack-1.0.8-cp39-cp39-win_amd64.whl", hash = "sha256:ed59dd52075f8fc91da6053b12e8c89e37aa043f8986efd89e61fae69dc1b011"}, - {file = "msgpack-1.0.8-py3-none-any.whl", hash = "sha256:24f727df1e20b9876fa6e95f840a2a2651e34c0ad147676356f4bf5fbb0206ca"}, {file = "msgpack-1.0.8.tar.gz", hash = "sha256:95c02b0e27e706e48d0e5426d1710ca78e0f0628d6e89d5b5a5b91a5f12274f3"}, ] @@ -1838,13 +1837,13 @@ dev = ["black", "mypy", "pytest"] [[package]] name = "packageurl-python" -version = "0.15.3" +version = "0.15.4" description = "A purl aka. Package URL parser and builder" optional = false python-versions = ">=3.7" files = [ - {file = "packageurl_python-0.15.3-py3-none-any.whl", hash = "sha256:96624702032239e70e61b950e14460a5b5f87ac21fc68f119414047b94f0de27"}, - {file = "packageurl_python-0.15.3.tar.gz", hash = "sha256:82e1150f1fc228e25e7b3be1c641ef96b6a0811526c0b4e4f7882a181e862607"}, + {file = "packageurl_python-0.15.4-py3-none-any.whl", hash = "sha256:4c015634c97f634ff88c9e3916361e4442ef22bd9bf702090a78b427c274e397"}, + {file = "packageurl_python-0.15.4.tar.gz", hash = "sha256:9ea4215e2bcd7d2369d0b7857abba7def81f3fa217d7903fc72661c946c75e0f"}, ] [package.extras] @@ -2791,52 +2790,47 @@ crt = ["botocore[crt] (>=1.33.2,<2.0a.0)"] [[package]] name = "shapely" -version = "2.0.4" +version = "2.0.5" description = "Manipulation and analysis of geometric objects" optional = false python-versions = ">=3.7" files = [ - {file = "shapely-2.0.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:011b77153906030b795791f2fdfa2d68f1a8d7e40bce78b029782ade3afe4f2f"}, - {file = "shapely-2.0.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9831816a5d34d5170aa9ed32a64982c3d6f4332e7ecfe62dc97767e163cb0b17"}, - {file = "shapely-2.0.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5c4849916f71dc44e19ed370421518c0d86cf73b26e8656192fcfcda08218fbd"}, - {file = "shapely-2.0.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:841f93a0e31e4c64d62ea570d81c35de0f6cea224568b2430d832967536308e6"}, - {file = "shapely-2.0.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b4431f522b277c79c34b65da128029a9955e4481462cbf7ebec23aab61fc58"}, - {file = "shapely-2.0.4-cp310-cp310-win32.whl", hash = "sha256:92a41d936f7d6743f343be265ace93b7c57f5b231e21b9605716f5a47c2879e7"}, - {file = "shapely-2.0.4-cp310-cp310-win_amd64.whl", hash = "sha256:30982f79f21bb0ff7d7d4a4e531e3fcaa39b778584c2ce81a147f95be1cd58c9"}, - {file = "shapely-2.0.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:de0205cb21ad5ddaef607cda9a3191eadd1e7a62a756ea3a356369675230ac35"}, - {file = "shapely-2.0.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7d56ce3e2a6a556b59a288771cf9d091470116867e578bebced8bfc4147fbfd7"}, - {file = "shapely-2.0.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:58b0ecc505bbe49a99551eea3f2e8a9b3b24b3edd2a4de1ac0dc17bc75c9ec07"}, - {file = "shapely-2.0.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:790a168a808bd00ee42786b8ba883307c0e3684ebb292e0e20009588c426da47"}, - {file = "shapely-2.0.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4310b5494271e18580d61022c0857eb85d30510d88606fa3b8314790df7f367d"}, - {file = "shapely-2.0.4-cp311-cp311-win32.whl", hash = "sha256:63f3a80daf4f867bd80f5c97fbe03314348ac1b3b70fb1c0ad255a69e3749879"}, - {file = "shapely-2.0.4-cp311-cp311-win_amd64.whl", hash = "sha256:c52ed79f683f721b69a10fb9e3d940a468203f5054927215586c5d49a072de8d"}, - {file = "shapely-2.0.4-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:5bbd974193e2cc274312da16b189b38f5f128410f3377721cadb76b1e8ca5328"}, - {file = "shapely-2.0.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:41388321a73ba1a84edd90d86ecc8bfed55e6a1e51882eafb019f45895ec0f65"}, - {file = "shapely-2.0.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0776c92d584f72f1e584d2e43cfc5542c2f3dd19d53f70df0900fda643f4bae6"}, - {file = "shapely-2.0.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c75c98380b1ede1cae9a252c6dc247e6279403fae38c77060a5e6186c95073ac"}, - {file = "shapely-2.0.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c3e700abf4a37b7b8b90532fa6ed5c38a9bfc777098bc9fbae5ec8e618ac8f30"}, - {file = "shapely-2.0.4-cp312-cp312-win32.whl", hash = "sha256:4f2ab0faf8188b9f99e6a273b24b97662194160cc8ca17cf9d1fb6f18d7fb93f"}, - {file = "shapely-2.0.4-cp312-cp312-win_amd64.whl", hash = "sha256:03152442d311a5e85ac73b39680dd64a9892fa42bb08fd83b3bab4fe6999bfa0"}, - {file = "shapely-2.0.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:994c244e004bc3cfbea96257b883c90a86e8cbd76e069718eb4c6b222a56f78b"}, - {file = "shapely-2.0.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:05ffd6491e9e8958b742b0e2e7c346635033d0a5f1a0ea083547fcc854e5d5cf"}, - {file = "shapely-2.0.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2fbdc1140a7d08faa748256438291394967aa54b40009f54e8d9825e75ef6113"}, - {file = "shapely-2.0.4-cp37-cp37m-win32.whl", hash = "sha256:5af4cd0d8cf2912bd95f33586600cac9c4b7c5053a036422b97cfe4728d2eb53"}, - {file = "shapely-2.0.4-cp37-cp37m-win_amd64.whl", hash = "sha256:464157509ce4efa5ff285c646a38b49f8c5ef8d4b340f722685b09bb033c5ccf"}, - {file = "shapely-2.0.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:489c19152ec1f0e5c5e525356bcbf7e532f311bff630c9b6bc2db6f04da6a8b9"}, - {file = "shapely-2.0.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b79bbd648664aa6f44ef018474ff958b6b296fed5c2d42db60078de3cffbc8aa"}, - {file = "shapely-2.0.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:674d7baf0015a6037d5758496d550fc1946f34bfc89c1bf247cabdc415d7747e"}, - {file = "shapely-2.0.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6cd4ccecc5ea5abd06deeaab52fcdba372f649728050c6143cc405ee0c166679"}, - {file = "shapely-2.0.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb5cdcbbe3080181498931b52a91a21a781a35dcb859da741c0345c6402bf00c"}, - {file = "shapely-2.0.4-cp38-cp38-win32.whl", hash = "sha256:55a38dcd1cee2f298d8c2ebc60fc7d39f3b4535684a1e9e2f39a80ae88b0cea7"}, - {file = "shapely-2.0.4-cp38-cp38-win_amd64.whl", hash = "sha256:ec555c9d0db12d7fd777ba3f8b75044c73e576c720a851667432fabb7057da6c"}, - {file = "shapely-2.0.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:3f9103abd1678cb1b5f7e8e1af565a652e036844166c91ec031eeb25c5ca8af0"}, - {file = "shapely-2.0.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:263bcf0c24d7a57c80991e64ab57cba7a3906e31d2e21b455f493d4aab534aaa"}, - {file = "shapely-2.0.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ddf4a9bfaac643e62702ed662afc36f6abed2a88a21270e891038f9a19bc08fc"}, - {file = "shapely-2.0.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:485246fcdb93336105c29a5cfbff8a226949db37b7473c89caa26c9bae52a242"}, - {file = "shapely-2.0.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8de4578e838a9409b5b134a18ee820730e507b2d21700c14b71a2b0757396acc"}, - {file = "shapely-2.0.4-cp39-cp39-win32.whl", hash = "sha256:9dab4c98acfb5fb85f5a20548b5c0abe9b163ad3525ee28822ffecb5c40e724c"}, - {file = "shapely-2.0.4-cp39-cp39-win_amd64.whl", hash = "sha256:31c19a668b5a1eadab82ff070b5a260478ac6ddad3a5b62295095174a8d26398"}, - {file = "shapely-2.0.4.tar.gz", hash = "sha256:5dc736127fac70009b8d309a0eeb74f3e08979e530cf7017f2f507ef62e6cfb8"}, + {file = "shapely-2.0.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:89d34787c44f77a7d37d55ae821f3a784fa33592b9d217a45053a93ade899375"}, + {file = "shapely-2.0.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:798090b426142df2c5258779c1d8d5734ec6942f778dab6c6c30cfe7f3bf64ff"}, + {file = "shapely-2.0.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45211276900c4790d6bfc6105cbf1030742da67594ea4161a9ce6812a6721e68"}, + {file = "shapely-2.0.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e119444bc27ca33e786772b81760f2028d930ac55dafe9bc50ef538b794a8e1"}, + {file = "shapely-2.0.5-cp310-cp310-win32.whl", hash = "sha256:9a4492a2b2ccbeaebf181e7310d2dfff4fdd505aef59d6cb0f217607cb042fb3"}, + {file = "shapely-2.0.5-cp310-cp310-win_amd64.whl", hash = "sha256:1e5cb5ee72f1bc7ace737c9ecd30dc174a5295fae412972d3879bac2e82c8fae"}, + {file = "shapely-2.0.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5bbfb048a74cf273db9091ff3155d373020852805a37dfc846ab71dde4be93ec"}, + {file = "shapely-2.0.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:93be600cbe2fbaa86c8eb70656369f2f7104cd231f0d6585c7d0aa555d6878b8"}, + {file = "shapely-2.0.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0f8e71bb9a46814019f6644c4e2560a09d44b80100e46e371578f35eaaa9da1c"}, + {file = "shapely-2.0.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5251c28a29012e92de01d2e84f11637eb1d48184ee8f22e2df6c8c578d26760"}, + {file = "shapely-2.0.5-cp311-cp311-win32.whl", hash = "sha256:35110e80070d664781ec7955c7de557456b25727a0257b354830abb759bf8311"}, + {file = "shapely-2.0.5-cp311-cp311-win_amd64.whl", hash = "sha256:6c6b78c0007a34ce7144f98b7418800e0a6a5d9a762f2244b00ea560525290c9"}, + {file = "shapely-2.0.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:03bd7b5fa5deb44795cc0a503999d10ae9d8a22df54ae8d4a4cd2e8a93466195"}, + {file = "shapely-2.0.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2ff9521991ed9e201c2e923da014e766c1aa04771bc93e6fe97c27dcf0d40ace"}, + {file = "shapely-2.0.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b65365cfbf657604e50d15161ffcc68de5cdb22a601bbf7823540ab4918a98d"}, + {file = "shapely-2.0.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21f64e647a025b61b19585d2247137b3a38a35314ea68c66aaf507a1c03ef6fe"}, + {file = "shapely-2.0.5-cp312-cp312-win32.whl", hash = "sha256:3ac7dc1350700c139c956b03d9c3df49a5b34aaf91d024d1510a09717ea39199"}, + {file = "shapely-2.0.5-cp312-cp312-win_amd64.whl", hash = "sha256:30e8737983c9d954cd17feb49eb169f02f1da49e24e5171122cf2c2b62d65c95"}, + {file = "shapely-2.0.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:ff7731fea5face9ec08a861ed351734a79475631b7540ceb0b66fb9732a5f529"}, + {file = "shapely-2.0.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ff9e520af0c5a578e174bca3c18713cd47a6c6a15b6cf1f50ac17dc8bb8db6a2"}, + {file = "shapely-2.0.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:49b299b91557b04acb75e9732645428470825061f871a2edc36b9417d66c1fc5"}, + {file = "shapely-2.0.5-cp37-cp37m-win32.whl", hash = "sha256:b5870633f8e684bf6d1ae4df527ddcb6f3895f7b12bced5c13266ac04f47d231"}, + {file = "shapely-2.0.5-cp37-cp37m-win_amd64.whl", hash = "sha256:401cb794c5067598f50518e5a997e270cd7642c4992645479b915c503866abed"}, + {file = "shapely-2.0.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e91ee179af539100eb520281ba5394919067c6b51824e6ab132ad4b3b3e76dd0"}, + {file = "shapely-2.0.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:8af6f7260f809c0862741ad08b1b89cb60c130ae30efab62320bbf4ee9cc71fa"}, + {file = "shapely-2.0.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f5456dd522800306ba3faef77c5ba847ec30a0bd73ab087a25e0acdd4db2514f"}, + {file = "shapely-2.0.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b714a840402cde66fd7b663bb08cacb7211fa4412ea2a209688f671e0d0631fd"}, + {file = "shapely-2.0.5-cp38-cp38-win32.whl", hash = "sha256:7e8cf5c252fac1ea51b3162be2ec3faddedc82c256a1160fc0e8ddbec81b06d2"}, + {file = "shapely-2.0.5-cp38-cp38-win_amd64.whl", hash = "sha256:4461509afdb15051e73ab178fae79974387f39c47ab635a7330d7fee02c68a3f"}, + {file = "shapely-2.0.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7545a39c55cad1562be302d74c74586f79e07b592df8ada56b79a209731c0219"}, + {file = "shapely-2.0.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4c83a36f12ec8dee2066946d98d4d841ab6512a6ed7eb742e026a64854019b5f"}, + {file = "shapely-2.0.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89e640c2cd37378480caf2eeda9a51be64201f01f786d127e78eaeff091ec897"}, + {file = "shapely-2.0.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06efe39beafde3a18a21dde169d32f315c57da962826a6d7d22630025200c5e6"}, + {file = "shapely-2.0.5-cp39-cp39-win32.whl", hash = "sha256:8203a8b2d44dcb366becbc8c3d553670320e4acf0616c39e218c9561dd738d92"}, + {file = "shapely-2.0.5-cp39-cp39-win_amd64.whl", hash = "sha256:7fed9dbfbcfec2682d9a047b9699db8dcc890dfca857ecba872c42185fc9e64e"}, + {file = "shapely-2.0.5.tar.gz", hash = "sha256:bff2366bc786bfa6cb353d6b47d0443c570c32776612e527ee47b6df63fcfe32"}, ] [package.dependencies] @@ -3112,4 +3106,4 @@ files = [ [metadata] lock-version = "2.0" python-versions = "^3.12.2" -content-hash = "78cfb6ff10239c4ad8e34c059e01c9ee7603d591c43cb06dd0a1acf8fa51f510" +content-hash = "5e401543af85348b3df85fb128689c492ed4eedd18d705eca209738e7e82d2b9" diff --git a/pyproject.toml b/pyproject.toml index 06e8ffe35..596f06ac7 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -11,7 +11,7 @@ python = "^3.12.2" ago = "~=0.0.95" beautifulsoup4 = "^4.12.3" blinker = "~=1.8" -exceptiongroup = "==1.2.1" +exceptiongroup = "==1.2.2" flask = "~=3.0" flask-basicauth = "~=0.2" flask-login = "^0.6" @@ -39,9 +39,9 @@ wtforms = "~=3.1" markdown = "^3.5.2" async-timeout = "^4.0.3" bleach = "^6.1.0" -boto3 = "^1.34.143" -botocore = "^1.34.143" -cachetools = "^5.3.3" +boto3 = "^1.34.144" +botocore = "^1.34.144" +cachetools = "^5.4.0" cffi = "^1.16.0" cryptography = "^42.0.8" flask-redis = "^0.4.0" @@ -56,7 +56,7 @@ python-json-logger = "^2.0.7" redis = "^5.0.7" regex = "^2024.5.15" s3transfer = "^0.10.2" -shapely = "^2.0.4" +shapely = "^2.0.5" smartypants = "^2.0.1" certifi = "^2024.7.4" charset-normalizer = "^3.3.2" From 5a2ab02da61966f95e4d9fc5f41ea3998c41c54a Mon Sep 17 00:00:00 2001 From: Kenneth Kehl <@kkehl@flexion.us> Date: Tue, 16 Jul 2024 09:57:07 -0700 Subject: [PATCH 28/58] initial --- app/models/user.py | 4 +++- app/notify_client/__init__.py | 14 +++++++++++++- app/templates/new/components/header.html | 13 ++++++++++--- 3 files changed, 26 insertions(+), 5 deletions(-) diff --git a/app/models/user.py b/app/models/user.py index c22fce4b7..9433b1266 100644 --- a/app/models/user.py +++ b/app/models/user.py @@ -227,7 +227,9 @@ class User(JSONModel, UserMixin): if not service_id and not org_id: # we shouldn't have any pages that require permissions, but don't specify a service or organization. # use @user_is_platform_admin for platform admin only pages - raise NotImplementedError + # raise NotImplementedError + print(f"VIEW ARGS ARE {request.view_args}") + pass log_msg = f"has_permissions user: {self.id} service: {service_id}" # platform admins should be able to do most things (except eg send messages, or create api keys) diff --git a/app/notify_client/__init__.py b/app/notify_client/__init__.py index 3bbb35733..46f6732e1 100644 --- a/app/notify_client/__init__.py +++ b/app/notify_client/__init__.py @@ -1,6 +1,6 @@ import os -from flask import abort, has_request_context, request +from flask import abort, current_app, has_request_context, request from flask_login import current_user from notifications_python_client import __version__ from notifications_python_client.base import BaseAPIClient @@ -67,6 +67,17 @@ class NotifyAdminAPIClient(BaseAPIClient): or "/email-code" in arg ): still_signing_in = True + + print(f"HERE IS ARG {arg}") + if arg == (): + print("ARG WAS EMPTY TUPLE") + elif not arg: + print("ARG WAS NOT") + elif len(arg[0]) == 0: + print("arg0 was len 0") + elif str(arg) == "()": + print("string arg was ()") + still_signing_in = True # TODO: Update this once E2E tests are managed by a feature flag or some other main config option. if os.getenv("NOTIFY_E2E_TEST_EMAIL"): # allow end-to-end tests to skip check @@ -75,6 +86,7 @@ class NotifyAdminAPIClient(BaseAPIClient): # we are not full signed in yet pass elif not current_user or not current_user.is_active: + current_app.logger.error(f"WHY FAILING {args}") abort(403) def post(self, *args, **kwargs): diff --git a/app/templates/new/components/header.html b/app/templates/new/components/header.html index cbdc21cf7..3e3d6fef8 100644 --- a/app/templates/new/components/header.html +++ b/app/templates/new/components/header.html @@ -14,10 +14,17 @@ {% endif %} {% if current_service %} - {% set secondaryNavigation = [ - {"href": url_for('main.service_settings', service_id=current_service.id), "text": "Settings", "active": secondary_navigation.is_selected('settings')}, + {% if current_user.has_permissions('manage_service') %} + {% set secondaryNavigation = [ + {"href": url_for('main.service_settings', service_id=current_service.id), "text": "Settings", "active": secondary_navigation.is_selected('settings')}, + {"href": url_for('main.sign_out'), "text": "Sign out"} + ] %} + {% else %} + {% set secondaryNavigation = [ {"href": url_for('main.sign_out'), "text": "Sign out"} - ] %} + ] %} + + {% endif %} {% else %} {% set secondaryNavigation = [{"href": url_for('main.sign_out'), "text": "Sign out"}] %} {% endif %} From 3922593e55c56012a681fe4f7ea7c1c73ec955b2 Mon Sep 17 00:00:00 2001 From: Kenneth Kehl <@kkehl@flexion.us> Date: Tue, 16 Jul 2024 10:10:23 -0700 Subject: [PATCH 29/58] another tweak for session management --- app/notify_client/__init__.py | 4 ++++ poetry.lock | 1 + 2 files changed, 5 insertions(+) diff --git a/app/notify_client/__init__.py b/app/notify_client/__init__.py index 3bbb35733..cedecb3ae 100644 --- a/app/notify_client/__init__.py +++ b/app/notify_client/__init__.py @@ -67,6 +67,10 @@ class NotifyAdminAPIClient(BaseAPIClient): or "/email-code" in arg ): still_signing_in = True + + # This seems to be a weird edge case that happens intermittently with invites + if str(arg) == "()": + still_signing_in = True # TODO: Update this once E2E tests are managed by a feature flag or some other main config option. if os.getenv("NOTIFY_E2E_TEST_EMAIL"): # allow end-to-end tests to skip check diff --git a/poetry.lock b/poetry.lock index b96f87d44..879c2a436 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1681,6 +1681,7 @@ files = [ {file = "msgpack-1.0.8-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5fbb160554e319f7b22ecf530a80a3ff496d38e8e07ae763b9e82fadfe96f273"}, {file = "msgpack-1.0.8-cp39-cp39-win32.whl", hash = "sha256:f9af38a89b6a5c04b7d18c492c8ccf2aee7048aff1ce8437c4683bb5a1df893d"}, {file = "msgpack-1.0.8-cp39-cp39-win_amd64.whl", hash = "sha256:ed59dd52075f8fc91da6053b12e8c89e37aa043f8986efd89e61fae69dc1b011"}, + {file = "msgpack-1.0.8-py3-none-any.whl", hash = "sha256:24f727df1e20b9876fa6e95f840a2a2651e34c0ad147676356f4bf5fbb0206ca"}, {file = "msgpack-1.0.8.tar.gz", hash = "sha256:95c02b0e27e706e48d0e5426d1710ca78e0f0628d6e89d5b5a5b91a5f12274f3"}, ] From bf556eb408e5723789f79cf3d96695de59498ca7 Mon Sep 17 00:00:00 2001 From: Kenneth Kehl <@kkehl@flexion.us> Date: Tue, 16 Jul 2024 13:01:12 -0700 Subject: [PATCH 30/58] make settings button invisible if you don't have permission to manage settings --- app/models/user.py | 10 +++++++--- app/notify_client/__init__.py | 10 +--------- tests/app/main/views/test_dashboard.py | 2 +- tests/app/utils/test_user.py | 22 +++++++++++----------- 4 files changed, 20 insertions(+), 24 deletions(-) diff --git a/app/models/user.py b/app/models/user.py index 9433b1266..3c96fc42c 100644 --- a/app/models/user.py +++ b/app/models/user.py @@ -24,11 +24,15 @@ from app.utils.user_permissions import ( def _get_service_id_from_view_args(): - return str(request.view_args.get("service_id", "")) or None + if request and request.view_args: + return str(request.view_args.get("service_id", "")) + return None def _get_org_id_from_view_args(): - return str(request.view_args.get("org_id", "")) or None + if request and request.view_args: + return str(request.view_args.get("org_id", "")) + return None class User(JSONModel, UserMixin): @@ -228,7 +232,7 @@ class User(JSONModel, UserMixin): # we shouldn't have any pages that require permissions, but don't specify a service or organization. # use @user_is_platform_admin for platform admin only pages # raise NotImplementedError - print(f"VIEW ARGS ARE {request.view_args}") + current_app.logger.warn(f"VIEW ARGS ARE {request.view_args}") pass log_msg = f"has_permissions user: {self.id} service: {service_id}" diff --git a/app/notify_client/__init__.py b/app/notify_client/__init__.py index 46f6732e1..9e8b44461 100644 --- a/app/notify_client/__init__.py +++ b/app/notify_client/__init__.py @@ -68,15 +68,7 @@ class NotifyAdminAPIClient(BaseAPIClient): ): still_signing_in = True - print(f"HERE IS ARG {arg}") - if arg == (): - print("ARG WAS EMPTY TUPLE") - elif not arg: - print("ARG WAS NOT") - elif len(arg[0]) == 0: - print("arg0 was len 0") - elif str(arg) == "()": - print("string arg was ()") + if str(arg) == "()": still_signing_in = True # TODO: Update this once E2E tests are managed by a feature flag or some other main config option. if os.getenv("NOTIFY_E2E_TEST_EMAIL"): diff --git a/tests/app/main/views/test_dashboard.py b/tests/app/main/views/test_dashboard.py index 475d7514e..c51acaafc 100644 --- a/tests/app/main/views/test_dashboard.py +++ b/tests/app/main/views/test_dashboard.py @@ -1225,7 +1225,7 @@ def test_menu_send_messages( mocker, api_user_active, service_one, - ["view_activity", "send_texts", "send_emails"], + ["view_activity", "send_texts", "send_emails", "manage_service"], ) page = str(page) assert ( diff --git a/tests/app/utils/test_user.py b/tests/app/utils/test_user.py index 9d35aa507..0edc28f77 100644 --- a/tests/app/utils/test_user.py +++ b/tests/app/utils/test_user.py @@ -140,20 +140,20 @@ def test_platform_admin_can_see_orgs_they_dont_have( index() -def test_cant_use_decorator_without_view_args( - client_request, - platform_admin_user, -): - client_request.login(platform_admin_user) +# def test_cant_use_decorator_without_view_args( +# client_request, +# platform_admin_user, +# ): +# client_request.login(platform_admin_user) - request.view_args = {} +# request.view_args = {} - @user_has_permissions() - def index(): - pass +# @user_has_permissions() +# def index(): +# pass - with pytest.raises(NotImplementedError): - index() +# with pytest.raises(NotImplementedError): +# index() def test_user_doesnt_have_permissions_for_organization( From f6975724a813f617649f1ef6cee3645f86749d23 Mon Sep 17 00:00:00 2001 From: John Skiles Skinner Date: Tue, 16 Jul 2024 13:55:29 -0700 Subject: [PATCH 31/58] Specify working version, sadly the oldest version --- terraform/bootstrap/main.tf | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/terraform/bootstrap/main.tf b/terraform/bootstrap/main.tf index 241cd1ed6..562410e27 100644 --- a/terraform/bootstrap/main.tf +++ b/terraform/bootstrap/main.tf @@ -4,7 +4,7 @@ locals { } module "s3" { - source = "github.com/18f/terraform-cloudgov//s3" + source = "github.com/18f/terraform-cloudgov//s3?ref=v0.1.0" cf_api_url = local.cf_api_url cf_user = var.cf_user @@ -18,7 +18,3 @@ resource "cloudfoundry_service_key" "bucket_creds" { name = "${local.s3_service_name}-access" service_instance = module.s3.bucket_id } - -output "bucket_credentials" { - value = cloudfoundry_service_key.bucket_creds.credentials -} From 084eb318ff8e3798cc85f49009448c304b0a126a Mon Sep 17 00:00:00 2001 From: alexjanousekGSA Date: Tue, 16 Jul 2024 15:11:25 -0600 Subject: [PATCH 32/58] Added specific version of terrafor-cloudgov module --- terraform/bootstrap/main.tf | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/terraform/bootstrap/main.tf b/terraform/bootstrap/main.tf index 241cd1ed6..562410e27 100644 --- a/terraform/bootstrap/main.tf +++ b/terraform/bootstrap/main.tf @@ -4,7 +4,7 @@ locals { } module "s3" { - source = "github.com/18f/terraform-cloudgov//s3" + source = "github.com/18f/terraform-cloudgov//s3?ref=v0.1.0" cf_api_url = local.cf_api_url cf_user = var.cf_user @@ -18,7 +18,3 @@ resource "cloudfoundry_service_key" "bucket_creds" { name = "${local.s3_service_name}-access" service_instance = module.s3.bucket_id } - -output "bucket_credentials" { - value = cloudfoundry_service_key.bucket_creds.credentials -} From b34d3c8aa22d0e8962659885c3000d67e3aa606b Mon Sep 17 00:00:00 2001 From: John Skiles Skinner Date: Tue, 16 Jul 2024 14:23:21 -0700 Subject: [PATCH 33/58] Expunge boilerplate instructions, link to updated ones in API repo --- terraform/README.md | 131 +------------------------------------------- 1 file changed, 1 insertion(+), 130 deletions(-) diff --git a/terraform/README.md b/terraform/README.md index 7390e3947..74f181514 100644 --- a/terraform/README.md +++ b/terraform/README.md @@ -1,132 +1,3 @@ # Terraform -This directory holds the terraform modules for maintaining your complete persistent infrastructure. - -Prerequisite: install the `jq` JSON processor: `brew install jq` - -## Initial setup - -1. Manually run the bootstrap module following instructions under `Terraform State Credentials` -1. Setup CI/CD Pipeline to run Terraform - 1. Copy bootstrap credentials to your CI/CD secrets using the instructions in the base README - 1. Create a cloud.gov SpaceDeployer by following the instructions under `SpaceDeployers` - 1. Copy SpaceDeployer credentials to your CI/CD secrets using the instructions in the base README -1. Manually Running Terraform - 1. Follow instructions under `Set up a new environment` to create your infrastructure - -## Terraform State Credentials - -The bootstrap module is used to create an s3 bucket for later terraform runs to store their state in. - -### Bootstrapping the state storage s3 buckets for the first time - -1. `cd bootstrap` -1. Run `terraform init` -1. Run `./run.sh plan` to verify that the changes are what you expect -1. Run `./run.sh apply` to set up the bucket and retrieve credentials -1. Follow instructions under `Use bootstrap credentials` -1. Ensure that `import.sh` includes a line and correct IDs for any resources created -1. Run `./teardown_creds.sh` to remove the space deployer account used to create the s3 bucket - -Notes: -- The `run.sh` commands will move your `cf target` to the `notify-management` space, so make sure to re-target afterwards. -- If you have trouble with `./run.sh plan`, try getting on the GSA VPN. It may be necessary to connect to the cloud.gov API. - -### To make changes to the bootstrap module - -*This should not be necessary in most cases* - -1. Run `terraform init` -1. If you don't have terraform state locally: - 1. run `./import.sh` - 1. optionally run `./run.sh apply` to include the existing outputs in the state file -1. Make your changes -1. Continue from step 2 of the boostrapping instructions - -### Use bootstrap credentials - -1. Run `./run.sh show` if you need to retrieve the credentials -1. Add the following to `~/.aws/credentials` - ``` - [notify-terraform-backend] - aws_access_key_id = - aws_secret_access_key = - ``` -1. Copy `bucket` from `bucket_credentials` output to the backend block of `staging/providers.tf` and `production/providers.tf` - -## SpaceDeployers - -A [SpaceDeployer](https://cloud.gov/docs/services/cloud-gov-service-account/) account is required to run terraform or -deploy the application from the CI/CD pipeline. Create a new account by running: - -`./create_service_account.sh -s -u ` - -## Set up a new environment manually - -The below steps rely on you first configuring access to the Terraform state in s3 as described in [Terraform State Credentials](#terraform-state-credentials). - -1. `cd` to the environment you are working in - -1. Set up a SpaceDeployer - ```bash - # create a space deployer service instance that can log in with just a username and password - # the value of < SPACE_NAME > should be `staging` or `prod` depending on where you are working - # the value for < ACCOUNT_NAME > can be anything, although we recommend - # something that communicates the purpose of the deployer - # for example: circleci-deployer for the credentials CircleCI uses to - # deploy the application or -terraform for credentials to run terraform manually - ./create_service_account.sh -s -u > secrets.auto.tfvars - ``` - - The script will output the `username` (as `cf_user`) and `password` (as `cf_password`) for your ``. Read more in the [cloud.gov service account documentation](https://cloud.gov/docs/services/cloud-gov-service-account/). - - The easiest way to use this script is to redirect the output directly to the `secrets.auto.tfvars` file it needs to be used in - -1. Run terraform from your new environment directory with - ```bash - terraform init - terraform plan - ``` - - If the `terraform init` command fails, you may need to run `terraform init -upgrade` to make sure new module versions are picked up. - -1. Apply changes with `terraform apply`. - -1. Remove the space deployer service instance if it doesn't need to be used again, such as when manually running terraform once. - ```bash - # and have the same values as used above. - ./destroy_service_account.sh -s -u - ``` - -## Structure - -Each environment has its own module, which relies on a shared module for everything except the providers code and environment specific variables and settings. - -``` -- bootstrap/ - |- main.tf - |- providers.tf - |- variables.tf - |- run.sh - |- teardown_creds.sh - |- import.sh -- / - |- main.tf - |- providers.tf - |- secrets.auto.tfvars - |- variables.tf -``` - -In the environment-specific modules: -- `providers.tf` lists the required providers -- `main.tf` calls the shared Terraform code, but this is also a place where you can add any other services, resources, etc, which you would like to set up for that environment -- `variables.tf` lists the variables that will be needed, either to pass through to the child module or for use in this module -- `secrets.auto.tfvars` is a file which contains the information about the service-key and other secrets that should not be shared - -In the bootstrap module: -- `providers.tf` lists the required providers -- `main.tf` sets up s3 bucket to be shared across all environments. It lives in `prod` to communicate that it should not be deleted -- `variables.tf` lists the variables that will be needed. Most values are hard-coded in this module -- `run.sh` Helper script to set up a space deployer and run terraform. The terraform action (`show`/`plan`/`apply`/`destroy`) is passed as an argument -- `teardown_creds.sh` Helper script to remove the space deployer setup as part of `run.sh` -- `import.sh` Helper script to create a new local state file in case terraform changes are needed +The instructions for how to use the Terraform in this repo are the same [as those in the API repo](https://github.com/GSA/notifications-api/tree/main/terraform#terraform). From b60e49ef4a7fea50b4e26fdda4aca75824194d03 Mon Sep 17 00:00:00 2001 From: Kenneth Kehl <@kkehl@flexion.us> Date: Wed, 17 Jul 2024 09:57:25 -0700 Subject: [PATCH 34/58] add github repos to footer --- app/templates/new/components/footer.html | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/app/templates/new/components/footer.html b/app/templates/new/components/footer.html index 45e6525a7..ad3775783 100644 --- a/app/templates/new/components/footer.html +++ b/app/templates/new/components/footer.html @@ -58,6 +58,18 @@ +
+
+ + Notify.gov Admin repo + Notify.gov API repo + +
+
+
From cb46bb1e240a890649517c4d25f2c4ee0817aaac Mon Sep 17 00:00:00 2001 From: Kenneth Kehl <@kkehl@flexion.us> Date: Wed, 17 Jul 2024 12:59:13 -0700 Subject: [PATCH 35/58] add debug for compliance #46 --- app/notify_client/__init__.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/notify_client/__init__.py b/app/notify_client/__init__.py index cedecb3ae..30cfe218e 100644 --- a/app/notify_client/__init__.py +++ b/app/notify_client/__init__.py @@ -1,6 +1,6 @@ import os -from flask import abort, has_request_context, request +from flask import abort, current_app, has_request_context, request from flask_login import current_user from notifications_python_client import __version__ from notifications_python_client.base import BaseAPIClient @@ -79,6 +79,7 @@ class NotifyAdminAPIClient(BaseAPIClient): # we are not full signed in yet pass elif not current_user or not current_user.is_active: + current_app.logger.error(f"Unauthorized URL #notify-compliance-46 {args}") abort(403) def post(self, *args, **kwargs): From 39ee6b677fa3c91309b3c866ddb28a0288e003e5 Mon Sep 17 00:00:00 2001 From: Kenneth Kehl <@kkehl@flexion.us> Date: Wed, 17 Jul 2024 13:35:51 -0700 Subject: [PATCH 36/58] fix /verify/code --- app/notify_client/__init__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/app/notify_client/__init__.py b/app/notify_client/__init__.py index 30cfe218e..f78573090 100644 --- a/app/notify_client/__init__.py +++ b/app/notify_client/__init__.py @@ -65,6 +65,7 @@ class NotifyAdminAPIClient(BaseAPIClient): or "user/email" in arg or "/activate" in arg or "/email-code" in arg + or "/verify/code" in arg ): still_signing_in = True From 5800f9289e352850bc7a64057baf7241ec50d6dd Mon Sep 17 00:00:00 2001 From: John Skiles Skinner Date: Wed, 17 Jul 2024 14:54:37 -0700 Subject: [PATCH 37/58] Delete outdated Redis instance from Sandbox Terraform config --- terraform/sandbox/main.tf | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/terraform/sandbox/main.tf b/terraform/sandbox/main.tf index b831b44d6..54c97bdde 100644 --- a/terraform/sandbox/main.tf +++ b/terraform/sandbox/main.tf @@ -6,16 +6,6 @@ locals { recursive_delete = true } -module "redis" { # default v6.2; delete after v7.0 resource is bound - source = "github.com/18f/terraform-cloudgov//redis?ref=v0.7.1" - - cf_org_name = local.cf_org_name - cf_space_name = local.cf_space_name - name = "${local.app_name}-redis-${local.env}" - recursive_delete = local.recursive_delete - redis_plan_name = "redis-dev" -} - module "redis-v70" { source = "github.com/GSA-TTS/terraform-cloudgov//redis?ref=v1.0.0" From 58dc83d9fd5a8369220b0cc8ab2e4732ef5d5584 Mon Sep 17 00:00:00 2001 From: John Skiles Skinner Date: Wed, 17 Jul 2024 16:35:58 -0700 Subject: [PATCH 38/58] Upgrade terraform-cloudgov version and args in Bootstrap module --- terraform/bootstrap/main.tf | 12 ++++-------- terraform/bootstrap/providers.tf | 2 +- 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/terraform/bootstrap/main.tf b/terraform/bootstrap/main.tf index 562410e27..3693cb0f4 100644 --- a/terraform/bootstrap/main.tf +++ b/terraform/bootstrap/main.tf @@ -1,17 +1,13 @@ locals { - cf_api_url = "https://api.fr.cloud.gov" s3_service_name = "notify-terraform-state" } module "s3" { - source = "github.com/18f/terraform-cloudgov//s3?ref=v0.1.0" + source = "github.com/GSA-TTS/terraform-cloudgov//s3?ref=v1.0.0" - cf_api_url = local.cf_api_url - cf_user = var.cf_user - cf_password = var.cf_password - cf_org_name = "gsa-tts-benefits-studio" - cf_space_name = "notify-management" - s3_service_name = local.s3_service_name + cf_org_name = "gsa-tts-benefits-studio" + cf_space_name = "notify-management" + name = local.s3_service_name } resource "cloudfoundry_service_key" "bucket_creds" { diff --git a/terraform/bootstrap/providers.tf b/terraform/bootstrap/providers.tf index cce97ee8f..7b9ce5c7f 100644 --- a/terraform/bootstrap/providers.tf +++ b/terraform/bootstrap/providers.tf @@ -9,7 +9,7 @@ terraform { } provider "cloudfoundry" { - api_url = local.cf_api_url + api_url = "https://api.fr.cloud.gov" user = var.cf_user password = var.cf_password app_logs_max = 30 From c41cb94a5d4218a8a07ee49f7af10702a73cc74a Mon Sep 17 00:00:00 2001 From: John Skiles Skinner Date: Wed, 17 Jul 2024 16:47:30 -0700 Subject: [PATCH 39/58] Add prevent_destroy to env modules --- terraform/demo/main.tf | 7 +++++++ terraform/production/main.tf | 7 +++++++ terraform/sandbox/main.tf | 7 +++++++ terraform/staging/main.tf | 1 - 4 files changed, 21 insertions(+), 1 deletion(-) diff --git a/terraform/demo/main.tf b/terraform/demo/main.tf index 5a38faf17..0b5143d8e 100644 --- a/terraform/demo/main.tf +++ b/terraform/demo/main.tf @@ -6,6 +6,13 @@ locals { recursive_delete = false } +resource "null_resource" "prevent_destroy" { + + lifecycle { + prevent_destroy = true # never destroy demo + } +} + module "redis-v70" { source = "github.com/GSA-TTS/terraform-cloudgov//redis?ref=v1.0.0" diff --git a/terraform/production/main.tf b/terraform/production/main.tf index 433770a55..cb02b9caa 100644 --- a/terraform/production/main.tf +++ b/terraform/production/main.tf @@ -6,6 +6,13 @@ locals { recursive_delete = false } +resource "null_resource" "prevent_destroy" { + + lifecycle { + prevent_destroy = true # never destroy production + } +} + module "redis-v70" { source = "github.com/GSA-TTS/terraform-cloudgov//redis?ref=v1.0.0" diff --git a/terraform/sandbox/main.tf b/terraform/sandbox/main.tf index 54c97bdde..87c95f79f 100644 --- a/terraform/sandbox/main.tf +++ b/terraform/sandbox/main.tf @@ -6,6 +6,13 @@ locals { recursive_delete = true } +resource "null_resource" "prevent_destroy" { + + lifecycle { + prevent_destroy = false # destroying sandbox is allowed + } +} + module "redis-v70" { source = "github.com/GSA-TTS/terraform-cloudgov//redis?ref=v1.0.0" diff --git a/terraform/staging/main.tf b/terraform/staging/main.tf index 338d440e4..1798feda9 100644 --- a/terraform/staging/main.tf +++ b/terraform/staging/main.tf @@ -13,7 +13,6 @@ resource "null_resource" "prevent_destroy" { } } - module "redis-v70" { source = "github.com/GSA-TTS/terraform-cloudgov//redis?ref=v1.0.0" From 24bbf5fa9c010666b9236dbc302cc0cfa8659d41 Mon Sep 17 00:00:00 2001 From: John Skiles Skinner Date: Wed, 17 Jul 2024 16:52:51 -0700 Subject: [PATCH 40/58] Upgrade terraform-cloudgov in 4 env modules, remove recursive_delete --- terraform/demo/main.tf | 4 +--- terraform/production/main.tf | 4 +--- terraform/sandbox/main.tf | 4 +--- terraform/staging/main.tf | 4 +--- 4 files changed, 4 insertions(+), 12 deletions(-) diff --git a/terraform/demo/main.tf b/terraform/demo/main.tf index 0b5143d8e..f32e2d897 100644 --- a/terraform/demo/main.tf +++ b/terraform/demo/main.tf @@ -3,7 +3,6 @@ locals { cf_space_name = "notify-demo" env = "demo" app_name = "notify-admin" - recursive_delete = false } resource "null_resource" "prevent_destroy" { @@ -28,11 +27,10 @@ module "redis-v70" { } module "logo_upload_bucket" { - source = "github.com/18f/terraform-cloudgov//s3?ref=v0.7.1" + source = "github.com/GSA-TTS/terraform-cloudgov//s3?ref=v1.0.0" cf_org_name = local.cf_org_name cf_space_name = local.cf_space_name - recursive_delete = local.recursive_delete name = "${local.app_name}-logo-upload-bucket-${local.env}" } diff --git a/terraform/production/main.tf b/terraform/production/main.tf index cb02b9caa..19d5c8fbd 100644 --- a/terraform/production/main.tf +++ b/terraform/production/main.tf @@ -3,7 +3,6 @@ locals { cf_space_name = "notify-production" env = "production" app_name = "notify-admin" - recursive_delete = false } resource "null_resource" "prevent_destroy" { @@ -28,11 +27,10 @@ module "redis-v70" { } module "logo_upload_bucket" { - source = "github.com/18f/terraform-cloudgov//s3?ref=v0.7.1" + source = "github.com/GSA-TTS/terraform-cloudgov//s3?ref=v1.0.0" cf_org_name = local.cf_org_name cf_space_name = local.cf_space_name - recursive_delete = local.recursive_delete name = "${local.app_name}-logo-upload-bucket-${local.env}" } diff --git a/terraform/sandbox/main.tf b/terraform/sandbox/main.tf index 87c95f79f..074a978d1 100644 --- a/terraform/sandbox/main.tf +++ b/terraform/sandbox/main.tf @@ -3,7 +3,6 @@ locals { cf_space_name = "notify-sandbox" env = "sandbox" app_name = "notify-admin" - recursive_delete = true } resource "null_resource" "prevent_destroy" { @@ -28,11 +27,10 @@ module "redis-v70" { } module "logo_upload_bucket" { - source = "github.com/18f/terraform-cloudgov//s3?ref=v0.7.1" + source = "github.com/GSA-TTS/terraform-cloudgov//s3?ref=v1.0.0" cf_org_name = local.cf_org_name cf_space_name = local.cf_space_name - recursive_delete = local.recursive_delete name = "${local.app_name}-logo-upload-bucket-${local.env}" } diff --git a/terraform/staging/main.tf b/terraform/staging/main.tf index 1798feda9..63c4d8ad1 100644 --- a/terraform/staging/main.tf +++ b/terraform/staging/main.tf @@ -3,7 +3,6 @@ locals { cf_space_name = "notify-staging" env = "staging" app_name = "notify-admin" - recursive_delete = true } resource "null_resource" "prevent_destroy" { @@ -28,11 +27,10 @@ module "redis-v70" { } module "logo_upload_bucket" { - source = "github.com/18f/terraform-cloudgov//s3?ref=v0.7.1" + source = "github.com/GSA-TTS/terraform-cloudgov//s3?ref=v1.0.0" cf_org_name = local.cf_org_name cf_space_name = local.cf_space_name - recursive_delete = local.recursive_delete name = "${local.app_name}-logo-upload-bucket-${local.env}" } From 43818a6df483ea94c9517ce9d45ba5872748137e Mon Sep 17 00:00:00 2001 From: John Skiles Skinner Date: Wed, 17 Jul 2024 17:00:21 -0700 Subject: [PATCH 41/58] Add a note about an upgrade I don't feel good about making just now --- terraform/production/main.tf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/terraform/production/main.tf b/terraform/production/main.tf index 19d5c8fbd..710b32b15 100644 --- a/terraform/production/main.tf +++ b/terraform/production/main.tf @@ -59,7 +59,7 @@ module "api_network_route" { # https://cloud.gov/docs/services/external-domain-service/#how-to-create-an-instance-of-this-service ########################################################################### module "domain" { - source = "github.com/18f/terraform-cloudgov//domain?ref=v0.7.1" + source = "github.com/18f/terraform-cloudgov//domain?ref=v0.7.1" # TODO: upgrade this cf_org_name = local.cf_org_name cf_space_name = local.cf_space_name From aef7ff487ed56bffa9eb7d25b312e3413fc2503b Mon Sep 17 00:00:00 2001 From: John Skiles Skinner Date: Wed, 17 Jul 2024 17:02:56 -0700 Subject: [PATCH 42/58] Add prevent_destory in Bootstrap module --- terraform/bootstrap/main.tf | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/terraform/bootstrap/main.tf b/terraform/bootstrap/main.tf index 3693cb0f4..a518530f1 100644 --- a/terraform/bootstrap/main.tf +++ b/terraform/bootstrap/main.tf @@ -13,4 +13,8 @@ module "s3" { resource "cloudfoundry_service_key" "bucket_creds" { name = "${local.s3_service_name}-access" service_instance = module.s3.bucket_id + + lifecycle { + prevent_destroy = true + } } From b8a62852a6f7d46003558ba48b505a5ca49c1549 Mon Sep 17 00:00:00 2001 From: John Skiles Skinner Date: Wed, 17 Jul 2024 17:35:17 -0700 Subject: [PATCH 43/58] Terraform fmt --- terraform/demo/main.tf | 14 +++++++------- terraform/production/main.tf | 14 +++++++------- terraform/sandbox/main.tf | 14 +++++++------- terraform/staging/main.tf | 14 +++++++------- 4 files changed, 28 insertions(+), 28 deletions(-) diff --git a/terraform/demo/main.tf b/terraform/demo/main.tf index f32e2d897..4223e29e4 100644 --- a/terraform/demo/main.tf +++ b/terraform/demo/main.tf @@ -1,8 +1,8 @@ locals { - cf_org_name = "gsa-tts-benefits-studio" - cf_space_name = "notify-demo" - env = "demo" - app_name = "notify-admin" + cf_org_name = "gsa-tts-benefits-studio" + cf_space_name = "notify-demo" + env = "demo" + app_name = "notify-admin" } resource "null_resource" "prevent_destroy" { @@ -29,9 +29,9 @@ module "redis-v70" { module "logo_upload_bucket" { source = "github.com/GSA-TTS/terraform-cloudgov//s3?ref=v1.0.0" - cf_org_name = local.cf_org_name - cf_space_name = local.cf_space_name - name = "${local.app_name}-logo-upload-bucket-${local.env}" + cf_org_name = local.cf_org_name + cf_space_name = local.cf_space_name + name = "${local.app_name}-logo-upload-bucket-${local.env}" } # ########################################################################## diff --git a/terraform/production/main.tf b/terraform/production/main.tf index 710b32b15..771558ce2 100644 --- a/terraform/production/main.tf +++ b/terraform/production/main.tf @@ -1,8 +1,8 @@ locals { - cf_org_name = "gsa-tts-benefits-studio" - cf_space_name = "notify-production" - env = "production" - app_name = "notify-admin" + cf_org_name = "gsa-tts-benefits-studio" + cf_space_name = "notify-production" + env = "production" + app_name = "notify-admin" } resource "null_resource" "prevent_destroy" { @@ -29,9 +29,9 @@ module "redis-v70" { module "logo_upload_bucket" { source = "github.com/GSA-TTS/terraform-cloudgov//s3?ref=v1.0.0" - cf_org_name = local.cf_org_name - cf_space_name = local.cf_space_name - name = "${local.app_name}-logo-upload-bucket-${local.env}" + cf_org_name = local.cf_org_name + cf_space_name = local.cf_space_name + name = "${local.app_name}-logo-upload-bucket-${local.env}" } # ########################################################################## diff --git a/terraform/sandbox/main.tf b/terraform/sandbox/main.tf index 074a978d1..ad0748199 100644 --- a/terraform/sandbox/main.tf +++ b/terraform/sandbox/main.tf @@ -1,8 +1,8 @@ locals { - cf_org_name = "gsa-tts-benefits-studio" - cf_space_name = "notify-sandbox" - env = "sandbox" - app_name = "notify-admin" + cf_org_name = "gsa-tts-benefits-studio" + cf_space_name = "notify-sandbox" + env = "sandbox" + app_name = "notify-admin" } resource "null_resource" "prevent_destroy" { @@ -29,9 +29,9 @@ module "redis-v70" { module "logo_upload_bucket" { source = "github.com/GSA-TTS/terraform-cloudgov//s3?ref=v1.0.0" - cf_org_name = local.cf_org_name - cf_space_name = local.cf_space_name - name = "${local.app_name}-logo-upload-bucket-${local.env}" + cf_org_name = local.cf_org_name + cf_space_name = local.cf_space_name + name = "${local.app_name}-logo-upload-bucket-${local.env}" } # ########################################################################## diff --git a/terraform/staging/main.tf b/terraform/staging/main.tf index 63c4d8ad1..99ef28590 100644 --- a/terraform/staging/main.tf +++ b/terraform/staging/main.tf @@ -1,8 +1,8 @@ locals { - cf_org_name = "gsa-tts-benefits-studio" - cf_space_name = "notify-staging" - env = "staging" - app_name = "notify-admin" + cf_org_name = "gsa-tts-benefits-studio" + cf_space_name = "notify-staging" + env = "staging" + app_name = "notify-admin" } resource "null_resource" "prevent_destroy" { @@ -29,9 +29,9 @@ module "redis-v70" { module "logo_upload_bucket" { source = "github.com/GSA-TTS/terraform-cloudgov//s3?ref=v1.0.0" - cf_org_name = local.cf_org_name - cf_space_name = local.cf_space_name - name = "${local.app_name}-logo-upload-bucket-${local.env}" + cf_org_name = local.cf_org_name + cf_space_name = local.cf_space_name + name = "${local.app_name}-logo-upload-bucket-${local.env}" } # ########################################################################## From 93609417c1631b804900aee5581084dbf448a5b4 Mon Sep 17 00:00:00 2001 From: alexjanousekGSA Date: Thu, 18 Jul 2024 15:17:12 -0600 Subject: [PATCH 44/58] Added requirements file --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 57a363cd0..d0a03e6f9 100644 --- a/.gitignore +++ b/.gitignore @@ -123,6 +123,8 @@ app/templates/vendor secrets.auto.tfvars terraform.tfstate terraform.tfstate.backup +requirements.txt +terraform/sandbox/requirements.txt # Playwright playwright/ From 3567a0651a704a8d405a2bda2cabc664d4c1d2f1 Mon Sep 17 00:00:00 2001 From: John Skiles Skinner Date: Thu, 18 Jul 2024 15:56:27 -0700 Subject: [PATCH 45/58] Upgrade terraform-cloudgov, remove recursive_delete in dev module --- terraform/development/main.tf | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/terraform/development/main.tf b/terraform/development/main.tf index 767256c3f..939b5a3fb 100644 --- a/terraform/development/main.tf +++ b/terraform/development/main.tf @@ -11,12 +11,11 @@ data "cloudfoundry_space" "dev" { } module "logo_upload_bucket" { - source = "github.com/18f/terraform-cloudgov//s3?ref=v0.7.1" + source = "github.com/GSA-TTS/terraform-cloudgov//s3?ref=v1.0.0" - cf_org_name = local.cf_org_name - cf_space_name = local.cf_space_name - recursive_delete = local.recursive_delete - name = "${var.username}-logo-upload-bucket" + cf_org_name = local.cf_org_name + cf_space_name = local.cf_space_name + name = "${var.username}-logo-upload-bucket" } resource "cloudfoundry_service_key" "logo_key" { name = local.key_name From a08cf0ca44670cec6842d448db406d618e3c5baa Mon Sep 17 00:00:00 2001 From: Carlo Costino Date: Mon, 22 Jul 2024 16:05:04 -0400 Subject: [PATCH 46/58] Python dependency updates - 7/22/24 This changeset updates a few Python dependencies that Dependabot had flagged for updates. Signed-off-by: Carlo Costino --- poetry.lock | 25 ++++++++++++------------- pyproject.toml | 6 +++--- 2 files changed, 15 insertions(+), 16 deletions(-) diff --git a/poetry.lock b/poetry.lock index 115c925df..62ce99f15 100644 --- a/poetry.lock +++ b/poetry.lock @@ -182,17 +182,17 @@ files = [ [[package]] name = "boto3" -version = "1.34.144" +version = "1.34.146" description = "The AWS SDK for Python" optional = false python-versions = ">=3.8" files = [ - {file = "boto3-1.34.144-py3-none-any.whl", hash = "sha256:b8433d481d50b68a0162c0379c0dd4aabfc3d1ad901800beb5b87815997511c1"}, - {file = "boto3-1.34.144.tar.gz", hash = "sha256:2f3e88b10b8fcc5f6100a9d74cd28230edc9d4fa226d99dd40a3ab38ac213673"}, + {file = "boto3-1.34.146-py3-none-any.whl", hash = "sha256:7ec568fb19bce82a70be51f08fddac1ef927ca3fb0896cbb34303a012ba228d8"}, + {file = "boto3-1.34.146.tar.gz", hash = "sha256:5686fe2a6d1aa1de8a88e9589cdcc33361640d3d7a13da718a30717248886124"}, ] [package.dependencies] -botocore = ">=1.34.144,<1.35.0" +botocore = ">=1.34.146,<1.35.0" jmespath = ">=0.7.1,<2.0.0" s3transfer = ">=0.10.0,<0.11.0" @@ -201,13 +201,13 @@ crt = ["botocore[crt] (>=1.21.0,<2.0a0)"] [[package]] name = "botocore" -version = "1.34.144" +version = "1.34.146" description = "Low-level, data-driven core of boto 3." optional = false python-versions = ">=3.8" files = [ - {file = "botocore-1.34.144-py3-none-any.whl", hash = "sha256:a2cf26e1bf10d5917a2285e50257bc44e94a1d16574f282f3274f7a5d8d1f08b"}, - {file = "botocore-1.34.144.tar.gz", hash = "sha256:4215db28d25309d59c99507f1f77df9089e5bebbad35f6e19c7c44ec5383a3e8"}, + {file = "botocore-1.34.146-py3-none-any.whl", hash = "sha256:3fd4782362bd29c192704ebf859c5c8c5189ad05719e391eefe23088434427ae"}, + {file = "botocore-1.34.146.tar.gz", hash = "sha256:849cb8e54e042443aeabcd7822b5f2b76cb5cfe33fe3a71f91c7c069748a869c"}, ] [package.dependencies] @@ -1681,7 +1681,6 @@ files = [ {file = "msgpack-1.0.8-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5fbb160554e319f7b22ecf530a80a3ff496d38e8e07ae763b9e82fadfe96f273"}, {file = "msgpack-1.0.8-cp39-cp39-win32.whl", hash = "sha256:f9af38a89b6a5c04b7d18c492c8ccf2aee7048aff1ce8437c4683bb5a1df893d"}, {file = "msgpack-1.0.8-cp39-cp39-win_amd64.whl", hash = "sha256:ed59dd52075f8fc91da6053b12e8c89e37aa043f8986efd89e61fae69dc1b011"}, - {file = "msgpack-1.0.8-py3-none-any.whl", hash = "sha256:24f727df1e20b9876fa6e95f840a2a2651e34c0ad147676356f4bf5fbb0206ca"}, {file = "msgpack-1.0.8.tar.gz", hash = "sha256:95c02b0e27e706e48d0e5426d1710ca78e0f0628d6e89d5b5a5b91a5f12274f3"}, ] @@ -2290,20 +2289,20 @@ certifi = "*" [[package]] name = "pytest" -version = "8.2.2" +version = "8.3.1" description = "pytest: simple powerful testing with Python" optional = false python-versions = ">=3.8" files = [ - {file = "pytest-8.2.2-py3-none-any.whl", hash = "sha256:c434598117762e2bd304e526244f67bf66bbd7b5d6cf22138be51ff661980343"}, - {file = "pytest-8.2.2.tar.gz", hash = "sha256:de4bb8104e201939ccdc688b27a89a7be2079b22e2bd2b07f806b6ba71117977"}, + {file = "pytest-8.3.1-py3-none-any.whl", hash = "sha256:e9600ccf4f563976e2c99fa02c7624ab938296551f280835ee6516df8bc4ae8c"}, + {file = "pytest-8.3.1.tar.gz", hash = "sha256:7e8e5c5abd6e93cb1cc151f23e57adc31fcf8cfd2a3ff2da63e23f732de35db6"}, ] [package.dependencies] colorama = {version = "*", markers = "sys_platform == \"win32\""} iniconfig = "*" packaging = "*" -pluggy = ">=1.5,<2.0" +pluggy = ">=1.5,<2" [package.extras] dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] @@ -3107,4 +3106,4 @@ files = [ [metadata] lock-version = "2.0" python-versions = "^3.12.2" -content-hash = "3b7113242a7e5a9b10bf205889577020e313eb97d0eda2077fcc4c6d8a14fcfc" +content-hash = "88de80e0f647245eb3c773a9400631523199747c804184d2226babcbae2e05d9" diff --git a/pyproject.toml b/pyproject.toml index ffebe8700..a405c6be9 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -39,8 +39,8 @@ wtforms = "~=3.1" markdown = "^3.5.2" async-timeout = "^4.0.3" bleach = "^6.1.0" -boto3 = "^1.34.144" -botocore = "^1.34.144" +boto3 = "^1.34.146" +botocore = "^1.34.146" cachetools = "^5.4.0" cffi = "^1.16.0" cryptography = "^42.0.8" @@ -86,7 +86,7 @@ jinja2-cli = {version = "==0.8.2", extras = ["yaml"]} moto = "*" pip-audit = "*" pre-commit = "^3.7.1" -pytest = "^8.2.2" +pytest = "^8.3.1" pytest-env = "^1.1.3" pytest-mock = "^3.14.0" pytest-playwright = "^0.5.1" From 9b00618b5b089f4b1478440c8b646e6081ec033b Mon Sep 17 00:00:00 2001 From: Cliff Hill Date: Mon, 22 Jul 2024 16:34:21 -0400 Subject: [PATCH 47/58] Put logging where I think it will help the most. Signed-off-by: Cliff Hill --- app/main/views/send.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/app/main/views/send.py b/app/main/views/send.py index e3bc8ccb4..87e2a75c9 100644 --- a/app/main/views/send.py +++ b/app/main/views/send.py @@ -1053,9 +1053,13 @@ def get_email_reply_to_address_from_session(): def get_sms_sender_from_session(): - if session.get("sender_id"): - return current_service.get_sms_sender(session["sender_id"])["sms_sender"] - + sender_id = session.get("sender_id") + if sender_id: + sms_sender = current_service.get_sms_sender(session["sender_id"])["sms_sender"] + current_app.logger.info(f"SMS Sender ({sender_id}) #: {sms_sender}") + return sms_sender + else: + current_app.logger.error("No SMS Sender!!!!!!") def get_spreadsheet_column_headings_from_template(template): column_headings = [] From 8c2190e3c4d5163fd338dfdc3a4d85d2e9fc980b Mon Sep 17 00:00:00 2001 From: Cliff Hill Date: Mon, 22 Jul 2024 17:05:44 -0400 Subject: [PATCH 48/58] Stuff was fixed. Signed-off-by: Cliff Hill --- app/main/views/send.py | 1 + 1 file changed, 1 insertion(+) diff --git a/app/main/views/send.py b/app/main/views/send.py index 87e2a75c9..6f2817826 100644 --- a/app/main/views/send.py +++ b/app/main/views/send.py @@ -1061,6 +1061,7 @@ def get_sms_sender_from_session(): else: current_app.logger.error("No SMS Sender!!!!!!") + def get_spreadsheet_column_headings_from_template(template): column_headings = [] From f7d0b728cd963de5ee325ac741a7c11a1f39272d Mon Sep 17 00:00:00 2001 From: Kenneth Kehl <@kkehl@flexion.us> Date: Tue, 23 Jul 2024 07:21:20 -0700 Subject: [PATCH 49/58] merge from main --- poetry.lock | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/poetry.lock b/poetry.lock index 6c80bb40f..adcd85c60 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1344,13 +1344,9 @@ files = [ {file = "lxml-5.2.2-cp36-cp36m-win_amd64.whl", hash = "sha256:edcfa83e03370032a489430215c1e7783128808fd3e2e0a3225deee278585196"}, {file = "lxml-5.2.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:28bf95177400066596cdbcfc933312493799382879da504633d16cf60bba735b"}, {file = "lxml-5.2.2-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3a745cc98d504d5bd2c19b10c79c61c7c3df9222629f1b6210c0368177589fb8"}, - {file = "lxml-5.2.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b590b39ef90c6b22ec0be925b211298e810b4856909c8ca60d27ffbca6c12e6"}, {file = "lxml-5.2.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b336b0416828022bfd5a2e3083e7f5ba54b96242159f83c7e3eebaec752f1716"}, - {file = "lxml-5.2.2-cp37-cp37m-manylinux_2_28_aarch64.whl", hash = "sha256:c2faf60c583af0d135e853c86ac2735ce178f0e338a3c7f9ae8f622fd2eb788c"}, {file = "lxml-5.2.2-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:4bc6cb140a7a0ad1f7bc37e018d0ed690b7b6520ade518285dc3171f7a117905"}, - {file = "lxml-5.2.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7ff762670cada8e05b32bf1e4dc50b140790909caa8303cfddc4d702b71ea184"}, {file = "lxml-5.2.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:57f0a0bbc9868e10ebe874e9f129d2917750adf008fe7b9c1598c0fbbfdde6a6"}, - {file = "lxml-5.2.2-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:a6d2092797b388342c1bc932077ad232f914351932353e2e8706851c870bca1f"}, {file = "lxml-5.2.2-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:60499fe961b21264e17a471ec296dcbf4365fbea611bf9e303ab69db7159ce61"}, {file = "lxml-5.2.2-cp37-cp37m-win32.whl", hash = "sha256:d9b342c76003c6b9336a80efcc766748a333573abf9350f4094ee46b006ec18f"}, {file = "lxml-5.2.2-cp37-cp37m-win_amd64.whl", hash = "sha256:b16db2770517b8799c79aa80f4053cd6f8b716f21f8aca962725a9565ce3ee40"}, @@ -1685,6 +1681,7 @@ files = [ {file = "msgpack-1.0.8-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5fbb160554e319f7b22ecf530a80a3ff496d38e8e07ae763b9e82fadfe96f273"}, {file = "msgpack-1.0.8-cp39-cp39-win32.whl", hash = "sha256:f9af38a89b6a5c04b7d18c492c8ccf2aee7048aff1ce8437c4683bb5a1df893d"}, {file = "msgpack-1.0.8-cp39-cp39-win_amd64.whl", hash = "sha256:ed59dd52075f8fc91da6053b12e8c89e37aa043f8986efd89e61fae69dc1b011"}, + {file = "msgpack-1.0.8-py3-none-any.whl", hash = "sha256:24f727df1e20b9876fa6e95f840a2a2651e34c0ad147676356f4bf5fbb0206ca"}, {file = "msgpack-1.0.8.tar.gz", hash = "sha256:95c02b0e27e706e48d0e5426d1710ca78e0f0628d6e89d5b5a5b91a5f12274f3"}, ] @@ -2531,7 +2528,6 @@ files = [ {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, - {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef"}, {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, From da11e3d9efd3d9239b32f02ffc3747962aa3b63d Mon Sep 17 00:00:00 2001 From: Carlo Costino Date: Tue, 23 Jul 2024 12:14:45 -0400 Subject: [PATCH 50/58] Increased Admin app memory to 4 GB This changeset updates the memory available to the API app and workers to be 4 GB to improve app stability and performance. Signed-off-by: Carlo Costino --- deploy-config/production.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deploy-config/production.yml b/deploy-config/production.yml index b38094f28..c114a65bf 100644 --- a/deploy-config/production.yml +++ b/deploy-config/production.yml @@ -1,6 +1,6 @@ env: production instances: 2 -memory: 2G +memory: 4G public_admin_route: beta.notify.gov cloud_dot_gov_route: notify.app.cloud.gov redis_enabled: 1 From 43c72d2ebc8a9a7dcf34426d5db4ea695a610211 Mon Sep 17 00:00:00 2001 From: Kenneth Kehl Date: Tue, 23 Jul 2024 11:37:22 -0700 Subject: [PATCH 51/58] Update app/templates/new/components/footer.html Co-authored-by: Carlo Costino --- app/templates/new/components/footer.html | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/app/templates/new/components/footer.html b/app/templates/new/components/footer.html index ad3775783..ebc8ebbcc 100644 --- a/app/templates/new/components/footer.html +++ b/app/templates/new/components/footer.html @@ -64,8 +64,10 @@ - Notify.gov Admin repo - Notify.gov API repo +
From 42fb5ad3777d9aa3e84101b3f74faf45e1204e82 Mon Sep 17 00:00:00 2001 From: Carlo Costino Date: Wed, 24 Jul 2024 10:48:00 -0400 Subject: [PATCH 52/58] Update Python runtime version for cloud.gov This changeset modifies the Python version specified in the runtime.txt file for cloud.gov. The buildpack was recently updated, and the older version we had pinned is no longer supported. Signed-off-by: Carlo Costino --- runtime.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runtime.txt b/runtime.txt index 4ddc7cd66..64f28603a 100644 --- a/runtime.txt +++ b/runtime.txt @@ -1 +1 @@ -python-3.12.3 +python-3.12.x From 08fec7e111c0f73d434cfa12f5588c92fb01676a Mon Sep 17 00:00:00 2001 From: Kenneth Kehl <@kkehl@flexion.us> Date: Wed, 24 Jul 2024 07:59:05 -0700 Subject: [PATCH 53/58] add another url for compliance #46 --- app/notify_client/__init__.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/app/notify_client/__init__.py b/app/notify_client/__init__.py index f78573090..5f65e85c6 100644 --- a/app/notify_client/__init__.py +++ b/app/notify_client/__init__.py @@ -58,6 +58,10 @@ class NotifyAdminAPIClient(BaseAPIClient): def check_inactive_user(self, *args): still_signing_in = False + + # TODO clean up and add testing etc. + # We really should be checking for exact matches + # and we only want to check the first arg for arg in args: arg = str(arg) if ( @@ -66,6 +70,7 @@ class NotifyAdminAPIClient(BaseAPIClient): or "/activate" in arg or "/email-code" in arg or "/verify/code" in arg + or "/user" in arg ): still_signing_in = True From 1036cec1e09c466b4289599a08f47bcc16a704a7 Mon Sep 17 00:00:00 2001 From: Beverly Nguyen Date: Wed, 24 Jul 2024 10:26:37 -0700 Subject: [PATCH 54/58] fixed image --- app/assets/img/phone-text.png | Bin 0 -> 21090 bytes app/templates/views/signedout.html | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 app/assets/img/phone-text.png diff --git a/app/assets/img/phone-text.png b/app/assets/img/phone-text.png new file mode 100644 index 0000000000000000000000000000000000000000..a2318f1eb35ad9ea3f4d14baf4d739e607bbc32a GIT binary patch literal 21090 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 i!$xR>h4ZT#l>L$Currently we are only working with select pilot partners. If you are interested in using Notify.gov in the future, please contact
tts-benefits-studio@gsa.gov to learn more.

From 05611cfab6c0dd722682ac39cfc6dd11bb3ea864 Mon Sep 17 00:00:00 2001 From: Beverly Nguyen Date: Wed, 24 Jul 2024 10:55:51 -0700 Subject: [PATCH 55/58] converted png to svg --- app/assets/images/product/phone-text.svg | 712 +++++++++++++++++++++++ app/assets/img/phone-text.png | Bin 21090 -> 0 bytes app/templates/views/signedout.html | 4 +- 3 files changed, 714 insertions(+), 2 deletions(-) create mode 100644 app/assets/images/product/phone-text.svg delete mode 100644 app/assets/img/phone-text.png diff --git a/app/assets/images/product/phone-text.svg b/app/assets/images/product/phone-text.svg new file mode 100644 index 000000000..0fb85dcb0 --- /dev/null +++ b/app/assets/images/product/phone-text.svg @@ -0,0 +1,712 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/assets/img/phone-text.png b/app/assets/img/phone-text.png deleted file mode 100644 index a2318f1eb35ad9ea3f4d14baf4d739e607bbc32a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21090 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 i!$xR>h4ZT#l>L$Currently we are only working with select pilot partners. If you are interested in using Notify.gov in the future, please contact
tts-benefits-studio@gsa.gov to learn more.

From 6fc428363a5a5fdad6fb379478debdbe4deb2f05 Mon Sep 17 00:00:00 2001 From: alexjanousekGSA Date: Wed, 24 Jul 2024 12:39:04 -0600 Subject: [PATCH 56/58] Added line to allow encoding which prevent png --- gulpfile.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gulpfile.js b/gulpfile.js index f80eee6e0..3e7dee06e 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -149,7 +149,7 @@ const images = () => { paths.govuk_frontend + 'assets/images/**/*', paths.src + 'images/**/*', paths.src + 'img/**/*', - ]) + ], {encoding: false}) .pipe(dest(paths.dist + 'images/')) }; From 1f9cccede69dd953bc34fffd3175747396591eb7 Mon Sep 17 00:00:00 2001 From: Carlo Costino Date: Wed, 24 Jul 2024 14:58:15 -0400 Subject: [PATCH 57/58] Revert "fixed image" --- app/assets/images/product/phone-text.svg | 712 ----------------------- app/templates/views/signedout.html | 4 +- 2 files changed, 2 insertions(+), 714 deletions(-) delete mode 100644 app/assets/images/product/phone-text.svg diff --git a/app/assets/images/product/phone-text.svg b/app/assets/images/product/phone-text.svg deleted file mode 100644 index 0fb85dcb0..000000000 --- a/app/assets/images/product/phone-text.svg +++ /dev/null @@ -1,712 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/templates/views/signedout.html b/app/templates/views/signedout.html index bb082700a..fab9fbb30 100644 --- a/app/templates/views/signedout.html +++ b/app/templates/views/signedout.html @@ -28,8 +28,8 @@ Notify.gov

Currently we are only working with select pilot partners. If you are interested in using Notify.gov in the future, please contact
tts-benefits-studio@gsa.gov to learn more.

From 3c30a14c53fdfe9dc98b956f2b4122acf2bb0ebb Mon Sep 17 00:00:00 2001 From: John Skiles Skinner Date: Wed, 24 Jul 2024 12:26:41 -0700 Subject: [PATCH 58/58] Hard-code recursive_delete to false --- terraform/production/main.tf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/terraform/production/main.tf b/terraform/production/main.tf index 771558ce2..c0bcdc556 100644 --- a/terraform/production/main.tf +++ b/terraform/production/main.tf @@ -65,7 +65,7 @@ module "domain" { cf_space_name = local.cf_space_name app_name_or_id = "${local.app_name}-${local.env}" name = "${local.app_name}-domain-${local.env}" - recursive_delete = local.recursive_delete + recursive_delete = false cdn_plan_name = "domain" domain_name = "beta.notify.gov" }