From cf237d7da272a6c0cc518349b9602d3a53d3eaec Mon Sep 17 00:00:00 2001 From: Nour Zahrawi Date: Wed, 24 Jun 2026 18:57:39 +0800 Subject: [PATCH 01/30] Add News Django app with model and settings registration --- server/api/news/__init__.py | 0 server/api/news/admin.py | 3 + server/api/news/apps.py | 6 + server/api/news/migrations/__init__.py | 0 server/api/news/models.py | 15 + server/api/news/tests.py | 3 + server/api/news/views.py | 3 + server/api/settings.py | 3 +- server/poetry.lock | 529 +++++++++++++------------ 9 files changed, 316 insertions(+), 246 deletions(-) create mode 100644 server/api/news/__init__.py create mode 100644 server/api/news/admin.py create mode 100644 server/api/news/apps.py create mode 100644 server/api/news/migrations/__init__.py create mode 100644 server/api/news/models.py create mode 100644 server/api/news/tests.py create mode 100644 server/api/news/views.py diff --git a/server/api/news/__init__.py b/server/api/news/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/server/api/news/admin.py b/server/api/news/admin.py new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ b/server/api/news/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/server/api/news/apps.py b/server/api/news/apps.py new file mode 100644 index 0000000..adbdbe3 --- /dev/null +++ b/server/api/news/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class NewsConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'api.news' diff --git a/server/api/news/migrations/__init__.py b/server/api/news/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/server/api/news/models.py b/server/api/news/models.py new file mode 100644 index 0000000..a33e2a9 --- /dev/null +++ b/server/api/news/models.py @@ -0,0 +1,15 @@ +import uuid +from django.db import models + +# Create your models here. + +class News(models.Model): + id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) + title = models.CharField(max_length=255) + slug = models.SlugField(max_length=255, unique=True) + summary = models.TextField(blank=True, null=True) + body = models.TextField(blank=True, null=True) + author = models.CharField(max_length=255, blank=True, null=True) + published_at = models.DateField(blank=True, null=True) + def __str__(self): + return self.title \ No newline at end of file diff --git a/server/api/news/tests.py b/server/api/news/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/server/api/news/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/server/api/news/views.py b/server/api/news/views.py new file mode 100644 index 0000000..91ea44a --- /dev/null +++ b/server/api/news/views.py @@ -0,0 +1,3 @@ +from django.shortcuts import render + +# Create your views here. diff --git a/server/api/settings.py b/server/api/settings.py index 86a7d66..d2ee2fd 100644 --- a/server/api/settings.py +++ b/server/api/settings.py @@ -52,7 +52,8 @@ "rest_framework", "corsheaders", "api.healthcheck", - "api.resources" + "api.resources", + "api.news" ] MIDDLEWARE = [ diff --git a/server/poetry.lock b/server/poetry.lock index 52bf0d2..4bc80ce 100644 --- a/server/poetry.lock +++ b/server/poetry.lock @@ -1,19 +1,19 @@ -# This file is automatically @generated by Poetry 2.2.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 2.4.1 and should not be changed by hand. [[package]] name = "asgiref" -version = "3.8.1" +version = "3.11.1" description = "ASGI specs, helper code, and adapters" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" groups = ["main"] files = [ - {file = "asgiref-3.8.1-py3-none-any.whl", hash = "sha256:3e1e3ecc849832fe52ccf2cb6686b7a55f82bb1d6aee72a58826471390335e47"}, - {file = "asgiref-3.8.1.tar.gz", hash = "sha256:c343bd80a0bec947a9860adb4c432ffa7db769836c64238fc34bdc3fec84d590"}, + {file = "asgiref-3.11.1-py3-none-any.whl", hash = "sha256:e8667a091e69529631969fd45dc268fa79b99c92c5fcdda727757e52146ec133"}, + {file = "asgiref-3.11.1.tar.gz", hash = "sha256:5f184dc43b7e763efe848065441eac62229c9f7b0475f41f80e207a114eda4ce"}, ] [package.extras] -tests = ["mypy (>=0.800)", "pytest", "pytest-asyncio"] +tests = ["mypy (>=1.14.0)", "pytest", "pytest-asyncio"] [[package]] name = "astroid" @@ -46,18 +46,18 @@ files = [ [[package]] name = "django" -version = "5.1.14" +version = "5.2.15" description = "A high-level Python web framework that encourages rapid development and clean, pragmatic design." optional = false python-versions = ">=3.10" groups = ["main"] files = [ - {file = "django-5.1.14-py3-none-any.whl", hash = "sha256:2a4b9c20404fd1bf50aaaa5542a19d860594cba1354f688f642feb271b91df27"}, - {file = "django-5.1.14.tar.gz", hash = "sha256:b98409fb31fdd6e8c3a6ba2eef3415cc5c0020057b43b21ba7af6eff5f014831"}, + {file = "django-5.2.15-py3-none-any.whl", hash = "sha256:0eb4a9bb1853a35b0286dbc6d916bd352c8c2687195a7f2d6f80cefd840e4970"}, + {file = "django-5.2.15.tar.gz", hash = "sha256:5154a9bf84ac01dde011e367f355c07dbb329532e06810dcf3ef2af269e236e7"}, ] [package.dependencies] -asgiref = ">=3.8.1,<4" +asgiref = ">=3.8.1" sqlparse = ">=0.3.1" tzdata = {version = "*", markers = "sys_platform == \"win32\""} @@ -67,19 +67,19 @@ bcrypt = ["bcrypt"] [[package]] name = "django-cors-headers" -version = "4.4.0" +version = "4.9.0" description = "django-cors-headers is a Django application for handling the server headers required for Cross-Origin Resource Sharing (CORS)." optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" groups = ["main"] files = [ - {file = "django_cors_headers-4.4.0-py3-none-any.whl", hash = "sha256:5c6e3b7fe870876a1efdfeb4f433782c3524078fa0dc9e0195f6706ce7a242f6"}, - {file = "django_cors_headers-4.4.0.tar.gz", hash = "sha256:92cf4633e22af67a230a1456cb1b7a02bb213d6536d2dcb2a4a24092ea9cebc2"}, + {file = "django_cors_headers-4.9.0-py3-none-any.whl", hash = "sha256:15c7f20727f90044dcee2216a9fd7303741a864865f0c3657e28b7056f61b449"}, + {file = "django_cors_headers-4.9.0.tar.gz", hash = "sha256:fe5d7cb59fdc2c8c646ce84b727ac2bca8912a247e6e68e1fb507372178e59e8"}, ] [package.dependencies] asgiref = ">=3.6" -django = ">=3.2" +django = ">=4.2" [[package]] name = "django-extensions" @@ -98,14 +98,14 @@ Django = ">=3.2" [[package]] name = "djangorestframework" -version = "3.15.2" +version = "3.17.1" description = "Web APIs for Django, made easy." optional = false -python-versions = ">=3.8" +python-versions = ">=3.10" groups = ["main"] files = [ - {file = "djangorestframework-3.15.2-py3-none-any.whl", hash = "sha256:2b8871b062ba1aefc2de01f773875441a961fefbf79f5eed1e32b2f096944b20"}, - {file = "djangorestframework-3.15.2.tar.gz", hash = "sha256:36fe88cd2d6c6bec23dca9804bab2ba5517a8bb9d8f47ebc68981b56840107ad"}, + {file = "djangorestframework-3.17.1-py3-none-any.whl", hash = "sha256:c3c74dd3e83a5a3efc37b3c18d92bd6f86a6791c7b7d4dff62bb068500e76457"}, + {file = "djangorestframework-3.17.1.tar.gz", hash = "sha256:a6def5f447fe78ff853bff1d47a3c59bf38f5434b031780b351b0c73a62db1a5"}, ] [package.dependencies] @@ -145,14 +145,14 @@ flake8 = ">=3.8.4,<7" [[package]] name = "freezegun" -version = "1.5.1" +version = "1.5.5" description = "Let your Python tests travel through time" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" groups = ["main"] files = [ - {file = "freezegun-1.5.1-py3-none-any.whl", hash = "sha256:bf111d7138a8abe55ab48a71755673dbaa4ab87f4cff5634a4442dfec34c15f1"}, - {file = "freezegun-1.5.1.tar.gz", hash = "sha256:b29dedfcda6d5e8e083ce71b2b542753ad48cfec44037b3fc79702e2980a89e9"}, + {file = "freezegun-1.5.5-py3-none-any.whl", hash = "sha256:cd557f4a75cf074e84bc374249b9dd491eaeacd61376b9eb3c423282211619d2"}, + {file = "freezegun-1.5.5.tar.gz", hash = "sha256:ac7742a6cc6c25a2c35e9292dfd554b897b517d2dec26891a2e8debf205cb94a"}, ] [package.dependencies] @@ -182,61 +182,68 @@ tornado = ["tornado (>=0.2)"] [[package]] name = "iniconfig" -version = "2.0.0" +version = "2.3.0" description = "brain-dead simple config-ini parsing" optional = false -python-versions = ">=3.7" +python-versions = ">=3.10" groups = ["dev"] files = [ - {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, - {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, + {file = "iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12"}, + {file = "iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730"}, ] [[package]] name = "lazy-object-proxy" -version = "1.10.0" +version = "1.12.0" description = "A fast and thorough lazy object proxy." optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" groups = ["dev"] files = [ - {file = "lazy-object-proxy-1.10.0.tar.gz", hash = "sha256:78247b6d45f43a52ef35c25b5581459e85117225408a4128a3daf8bf9648ac69"}, - {file = "lazy_object_proxy-1.10.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:855e068b0358ab916454464a884779c7ffa312b8925c6f7401e952dcf3b89977"}, - {file = "lazy_object_proxy-1.10.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab7004cf2e59f7c2e4345604a3e6ea0d92ac44e1c2375527d56492014e690c3"}, - {file = "lazy_object_proxy-1.10.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dc0d2fc424e54c70c4bc06787e4072c4f3b1aa2f897dfdc34ce1013cf3ceef05"}, - {file = "lazy_object_proxy-1.10.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e2adb09778797da09d2b5ebdbceebf7dd32e2c96f79da9052b2e87b6ea495895"}, - {file = "lazy_object_proxy-1.10.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b1f711e2c6dcd4edd372cf5dec5c5a30d23bba06ee012093267b3376c079ec83"}, - {file = "lazy_object_proxy-1.10.0-cp310-cp310-win32.whl", hash = "sha256:76a095cfe6045c7d0ca77db9934e8f7b71b14645f0094ffcd842349ada5c5fb9"}, - {file = "lazy_object_proxy-1.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:b4f87d4ed9064b2628da63830986c3d2dca7501e6018347798313fcf028e2fd4"}, - {file = "lazy_object_proxy-1.10.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:fec03caabbc6b59ea4a638bee5fce7117be8e99a4103d9d5ad77f15d6f81020c"}, - {file = "lazy_object_proxy-1.10.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:02c83f957782cbbe8136bee26416686a6ae998c7b6191711a04da776dc9e47d4"}, - {file = "lazy_object_proxy-1.10.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:009e6bb1f1935a62889ddc8541514b6a9e1fcf302667dcb049a0be5c8f613e56"}, - {file = "lazy_object_proxy-1.10.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:75fc59fc450050b1b3c203c35020bc41bd2695ed692a392924c6ce180c6f1dc9"}, - {file = "lazy_object_proxy-1.10.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:782e2c9b2aab1708ffb07d4bf377d12901d7a1d99e5e410d648d892f8967ab1f"}, - {file = "lazy_object_proxy-1.10.0-cp311-cp311-win32.whl", hash = "sha256:edb45bb8278574710e68a6b021599a10ce730d156e5b254941754a9cc0b17d03"}, - {file = "lazy_object_proxy-1.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:e271058822765ad5e3bca7f05f2ace0de58a3f4e62045a8c90a0dfd2f8ad8cc6"}, - {file = "lazy_object_proxy-1.10.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:e98c8af98d5707dcdecc9ab0863c0ea6e88545d42ca7c3feffb6b4d1e370c7ba"}, - {file = "lazy_object_proxy-1.10.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:952c81d415b9b80ea261d2372d2a4a2332a3890c2b83e0535f263ddfe43f0d43"}, - {file = "lazy_object_proxy-1.10.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80b39d3a151309efc8cc48675918891b865bdf742a8616a337cb0090791a0de9"}, - {file = "lazy_object_proxy-1.10.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:e221060b701e2aa2ea991542900dd13907a5c90fa80e199dbf5a03359019e7a3"}, - {file = "lazy_object_proxy-1.10.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:92f09ff65ecff3108e56526f9e2481b8116c0b9e1425325e13245abfd79bdb1b"}, - {file = "lazy_object_proxy-1.10.0-cp312-cp312-win32.whl", hash = "sha256:3ad54b9ddbe20ae9f7c1b29e52f123120772b06dbb18ec6be9101369d63a4074"}, - {file = "lazy_object_proxy-1.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:127a789c75151db6af398b8972178afe6bda7d6f68730c057fbbc2e96b08d282"}, - {file = "lazy_object_proxy-1.10.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9e4ed0518a14dd26092614412936920ad081a424bdcb54cc13349a8e2c6d106a"}, - {file = "lazy_object_proxy-1.10.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5ad9e6ed739285919aa9661a5bbed0aaf410aa60231373c5579c6b4801bd883c"}, - {file = "lazy_object_proxy-1.10.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2fc0a92c02fa1ca1e84fc60fa258458e5bf89d90a1ddaeb8ed9cc3147f417255"}, - {file = "lazy_object_proxy-1.10.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:0aefc7591920bbd360d57ea03c995cebc204b424524a5bd78406f6e1b8b2a5d8"}, - {file = "lazy_object_proxy-1.10.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5faf03a7d8942bb4476e3b62fd0f4cf94eaf4618e304a19865abf89a35c0bbee"}, - {file = "lazy_object_proxy-1.10.0-cp38-cp38-win32.whl", hash = "sha256:e333e2324307a7b5d86adfa835bb500ee70bfcd1447384a822e96495796b0ca4"}, - {file = "lazy_object_proxy-1.10.0-cp38-cp38-win_amd64.whl", hash = "sha256:cb73507defd385b7705c599a94474b1d5222a508e502553ef94114a143ec6696"}, - {file = "lazy_object_proxy-1.10.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:366c32fe5355ef5fc8a232c5436f4cc66e9d3e8967c01fb2e6302fd6627e3d94"}, - {file = "lazy_object_proxy-1.10.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2297f08f08a2bb0d32a4265e98a006643cd7233fb7983032bd61ac7a02956b3b"}, - {file = "lazy_object_proxy-1.10.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:18dd842b49456aaa9a7cf535b04ca4571a302ff72ed8740d06b5adcd41fe0757"}, - {file = "lazy_object_proxy-1.10.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:217138197c170a2a74ca0e05bddcd5f1796c735c37d0eee33e43259b192aa424"}, - {file = "lazy_object_proxy-1.10.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9a3a87cf1e133e5b1994144c12ca4aa3d9698517fe1e2ca82977781b16955658"}, - {file = "lazy_object_proxy-1.10.0-cp39-cp39-win32.whl", hash = "sha256:30b339b2a743c5288405aa79a69e706a06e02958eab31859f7f3c04980853b70"}, - {file = "lazy_object_proxy-1.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:a899b10e17743683b293a729d3a11f2f399e8a90c73b089e29f5d0fe3509f0dd"}, - {file = "lazy_object_proxy-1.10.0-pp310.pp311.pp312.pp38.pp39-none-any.whl", hash = "sha256:80fa48bd89c8f2f456fc0765c11c23bf5af827febacd2f523ca5bc1893fcc09d"}, + {file = "lazy_object_proxy-1.12.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:61d5e3310a4aa5792c2b599a7a78ccf8687292c8eb09cf187cca8f09cf6a7519"}, + {file = "lazy_object_proxy-1.12.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c1ca33565f698ac1aece152a10f432415d1a2aa9a42dfe23e5ba2bc255ab91f6"}, + {file = "lazy_object_proxy-1.12.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d01c7819a410f7c255b20799b65d36b414379a30c6f1684c7bd7eb6777338c1b"}, + {file = "lazy_object_proxy-1.12.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:029d2b355076710505c9545aef5ab3f750d89779310e26ddf2b7b23f6ea03cd8"}, + {file = "lazy_object_proxy-1.12.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:cc6e3614eca88b1c8a625fc0a47d0d745e7c3255b21dac0e30b3037c5e3deeb8"}, + {file = "lazy_object_proxy-1.12.0-cp310-cp310-win_amd64.whl", hash = "sha256:be5fe974e39ceb0d6c9db0663c0464669cf866b2851c73971409b9566e880eab"}, + {file = "lazy_object_proxy-1.12.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1cf69cd1a6c7fe2dbcc3edaa017cf010f4192e53796538cc7d5e1fedbfa4bcff"}, + {file = "lazy_object_proxy-1.12.0-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:efff4375a8c52f55a145dc8487a2108c2140f0bec4151ab4e1843e52eb9987ad"}, + {file = "lazy_object_proxy-1.12.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1192e8c2f1031a6ff453ee40213afa01ba765b3dc861302cd91dbdb2e2660b00"}, + {file = "lazy_object_proxy-1.12.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:3605b632e82a1cbc32a1e5034278a64db555b3496e0795723ee697006b980508"}, + {file = "lazy_object_proxy-1.12.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a61095f5d9d1a743e1e20ec6d6db6c2ca511961777257ebd9b288951b23b44fa"}, + {file = "lazy_object_proxy-1.12.0-cp311-cp311-win_amd64.whl", hash = "sha256:997b1d6e10ecc6fb6fe0f2c959791ae59599f41da61d652f6c903d1ee58b7370"}, + {file = "lazy_object_proxy-1.12.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8ee0d6027b760a11cc18281e702c0309dd92da458a74b4c15025d7fc490deede"}, + {file = "lazy_object_proxy-1.12.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:4ab2c584e3cc8be0dfca422e05ad30a9abe3555ce63e9ab7a559f62f8dbc6ff9"}, + {file = "lazy_object_proxy-1.12.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:14e348185adbd03ec17d051e169ec45686dcd840a3779c9d4c10aabe2ca6e1c0"}, + {file = "lazy_object_proxy-1.12.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c4fcbe74fb85df8ba7825fa05eddca764138da752904b378f0ae5ab33a36c308"}, + {file = "lazy_object_proxy-1.12.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:563d2ec8e4d4b68ee7848c5ab4d6057a6d703cb7963b342968bb8758dda33a23"}, + {file = "lazy_object_proxy-1.12.0-cp312-cp312-win_amd64.whl", hash = "sha256:53c7fd99eb156bbb82cbc5d5188891d8fdd805ba6c1e3b92b90092da2a837073"}, + {file = "lazy_object_proxy-1.12.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:86fd61cb2ba249b9f436d789d1356deae69ad3231dc3c0f17293ac535162672e"}, + {file = "lazy_object_proxy-1.12.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:81d1852fb30fab81696f93db1b1e55a5d1ff7940838191062f5f56987d5fcc3e"}, + {file = "lazy_object_proxy-1.12.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:be9045646d83f6c2664c1330904b245ae2371b5c57a3195e4028aedc9f999655"}, + {file = "lazy_object_proxy-1.12.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:67f07ab742f1adfb3966c40f630baaa7902be4222a17941f3d85fd1dae5565ff"}, + {file = "lazy_object_proxy-1.12.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:75ba769017b944fcacbf6a80c18b2761a1795b03f8899acdad1f1c39db4409be"}, + {file = "lazy_object_proxy-1.12.0-cp313-cp313-win_amd64.whl", hash = "sha256:7b22c2bbfb155706b928ac4d74c1a63ac8552a55ba7fff4445155523ea4067e1"}, + {file = "lazy_object_proxy-1.12.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:4a79b909aa16bde8ae606f06e6bbc9d3219d2e57fb3e0076e17879072b742c65"}, + {file = "lazy_object_proxy-1.12.0-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:338ab2f132276203e404951205fe80c3fd59429b3a724e7b662b2eb539bb1be9"}, + {file = "lazy_object_proxy-1.12.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8c40b3c9faee2e32bfce0df4ae63f4e73529766893258eca78548bac801c8f66"}, + {file = "lazy_object_proxy-1.12.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:717484c309df78cedf48396e420fa57fc8a2b1f06ea889df7248fdd156e58847"}, + {file = "lazy_object_proxy-1.12.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:a6b7ea5ea1ffe15059eb44bcbcb258f97bcb40e139b88152c40d07b1a1dfc9ac"}, + {file = "lazy_object_proxy-1.12.0-cp313-cp313t-win_amd64.whl", hash = "sha256:08c465fb5cd23527512f9bd7b4c7ba6cec33e28aad36fbbe46bf7b858f9f3f7f"}, + {file = "lazy_object_proxy-1.12.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c9defba70ab943f1df98a656247966d7729da2fe9c2d5d85346464bf320820a3"}, + {file = "lazy_object_proxy-1.12.0-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:6763941dbf97eea6b90f5b06eb4da9418cc088fce0e3883f5816090f9afcde4a"}, + {file = "lazy_object_proxy-1.12.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fdc70d81235fc586b9e3d1aeef7d1553259b62ecaae9db2167a5d2550dcc391a"}, + {file = "lazy_object_proxy-1.12.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:0a83c6f7a6b2bfc11ef3ed67f8cbe99f8ff500b05655d8e7df9aab993a6abc95"}, + {file = "lazy_object_proxy-1.12.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:256262384ebd2a77b023ad02fbcc9326282bcfd16484d5531154b02bc304f4c5"}, + {file = "lazy_object_proxy-1.12.0-cp314-cp314-win_amd64.whl", hash = "sha256:7601ec171c7e8584f8ff3f4e440aa2eebf93e854f04639263875b8c2971f819f"}, + {file = "lazy_object_proxy-1.12.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ae575ad9b674d0029fc077c5231b3bc6b433a3d1a62a8c363df96974b5534728"}, + {file = "lazy_object_proxy-1.12.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:31020c84005d3daa4cc0fa5a310af2066efe6b0d82aeebf9ab199292652ff036"}, + {file = "lazy_object_proxy-1.12.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:800f32b00a47c27446a2b767df7538e6c66a3488632c402b4fb2224f9794f3c0"}, + {file = "lazy_object_proxy-1.12.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:15400b18893f345857b9e18b9bd87bd06aba84af6ed086187add70aeaa3f93f1"}, + {file = "lazy_object_proxy-1.12.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:3d3964fbd326578bcdfffd017ef101b6fb0484f34e731fe060ba9b8816498c36"}, + {file = "lazy_object_proxy-1.12.0-cp39-cp39-win_amd64.whl", hash = "sha256:424a8ab6695400845c39f13c685050eab69fa0bbac5790b201cd27375e5e41d7"}, + {file = "lazy_object_proxy-1.12.0-pp39.pp310.pp311.graalpy311-none-any.whl", hash = "sha256:c3b2e0af1f7f77c4263759c4824316ce458fabe0fceadcd24ef8ca08b2d1e402"}, + {file = "lazy_object_proxy-1.12.0.tar.gz", hash = "sha256:1f5a462d92fd0cfb82f1fab28b51bfb209fabbe6aabf7f0d51472c0c124c0c61"}, ] [[package]] @@ -253,136 +260,141 @@ files = [ [[package]] name = "packaging" -version = "24.1" +version = "26.2" description = "Core utilities for Python packages" optional = false python-versions = ">=3.8" groups = ["main", "dev"] files = [ - {file = "packaging-24.1-py3-none-any.whl", hash = "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124"}, - {file = "packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002"}, + {file = "packaging-26.2-py3-none-any.whl", hash = "sha256:5fc45236b9446107ff2415ce77c807cee2862cb6fac22b8a73826d0693b0980e"}, + {file = "packaging-26.2.tar.gz", hash = "sha256:ff452ff5a3e828ce110190feff1178bb1f2ea2281fa2075aadb987c2fb221661"}, ] [[package]] name = "pluggy" -version = "1.5.0" +version = "1.6.0" description = "plugin and hook calling mechanisms for python" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" groups = ["dev"] files = [ - {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, - {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, + {file = "pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746"}, + {file = "pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3"}, ] [package.extras] dev = ["pre-commit", "tox"] -testing = ["pytest", "pytest-benchmark"] +testing = ["coverage", "pytest", "pytest-benchmark"] [[package]] name = "psycopg" -version = "3.2.1" +version = "3.3.4" description = "PostgreSQL database adapter for Python" optional = false -python-versions = ">=3.8" +python-versions = ">=3.10" groups = ["main"] files = [ - {file = "psycopg-3.2.1-py3-none-any.whl", hash = "sha256:ece385fb413a37db332f97c49208b36cf030ff02b199d7635ed2fbd378724175"}, - {file = "psycopg-3.2.1.tar.gz", hash = "sha256:dc8da6dc8729dacacda3cc2f17d2c9397a70a66cf0d2b69c91065d60d5f00cb7"}, + {file = "psycopg-3.3.4-py3-none-any.whl", hash = "sha256:b6bbc25ccf05c8fad3b061d9db2ef0909a555171b84b07f29458a447253d679a"}, + {file = "psycopg-3.3.4.tar.gz", hash = "sha256:e21207764952cff81b6b8bdacad9a3939f2793367fdac2987b3aac36a651b5bc"}, ] [package.dependencies] -psycopg-binary = {version = "3.2.1", optional = true, markers = "implementation_name != \"pypy\" and extra == \"binary\""} +psycopg-binary = {version = "3.3.4", optional = true, markers = "implementation_name != \"pypy\" and extra == \"binary\""} psycopg-pool = {version = "*", optional = true, markers = "extra == \"pool\""} -typing-extensions = ">=4.4" +typing-extensions = {version = ">=4.6", markers = "python_version < \"3.13\""} tzdata = {version = "*", markers = "sys_platform == \"win32\""} [package.extras] -binary = ["psycopg-binary (==3.2.1) ; implementation_name != \"pypy\""] -c = ["psycopg-c (==3.2.1) ; implementation_name != \"pypy\""] -dev = ["ast-comments (>=1.1.2)", "black (>=24.1.0)", "codespell (>=2.2)", "dnspython (>=2.1)", "flake8 (>=4.0)", "mypy (>=1.6)", "types-setuptools (>=57.4)", "wheel (>=0.37)"] -docs = ["Sphinx (>=5.0)", "furo (==2022.6.21)", "sphinx-autobuild (>=2021.3.14)", "sphinx-autodoc-typehints (>=1.12)"] +binary = ["psycopg-binary (==3.3.4) ; implementation_name != \"pypy\""] +c = ["psycopg-c (==3.3.4) ; implementation_name != \"pypy\""] +dev = ["ast-comments (>=1.1.2)", "black (>=26.1.0)", "codespell (>=2.2)", "cython-lint (>=0.16)", "dnspython (>=2.1)", "flake8 (>=4.0)", "isort-psycopg", "isort[colors] (>=6.0)", "mypy (>=1.19.0)", "pre-commit (>=4.0.1)", "types-setuptools (>=57.4)", "types-shapely (>=2.0)", "wheel (>=0.37)"] +docs = ["Sphinx (>=9.1)", "furo (==2025.12.19)", "sphinx-autobuild (>=2025.8.25)", "sphinx-autodoc-typehints (>=3.10.2)"] pool = ["psycopg-pool"] -test = ["anyio (>=4.0)", "mypy (>=1.6)", "pproxy (>=2.7)", "pytest (>=6.2.5)", "pytest-cov (>=3.0)", "pytest-randomly (>=3.5)"] +test = ["anyio (>=4.0)", "mypy (>=1.19.0) ; implementation_name != \"pypy\"", "pproxy (>=2.7)", "pytest (>=6.2.5)", "pytest-cov (>=3.0)", "pytest-randomly (>=3.5)"] [[package]] name = "psycopg-binary" -version = "3.2.1" +version = "3.3.4" description = "PostgreSQL database adapter for Python -- C optimisation distribution" optional = false -python-versions = ">=3.8" +python-versions = ">=3.10" groups = ["main"] markers = "implementation_name != \"pypy\"" files = [ - {file = "psycopg_binary-3.2.1-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:cad2de17804c4cfee8640ae2b279d616bb9e4734ac3c17c13db5e40982bd710d"}, - {file = "psycopg_binary-3.2.1-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:592b27d6c46a40f9eeaaeea7c1fef6f3c60b02c634365eb649b2d880669f149f"}, - {file = "psycopg_binary-3.2.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9a997efbaadb5e1a294fb5760e2f5643d7b8e4e3fe6cb6f09e6d605fd28e0291"}, - {file = "psycopg_binary-3.2.1-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c1d2b6438fb83376f43ebb798bf0ad5e57bc56c03c9c29c85bc15405c8c0ac5a"}, - {file = "psycopg_binary-3.2.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b1f087bd84bdcac78bf9f024ebdbfacd07fc0a23ec8191448a50679e2ac4a19e"}, - {file = "psycopg_binary-3.2.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:415c3b72ea32119163255c6504085f374e47ae7345f14bc3f0ef1f6e0976a879"}, - {file = "psycopg_binary-3.2.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f092114f10f81fb6bae544a0ec027eb720e2d9c74a4fcdaa9dd3899873136935"}, - {file = "psycopg_binary-3.2.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:06a7aae34edfe179ddc04da005e083ff6c6b0020000399a2cbf0a7121a8a22ea"}, - {file = "psycopg_binary-3.2.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:0b018631e5c80ce9bc210b71ea885932f9cca6db131e4df505653d7e3873a938"}, - {file = "psycopg_binary-3.2.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f8a509aeaac364fa965454e80cd110fe6d48ba2c80f56c9b8563423f0b5c3cfd"}, - {file = "psycopg_binary-3.2.1-cp310-cp310-win_amd64.whl", hash = "sha256:413977d18412ff83486eeb5875eb00b185a9391c57febac45b8993bf9c0ff489"}, - {file = "psycopg_binary-3.2.1-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:62b1b7b07e00ee490afb39c0a47d8282a9c2822c7cfed9553a04b0058adf7e7f"}, - {file = "psycopg_binary-3.2.1-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:f8afb07114ea9b924a4a0305ceb15354ccf0ef3c0e14d54b8dbeb03e50182dd7"}, - {file = "psycopg_binary-3.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40bb515d042f6a345714ec0403df68ccf13f73b05e567837d80c886c7c9d3805"}, - {file = "psycopg_binary-3.2.1-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6418712ba63cebb0c88c050b3997185b0ef54173b36568522d5634ac06153040"}, - {file = "psycopg_binary-3.2.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:101472468d59c74bb8565fab603e032803fd533d16be4b2d13da1bab8deb32a3"}, - {file = "psycopg_binary-3.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aa3931f308ab4a479d0ee22dc04bea867a6365cac0172e5ddcba359da043854b"}, - {file = "psycopg_binary-3.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:dc314a47d44fe1a8069b075a64abffad347a3a1d8652fed1bab5d3baea37acb2"}, - {file = "psycopg_binary-3.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:cc304a46be1e291031148d9d95c12451ffe783ff0cc72f18e2cc7ec43cdb8c68"}, - {file = "psycopg_binary-3.2.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:6f9e13600647087df5928875559f0eb8f496f53e6278b7da9511b4b3d0aff960"}, - {file = "psycopg_binary-3.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b140182830c76c74d17eba27df3755a46442ce8d4fb299e7f1cf2f74a87c877b"}, - {file = "psycopg_binary-3.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:3c838806eeb99af39f934b7999e35f947a8e577997cc892c12b5053a97a9057f"}, - {file = "psycopg_binary-3.2.1-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:7066d3dca196ed0dc6172f9777b2d62e4f138705886be656cccff2d555234d60"}, - {file = "psycopg_binary-3.2.1-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:28ada5f610468c57d8a4a055a8ea915d0085a43d794266c4f3b9d02f4288f4db"}, - {file = "psycopg_binary-3.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2e8213bf50af073b1aa8dc3cff123bfeedac86332a16c1b7274910bc88a847c7"}, - {file = "psycopg_binary-3.2.1-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:74d623261655a169bc84a9669890975c229f2fa6e19a7f2d10a77675dcf1a707"}, - {file = "psycopg_binary-3.2.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:42781ba94e8842ee98bca5a7d0c44cc9d067500fedca2d6a90fa3609b6d16b42"}, - {file = "psycopg_binary-3.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:33e6669091d09f8ba36e10ce678a6d9916e110446236a9b92346464a3565635e"}, - {file = "psycopg_binary-3.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b09e8a576a2ac69d695032ee76f31e03b30781828b5dd6d18c6a009e5a3d1c35"}, - {file = "psycopg_binary-3.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:8f28ff0cb9f1defdc4a6f8c958bf6787274247e7dfeca811f6e2f56602695fb1"}, - {file = "psycopg_binary-3.2.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:4c84fcac8a3a3479ac14673095cc4e1fdba2935499f72c436785ac679bec0d1a"}, - {file = "psycopg_binary-3.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:950fd666ec9e9fe6a8eeb2b5a8f17301790e518953730ad44d715b59ffdbc67f"}, - {file = "psycopg_binary-3.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:334046a937bb086c36e2c6889fe327f9f29bfc085d678f70fac0b0618949f674"}, - {file = "psycopg_binary-3.2.1-cp38-cp38-macosx_12_0_x86_64.whl", hash = "sha256:1d6833f607f3fc7b22226a9e121235d3b84c0eda1d3caab174673ef698f63788"}, - {file = "psycopg_binary-3.2.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d353e028b8f848b9784450fc2abf149d53a738d451eab3ee4c85703438128b9"}, - {file = "psycopg_binary-3.2.1-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f34e369891f77d0738e5d25727c307d06d5344948771e5379ea29c76c6d84555"}, - {file = "psycopg_binary-3.2.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0ab58213cc976a1666f66bc1cb2e602315cd753b7981a8e17237ac2a185bd4a1"}, - {file = "psycopg_binary-3.2.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b0104a72a17aa84b3b7dcab6c84826c595355bf54bb6ea6d284dcb06d99c6801"}, - {file = "psycopg_binary-3.2.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:059cbd4e6da2337e17707178fe49464ed01de867dc86c677b30751755ec1dc51"}, - {file = "psycopg_binary-3.2.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:73f9c9b984be9c322b5ec1515b12df1ee5896029f5e72d46160eb6517438659c"}, - {file = "psycopg_binary-3.2.1-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:af0469c00f24c4bec18c3d2ede124bf62688d88d1b8a5f3c3edc2f61046fe0d7"}, - {file = "psycopg_binary-3.2.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:463d55345f73ff391df8177a185ad57b552915ad33f5cc2b31b930500c068b22"}, - {file = "psycopg_binary-3.2.1-cp38-cp38-win_amd64.whl", hash = "sha256:302b86f92c0d76e99fe1b5c22c492ae519ce8b98b88d37ef74fda4c9e24c6b46"}, - {file = "psycopg_binary-3.2.1-cp39-cp39-macosx_12_0_x86_64.whl", hash = "sha256:0879b5d76b7d48678d31278242aaf951bc2d69ca4e4d7cef117e4bbf7bfefda9"}, - {file = "psycopg_binary-3.2.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f99e59f8a5f4dcd9cbdec445f3d8ac950a492fc0e211032384d6992ed3c17eb7"}, - {file = "psycopg_binary-3.2.1-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:84837e99353d16c6980603b362d0f03302d4b06c71672a6651f38df8a482923d"}, - {file = "psycopg_binary-3.2.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7ce965caf618061817f66c0906f0452aef966c293ae0933d4fa5a16ea6eaf5bb"}, - {file = "psycopg_binary-3.2.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78c2007caf3c90f08685c5378e3ceb142bafd5636be7495f7d86ec8a977eaeef"}, - {file = "psycopg_binary-3.2.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:7a84b5eb194a258116154b2a4ff2962ea60ea52de089508db23a51d3d6b1c7d1"}, - {file = "psycopg_binary-3.2.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:4a42b8f9ab39affcd5249b45cac763ac3cf12df962b67e23fd15a2ee2932afe5"}, - {file = "psycopg_binary-3.2.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:788ffc43d7517c13e624c83e0e553b7b8823c9655e18296566d36a829bfb373f"}, - {file = "psycopg_binary-3.2.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:21927f41c4d722ae8eb30d62a6ce732c398eac230509af5ba1749a337f8a63e2"}, - {file = "psycopg_binary-3.2.1-cp39-cp39-win_amd64.whl", hash = "sha256:921f0c7f39590763d64a619de84d1b142587acc70fd11cbb5ba8fa39786f3073"}, + {file = "psycopg_binary-3.3.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b7bfff1ca23732b488cbca3076fc11bc98d520ee122514fdb17a8e20d3338f5a"}, + {file = "psycopg_binary-3.3.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:32a6fbf8481e3a370d0d72b860d35948a693cb01281da217f7b2f307636e591a"}, + {file = "psycopg_binary-3.3.4-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:bdef84570ebbce1d42b4e7ea952d21c414c5f118ad02fee00c5625f35e134429"}, + {file = "psycopg_binary-3.3.4-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fa1cbc10768a796c96d3243656016bf4e337c81c71097270bb7b0ad6210d9765"}, + {file = "psycopg_binary-3.3.4-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cf7f73a4a792bc5db58a4b385d8a1467e8d468f7548702fb0ed1e9b7501b1c13"}, + {file = "psycopg_binary-3.3.4-cp310-cp310-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d7b4d40c153fa352ab3cca530f3a0baedf7621b2ebcbd7f084009522c21788fc"}, + {file = "psycopg_binary-3.3.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f9b1c2533af01cd7648378599f82b0b8ae32f293296e6eec5753a625bc97ef28"}, + {file = "psycopg_binary-3.3.4-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:ad3bc94054876155549fdaedf4a46d1ec69d39a5bcee377148afe498e84c4b8e"}, + {file = "psycopg_binary-3.3.4-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:eb4eed2079c01a4850bf467deacfab56d356d4225040170af03dc9958321242d"}, + {file = "psycopg_binary-3.3.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f80e3f2b5331dbbf0901bcb658056c03eeb2c1ef31d774afb0d61598b242e744"}, + {file = "psycopg_binary-3.3.4-cp310-cp310-win_amd64.whl", hash = "sha256:574ea21a9651958f1535c5a1c649c7409e9168bcbffa29a3f2f961f58b322949"}, + {file = "psycopg_binary-3.3.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:612a627d733f695b1de1f9b4bd511c15f999a5d8b915d444bbd7dd71cf3370da"}, + {file = "psycopg_binary-3.3.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:13a7f380824c35896dcac7fe0f61440f7ca49d6dc73f3c13a9a4471e6a3b302e"}, + {file = "psycopg_binary-3.3.4-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:276904e3452d6a23d474ef9a21eee19f20eed3d53ddd2576af033827e0ba0992"}, + {file = "psycopg_binary-3.3.4-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ab8cca8ef8fb1ccf5b048ae5bd78ba55b9e4b5d472e3ce5ca39ff4d2a9c249e4"}, + {file = "psycopg_binary-3.3.4-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7465bfe6087d2d5b42d4c53b9b11ca9f218e477317a4a162a10e3c19e984ba8e"}, + {file = "psycopg_binary-3.3.4-cp311-cp311-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:22cdbf5f91ef7bb91fe0c5757e1962d3127a8010256eefd9c61fcaf441802097"}, + {file = "psycopg_binary-3.3.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e2631da29253a98bd496e6c4813b24e09a4fe3fb2a9e88513305d6f8747cce95"}, + {file = "psycopg_binary-3.3.4-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:7f7668f30b9dd5163197e5cbf4e0efd54e00f0a859cc566ce56cfc31f4054839"}, + {file = "psycopg_binary-3.3.4-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:cffc3408d77a27973f33e5d909b624cce683db5fc25964b02fe0aae7886c1007"}, + {file = "psycopg_binary-3.3.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0579252a1202cd73e4da137a1426e2dae993ae44e757605344282af3a082848c"}, + {file = "psycopg_binary-3.3.4-cp311-cp311-win_amd64.whl", hash = "sha256:41f2ec0fea529832982bcb6c9415de3c86264ebe562b77a467c0fbcd7efbba8d"}, + {file = "psycopg_binary-3.3.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:5ab28a2a7649df3b72e6b674b4c190e448e8e77cf496a65bd846472048de2089"}, + {file = "psycopg_binary-3.3.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6402a9d8146cf4b3974ded3fd28a971e83dc6a0333eb7822524a3aa20b546578"}, + {file = "psycopg_binary-3.3.4-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:580ae30a5f95ccd90008ec697d3ed6a4a2047a516407ad904283fa42086936e9"}, + {file = "psycopg_binary-3.3.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e7510c37550f91a187e3660a8cc50d4b760f8c3b8b2f89ebc5698cd2c7f2c85d"}, + {file = "psycopg_binary-3.3.4-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:77df19583501ea288eaf15ac0fe7ad01e6d8091a91d5c41df5c718f307d8e31b"}, + {file = "psycopg_binary-3.3.4-cp312-cp312-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:018fbed325936da502feb546642c982dcc4b9ffdea32dfef78dbf3b7f7ad4070"}, + {file = "psycopg_binary-3.3.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:17a21953a9e5ff3a16dab692625a3676e2f101db5e40072f39dbee2250194d68"}, + {file = "psycopg_binary-3.3.4-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:eb05ee1c2b817d27c537333224c9e83c7afb86fe7296ba970990068baf819b16"}, + {file = "psycopg_binary-3.3.4-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:773d573e11f437ce0bdb95b7c18dc58390494f96d43f8b45b9760436114f7652"}, + {file = "psycopg_binary-3.3.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:71e55ccbdfae79a2ed9c6369c3008a3025817ff9d7e27b32a2d84e2a4267e66e"}, + {file = "psycopg_binary-3.3.4-cp312-cp312-win_amd64.whl", hash = "sha256:494ca54901be8cf9eb7e02c25b731f2317c378efa44f43e8f9bd0e1184ae7be4"}, + {file = "psycopg_binary-3.3.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:fbd1d4ed566895ad2d3bf4ddfd8bae90026930ddf29df3b9d91d32c8c47866a7"}, + {file = "psycopg_binary-3.3.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:75a9067e236f9b9ae3535b66fe99bddb33d39c0de10112e49b9ab11eee53dc31"}, + {file = "psycopg_binary-3.3.4-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:b56b603ebcea8aa10b46228b8410ba7f13e7c2ee54389d4d9be0927fd8ce2a70"}, + {file = "psycopg_binary-3.3.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c677c4ad433cb7150c8cd304a0769ae3bcfbe5ea0676eb53faa7b1443b16d0d3"}, + {file = "psycopg_binary-3.3.4-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:26df2717e59c0473e4465a97dfb1b7afebaa479277870fd5784d1436470db47c"}, + {file = "psycopg_binary-3.3.4-cp313-cp313-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:1dc1f79fd16bb1f3f4421417a514607539f17804d95c7ed617265369d1981cae"}, + {file = "psycopg_binary-3.3.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:136f199a407b5348b9b857c504aff60c77622a28482e7195839ce1b51238c4cc"}, + {file = "psycopg_binary-3.3.4-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:b6f5a29e9c775b9f12a1a717aa7a2c80f9e1db6f27ba44a5b59c80ac61d2ffcf"}, + {file = "psycopg_binary-3.3.4-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:ee17a2cf4943cde261adfad1bbc5bf38d6b3776d7afff74c7cabcbeaeb08c260"}, + {file = "psycopg_binary-3.3.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5c4ab71be17bdca30cb34c34c4e1496e2f5d6f20c199c12bad226070b22ef9bf"}, + {file = "psycopg_binary-3.3.4-cp313-cp313-win_amd64.whl", hash = "sha256:dbfdb9b6cc79f31104a7b162a2b921b765fcc62af6c00540a167a8de47e4ed38"}, + {file = "psycopg_binary-3.3.4-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:28b7398fdd19db3232c884fb24550bdfe951221f510e195e233299e4c9b78f97"}, + {file = "psycopg_binary-3.3.4-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:1fbaa292a3c8bb61b45df1ad3da1908ccee7cb889db9425e3557d9e34e2a4829"}, + {file = "psycopg_binary-3.3.4-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:94596f9e7633ee3f6440711d43bb70aa31cc0a46a900ab8b4201a366ace5c9e7"}, + {file = "psycopg_binary-3.3.4-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8c0056529e68dbe9184cd4019a1f3d8f3a4ead2f6fc7a5afcf27d3314edd1277"}, + {file = "psycopg_binary-3.3.4-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2c09aad7051326e7603c14e50636db9c01f78272dc54b3accff03d46370461e6"}, + {file = "psycopg_binary-3.3.4-cp314-cp314-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:514404ed543efd620c85602b747df2a23cf1241b4067199e1a66f2d2757aaa41"}, + {file = "psycopg_binary-3.3.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:46893c26858be12cc49ca4226ed6a60b4bfccadd946b3bebb783a60b38788228"}, + {file = "psycopg_binary-3.3.4-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:df1d567fc430f6df15c9fcf67d87685fc49bdb325adc0db5af1adfb2f44eb5c9"}, + {file = "psycopg_binary-3.3.4-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:6b9016b1714da4dd5ecaaa75b82098aa5a0b87854ce9b092e21c27c4ae23e014"}, + {file = "psycopg_binary-3.3.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:47c656a8a7ba6eb0cff1801a4caaa9c8bdc12d03080e273aff1c8ac39971a77e"}, + {file = "psycopg_binary-3.3.4-cp314-cp314-win_amd64.whl", hash = "sha256:c37e024c07308cd06cf3ec51bfd0e7f6157585a4d84d1bce4a7f5f7913719bf8"}, ] [[package]] name = "psycopg-pool" -version = "3.2.2" +version = "3.3.1" description = "Connection Pool for Psycopg" optional = false -python-versions = ">=3.8" +python-versions = ">=3.10" groups = ["main"] files = [ - {file = "psycopg_pool-3.2.2-py3-none-any.whl", hash = "sha256:273081d0fbfaced4f35e69200c89cb8fbddfe277c38cc86c235b90a2ec2c8153"}, - {file = "psycopg_pool-3.2.2.tar.gz", hash = "sha256:9e22c370045f6d7f2666a5ad1b0caf345f9f1912195b0b25d0d3bcc4f3a7389c"}, + {file = "psycopg_pool-3.3.1-py3-none-any.whl", hash = "sha256:2af5b432941c4c9ad5c87b3fa410aec910ec8f7c122855897983a06c45f2e4b5"}, + {file = "psycopg_pool-3.3.1.tar.gz", hash = "sha256:b10b10b7a175d5cc1592147dc5b7eec8a9e0834eb3ed2c4a92c858e2f51eb63c"}, ] [package.dependencies] -typing-extensions = ">=4.4" +typing-extensions = ">=4.6" + +[package.extras] +test = ["anyio (>=4.0)", "mypy (>=1.14)", "pproxy (>=2.7)", "pytest (>=6.2.5)", "pytest-cov (>=3.0)", "pytest-randomly (>=3.5)"] [[package]] name = "pycodestyle" @@ -408,26 +420,42 @@ files = [ {file = "pyflakes-3.1.0.tar.gz", hash = "sha256:a0aae034c444db0071aa077972ba4768d40c830d9539fd45bf4cd3f8f6992efc"}, ] +[[package]] +name = "pygments" +version = "2.20.0" +description = "Pygments is a syntax highlighting package written in Python." +optional = false +python-versions = ">=3.9" +groups = ["dev"] +files = [ + {file = "pygments-2.20.0-py3-none-any.whl", hash = "sha256:81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176"}, + {file = "pygments-2.20.0.tar.gz", hash = "sha256:6757cd03768053ff99f3039c1a36d6c0aa0b263438fcab17520b30a303a82b5f"}, +] + +[package.extras] +windows-terminal = ["colorama (>=0.4.6)"] + [[package]] name = "pytest" -version = "8.3.2" +version = "8.4.2" description = "pytest: simple powerful testing with Python" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" groups = ["dev"] files = [ - {file = "pytest-8.3.2-py3-none-any.whl", hash = "sha256:4ba08f9ae7dcf84ded419494d229b48d0903ea6407b030eaec46df5e6a73bba5"}, - {file = "pytest-8.3.2.tar.gz", hash = "sha256:c132345d12ce551242c87269de812483f5bcc87cdbb4722e48487ba194f9fdce"}, + {file = "pytest-8.4.2-py3-none-any.whl", hash = "sha256:872f880de3fc3a5bdc88a11b39c9710c3497a547cfa9320bc3c5e62fbf272e79"}, + {file = "pytest-8.4.2.tar.gz", hash = "sha256:86c0d0b93306b961d58d62a4db4879f27fe25513d4b969df351abdddb3c30e01"}, ] [package.dependencies] -colorama = {version = "*", markers = "sys_platform == \"win32\""} -iniconfig = "*" -packaging = "*" +colorama = {version = ">=0.4", markers = "sys_platform == \"win32\""} +iniconfig = ">=1" +packaging = ">=20" pluggy = ">=1.5,<2" +pygments = ">=2.7.2" [package.extras] -dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] +dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "requests", "setuptools", "xmlschema"] [[package]] name = "python-dateutil" @@ -446,14 +474,14 @@ six = ">=1.5" [[package]] name = "python-dotenv" -version = "1.0.1" +version = "1.2.2" description = "Read key-value pairs from a .env file and set them as environment variables" optional = false -python-versions = ">=3.8" +python-versions = ">=3.10" groups = ["main"] files = [ - {file = "python-dotenv-1.0.1.tar.gz", hash = "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca"}, - {file = "python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a"}, + {file = "python_dotenv-1.2.2-py3-none-any.whl", hash = "sha256:1d8214789a24de455a8b8bd8ae6fe3c6b69a5e3d64aa8a8e5d68e694bbcb285a"}, + {file = "python_dotenv-1.2.2.tar.gz", hash = "sha256:2c371a91fbd7ba082c2c1dc1f8bf89ca22564a087c2c287cd9b662adde799cf3"}, ] [package.extras] @@ -461,135 +489,146 @@ cli = ["click (>=5.0)"] [[package]] name = "six" -version = "1.16.0" +version = "1.17.0" description = "Python 2 and 3 compatibility utilities" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" groups = ["main"] files = [ - {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, - {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, + {file = "six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274"}, + {file = "six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"}, ] [[package]] name = "sqlparse" -version = "0.5.1" +version = "0.5.5" description = "A non-validating SQL parser." optional = false python-versions = ">=3.8" groups = ["main"] files = [ - {file = "sqlparse-0.5.1-py3-none-any.whl", hash = "sha256:773dcbf9a5ab44a090f3441e2180efe2560220203dc2f8c0b0fa141e18b505e4"}, - {file = "sqlparse-0.5.1.tar.gz", hash = "sha256:bb6b4df465655ef332548e24f08e205afc81b9ab86cb1c45657a7ff173a3a00e"}, + {file = "sqlparse-0.5.5-py3-none-any.whl", hash = "sha256:12a08b3bf3eec877c519589833aed092e2444e68240a3577e8e26148acc7b1ba"}, + {file = "sqlparse-0.5.5.tar.gz", hash = "sha256:e20d4a9b0b8585fdf63b10d30066c7c94c5d7a7ec47c889a2d83a3caa93ff28e"}, ] [package.extras] -dev = ["build", "hatch"] +dev = ["build"] doc = ["sphinx"] [[package]] name = "typing-extensions" -version = "4.12.2" -description = "Backported and Experimental Type Hints for Python 3.8+" +version = "4.15.0" +description = "Backported and Experimental Type Hints for Python 3.9+" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" groups = ["main"] files = [ - {file = "typing_extensions-4.12.2-py3-none-any.whl", hash = "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d"}, - {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, + {file = "typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548"}, + {file = "typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466"}, ] [[package]] name = "tzdata" -version = "2024.1" +version = "2026.2" description = "Provider of IANA time zone data" optional = false python-versions = ">=2" groups = ["main"] markers = "sys_platform == \"win32\"" files = [ - {file = "tzdata-2024.1-py2.py3-none-any.whl", hash = "sha256:9068bc196136463f5245e51efda838afa15aaeca9903f49050dfa2679db4d252"}, - {file = "tzdata-2024.1.tar.gz", hash = "sha256:2674120f8d891909751c38abcdfd386ac0a5a1127954fbc332af6b5ceae07efd"}, + {file = "tzdata-2026.2-py2.py3-none-any.whl", hash = "sha256:bbe9af844f658da81a5f95019480da3a89415801f6cc966806612cc7169bffe7"}, + {file = "tzdata-2026.2.tar.gz", hash = "sha256:9173fde7d80d9018e02a662e168e5a2d04f87c41ea174b139fbef642eda62d10"}, ] [[package]] name = "wrapt" -version = "1.16.0" +version = "1.17.3" description = "Module for decorators, wrappers and monkey patching." optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" groups = ["dev"] files = [ - {file = "wrapt-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ffa565331890b90056c01db69c0fe634a776f8019c143a5ae265f9c6bc4bd6d4"}, - {file = "wrapt-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e4fdb9275308292e880dcbeb12546df7f3e0f96c6b41197e0cf37d2826359020"}, - {file = "wrapt-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb2dee3874a500de01c93d5c71415fcaef1d858370d405824783e7a8ef5db440"}, - {file = "wrapt-1.16.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2a88e6010048489cda82b1326889ec075a8c856c2e6a256072b28eaee3ccf487"}, - {file = "wrapt-1.16.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ac83a914ebaf589b69f7d0a1277602ff494e21f4c2f743313414378f8f50a4cf"}, - {file = "wrapt-1.16.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:73aa7d98215d39b8455f103de64391cb79dfcad601701a3aa0dddacf74911d72"}, - {file = "wrapt-1.16.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:807cc8543a477ab7422f1120a217054f958a66ef7314f76dd9e77d3f02cdccd0"}, - {file = "wrapt-1.16.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bf5703fdeb350e36885f2875d853ce13172ae281c56e509f4e6eca049bdfb136"}, - {file = "wrapt-1.16.0-cp310-cp310-win32.whl", hash = "sha256:f6b2d0c6703c988d334f297aa5df18c45e97b0af3679bb75059e0e0bd8b1069d"}, - {file = "wrapt-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:decbfa2f618fa8ed81c95ee18a387ff973143c656ef800c9f24fb7e9c16054e2"}, - {file = "wrapt-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1a5db485fe2de4403f13fafdc231b0dbae5eca4359232d2efc79025527375b09"}, - {file = "wrapt-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:75ea7d0ee2a15733684badb16de6794894ed9c55aa5e9903260922f0482e687d"}, - {file = "wrapt-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a452f9ca3e3267cd4d0fcf2edd0d035b1934ac2bd7e0e57ac91ad6b95c0c6389"}, - {file = "wrapt-1.16.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:43aa59eadec7890d9958748db829df269f0368521ba6dc68cc172d5d03ed8060"}, - {file = "wrapt-1.16.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72554a23c78a8e7aa02abbd699d129eead8b147a23c56e08d08dfc29cfdddca1"}, - {file = "wrapt-1.16.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d2efee35b4b0a347e0d99d28e884dfd82797852d62fcd7ebdeee26f3ceb72cf3"}, - {file = "wrapt-1.16.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:6dcfcffe73710be01d90cae08c3e548d90932d37b39ef83969ae135d36ef3956"}, - {file = "wrapt-1.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:eb6e651000a19c96f452c85132811d25e9264d836951022d6e81df2fff38337d"}, - {file = "wrapt-1.16.0-cp311-cp311-win32.whl", hash = "sha256:66027d667efe95cc4fa945af59f92c5a02c6f5bb6012bff9e60542c74c75c362"}, - {file = "wrapt-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:aefbc4cb0a54f91af643660a0a150ce2c090d3652cf4052a5397fb2de549cd89"}, - {file = "wrapt-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5eb404d89131ec9b4f748fa5cfb5346802e5ee8836f57d516576e61f304f3b7b"}, - {file = "wrapt-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9090c9e676d5236a6948330e83cb89969f433b1943a558968f659ead07cb3b36"}, - {file = "wrapt-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94265b00870aa407bd0cbcfd536f17ecde43b94fb8d228560a1e9d3041462d73"}, - {file = "wrapt-1.16.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f2058f813d4f2b5e3a9eb2eb3faf8f1d99b81c3e51aeda4b168406443e8ba809"}, - {file = "wrapt-1.16.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:98b5e1f498a8ca1858a1cdbffb023bfd954da4e3fa2c0cb5853d40014557248b"}, - {file = "wrapt-1.16.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:14d7dc606219cdd7405133c713f2c218d4252f2a469003f8c46bb92d5d095d81"}, - {file = "wrapt-1.16.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:49aac49dc4782cb04f58986e81ea0b4768e4ff197b57324dcbd7699c5dfb40b9"}, - {file = "wrapt-1.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:418abb18146475c310d7a6dc71143d6f7adec5b004ac9ce08dc7a34e2babdc5c"}, - {file = "wrapt-1.16.0-cp312-cp312-win32.whl", hash = "sha256:685f568fa5e627e93f3b52fda002c7ed2fa1800b50ce51f6ed1d572d8ab3e7fc"}, - {file = "wrapt-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:dcdba5c86e368442528f7060039eda390cc4091bfd1dca41e8046af7c910dda8"}, - {file = "wrapt-1.16.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:d462f28826f4657968ae51d2181a074dfe03c200d6131690b7d65d55b0f360f8"}, - {file = "wrapt-1.16.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a33a747400b94b6d6b8a165e4480264a64a78c8a4c734b62136062e9a248dd39"}, - {file = "wrapt-1.16.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b3646eefa23daeba62643a58aac816945cadc0afaf21800a1421eeba5f6cfb9c"}, - {file = "wrapt-1.16.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ebf019be5c09d400cf7b024aa52b1f3aeebeff51550d007e92c3c1c4afc2a40"}, - {file = "wrapt-1.16.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:0d2691979e93d06a95a26257adb7bfd0c93818e89b1406f5a28f36e0d8c1e1fc"}, - {file = "wrapt-1.16.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:1acd723ee2a8826f3d53910255643e33673e1d11db84ce5880675954183ec47e"}, - {file = "wrapt-1.16.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:bc57efac2da352a51cc4658878a68d2b1b67dbe9d33c36cb826ca449d80a8465"}, - {file = "wrapt-1.16.0-cp36-cp36m-win32.whl", hash = "sha256:da4813f751142436b075ed7aa012a8778aa43a99f7b36afe9b742d3ed8bdc95e"}, - {file = "wrapt-1.16.0-cp36-cp36m-win_amd64.whl", hash = "sha256:6f6eac2360f2d543cc875a0e5efd413b6cbd483cb3ad7ebf888884a6e0d2e966"}, - {file = "wrapt-1.16.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a0ea261ce52b5952bf669684a251a66df239ec6d441ccb59ec7afa882265d593"}, - {file = "wrapt-1.16.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7bd2d7ff69a2cac767fbf7a2b206add2e9a210e57947dd7ce03e25d03d2de292"}, - {file = "wrapt-1.16.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9159485323798c8dc530a224bd3ffcf76659319ccc7bbd52e01e73bd0241a0c5"}, - {file = "wrapt-1.16.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a86373cf37cd7764f2201b76496aba58a52e76dedfaa698ef9e9688bfd9e41cf"}, - {file = "wrapt-1.16.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:73870c364c11f03ed072dda68ff7aea6d2a3a5c3fe250d917a429c7432e15228"}, - {file = "wrapt-1.16.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:b935ae30c6e7400022b50f8d359c03ed233d45b725cfdd299462f41ee5ffba6f"}, - {file = "wrapt-1.16.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:db98ad84a55eb09b3c32a96c576476777e87c520a34e2519d3e59c44710c002c"}, - {file = "wrapt-1.16.0-cp37-cp37m-win32.whl", hash = "sha256:9153ed35fc5e4fa3b2fe97bddaa7cbec0ed22412b85bcdaf54aeba92ea37428c"}, - {file = "wrapt-1.16.0-cp37-cp37m-win_amd64.whl", hash = "sha256:66dfbaa7cfa3eb707bbfcd46dab2bc6207b005cbc9caa2199bcbc81d95071a00"}, - {file = "wrapt-1.16.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1dd50a2696ff89f57bd8847647a1c363b687d3d796dc30d4dd4a9d1689a706f0"}, - {file = "wrapt-1.16.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:44a2754372e32ab315734c6c73b24351d06e77ffff6ae27d2ecf14cf3d229202"}, - {file = "wrapt-1.16.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e9723528b9f787dc59168369e42ae1c3b0d3fadb2f1a71de14531d321ee05b0"}, - {file = "wrapt-1.16.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dbed418ba5c3dce92619656802cc5355cb679e58d0d89b50f116e4a9d5a9603e"}, - {file = "wrapt-1.16.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:941988b89b4fd6b41c3f0bfb20e92bd23746579736b7343283297c4c8cbae68f"}, - {file = "wrapt-1.16.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6a42cd0cfa8ffc1915aef79cb4284f6383d8a3e9dcca70c445dcfdd639d51267"}, - {file = "wrapt-1.16.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:1ca9b6085e4f866bd584fb135a041bfc32cab916e69f714a7d1d397f8c4891ca"}, - {file = "wrapt-1.16.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d5e49454f19ef621089e204f862388d29e6e8d8b162efce05208913dde5b9ad6"}, - {file = "wrapt-1.16.0-cp38-cp38-win32.whl", hash = "sha256:c31f72b1b6624c9d863fc095da460802f43a7c6868c5dda140f51da24fd47d7b"}, - {file = "wrapt-1.16.0-cp38-cp38-win_amd64.whl", hash = "sha256:490b0ee15c1a55be9c1bd8609b8cecd60e325f0575fc98f50058eae366e01f41"}, - {file = "wrapt-1.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9b201ae332c3637a42f02d1045e1d0cccfdc41f1f2f801dafbaa7e9b4797bfc2"}, - {file = "wrapt-1.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2076fad65c6736184e77d7d4729b63a6d1ae0b70da4868adeec40989858eb3fb"}, - {file = "wrapt-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c5cd603b575ebceca7da5a3a251e69561bec509e0b46e4993e1cac402b7247b8"}, - {file = "wrapt-1.16.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b47cfad9e9bbbed2339081f4e346c93ecd7ab504299403320bf85f7f85c7d46c"}, - {file = "wrapt-1.16.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8212564d49c50eb4565e502814f694e240c55551a5f1bc841d4fcaabb0a9b8a"}, - {file = "wrapt-1.16.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:5f15814a33e42b04e3de432e573aa557f9f0f56458745c2074952f564c50e664"}, - {file = "wrapt-1.16.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:db2e408d983b0e61e238cf579c09ef7020560441906ca990fe8412153e3b291f"}, - {file = "wrapt-1.16.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:edfad1d29c73f9b863ebe7082ae9321374ccb10879eeabc84ba3b69f2579d537"}, - {file = "wrapt-1.16.0-cp39-cp39-win32.whl", hash = "sha256:ed867c42c268f876097248e05b6117a65bcd1e63b779e916fe2e33cd6fd0d3c3"}, - {file = "wrapt-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:eb1b046be06b0fce7249f1d025cd359b4b80fc1c3e24ad9eca33e0dcdb2e4a35"}, - {file = "wrapt-1.16.0-py3-none-any.whl", hash = "sha256:6906c4100a8fcbf2fa735f6059214bb13b97f75b1a61777fcf6432121ef12ef1"}, - {file = "wrapt-1.16.0.tar.gz", hash = "sha256:5f370f952971e7d17c7d1ead40e49f32345a7f7a5373571ef44d800d06b1899d"}, + {file = "wrapt-1.17.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:88bbae4d40d5a46142e70d58bf664a89b6b4befaea7b2ecc14e03cedb8e06c04"}, + {file = "wrapt-1.17.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e6b13af258d6a9ad602d57d889f83b9d5543acd471eee12eb51f5b01f8eb1bc2"}, + {file = "wrapt-1.17.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd341868a4b6714a5962c1af0bd44f7c404ef78720c7de4892901e540417111c"}, + {file = "wrapt-1.17.3-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:f9b2601381be482f70e5d1051a5965c25fb3625455a2bf520b5a077b22afb775"}, + {file = "wrapt-1.17.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:343e44b2a8e60e06a7e0d29c1671a0d9951f59174f3709962b5143f60a2a98bd"}, + {file = "wrapt-1.17.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:33486899acd2d7d3066156b03465b949da3fd41a5da6e394ec49d271baefcf05"}, + {file = "wrapt-1.17.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e6f40a8aa5a92f150bdb3e1c44b7e98fb7113955b2e5394122fa5532fec4b418"}, + {file = "wrapt-1.17.3-cp310-cp310-win32.whl", hash = "sha256:a36692b8491d30a8c75f1dfee65bef119d6f39ea84ee04d9f9311f83c5ad9390"}, + {file = "wrapt-1.17.3-cp310-cp310-win_amd64.whl", hash = "sha256:afd964fd43b10c12213574db492cb8f73b2f0826c8df07a68288f8f19af2ebe6"}, + {file = "wrapt-1.17.3-cp310-cp310-win_arm64.whl", hash = "sha256:af338aa93554be859173c39c85243970dc6a289fa907402289eeae7543e1ae18"}, + {file = "wrapt-1.17.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:273a736c4645e63ac582c60a56b0acb529ef07f78e08dc6bfadf6a46b19c0da7"}, + {file = "wrapt-1.17.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5531d911795e3f935a9c23eb1c8c03c211661a5060aab167065896bbf62a5f85"}, + {file = "wrapt-1.17.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0610b46293c59a3adbae3dee552b648b984176f8562ee0dba099a56cfbe4df1f"}, + {file = "wrapt-1.17.3-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:b32888aad8b6e68f83a8fdccbf3165f5469702a7544472bdf41f582970ed3311"}, + {file = "wrapt-1.17.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8cccf4f81371f257440c88faed6b74f1053eef90807b77e31ca057b2db74edb1"}, + {file = "wrapt-1.17.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d8a210b158a34164de8bb68b0e7780041a903d7b00c87e906fb69928bf7890d5"}, + {file = "wrapt-1.17.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:79573c24a46ce11aab457b472efd8d125e5a51da2d1d24387666cd85f54c05b2"}, + {file = "wrapt-1.17.3-cp311-cp311-win32.whl", hash = "sha256:c31eebe420a9a5d2887b13000b043ff6ca27c452a9a22fa71f35f118e8d4bf89"}, + {file = "wrapt-1.17.3-cp311-cp311-win_amd64.whl", hash = "sha256:0b1831115c97f0663cb77aa27d381237e73ad4f721391a9bfb2fe8bc25fa6e77"}, + {file = "wrapt-1.17.3-cp311-cp311-win_arm64.whl", hash = "sha256:5a7b3c1ee8265eb4c8f1b7d29943f195c00673f5ab60c192eba2d4a7eae5f46a"}, + {file = "wrapt-1.17.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:ab232e7fdb44cdfbf55fc3afa31bcdb0d8980b9b95c38b6405df2acb672af0e0"}, + {file = "wrapt-1.17.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:9baa544e6acc91130e926e8c802a17f3b16fbea0fd441b5a60f5cf2cc5c3deba"}, + {file = "wrapt-1.17.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6b538e31eca1a7ea4605e44f81a48aa24c4632a277431a6ed3f328835901f4fd"}, + {file = "wrapt-1.17.3-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:042ec3bb8f319c147b1301f2393bc19dba6e176b7da446853406d041c36c7828"}, + {file = "wrapt-1.17.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3af60380ba0b7b5aeb329bc4e402acd25bd877e98b3727b0135cb5c2efdaefe9"}, + {file = "wrapt-1.17.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0b02e424deef65c9f7326d8c19220a2c9040c51dc165cddb732f16198c168396"}, + {file = "wrapt-1.17.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:74afa28374a3c3a11b3b5e5fca0ae03bef8450d6aa3ab3a1e2c30e3a75d023dc"}, + {file = "wrapt-1.17.3-cp312-cp312-win32.whl", hash = "sha256:4da9f45279fff3543c371d5ababc57a0384f70be244de7759c85a7f989cb4ebe"}, + {file = "wrapt-1.17.3-cp312-cp312-win_amd64.whl", hash = "sha256:e71d5c6ebac14875668a1e90baf2ea0ef5b7ac7918355850c0908ae82bcb297c"}, + {file = "wrapt-1.17.3-cp312-cp312-win_arm64.whl", hash = "sha256:604d076c55e2fdd4c1c03d06dc1a31b95130010517b5019db15365ec4a405fc6"}, + {file = "wrapt-1.17.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a47681378a0439215912ef542c45a783484d4dd82bac412b71e59cf9c0e1cea0"}, + {file = "wrapt-1.17.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:54a30837587c6ee3cd1a4d1c2ec5d24e77984d44e2f34547e2323ddb4e22eb77"}, + {file = "wrapt-1.17.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:16ecf15d6af39246fe33e507105d67e4b81d8f8d2c6598ff7e3ca1b8a37213f7"}, + {file = "wrapt-1.17.3-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:6fd1ad24dc235e4ab88cda009e19bf347aabb975e44fd5c2fb22a3f6e4141277"}, + {file = "wrapt-1.17.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0ed61b7c2d49cee3c027372df5809a59d60cf1b6c2f81ee980a091f3afed6a2d"}, + {file = "wrapt-1.17.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:423ed5420ad5f5529db9ce89eac09c8a2f97da18eb1c870237e84c5a5c2d60aa"}, + {file = "wrapt-1.17.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e01375f275f010fcbf7f643b4279896d04e571889b8a5b3f848423d91bf07050"}, + {file = "wrapt-1.17.3-cp313-cp313-win32.whl", hash = "sha256:53e5e39ff71b3fc484df8a522c933ea2b7cdd0d5d15ae82e5b23fde87d44cbd8"}, + {file = "wrapt-1.17.3-cp313-cp313-win_amd64.whl", hash = "sha256:1f0b2f40cf341ee8cc1a97d51ff50dddb9fcc73241b9143ec74b30fc4f44f6cb"}, + {file = "wrapt-1.17.3-cp313-cp313-win_arm64.whl", hash = "sha256:7425ac3c54430f5fc5e7b6f41d41e704db073309acfc09305816bc6a0b26bb16"}, + {file = "wrapt-1.17.3-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:cf30f6e3c077c8e6a9a7809c94551203c8843e74ba0c960f4a98cd80d4665d39"}, + {file = "wrapt-1.17.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:e228514a06843cae89621384cfe3a80418f3c04aadf8a3b14e46a7be704e4235"}, + {file = "wrapt-1.17.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:5ea5eb3c0c071862997d6f3e02af1d055f381b1d25b286b9d6644b79db77657c"}, + {file = "wrapt-1.17.3-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:281262213373b6d5e4bb4353bc36d1ba4084e6d6b5d242863721ef2bf2c2930b"}, + {file = "wrapt-1.17.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:dc4a8d2b25efb6681ecacad42fca8859f88092d8732b170de6a5dddd80a1c8fa"}, + {file = "wrapt-1.17.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:373342dd05b1d07d752cecbec0c41817231f29f3a89aa8b8843f7b95992ed0c7"}, + {file = "wrapt-1.17.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:d40770d7c0fd5cbed9d84b2c3f2e156431a12c9a37dc6284060fb4bec0b7ffd4"}, + {file = "wrapt-1.17.3-cp314-cp314-win32.whl", hash = "sha256:fbd3c8319de8e1dc79d346929cd71d523622da527cca14e0c1d257e31c2b8b10"}, + {file = "wrapt-1.17.3-cp314-cp314-win_amd64.whl", hash = "sha256:e1a4120ae5705f673727d3253de3ed0e016f7cd78dc463db1b31e2463e1f3cf6"}, + {file = "wrapt-1.17.3-cp314-cp314-win_arm64.whl", hash = "sha256:507553480670cab08a800b9463bdb881b2edeed77dc677b0a5915e6106e91a58"}, + {file = "wrapt-1.17.3-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:ed7c635ae45cfbc1a7371f708727bf74690daedc49b4dba310590ca0bd28aa8a"}, + {file = "wrapt-1.17.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:249f88ed15503f6492a71f01442abddd73856a0032ae860de6d75ca62eed8067"}, + {file = "wrapt-1.17.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:5a03a38adec8066d5a37bea22f2ba6bbf39fcdefbe2d91419ab864c3fb515454"}, + {file = "wrapt-1.17.3-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:5d4478d72eb61c36e5b446e375bbc49ed002430d17cdec3cecb36993398e1a9e"}, + {file = "wrapt-1.17.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:223db574bb38637e8230eb14b185565023ab624474df94d2af18f1cdb625216f"}, + {file = "wrapt-1.17.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e405adefb53a435f01efa7ccdec012c016b5a1d3f35459990afc39b6be4d5056"}, + {file = "wrapt-1.17.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:88547535b787a6c9ce4086917b6e1d291aa8ed914fdd3a838b3539dc95c12804"}, + {file = "wrapt-1.17.3-cp314-cp314t-win32.whl", hash = "sha256:41b1d2bc74c2cac6f9074df52b2efbef2b30bdfe5f40cb78f8ca22963bc62977"}, + {file = "wrapt-1.17.3-cp314-cp314t-win_amd64.whl", hash = "sha256:73d496de46cd2cdbdbcce4ae4bcdb4afb6a11234a1df9c085249d55166b95116"}, + {file = "wrapt-1.17.3-cp314-cp314t-win_arm64.whl", hash = "sha256:f38e60678850c42461d4202739f9bf1e3a737c7ad283638251e79cc49effb6b6"}, + {file = "wrapt-1.17.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:70d86fa5197b8947a2fa70260b48e400bf2ccacdcab97bb7de47e3d1e6312225"}, + {file = "wrapt-1.17.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:df7d30371a2accfe4013e90445f6388c570f103d61019b6b7c57e0265250072a"}, + {file = "wrapt-1.17.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:caea3e9c79d5f0d2c6d9ab96111601797ea5da8e6d0723f77eabb0d4068d2b2f"}, + {file = "wrapt-1.17.3-cp38-cp38-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:758895b01d546812d1f42204bd443b8c433c44d090248bf22689df673ccafe00"}, + {file = "wrapt-1.17.3-cp38-cp38-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:02b551d101f31694fc785e58e0720ef7d9a10c4e62c1c9358ce6f63f23e30a56"}, + {file = "wrapt-1.17.3-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:656873859b3b50eeebe6db8b1455e99d90c26ab058db8e427046dbc35c3140a5"}, + {file = "wrapt-1.17.3-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:a9a2203361a6e6404f80b99234fe7fb37d1fc73487b5a78dc1aa5b97201e0f22"}, + {file = "wrapt-1.17.3-cp38-cp38-win32.whl", hash = "sha256:55cbbc356c2842f39bcc553cf695932e8b30e30e797f961860afb308e6b1bb7c"}, + {file = "wrapt-1.17.3-cp38-cp38-win_amd64.whl", hash = "sha256:ad85e269fe54d506b240d2d7b9f5f2057c2aa9a2ea5b32c66f8902f768117ed2"}, + {file = "wrapt-1.17.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:30ce38e66630599e1193798285706903110d4f057aab3168a34b7fdc85569afc"}, + {file = "wrapt-1.17.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:65d1d00fbfb3ea5f20add88bbc0f815150dbbde3b026e6c24759466c8b5a9ef9"}, + {file = "wrapt-1.17.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a7c06742645f914f26c7f1fa47b8bc4c91d222f76ee20116c43d5ef0912bba2d"}, + {file = "wrapt-1.17.3-cp39-cp39-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:7e18f01b0c3e4a07fe6dfdb00e29049ba17eadbc5e7609a2a3a4af83ab7d710a"}, + {file = "wrapt-1.17.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0f5f51a6466667a5a356e6381d362d259125b57f059103dd9fdc8c0cf1d14139"}, + {file = "wrapt-1.17.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:59923aa12d0157f6b82d686c3fd8e1166fa8cdfb3e17b42ce3b6147ff81528df"}, + {file = "wrapt-1.17.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:46acc57b331e0b3bcb3e1ca3b421d65637915cfcd65eb783cb2f78a511193f9b"}, + {file = "wrapt-1.17.3-cp39-cp39-win32.whl", hash = "sha256:3e62d15d3cfa26e3d0788094de7b64efa75f3a53875cdbccdf78547aed547a81"}, + {file = "wrapt-1.17.3-cp39-cp39-win_amd64.whl", hash = "sha256:1f23fa283f51c890eda8e34e4937079114c74b4c81d2b2f1f1d94948f5cc3d7f"}, + {file = "wrapt-1.17.3-cp39-cp39-win_arm64.whl", hash = "sha256:24c2ed34dc222ed754247a2702b1e1e89fdbaa4016f324b4b8f1a802d4ffe87f"}, + {file = "wrapt-1.17.3-py3-none-any.whl", hash = "sha256:7171ae35d2c33d326ac19dd8facb1e82e5fd04ef8c6c0e394d7af55a55051c22"}, + {file = "wrapt-1.17.3.tar.gz", hash = "sha256:f66eb08feaa410fe4eebd17f2a2c8e2e46d3476e9f8c783daa8e09e0faa666d0"}, ] [metadata] From 8bb8671b86bb12b648ebe5c92271810b690fa604 Mon Sep 17 00:00:00 2001 From: bawn Date: Mon, 29 Jun 2026 22:29:09 +0800 Subject: [PATCH 02/30] Add news page and featured card components --- client/public/cover-test.jpg | Bin 0 -> 72421 bytes client/src/pages/index.tsx | 11 +++++- client/src/pages/news/featured-card.tsx | 41 +++++++++++++++++++++ client/src/pages/news/index.tsx | 11 ++++++ client/src/pages/news/news-hero.tsx | 20 ++++++++++ server/api/news/admin.py | 3 ++ server/api/news/migrations/0001_initial.py | 34 +++++++++++++++++ 7 files changed, 118 insertions(+), 2 deletions(-) create mode 100644 client/public/cover-test.jpg create mode 100644 client/src/pages/news/featured-card.tsx create mode 100644 client/src/pages/news/index.tsx create mode 100644 client/src/pages/news/news-hero.tsx create mode 100644 server/api/news/migrations/0001_initial.py diff --git a/client/public/cover-test.jpg b/client/public/cover-test.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8d4630db98669392eba5c85e9a815c83696a852a GIT binary patch literal 72421 zcmb@tcUV(jvp*U@q=|q?5h)5NNJOM}q9R2Qks5lWNbfa3ASzM>LPP|mgLEm8-a+Yz z^d5Sz0YV9Z1i112p7*@xKKGA%p5OBuvUfgvn3=t2t-bc1nYD5;aj^hcRDn9!0svZC z03iSXKn7kgIXe`-3n2ekPknwN6=);E@WdE_4 zLH=)xzKC^h{Y9@={k@_1SY302%45-qu1!hdc3&;R@{ zFs-$_r#DHCNZQ0~UVB-S8si}eJNbFLllWvQBz)b<>0kKAU+k%`t4!jzk?>W!fAGj( zZ1oRb{);_HPLN~{|H|9_3zJj-#a91d&cE3EHT3U!0m^Rf{+u z1D$`hFB$8f|M32EB5NN{-~T!yBNqn%{{N2uV!nV|GC0{ zHxcPNFHv5mqNbsxV+4?sQBaUyqM)R_L>j7OL4OCwRJ76 zZS5VMUERNjhDS!n#wRAx3yVw3E30ek8=KhugTo`-G5+L~G}8ZZhqV94qyOO#6UiU) zOP44vQT_FYjNFg3Q7~Piye)e9+G8CmOAlsVvA5LMpTuUC{-WU%*WF{W@*JdP<(F8v zgZ=B$zdZWiIrQ%T$fN&u=)e8BKm)E&kdZo!f(ZZuoV#7}5z6f3H0T#f<3&v~{Qhkv z_xU!a-Hb`EO`lB7GVdFs<68V-h8j`>5Mr4_-I`-+(9fwyMCAYsuC(T8M9+L5pKJ&H z?xbKb%XnHcD(J@@FV-g7ac>qf6!TKeAb0cCeJ2m|*SU37oq+MLug>)^0J9t`Y20FR zOCLNYjy7OVJ05mtJt68>_fftlH9-e zDW8vjQwZfq)%tHJ%dBzuRhC|8{Cf5_(&Y0FVj|1~YUxvf#@KIP+pDKce3vtF=UoaD@^i~l`3%HWM^9LWO*N#(#i?)B zu%KuC%9bJJXXtZdG8%Q)%gB^#?6 z9wvtq*^+(?-)n0NGEd(mMjkn6SYWIN&aoiFVVu9~_&&A3%H>9pHj_u7I+o6P2cqG6 z=jWuQmo=5_cN=!wiG$`Si@zzx;XcT#m*4R z(Y~+zt3=@C7;HN+aQG=-;+We`aKDAlcgVEcuaaGpQB3JFIC)dNXtcptO!W@t7hh5j zVq7-6spirvLm_!?wd>T|!gg!qjZ{x$0poE~>YJ1Se&M^kA#RBqkGOj*bEnsG0`9(} zZ|*Tm53h{%a5*fAp?`FL*3YrG&Hj|9)plune%#B!!~H6-2X=drni!tgaXrAx;w}AI zMQK!x8Fs|*8d&NBy4MYtY;tnY`GxPr1ps1!ya3Qtr8|k1C*tBPq_N`Qvf7i|E^|`o zeAS=+K4aheLJey(0|~vw>eY_r&JrKdK~-Bc?cRLMlS<56gGO67AK0{vPssUZ;fUjF z=OJfVd0RZTRmkIX&!)1yzD&u_w|6FDfN9@^?jM>z)^I{ONQ}qX>A?kn5x=IQ2|CmZKj#ggorf>TRbK$o zwoVMcUy1R$7&wQ*kdDxIl?{>5aCEa*>51{@TLlV{V~l}%?~O1jZ#oHzJa)zDLP(*n z?6WEgPg^P*zAJnOWUZt>);0>Sv|uC*omd>1W#~^H=Ir-p6wVrm#Hk6gG$a(X3BNUL zNcyVMu6~1;wX2XG^Z-Iv~=>3VGB5+K&vRG_|O!WpTRo^<{oUq5}&kmE+&mJX88;4pA!<+(p9GLsoQ|vkxewQm1}yC( zFIzOqZ=dTI;1^-u`9+AnsdCI@nr0kmA(=Pri&7bSaQ;Z#EPh>hu)@(>Zp7Itm-*ua zMt|`0TlEPl-Wqdp{a)zKkD9wBcjjI=eLaYf6ioe6P-2)kkR(sN>(QBG-wKuaRl+Nu zK>SYhyH8~joA$*n->Ry)qO{!~k$SFVSls2NzV0AF63Y z@h0gJEV;oURi6S(N@h(wEcsAy#ls>o$I<9#Kg)pIL@w|6JP;~gnY6tV(WI0>|LJd?x3Doq06uMVNk{HYKB&BsfpPlm+oJXZp;hlK zg0Bq5oP7+2JPZt|zWzRDPI(U=u1Q(@r$`aXveCR3h7Z&>I=X2?P>9WKL-7tD-HZx! zs{rfxEN<-HH=M>5yuKbhtdySL?cq}X=lmE8mR=I!-b^yDU_7ZIJQCP1LMXSH1T`mm z+MtpfEEf}f0#*23~Ehp!zm z`o}`MKD3xm>zWU`IqGh_lHasb$_3#4Cyhnd#aioFeTAs+!?9!+gG9!C6>bCP6RIKP ztyAz$_=>IHC&7IcXMbKK|I5pu{}290(D04*2}DBymE-LHFU6Oa{o*uNf`E|j>;AkU zV&U61-*t}IzD5+A*bdZNZ6>?*Cg7mYGqke!ZSEnOWj zMS)jSWorPoRmnO2Yau08jfwH;Z)8eNzBsNnm>FX0 zt4(aN0Te|sT={VM%KZ4ZjW3GgFBkQ-oytej z9>)&V_e!mswN#;-LEE^$C3pzzS5yJ-t|98Yr{G zl4QeqHA*AQR`Ii$lCAUlV<;&xC&Q^H7AWxR;iU){6D9$He2Z9g!<=Db+B5guMnB!b zyANH-8(K{`eBPkvwt!D{74nSk({UWos~XqYHi{TFh4;#$6q;!G+<`VlPt?+;6OG0= zW6fkY%rPTO9n+CL{+OjDE};n7_4{|+8o?S-!4)T!&~K2>;5+a_@pKIb>P^-&@gG)| zhf~pgl+crr6ls$~?JKh#L-&#g3~KB(Vh^dpi;o}B2hliOkz)&+)2$H#m>rmXX>GjQ zu}LYGp0Ur_*vbr5-_9=Pnu9Jl>S8{6_u6?TT z2bz$@;{ufWO=llr)F#^jug=nt5#9_2QKd^bvmyw4!kI!39cT|YOs0o_& zPsWT0xe&5g;62=*{jG;`yX=#Gy9onrJ9U|!#Ti*Cc;^^ZrH&?NCw?!m9?rvZlEK}R z&nwrGLi^J_V%ydEUsZhc=LuK<@)YK8J7A_1>mOC70qsKzTAi{v~p3}SV-UAty=di+F zwT3Y%NjZ7{2#Tb+sv4OsGnK|p@~Zh7d1yA3pPi?>Y)S6W(Ytw$11HVq&){cH?g1~U z@{Q(7b<9gr;dcjn{a<|jqb9jg_w@Ea@O84y0G9qIPQw_ubS3@MX0$BE5T_5k0^I3hUrh(IDn0a;YRJT-ZOo@4fie-DOF7}PP(<@ld4<3F0rjx}67&PbT=9^f~Qkiyd91fkh zoF?eK{lIIW_=pZVAy^VQwl8G?3_}PH-(W$pvZ}~7!ha!)C9z7?B9VR%l2k#d; zjhC8C5#v)4S3uXGO-2i%nQJ+){zW&YhL~s0rNtuGp%E)@6vp3fnG6K&^ha|8bD3_J zgI|t$q;~EV(WNteyT#J($g%!(`h`=Ur1rJgdt8MtbUBLxf-V3bp0Vqh1+7Ie`_GQ9 z9tZPr6(%%dsb_`?`0jNb$sP@Kt_0+H6qe_o6n3Sz@hJ+DUe@7NK%=(z{RSKn?S4(1 zqn5@@T&3->W0xXV$(i+}Q555}L1o4v2&}|`&ueL7-9zERvfR_XmQg}jNLwNdTu`*f z_2V}B4cz2}e7xNxI7xKXKYd1{mMYR>$E>1WuWVfWZO-5^GTc_$x773u)oocp$+A;- z$2T?JqB>3!#jLFmzWNg-jRnWdy+B@j_T%begIimgQe7CQg8;0t9V&%dCWMND8mHvdmZbm@xfs0i{U*G2azG_rO`rUi@c#_m0}hrVLYanAOx)o4BHo| zye5=j|LbrgUE{2q)PZ2_5#bBK5T8lcm!EQXeT(am9uPk@g+h9UFKNbFn{cJ21&eCd zoU=I3t?RAs=zv##oL05wZY>;Xp|@j>9aHRQ;46omM$;;aQviXK@bzxD9zxc-Fo2dZzXVJ30)AyH_Wn=)h)Zk z@NI|`tksG9h}I2?(4$D(XUO4xd{`2`t*JJVP$4e6d+StZnMY$ixUC}SgFQtW;l?>e zu)?(`a=oc%S8XzAor2LM7X4+r*Oa7|)uj}lnTWt?J3`8mCjK#%aRtJQ{ZCsgCXcZWJQhtH|=C@qJ3}M;QZM1lg?Z)k@;q7p#*-KRX!X$(&wX zi6HmAT%7zk#?h$w4g2*X`+(h6detkWaL=L)Je&ht$}o$PRl?2X1k8T%JIhj1b3B>$ zrI(fE?qF@M`{wN@m5F5eAfW`gT<2up>K+`grc*^L)(BiJW%ruMdAYLk(fhlS>t&&7 zEU_~6$6~|Aklg2}?gye66W{$552L{tQIm&3vr6&3zn#3jS>w1VeWe%T)Zjr9OJ}O((MaX5_$D%c8a5WI2YRs?w-> zjI!CnY0VOA*dc{5?(74y>Ebg!K3jdV#Ik&55froQz`QBj0H)0QGrD3Sh27VrK`5D= z)EnaaN>&AYNQJOA5OeT|_O6^^Y)enUg9@EFXk15IIbe2lxegh5=Jfl>jYUhiRU@2# zoF{ORCbev_&N{qI%z!~B{ZoZ= ztW9p0Viom3_`Y4^^XmI@z8MT=+KgSzou;_7+aC|%V+|&=D_=d#RZ|3bG48)c_0j?=Z%^Djx4Oa-?$#Lh-izScU#laa%eBY*=OPs*`pffTh)eCDa zrbx!glfhe(n}aY;0z;2tgB^Ee$|u$DYwxC@Sw^)oQ68tXTN0X$eg?Hh%0Es@BXL@M z3pPyZCD+(jB!8MEPRH}wBT#Jc`T{+z#R5D?7^!W*#Tt z!4-CqqWVL%L_|q`RwmZ3lU~zo%x0uS^^t<=i)*!TyqWd|K*>GWXTeWl^ge?IL2%(V ziw%-&(G+wsLLjKu&3#4J#krAHo%KRnHkn&RcIv=dc}{-9gfgcIg>u^qfclT-YVVPk z))|uf)ot)e)K8PM_v5TpL&-x^t(jXG2;_c&4>c%N(@mn#gJG%agGA!Z|(l7 zs?6yPncJs^s-@?(m5ZyO2hCZ%f%6a2;kNtsufNrSFy4x#klXkk9RCQYv}w@&0$|^G z(gfcH2Qx=F^k{?&!!kSPK{pXK*#sGsHMY7{%lcPRc9JWKCL-*%r;zq#7zef*N&K~- zDNrwp(}8GVHuk-$GnWWA4m|G^ERo{bpcL>FD=8J3>!j;JmQ9#G8KQolY>Znzrik{y zgQJOBcm}MjQORuTxJU#CMU{W8WOtt+DSr$1%5XBLjPe+2j5`rOTj#vJOltn822KsGx zPVJKvba2*~6Zla+1;cg+vYcc3|1AwzJ8uiJComnAeA$Mq@tiqAN_qA{rz7-yi6my$ zw%S-zFW!l8{d@p&y=X@SCYkL_kS3PbxCzg3eTlZ)RDpt{g1MnRKLbXZxUgx-N~wNi zt!iQ{3PFK}jBSG{DYqri>)t&Kx}vKd1N-n&9+SlTF|(DUK_Np;^Jj_8R=Z3@oe?k? zdz4)jaHXorS&aWJe{A{=3nzAZjqAIpQ5_WOHR7wB86FSrxegoLYsS6CS7Y4D&y4)Ku!P(+5Acy4PMAiwani{^GvB`?th!8Nz8J#3IECd zlPdsx2q#FuIPigc;w`>ON(je71s&?#I(>4@cg+XG0Gs9X6^P#ExJ!^tRgYCMo%bt$ zV&S3__O*fWcMr4hp`osY?X$H4qUf~4F>Cd;#|pt_u~Hq{JC(jlOmz>y-)Vj;ugaY0|Qh(c2e}2Yu$@`e)sKQa1?Xf;m zALft{q7dSE+7F5N3#OG;%6JYVMVtEB#U?eGz| zsJVGlWOzKw+Gx*mh1|w?bd`*z)4i%_aOOJNx`_q@&K&p%a6%0ivGV^caVwPBasGaj zLn)q9nV! zjK%u>c)|7-)f-V-1y8q?*sIcJdDV|3XT#sd4K=?EzR~}!e|`$_WDF$I6BK`PBL@Pv zGtX)9cqa$0aF}B~I+Oaj!79#z+~s!k;=HtF`Z0x7Na9OFaDhGK>KC&i+Yz@ln>f(j zo1Ea^aK;7|kNFu@Eg7@mod#6vT%})h1wx*ngl(8l5yX|efM0WjFiDDF5Rfw)q=lqH zU9oI6ctKGbkt35s-?_iWrP84tfonyKQD zCY9m(hu5a+YJnqB6SLRRCMm?C9K2+_59HYd@$yJs-ScVG=c!;Aw%2tFLhtQ%`F!bI ziNA!B&l|R}(ENV(F4p_)A^t_jIp5EsekSO(rIzYzrjDR3K2(;1{9!5{w5^H7nAom@7-&Rnd0<7kKg+Y z)zSB0KWcvMct>HE?Tk07O1`@$Ki?1755=C@zQJ2%*GLY-q)mm3#~Mz+)OHW zab?ih@h%pU<+~IKSUbD`TwSXSPz_(GNRHf;KyZWjIcbl$m{kam*fF{@VX<)wbF>p> z?*$oNj2_y(gVB8p5x^mdTRQV zwFO8yya#j$-yQ#kpVArH#;7##ty%!%YDQiSx-7SM@SU&tvoBI}iO{M_uK_b-m4eiMp2~049c?{%>7wqDlHOA1uyB%u z_;bhbH%{^NU~%ljH#NkIHD}B|YN(;Jji-_=6m}=CaRu|oQ}dmH(Na#ZHZ*H#4N*x~ zSg-6kJlVBkz;7{|5%U#A(>&^61R?9LKJT5UDDIgB>*l`~|8@K6V5c=sBg09)2~uqoCmLP|P4y#cN=`?6Ek` zC(&$!D=FGY8%duG8LB%J1zn7u>dqN=BQmtb8l_*tuzD)b!^KF+5JIP{4rCU{#IAab`b9ktN zUGZ}-57#A@WIulg_e;)VDn`Rc5yJ4n3&2V$Skp+Yd7WEyxMe3zfg@Q5s}kCpfbb*0 zV=Y{e6{cz)F2;E;(^{68BYWc6{`^UgfKbACu=brw#ks0?qIMVoC2FgA z91@@z6}Eqrv}ax)b-J}QfVVfV0*~q>M>aZ~zAMq@2++u+%zd1Fm-#Sl%iO+_zJ>M+ zf%~MxItGR2b@m7b6Ii4tV}K2itBzrRW);h+zu-gFTo$@Z6q<4C23Dux_v<-DV%1_H zI#A7p{xBaSj+TvvTI95+`(qqRb5w~EDy}|wWqe3exYf?Cx5E2q!z}JkfvQ>2R@mk2 zEU)EsawwfS_5u)5OcYEP;>(AHOsqD! zi7j3=`IObOgYHDV`>oindzx0bH*B(3l9^|W&r_{=Cb7YcVQhf-S6`*~Z|+1+uKl_I zR5XW`2>TG&b86$rfzg-ZpH%I9Cj%TVX73r~RK+?bN&cYW5c)>;lS~yrQ5lF!UJP`j z%hu_OJojACwuD?S)JWBK(3(tFEhy;xq^XScvbX@elZ8&(2Oy)oK};r+MH;rI%$#A5 zIc-)!57U0avQfECTXS#0tYhcg<%94wG)t%-+(#v_za51vSZLIpQma8UB#<@S!yV&K(?(tQrrPc0s-!DzP!xeP)gV_+# zdT@{X%}|QpL6z3W+2?z!HLnxeoB3+3?^sVrq9U#_M|q{^_|FzE-Z+wFHLt%B7}-YK znUQ79^O<%dCnQhX##-(mVYMl7vDmTW^}Ty7RUYQ|lPZ#?=g>NuWj>Azp(%*FRI`Ol zt@kPTF~w(}sc}W`d%e5@Y`z`|2p^#!c=*x`aG^N9FVBf%W@ZMK4N@^1kNeE~ou^(; zH`xd!-q31 z%h@@n;Y&|Q+%C98_;o4#fhR?vzIzsbnxoV(=IJlAwrI@KF8CD(^1ug`4YET>IG*1X z?Z5P?;PDE5t?nc$$?3=mXE?Y`1kJxrGE(aGmoV#+Cc@-=p zYZ`7YKp4!{$605E5DNVQR-nD{p6WWc_YJ@x`LFMXsO0skfOX?A3p989-LD5bVj=*Z z#AoO6^E_zQV{%P|ss>(t`ZUp`Yj+u&_*KH5{HeMS*{`mmrZGg*T{->DbZad^g2go zdch7nUOs&j<3QVKnm3bAnr~Da^dTGYW?4piUz3Mbt|v)mS1K&6D3+^^kZoCXE~HoR z;Ez#)d$|b7?ni|i5Mw;wub5fAI!h1ZKKuN(tqMi?Ha=~_qiMbifK}ZLbE{lNlez9G zSbOJ~R2G+vX076}OFlCqPWnL1~J&~97+ zHrQ_Re`<(aYWrf`YpOaX2{aTfy>wUzR&MO`>I5+z?p~R0%>ClF-}-B67m^ODfJFJs zT{lk@sEHN+$*n7f;Y@qs)Qq27Y{ox2qLCOBK=a2+!z(KHRx1~U?MzlT7nUyo0Zk~O zp0RiaI-bbc#MbMF`ByHD)gY-Z=Q8G_zN>|JF>G5Le(T}da&xP^8T6e_to;YY-vo80 zxh!w{AP0YbB6$JeLaXCEs&_Kuj_of1i@-zi^BbD;c4u@|bH{t*u@U`(gX!f?)=dfI z*-L+r7h|M!B!B7{WiUW|<^qkRS#5eAvwL5*Wa{Y{sC?y8V-PSG>S2dA2`|S{=o4$A=5JEdWR++O`AJi+QSSVs^lDK`ZSiCDZsB+LK(et&!Jloj6nvH4L|=UwyFCV8E3dOVNE>UW)r69No`C5MKmQyWac<4P`yEYzR5x>{jCJwcG6q{F8+2-Cg@r!Qc)zwi< z8Y?zylOv$SpNeIHqb~(!?cw2(hvg%VqG1Zd&84KpZbj1q1P7vIkFMG8T`zl8v@p^& zq+M$4+HOr8Y06Dy%s9iL{=?eh7rS07RC0yKu~20D5b# z!Kr48SP&dR49xh_;+ah)QQJmz|Fuh3Y5_4>Awv~J*k~bw1bMGgt}# z{=L5-_D(6W5ZXGw+lIWPtS}24*u8K4wo1I4j(R@;_S5Cesk=9iGxGc+ob}Nj%Cgmz2WNI}`xg>s6IzCesRT3G3$rd_^pT%iZCT*Iz?$0B#ov-3wLQzGe zf+A|NwFS-vg9m2f_XB%?@<6z#R@vLyKK;x5Ts51QWjlaJb~shM-hA^LHa5BgGYbnB z!c)|7vYX{PaI04kCckG>%@)i&j449nw58xel3F{@WMxj1PRv?AK$={AcF|VzT z`K-R>*pvB6s!fRBQ=c0rYPQ6!Q-!_o2+RXZahH=v8)je(-TWL2>?vNdX#JdJKX{N| zc!j^&r?BOhT}{4~{&x*5DU>v4&}51qN(HJIXW?;4BeZ`$O;ZdtW_6JAW(Do}M%yiw z@$KxYPooLamx6{`fhRF(qibaw_1e76FWxT+7O1SlUaM<7=vR*3SIgnnI0b8-r77NP zw$#>`__=c4M{!lq$s;Yk`aYSFfv>g(J$*mbhK^PsE~+a;=+HtIl_}g{U0{MvhF8dR z?zy692O75QLk9@?6Oyy05QkGl%T!BmGba`TOd3jAMo)70U3QOlKC~+{fo_tP(ycYz zRemE=gs^M-^qs4grTuoe)*Q|O7(eRcZ(QpfdD6)|p)0+k@KnWGdr@Gf-2*JWn?lk4 zIyu*|&xF-at&OLl52&N*ggwR~KRErl!6lN8jKBnb+n9-rI zl6VCc&w&u*crTyJgnGQQyc9pJGH&%M1=N<@gunZoChbnP9jENS-Wptr}2iaPy z2B?1nNNWpt7J&7Q8b(E<$#F51eiwinBSeWkI()~k=P}7oRL&>Q54_v$*u9=9*A{*e zB2~Aw^f!Dx&9Y1wKhUN8%~HL3@L1$8b9&UP}A|;9q|wz?y%&ZFrN7jdjkps5@;TizxtH zvL7u^5J)~cEi4!$Dr3X4mUx)@3pT~5Zbl*+L;Z1zK+Wxa=~;=OkEi1~)E!JZYMjf< zJAcf0G|a;qd9?xfT&~L^%v#Qd9q!LPuQflkxO&;^6wI!pV&*9DV@8_mH>0t+`5$2y zgB;)W@4!v%ko2ptXY*%PL6G)Sc{M`LKI_7xTX7#-6&bh+dFK10i8tq4@AQ?s&e_L~ z+ceLdg3+Cwvz%DgWS+^T!2Y;h=~)zmWXDMOP8Pj)o!h09kc!1wLSzXM<->; zz%0_l^E8|kQQz2my&JtIoShIgyrBng3CBW+M9>;UXhS7!GZ}O-ezNkww&r%$iId6A z#z#zV>q>_okAmr3qelx|a-F1_B?ikP2|PCasRmce)yH!X39{@cnRdS_jzPlH;K!)T zH3apV3xHa2kcg>|+g-Q#v5GvEXZvLW;4h{;o>TaKZ4Phia}(zxW1@!~xip5W@TUaE z)lJZ{{B7hX7YnPSKl_^vV=6(ONr=g9$X>kpi@E!sCmXcAI3ZiWj=o}1g)0Wn+}vEX z6H>ol0Ls4?FNzcmJE;a#kd`l7%&o);Y#1}+H_^5;w=B)l5?}i(4w?R(n$%d0cA^!U z#m~O4A3^9QCOf!qxX*qq0dMz2gX_bxl;dl-%>&}&G*r_H7L9%UZ$FR{0vF=-+BK?z zO;a%JEK8bs73scpT4J5LpI)0k5Idtm*Vk~5CWz3#c&Q^4#_JK^|DDLTWRs+Q=alwT zS_Ny+lzsttzI8CHLYlVl!oiPp!3Cs6iMFIpgQba(^#FO4L)*Qc65hFS((qE=Em9A@ zrA1@+@e4%`48apE$qO3%<$=+if-d!?cYoaOob7cFG8c~NcMJqa!L%OKgZiWhV?0xs z&?c(W-}@&-qq|>!x%J5pwH9@|&q6%3+CB%|36Fm97L=mwb%rh|AR1Lw!YjIOa-NO} z)||C_aYT1+5BW0ao9rpb13u1>2WOi(w&M%{ra z2EuAX$JVc=yK{sZ+B2E&I2}H;I^nwfNEb(zk}D-M$1>o*$SDf;werf}c% zS5@7wEr^bNuppM_eeu|)QU8}Wj*gZqRtq{je)!`K!_(KXpVaR z(tAe8Fkz+ZL=)C9eiJLc6kO`%#BB0=kVSIeH>c=XV7}&}qB3k;;10)gMp2AKuIXnl zrGUa0otMRV+ki0!j%5%57Y;JOa2`Hn|fK8J2yK9K`&wV2sGz? z$59Riq`HGhqX^<4WX zo*Iv+ehLIH??x2C*yed6kTb7!~RVWv6tG}>8I7m1&>}>LqFUlaK zQ?EZS=xZlLc3r&A_&f7QDvkBEvEUvTv-_J-O3G(t!Srb8l4=b$KD0|SS-q!$?2*{K z^^H?+RGVh%10$uq#pVn*F1R!PH(HBh_Gxt$A?5I*GtV7x+((j?hA-4?%8Ki+o{^WKnr7tNK9LmA%4O--qzA3wjgeGAt>$ z$1eaVo65anTplzjIN5dhIZ-ITh)cWWc+Bm-AEScyRp~-RPLPZuuu3MvV*DXacia7g z$9>jj8~u}Ky*?&a9$Ps@c^uH@yQF&5LM0`OM{tgVQ_*0hyXgv?mN~ulBg07yjLzFCsmo+;|8SlS0Wsd)_ zC?E$n*)DwQ&d;)p;{+9<7nwS7^!;a_^)dDqUp}Q?PAzU_6gwduU0|XwHZZ7 zZMtxrM@6N)HWf^E;P&Jt(clfG-GV%#GhQzXk7{Lv!u8DeXqLX*;CnCI$(G)F_K z$l7fXejn204do)GeY@IaRvU5*b&@`<`w?U+ow%j*paJM5?W(~NesxUNR4Mb$nGD7l zel7SaUT={nG`U4?x3_^@s`b}Ub5i7te~OsOohYd^x^lO(83`?>EjSYSbWVy+{pB$F1JWHY=- zb^JEiuXEuI5U1IHKH%U=*`j7)T43MV-}R}n%kFE;3%x(*JsB&$$RzLnNrnYbDC6Ap zqtl}3WVU`-iMD$dORFQ~N)zLHE8*sgp-<2F&Ounktxbfw_Hs~)nKVnsGz@@ch-i?% zwRf~E=ZEHk2YL`8&nb*sZ%FMLzHYdGt>PB4XYNBVFZbDZ4?!AF(Z64~9fCaJgyaM}eQ2wp&-y`of_<3(0p z??VOUyX!Tl3!y>uSLSG_^S!twpVQl(6a~9ZzNtaJa;e-jgs@7U@jW*e(R%v+R>yq9 zSYGrwB}{uyI?{@i`&5`lxb3hP*C70gmf`(UoYDul;^xpM>X`nvy;S!tIBYhzNv_dP))hb3T>0Ei;zNG$SiVgt(N#h+oED-Q5t5CNFd5f3F6QSn@l?(k50r8<73jLp& za?4haGobp7qdj~zgAG)BJFBbO6;sN0yc0m=!CYHPHt%l52B28Fka)Gq;tPQ73}-y) zmsI8(ILliNw!l8oH&i)ZglENxb?=4CWC?SVAy51@9g?zsW@XSNVYMSbG)LN(rth@H z2vmJMJK}r`d8r&!xLMk^x~%f!AcnL`bMZdHeQ=V>_E*n%&YSiz+z08*HEZ|JL8*(C zN&&1wcb4_HY!P?K$5pr!ew9rWn+x@g=AB?6+Iq~?daJPqhXs9l%Zl0y4B>}cT2B;T zY>M8d0&oyuMo_EGKo<>7!CCdkkgs;PV$_x(azx;sNaWF0Ai_?)g2Ba^c0U*k*@?tC z)%RdHX5|%q(MJ08#7rurGK4J#g%L74Z4j2Eg;go0dTU>ShNz$SpZ8Ymn@QM;6;8wJ zEeu=;EO^jyQcMH&hY$uX1WRbH!?;DBOax@qGWWHPr3t5{Gxf!q4es z2^w1$04jysd+71jG1dJgg0H!u^B046@-ilppFguNJ{zEf$A0+LuhG914@M7s{|c2i z=J{m7K$>ZKLxjc|n!>MlXFBzJ)?Ye4wYhii3tqDkHHlQD!C0&V!hU4`z2wOm(;+1?ibTKdusA zt$@A^Wqr0g1TNrR6&^|BH3-^c02xw;`ewTLPI6VL-F6$QcD2MRedt43`Z!ZzHJMdG zVxo{f0?P`MBY0s2M>aj>KztiBaTg0BZG&My8srVTD5T-k@WUl;cR$$aS5z}Y$ z4t;9yVZ@`Mt%Q${u=x`CGgfcA)9Vy4*zj~H->~FZE7g^Og5@Oj+xbv4>-l}6JhBZ= zC*q_FBAjT(<*Ht1bAMjqFpD23)puB>u{4TV`eQn@~iJjZZ z^kx)WXa3av2+;0ik-5~NYC#rmPGhgQFN^*E;pi;fn(W^;jt?p-Dgx3m6%-{!DTz%* z8Ayppmx^?W)PS+6bWTA)L6}JAB!|@KkMs4KJiedJnK9kY~gcvIkfEONWM z{T!x7h9SGYnURY%;JC<~p1CTqjN;pu~1%H5^;Z|ys(SI~irw2S_ z^y!Wjz8%Z0oD9Fhp23`z2Wyr*w3`ZqACITf6F00ckIK&fNd8eGNc6(bySe3AK@X$TagAuHAk_TqrpM(;B%pp2m0T$Q zGN6~DAf*aUa{lEQ26Z)gkpd3(bk=%q4@g|%lUm4EW5#6?&*}~3QS#~4{gQdnf>y^R z_r0P=RaJ5)xo>~)TC-eteAl=82(ZQmj1TRea-Ix+VjQ97p8J*?8is7X9}9I$`yIdJ znF#XHP)?bH+mUQq_`^!YqU3MCG5ON!!EV+4J4l(+#&|tNZTk!8FhoSj4{X(bEvKlB#1_urZOgfZ&RrWN;hA=a{a*+8_F31B{eU~sQy2oYCr%AR zuej}*Ij)UQK3qLlQZ^ly*7t0vo@}Pj@|T+5b~Cb=&r3ty+o?;zk>*1_+SJ0p{LE{y zTT)Q1JZ}Udu9U`*z&4CZL>kSCyi{>=I#{22K+dH} zx}f+iW?(Yrk#D1x0OVtO(ndG9hg|+??CG(vw8)vTm|{2m-g%cr(w+WO%Pf%WxS<~ReGTPml5Vy7yGamXSoHC0yzF2@O_DfgED^qBsrqyCFZ91T>ewiR z`5)6;n=7<8gQ+&v4OX{$1VvO`d+2vxz6Ja`cIBpjnc5HuGtCSb+E;_Z+C3%2_dbd>}#-7QMD!8b^} zaemA0jO_v%g)4=A95K;KsIf@}~HMWIOQlk!iBTp*T7mF34qyPc`=v?|H8B?hKC zNrT5BemnXT@k{SBs)kJpuEa-(>e zv^u%=#ah^eRt*x)jN}q>JD55qpPT5y!Kr*hg}#BH;IkRI&Jcq9!A)GNtd|=jfl*GS zBDPE@Ft|j~+C()Ly9XIJ9~=RL%q+U2omvr29dBTSfXj)CdRn#j8)TiV1b1jR2&mRt z7vvVY+%hQ6rov+9MX`Vkly^m*q~9*{FFZR43~q~Z8YEnPEoL`^I{0xsdki1k?N z1kE1nEuD<1{9|HOY?}qYz8khmZGLd3dgqhGiVelC7sU7o zq&dtEG33WfKd;C6g$A+x8=$g2Cy50k%S&@NXaH=I*Vrm);1W(ftipj~hgYG~l$@DoJ2)6q;?}ke0e# zlrj}&xzRmvpsnAU<^K$6KI17W=RXt9Zm(fajH49S?fUFW*A)oM-`(mSiFWlJ8%>L} znoItt9q6rp-)|OKZ>B7t`^D`r{>927<7mIIhAq@bpW9hPW9XXIuI#nTOk94UF@wpr zkTwNwQkm9O3+-zU4AFz-4Z`5iK%y9u{ik@yjcbj)0o<9Sg*J0A255eU%qzw&)P9I@ zkXRR=rQL7HB?_4O@ZL<;X^17YCBI)FwF5K$h=ON=c-7n8gg>{@X2@m=DYpf377$!j z=CzUc792Wh7A`#|MDAkZx2$1#JB~cw3#Lf%Js8B!gQNSk6n(T*lE{6YS~{ji3KC}p z*e3qmaA^^ZF@=fFMB_WjQ<YSeR^!tqEt9W^bp7FbNB67%o3t5M@goe(Raofmt{@Odz>O|Dtpa;b+)GMM$%; zuat{poQ|ZHY@<_OK|z0#uY1zYKrZ(P>HqF16wV{BfhXrM?3X@jKYV}Qm{n4*VdB_I zf6369J?+NsC5uO?M;wfk@#EknP#fQja<2M%-N{RGClJp94bLq1iN#ce*rS%0Ep!$! zy)*X{_Qm>*+yu6GxOW{1VZhA661?cvRQIPAlFnkXsjJ!KHGY7gV**V6XEB# zTh@h5)as=mC|7pSqKH^jg$DKB4t@V2dP-;dVFv`@a!&nY`fykhsQ=B0=lxpE5BE37 z>8b0%9?V0a*4!`0MjK}TnCAIM6w2EqIWA?tCr8eC=rGd5FpnkugoVk**tz2OeMFuQ z(ui)ga#~j^pRMhvf}nfYqjolT<*^}Q2q`X{jBkDc_n|=8CMvaM(~!^?+HEql!-$JZ zAPn;|A4C2XLfxLxm?Wjw+t!viSk=4qtP`Z6!AuE%tQ>c)WVSI~eyo8FHaJG)`6x=C zgx3nf<69B*x_LG%<5PDB*N^0v=YJGuuU~iCVv-s(ZFtT$v`yaV_cw_Tur;ffA)&{D2#^dyVxWN+u1_{;7V>qX ziRN7QW@;GRHD=A;_)`9PdZa(hy1+9LBhDuH{QF#-mSp5HaYYt8r%yXm8iyaux#S{w zTiUb}5acAq7T}Q0M3LNrm1+IFevqFf&6cvk66&t%Lz2LoFK1?0z>f%42lz>h9Oh_r zqnD$JKEc$kEFAuTJd%y0Af33w7p}e-Ge0kERnJha z&+rUIngZ8^Z$xL?=eb(YlQj?)6fVX~hJ2*e(U0ZmPlr5kiIRo@vdWAx>;K2(YBRyu z=Hq5a`DrEys*d(gi_I_g6hU#x6qCiNcx!V@t=BNr)uhcAPdp>%Uk_i=6a~2PYv1yW zSmFv}LLl3}nOVliELw-P%)UuViPh;(O`;+|7ePP3@=3HN#^=^Vhk+L_W9MXqIb*|I{cb*& z+r^dSp+Hc%ve@Rx0wh9_Q{YWapoT4I?L%9wKfW8Uga;>922sz!-^Ka!Xr}z#aB&q7 zo$On%i9iTY>d6kx_qIsbNFO)ZpDH@OW95%e3B|lVB(FuC*farz$v>t^<|aaDf|$ z;86S$-BM-=I<`mOMEI`pw;~CrJmfV;5)u-u+Z@O_JGxj4R*st&?h3L)%Y*(~ogJ2! zNVOH^1Yk|&;|-z%sbwn}YaY-NakvM3tC;u{5c_8JU*!+^oct>;6>ssda3F%Q{g;p7rekNK`&QtSPaV1F=F(<9leugmhptVa zK*H({18slYWyW$%SXx|YPoHw&#h70)Fpg5P6O;O@VWIK&skgaxrdkRy*x{P0QMF{` za#Tfz()*qipPOtU`}I6Th3p(xV~4lQKi`ONf_Um2T!4&?BPr{*B9o2TgptOw6QMWW zbl;B$tyR9FN=B$$de0;54%PZYL1x_6q+OVn6 z`)b+ttMr;r8(iYoY6I7hTUK?tmOJE6Y1K%ro1wnL-N}5L{9bs^Z%>DELG?;hiN!)( zrTFn(jozBwo0l65K>mj^Kn*i@YjtZC1Y=9RQI}9Gk zoA5^-bT#CWR@!{ydavPPlj9D0MHfh!Z-*!-6*6~t&f4rMX*-&pVuwA9tpmPr7?8w4 zeHPaD$R^=3B|xWnQbqRaY z;L_G`11>`H3$1`u)VF@4P9`QV34g=*4fg&}__VY2@i4E)_3jx@{vntIo}cwvh_6u%?Um&AY1!Bt$T5LBwX6053GyxQ{OlkMqIWL?uW7K6!R&wos$e!%Rx zdwB>D`TfO?Bz6b&W9HV*XSJ#1Lh8hFBnpQbZm$_sh^R|W!FyIH^#wOWN}d0lbY{V7 zRBCOdmJj^TSThJfahe{F@Y!W+zGRKOqFL_Dqmu{K85=;q8pN$^6-HTalvW6h^!*#$ z0vrgr&I;qh($*5dfSidBkZcAuhBTObypLyAuZ7&DeOd~Dsa`Me?zC?{S@H7l~Gr#hv zATL1#hQU`)(F*rKx`6T;4TtbDMo5Qssfr1U`lr$2zQ=Vn=z>R^mM)t65Xx zJZ6h4Yl(VmnskVj5~@z&WBX2RFj4w)&(lU&hISQn*s2TOphDXdoD1#l zA@N&jS>r744|df9{EBdsJVb|2;QJJt77!-`G-2g5N?zwrOYAX8g|~R!Ft>C+wranC zb$!pqwd>X9LC+{K&qQn!MZ{5Ek4}t-*ED3GO>*@hLd}s)z_sl3#qVZ%ftdaXm;NUx!_aLI4!GhRhL2+MEUd-6#sXT4{gVQ@x!9F6KHFp5 zlge`@IjqmsWZ}ZS2=DH-hMl`w`-Z{)nBsotG>;L~%B{w+$v#oo)akICW-#V}N&ec26N^N)!O>5iMod`_{!tHb~7dpVMKCf7c5nhb8asp!ne7>3X2fZw)s7gAr|?M3nlXQS#EE+ezvfT7sOPz-n^#aBWXhNk2{NZ2R*`>z2ElGo zpI4I6pRCo)2W-FcmQ)OURAP;@mPvXJ{ax~GU#yo;U7Nqz+?0NM05_MGuFT)+2f75l zLsKAMOxgkJX`gBlx9R?j(|c1!NN%9CxD9d1!{iLZ`F=X_w}pIzwZ&y$EXs;W?66~D z`2c->AOGxl_V5?UCX8m_nT_a2@DHgwft4e3YOcJ!SyFr%JR!_TNDFdHH|e+5sJBdnuc1{*Z_a{Rz39<%%)>ZRe)^L>bYi~ z^8GreW#!n{?jxdys#g3DTeX+LGlfYQjTi#7cXX6LDg1N|Ta4UBx5@+ko-qZ<*wfJf zo%isSGV%)Jx+V4m5?;wC=ce8n|3Kk5@B48wMO1x%Nq^o3z6K!~LMF|3T7b=wfLA!l z-u{s_1r5rc(D|QIxROf?pf9er-fdm^d}Y?13pB($AaFPxuz?s%AOO}gL=04reC7hLhNlqhnxv)wA**QCETp< zmLp$n?5J{JRBmdPNVV!V&3#t7sed{u-Crz_J1KnG@gLLA*gAv_?Lc2_X_6xR@<^z_ zG|ju+g?>HQLi4{Vi*n_!pn3Y}mQC@DECu?H>GaY-1BVk5B)7u`8(q*C;j5d(v018% z`nvsiV-Xk`{Inu1F7vwJ$D?NsEyXlN-~%}FY0hVe9^H+tJ-SV%s-=F70nWP)=~JV{Z>}bNc~eR%U^V#=p_Sf|9+Cn3M)#z!?_%}DDSO2_94hyUT=@yRr^U%- z`%Ap+*r6R6BTRJ>;xq$Dw{1;koTC49a|6Fh%QC&NB)2hCMJzpbNydLam2kfO9DNaKkZwXMH1;!W5`Ax>6chZ1Pp|0< zy}gluLq zmor$t3_f^|xJhz|ps{&zRTV@XVkK$_yHk;FB_f+|zFsPVOeoo{dRo?ZRX~rn2WsA_ zR|!GR3P$ayaxKucTaq|eov#h=N8``#==~uaCV&h+@!x?u=-fT=d{HElf~{Vdq@AGq z8E5NJ+T`hyKNp;4*{>(OIQJhk4_I)Z{=C)mN}RVDi@8eFBBdO~7PtFthw&S@b3J1k z6MmMCV^E)inz)>MN`E2(@}@F(F6>z#sYi@}_ev+icjP`CsM$0fDJXy@36g6CPEY2n zEl~0I=@ZXs{kU>6eN+w*fGNqw{b_TNA3y2%f7bk^`4+S#0?!>k5Q-?#el&W3y6DXO zqQ4}o@|*PFKsq0!W-XqN&F5PFKITQ4@KrLN28Z&5S8A+w$>!<=kytGphTWqloGqbV ze!5oDyB=7I^1;5u<{ndGW+-ms$Ios3tdO`#s>xfl0AS_4JZCYxVg9L(_r?rEzoLYN zdf)ww{$ij>ymPt`nJv_#Ev%GzvJ)GyO)X0M&MQ%V^$$ z_^H9GY*JK#v$tuRzal63b{v>m|Vh4}!cQ^mpt>0HGky-t`Dfbx+6Z%i_O}8xA;Pt43jpve-TW0*7EBV?7z8b*~PUZUJGE(VcFMJ z&UW-4j{4tkxFYcq^wGzCK6d-EOVmk$%4rTPT;`HMV1}VpY0IFC>9+^HaItkz2+j!^ zJ|lsR4gHJp@S^$d2);*C?TugVfj_tdq)I)f4rPsGYxr%vdqKbKSsgFtRduC!Q1^A_ zJxovR{T707-Dw8jkBKSJv3KpOQ{XSX&1k!Kxxa7a)DL^S{$7C=G_UWrhVu>kG?t9Hp>HfYZI0(F<5c{I9k&3v_up9^GC8?53T($Sz3++Km^aEt&8Op zdzTPqu}vOU(Vxh%J6z`h6*UR-Z~!@%J$pg*@zbfXbyJs)2A1Mpx^2G(3U36v3D{ z>r&P-T|QH~pLg>E#(CX(^i`m-_iwG4{FnDiJ1y5qtM(Fqys8zusgKo0>u$B$BgHk%-}+ zjV_Zku7yYTe2ZR{&}Vb`x|8ZTKZ=5Exk`$vW_+@L6muNB`@{82&HNuz&u;p?@vRvC zmLaf8YLM)HhusB*Bc&2&eLm~;J$4u6vk1h&yXx-J@odh#QJ-%`9wIdp>cG$%Yb=gjkAq|=s-ZUuLZb8Fe-$75(OYRw`Z&PEAxeWA4Z#1^z6xCmrk#2fdwq%6sV zp@CEHlj^0M9(lF9>)882$2a-JCexWtO#Jg01mXYwRD9XDIp1>iuR_97rpYaY5FA`t zt?9kNbrZ372J?7m9~l;)Bjtc}bIrO9sWGS}6aTEw&!ug;=~YyL<;Lo41B=%UoqwCx zJz}g1-lm=Lwq_%X7WyX4WPVOhJW|7jgN0oJH22(IO+iNT#Lt5siuZt7NjI}j*$x@m z2?+{S=Oy~MTkv!bF9H{7z=G~B*-a9;Elt?Bp;#Y*rvK13&>}4-&cDoC{`>8Ls}(gu zZMi^>*LYTdk#va(udjk(JmlX{ca@6Eo0$a`p+Yj&fKpF&Su=M{d72`fm;XUtNO5ya zp#001#F^^$cci$w!1o-$bgFVw8SdNZS@d1x0e*b`xIQ{Ue=TZX*yAyOC#0I38UCXJ zx=oyVbk8ki79nA)S8J1v1oMC@Wwx}LzuS&hN~tA&bX@)&8piTGt5KZ3L%S+=7(V1s zY39CV^q(D#`s5*U=6X{fwbrRcxuyFF$T$xR-Dk^l2CadE>YRQD5i*P5uB4sjVh)e1 z@P`ebT6CrbWh6HrpZ&aL&>oO3LB`J?ZS|3B@l}4lCP^vYzOkI*))pd#61GV!fv2!2 z5+X_}Bn;Zu5OAO`AKg>wiAsdN&tikfG(UEZ)s!y3mrcuM-+esjD%wtObw!U_5b zS*E2HMY#NzuTJW2z3{b2@Ni1%mBH*D=dyD#lHlFoa*;SC3_y5>(#fNj)J56|SQ^|? ztk*{reZnqZWCqW5Bejps9pb3+8$1v$j8FCEKJKd1?qlzB#rB`omO{vAIV)wE~4DjHb4q6VBLvE-y#_!lF3j!jveBFiKr4*9kCk; zLxaM7SnU#Rg$=0is#=3fj63j z;HgruS>tLRew#=*Uje-mY*R*w>MXx;;va`=g_v(4-v;*bgQApy(QvQ#*+EsS>?!km z!uNNRgm5d<%lLU43Fj2++@E;A`Dt?n08eC_QN0%ji&v19NGu>xgn$*+ z8dQ^?r#MykCv}P@mP7w?YF&qT{x5Vv+JuX3>uNXU_Ee+JnV(nRNv26w@sBkYy;b5KSrs+l zNx}(1=c>Xao)T@&Q-V1JG%H#8&WXbt1TuuG;kKY~b>li{W@|s5C?wo9>~y5=-gN8q zeWc)%NR|=E1U{prV0Q+@3v;Vv85-Z5J}PIS zQ9b07%9lMPGYoyNIG4xZdwF&K>)}aUSXxPB<@Z6Z)OG@_CZz-EGTwgb!eVNzBc27f zW7~Kd$$>ib?;Wz9*&XnfdQ31KORB71Jof`=4D662ScWo^f3flsc(y71`adQ!Pr;-~ zcd2cTCxq^io9avZstyOMEr@KIwTQ9TMPnSg>puD>ezIR}f@&^qt-{t~h970F z{bQOaJd6T5F$WaqwByXp-!(W=I)<9&qLpYgoG$<$55Cm!1|t|-mfHba^s%XA*<_$u zaODg+`1KL{;W}o_CR(o{_+GR|a@IZB2NNSEeh62wtg2r+OZ7OCrS4t4QGk40!Hlgy0BdXU+*rj6&pw#_| z8{4L7!>`N!j8C2CR6T2Kbi8bKsmF%&750WW1Ch8SUxr6t`^SWUOeZV_+AgjQaXIBn zWN=AtR&0!?nhea9?ma=SDYV9isw5gK$)4m>aXRcHFw-f=0RaF|dF*yWe$^MG{Z}AA$KHCe`%UmjnYBu$`Cy%-;Rb(Cl?>wzv zp_m`N%uHY0U&CK5Vi`f6MLMHmXPJRpfuiZHYhga>jkS>`HZQzL>~Wla;*r*mJ+iu+ zn|Wu=<`t#zFqmFkOp^c>P4XNYprigj@sV7wd>p?{edckzqO2#F2x_@Db#6tnZfximhQFv2E6m14z+4C0;ibXqWQ2U7P{7S~AEC2d#;A$X3yX+EBtrn% zs@(Mr?l}huSN@)yHROoU^jy_>acgKNCP?DzAByK(A3;P9O%!V^^p}(2YT-k_AeHr~ z{$U~O+MB)}8U@QvT`t~Zn>Y~gxHq{uHqZ$=nbdj-oW?&@KdFI9`4uM3MJxmfsxIw@ zcC`=d&L=RZOReukOt#JRT6}v;MoeJ?TaL1c2U|OOf|B?5L4(wjru^6=?1sJ5 z+;U!wH-G=yETHy10)FC$>4Q}KKUJEf4g1H0JGTeyIQA1{tqHwEG@4O!45>|+sNc9_ zsQo$z5eDmS!j&S!e3bU-f!bt7g3#b`5>{bw?Ibj<6*(JbS#q$pt@6=Kfx%3Vs^n@< zBeS$BTL?!Ze;$83N%eC@ir7d|1c*UnA(H53^Vs?-%uh?j?+Vd=%i?F%-d26~V*STd zg-$TZMK)IhZspwW1)C5>RN8$}QZQliiAVlhB7?r7}PsnQmQ z&jNBNF2Y^@0OsJRfRz>kh7Q~CeXqy}$=#<(j7a}uvePH18-z*$NfX-iS2s3!MqjAQ z6EBZ{5%rLV9*JJs?6wwGHTp?u;_oBIoDJ*|#}~D5$P*WG37nyS3^sNp<=N zs+0g0z$I>7JPb{Bqs+KDOUy>pu!Yfd-EZsyX&kAh*#z)5KGwuZsNscLp@XrTt6f(t zPtc=fs{SYU6t5Wh(o6ZB38L5!*e=4@ngiMg>WgpuPVY8|3|v-nCttJKd0IPdTw2M7!kve|7*Ge!4CB7a zQqj?X?8SSV`%?^e&q+_EB1;1GR^FbP`PoSBqt>csSoyBAf+#aE?6hm&Jt)CxduH4PDL2HjWGkgx_~!{>oY?r zmS!+L_{Iqlcp=Cb!(EByZ`y4x4jtU&kQ+tA$lg_U#~L zuRLuK=zdW0bCl56T~T~)?>-myr}I7aeE%BJBI&QR?#ogh$T=-Wfd~B@)uh11nw$Ou z00n%sg=7`)oEdr9L9?qJsJcIriX%C6;y`I#`vfRBR}lf3`2LPKqqv((1^u z-Dm%gsrqnd7u~qS!uYSf){u^RhaA|ph8!&be+)7ysBl@Ad0xNG?LH#oawL54-o;~s z(65+3kNdkRF)0TCdrw*D*gFssr$V*}T7uCBkCl(RXk3U*pFM^AbuiUdb2Q0gzi2*-xx@^ipv=h*PqM{>GQ9E~RR%IywVpKX* zDLlJEW27Gh_lV0xWPd>EvW5AaLS|Yn^bo(PJ_1ULpZ6!m*Go^=hdme@d~z8g()P-d zrbLpT>uvvj0d2a+4#2c9`W@hudb%BTl3=AD12C$2r|IJ!%{5zmG{Zu84a}AL!=yiR z4jnEAUmNqgi!84 z77As(ef6uobxV|O@Hb6`{NH?KtHo1K0mPO%vHre!8CfbPo!r9fP;)a3f2nf~O)5f^ z8lsKe_^%$jqCyV@kQMr3+cX?{8|nKS5I474amx1fui;!om5u!33aZvE*tfz^=HMSM zp^fIvlWN1ww_E+Eimy#o9|#pr9S&2|A7>i=Qr(`V3q%L3y3y=%gHkt7{uX?}<`?7CMz}}I2R<#Q%vWaF0=UnM*dvffIU{C zntkV)pRS?5n3$fH_mLVYtO*n$wXSYfr}-Ts zN?_P~*X&s<-@V+&F!Q89*`e`8Cdr?F4^Q9OdqR(?B0sMhdRtvREowktLCzmxL;$Vg z5~;c6aYL<}@vZp&E%u8%U#i>tA9bwc5gRU#&;*FuvC6mYqm1uVpryKgETHNh(h7wa znrdR}D|~@=0VwTObt&l&X)Y}ix^A|ADH8K(M{_<%G^P**u+`{X5w0lBvL7zt#x5EX$AD{#iby70j0#-w|6&D!rt!Ns2WvyQg3plU8pj*< z`amPx$PfG0@iXW%G+APy{yCcZfKTtO!$Ce8SH7ivpp%HeJ~h=M3#6PkU1|C;9Y0ui zQz{$ipkGgPf{n(v12oY)$WlG}mpU`@<(0!&8#c;<<*;E3;?{tC8ZeJ`wCX;TOF3*_ z=V3nFU2kEag-!~0ZQBwGeuVkY@e zi&6;w?j*>=&#LWirzfAvxf_3OXWQjxHT^3?(h?S?9ZwKT_WT24h;c)92Oa>q*JNHJMse5X%}s@2MuThlrDivzY)9>0{y6-JOG0@ka4Ct!(ufl7*;)`gX#J z9}(Lk!$;Gk$j>1!tTXF+@WY%3UZo7L8^?;6dAav3pZ68MhE?%%Sauf∓2^z00p( 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℞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 literal 0 HcmV?d00001 diff --git a/client/src/pages/index.tsx b/client/src/pages/index.tsx index c051281..836bff3 100644 --- a/client/src/pages/index.tsx +++ b/client/src/pages/index.tsx @@ -1,4 +1,5 @@ import { Inter as FontSans } from "next/font/google"; +import Link from "next/link"; import { useState } from "react"; import { usePings } from "@/hooks/pings"; @@ -25,9 +26,15 @@ export default function Home() { )} >

Test title

- + */} + + Read News +

Response from server: {data as string}

diff --git a/client/src/pages/news/featured-card.tsx b/client/src/pages/news/featured-card.tsx new file mode 100644 index 0000000..5fc46c9 --- /dev/null +++ b/client/src/pages/news/featured-card.tsx @@ -0,0 +1,41 @@ +import Image from "next/image"; +import Link from "next/link"; + +export function FeaturedCard() { + return ( +
+
+ {/* Left */} +
+ Featured Image +
+ + {/* Right */} +
+
+
Date · Reading time
+
+

+ Washington State Passes Historic Clean Buildings Standard — What + It Means for Homeowners +

+

+ The newly enacted Clean Buildings Performance Standard sets + aggressive carbon reduction targets for ...{" "} +

+
+
+
+

By Chase

+

Read full article

+
+
+
+
+ ); +} diff --git a/client/src/pages/news/index.tsx b/client/src/pages/news/index.tsx new file mode 100644 index 0000000..c95a4cd --- /dev/null +++ b/client/src/pages/news/index.tsx @@ -0,0 +1,11 @@ +import { FeaturedCard } from "./featured-card"; +import { NewsHero } from "./news-hero"; + +export default function NewsPage() { + return ( + <> + + + + ); +} diff --git a/client/src/pages/news/news-hero.tsx b/client/src/pages/news/news-hero.tsx new file mode 100644 index 0000000..7f4a1e7 --- /dev/null +++ b/client/src/pages/news/news-hero.tsx @@ -0,0 +1,20 @@ +export function NewsHero() { + return ( +
+
+

+ Latest from EEWA +

+ +

+ News & Updates +

+ +

+ Policy wins, adoption data, community programs, and analysis on + Washington State's clean energy transition. +

+
+
+ ); +} diff --git a/server/api/news/admin.py b/server/api/news/admin.py index 8c38f3f..c25724d 100644 --- a/server/api/news/admin.py +++ b/server/api/news/admin.py @@ -1,3 +1,6 @@ from django.contrib import admin +from .models import News # Register your models here. + +admin.site.register(News) diff --git a/server/api/news/migrations/0001_initial.py b/server/api/news/migrations/0001_initial.py new file mode 100644 index 0000000..d116c64 --- /dev/null +++ b/server/api/news/migrations/0001_initial.py @@ -0,0 +1,34 @@ +# Generated by Django 5.1.14 on 2026-06-24 11:58 + +import uuid +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [] + + operations = [ + migrations.CreateModel( + name="News", + fields=[ + ( + "id", + models.UUIDField( + default=uuid.uuid4, + editable=False, + primary_key=True, + serialize=False, + ), + ), + ("title", models.CharField(max_length=255)), + ("slug", models.SlugField(max_length=255, unique=True)), + ("summary", models.TextField(blank=True, null=True)), + ("body", models.TextField(blank=True, null=True)), + ("author", models.CharField(blank=True, max_length=255, null=True)), + ("published_at", models.DateField(blank=True, null=True)), + ], + ), + ] From 53cb3d09313283f9017f74cccc5dbd8924693baa Mon Sep 17 00:00:00 2001 From: bawn Date: Wed, 1 Jul 2026 17:29:50 +0800 Subject: [PATCH 03/30] Update featured-card.tsx --- client/src/pages/news/featured-card.tsx | 35 ++++++++++++++++++++----- 1 file changed, 28 insertions(+), 7 deletions(-) diff --git a/client/src/pages/news/featured-card.tsx b/client/src/pages/news/featured-card.tsx index 5fc46c9..2b32a29 100644 --- a/client/src/pages/news/featured-card.tsx +++ b/client/src/pages/news/featured-card.tsx @@ -1,12 +1,17 @@ +import { Geist } from "next/font/google"; import Image from "next/image"; import Link from "next/link"; +const geist = Geist({ + subsets: ["latin"], +}); + export function FeaturedCard() { return (
-
+
{/* Left */} -
+
{/* Right */} -
+
-
Date · Reading time
+

+ June 12, 20226 +

Washington State Passes Historic Clean Buildings Standard — What It Means for Homeowners

-

+

The newly enacted Clean Buildings Performance Standard sets aggressive carbon reduction targets for ...{" "}

-

By Chase

-

Read full article

+

+ {" "} + By Chase +

+

+ {" "} + Read full article → +

From 5967dbb3d7460bfed14164c8e5fe679e32924055 Mon Sep 17 00:00:00 2001 From: bawn Date: Wed, 1 Jul 2026 17:40:21 +0800 Subject: [PATCH 04/30] Add news list --- client/src/pages/news/index.tsx | 6 +- client/src/pages/news/news-card.tsx | 56 +++++++++++++++++++ ...atured-card.tsx => news-featured-card.tsx} | 2 +- client/src/pages/news/news-list.tsx | 52 +++++++++++++++++ 4 files changed, 113 insertions(+), 3 deletions(-) create mode 100644 client/src/pages/news/news-card.tsx rename client/src/pages/news/{featured-card.tsx => news-featured-card.tsx} (98%) create mode 100644 client/src/pages/news/news-list.tsx diff --git a/client/src/pages/news/index.tsx b/client/src/pages/news/index.tsx index c95a4cd..a235bae 100644 --- a/client/src/pages/news/index.tsx +++ b/client/src/pages/news/index.tsx @@ -1,11 +1,13 @@ -import { FeaturedCard } from "./featured-card"; +import { NewsFeaturedCard } from "./news-featured-card"; import { NewsHero } from "./news-hero"; +import { NewsList } from "./news-list"; export default function NewsPage() { return ( <> - + + ); } diff --git a/client/src/pages/news/news-card.tsx b/client/src/pages/news/news-card.tsx new file mode 100644 index 0000000..e134360 --- /dev/null +++ b/client/src/pages/news/news-card.tsx @@ -0,0 +1,56 @@ +import { ArrowRight, Calendar } from "lucide-react"; +import Image from "next/image"; +import Link from "next/link"; + +interface NewsCardProps { + article: { + id: number; + title: string; + summary: string; + image: string; + author: string; + date: string; + }; +} + +export function NewsCard({ article }: NewsCardProps) { + return ( +
+
+ {article.title} +
+ +
+
+ + {article.date} +
+ +

+ {article.title} +

+ +

+ {article.summary} +

+ +
+ By {article.author} + + + Read full article + + +
+
+
+ ); +} diff --git a/client/src/pages/news/featured-card.tsx b/client/src/pages/news/news-featured-card.tsx similarity index 98% rename from client/src/pages/news/featured-card.tsx rename to client/src/pages/news/news-featured-card.tsx index 2b32a29..91ea8a1 100644 --- a/client/src/pages/news/featured-card.tsx +++ b/client/src/pages/news/news-featured-card.tsx @@ -6,7 +6,7 @@ const geist = Geist({ subsets: ["latin"], }); -export function FeaturedCard() { +export function NewsFeaturedCard() { return (
diff --git a/client/src/pages/news/news-list.tsx b/client/src/pages/news/news-list.tsx new file mode 100644 index 0000000..0513a10 --- /dev/null +++ b/client/src/pages/news/news-list.tsx @@ -0,0 +1,52 @@ +import { NewsCard } from "./news-card"; + +const news = [ + { + id: 1, + title: "Washington State Passes Historic Clean Buildings Standard", + summary: + "The newly enacted Clean Buildings Performance Standard sets aggressive carbon reduction targets for commercial buildings across Washington State.", + image: "/cover-test.jpg", + author: "Chase", + date: "June 24, 2026", + }, + { + id: 2, + title: "Australia Invests in Community Solar Projects", + summary: + "New funding will support renewable energy projects across regional communities, helping reduce electricity costs and emissions.", + image: "/cover-test.jpg", + author: "Chase", + date: "June 20, 2026", + }, + { + id: 3, + title: "Battery Storage Reaches Record Deployment", + summary: + "Large-scale battery installations continue to expand rapidly, improving grid stability and supporting renewable energy integration.", + image: "/cover-test.jpg", + author: "Chase", + date: "June 18, 2026", + }, + { + id: 4, + title: "Electric Vehicle Sales Continue to Grow", + summary: + "EV adoption in Australia has accelerated thanks to improved charging infrastructure and lower battery prices.", + image: "/cover-test.jpg", + author: "Chase", + date: "June 15, 2026", + }, +]; + +export function NewsList() { + return ( +
+
+ {news.map((article) => ( + + ))} +
+
+ ); +} From 7c0ed79497cff94729ad77443f9e45338c629fa5 Mon Sep 17 00:00:00 2001 From: Kevin Tan Date: Fri, 3 Jul 2026 16:57:26 +0000 Subject: [PATCH 05/30] added full report pages for news. need to fix general css styling --- client/src/pages/news/[id].tsx | 95 ++++++++++++++++++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100644 client/src/pages/news/[id].tsx diff --git a/client/src/pages/news/[id].tsx b/client/src/pages/news/[id].tsx new file mode 100644 index 0000000..53bcbc9 --- /dev/null +++ b/client/src/pages/news/[id].tsx @@ -0,0 +1,95 @@ +import { ArrowLeft } from "lucide-react"; +import Image from "next/image"; +import Link from "next/link"; +import { useRouter } from "next/router"; + +// taken from hardcoded data from news-list.tsx +const news = [ + { + id: 1, + title: "Washington State Passes Historic Clean Buildings Standard", + summary: + "The newly enacted Clean Buildings Performance Standard sets aggressive carbon reduction targets for commercial buildings across Washington State.", + image: "/cover-test.jpg", + author: "Kevin", + date: "June 24, 2026", + }, + { + id: 2, + title: "Australia Invests in Community Solar Projects", + summary: + "New funding will support renewable energy projects across regional communities, helping reduce electricity costs and emissions.", + image: "/cover-test.jpg", + author: "Kevin", + date: "June 20, 2026", + }, + { + id: 3, + title: "Battery Storage Reaches Record Deployment", + summary: + "Large-scale battery installations continue to expand rapidly, improving grid stability and supporting renewable energy integration.", + image: "/cover-test.jpg", + author: "Kevin", + date: "June 18, 2026", + }, + { + id: 4, + title: "Electric Vehicle Sales Continue to Grow", + summary: + "EV adoption in Australia has accelerated thanks to improved charging infrastructure and lower battery prices.", + image: "/cover-test.jpg", + author: "Kevin", + date: "June 15, 2026", + }, +]; + +export default function ArticlePage() { + const router = useRouter(); + const { id } = router.query; + + // Find the article based on the id from the URL + const article = news.find((item) => item.id === Number(id)); + + if (!router.isReady || !article) { + return
Loading...
; + } + + return ( + <> +
+ {article.title} + + + + Back to News + + +
+

+ {article.title} +

+
+ +
+ {article.date} + By {article.author} +
+
+ +
+
+

{article.summary}

+
+
+ + ); +} From 4ae7b711b6758e63cf10c0f69809c79420efeb42 Mon Sep 17 00:00:00 2001 From: bawn Date: Sat, 4 Jul 2026 14:35:37 +0800 Subject: [PATCH 06/30] some css tweaks --- client/src/pages/news/index.tsx | 12 ++++++- client/src/pages/news/news-card.tsx | 6 ++-- client/src/pages/news/news-featured-card.tsx | 38 +++++++++++--------- 3 files changed, 35 insertions(+), 21 deletions(-) diff --git a/client/src/pages/news/index.tsx b/client/src/pages/news/index.tsx index a235bae..fabb9bc 100644 --- a/client/src/pages/news/index.tsx +++ b/client/src/pages/news/index.tsx @@ -2,11 +2,21 @@ import { NewsFeaturedCard } from "./news-featured-card"; import { NewsHero } from "./news-hero"; import { NewsList } from "./news-list"; +const featuredArticle = { + id: 1, + title: "Washington State Passes Historic Clean Buildings Standard", + summary: + "The newly enacted Clean Buildings Performance Standard sets aggressive carbon reduction targets for commercial buildings across Washington State.", + image: "/cover-test.jpg", + author: "Chase", + date: "June 12, 2022", +}; + export default function NewsPage() { return ( <> - + ); diff --git a/client/src/pages/news/news-card.tsx b/client/src/pages/news/news-card.tsx index e134360..0eb95c9 100644 --- a/client/src/pages/news/news-card.tsx +++ b/client/src/pages/news/news-card.tsx @@ -2,7 +2,7 @@ import { ArrowRight, Calendar } from "lucide-react"; import Image from "next/image"; import Link from "next/link"; -interface NewsCardProps { +export interface NewsCardProps { article: { id: number; title: string; @@ -31,11 +31,11 @@ export function NewsCard({ article }: NewsCardProps) { {article.date} -

+

{article.title}

-

+

{article.summary}

diff --git a/client/src/pages/news/news-featured-card.tsx b/client/src/pages/news/news-featured-card.tsx index 91ea8a1..349a1ca 100644 --- a/client/src/pages/news/news-featured-card.tsx +++ b/client/src/pages/news/news-featured-card.tsx @@ -1,12 +1,15 @@ +import { ArrowRight, Calendar } from "lucide-react"; import { Geist } from "next/font/google"; import Image from "next/image"; import Link from "next/link"; +import { NewsCardProps } from "./news-card"; + const geist = Geist({ subsets: ["latin"], }); -export function NewsFeaturedCard() { +export function NewsFeaturedCard({ article }: NewsCardProps) { return (
@@ -23,21 +26,22 @@ export function NewsFeaturedCard() { {/* Right */}
-

- June 12, 20226 -

+
+ +

+ June 12, 20226 +

+

- Washington State Passes Historic Clean Buildings Standard — What - It Means for Homeowners + {article.title}

- The newly enacted Clean Buildings Performance Standard sets - aggressive carbon reduction targets for ...{" "} + {article.summary}

@@ -45,15 +49,15 @@ export function NewsFeaturedCard() {

- {" "} - By Chase + By {article.author}

-

- {" "} - Read full article → -

+ Read full article + +
From 5c932ece25aeb11be890aecc9d7f0a924a0a6daf Mon Sep 17 00:00:00 2001 From: bawn Date: Tue, 7 Jul 2026 11:21:49 +0800 Subject: [PATCH 07/30] use shared card component --- client/src/pages/news/news-list.tsx | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/client/src/pages/news/news-list.tsx b/client/src/pages/news/news-list.tsx index 0513a10..df5c8d6 100644 --- a/client/src/pages/news/news-list.tsx +++ b/client/src/pages/news/news-list.tsx @@ -1,3 +1,7 @@ +import { Inter as FontSans } from "next/font/google"; + +import { ContentCard } from "@/components/content-card"; + import { NewsCard } from "./news-card"; const news = [ @@ -39,12 +43,28 @@ const news = [ }, ]; +const fontSans = FontSans({ + subsets: ["latin"], + variable: "--font-sans", +}); + export function NewsList() { return (
{news.map((article) => ( - + ))}
From 7c19e394603b83bb18bab8d0aa5de758e0ccf177 Mon Sep 17 00:00:00 2001 From: bawn Date: Fri, 10 Jul 2026 12:57:42 +0800 Subject: [PATCH 08/30] Add News API endpoints and serializer --- server/api/news/serializers.py | 8 ++++++++ server/api/news/urls.py | 10 ++++++++++ server/api/news/views.py | 7 ++++++- server/api/urls.py | 1 + 4 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 server/api/news/serializers.py create mode 100644 server/api/news/urls.py diff --git a/server/api/news/serializers.py b/server/api/news/serializers.py new file mode 100644 index 0000000..8f033f3 --- /dev/null +++ b/server/api/news/serializers.py @@ -0,0 +1,8 @@ +from rest_framework import serializers +from .models import News + +class NewsSerializer(serializers.ModelSerializer): + class Meta: + model = News + fields = "__all__" + # read_only_fields = ("id", "created_at") \ No newline at end of file diff --git a/server/api/news/urls.py b/server/api/news/urls.py new file mode 100644 index 0000000..492fd4c --- /dev/null +++ b/server/api/news/urls.py @@ -0,0 +1,10 @@ +from django.urls import path, include +from rest_framework.routers import DefaultRouter +from .views import NewsViewSet + +router = DefaultRouter() +router.register(r'news', NewsViewSet, basename='news') + +urlpatterns = [ + path('', include(router.urls)), +] diff --git a/server/api/news/views.py b/server/api/news/views.py index 91ea44a..d95e04f 100644 --- a/server/api/news/views.py +++ b/server/api/news/views.py @@ -1,3 +1,8 @@ from django.shortcuts import render +from rest_framework import viewsets +from api.news.serializers import NewsSerializer +from .models import News -# Create your views here. +class NewsViewSet(viewsets.ModelViewSet): + queryset = News.objects.all() + serializer_class = NewsSerializer diff --git a/server/api/urls.py b/server/api/urls.py index 1347bb7..2bcab95 100644 --- a/server/api/urls.py +++ b/server/api/urls.py @@ -21,4 +21,5 @@ urlpatterns = [ path("admin/", admin.site.urls), path("api/healthcheck/", include(("api.healthcheck.urls"))), + path("api/", include("api.news.urls")) ] From 13c13ba224028058f557861e62595e6c0ae191c6 Mon Sep 17 00:00:00 2001 From: bawn Date: Fri, 10 Jul 2026 13:00:03 +0800 Subject: [PATCH 09/30] Add horizontal layout to ContentCard --- client/src/components/content-card.tsx | 38 ++++++++++++++++++++++---- 1 file changed, 33 insertions(+), 5 deletions(-) diff --git a/client/src/components/content-card.tsx b/client/src/components/content-card.tsx index 630186d..30ff462 100644 --- a/client/src/components/content-card.tsx +++ b/client/src/components/content-card.tsx @@ -14,6 +14,7 @@ export interface ContentCardProps { buttonLabel?: string; author?: string; dateTime?: string; + layout?: "vertical" | "horizontal"; } export function ContentCard({ @@ -26,19 +27,39 @@ export function ContentCard({ buttonLabel = "View more", author, dateTime, + layout = "vertical", }: ContentCardProps) { const hasAuthor = Boolean(author); const hasDateTime = Boolean(dateTime); + const isVerticalLayout = layout === "vertical"; + let layoutClass: string; + + if (isVerticalLayout) { + if (hasDateTime) { + layoutClass = "aspect-[10/13] max-w-[clamp(18rem,30vw,24rem)]"; + } else { + layoutClass = "aspect-[10/11] max-w-[clamp(18rem,30vw,24rem)]"; + } + } else { + layoutClass = "flex-row aspect-[9/2] max-w-none"; + } return (
-
+
{imageSrc ? (
-
+
{hasDateTime ? (
@@ -71,7 +92,14 @@ export function ContentCard({
-

+

{title}

From 7f8c27228c4f800db501b7d56b888c0f64a24669 Mon Sep 17 00:00:00 2001 From: bawn Date: Fri, 10 Jul 2026 13:00:15 +0800 Subject: [PATCH 10/30] Integrate news API --- client/src/hooks/news.ts | 59 +++++++++++++++++++++++++ client/src/pages/news/index.tsx | 68 ++++++++++++++++++++++++----- client/src/pages/news/news-list.tsx | 56 +++++------------------- 3 files changed, 125 insertions(+), 58 deletions(-) create mode 100644 client/src/hooks/news.ts diff --git a/client/src/hooks/news.ts b/client/src/hooks/news.ts new file mode 100644 index 0000000..e263f4e --- /dev/null +++ b/client/src/hooks/news.ts @@ -0,0 +1,59 @@ +import { useQuery, UseQueryOptions } from "@tanstack/react-query"; + +import api from "@/lib/api"; + +export interface NewsArticle { + id: string; + title: string; + slug: string; + summary: string | null; + body: string | null; + author: string | null; + published_at: string | null; +} + +const fetchNews = async () => { + const response = await api.get("/news/"); + + return response.data; +}; + +const fetchNewsArticle = async (id: string) => { + const response = await api.get(`/news/${id}/`); + + return response.data; +}; + +export const useNews = ( + args?: Omit, "queryKey" | "queryFn">, +) => { + return useQuery({ + ...args, + queryKey: ["news"], + queryFn: fetchNews, + }); +}; + +export const useNewsArticle = ( + id?: string, + args?: Omit, "queryKey" | "queryFn">, +) => { + return useQuery({ + ...args, + enabled: Boolean(id) && (args?.enabled ?? true), + queryKey: ["news", id], + queryFn: () => fetchNewsArticle(id as string), + }); +}; + +export const formatPublishedDate = (publishedAt: string | null) => { + if (!publishedAt) { + return "Unpublished"; + } + + return new Intl.DateTimeFormat("en-AU", { + day: "numeric", + month: "long", + year: "numeric", + }).format(new Date(`${publishedAt}T00:00:00`)); +}; diff --git a/client/src/pages/news/index.tsx b/client/src/pages/news/index.tsx index fabb9bc..e5637de 100644 --- a/client/src/pages/news/index.tsx +++ b/client/src/pages/news/index.tsx @@ -1,23 +1,67 @@ -import { NewsFeaturedCard } from "./news-featured-card"; +import { Inter as FontSans } from "next/font/google"; + +import { ContentCard } from "@/components/content-card"; +import { formatPublishedDate, useNews } from "@/hooks/news"; + import { NewsHero } from "./news-hero"; import { NewsList } from "./news-list"; -const featuredArticle = { - id: 1, - title: "Washington State Passes Historic Clean Buildings Standard", - summary: - "The newly enacted Clean Buildings Performance Standard sets aggressive carbon reduction targets for commercial buildings across Washington State.", - image: "/cover-test.jpg", - author: "Chase", - date: "June 12, 2022", -}; +const fontSans = FontSans({ + subsets: ["latin"], + variable: "--font-sans", +}); export default function NewsPage() { + const { data: articles = [], isError, isLoading } = useNews(); + const [featuredArticle, ...otherArticles] = articles; + return ( <> - - + + {isLoading ? ( +

+

+ Loading news... +

+
+ ) : null} + + {isError ? ( +
+

+ News could not be loaded. Please try again later. +

+
+ ) : null} + + {!isLoading && !isError && !featuredArticle ? ( +
+

+ No news articles have been published yet. +

+
+ ) : null} + + {featuredArticle ? ( +
+ +
+ ) : null} + + {otherArticles.length > 0 ? : null} ); } diff --git a/client/src/pages/news/news-list.tsx b/client/src/pages/news/news-list.tsx index df5c8d6..7d6acfe 100644 --- a/client/src/pages/news/news-list.tsx +++ b/client/src/pages/news/news-list.tsx @@ -1,69 +1,33 @@ import { Inter as FontSans } from "next/font/google"; import { ContentCard } from "@/components/content-card"; - -import { NewsCard } from "./news-card"; - -const news = [ - { - id: 1, - title: "Washington State Passes Historic Clean Buildings Standard", - summary: - "The newly enacted Clean Buildings Performance Standard sets aggressive carbon reduction targets for commercial buildings across Washington State.", - image: "/cover-test.jpg", - author: "Chase", - date: "June 24, 2026", - }, - { - id: 2, - title: "Australia Invests in Community Solar Projects", - summary: - "New funding will support renewable energy projects across regional communities, helping reduce electricity costs and emissions.", - image: "/cover-test.jpg", - author: "Chase", - date: "June 20, 2026", - }, - { - id: 3, - title: "Battery Storage Reaches Record Deployment", - summary: - "Large-scale battery installations continue to expand rapidly, improving grid stability and supporting renewable energy integration.", - image: "/cover-test.jpg", - author: "Chase", - date: "June 18, 2026", - }, - { - id: 4, - title: "Electric Vehicle Sales Continue to Grow", - summary: - "EV adoption in Australia has accelerated thanks to improved charging infrastructure and lower battery prices.", - image: "/cover-test.jpg", - author: "Chase", - date: "June 15, 2026", - }, -]; +import { formatPublishedDate, NewsArticle } from "@/hooks/news"; const fontSans = FontSans({ subsets: ["latin"], variable: "--font-sans", }); -export function NewsList() { +interface NewsListProps { + articles: NewsArticle[]; +} + +export function NewsList({ articles }: NewsListProps) { return (
- {news.map((article) => ( + {articles.map((article) => ( ))}
From 091480ad01b77462fdc2184907fd52dc1338d18d Mon Sep 17 00:00:00 2001 From: bawn Date: Sat, 11 Jul 2026 11:53:57 +0800 Subject: [PATCH 11/30] Delete news-card.tsx --- client/src/pages/news/news-card.tsx | 56 ----------------------------- 1 file changed, 56 deletions(-) delete mode 100644 client/src/pages/news/news-card.tsx diff --git a/client/src/pages/news/news-card.tsx b/client/src/pages/news/news-card.tsx deleted file mode 100644 index 0eb95c9..0000000 --- a/client/src/pages/news/news-card.tsx +++ /dev/null @@ -1,56 +0,0 @@ -import { ArrowRight, Calendar } from "lucide-react"; -import Image from "next/image"; -import Link from "next/link"; - -export interface NewsCardProps { - article: { - id: number; - title: string; - summary: string; - image: string; - author: string; - date: string; - }; -} - -export function NewsCard({ article }: NewsCardProps) { - return ( -
-
- {article.title} -
- -
-
- - {article.date} -
- -

- {article.title} -

- -

- {article.summary} -

- -
- By {article.author} - - - Read full article - - -
-
-
- ); -} From c4eaac44b4c6736c1cc61aa77b194fc0c7b927b7 Mon Sep 17 00:00:00 2001 From: bawn Date: Sat, 11 Jul 2026 11:53:59 +0800 Subject: [PATCH 12/30] Delete news-featured-card.tsx --- client/src/pages/news/news-featured-card.tsx | 66 -------------------- 1 file changed, 66 deletions(-) delete mode 100644 client/src/pages/news/news-featured-card.tsx diff --git a/client/src/pages/news/news-featured-card.tsx b/client/src/pages/news/news-featured-card.tsx deleted file mode 100644 index 349a1ca..0000000 --- a/client/src/pages/news/news-featured-card.tsx +++ /dev/null @@ -1,66 +0,0 @@ -import { ArrowRight, Calendar } from "lucide-react"; -import { Geist } from "next/font/google"; -import Image from "next/image"; -import Link from "next/link"; - -import { NewsCardProps } from "./news-card"; - -const geist = Geist({ - subsets: ["latin"], -}); - -export function NewsFeaturedCard({ article }: NewsCardProps) { - return ( -
-
- {/* Left */} -
- Featured Image -
- - {/* Right */} -
-
-
- -

- June 12, 20226 -

-
-
-

- {article.title} -

-

- {article.summary} -

-
-
-
-

- By {article.author} -

- - Read full article - - -
-
-
-
- ); -} From fbf0187f029eaf613f089df7941f528dbddc50fc Mon Sep 17 00:00:00 2001 From: Kevin Tan Date: Sat, 11 Jul 2026 06:46:31 +0000 Subject: [PATCH 13/30] integrated backend for [id].tsx page for full reports. also added image field for NewsArticle interface --- client/src/hooks/news.ts | 1 + client/src/pages/news/[id].tsx | 63 ++++++++-------------------------- 2 files changed, 15 insertions(+), 49 deletions(-) diff --git a/client/src/hooks/news.ts b/client/src/hooks/news.ts index e263f4e..de335d6 100644 --- a/client/src/hooks/news.ts +++ b/client/src/hooks/news.ts @@ -10,6 +10,7 @@ export interface NewsArticle { body: string | null; author: string | null; published_at: string | null; + image: string; } const fetchNews = async () => { diff --git a/client/src/pages/news/[id].tsx b/client/src/pages/news/[id].tsx index 53bcbc9..aacf895 100644 --- a/client/src/pages/news/[id].tsx +++ b/client/src/pages/news/[id].tsx @@ -3,62 +3,27 @@ import Image from "next/image"; import Link from "next/link"; import { useRouter } from "next/router"; -// taken from hardcoded data from news-list.tsx -const news = [ - { - id: 1, - title: "Washington State Passes Historic Clean Buildings Standard", - summary: - "The newly enacted Clean Buildings Performance Standard sets aggressive carbon reduction targets for commercial buildings across Washington State.", - image: "/cover-test.jpg", - author: "Kevin", - date: "June 24, 2026", - }, - { - id: 2, - title: "Australia Invests in Community Solar Projects", - summary: - "New funding will support renewable energy projects across regional communities, helping reduce electricity costs and emissions.", - image: "/cover-test.jpg", - author: "Kevin", - date: "June 20, 2026", - }, - { - id: 3, - title: "Battery Storage Reaches Record Deployment", - summary: - "Large-scale battery installations continue to expand rapidly, improving grid stability and supporting renewable energy integration.", - image: "/cover-test.jpg", - author: "Kevin", - date: "June 18, 2026", - }, - { - id: 4, - title: "Electric Vehicle Sales Continue to Grow", - summary: - "EV adoption in Australia has accelerated thanks to improved charging infrastructure and lower battery prices.", - image: "/cover-test.jpg", - author: "Kevin", - date: "June 15, 2026", - }, -]; +import { useNewsArticle } from "@/hooks/news"; export default function ArticlePage() { const router = useRouter(); const { id } = router.query; - // Find the article based on the id from the URL - const article = news.find((item) => item.id === Number(id)); + const { data: article, isLoading, error } = useNewsArticle(id as string); - if (!router.isReady || !article) { - return
Loading...
; + if (isLoading) { + return

Loading...

; + } + + if (error || !article) { + return

Article not found.

; } return ( - <> +
{article.title}
- {article.date} + {article.published_at} By {article.author}
-
+
-

{article.summary}

+

{article.body}

- +
); } From 36889e240a9675605241b48761c1e832927695fd Mon Sep 17 00:00:00 2001 From: Kevin Tan Date: Sat, 11 Jul 2026 06:56:07 +0000 Subject: [PATCH 14/30] modified css styling for news report pages --- client/src/pages/news/[id].tsx | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/client/src/pages/news/[id].tsx b/client/src/pages/news/[id].tsx index aacf895..7ff9e6f 100644 --- a/client/src/pages/news/[id].tsx +++ b/client/src/pages/news/[id].tsx @@ -23,7 +23,7 @@ export default function ArticlePage() {
{article.title} Back to News -
-

- {article.title} -

+
+

{article.title}

-
+
{article.published_at} - By {article.author} + By {article.author}
-
-
+
+

{article.body}

From d852bd9af2908d459cd2b2049f136ae71864b19c Mon Sep 17 00:00:00 2001 From: Kevin Tan Date: Sat, 11 Jul 2026 07:39:21 +0000 Subject: [PATCH 15/30] added image field and installed Pillow --- server/api/news/models.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/server/api/news/models.py b/server/api/news/models.py index a33e2a9..772c65b 100644 --- a/server/api/news/models.py +++ b/server/api/news/models.py @@ -3,13 +3,16 @@ # Create your models here. + class News(models.Model): id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) title = models.CharField(max_length=255) slug = models.SlugField(max_length=255, unique=True) - summary = models.TextField(blank=True, null=True) - body = models.TextField(blank=True, null=True) - author = models.CharField(max_length=255, blank=True, null=True) - published_at = models.DateField(blank=True, null=True) + summary = models.TextField(blank=True) + body = models.TextField(blank=True) + author = models.CharField(max_length=255, blank=True) + published_at = models.DateField(blank=True) + image = models.ImageField(upload_to='news_images/', blank=True, null=True) + def __str__(self): - return self.title \ No newline at end of file + return self.title From 094e6e11351e85f007d02fade1a42746d9826dff Mon Sep 17 00:00:00 2001 From: Kevin Tan Date: Sat, 11 Jul 2026 09:53:54 +0000 Subject: [PATCH 16/30] modified news report page to correctly render image from backend. currently only supports local images as it is rendered as a url, can add backend endpoint at later stages. --- client/next.config.mjs | 10 ++++++++++ server/api/news/models.py | 2 +- server/api/news/urls.py | 2 +- server/api/settings.py | 2 ++ server/api/urls.py | 7 ++++++- 5 files changed, 20 insertions(+), 3 deletions(-) diff --git a/client/next.config.mjs b/client/next.config.mjs index e9441a6..f976033 100644 --- a/client/next.config.mjs +++ b/client/next.config.mjs @@ -8,6 +8,16 @@ const isWindowsDevContainer = () => /** @type {import('next').NextConfig} */ const nextConfig = { reactStrictMode: true, + images: { + remotePatterns: [ + { + protocol: "http", + hostname: "localhost", + port: "8000", + pathname: "/news_images/**", + }, + ], + }, // dumb fix for windows docker webpack: isWindowsDevContainer() ? (config) => { diff --git a/server/api/news/models.py b/server/api/news/models.py index 772c65b..3b1d68b 100644 --- a/server/api/news/models.py +++ b/server/api/news/models.py @@ -12,7 +12,7 @@ class News(models.Model): body = models.TextField(blank=True) author = models.CharField(max_length=255, blank=True) published_at = models.DateField(blank=True) - image = models.ImageField(upload_to='news_images/', blank=True, null=True) + image = models.ImageField(upload_to='', blank=True, null=True) def __str__(self): return self.title diff --git a/server/api/news/urls.py b/server/api/news/urls.py index 492fd4c..40c9f9a 100644 --- a/server/api/news/urls.py +++ b/server/api/news/urls.py @@ -3,7 +3,7 @@ from .views import NewsViewSet router = DefaultRouter() -router.register(r'news', NewsViewSet, basename='news') +router.register(r'', NewsViewSet, basename='news') urlpatterns = [ path('', include(router.urls)), diff --git a/server/api/settings.py b/server/api/settings.py index 049206c..c645fc7 100644 --- a/server/api/settings.py +++ b/server/api/settings.py @@ -146,6 +146,8 @@ os.path.dirname(os.path.abspath(__file__)))) # <- '/' directory STATIC_URL = "/static/" +MEDIA_URL = "/news_images/" +MEDIA_ROOT = BASE_DIR / "news_images" # STATIC_ROOT is where the static files get copied to when "collectstatic" is run. STATIC_ROOT = "static_files" diff --git a/server/api/urls.py b/server/api/urls.py index 2bcab95..9f6fc7a 100644 --- a/server/api/urls.py +++ b/server/api/urls.py @@ -17,9 +17,14 @@ from django.contrib import admin from django.urls import path, include +from django.conf import settings +from django.conf.urls.static import static urlpatterns = [ path("admin/", admin.site.urls), path("api/healthcheck/", include(("api.healthcheck.urls"))), - path("api/", include("api.news.urls")) + path("api/news/", include(("api.news.urls"))), ] + +if settings.DEBUG: + urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) From 7999c140731648d7b6c4b642eeb83695f80516ee Mon Sep 17 00:00:00 2001 From: Kevin Tan Date: Sat, 11 Jul 2026 10:23:50 +0000 Subject: [PATCH 17/30] modified main news page to render images --- client/src/pages/news/index.tsx | 4 ++-- client/src/pages/news/news-list.tsx | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/client/src/pages/news/index.tsx b/client/src/pages/news/index.tsx index e5637de..97087ec 100644 --- a/client/src/pages/news/index.tsx +++ b/client/src/pages/news/index.tsx @@ -48,8 +48,8 @@ export default function NewsPage() { Date: Wed, 15 Jul 2026 10:59:25 +0000 Subject: [PATCH 18/30] fixed failed github actions - added newlines --- server/api/news/serializers.py | 3 ++- server/api/news/tests.py | 2 +- server/api/news/views.py | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/server/api/news/serializers.py b/server/api/news/serializers.py index 8f033f3..d70af86 100644 --- a/server/api/news/serializers.py +++ b/server/api/news/serializers.py @@ -1,8 +1,9 @@ from rest_framework import serializers from .models import News + class NewsSerializer(serializers.ModelSerializer): class Meta: model = News fields = "__all__" - # read_only_fields = ("id", "created_at") \ No newline at end of file + # read_only_fields = ("id", "created_at") diff --git a/server/api/news/tests.py b/server/api/news/tests.py index 7ce503c..a79ca8b 100644 --- a/server/api/news/tests.py +++ b/server/api/news/tests.py @@ -1,3 +1,3 @@ -from django.test import TestCase +# from django.test import TestCase # Create your tests here. diff --git a/server/api/news/views.py b/server/api/news/views.py index d95e04f..790450c 100644 --- a/server/api/news/views.py +++ b/server/api/news/views.py @@ -1,8 +1,8 @@ -from django.shortcuts import render from rest_framework import viewsets from api.news.serializers import NewsSerializer from .models import News + class NewsViewSet(viewsets.ModelViewSet): queryset = News.objects.all() serializer_class = NewsSerializer From b7753dc7a4f0c5f3cfca8145e98ccdac272fde3b Mon Sep 17 00:00:00 2001 From: Kevin Tan Date: Wed, 15 Jul 2026 11:03:18 +0000 Subject: [PATCH 19/30] updated dependencies file, adding Pillow for image upload --- server/pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/pyproject.toml b/server/pyproject.toml index 4a88bdf..9e4ddd5 100644 --- a/server/pyproject.toml +++ b/server/pyproject.toml @@ -16,7 +16,7 @@ freezegun = "^1.5.1" gunicorn = "^23.0.0" python-dotenv = "^1.0.1" django-extensions = "^3.2.3" - +Pillow = "^10.0.0" [tool.poetry.group.dev.dependencies] pytest = "^8.3.2" From 22a88ea4df65584c58a38b97b800494f1e45baac Mon Sep 17 00:00:00 2001 From: Kevin Tan Date: Wed, 15 Jul 2026 11:09:38 +0000 Subject: [PATCH 20/30] updated migration file to fix error on actions --- server/api/news/migrations/0001_initial.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/server/api/news/migrations/0001_initial.py b/server/api/news/migrations/0001_initial.py index d116c64..c54ec98 100644 --- a/server/api/news/migrations/0001_initial.py +++ b/server/api/news/migrations/0001_initial.py @@ -25,9 +25,9 @@ class Migration(migrations.Migration): ), ("title", models.CharField(max_length=255)), ("slug", models.SlugField(max_length=255, unique=True)), - ("summary", models.TextField(blank=True, null=True)), - ("body", models.TextField(blank=True, null=True)), - ("author", models.CharField(blank=True, max_length=255, null=True)), + ("summary", models.TextField(blank=True)), + ("body", models.TextField(blank=True)), + ("author", models.CharField(blank=True, max_length=255)), ("published_at", models.DateField(blank=True, null=True)), ], ), From 68f5141e1ba1e1185ee2d2120d96203e9167cf00 Mon Sep 17 00:00:00 2001 From: Kevin Tan Date: Wed, 15 Jul 2026 11:15:50 +0000 Subject: [PATCH 21/30] ran poetry lock as new dependencies were added --- server/poetry.lock | 171 +++++++++++++++++++++++++++++++-------------- 1 file changed, 118 insertions(+), 53 deletions(-) diff --git a/server/poetry.lock b/server/poetry.lock index 4bc80ce..918d7c6 100644 --- a/server/poetry.lock +++ b/server/poetry.lock @@ -1,19 +1,19 @@ -# This file is automatically @generated by Poetry 2.4.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.4 and should not be changed by hand. [[package]] name = "asgiref" -version = "3.11.1" +version = "3.12.1" description = "ASGI specs, helper code, and adapters" optional = false -python-versions = ">=3.9" -groups = ["main"] +python-versions = ">=3.10" files = [ - {file = "asgiref-3.11.1-py3-none-any.whl", hash = "sha256:e8667a091e69529631969fd45dc268fa79b99c92c5fcdda727757e52146ec133"}, - {file = "asgiref-3.11.1.tar.gz", hash = "sha256:5f184dc43b7e763efe848065441eac62229c9f7b0475f41f80e207a114eda4ce"}, + {file = "asgiref-3.12.1-py3-none-any.whl", hash = "sha256:fe386d1c2bff7259ea95929266d12a8cf9a8b5a1c2598402967d8792e7a7c094"}, + {file = "asgiref-3.12.1.tar.gz", hash = "sha256:59dcb51c272ad209d59bed5708a64a333083e86017d7fcdd67498eeab7784340"}, ] [package.extras] -tests = ["mypy (>=1.14.0)", "pytest", "pytest-asyncio"] +mypy = ["mypy (>=1.14.0)"] +tests = ["pytest", "pytest-asyncio"] [[package]] name = "astroid" @@ -21,7 +21,6 @@ version = "2.15.8" description = "An abstract syntax tree for Python with inference support." optional = false python-versions = ">=3.7.2" -groups = ["dev"] files = [ {file = "astroid-2.15.8-py3-none-any.whl", hash = "sha256:1aa149fc5c6589e3d0ece885b4491acd80af4f087baafa3fb5203b113e68cd3c"}, {file = "astroid-2.15.8.tar.gz", hash = "sha256:6c107453dffee9055899705de3c9ead36e74119cee151e5a9aaf7f0b0e020a6a"}, @@ -37,8 +36,6 @@ version = "0.4.6" description = "Cross-platform colored terminal text." optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" -groups = ["dev"] -markers = "sys_platform == \"win32\"" files = [ {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, @@ -46,14 +43,13 @@ files = [ [[package]] name = "django" -version = "5.2.15" +version = "5.2.16" description = "A high-level Python web framework that encourages rapid development and clean, pragmatic design." optional = false python-versions = ">=3.10" -groups = ["main"] files = [ - {file = "django-5.2.15-py3-none-any.whl", hash = "sha256:0eb4a9bb1853a35b0286dbc6d916bd352c8c2687195a7f2d6f80cefd840e4970"}, - {file = "django-5.2.15.tar.gz", hash = "sha256:5154a9bf84ac01dde011e367f355c07dbb329532e06810dcf3ef2af269e236e7"}, + {file = "django-5.2.16-py3-none-any.whl", hash = "sha256:04f354bf9d807a86ad1a8392fe3808d362358a8eafc322848e0e43e59b24371d"}, + {file = "django-5.2.16.tar.gz", hash = "sha256:59ea02020c3136fce14bef0bbece21a10a4febef5eed1c51c22ae468efa22200"}, ] [package.dependencies] @@ -71,7 +67,6 @@ version = "4.9.0" description = "django-cors-headers is a Django application for handling the server headers required for Cross-Origin Resource Sharing (CORS)." optional = false python-versions = ">=3.9" -groups = ["main"] files = [ {file = "django_cors_headers-4.9.0-py3-none-any.whl", hash = "sha256:15c7f20727f90044dcee2216a9fd7303741a864865f0c3657e28b7056f61b449"}, {file = "django_cors_headers-4.9.0.tar.gz", hash = "sha256:fe5d7cb59fdc2c8c646ce84b727ac2bca8912a247e6e68e1fb507372178e59e8"}, @@ -87,7 +82,6 @@ version = "3.2.3" description = "Extensions for Django" optional = false python-versions = ">=3.6" -groups = ["main"] files = [ {file = "django-extensions-3.2.3.tar.gz", hash = "sha256:44d27919d04e23b3f40231c4ab7af4e61ce832ef46d610cc650d53e68328410a"}, {file = "django_extensions-3.2.3-py3-none-any.whl", hash = "sha256:9600b7562f79a92cbf1fde6403c04fee314608fefbb595502e34383ae8203401"}, @@ -102,7 +96,6 @@ version = "3.17.1" description = "Web APIs for Django, made easy." optional = false python-versions = ">=3.10" -groups = ["main"] files = [ {file = "djangorestframework-3.17.1-py3-none-any.whl", hash = "sha256:c3c74dd3e83a5a3efc37b3c18d92bd6f86a6791c7b7d4dff62bb068500e76457"}, {file = "djangorestframework-3.17.1.tar.gz", hash = "sha256:a6def5f447fe78ff853bff1d47a3c59bf38f5434b031780b351b0c73a62db1a5"}, @@ -117,7 +110,6 @@ version = "6.1.0" description = "the modular source code checker: pep8 pyflakes and co" optional = false python-versions = ">=3.8.1" -groups = ["dev"] files = [ {file = "flake8-6.1.0-py2.py3-none-any.whl", hash = "sha256:ffdfce58ea94c6580c77888a86506937f9a1a227dfcd15f245d694ae20a6b6e5"}, {file = "flake8-6.1.0.tar.gz", hash = "sha256:d5b3857f07c030bdb5bf41c7f53799571d75c4491748a3adcd47de929e34cd23"}, @@ -134,7 +126,6 @@ version = "1.4" description = "Plugin to catch bad style specific to Django Projects." optional = false python-versions = ">=3.7.2,<4.0.0" -groups = ["dev"] files = [ {file = "flake8_django-1.4.tar.gz", hash = "sha256:4debba883084191568e3187416d1d6bdd4abd826da988f197a3c36572e9f30de"}, ] @@ -149,7 +140,6 @@ version = "1.5.5" description = "Let your Python tests travel through time" optional = false python-versions = ">=3.8" -groups = ["main"] files = [ {file = "freezegun-1.5.5-py3-none-any.whl", hash = "sha256:cd557f4a75cf074e84bc374249b9dd491eaeacd61376b9eb3c423282211619d2"}, {file = "freezegun-1.5.5.tar.gz", hash = "sha256:ac7742a6cc6c25a2c35e9292dfd554b897b517d2dec26891a2e8debf205cb94a"}, @@ -164,7 +154,6 @@ version = "23.0.0" description = "WSGI HTTP Server for UNIX" optional = false python-versions = ">=3.7" -groups = ["main"] files = [ {file = "gunicorn-23.0.0-py3-none-any.whl", hash = "sha256:ec400d38950de4dfd418cff8328b2c8faed0edb0d517d3394e457c317908ca4d"}, {file = "gunicorn-23.0.0.tar.gz", hash = "sha256:f014447a0101dc57e294f6c18ca6b40227a4c90e9bdb586042628030cba004ec"}, @@ -186,7 +175,6 @@ version = "2.3.0" description = "brain-dead simple config-ini parsing" optional = false python-versions = ">=3.10" -groups = ["dev"] files = [ {file = "iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12"}, {file = "iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730"}, @@ -198,7 +186,6 @@ version = "1.12.0" description = "A fast and thorough lazy object proxy." optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ {file = "lazy_object_proxy-1.12.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:61d5e3310a4aa5792c2b599a7a78ccf8687292c8eb09cf187cca8f09cf6a7519"}, {file = "lazy_object_proxy-1.12.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c1ca33565f698ac1aece152a10f432415d1a2aa9a42dfe23e5ba2bc255ab91f6"}, @@ -252,7 +239,6 @@ version = "0.7.0" description = "McCabe checker, plugin for flake8" optional = false python-versions = ">=3.6" -groups = ["dev"] files = [ {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, @@ -264,19 +250,114 @@ version = "26.2" description = "Core utilities for Python packages" optional = false python-versions = ">=3.8" -groups = ["main", "dev"] files = [ {file = "packaging-26.2-py3-none-any.whl", hash = "sha256:5fc45236b9446107ff2415ce77c807cee2862cb6fac22b8a73826d0693b0980e"}, {file = "packaging-26.2.tar.gz", hash = "sha256:ff452ff5a3e828ce110190feff1178bb1f2ea2281fa2075aadb987c2fb221661"}, ] +[[package]] +name = "pillow" +version = "10.4.0" +description = "Python Imaging Library (Fork)" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pillow-10.4.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:4d9667937cfa347525b319ae34375c37b9ee6b525440f3ef48542fcf66f2731e"}, + {file = "pillow-10.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:543f3dc61c18dafb755773efc89aae60d06b6596a63914107f75459cf984164d"}, + {file = "pillow-10.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7928ecbf1ece13956b95d9cbcfc77137652b02763ba384d9ab508099a2eca856"}, + {file = "pillow-10.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4d49b85c4348ea0b31ea63bc75a9f3857869174e2bf17e7aba02945cd218e6f"}, + {file = "pillow-10.4.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:6c762a5b0997f5659a5ef2266abc1d8851ad7749ad9a6a5506eb23d314e4f46b"}, + {file = "pillow-10.4.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:a985e028fc183bf12a77a8bbf36318db4238a3ded7fa9df1b9a133f1cb79f8fc"}, + {file = "pillow-10.4.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:812f7342b0eee081eaec84d91423d1b4650bb9828eb53d8511bcef8ce5aecf1e"}, + {file = "pillow-10.4.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ac1452d2fbe4978c2eec89fb5a23b8387aba707ac72810d9490118817d9c0b46"}, + {file = "pillow-10.4.0-cp310-cp310-win32.whl", hash = "sha256:bcd5e41a859bf2e84fdc42f4edb7d9aba0a13d29a2abadccafad99de3feff984"}, + {file = "pillow-10.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:ecd85a8d3e79cd7158dec1c9e5808e821feea088e2f69a974db5edf84dc53141"}, + {file = "pillow-10.4.0-cp310-cp310-win_arm64.whl", hash = "sha256:ff337c552345e95702c5fde3158acb0625111017d0e5f24bf3acdb9cc16b90d1"}, + {file = "pillow-10.4.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:0a9ec697746f268507404647e531e92889890a087e03681a3606d9b920fbee3c"}, + {file = "pillow-10.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dfe91cb65544a1321e631e696759491ae04a2ea11d36715eca01ce07284738be"}, + {file = "pillow-10.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5dc6761a6efc781e6a1544206f22c80c3af4c8cf461206d46a1e6006e4429ff3"}, + {file = "pillow-10.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e84b6cc6a4a3d76c153a6b19270b3526a5a8ed6b09501d3af891daa2a9de7d6"}, + {file = "pillow-10.4.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:bbc527b519bd3aa9d7f429d152fea69f9ad37c95f0b02aebddff592688998abe"}, + {file = "pillow-10.4.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:76a911dfe51a36041f2e756b00f96ed84677cdeb75d25c767f296c1c1eda1319"}, + {file = "pillow-10.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:59291fb29317122398786c2d44427bbd1a6d7ff54017075b22be9d21aa59bd8d"}, + {file = "pillow-10.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:416d3a5d0e8cfe4f27f574362435bc9bae57f679a7158e0096ad2beb427b8696"}, + {file = "pillow-10.4.0-cp311-cp311-win32.whl", hash = "sha256:7086cc1d5eebb91ad24ded9f58bec6c688e9f0ed7eb3dbbf1e4800280a896496"}, + {file = "pillow-10.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:cbed61494057c0f83b83eb3a310f0bf774b09513307c434d4366ed64f4128a91"}, + {file = "pillow-10.4.0-cp311-cp311-win_arm64.whl", hash = "sha256:f5f0c3e969c8f12dd2bb7e0b15d5c468b51e5017e01e2e867335c81903046a22"}, + {file = "pillow-10.4.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:673655af3eadf4df6b5457033f086e90299fdd7a47983a13827acf7459c15d94"}, + {file = "pillow-10.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:866b6942a92f56300012f5fbac71f2d610312ee65e22f1aa2609e491284e5597"}, + {file = "pillow-10.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29dbdc4207642ea6aad70fbde1a9338753d33fb23ed6956e706936706f52dd80"}, + {file = "pillow-10.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf2342ac639c4cf38799a44950bbc2dfcb685f052b9e262f446482afaf4bffca"}, + {file = "pillow-10.4.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:f5b92f4d70791b4a67157321c4e8225d60b119c5cc9aee8ecf153aace4aad4ef"}, + {file = "pillow-10.4.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:86dcb5a1eb778d8b25659d5e4341269e8590ad6b4e8b44d9f4b07f8d136c414a"}, + {file = "pillow-10.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:780c072c2e11c9b2c7ca37f9a2ee8ba66f44367ac3e5c7832afcfe5104fd6d1b"}, + {file = "pillow-10.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:37fb69d905be665f68f28a8bba3c6d3223c8efe1edf14cc4cfa06c241f8c81d9"}, + {file = "pillow-10.4.0-cp312-cp312-win32.whl", hash = "sha256:7dfecdbad5c301d7b5bde160150b4db4c659cee2b69589705b6f8a0c509d9f42"}, + {file = "pillow-10.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:1d846aea995ad352d4bdcc847535bd56e0fd88d36829d2c90be880ef1ee4668a"}, + {file = "pillow-10.4.0-cp312-cp312-win_arm64.whl", hash = "sha256:e553cad5179a66ba15bb18b353a19020e73a7921296a7979c4a2b7f6a5cd57f9"}, + {file = "pillow-10.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8bc1a764ed8c957a2e9cacf97c8b2b053b70307cf2996aafd70e91a082e70df3"}, + {file = "pillow-10.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6209bb41dc692ddfee4942517c19ee81b86c864b626dbfca272ec0f7cff5d9fb"}, + {file = "pillow-10.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bee197b30783295d2eb680b311af15a20a8b24024a19c3a26431ff83eb8d1f70"}, + {file = "pillow-10.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ef61f5dd14c300786318482456481463b9d6b91ebe5ef12f405afbba77ed0be"}, + {file = "pillow-10.4.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:297e388da6e248c98bc4a02e018966af0c5f92dfacf5a5ca22fa01cb3179bca0"}, + {file = "pillow-10.4.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:e4db64794ccdf6cb83a59d73405f63adbe2a1887012e308828596100a0b2f6cc"}, + {file = "pillow-10.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bd2880a07482090a3bcb01f4265f1936a903d70bc740bfcb1fd4e8a2ffe5cf5a"}, + {file = "pillow-10.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4b35b21b819ac1dbd1233317adeecd63495f6babf21b7b2512d244ff6c6ce309"}, + {file = "pillow-10.4.0-cp313-cp313-win32.whl", hash = "sha256:551d3fd6e9dc15e4c1eb6fc4ba2b39c0c7933fa113b220057a34f4bb3268a060"}, + {file = "pillow-10.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:030abdbe43ee02e0de642aee345efa443740aa4d828bfe8e2eb11922ea6a21ea"}, + {file = "pillow-10.4.0-cp313-cp313-win_arm64.whl", hash = "sha256:5b001114dd152cfd6b23befeb28d7aee43553e2402c9f159807bf55f33af8a8d"}, + {file = "pillow-10.4.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:8d4d5063501b6dd4024b8ac2f04962d661222d120381272deea52e3fc52d3736"}, + {file = "pillow-10.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7c1ee6f42250df403c5f103cbd2768a28fe1a0ea1f0f03fe151c8741e1469c8b"}, + {file = "pillow-10.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b15e02e9bb4c21e39876698abf233c8c579127986f8207200bc8a8f6bb27acf2"}, + {file = "pillow-10.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a8d4bade9952ea9a77d0c3e49cbd8b2890a399422258a77f357b9cc9be8d680"}, + {file = "pillow-10.4.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:43efea75eb06b95d1631cb784aa40156177bf9dd5b4b03ff38979e048258bc6b"}, + {file = "pillow-10.4.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:950be4d8ba92aca4b2bb0741285a46bfae3ca699ef913ec8416c1b78eadd64cd"}, + {file = "pillow-10.4.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:d7480af14364494365e89d6fddc510a13e5a2c3584cb19ef65415ca57252fb84"}, + {file = "pillow-10.4.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:73664fe514b34c8f02452ffb73b7a92c6774e39a647087f83d67f010eb9a0cf0"}, + {file = "pillow-10.4.0-cp38-cp38-win32.whl", hash = "sha256:e88d5e6ad0d026fba7bdab8c3f225a69f063f116462c49892b0149e21b6c0a0e"}, + {file = "pillow-10.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:5161eef006d335e46895297f642341111945e2c1c899eb406882a6c61a4357ab"}, + {file = "pillow-10.4.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:0ae24a547e8b711ccaaf99c9ae3cd975470e1a30caa80a6aaee9a2f19c05701d"}, + {file = "pillow-10.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:298478fe4f77a4408895605f3482b6cc6222c018b2ce565c2b6b9c354ac3229b"}, + {file = "pillow-10.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:134ace6dc392116566980ee7436477d844520a26a4b1bd4053f6f47d096997fd"}, + {file = "pillow-10.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:930044bb7679ab003b14023138b50181899da3f25de50e9dbee23b61b4de2126"}, + {file = "pillow-10.4.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:c76e5786951e72ed3686e122d14c5d7012f16c8303a674d18cdcd6d89557fc5b"}, + {file = "pillow-10.4.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:b2724fdb354a868ddf9a880cb84d102da914e99119211ef7ecbdc613b8c96b3c"}, + {file = "pillow-10.4.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:dbc6ae66518ab3c5847659e9988c3b60dc94ffb48ef9168656e0019a93dbf8a1"}, + {file = "pillow-10.4.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:06b2f7898047ae93fad74467ec3d28fe84f7831370e3c258afa533f81ef7f3df"}, + {file = "pillow-10.4.0-cp39-cp39-win32.whl", hash = "sha256:7970285ab628a3779aecc35823296a7869f889b8329c16ad5a71e4901a3dc4ef"}, + {file = "pillow-10.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:961a7293b2457b405967af9c77dcaa43cc1a8cd50d23c532e62d48ab6cdd56f5"}, + {file = "pillow-10.4.0-cp39-cp39-win_arm64.whl", hash = "sha256:32cda9e3d601a52baccb2856b8ea1fc213c90b340c542dcef77140dfa3278a9e"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:5b4815f2e65b30f5fbae9dfffa8636d992d49705723fe86a3661806e069352d4"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:8f0aef4ef59694b12cadee839e2ba6afeab89c0f39a3adc02ed51d109117b8da"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9f4727572e2918acaa9077c919cbbeb73bd2b3ebcfe033b72f858fc9fbef0026"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ff25afb18123cea58a591ea0244b92eb1e61a1fd497bf6d6384f09bc3262ec3e"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:dc3e2db6ba09ffd7d02ae9141cfa0ae23393ee7687248d46a7507b75d610f4f5"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:02a2be69f9c9b8c1e97cf2713e789d4e398c751ecfd9967c18d0ce304efbf885"}, + {file = "pillow-10.4.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:0755ffd4a0c6f267cccbae2e9903d95477ca2f77c4fcf3a3a09570001856c8a5"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:a02364621fe369e06200d4a16558e056fe2805d3468350df3aef21e00d26214b"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:1b5dea9831a90e9d0721ec417a80d4cbd7022093ac38a568db2dd78363b00908"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9b885f89040bb8c4a1573566bbb2f44f5c505ef6e74cec7ab9068c900047f04b"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87dd88ded2e6d74d31e1e0a99a726a6765cda32d00ba72dc37f0651f306daaa8"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:2db98790afc70118bd0255c2eeb465e9767ecf1f3c25f9a1abb8ffc8cfd1fe0a"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:f7baece4ce06bade126fb84b8af1c33439a76d8a6fd818970215e0560ca28c27"}, + {file = "pillow-10.4.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:cfdd747216947628af7b259d274771d84db2268ca062dd5faf373639d00113a3"}, + {file = "pillow-10.4.0.tar.gz", hash = "sha256:166c1cd4d24309b30d61f79f4a9114b7b2313d7450912277855ff5dfd7cd4a06"}, +] + +[package.extras] +docs = ["furo", "olefile", "sphinx (>=7.3)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinxext-opengraph"] +fpx = ["olefile"] +mic = ["olefile"] +tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] +typing = ["typing-extensions"] +xmp = ["defusedxml"] + [[package]] name = "pluggy" version = "1.6.0" description = "plugin and hook calling mechanisms for python" optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ {file = "pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746"}, {file = "pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3"}, @@ -292,7 +373,6 @@ version = "3.3.4" description = "PostgreSQL database adapter for Python" optional = false python-versions = ">=3.10" -groups = ["main"] files = [ {file = "psycopg-3.3.4-py3-none-any.whl", hash = "sha256:b6bbc25ccf05c8fad3b061d9db2ef0909a555171b84b07f29458a447253d679a"}, {file = "psycopg-3.3.4.tar.gz", hash = "sha256:e21207764952cff81b6b8bdacad9a3939f2793367fdac2987b3aac36a651b5bc"}, @@ -305,12 +385,12 @@ typing-extensions = {version = ">=4.6", markers = "python_version < \"3.13\""} tzdata = {version = "*", markers = "sys_platform == \"win32\""} [package.extras] -binary = ["psycopg-binary (==3.3.4) ; implementation_name != \"pypy\""] -c = ["psycopg-c (==3.3.4) ; implementation_name != \"pypy\""] +binary = ["psycopg-binary (==3.3.4)"] +c = ["psycopg-c (==3.3.4)"] dev = ["ast-comments (>=1.1.2)", "black (>=26.1.0)", "codespell (>=2.2)", "cython-lint (>=0.16)", "dnspython (>=2.1)", "flake8 (>=4.0)", "isort-psycopg", "isort[colors] (>=6.0)", "mypy (>=1.19.0)", "pre-commit (>=4.0.1)", "types-setuptools (>=57.4)", "types-shapely (>=2.0)", "wheel (>=0.37)"] docs = ["Sphinx (>=9.1)", "furo (==2025.12.19)", "sphinx-autobuild (>=2025.8.25)", "sphinx-autodoc-typehints (>=3.10.2)"] pool = ["psycopg-pool"] -test = ["anyio (>=4.0)", "mypy (>=1.19.0) ; implementation_name != \"pypy\"", "pproxy (>=2.7)", "pytest (>=6.2.5)", "pytest-cov (>=3.0)", "pytest-randomly (>=3.5)"] +test = ["anyio (>=4.0)", "mypy (>=1.19.0)", "pproxy (>=2.7)", "pytest (>=6.2.5)", "pytest-cov (>=3.0)", "pytest-randomly (>=3.5)"] [[package]] name = "psycopg-binary" @@ -318,8 +398,6 @@ version = "3.3.4" description = "PostgreSQL database adapter for Python -- C optimisation distribution" optional = false python-versions = ">=3.10" -groups = ["main"] -markers = "implementation_name != \"pypy\"" files = [ {file = "psycopg_binary-3.3.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b7bfff1ca23732b488cbca3076fc11bc98d520ee122514fdb17a8e20d3338f5a"}, {file = "psycopg_binary-3.3.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:32a6fbf8481e3a370d0d72b860d35948a693cb01281da217f7b2f307636e591a"}, @@ -384,7 +462,6 @@ version = "3.3.1" description = "Connection Pool for Psycopg" optional = false python-versions = ">=3.10" -groups = ["main"] files = [ {file = "psycopg_pool-3.3.1-py3-none-any.whl", hash = "sha256:2af5b432941c4c9ad5c87b3fa410aec910ec8f7c122855897983a06c45f2e4b5"}, {file = "psycopg_pool-3.3.1.tar.gz", hash = "sha256:b10b10b7a175d5cc1592147dc5b7eec8a9e0834eb3ed2c4a92c858e2f51eb63c"}, @@ -402,7 +479,6 @@ version = "2.11.1" description = "Python style guide checker" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "pycodestyle-2.11.1-py2.py3-none-any.whl", hash = "sha256:44fe31000b2d866f2e41841b18528a505fbd7fef9017b04eff4e2648a0fadc67"}, {file = "pycodestyle-2.11.1.tar.gz", hash = "sha256:41ba0e7afc9752dfb53ced5489e89f8186be00e599e712660695b7a75ff2663f"}, @@ -414,7 +490,6 @@ version = "3.1.0" description = "passive checker of Python programs" optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "pyflakes-3.1.0-py2.py3-none-any.whl", hash = "sha256:4132f6d49cb4dae6819e5379898f2b8cce3c5f23994194c24b77d5da2e36f774"}, {file = "pyflakes-3.1.0.tar.gz", hash = "sha256:a0aae034c444db0071aa077972ba4768d40c830d9539fd45bf4cd3f8f6992efc"}, @@ -426,7 +501,6 @@ version = "2.20.0" description = "Pygments is a syntax highlighting package written in Python." optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ {file = "pygments-2.20.0-py3-none-any.whl", hash = "sha256:81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176"}, {file = "pygments-2.20.0.tar.gz", hash = "sha256:6757cd03768053ff99f3039c1a36d6c0aa0b263438fcab17520b30a303a82b5f"}, @@ -441,7 +515,6 @@ version = "8.4.2" description = "pytest: simple powerful testing with Python" optional = false python-versions = ">=3.9" -groups = ["dev"] files = [ {file = "pytest-8.4.2-py3-none-any.whl", hash = "sha256:872f880de3fc3a5bdc88a11b39c9710c3497a547cfa9320bc3c5e62fbf272e79"}, {file = "pytest-8.4.2.tar.gz", hash = "sha256:86c0d0b93306b961d58d62a4db4879f27fe25513d4b969df351abdddb3c30e01"}, @@ -463,7 +536,6 @@ version = "2.9.0.post0" description = "Extensions to the standard Python datetime module" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" -groups = ["main"] files = [ {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, @@ -478,7 +550,6 @@ version = "1.2.2" description = "Read key-value pairs from a .env file and set them as environment variables" optional = false python-versions = ">=3.10" -groups = ["main"] files = [ {file = "python_dotenv-1.2.2-py3-none-any.whl", hash = "sha256:1d8214789a24de455a8b8bd8ae6fe3c6b69a5e3d64aa8a8e5d68e694bbcb285a"}, {file = "python_dotenv-1.2.2.tar.gz", hash = "sha256:2c371a91fbd7ba082c2c1dc1f8bf89ca22564a087c2c287cd9b662adde799cf3"}, @@ -493,7 +564,6 @@ version = "1.17.0" description = "Python 2 and 3 compatibility utilities" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" -groups = ["main"] files = [ {file = "six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274"}, {file = "six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"}, @@ -505,7 +575,6 @@ version = "0.5.5" description = "A non-validating SQL parser." optional = false python-versions = ">=3.8" -groups = ["main"] files = [ {file = "sqlparse-0.5.5-py3-none-any.whl", hash = "sha256:12a08b3bf3eec877c519589833aed092e2444e68240a3577e8e26148acc7b1ba"}, {file = "sqlparse-0.5.5.tar.gz", hash = "sha256:e20d4a9b0b8585fdf63b10d30066c7c94c5d7a7ec47c889a2d83a3caa93ff28e"}, @@ -517,27 +586,24 @@ doc = ["sphinx"] [[package]] name = "typing-extensions" -version = "4.15.0" +version = "4.16.0" description = "Backported and Experimental Type Hints for Python 3.9+" optional = false python-versions = ">=3.9" -groups = ["main"] files = [ - {file = "typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548"}, - {file = "typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466"}, + {file = "typing_extensions-4.16.0-py3-none-any.whl", hash = "sha256:481caa481374e813c1b176ada14e97f1f67a4539ce9cfeb3f350d78d6370c2e8"}, + {file = "typing_extensions-4.16.0.tar.gz", hash = "sha256:dc983d19a509c94dba722ee6abd33940f7c05a89e243c47e907eb4db6f1a43e5"}, ] [[package]] name = "tzdata" -version = "2026.2" +version = "2026.3" description = "Provider of IANA time zone data" optional = false python-versions = ">=2" -groups = ["main"] -markers = "sys_platform == \"win32\"" files = [ - {file = "tzdata-2026.2-py2.py3-none-any.whl", hash = "sha256:bbe9af844f658da81a5f95019480da3a89415801f6cc966806612cc7169bffe7"}, - {file = "tzdata-2026.2.tar.gz", hash = "sha256:9173fde7d80d9018e02a662e168e5a2d04f87c41ea174b139fbef642eda62d10"}, + {file = "tzdata-2026.3-py2.py3-none-any.whl", hash = "sha256:dc096730c87af6cab1b171c9d532be840741ff5d459015e7f6947bd7d7e54931"}, + {file = "tzdata-2026.3.tar.gz", hash = "sha256:4a1518b8993086a7982523e071643f3c0e5f213e75b21318e78bcabfff9d1415"}, ] [[package]] @@ -546,7 +612,6 @@ version = "1.17.3" description = "Module for decorators, wrappers and monkey patching." optional = false python-versions = ">=3.8" -groups = ["dev"] files = [ {file = "wrapt-1.17.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:88bbae4d40d5a46142e70d58bf664a89b6b4befaea7b2ecc14e03cedb8e06c04"}, {file = "wrapt-1.17.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e6b13af258d6a9ad602d57d889f83b9d5543acd471eee12eb51f5b01f8eb1bc2"}, @@ -632,6 +697,6 @@ files = [ ] [metadata] -lock-version = "2.1" +lock-version = "2.0" python-versions = "^3.12" -content-hash = "65bc4afc0977914acaa615ac9856122bc6250c14b2671f01f8a14e45bb694a87" +content-hash = "7289a8a7419c9ea2121336f3cecc3f2af086bd09051235775be0b5cc9589fe9b" From 02a0989ee75ea837b212fa2009e507526af8b75c Mon Sep 17 00:00:00 2001 From: Kevin Tan Date: Sat, 18 Jul 2026 06:31:29 +0000 Subject: [PATCH 22/30] updated Pillow version to match peotry.lock file --- client/tsconfig.json | 22 +++++++++++++++++----- server/poetry.lock | 2 +- server/pyproject.toml | 2 +- 3 files changed, 19 insertions(+), 7 deletions(-) diff --git a/client/tsconfig.json b/client/tsconfig.json index 5845367..b6346a2 100644 --- a/client/tsconfig.json +++ b/client/tsconfig.json @@ -1,6 +1,10 @@ { "compilerOptions": { - "lib": ["dom", "dom.iterable", "esnext"], + "lib": [ + "dom", + "dom.iterable", + "esnext" + ], "allowJs": true, "skipLibCheck": true, "strict": true, @@ -10,13 +14,21 @@ "moduleResolution": "bundler", "resolveJsonModule": true, "isolatedModules": true, - "jsx": "preserve", + "jsx": "react-jsx", "incremental": true, "paths": { - "@/*": ["./src/*"] + "@/*": [ + "./src/*" + ] }, "target": "ES2017" }, - "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"], - "exclude": ["node_modules"] + "include": [ + "next-env.d.ts", + "**/*.ts", + "**/*.tsx" + ], + "exclude": [ + "node_modules" + ] } diff --git a/server/poetry.lock b/server/poetry.lock index 918d7c6..6d8ddbe 100644 --- a/server/poetry.lock +++ b/server/poetry.lock @@ -699,4 +699,4 @@ files = [ [metadata] lock-version = "2.0" python-versions = "^3.12" -content-hash = "7289a8a7419c9ea2121336f3cecc3f2af086bd09051235775be0b5cc9589fe9b" +content-hash = "82de32cbad8a02e053c5edd5eeda8c201635c0a7220858564f04b8b684165051" diff --git a/server/pyproject.toml b/server/pyproject.toml index 9e4ddd5..72eff6e 100644 --- a/server/pyproject.toml +++ b/server/pyproject.toml @@ -16,7 +16,7 @@ freezegun = "^1.5.1" gunicorn = "^23.0.0" python-dotenv = "^1.0.1" django-extensions = "^3.2.3" -Pillow = "^10.0.0" +Pillow = "^10.4.0" [tool.poetry.group.dev.dependencies] pytest = "^8.3.2" From 512af6413da9be69b5263a1aa9160b1f7c7034ab Mon Sep 17 00:00:00 2001 From: Kevin Tan Date: Sat, 18 Jul 2026 06:42:17 +0000 Subject: [PATCH 23/30] added missed migrations causing api error --- ...0002_news_image_alter_news_published_at.py | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 server/api/news/migrations/0002_news_image_alter_news_published_at.py diff --git a/server/api/news/migrations/0002_news_image_alter_news_published_at.py b/server/api/news/migrations/0002_news_image_alter_news_published_at.py new file mode 100644 index 0000000..460a657 --- /dev/null +++ b/server/api/news/migrations/0002_news_image_alter_news_published_at.py @@ -0,0 +1,23 @@ +# Generated by Django 5.2.16 on 2026-07-18 06:41 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("news", "0001_initial"), + ] + + operations = [ + migrations.AddField( + model_name="news", + name="image", + field=models.ImageField(blank=True, null=True, upload_to=""), + ), + migrations.AlterField( + model_name="news", + name="published_at", + field=models.DateField(blank=True), + ), + ] From 116170503f5d65e9c2ec64f6abb0d9f7268c1a58 Mon Sep 17 00:00:00 2001 From: Kevin Tan Date: Sat, 18 Jul 2026 07:10:55 +0000 Subject: [PATCH 24/30] fixed dependency issues, fixed missing ',' causing wrong api import, removed extra ']' --- client/package-lock.json | 2707 ++++++++++++++++++++------------------ client/package.json | 2 +- server/api/settings.py | 2 +- server/api/urls.py | 3 - 4 files changed, 1443 insertions(+), 1271 deletions(-) diff --git a/client/package-lock.json b/client/package-lock.json index e6ab9dc..0df254a 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -9,7 +9,7 @@ "version": "0.1.0", "dependencies": { "@radix-ui/react-slot": "^1.2.3", - "@tanstack/react-query": "^5.80.7", + "@tanstack/react-query": "^5.101.2", "@tanstack/react-query-devtools": "^5.80.7", "autoprefixer": "^10.4.21", "axios": "^1.12.0", @@ -58,9 +58,9 @@ } }, "node_modules/@csstools/color-helpers": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.0.2.tgz", - "integrity": "sha512-JqWH1vsgdGcw2RR6VliXXdA0/59LttzlU8UlRT/iUUsEeWfYq8I+K0yhihEUTTHLRm1EXvpsCx3083EU15ecsA==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-5.1.0.tgz", + "integrity": "sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==", "dev": true, "funding": [ { @@ -102,9 +102,9 @@ } }, "node_modules/@csstools/css-color-parser": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.0.10.tgz", - "integrity": "sha512-TiJ5Ajr6WRd1r8HSiwJvZBiJOqtH86aHpUjq5aEKWHiII2Qfjqd/HCWKPOW8EP4vcspXbHnXrwIDlu5savQipg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-3.1.0.tgz", + "integrity": "sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==", "dev": true, "funding": [ { @@ -118,7 +118,7 @@ ], "license": "MIT", "dependencies": { - "@csstools/color-helpers": "^5.0.2", + "@csstools/color-helpers": "^5.1.0", "@csstools/css-calc": "^2.1.4" }, "engines": { @@ -173,9 +173,9 @@ } }, "node_modules/@csstools/postcss-oklab-function": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-4.0.10.tgz", - "integrity": "sha512-ZzZUTDd0fgNdhv8UUjGCtObPD8LYxMH+MJsW9xlZaWTV8Ppr4PtxlHYNMmF4vVWGl0T6f8tyWAKjoI6vePSgAg==", + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-4.0.12.tgz", + "integrity": "sha512-HhlSmnE1NKBhXsTnNGjxvhryKtO7tJd1w42DKOGFD6jSHtYOrsJTQDKPMwvOfrzUAk8t7GcpIfRyM7ssqHpFjg==", "dev": true, "funding": [ { @@ -189,10 +189,10 @@ ], "license": "MIT-0", "dependencies": { - "@csstools/css-color-parser": "^3.0.10", + "@csstools/css-color-parser": "^3.1.0", "@csstools/css-parser-algorithms": "^3.0.5", "@csstools/css-tokenizer": "^3.0.4", - "@csstools/postcss-progressive-custom-properties": "^4.1.0", + "@csstools/postcss-progressive-custom-properties": "^4.2.1", "@csstools/utilities": "^2.0.0" }, "engines": { @@ -203,9 +203,9 @@ } }, "node_modules/@csstools/postcss-progressive-custom-properties": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-4.1.0.tgz", - "integrity": "sha512-YrkI9dx8U4R8Sz2EJaoeD9fI7s7kmeEBfmO+UURNeL6lQI7VxF6sBE+rSqdCBn4onwqmxFdBU3lTwyYb/lCmxA==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-4.2.1.tgz", + "integrity": "sha512-uPiiXf7IEKtUQXsxu6uWtOlRMXd2QWWy5fhxHDnPdXKCQckPP3E34ZgDoZ62r2iT+UOgWsSbM4NvHE5m3mAEdw==", "dev": true, "funding": [ { @@ -251,6 +251,18 @@ "postcss": "^8.4" } }, + "node_modules/@emnapi/core": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.10.0.tgz", + "integrity": "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.2.1", + "tslib": "^2.4.0" + } + }, "node_modules/@emnapi/runtime": { "version": "1.11.2", "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.2.tgz", @@ -261,10 +273,21 @@ "tslib": "^2.4.0" } }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz", + "integrity": "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, "node_modules/@eslint-community/eslint-utils": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz", - "integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==", + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", + "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", "dev": true, "license": "MIT", "dependencies": { @@ -281,9 +304,9 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", - "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", "dev": true, "license": "MIT", "engines": { @@ -291,16 +314,19 @@ } }, "node_modules/@eslint/compat": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@eslint/compat/-/compat-1.3.0.tgz", - "integrity": "sha512-ZBygRBqpDYiIHsN+d1WyHn3TYgzgpzLEcgJUxTATyiInQbKZz6wZb6+ljwdg8xeeOe4v03z6Uh6lELiw0/mVhQ==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@eslint/compat/-/compat-1.4.1.tgz", + "integrity": "sha512-cfO82V9zxxGBxcQDr1lfaYB7wykTa0b00mGa36FrJl7iTFd0Z2cHfEYuxcBRP/iNijCsWsEkA+jzT8hGYmv33w==", "dev": true, "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0" + }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "peerDependencies": { - "eslint": "^9.10.0" + "eslint": "^8.40 || 9" }, "peerDependenciesMeta": { "eslint": { @@ -309,58 +335,37 @@ } }, "node_modules/@eslint/config-array": { - "version": "0.20.1", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.20.1.tgz", - "integrity": "sha512-OL0RJzC/CBzli0DrrR31qzj6d6i6Mm3HByuhflhl4LOBiWxN+3i6/t/ZQQNii4tjksXi8r2CRW1wMpWA2ULUEw==", + "version": "0.21.2", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.2.tgz", + "integrity": "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@eslint/object-schema": "^2.1.6", + "@eslint/object-schema": "^2.1.7", "debug": "^4.3.1", - "minimatch": "^3.1.2" + "minimatch": "^3.1.5" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@eslint/config-array/node_modules/brace-expansion": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", - "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@eslint/config-array/node_modules/minimatch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/@eslint/config-helpers": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.2.3.tgz", - "integrity": "sha512-u180qk2Um1le4yf0ruXH3PYFeEZeYC3p/4wCTKrr2U1CmGdzGi3KtY0nuPDH48UJxlKCC5RDzbcbh4X0XlqgHg==", + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", + "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", "dev": true, "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0" + }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, "node_modules/@eslint/core": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.14.0.tgz", - "integrity": "sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg==", + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", + "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -371,20 +376,20 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", - "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.6.tgz", + "integrity": "sha512-l2Ul9PrHsPCKcEY/ac7VgFj9D80C7S68sOKc618SyHDPK36s1XcFebXY0iTzUVn4Yq+YbwvSnDmCz9yxjX+QrA==", "dev": true, "license": "MIT", "dependencies": { - "ajv": "^6.12.4", + "ajv": "^6.14.0", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", + "js-yaml": "^4.3.0", + "minimatch": "^3.1.5", "strip-json-comments": "^3.1.1" }, "engines": { @@ -394,34 +399,10 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", - "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@eslint/eslintrc/node_modules/minimatch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/@eslint/js": { - "version": "9.29.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.29.0.tgz", - "integrity": "sha512-3PIF4cBw/y+1u2EazflInpV+lYsSG0aByVIQzAgb1m1MhHFSbqTyNqtBKHgWf/9Ykud+DhILS9EGkmekVhbKoQ==", + "version": "9.39.5", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.5.tgz", + "integrity": "sha512-QywQuszQh77pIXCsq998c8hbhSTI/azTty1Z6N53dmAudKHhy573j3yvRLsX2BSp8YpLtoCEG8E9DJe+8zUh4A==", "dev": true, "license": "MIT", "engines": { @@ -432,9 +413,9 @@ } }, "node_modules/@eslint/object-schema": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", - "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", + "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", "dev": true, "license": "Apache-2.0", "engines": { @@ -442,68 +423,55 @@ } }, "node_modules/@eslint/plugin-kit": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.5.tgz", - "integrity": "sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w==", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", + "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@eslint/core": "^0.15.2", + "@eslint/core": "^0.17.0", "levn": "^0.4.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@eslint/plugin-kit/node_modules/@eslint/core": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.2.tgz", - "integrity": "sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==", + "node_modules/@humanfs/core": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz", + "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@types/json-schema": "^7.0.15" + "@humanfs/types": "^0.15.0" }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@humanfs/core": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", - "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", - "dev": true, - "license": "Apache-2.0", "engines": { "node": ">=18.18.0" } }, "node_modules/@humanfs/node": { - "version": "0.16.6", - "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", - "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz", + "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==", "dev": true, "license": "Apache-2.0", "dependencies": { - "@humanfs/core": "^0.19.1", - "@humanwhocodes/retry": "^0.3.0" + "@humanfs/core": "^0.19.2", + "@humanfs/types": "^0.15.0", + "@humanwhocodes/retry": "^0.4.0" }, "engines": { "node": ">=18.18.0" } }, - "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", - "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", + "node_modules/@humanfs/types": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz", + "integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==", "dev": true, "license": "Apache-2.0", "engines": { - "node": ">=18.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" + "node": ">=18.18.0" } }, "node_modules/@humanwhocodes/module-importer": { @@ -1000,81 +968,14 @@ "url": "https://opencollective.com/libvips" } }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "license": "ISC", - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", - "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", "license": "MIT", "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" } }, "node_modules/@jridgewell/resolve-uri": { @@ -1086,31 +987,41 @@ "node": ">=6.0.0" } }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.6.tgz", + "integrity": "sha512-ZLv/JdUfkvOy9eCnnBaGfiO+XimbjebAeO+MRQqD/B+FR1tnRN0tpKSJHRbE8sFfS6aqsXZ67TQjfwfsxULVbg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@tybys/wasm-util": "^0.10.3" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + }, + "peerDependencies": { + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1" + } + }, "node_modules/@next/env": { "version": "16.2.10", "resolved": "https://registry.npmjs.org/@next/env/-/env-16.2.10.tgz", @@ -1127,36 +1038,6 @@ "fast-glob": "3.3.1" } }, - "node_modules/@next/eslint-plugin-next/node_modules/fast-glob": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", - "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/@next/eslint-plugin-next/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/@next/swc-darwin-arm64": { "version": "16.2.10", "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-16.2.10.tgz", @@ -1320,20 +1201,20 @@ "node": ">= 8" } }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "node_modules/@nolyfill/is-core-module": { + "version": "1.0.39", + "resolved": "https://registry.npmjs.org/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz", + "integrity": "sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==", + "dev": true, "license": "MIT", - "optional": true, "engines": { - "node": ">=14" + "node": ">=12.4.0" } }, "node_modules/@radix-ui/react-compose-refs": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.2.tgz", - "integrity": "sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.3.tgz", + "integrity": "sha512-rYOP8OMnuuPMQF1uhPVlGNcCDlkokKqGFE3JcxFViIkAXP7EvFWUliJAstrapypaBLJNHbZL6jGhbVDGTwmVhA==", "license": "MIT", "peerDependencies": { "@types/react": "*", @@ -1346,12 +1227,12 @@ } }, "node_modules/@radix-ui/react-slot": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.2.3.tgz", - "integrity": "sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.3.0.tgz", + "integrity": "sha512-MojKku4U/miO8Av4Dkb+ctMAQx7JmY96LmtDQlAarCRtd7rN52QCSzBF+XAvr5S6coSVj9HEPBgHAHKEJVk/WA==", "license": "MIT", "dependencies": { - "@radix-ui/react-compose-refs": "1.1.2" + "@radix-ui/react-compose-refs": "1.1.3" }, "peerDependencies": { "@types/react": "*", @@ -1371,9 +1252,9 @@ "license": "MIT" }, "node_modules/@rushstack/eslint-patch": { - "version": "1.10.4", - "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.10.4.tgz", - "integrity": "sha512-WJgX9nzTqknM393q1QJDJmoW28kUfEnybeTfVNcNAPnIx210RXm2DiXiHzfNPJNIUUb1tJnz/l4QGtJ30PgWmA==", + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.16.1.tgz", + "integrity": "sha512-TvZbIpeKqGQQ7X0zSCvPH9riMSFQFSggnfBjFZ1mEoILW+UuXCKwOoPcgjMwiUtRqFZ8jWhPJc4um14vC6I4ag==", "dev": true, "license": "MIT" }, @@ -1387,26 +1268,32 @@ } }, "node_modules/@tanstack/eslint-plugin-query": { - "version": "5.78.0", - "resolved": "https://registry.npmjs.org/@tanstack/eslint-plugin-query/-/eslint-plugin-query-5.78.0.tgz", - "integrity": "sha512-hYkhWr3UP0CkAsn/phBVR98UQawbw8CmTSgWtdgEBUjI60/GBaEIkpgi/Bp/2I8eIDK4+vdY7ac6jZx+GR+hEQ==", + "version": "5.101.2", + "resolved": "https://registry.npmjs.org/@tanstack/eslint-plugin-query/-/eslint-plugin-query-5.101.2.tgz", + "integrity": "sha512-cPE99s3XZwlObfn8lCezT4j4JLj2CVzpIEywx0H4hzfPsX/o9QhdwaOwcDXxrQAqx2ds7TbvTinxhB8B/ywb6w==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/utils": "^8.18.1" + "@typescript-eslint/utils": "^8.58.1" }, "funding": { "type": "github", "url": "https://github.com/sponsors/tannerlinsley" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0" + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": "^5.4.0 || ^6.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/@tanstack/query-core": { - "version": "5.80.7", - "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.80.7.tgz", - "integrity": "sha512-s09l5zeUKC8q7DCCCIkVSns8zZrK4ZDT6ryEjxNBFi68G4z2EBobBS7rdOY3r6W1WbUDpc1fe5oY+YO/+2UVUg==", + "version": "5.101.2", + "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.101.2.tgz", + "integrity": "sha512-hH5MLoJhF7KaIGd7q3xTXGXvslI+GYlM1Z/35aSHHWaCJWB7XvTSHYuV3eM7tw+aE0mT/xMro4M4Q9rCGHT0lw==", "license": "MIT", "funding": { "type": "github", @@ -1414,9 +1301,9 @@ } }, "node_modules/@tanstack/query-devtools": { - "version": "5.80.0", - "resolved": "https://registry.npmjs.org/@tanstack/query-devtools/-/query-devtools-5.80.0.tgz", - "integrity": "sha512-D6gH4asyjaoXrCOt5vG5Og/YSj0D/TxwNQgtLJIgWbhbWCC/emu2E92EFoVHh4ppVWg1qT2gKHvKyQBEFZhCuA==", + "version": "5.101.2", + "resolved": "https://registry.npmjs.org/@tanstack/query-devtools/-/query-devtools-5.101.2.tgz", + "integrity": "sha512-o+wHcqgN7Pp0s8v1i0UGq/ZrrEKrxdIiMQmKRdYb2w7NPtylYSJ4+wg/tIn71m9DLstwUwdEGAvROdly6HXP6w==", "license": "MIT", "funding": { "type": "github", @@ -1424,12 +1311,12 @@ } }, "node_modules/@tanstack/react-query": { - "version": "5.80.7", - "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.80.7.tgz", - "integrity": "sha512-u2F0VK6+anItoEvB3+rfvTO9GEh2vb00Je05OwlUe/A0lkJBgW1HckiY3f9YZa+jx6IOe4dHPh10dyp9aY3iRQ==", + "version": "5.101.2", + "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.101.2.tgz", + "integrity": "sha512-seDkr6kzGzX1okaaTtZPtgA688CDPlXUz1C6xSg0ESqn04Vuc8tlrYms1s3de+znBqhPVxFRfpAfUf+6XvfPWg==", "license": "MIT", "dependencies": { - "@tanstack/query-core": "5.80.7" + "@tanstack/query-core": "5.101.2" }, "funding": { "type": "github", @@ -1440,26 +1327,37 @@ } }, "node_modules/@tanstack/react-query-devtools": { - "version": "5.80.7", - "resolved": "https://registry.npmjs.org/@tanstack/react-query-devtools/-/react-query-devtools-5.80.7.tgz", - "integrity": "sha512-7Dz/19fVo0i+jgLVBabV5vfGOlLyN5L1w8w1/ogFhe6ItNNsNA+ZgNTbtiKpbR3CcX2WDRRTInz1uMSmHzTsoQ==", + "version": "5.101.2", + "resolved": "https://registry.npmjs.org/@tanstack/react-query-devtools/-/react-query-devtools-5.101.2.tgz", + "integrity": "sha512-eU7HctdA9gDjqoERoEdzLbw9DiqnBDfh5+Hu0u26gjqoHJezOpQAuiesDL2VvkU+2cPV76zgv0tMZsOrI4LjnQ==", "license": "MIT", "dependencies": { - "@tanstack/query-devtools": "5.80.0" + "@tanstack/query-devtools": "5.101.2" }, "funding": { "type": "github", "url": "https://github.com/sponsors/tannerlinsley" }, "peerDependencies": { - "@tanstack/react-query": "^5.80.7", + "@tanstack/react-query": "^5.101.2", "react": "^18 || ^19" } }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.3.tgz", + "integrity": "sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, "node_modules/@types/estree": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", "dev": true, "license": "MIT" }, @@ -1478,13 +1376,13 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "24.0.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.0.3.tgz", - "integrity": "sha512-R4I/kzCYAdRLzfiCabn9hxWfbuHS573x+r0dJMkkzThEa7pbrcDWK+9zu3e7aBOouf+rQAciqPFMnxwr0aWgKg==", + "version": "24.13.3", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.13.3.tgz", + "integrity": "sha512-Dh8vAsV36ig5wa9OX4pXvMc9D3Veibfw2wix0CUwYODLD8nkj9UsLjASr49nPg+2eKzxhBV+v7L8pXvT4e639Q==", "dev": true, "license": "MIT", "dependencies": { - "undici-types": "~7.8.0" + "undici-types": "~7.18.0" } }, "node_modules/@types/react": { @@ -1507,18 +1405,57 @@ "@types/react": "^19.0.0" } }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.64.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.64.0.tgz", + "integrity": "sha512-CGvQPBxN3wZLu6Rz2kFUpZeoCm78xUic92ck39KPePkO1NPOwjCqdQnm5Q87tpWw9vcBvW8XLrDXjH9PWYtJ3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.12.2", + "@typescript-eslint/scope-manager": "8.64.0", + "@typescript-eslint/type-utils": "8.64.0", + "@typescript-eslint/utils": "8.64.0", + "@typescript-eslint/visitor-keys": "8.64.0", + "ignore": "^7.0.5", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.5.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.64.0", + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.6.tgz", + "integrity": "sha512-BAg6QkE8W+TuQLrrw0Ugr7HegXduRuuj8/ti2kSOc+jz1dmx8/WNcjr6XGnq5YpDWxFwwaavqD0+jIUOKelTsw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, "node_modules/@typescript-eslint/parser": { - "version": "8.34.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.34.1.tgz", - "integrity": "sha512-4O3idHxhyzjClSMJ0a29AcoK0+YwnEqzI6oz3vlRf3xw0zbzt15MzXwItOlnr5nIth6zlY2RENLsOPvhyrKAQA==", + "version": "8.64.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.64.0.tgz", + "integrity": "sha512-KA0OshtlcCCXmbfqyZkM5pV3/WNraJf7DkJRLpyrmwPtud57H5BDX7C3k0LPSPxpprfRL+cJDGabF10mvNCoCw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.34.1", - "@typescript-eslint/types": "8.34.1", - "@typescript-eslint/typescript-estree": "8.34.1", - "@typescript-eslint/visitor-keys": "8.34.1", - "debug": "^4.3.4" + "@typescript-eslint/scope-manager": "8.64.0", + "@typescript-eslint/types": "8.64.0", + "@typescript-eslint/typescript-estree": "8.64.0", + "@typescript-eslint/visitor-keys": "8.64.0", + "debug": "^4.4.3" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1528,20 +1465,20 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.9.0" + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.34.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.34.1.tgz", - "integrity": "sha512-nuHlOmFZfuRwLJKDGQOVc0xnQrAmuq1Mj/ISou5044y1ajGNp2BNliIqp7F2LPQ5sForz8lempMFCovfeS1XoA==", + "version": "8.64.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.64.0.tgz", + "integrity": "sha512-tk4WpOJ6IEbGrVHaNmM0YRrwAD3exZlIK3iadQNAxh4YKk6jvUQ4ecq18n+v7+meh+cJ3j+D8nbk8sRKhlwLQg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.34.1", - "@typescript-eslint/types": "^8.34.1", - "debug": "^4.3.4" + "@typescript-eslint/tsconfig-utils": "^8.64.0", + "@typescript-eslint/types": "^8.64.0", + "debug": "^4.4.3" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1551,18 +1488,18 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "typescript": ">=4.8.4 <5.9.0" + "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.34.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.34.1.tgz", - "integrity": "sha512-beu6o6QY4hJAgL1E8RaXNC071G4Kso2MGmJskCFQhRhg8VOH/FDbC8soP8NHN7e/Hdphwp8G8cE6OBzC8o41ZA==", + "version": "8.64.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.64.0.tgz", + "integrity": "sha512-CXEaFdYXjSTgKhisNkwCcJwTP8Pl+fmRrEQrri4nm3vU743bALrxzLmq7fHG/7e6a5xO0lDYeURpZmBuhHk54w==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.34.1", - "@typescript-eslint/visitor-keys": "8.34.1" + "@typescript-eslint/types": "8.64.0", + "@typescript-eslint/visitor-keys": "8.64.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1573,9 +1510,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.34.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.34.1.tgz", - "integrity": "sha512-K4Sjdo4/xF9NEeA2khOb7Y5nY6NSXBnod87uniVYW9kHP+hNlDV8trUSFeynA2uxWam4gIWgWoygPrv9VMWrYg==", + "version": "8.64.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.64.0.tgz", + "integrity": "sha512-2yo8rRNKuzbVWQp5kslhANqZ2uDAeROQHBRZNPu8JDsHmeFNj/XJJhX/FhNUWmkHHvoNsKa6+tHJiig87EzsQw==", "dev": true, "license": "MIT", "engines": { @@ -1586,20 +1523,21 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "typescript": ">=4.8.4 <5.9.0" + "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.34.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.34.1.tgz", - "integrity": "sha512-Tv7tCCr6e5m8hP4+xFugcrwTOucB8lshffJ6zf1mF1TbU67R+ntCc6DzLNKM+s/uzDyv8gLq7tufaAhIBYeV8g==", + "version": "8.64.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.64.0.tgz", + "integrity": "sha512-XWG4Fmmv/6SvyS9nH8jWrKs6terwJvE8cyRt1CzYYqzp9OrPhCT4cMc/f7C6RZCwG+qMmiffJS1/qJP8G1URtg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "8.34.1", - "@typescript-eslint/utils": "8.34.1", - "debug": "^4.3.4", - "ts-api-utils": "^2.1.0" + "@typescript-eslint/types": "8.64.0", + "@typescript-eslint/typescript-estree": "8.64.0", + "@typescript-eslint/utils": "8.64.0", + "debug": "^4.4.3", + "ts-api-utils": "^2.5.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1609,14 +1547,14 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.9.0" + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@typescript-eslint/types": { - "version": "8.34.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.34.1.tgz", - "integrity": "sha512-rjLVbmE7HR18kDsjNIZQHxmv9RZwlgzavryL5Lnj2ujIRTeXlKtILHgRNmQ3j4daw7zd+mQgy+uyt6Zo6I0IGA==", + "version": "8.64.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.64.0.tgz", + "integrity": "sha512-qjhfuTfLXjA4IOzXvz0rTjT01BqEiIgPoUeMwiEjnaHKJMTNo8rH5pYW1a2L/0Dnux2fPC85AeyJoWaGa8WxTA==", "dev": true, "license": "MIT", "engines": { @@ -1628,22 +1566,21 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.34.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.34.1.tgz", - "integrity": "sha512-rjCNqqYPuMUF5ODD+hWBNmOitjBWghkGKJg6hiCHzUvXRy6rK22Jd3rwbP2Xi+R7oYVvIKhokHVhH41BxPV5mA==", + "version": "8.64.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.64.0.tgz", + "integrity": "sha512-Pztpsn1aCE1oWDvDEfUk31nngvvF7vUB5SwHFEaZIFpvw7WJtqUHHL4plBZDA9HfWJJjL13BdG0YrJInTUvoVA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.34.1", - "@typescript-eslint/tsconfig-utils": "8.34.1", - "@typescript-eslint/types": "8.34.1", - "@typescript-eslint/visitor-keys": "8.34.1", - "debug": "^4.3.4", - "fast-glob": "^3.3.2", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^2.1.0" + "@typescript-eslint/project-service": "8.64.0", + "@typescript-eslint/tsconfig-utils": "8.64.0", + "@typescript-eslint/types": "8.64.0", + "@typescript-eslint/visitor-keys": "8.64.0", + "debug": "^4.4.3", + "minimatch": "^10.2.2", + "semver": "^7.7.3", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.5.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1653,20 +1590,59 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "typescript": ">=4.8.4 <5.9.0" + "typescript": ">=4.8.4 <6.1.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.7.tgz", + "integrity": "sha512-7oFy703dxfY3/NLxC1fh2SUCQ0H9rmAY+5EpDVfXjUTTs+HEwR2nYaqLv+GWcTsumwxPfiz6CzCNkwXwBUwqCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.5" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/@typescript-eslint/utils": { - "version": "8.34.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.34.1.tgz", - "integrity": "sha512-mqOwUdZ3KjtGk7xJJnLbHxTuWVn3GO2WZZuM+Slhkun4+qthLdXx32C8xIXbO1kfCECb3jIs3eoxK3eryk7aoQ==", + "version": "8.64.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.64.0.tgz", + "integrity": "sha512-aJUGVB3+U0htrrCjoA8qukw8cm8fNCGAxK/tVoS70k8aeb7DETKeFozRiVFIwEeN9WJLsjaP3ph8I60tY2XZoQ==", "dev": true, "license": "MIT", "dependencies": { - "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.34.1", - "@typescript-eslint/types": "8.34.1", - "@typescript-eslint/typescript-estree": "8.34.1" + "@eslint-community/eslint-utils": "^4.9.1", + "@typescript-eslint/scope-manager": "8.64.0", + "@typescript-eslint/types": "8.64.0", + "@typescript-eslint/typescript-estree": "8.64.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1676,19 +1652,19 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.9.0" + "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", + "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.34.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.34.1.tgz", - "integrity": "sha512-xoh5rJ+tgsRKoXnkBPFRLZ7rjKM0AfVbC68UZ/ECXoDbfggb9RbEySN359acY1vS3qZ0jVTVWzbtfapwm5ztxw==", + "version": "8.64.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.64.0.tgz", + "integrity": "sha512-mrtuL8Nsn6gi2H4mo5KMTp823M+3Q19Ew/i+Zlikq20tIMm99C3Ez0dCmkWWnxut20esQvTg8aUSEhMcAOXhEw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.34.1", - "eslint-visitor-keys": "^4.2.1" + "@typescript-eslint/types": "8.64.0", + "eslint-visitor-keys": "^5.0.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1699,31 +1675,355 @@ } }, "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", + "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", "dev": true, "license": "Apache-2.0", "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + "node": "^20.19.0 || ^22.13.0 || >=24" }, "funding": { "url": "https://opencollective.com/eslint" } }, - "node_modules/acorn": { - "version": "8.15.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "node_modules/@unrs/resolver-binding-android-arm-eabi": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.12.2.tgz", + "integrity": "sha512-g5T90pqg1bo/7mytQx6F4iBNC0Wsh9cu+z9veDbFjc7HjpesJFWD7QMS0NGStXM075+7dJPPVvBbpZlnrdpi/w==", + "cpu": [ + "arm" + ], "dev": true, "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@unrs/resolver-binding-android-arm64": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.12.2.tgz", + "integrity": "sha512-YGCRZv/9GLhwmz6mYDeTsm/92BAyR28l6c2ReweVW5pWgfsitWLY8upvfRlGdoyD8HjeTHSYJWyZGD4KJA/nFQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@unrs/resolver-binding-darwin-arm64": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.12.2.tgz", + "integrity": "sha512-u9DiNT1auQMO20A9SyTuG3wUgQWB9Z7KjAg0uFuCDR1FsAY8A0CG2S6JpHS1xwm/w1G08bjXZDcyOCjv1WAm2w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@unrs/resolver-binding-darwin-x64": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.12.2.tgz", + "integrity": "sha512-f7rPLi/T1HVKZu/u6t87lroib16n8vrSzcyxI7lg4BGO9UF26KhQL44sd9eOUgrTYhvRXtWOIZT5PejdPyJfUA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@unrs/resolver-binding-freebsd-x64": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.12.2.tgz", + "integrity": "sha512-BpcOjWCJub6nRZUS2zA20pmLvjtqAtGejETaIyRLiZiQf++cbrjltLA5NN/xaXfqeOBOSlMFbemIl5/S5tljmg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm-gnueabihf": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.12.2.tgz", + "integrity": "sha512-vZTDvdSISZjJx66OzJqtsOhzifbqRjbmI1Mnu49fQDwog5GtDI4QidRiEAYbZCRj9C8YZEW+3ZjqsyS9GR4k2A==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm-musleabihf": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.12.2.tgz", + "integrity": "sha512-BiPI+IrIlwcW4nLLMM21+B1dFPzd55yAVgVGrdgDjNef+ch03GdxrcyaIz8X9SsQirh/kCQ7mviyWlMxdh2D7g==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm64-gnu": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.12.2.tgz", + "integrity": "sha512-zJc0H99FEPoFfSrNpa91HYfxzfAJCr502oxNK1cfdC9hlaFI43RT+JFCann9JUgZmLzzntChHyn13Sgn9ljHNg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm64-musl": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.12.2.tgz", + "integrity": "sha512-KQ3Lki6l+Pz1k/eBipN41ES+YUK30beLGb9YqcB1O542cyLCNE6GaxrfcY3T6EezmGGk84wb5XyO9loTM9tkcA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-loong64-gnu": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-loong64-gnu/-/resolver-binding-linux-loong64-gnu-1.12.2.tgz", + "integrity": "sha512-3SJGEh1DborhG6pyxvhPzCT4bbSIVihsvgJc13P1bHG7KLdNDaF9T3gsTwFc7Jw/5Y5/iWOjkEx7Zy0NvCGX3Q==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-loong64-musl": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-loong64-musl/-/resolver-binding-linux-loong64-musl-1.12.2.tgz", + "integrity": "sha512-jiuG/Obbel7uw1PwHNFfrkiKhLAF6mnyZ6aWlOAVN9WqKm8v0OFGnciJIHu8+CMvXLQ8AD51LPzAoUfT21D5Ew==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-ppc64-gnu": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.12.2.tgz", + "integrity": "sha512-q7xRvVpmcfeL+LlZg8Pbbo6QaTZwDU5BaGZbwfhkEsXJn3Was8xYfE0RBH266xZt0rM6B7i8xAYIvjthuUIWHg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-riscv64-gnu": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.12.2.tgz", + "integrity": "sha512-0CVdx6lcnT3Q9inOH8tsMIOJ6ImndllMjqJHg8RLVdB7Vq4SfkEXl9mCSsVNuNA4MCYycRicCUxPCabVHJRr6A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-riscv64-musl": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.12.2.tgz", + "integrity": "sha512-iOwlRo9vnp6R6ohHQS11n0NnfdXx/omhkocmIfaPRpQhKZ+3BDMkkdRVh53qjkFkpPddf+FETA28NwGN7l5l+w==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-s390x-gnu": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.12.2.tgz", + "integrity": "sha512-HYJtLfXq94q8iZNFT1lknx258wlkkWhZeUXJRqzKBBUJ00CvZ+N33zgbCqimLjsyw5Va6uUxhVa12mI+kaveEw==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-x64-gnu": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.12.2.tgz", + "integrity": "sha512-mPsUhunKKDih5O96Y6enDQyHc1SqBPlY1E/SfMWDM3EdJ95Z9CArPeCVwCCqbP45ljvivdEk8Fxn+SIb1rDAJQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-x64-musl": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.12.2.tgz", + "integrity": "sha512-azrt6+5ydLd8Vt210AAFis/lZevSfPw93EJRIJG+xPu4WCJ8K0kppCTpMyLPcKT7H15M4Jnt2tMp5bOvCkRC6A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-openharmony-arm64": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-openharmony-arm64/-/resolver-binding-openharmony-arm64-1.12.2.tgz", + "integrity": "sha512-YZ9hP4O0X9PQb8eO980qmLNGH4zT3I9+SZTdt0Pr0YyuGQhYKoOZkV02VzrzyOZJ5xIJ3UFIenKkUkGg8GjgWQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@unrs/resolver-binding-wasm32-wasi": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.12.2.tgz", + "integrity": "sha512-tYFDIkMxSflfEc/h92ZWNsZlHSwgimbNHSO3PL2JWQHfCuC2q316jMyYU9TIWZsFK2bQwyK5VAdYgn8ygPj69A==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "1.10.0", + "@emnapi/runtime": "1.10.0", + "@napi-rs/wasm-runtime": "^1.1.4" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@unrs/resolver-binding-wasm32-wasi/node_modules/@emnapi/runtime": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz", + "integrity": "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@unrs/resolver-binding-win32-arm64-msvc": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.12.2.tgz", + "integrity": "sha512-qzNyg3xL0VPQmCaUh+N5jSitce6k+uCBfMDesWRnlULOZaqUkaJ0ybdT+UqlAWJoQjuqfIU/0Ptx9bteN4D82g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@unrs/resolver-binding-win32-ia32-msvc": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.12.2.tgz", + "integrity": "sha512-WD9sY00OfpHVGfsnHZoA8jVT+esS/Bg8z8jzxp5BnDCjjwsuKsPQrzswwpFy4J1AUJbXPRfkpcX0mXrzeXW79g==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@unrs/resolver-binding-win32-x64-msvc": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.12.2.tgz", + "integrity": "sha512-nAB74NfSNKknqQ1RrYj6uz8FcXEomu/MATJZxh/x+BArzN2U3JbOYC0APYzUIGhVY3m5hRxA8VPNdPBoG8txlA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/acorn": { + "version": "8.17.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.17.0.tgz", + "integrity": "sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", @@ -1764,9 +2064,9 @@ } }, "node_modules/ansi-escapes": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.0.0.tgz", - "integrity": "sha512-GdYO7a61mR0fOlAsvC9/rIHf7L96sBc6dEWzeOu+KAea5bZyQRPIpojrVoI4AXGJS/ycu/fBTdLrUkA4ODrvjw==", + "version": "7.3.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-7.3.0.tgz", + "integrity": "sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg==", "dev": true, "license": "MIT", "dependencies": { @@ -1780,9 +2080,10 @@ } }, "node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, "license": "MIT", "engines": { "node": ">=12" @@ -1795,6 +2096,7 @@ "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": { "color-convert": "^2.0.1" @@ -1825,6 +2127,18 @@ "node": ">= 8" } }, + "node_modules/anymatch/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/arg": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", @@ -1866,18 +2180,20 @@ } }, "node_modules/array-includes": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", - "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", + "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", - "es-object-atoms": "^1.0.0", - "get-intrinsic": "^1.2.4", - "is-string": "^1.0.7" + "es-abstract": "^1.24.0", + "es-object-atoms": "^1.1.1", + "get-intrinsic": "^1.3.0", + "is-string": "^1.1.1", + "math-intrinsics": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -1908,18 +2224,19 @@ } }, "node_modules/array.prototype.findlastindex": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", - "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz", + "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", "define-properties": "^1.2.1", - "es-abstract": "^1.23.2", + "es-abstract": "^1.23.9", "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-shim-unscopables": "^1.0.2" + "es-object-atoms": "^1.1.1", + "es-shim-unscopables": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -1929,16 +2246,16 @@ } }, "node_modules/array.prototype.flat": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", - "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", + "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -2029,9 +2346,9 @@ "license": "MIT" }, "node_modules/autoprefixer": { - "version": "10.4.21", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz", - "integrity": "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==", + "version": "10.5.4", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.5.4.tgz", + "integrity": "sha512-MaU0U/za7N3r6brxD4YB/l4NSrFzLPlANv6wEuQVaIPlD3L4W9rFcQPbL/EilY9BHhHvhfcz3gInDLrEtWT4EA==", "funding": [ { "type": "opencollective", @@ -2048,10 +2365,9 @@ ], "license": "MIT", "dependencies": { - "browserslist": "^4.24.4", - "caniuse-lite": "^1.0.30001702", - "fraction.js": "^4.3.7", - "normalize-range": "^0.1.2", + "browserslist": "^4.28.6", + "caniuse-lite": "^1.0.30001806", + "fraction.js": "^5.3.4", "picocolors": "^1.1.1", "postcss-value-parser": "^4.2.0" }, @@ -2082,9 +2398,9 @@ } }, "node_modules/axe-core": { - "version": "4.10.3", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.10.3.tgz", - "integrity": "sha512-Xm7bpRXnDSX2YE2YFfBk2FnF0ep6tmG7xPh8iHee8MIcrgq762Nkce856dYtJYLkuIoYZvGfTs/PbZhideTcEg==", + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.12.1.tgz", + "integrity": "sha512-s7iGf5GaVMxEG0ENN9x+xTr7GFZCb1ZP/1uATUpCEK2X78nDB3RwbtFCo9pGAf9ru+VwoQ464DkaLEeRM08wJA==", "dev": true, "license": "MPL-2.0", "engines": { @@ -2117,6 +2433,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, "license": "MIT" }, "node_modules/baseline-browser-mapping": { @@ -2144,12 +2461,14 @@ } }, "node_modules/brace-expansion": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.1.tgz", - "integrity": "sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA==", + "version": "1.1.16", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.16.tgz", + "integrity": "sha512-IDw48K2/2kRkg9LdJxurvq3lV3aBgq0REY89duEqFRthjlPdXHKMj7EnQOXVckxzgisinf3nHfrcE2FufFLXMw==", + "dev": true, "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, "node_modules/braces": { @@ -2165,9 +2484,9 @@ } }, "node_modules/browserslist": { - "version": "4.25.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.0.tgz", - "integrity": "sha512-PJ8gYKeS5e/whHBh8xrwYK+dAvEj7JXtz6uTucnMRB8OiGTsKccFekoRrjajPBHV8oOY+2tI4uxeceSimKwMFA==", + "version": "4.28.6", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.6.tgz", + "integrity": "sha512-FQBYNK15VMslhLHpA7+n+n1GOlF1kId2xcCg7/j95f24AOF6VDYMNH4mFxF7KuaTdv627faazpOAjFzMrfJOUw==", "funding": [ { "type": "opencollective", @@ -2184,10 +2503,11 @@ ], "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001718", - "electron-to-chromium": "^1.5.160", - "node-releases": "^2.0.19", - "update-browserslist-db": "^1.1.3" + "baseline-browser-mapping": "^2.10.42", + "caniuse-lite": "^1.0.30001803", + "electron-to-chromium": "^1.5.389", + "node-releases": "^2.0.51", + "update-browserslist-db": "^1.2.3" }, "bin": { "browserslist": "cli.js" @@ -2197,15 +2517,15 @@ } }, "node_modules/call-bind": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", - "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.9.tgz", + "integrity": "sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==", "dev": true, "license": "MIT", "dependencies": { - "call-bind-apply-helpers": "^1.0.0", - "es-define-property": "^1.0.0", - "get-intrinsic": "^1.2.4", + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "get-intrinsic": "^1.3.0", "set-function-length": "^1.2.2" }, "engines": { @@ -2265,9 +2585,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001799", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001799.tgz", - "integrity": "sha512-hG1bReV+OUU+MOqK4t/ZWI0tZOyz3rqS9XuhOUz1cIcbwBKjOyJEJuw9ER5JuNyqxNk8u/JUVbGibBOL1yrjFw==", + "version": "1.0.30001806", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001806.tgz", + "integrity": "sha512-72Cuvd95zbSYPKq6Fhg8eDJRlzgWDf7/mtoZv6Qe/DYNCEBdNxoA3+rZAU2ZhGCpZlns3EssFavaZomckT5Uuw==", "funding": [ { "type": "opencollective", @@ -2366,17 +2686,17 @@ } }, "node_modules/cli-truncate": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-4.0.0.tgz", - "integrity": "sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-5.2.0.tgz", + "integrity": "sha512-xRwvIOMGrfOAnM1JYtqQImuaNtDEv9v6oIYAs4LIHwTiKee8uwvIi363igssOC0O5U04i4AlENs79LQLu9tEMw==", "dev": true, "license": "MIT", "dependencies": { - "slice-ansi": "^5.0.0", - "string-width": "^7.0.0" + "slice-ansi": "^8.0.0", + "string-width": "^8.2.0" }, "engines": { - "node": ">=18" + "node": ">=20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -2401,6 +2721,7 @@ "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" @@ -2413,6 +2734,7 @@ "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/colorette": { @@ -2435,9 +2757,9 @@ } }, "node_modules/commander": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.0.tgz", - "integrity": "sha512-2uM9rYjPvyq39NwLRqaiLtWHyDC1FvryJDa2ATTVims5YAS4PupsEQsDvP14FqhFr0P49CYDugi59xaxJlTXRA==", + "version": "14.0.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.3.tgz", + "integrity": "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==", "dev": true, "license": "MIT", "engines": { @@ -2455,6 +2777,7 @@ "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, "license": "MIT", "dependencies": { "path-key": "^3.1.0", @@ -2478,9 +2801,9 @@ } }, "node_modules/csstype": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", "devOptional": true, "license": "MIT" }, @@ -2546,9 +2869,9 @@ } }, "node_modules/debug": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", - "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -2636,6 +2959,19 @@ "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", "license": "MIT" }, + "node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/dunder-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", @@ -2650,37 +2986,18 @@ "node": ">= 0.4" } }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "license": "MIT" - }, "node_modules/electron-to-chromium": { - "version": "1.5.169", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.169.tgz", - "integrity": "sha512-q7SQx6mkLy0GTJK9K9OiWeaBMV4XQtBSdf6MJUzDB/H/5tFXfIiX38Lci1Kl6SsgiEhz1SQI1ejEOU5asWEhwQ==", + "version": "1.5.393", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.393.tgz", + "integrity": "sha512-kiDJdIUawuEIcp9XoICKp1iTYDEbgguIPq526N1Q7jIQDeQ3CqoMx71025PI/7E48Ddtw2HuWsVjY7afEgNxmg==", "license": "ISC" }, "node_modules/emoji-regex": { "version": "9.2.2", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "license": "MIT" - }, - "node_modules/enhanced-resolve": { - "version": "5.17.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", - "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, - "engines": { - "node": ">=10.13.0" - } + "license": "MIT" }, "node_modules/environment": { "version": "1.1.0", @@ -2696,9 +3013,9 @@ } }, "node_modules/es-abstract": { - "version": "1.24.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz", - "integrity": "sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==", + "version": "1.24.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.2.tgz", + "integrity": "sha512-2FpH9Q5i2RRwyEP1AylXe6nYLR5OhaJTZwmlcP0dL/+JCbgg7yyEo/sEK6HeGZRf3dFpWwThaRHVApXSkW3xeg==", "dev": true, "license": "MIT", "dependencies": { @@ -2764,6 +3081,25 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/es-abstract-get": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-abstract-get/-/es-abstract-get-1.0.0.tgz", + "integrity": "sha512-6PMWXpdhshVvFp+FoWYs1EvG1Nj0tvk0dZM+XcK0xMEM1czRVcP6ohqPWHy6qPagSpC8j4+p89WXlT+xXJs/fg==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.2", + "is-callable": "^1.2.7", + "object-inspect": "^1.13.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/es-define-property": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", @@ -2783,37 +3119,37 @@ } }, "node_modules/es-iterator-helpers": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.1.tgz", - "integrity": "sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.4.0.tgz", + "integrity": "sha512-c/A0P0oxkACDc+cKWw8evLXK83oBKgn0qPOqCYT4x9uolpCIJAcYvJC9QYKNDRPsTeGyCrQ326jrvgZWdCdK5Q==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", "define-properties": "^1.2.1", - "es-abstract": "^1.23.6", + "es-abstract": "^1.24.2", "es-errors": "^1.3.0", - "es-set-tostringtag": "^2.0.3", + "es-set-tostringtag": "^2.1.0", "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.6", + "get-intrinsic": "^1.3.0", "globalthis": "^1.0.4", "gopd": "^1.2.0", "has-property-descriptors": "^1.0.2", "has-proto": "^1.2.0", "has-symbols": "^1.1.0", "internal-slot": "^1.1.0", - "iterator.prototype": "^1.1.4", - "safe-array-concat": "^1.1.3" + "iterator.prototype": "^1.1.5", + "math-intrinsics": "^1.1.0" }, "engines": { "node": ">= 0.4" } }, "node_modules/es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", + "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", "license": "MIT", "dependencies": { "es-errors": "^1.3.0" @@ -2838,25 +3174,31 @@ } }, "node_modules/es-shim-unscopables": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", - "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", + "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", "dev": true, "license": "MIT", "dependencies": { - "hasown": "^2.0.0" + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" } }, "node_modules/es-to-primitive": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", - "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.4.tgz", + "integrity": "sha512-yPDz7wqpg1/mmHLmS3tcfTfbw5f1eryXvyghYBffGdERwe+mV7ZcWzTR8LR17Kvqt3qfPurjlonmnq3MKXIOXw==", "dev": true, "license": "MIT", "dependencies": { + "es-abstract-get": "^1.0.0", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", "is-callable": "^1.2.7", - "is-date-object": "^1.0.5", - "is-symbol": "^1.0.4" + "is-date-object": "^1.1.0", + "is-symbol": "^1.1.1" }, "engines": { "node": ">= 0.4" @@ -2888,26 +3230,25 @@ } }, "node_modules/eslint": { - "version": "9.29.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.29.0.tgz", - "integrity": "sha512-GsGizj2Y1rCWDu6XoEekL3RLilp0voSePurjZIkxL3wlm5o5EC9VpgaP7lrCvjnkuLvzFBQWB3vWB3K5KQTveQ==", + "version": "9.39.5", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.5.tgz", + "integrity": "sha512-DgZS62aPLXKlnxILS/AYCoRvHaZeXceIzlXPkkGGzJWSow1aEk0lbTlxUSlyjC8jcaKxAdOnTDz+o1JFSBsyjw==", "dev": true, "license": "MIT", "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.20.1", - "@eslint/config-helpers": "^0.2.1", - "@eslint/core": "^0.14.0", - "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.29.0", - "@eslint/plugin-kit": "^0.3.1", + "@eslint/config-array": "^0.21.2", + "@eslint/config-helpers": "^0.4.2", + "@eslint/core": "^0.17.0", + "@eslint/eslintrc": "^3.3.6", + "@eslint/js": "9.39.5", + "@eslint/plugin-kit": "^0.4.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", - "@types/json-schema": "^7.0.15", - "ajv": "^6.12.4", + "ajv": "^6.14.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", @@ -2926,7 +3267,7 @@ "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", + "minimatch": "^3.1.5", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, @@ -2976,56 +3317,16 @@ } } }, - "node_modules/eslint-config-next/node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.34.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.34.1.tgz", - "integrity": "sha512-STXcN6ebF6li4PxwNeFnqF8/2BNDvBupf2OPx2yWNzr6mKNGF7q49VM00Pz5FaomJyqvbXpY6PhO+T9w139YEQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.34.1", - "@typescript-eslint/type-utils": "8.34.1", - "@typescript-eslint/utils": "8.34.1", - "@typescript-eslint/visitor-keys": "8.34.1", - "graphemer": "^1.4.0", - "ignore": "^7.0.0", - "natural-compare": "^1.4.0", - "ts-api-utils": "^2.1.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^8.34.1", - "eslint": "^8.57.0 || ^9.0.0", - "typescript": ">=4.8.4 <5.9.0" - } - }, - "node_modules/eslint-config-next/node_modules/ignore": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", - "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, "node_modules/eslint-import-resolver-node": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", - "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "version": "0.3.10", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.10.tgz", + "integrity": "sha512-tRrKqFyCaKict5hOd244sL6EQFNycnMQnBe+j8uqGNXYzsImGbGUU4ibtoaBmv5FLwJwcFJNeg1GeVjQfbMrDQ==", "dev": true, "license": "MIT", "dependencies": { "debug": "^3.2.7", - "is-core-module": "^2.13.0", - "resolve": "^1.22.4" + "is-core-module": "^2.16.1", + "resolve": "^2.0.0-next.6" } }, "node_modules/eslint-import-resolver-node/node_modules/debug": { @@ -3039,35 +3340,44 @@ } }, "node_modules/eslint-import-resolver-typescript": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.1.tgz", - "integrity": "sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==", + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.10.1.tgz", + "integrity": "sha512-A1rHYb06zjMGAxdLSkN2fXPBwuSaQ0iO5M/hdyS0Ajj1VBaRp0sPD3dn1FhME3c/JluGFbwSxyCfqdSbtQLAHQ==", "dev": true, "license": "ISC", "dependencies": { - "debug": "^4.3.4", - "enhanced-resolve": "^5.12.0", - "eslint-module-utils": "^2.7.4", - "fast-glob": "^3.3.1", - "get-tsconfig": "^4.5.0", - "is-core-module": "^2.11.0", - "is-glob": "^4.0.3" + "@nolyfill/is-core-module": "1.0.39", + "debug": "^4.4.0", + "get-tsconfig": "^4.10.0", + "is-bun-module": "^2.0.0", + "stable-hash": "^0.0.5", + "tinyglobby": "^0.2.13", + "unrs-resolver": "^1.6.2" }, "engines": { "node": "^14.18.0 || >=16.0.0" }, "funding": { - "url": "https://opencollective.com/unts/projects/eslint-import-resolver-ts" + "url": "https://opencollective.com/eslint-import-resolver-typescript" }, "peerDependencies": { "eslint": "*", - "eslint-plugin-import": "*" + "eslint-plugin-import": "*", + "eslint-plugin-import-x": "*" + }, + "peerDependenciesMeta": { + "eslint-plugin-import": { + "optional": true + }, + "eslint-plugin-import-x": { + "optional": true + } } }, "node_modules/eslint-module-utils": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz", - "integrity": "sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==", + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.14.0.tgz", + "integrity": "sha512-W2WCRZ9Dqntd+2u8jJcVMV2PKulc6RdLgUUoh/yQr3uB6lo/ZOeGx11sv60/8S4QFFKNslAlWhr9u0Ef7ZW6Ig==", "dev": true, "license": "MIT", "dependencies": { @@ -3093,30 +3403,30 @@ } }, "node_modules/eslint-plugin-import": { - "version": "2.31.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz", - "integrity": "sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==", + "version": "2.32.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz", + "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", "dev": true, "license": "MIT", "dependencies": { "@rtsao/scc": "^1.1.0", - "array-includes": "^3.1.8", - "array.prototype.findlastindex": "^1.2.5", - "array.prototype.flat": "^1.3.2", - "array.prototype.flatmap": "^1.3.2", + "array-includes": "^3.1.9", + "array.prototype.findlastindex": "^1.2.6", + "array.prototype.flat": "^1.3.3", + "array.prototype.flatmap": "^1.3.3", "debug": "^3.2.7", "doctrine": "^2.1.0", "eslint-import-resolver-node": "^0.3.9", - "eslint-module-utils": "^2.12.0", + "eslint-module-utils": "^2.12.1", "hasown": "^2.0.2", - "is-core-module": "^2.15.1", + "is-core-module": "^2.16.1", "is-glob": "^4.0.3", "minimatch": "^3.1.2", "object.fromentries": "^2.0.8", "object.groupby": "^1.0.3", - "object.values": "^1.2.0", + "object.values": "^1.2.1", "semver": "^6.3.1", - "string.prototype.trimend": "^1.0.8", + "string.prototype.trimend": "^1.0.9", "tsconfig-paths": "^3.15.0" }, "engines": { @@ -3126,17 +3436,6 @@ "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" } }, - "node_modules/eslint-plugin-import/node_modules/brace-expansion": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", - "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, "node_modules/eslint-plugin-import/node_modules/debug": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", @@ -3147,32 +3446,6 @@ "ms": "^2.1.1" } }, - "node_modules/eslint-plugin-import/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-plugin-import/node_modules/minimatch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/eslint-plugin-import/node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -3213,30 +3486,6 @@ "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" } }, - "node_modules/eslint-plugin-jsx-a11y/node_modules/brace-expansion": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", - "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/eslint-plugin-jsx-a11y/node_modules/minimatch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/eslint-plugin-react": { "version": "7.37.5", "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", @@ -3283,61 +3532,6 @@ "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" } }, - "node_modules/eslint-plugin-react/node_modules/brace-expansion": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", - "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/eslint-plugin-react/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eslint-plugin-react/node_modules/minimatch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/eslint-plugin-react/node_modules/resolve": { - "version": "2.0.0-next.5", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", - "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-core-module": "^2.13.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/eslint-plugin-react/node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -3388,17 +3582,6 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/brace-expansion": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", - "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, "node_modules/eslint/node_modules/eslint-visitor-keys": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", @@ -3412,19 +3595,6 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/minimatch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/espree": { "version": "10.4.0", "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", @@ -3457,9 +3627,9 @@ } }, "node_modules/esquery": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", - "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -3503,9 +3673,9 @@ } }, "node_modules/eventemitter3": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", - "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz", + "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", "dev": true, "license": "MIT" }, @@ -3517,9 +3687,10 @@ "license": "MIT" }, "node_modules/fast-glob": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", - "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "dev": true, "license": "MIT", "dependencies": { "@nodelib/fs.stat": "^2.0.2", @@ -3536,6 +3707,7 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, "license": "ISC", "dependencies": { "is-glob": "^4.0.1" @@ -3559,14 +3731,31 @@ "license": "MIT" }, "node_modules/fastq": { - "version": "1.17.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", - "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", "license": "ISC", "dependencies": { "reusify": "^1.0.4" } }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, "node_modules/file-entry-cache": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", @@ -3666,22 +3855,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/foreground-child": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", - "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", - "license": "ISC", - "dependencies": { - "cross-spawn": "^7.0.6", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/form-data": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.6.tgz", @@ -3699,15 +3872,15 @@ } }, "node_modules/fraction.js": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", - "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz", + "integrity": "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==", "license": "MIT", "engines": { "node": "*" }, "funding": { - "type": "patreon", + "type": "github", "url": "https://github.com/sponsors/rawify" } }, @@ -3735,18 +3908,21 @@ } }, "node_modules/function.prototype.name": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", - "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.2.0.tgz", + "integrity": "sha512-jObKIik1P2QjPHP5nz5BaOtUlfgS0fWo8IUByNXkM+o+02sJOi94em77GwJKQSJ3gfPHdgzLNrHc1uokV4P/ew==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.3", - "define-properties": "^1.2.1", + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", "functions-have-names": "^1.2.3", - "hasown": "^2.0.2", - "is-callable": "^1.2.7" + "has-property-descriptors": "^1.0.2", + "hasown": "^2.0.4", + "is-callable": "^1.2.7", + "is-document.all": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -3761,14 +3937,24 @@ "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", "dev": true, "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/generator-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", + "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" } }, "node_modules/get-east-asian-width": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.3.0.tgz", - "integrity": "sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.6.0.tgz", + "integrity": "sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==", "dev": true, "license": "MIT", "engines": { @@ -3834,9 +4020,9 @@ } }, "node_modules/get-tsconfig": { - "version": "4.7.6", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.6.tgz", - "integrity": "sha512-ZAqrLlu18NbDdRaHq+AKXzAmqIUPswPWKUchfytdAjiRFnCe5ojG2bstg6mRiZabkKfCoL/e98pbBELIV/YCeA==", + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.14.0.tgz", + "integrity": "sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA==", "dev": true, "license": "MIT", "dependencies": { @@ -3846,27 +4032,6 @@ "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" } }, - "node_modules/glob": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", - "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", - "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/glob-parent": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", @@ -3921,20 +4086,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true, - "license": "MIT" - }, "node_modules/has-bigints": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", @@ -4190,6 +4341,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-bun-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-bun-module/-/is-bun-module-2.0.0.tgz", + "integrity": "sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.7.1" + } + }, "node_modules/is-callable": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", @@ -4204,12 +4365,12 @@ } }, "node_modules/is-core-module": { - "version": "2.16.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", - "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "version": "2.16.2", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz", + "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==", "license": "MIT", "dependencies": { - "hasown": "^2.0.2" + "hasown": "^2.0.3" }, "engines": { "node": ">= 0.4" @@ -4268,6 +4429,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-document.all": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-document.all/-/is-document.all-1.0.0.tgz", + "integrity": "sha512-+XSoyS05OdBbhFuELhgTCpFNHkpBOJqtsZfUFFpe5QTw+9Sjbh8zitxhQkYAo6wV7e1Vb8cAPvpCk9jGam/82g==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -4294,27 +4471,31 @@ } }, "node_modules/is-fullwidth-code-point": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", - "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.1.0.tgz", + "integrity": "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==", "dev": true, "license": "MIT", + "dependencies": { + "get-east-asian-width": "^1.3.1" + }, "engines": { - "node": ">=12" + "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/is-generator-function": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", - "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", + "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", "dev": true, "license": "MIT", "dependencies": { - "call-bound": "^1.0.3", - "get-proto": "^1.0.0", + "call-bound": "^1.0.4", + "generator-function": "^2.0.0", + "get-proto": "^1.0.1", "has-tostringtag": "^1.0.2", "safe-regex-test": "^1.1.0" }, @@ -4563,6 +4744,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, "license": "ISC" }, "node_modules/iterator.prototype": { @@ -4583,25 +4765,10 @@ "node": ">= 0.4" } }, - "node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, "node_modules/jiti": { - "version": "1.21.6", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz", - "integrity": "sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==", + "version": "1.21.7", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", + "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", "license": "MIT", "bin": { "jiti": "bin/jiti.js" @@ -4750,22 +4917,18 @@ "license": "MIT" }, "node_modules/lint-staged": { - "version": "16.1.2", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-16.1.2.tgz", - "integrity": "sha512-sQKw2Si2g9KUZNY3XNvRuDq4UJqpHwF0/FQzZR2M7I5MvtpWvibikCjUVJzZdGE0ByurEl3KQNvsGetd1ty1/Q==", + "version": "16.4.0", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-16.4.0.tgz", + "integrity": "sha512-lBWt8hujh/Cjysw5GYVmZpFHXDCgZzhrOm8vbcUdobADZNOK/bRshr2kM3DfgrrtR1DQhfupW9gnIXOfiFi+bw==", "dev": true, "license": "MIT", "dependencies": { - "chalk": "^5.4.1", - "commander": "^14.0.0", - "debug": "^4.4.1", - "lilconfig": "^3.1.3", - "listr2": "^8.3.3", - "micromatch": "^4.0.8", - "nano-spawn": "^1.0.2", - "pidtree": "^0.6.0", + "commander": "^14.0.3", + "listr2": "^9.0.5", + "picomatch": "^4.0.3", "string-argv": "^0.3.2", - "yaml": "^2.8.0" + "tinyexec": "^1.0.4", + "yaml": "^2.8.2" }, "bin": { "lint-staged": "bin/lint-staged.js" @@ -4777,27 +4940,14 @@ "url": "https://opencollective.com/lint-staged" } }, - "node_modules/lint-staged/node_modules/chalk": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", - "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, "node_modules/listr2": { - "version": "8.3.3", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.3.3.tgz", - "integrity": "sha512-LWzX2KsqcB1wqQ4AHgYb4RsDXauQiqhjLk+6hjbaeHG4zpjjVAB6wC/gz6X0l+Du1cN3pUB5ZlrvTbhGSNnUQQ==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-9.0.5.tgz", + "integrity": "sha512-ME4Fb83LgEgwNw96RKNvKV4VTLuXfoKudAmm2lP8Kk87KaMK0/Xrx/aAkMWmT8mDb+3MlFDspfbCs7adjRxA2g==", "dev": true, "license": "MIT", "dependencies": { - "cli-truncate": "^4.0.0", + "cli-truncate": "^5.0.0", "colorette": "^2.0.20", "eventemitter3": "^5.0.1", "log-update": "^6.1.0", @@ -4805,7 +4955,7 @@ "wrap-ansi": "^9.0.0" }, "engines": { - "node": ">=18.0.0" + "node": ">=20.0.0" } }, "node_modules/locate-path": { @@ -4852,9 +5002,9 @@ } }, "node_modules/log-update/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "dev": true, "license": "MIT", "engines": { @@ -4864,26 +5014,10 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/log-update/node_modules/is-fullwidth-code-point": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-5.0.0.tgz", - "integrity": "sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==", - "dev": true, - "license": "MIT", - "dependencies": { - "get-east-asian-width": "^1.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/log-update/node_modules/slice-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.0.tgz", - "integrity": "sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-7.1.2.tgz", + "integrity": "sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==", "dev": true, "license": "MIT", "dependencies": { @@ -4910,12 +5044,6 @@ "loose-envify": "cli.js" } }, - "node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "license": "ISC" - }, "node_modules/lucide-react": { "version": "0.516.0", "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.516.0.tgz", @@ -4956,6 +5084,18 @@ "node": ">=8.6" } }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", @@ -4991,18 +5131,16 @@ } }, "node_modules/minimatch": { - "version": "9.0.9", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", - "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, "license": "ISC", "dependencies": { - "brace-expansion": "^2.0.2" + "brace-expansion": "^1.1.7" }, "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": "*" } }, "node_modules/minimist": { @@ -5015,15 +5153,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "license": "ISC", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -5041,23 +5170,10 @@ "thenify-all": "^1.0.0" } }, - "node_modules/nano-spawn": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/nano-spawn/-/nano-spawn-1.0.2.tgz", - "integrity": "sha512-21t+ozMQDAL/UGgQVBbZ/xXvNO10++ZPuTmKRO8k9V3AClVRht49ahtDjfY8l1q6nSHOrE5ASfthzH3ol6R/hg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=20.17" - }, - "funding": { - "url": "https://github.com/sindresorhus/nano-spawn?sponsor=1" - } - }, "node_modules/nanoid": { - "version": "3.3.15", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.15.tgz", - "integrity": "sha512-y7Wygv/7mEOvxTuEQDB8StXdMRBWf1kR/tlhAzBRUFkB2jfcLOAxO/SHmOO2zgz1pVgK29/kyupn059/bCHdjA==", + "version": "3.3.16", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.16.tgz", + "integrity": "sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q==", "funding": [ { "type": "github", @@ -5072,6 +5188,22 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, + "node_modules/napi-postinstall": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.3.4.tgz", + "integrity": "sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==", + "dev": true, + "license": "MIT", + "bin": { + "napi-postinstall": "lib/cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/napi-postinstall" + } + }, "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -5160,11 +5292,43 @@ "node": "^10 || ^12 || >=14" } }, + "node_modules/node-exports-info": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/node-exports-info/-/node-exports-info-1.6.2.tgz", + "integrity": "sha512-kXs9Go0cah0qHVV2v389IXQLdLCeE1xfFtjOAF+iobu0OIoG1pje8At2vMHyaPMiPMnG/LWP50twML21eMcAag==", + "dev": true, + "license": "MIT", + "dependencies": { + "array.prototype.flatmap": "^1.3.3", + "es-errors": "^1.3.0", + "object.entries": "^1.1.9", + "semver": "^6.3.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/node-exports-info/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/node-releases": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", - "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", - "license": "MIT" + "version": "2.0.51", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.51.tgz", + "integrity": "sha512-wRNIrw4DmVLKQlbgOMdkMx27Wrpzes2hh5Jtbi2bjPd+4wJstWIqP5A+lscnqbm0xxmT5Bpg8Lec5ItEBwx6BQ==", + "license": "MIT", + "engines": { + "node": ">=18" + } }, "node_modules/normalize-path": { "version": "3.0.0", @@ -5175,15 +5339,6 @@ "node": ">=0.10.0" } }, - "node_modules/normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -5399,12 +5554,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/package-json-from-dist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", - "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", - "license": "BlueOak-1.0.0" - }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -5432,6 +5581,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -5443,22 +5593,6 @@ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "license": "MIT" }, - "node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", - "license": "BlueOak-1.0.0", - "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -5466,30 +5600,17 @@ "license": "ISC" }, "node_modules/picomatch": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", - "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", + "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", "license": "MIT", "engines": { - "node": ">=8.6" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/pidtree": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz", - "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==", - "dev": true, - "license": "MIT", - "bin": { - "pidtree": "bin/pidtree.js" - }, - "engines": { - "node": ">=0.10" - } - }, "node_modules/pify": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", @@ -5519,9 +5640,9 @@ } }, "node_modules/postcss": { - "version": "8.5.15", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.15.tgz", - "integrity": "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==", + "version": "8.5.19", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.19.tgz", + "integrity": "sha512-Mz8SaolMd8nB+G13WkORcxQKHZ/NE4xXevtkJHVuG+guo9/wYKlIMTKAqGdEmYOXR2ijPjTYNHssizdaVSUNdQ==", "funding": [ { "type": "opencollective", @@ -5563,10 +5684,41 @@ "postcss": "^8.0.0" } }, + "node_modules/postcss-import/node_modules/resolve": { + "version": "1.22.12", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", + "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/postcss-js": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", - "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.1.0.tgz", + "integrity": "sha512-oIAOTqgIo7q2EOwbhb8UalYePMvYoIeRY2YKntdpFQXNosSu3vLrniGgmH9OKs/qAkfoj5oB3le/7mINW1LCfw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], "license": "MIT", "dependencies": { "camelcase-css": "^2.0.1" @@ -5574,14 +5726,52 @@ "engines": { "node": "^12 || ^14 || >= 16" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, "peerDependencies": { "postcss": "^8.4.21" } }, + "node_modules/postcss-load-config": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-6.0.1.tgz", + "integrity": "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "lilconfig": "^3.1.1" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "jiti": ">=1.21.0", + "postcss": ">=8.0.9", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + }, + "postcss": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, "node_modules/postcss-nested": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", @@ -5608,9 +5798,9 @@ } }, "node_modules/postcss-selector-parser": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", - "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.4.tgz", + "integrity": "sha512-bIoJLOmjCO1S9XdY/DcnR5hJxvrDir1PbGChrzXG3vw0/FOliy/fA3dmdhQ441kah4gKv+TwckGzex6wNS5cnQ==", "license": "MIT", "dependencies": { "cssesc": "^3.0.0", @@ -5637,9 +5827,9 @@ } }, "node_modules/prettier": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.5.3.tgz", - "integrity": "sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==", + "version": "3.9.5", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.9.5.tgz", + "integrity": "sha512-/FVl766LpUfB5vXgCYOYa0MeV/441Ia99AeICQIQFTY/Nw0roZwULcXpku5i1/m5kt/baz+s4Zogspd839HSMg==", "dev": true, "license": "MIT", "bin": { @@ -5653,9 +5843,9 @@ } }, "node_modules/prettier-plugin-tailwindcss": { - "version": "0.6.12", - "resolved": "https://registry.npmjs.org/prettier-plugin-tailwindcss/-/prettier-plugin-tailwindcss-0.6.12.tgz", - "integrity": "sha512-OuTQKoqNwV7RnxTPwXWzOFXy6Jc4z8oeRZYGuMpRyG3WbuR3jjXdQFK8qFBMBx8UHWdHrddARz2fgUenild6aw==", + "version": "0.6.14", + "resolved": "https://registry.npmjs.org/prettier-plugin-tailwindcss/-/prettier-plugin-tailwindcss-0.6.14.tgz", + "integrity": "sha512-pi2e/+ZygeIqntN+vC573BcW5Cve8zUB0SSAGxqpB4f96boZF4M3phPVoOFCeypwkpRYdi7+jQ5YJJUwrkGUAg==", "dev": true, "license": "MIT", "engines": { @@ -5663,6 +5853,8 @@ }, "peerDependencies": { "@ianvs/prettier-plugin-sort-imports": "*", + "@prettier/plugin-hermes": "*", + "@prettier/plugin-oxc": "*", "@prettier/plugin-pug": "*", "@shopify/prettier-plugin-liquid": "*", "@trivago/prettier-plugin-sort-imports": "*", @@ -5684,6 +5876,12 @@ "@ianvs/prettier-plugin-sort-imports": { "optional": true }, + "@prettier/plugin-hermes": { + "optional": true + }, + "@prettier/plugin-oxc": { + "optional": true + }, "@prettier/plugin-pug": { "optional": true }, @@ -5831,6 +6029,18 @@ "node": ">=8.10.0" } }, + "node_modules/readdirp/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/reflect.getprototypeof": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", @@ -5876,18 +6086,25 @@ } }, "node_modules/resolve": { - "version": "1.22.8", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", - "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "version": "2.0.0-next.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.7.tgz", + "integrity": "sha512-tqt+NBWwyaMgw3zDsnygx4CByWjQEJHOPMdslYhppaQSJUtL/D4JO9CcBBlhPoI8lz9oJIDXkwXfhF4aWqP8xQ==", + "dev": true, "license": "MIT", "dependencies": { - "is-core-module": "^2.13.0", + "es-errors": "^1.3.0", + "is-core-module": "^2.16.2", + "node-exports-info": "^1.6.0", + "object-keys": "^1.1.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" }, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -5930,9 +6147,9 @@ } }, "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", "license": "MIT", "engines": { "iojs": ">=1.0.0", @@ -5970,15 +6187,15 @@ } }, "node_modules/safe-array-concat": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", - "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.4.tgz", + "integrity": "sha512-wtZlHyOje6OZTGqAoaDKxFkgRtkF9CnHAVnCHKfuj200wAgL+bSJhdsCD2l0Qx/2ekEXjPWcyKkfGb5CPboslg==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", - "get-intrinsic": "^1.2.6", + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", + "get-intrinsic": "^1.3.0", "has-symbols": "^1.1.0", "isarray": "^2.0.5" }, @@ -6141,6 +6358,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" @@ -6153,21 +6371,22 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/side-channel": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", - "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.1.tgz", + "integrity": "sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==", "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", - "object-inspect": "^1.13.3", - "side-channel-list": "^1.0.0", + "object-inspect": "^1.13.4", + "side-channel-list": "^1.0.1", "side-channel-map": "^1.0.1", "side-channel-weakmap": "^1.0.2" }, @@ -6179,14 +6398,14 @@ } }, "node_modules/side-channel-list": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", + "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", - "object-inspect": "^1.13.3" + "object-inspect": "^1.13.4" }, "engines": { "node": ">= 0.4" @@ -6238,6 +6457,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, "license": "ISC", "engines": { "node": ">=14" @@ -6247,26 +6467,26 @@ } }, "node_modules/slice-ansi": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", - "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-8.0.0.tgz", + "integrity": "sha512-stxByr12oeeOyY2BlviTNQlYV5xOj47GirPr4yA1hE9JCtxfQN0+tVbkxwCtYDQWhEKWFHsEK48ORg5jrouCAg==", "dev": true, "license": "MIT", "dependencies": { - "ansi-styles": "^6.0.0", - "is-fullwidth-code-point": "^4.0.0" + "ansi-styles": "^6.2.3", + "is-fullwidth-code-point": "^5.1.0" }, "engines": { - "node": ">=12" + "node": ">=20" }, "funding": { "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, "node_modules/slice-ansi/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", "dev": true, "license": "MIT", "engines": { @@ -6285,6 +6505,13 @@ "node": ">=0.10.0" } }, + "node_modules/stable-hash": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/stable-hash/-/stable-hash-0.0.5.tgz", + "integrity": "sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==", + "dev": true, + "license": "MIT" + }, "node_modules/stop-iteration-iterator": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", @@ -6310,81 +6537,22 @@ } }, "node_modules/string-width": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-8.2.2.tgz", + "integrity": "sha512-GaPUh5gfdrYzqeVNZvUfT23vYYxXzKYidUcnMtJg/3rxRV63EFZy3k6xfKlmfeJD0176lnUV/Usr3XcwSvFzpg==", "dev": true, "license": "MIT", "dependencies": { - "emoji-regex": "^10.3.0", - "get-east-asian-width": "^1.0.0", - "strip-ansi": "^7.1.0" + "get-east-asian-width": "^1.5.0", + "strip-ansi": "^7.1.2" }, "engines": { - "node": ">=18" + "node": ">=20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT" - }, - "node_modules/string-width-cjs/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width/node_modules/emoji-regex": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", - "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", - "dev": true, - "license": "MIT" - }, "node_modules/string.prototype.includes": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz", @@ -6440,19 +6608,20 @@ } }, "node_modules/string.prototype.trim": { - "version": "1.2.10", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", - "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.11.tgz", + "integrity": "sha512-PwvK7BU+CMTJGYQCTZb5RWXIML92lftJLhQz1tBzgKiqGxJaMlBAa48POXaNAC2s4y8jr3EFqrkF9+44neS46w==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", "define-data-property": "^1.1.4", "define-properties": "^1.2.1", - "es-abstract": "^1.23.5", - "es-object-atoms": "^1.0.0", - "has-property-descriptors": "^1.0.2" + "es-abstract": "^1.24.2", + "es-object-atoms": "^1.1.2", + "has-property-descriptors": "^1.0.2", + "safe-regex-test": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -6462,16 +6631,16 @@ } }, "node_modules/string.prototype.trimend": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", - "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.10.tgz", + "integrity": "sha512-2+3aDAOmPTmuFwjDnmJG2ctEkQKVki7vOSqaxkv42Mowj1V6PnvuwFCRrR5lChUux1TBskPjfkeTOhqczDMxTw==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.8", - "call-bound": "^1.0.2", + "call-bind": "^1.0.9", + "call-bound": "^1.0.4", "define-properties": "^1.2.1", - "es-object-atoms": "^1.0.0" + "es-object-atoms": "^1.1.2" }, "engines": { "node": ">= 0.4" @@ -6499,12 +6668,13 @@ } }, "node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dev": true, "license": "MIT", "dependencies": { - "ansi-regex": "^6.0.1" + "ansi-regex": "^6.2.2" }, "engines": { "node": ">=12" @@ -6513,28 +6683,6 @@ "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", @@ -6582,17 +6730,17 @@ } }, "node_modules/sucrase": { - "version": "3.35.0", - "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", - "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", + "version": "3.35.1", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.1.tgz", + "integrity": "sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==", "license": "MIT", "dependencies": { "@jridgewell/gen-mapping": "^0.3.2", "commander": "^4.0.0", - "glob": "^10.3.10", "lines-and-columns": "^1.1.6", "mz": "^2.7.0", "pirates": "^4.0.1", + "tinyglobby": "^0.2.11", "ts-interface-checker": "^0.1.9" }, "bin": { @@ -6638,9 +6786,9 @@ } }, "node_modules/tailwind-merge": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.3.1.tgz", - "integrity": "sha512-gBXpgUm/3rp1lMZZrM/w7D8GKqshif0zAymAhbCyIt8KMe+0v9DQ7cdYLR4FHH/cKpdTXb+A/tKKU3eolfsI+g==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.6.0.tgz", + "integrity": "sha512-uxL7qAVQriqRQPAyK3pj66VqskWqoZ37PW94jwOTwNfq/z9oyu1V+eqrZqtR2+fCiXdYOZe/Modt8GtvqNzu+w==", "license": "MIT", "funding": { "type": "github", @@ -6648,9 +6796,9 @@ } }, "node_modules/tailwindcss": { - "version": "3.4.17", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.17.tgz", - "integrity": "sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==", + "version": "3.4.19", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.19.tgz", + "integrity": "sha512-3ofp+LL8E+pK/JuPLPggVAIaEuhvIz4qNcf3nA1Xn2o/7fb7s/TYpHhwGDv1ZU3PkBluUVaF8PyCHcm48cKLWQ==", "license": "MIT", "dependencies": { "@alloc/quick-lru": "^5.2.0", @@ -6661,7 +6809,7 @@ "fast-glob": "^3.3.2", "glob-parent": "^6.0.2", "is-glob": "^4.0.3", - "jiti": "^1.21.6", + "jiti": "^1.21.7", "lilconfig": "^3.1.3", "micromatch": "^4.0.8", "normalize-path": "^3.0.0", @@ -6670,7 +6818,7 @@ "postcss": "^8.4.47", "postcss-import": "^15.1.0", "postcss-js": "^4.0.1", - "postcss-load-config": "^4.0.2", + "postcss-load-config": "^4.0.2 || ^5.0 || ^6.0", "postcss-nested": "^6.2.0", "postcss-selector-parser": "^6.1.2", "resolve": "^1.22.8", @@ -6693,49 +6841,53 @@ "tailwindcss": ">=3.0.0 || insiders" } }, - "node_modules/tailwindcss/node_modules/postcss-load-config": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", - "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], + "node_modules/tailwindcss/node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", "license": "MIT", "dependencies": { - "lilconfig": "^3.0.0", - "yaml": "^2.3.4" + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" }, "engines": { - "node": ">= 14" - }, - "peerDependencies": { - "postcss": ">=8.0.9", - "ts-node": ">=9.0.0" + "node": ">=8.6.0" + } + }, + "node_modules/tailwindcss/node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" }, - "peerDependenciesMeta": { - "postcss": { - "optional": true - }, - "ts-node": { - "optional": true - } + "engines": { + "node": ">= 6" } }, - "node_modules/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "dev": true, + "node_modules/tailwindcss/node_modules/resolve": { + "version": "1.22.12", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", + "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, "engines": { - "node": ">=6" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/thenify": { @@ -6759,6 +6911,32 @@ "node": ">=0.8" } }, + "node_modules/tinyexec": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.2.4.tgz", + "integrity": "sha512-SHf/r48b7vOrjve9PxJo3MN5v5yuyjHvdUcrQffT3WXMUfnGmHDVbC4k3sHJaJTgZCwpUplIaAo5ANtMyp3YHg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -6772,9 +6950,9 @@ } }, "node_modules/ts-api-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", - "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", + "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", "dev": true, "license": "MIT", "engines": { @@ -6880,18 +7058,18 @@ } }, "node_modules/typed-array-length": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", - "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.8.tgz", + "integrity": "sha512-phPGCwqr2+Qo0fwniCE8e4pKnGu/yFb5nD5Y8bf0EEeiI5GklnACYA9GFy/DrAeRrKHXvHn+1SUsOWgJp6RO+g==", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "is-typed-array": "^1.1.13", - "possible-typed-array-names": "^1.0.0", - "reflect.getprototypeof": "^1.0.6" + "call-bind": "^1.0.9", + "for-each": "^0.3.5", + "gopd": "^1.2.0", + "is-typed-array": "^1.1.15", + "possible-typed-array-names": "^1.1.0", + "reflect.getprototypeof": "^1.0.10" }, "engines": { "node": ">= 0.4" @@ -6901,9 +7079,9 @@ } }, "node_modules/typescript": { - "version": "5.8.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", - "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "dev": true, "license": "Apache-2.0", "bin": { @@ -6934,16 +7112,54 @@ } }, "node_modules/undici-types": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.8.0.tgz", - "integrity": "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==", + "version": "7.18.2", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz", + "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==", "dev": true, "license": "MIT" }, + "node_modules/unrs-resolver": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.12.2.tgz", + "integrity": "sha512-dmlRxBJJayXjqTwC+JtF1HhJmgf3ftQ3YejFcZrf4+KKtJv0qDsK1pjqaaVjG7wJ5NJ6UVP1OqRMQ71Z4C3rxQ==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "napi-postinstall": "^0.3.4" + }, + "funding": { + "url": "https://opencollective.com/unrs-resolver" + }, + "optionalDependencies": { + "@unrs/resolver-binding-android-arm-eabi": "1.12.2", + "@unrs/resolver-binding-android-arm64": "1.12.2", + "@unrs/resolver-binding-darwin-arm64": "1.12.2", + "@unrs/resolver-binding-darwin-x64": "1.12.2", + "@unrs/resolver-binding-freebsd-x64": "1.12.2", + "@unrs/resolver-binding-linux-arm-gnueabihf": "1.12.2", + "@unrs/resolver-binding-linux-arm-musleabihf": "1.12.2", + "@unrs/resolver-binding-linux-arm64-gnu": "1.12.2", + "@unrs/resolver-binding-linux-arm64-musl": "1.12.2", + "@unrs/resolver-binding-linux-loong64-gnu": "1.12.2", + "@unrs/resolver-binding-linux-loong64-musl": "1.12.2", + "@unrs/resolver-binding-linux-ppc64-gnu": "1.12.2", + "@unrs/resolver-binding-linux-riscv64-gnu": "1.12.2", + "@unrs/resolver-binding-linux-riscv64-musl": "1.12.2", + "@unrs/resolver-binding-linux-s390x-gnu": "1.12.2", + "@unrs/resolver-binding-linux-x64-gnu": "1.12.2", + "@unrs/resolver-binding-linux-x64-musl": "1.12.2", + "@unrs/resolver-binding-openharmony-arm64": "1.12.2", + "@unrs/resolver-binding-wasm32-wasi": "1.12.2", + "@unrs/resolver-binding-win32-arm64-msvc": "1.12.2", + "@unrs/resolver-binding-win32-ia32-msvc": "1.12.2", + "@unrs/resolver-binding-win32-x64-msvc": "1.12.2" + } + }, "node_modules/update-browserslist-db": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", - "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", "funding": [ { "type": "opencollective", @@ -6990,6 +7206,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, "license": "ISC", "dependencies": { "isexe": "^2.0.0" @@ -7069,14 +7286,14 @@ } }, "node_modules/which-typed-array": { - "version": "1.1.19", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", - "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", + "version": "1.1.22", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.22.tgz", + "integrity": "sha512-fvO4ExWMFsqyhG3AiPAObMuY1lxaqgYcxbc49CNdWDDECOJNgQyvsOWVwbZc+qf3rzRtxojBK+CMEv0Ld5CYpw==", "dev": true, "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", + "call-bind": "^1.0.9", "call-bound": "^1.0.4", "for-each": "^0.3.5", "get-proto": "^1.0.1", @@ -7101,9 +7318,9 @@ } }, "node_modules/wrap-ansi": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", - "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.2.tgz", + "integrity": "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==", "dev": true, "license": "MIT", "dependencies": { @@ -7118,91 +7335,49 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, "engines": { - "node": ">=10" + "node": ">=12" }, "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", - "engines": { - "node": ">=8" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "node_modules/wrap-ansi/node_modules/emoji-regex": { + "version": "10.6.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.6.0.tgz", + "integrity": "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==", + "dev": true, "license": "MIT" }, - "node_modules/wrap-ansi-cjs/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", + "dev": true, "license": "MIT", "dependencies": { - "ansi-regex": "^5.0.1" + "emoji-regex": "^10.3.0", + "get-east-asian-width": "^1.0.0", + "strip-ansi": "^7.1.0" }, "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" + "node": ">=18" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/yaml": { "version": "2.9.0", "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz", "integrity": "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==", + "devOptional": true, "license": "ISC", "bin": { "yaml": "bin.mjs" diff --git a/client/package.json b/client/package.json index e73f239..8fbcaa7 100644 --- a/client/package.json +++ b/client/package.json @@ -16,7 +16,7 @@ }, "dependencies": { "@radix-ui/react-slot": "^1.2.3", - "@tanstack/react-query": "^5.80.7", + "@tanstack/react-query": "^5.101.2", "@tanstack/react-query-devtools": "^5.80.7", "autoprefixer": "^10.4.21", "axios": "^1.12.0", diff --git a/server/api/settings.py b/server/api/settings.py index dcc453b..ceae7c6 100644 --- a/server/api/settings.py +++ b/server/api/settings.py @@ -52,7 +52,7 @@ "rest_framework", "corsheaders", "api.healthcheck", - "api.news" + "api.news", "api.resources" ] diff --git a/server/api/urls.py b/server/api/urls.py index c335233..dfca4f7 100644 --- a/server/api/urls.py +++ b/server/api/urls.py @@ -29,6 +29,3 @@ if settings.DEBUG: urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) path("api/resources/", include(("api.resources.urls"))), -] - -urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) From abc1a09ec5d430366b21f7b73a79a846a77256cd Mon Sep 17 00:00:00 2001 From: Kevin Tan Date: Sat, 18 Jul 2026 07:16:49 +0000 Subject: [PATCH 25/30] fixed formatting issue --- client/src/components/ui/button.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/client/src/components/ui/button.tsx b/client/src/components/ui/button.tsx index 260661b..c71f4c1 100644 --- a/client/src/components/ui/button.tsx +++ b/client/src/components/ui/button.tsx @@ -34,7 +34,8 @@ const buttonVariants = cva( ); export interface ButtonProps - extends React.ButtonHTMLAttributes, + extends + React.ButtonHTMLAttributes, VariantProps { asChild?: boolean; } From 502915bd064b486b009d5da9dff86d9113c855a6 Mon Sep 17 00:00:00 2001 From: Kevin Tan Date: Sat, 18 Jul 2026 07:31:50 +0000 Subject: [PATCH 26/30] modified MEDIA_URL to NEWS_MEDIA_URL for definition - news images onyl --- server/api/settings.py | 4 ++-- server/api/urls.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/server/api/settings.py b/server/api/settings.py index ceae7c6..12031e3 100644 --- a/server/api/settings.py +++ b/server/api/settings.py @@ -148,8 +148,8 @@ os.path.dirname(os.path.abspath(__file__)))) # <- '/' directory STATIC_URL = "/static/" -MEDIA_URL = "/news_images/" -MEDIA_ROOT = BASE_DIR / "news_images" +NEWS_MEDIA_URL = "/news_images/" +NEWS_MEDIA_ROOT = BASE_DIR / "news_images" # STATIC_ROOT is where the static files get copied to when "collectstatic" is run. STATIC_ROOT = "static_files" diff --git a/server/api/urls.py b/server/api/urls.py index dfca4f7..3b4092b 100644 --- a/server/api/urls.py +++ b/server/api/urls.py @@ -27,5 +27,5 @@ ] if settings.DEBUG: - urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) + urlpatterns += static(settings.NEWS_MEDIA_URL, document_root=settings.MEDIA_ROOT) path("api/resources/", include(("api.resources.urls"))), From 5aea53edd6241eacc73ba160f1a4feadc83a37f3 Mon Sep 17 00:00:00 2001 From: Kevin Tan Date: Sat, 18 Jul 2026 07:41:03 +0000 Subject: [PATCH 27/30] modified MEDIA_URL to NEWS_MEDIA_URL for definition - news images onyl --- server/api/urls.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/api/urls.py b/server/api/urls.py index 3b4092b..41b6215 100644 --- a/server/api/urls.py +++ b/server/api/urls.py @@ -27,5 +27,5 @@ ] if settings.DEBUG: - urlpatterns += static(settings.NEWS_MEDIA_URL, document_root=settings.MEDIA_ROOT) + urlpatterns += static(settings.NEWS_MEDIA_URL, document_root=settings.NEWS_MEDIA_ROOT) path("api/resources/", include(("api.resources.urls"))), From 3d8618152f8a293ac4efef2064d959eff0a68630 Mon Sep 17 00:00:00 2001 From: Kevin Tan Date: Sat, 18 Jul 2026 07:46:08 +0000 Subject: [PATCH 28/30] fixed media and media root paths for saving images --- server/api/urls.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/server/api/urls.py b/server/api/urls.py index 41b6215..8033217 100644 --- a/server/api/urls.py +++ b/server/api/urls.py @@ -23,9 +23,10 @@ urlpatterns = [ path("admin/", admin.site.urls), path("api/healthcheck/", include(("api.healthcheck.urls"))), - path("api/news/", include(("api.news.urls"))), ] if settings.DEBUG: - urlpatterns += static(settings.NEWS_MEDIA_URL, document_root=settings.NEWS_MEDIA_ROOT) + urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) path("api/resources/", include(("api.resources.urls"))), + urlpatterns += static(settings.NEWS_MEDIA_URL, document_root=settings.NEWS_MEDIA_ROOT) + path("api/news/", include(("api.news.urls"))), From ee59690783745ab0b1044489bcce5479c52a7395 Mon Sep 17 00:00:00 2001 From: Kevin Tan Date: Sat, 18 Jul 2026 11:54:46 +0000 Subject: [PATCH 29/30] updated urlpatterns for images on news page. ' --- client/next.config.mjs | 2 +- server/api/settings.py | 6 +++--- server/api/urls.py | 5 ++--- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/client/next.config.mjs b/client/next.config.mjs index 96471d7..021a1b5 100644 --- a/client/next.config.mjs +++ b/client/next.config.mjs @@ -16,7 +16,7 @@ const nextConfig = { protocol: "http", hostname: "localhost", port: "8000", - pathname: "/news_images/**", + pathname: "/media/**", }, ], }, diff --git a/server/api/settings.py b/server/api/settings.py index 12031e3..a7387c1 100644 --- a/server/api/settings.py +++ b/server/api/settings.py @@ -53,7 +53,7 @@ "corsheaders", "api.healthcheck", "api.news", - "api.resources" + "api.resources", ] @@ -148,8 +148,8 @@ os.path.dirname(os.path.abspath(__file__)))) # <- '/' directory STATIC_URL = "/static/" -NEWS_MEDIA_URL = "/news_images/" -NEWS_MEDIA_ROOT = BASE_DIR / "news_images" +# NEWS_MEDIA_URL = "/news_images/" +# NEWS_MEDIA_ROOT = BASE_DIR / "news_images" # STATIC_ROOT is where the static files get copied to when "collectstatic" is run. STATIC_ROOT = "static_files" diff --git a/server/api/urls.py b/server/api/urls.py index 8033217..e30b594 100644 --- a/server/api/urls.py +++ b/server/api/urls.py @@ -23,10 +23,9 @@ urlpatterns = [ path("admin/", admin.site.urls), path("api/healthcheck/", include(("api.healthcheck.urls"))), + path("api/resources/", include(("api.resources.urls"))), + path("api/news/", include(("api.news.urls"))), ] if settings.DEBUG: urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) - path("api/resources/", include(("api.resources.urls"))), - urlpatterns += static(settings.NEWS_MEDIA_URL, document_root=settings.NEWS_MEDIA_ROOT) - path("api/news/", include(("api.news.urls"))), From f7bcfb240fa6dcbec04f5f451ef8ca38d8a14344 Mon Sep 17 00:00:00 2001 From: Kevin Tan Date: Sat, 18 Jul 2026 12:20:39 +0000 Subject: [PATCH 30/30] updating news image uploads to media/News --- .../news/migrations/0003_alter_news_image.py | 20 +++++++++++++++++++ server/api/news/models.py | 2 +- 2 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 server/api/news/migrations/0003_alter_news_image.py diff --git a/server/api/news/migrations/0003_alter_news_image.py b/server/api/news/migrations/0003_alter_news_image.py new file mode 100644 index 0000000..a3ecb47 --- /dev/null +++ b/server/api/news/migrations/0003_alter_news_image.py @@ -0,0 +1,20 @@ +# Generated by Django 5.2.16 on 2026-07-18 11:55 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("news", "0002_news_image_alter_news_published_at"), + ] + + operations = [ + migrations.AlterField( + model_name="news", + name="image", + field=models.ImageField( + blank=True, default=None, null=True, upload_to="News" + ), + ), + ] diff --git a/server/api/news/models.py b/server/api/news/models.py index 3b1d68b..c962722 100644 --- a/server/api/news/models.py +++ b/server/api/news/models.py @@ -12,7 +12,7 @@ class News(models.Model): body = models.TextField(blank=True) author = models.CharField(max_length=255, blank=True) published_at = models.DateField(blank=True) - image = models.ImageField(upload_to='', blank=True, null=True) + image = models.ImageField(null=True, blank=True, upload_to="News", max_length=None, default=None) def __str__(self): return self.title