From b577cf55209ace4b0a1df61238320271071225bd Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 9 Jun 2025 09:56:53 +0200 Subject: [PATCH 01/19] chore(deps): update dependency ruff to v0.11.13 (#5510) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- poetry.lock | 38 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/poetry.lock b/poetry.lock index a47c8d678..2398df125 100644 --- a/poetry.lock +++ b/poetry.lock @@ -3249,30 +3249,30 @@ jupyter = ["ipywidgets (>=7.5.1,<9)"] [[package]] name = "ruff" -version = "0.11.12" +version = "0.11.13" description = "An extremely fast Python linter and code formatter, written in Rust." optional = false python-versions = ">=3.7" groups = ["dev"] files = [ - {file = "ruff-0.11.12-py3-none-linux_armv6l.whl", hash = "sha256:c7680aa2f0d4c4f43353d1e72123955c7a2159b8646cd43402de6d4a3a25d7cc"}, - {file = "ruff-0.11.12-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:2cad64843da9f134565c20bcc430642de897b8ea02e2e79e6e02a76b8dcad7c3"}, - {file = "ruff-0.11.12-py3-none-macosx_11_0_arm64.whl", hash = "sha256:9b6886b524a1c659cee1758140138455d3c029783d1b9e643f3624a5ee0cb0aa"}, - {file = "ruff-0.11.12-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3cc3a3690aad6e86c1958d3ec3c38c4594b6ecec75c1f531e84160bd827b2012"}, - {file = "ruff-0.11.12-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f97fdbc2549f456c65b3b0048560d44ddd540db1f27c778a938371424b49fe4a"}, - {file = "ruff-0.11.12-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:74adf84960236961090e2d1348c1a67d940fd12e811a33fb3d107df61eef8fc7"}, - {file = "ruff-0.11.12-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:b56697e5b8bcf1d61293ccfe63873aba08fdbcbbba839fc046ec5926bdb25a3a"}, - {file = "ruff-0.11.12-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4d47afa45e7b0eaf5e5969c6b39cbd108be83910b5c74626247e366fd7a36a13"}, - {file = "ruff-0.11.12-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:692bf9603fe1bf949de8b09a2da896f05c01ed7a187f4a386cdba6760e7f61be"}, - {file = "ruff-0.11.12-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:08033320e979df3b20dba567c62f69c45e01df708b0f9c83912d7abd3e0801cd"}, - {file = "ruff-0.11.12-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:929b7706584f5bfd61d67d5070f399057d07c70585fa8c4491d78ada452d3bef"}, - {file = "ruff-0.11.12-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:7de4a73205dc5756b8e09ee3ed67c38312dce1aa28972b93150f5751199981b5"}, - {file = "ruff-0.11.12-py3-none-musllinux_1_2_i686.whl", hash = "sha256:2635c2a90ac1b8ca9e93b70af59dfd1dd2026a40e2d6eebaa3efb0465dd9cf02"}, - {file = "ruff-0.11.12-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:d05d6a78a89166f03f03a198ecc9d18779076ad0eec476819467acb401028c0c"}, - {file = "ruff-0.11.12-py3-none-win32.whl", hash = "sha256:f5a07f49767c4be4772d161bfc049c1f242db0cfe1bd976e0f0886732a4765d6"}, - {file = "ruff-0.11.12-py3-none-win_amd64.whl", hash = "sha256:5a4d9f8030d8c3a45df201d7fb3ed38d0219bccd7955268e863ee4a115fa0832"}, - {file = "ruff-0.11.12-py3-none-win_arm64.whl", hash = "sha256:65194e37853158d368e333ba282217941029a28ea90913c67e558c611d04daa5"}, - {file = "ruff-0.11.12.tar.gz", hash = "sha256:43cf7f69c7d7c7d7513b9d59c5d8cafd704e05944f978614aa9faff6ac202603"}, + {file = "ruff-0.11.13-py3-none-linux_armv6l.whl", hash = "sha256:4bdfbf1240533f40042ec00c9e09a3aade6f8c10b6414cf11b519488d2635d46"}, + {file = "ruff-0.11.13-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:aef9c9ed1b5ca28bb15c7eac83b8670cf3b20b478195bd49c8d756ba0a36cf48"}, + {file = "ruff-0.11.13-py3-none-macosx_11_0_arm64.whl", hash = "sha256:53b15a9dfdce029c842e9a5aebc3855e9ab7771395979ff85b7c1dedb53ddc2b"}, + {file = "ruff-0.11.13-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ab153241400789138d13f362c43f7edecc0edfffce2afa6a68434000ecd8f69a"}, + {file = "ruff-0.11.13-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6c51f93029d54a910d3d24f7dd0bb909e31b6cd989a5e4ac513f4eb41629f0dc"}, + {file = "ruff-0.11.13-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1808b3ed53e1a777c2ef733aca9051dc9bf7c99b26ece15cb59a0320fbdbd629"}, + {file = "ruff-0.11.13-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:d28ce58b5ecf0f43c1b71edffabe6ed7f245d5336b17805803312ec9bc665933"}, + {file = "ruff-0.11.13-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:55e4bc3a77842da33c16d55b32c6cac1ec5fb0fbec9c8c513bdce76c4f922165"}, + {file = "ruff-0.11.13-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:633bf2c6f35678c56ec73189ba6fa19ff1c5e4807a78bf60ef487b9dd272cc71"}, + {file = "ruff-0.11.13-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4ffbc82d70424b275b089166310448051afdc6e914fdab90e08df66c43bb5ca9"}, + {file = "ruff-0.11.13-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:4a9ddd3ec62a9a89578c85842b836e4ac832d4a2e0bfaad3b02243f930ceafcc"}, + {file = "ruff-0.11.13-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:d237a496e0778d719efb05058c64d28b757c77824e04ffe8796c7436e26712b7"}, + {file = "ruff-0.11.13-py3-none-musllinux_1_2_i686.whl", hash = "sha256:26816a218ca6ef02142343fd24c70f7cd8c5aa6c203bca284407adf675984432"}, + {file = "ruff-0.11.13-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:51c3f95abd9331dc5b87c47ac7f376db5616041173826dfd556cfe3d4977f492"}, + {file = "ruff-0.11.13-py3-none-win32.whl", hash = "sha256:96c27935418e4e8e77a26bb05962817f28b8ef3843a6c6cc49d8783b5507f250"}, + {file = "ruff-0.11.13-py3-none-win_amd64.whl", hash = "sha256:29c3189895a8a6a657b7af4e97d330c8a3afd2c9c8f46c81e2fc5a31866517e3"}, + {file = "ruff-0.11.13-py3-none-win_arm64.whl", hash = "sha256:b4385285e9179d608ff1d2fb9922062663c658605819a6876d8beef0c30b7f3b"}, + {file = "ruff-0.11.13.tar.gz", hash = "sha256:26fa247dc68d1d4e72c179e08889a25ac0c7ba4d78aecfc835d49cbfd60bf514"}, ] [[package]] From b68c96c3486a6675783dd567aef5d9a407ef54df Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 9 Jun 2025 08:07:44 +0000 Subject: [PATCH 02/19] chore(auto): Update pre-commit hooks (#5515) Co-authored-by: boc-the-git <3479092+boc-the-git@users.noreply.github.com> --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index f19e95a03..55db0cf56 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -12,7 +12,7 @@ repos: exclude: ^tests/data/ - repo: https://github.com/astral-sh/ruff-pre-commit # Ruff version. - rev: v0.11.12 + rev: v0.11.13 hooks: - id: ruff - id: ruff-format From 104c9b36a50d7450743e47dce9c94c93d2898b66 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 9 Jun 2025 20:02:48 +0000 Subject: [PATCH 03/19] fix(deps): update dependency openai to v1.85.0 (#5518) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- poetry.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/poetry.lock b/poetry.lock index 2398df125..d9c1992ea 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1855,14 +1855,14 @@ signedtoken = ["cryptography (>=3.0.0)", "pyjwt (>=2.0.0,<3)"] [[package]] name = "openai" -version = "1.84.0" +version = "1.85.0" description = "The official Python library for the openai API" optional = false python-versions = ">=3.8" groups = ["main"] files = [ - {file = "openai-1.84.0-py3-none-any.whl", hash = "sha256:7ec4436c3c933d68dc0f5a0cef0cb3dbc0864a54d62bddaf2ed5f3d521844711"}, - {file = "openai-1.84.0.tar.gz", hash = "sha256:4caa43bdab262cc75680ce1a2322cfc01626204074f7e8d9939ab372acf61698"}, + {file = "openai-1.85.0-py3-none-any.whl", hash = "sha256:7dc3e839cb8bb8747979a90c63ad4cb25a8e0cbec17b53eec009532c9965cecf"}, + {file = "openai-1.85.0.tar.gz", hash = "sha256:6ba76e4ebc5725f71f2f6126c7cb5169ca8de60dd5aa61f350f9448ad162c913"}, ] [package.dependencies] From 5d58c9333131a67a491cec51bd43b4472b6f676d Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 11 Jun 2025 14:12:29 +0200 Subject: [PATCH 04/19] fix(deps): update dependency openai to v1.86.0 (#5520) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- poetry.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/poetry.lock b/poetry.lock index d9c1992ea..da6285952 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1855,14 +1855,14 @@ signedtoken = ["cryptography (>=3.0.0)", "pyjwt (>=2.0.0,<3)"] [[package]] name = "openai" -version = "1.85.0" +version = "1.86.0" description = "The official Python library for the openai API" optional = false python-versions = ">=3.8" groups = ["main"] files = [ - {file = "openai-1.85.0-py3-none-any.whl", hash = "sha256:7dc3e839cb8bb8747979a90c63ad4cb25a8e0cbec17b53eec009532c9965cecf"}, - {file = "openai-1.85.0.tar.gz", hash = "sha256:6ba76e4ebc5725f71f2f6126c7cb5169ca8de60dd5aa61f350f9448ad162c913"}, + {file = "openai-1.86.0-py3-none-any.whl", hash = "sha256:c8889c39410621fe955c230cc4c21bfe36ec887f4e60a957de05f507d7e1f349"}, + {file = "openai-1.86.0.tar.gz", hash = "sha256:c64d5b788359a8fdf69bd605ae804ce41c1ce2e78b8dd93e2542e0ee267f1e4b"}, ] [package.dependencies] From cacb197aa8f7c920a50dcbb735065d0c3cf8105f Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 11 Jun 2025 12:24:06 +0000 Subject: [PATCH 05/19] fix(deps): update dependency requests to v2.32.4 [security] (#5519) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- poetry.lock | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/poetry.lock b/poetry.lock index da6285952..9722164e3 100644 --- a/poetry.lock +++ b/poetry.lock @@ -3189,19 +3189,19 @@ files = [ [[package]] name = "requests" -version = "2.32.3" +version = "2.32.4" description = "Python HTTP for Humans." optional = false python-versions = ">=3.8" groups = ["main", "dev"] files = [ - {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, - {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, + {file = "requests-2.32.4-py3-none-any.whl", hash = "sha256:27babd3cda2a6d50b30443204ee89830707d396671944c998b5975b031ac2b2c"}, + {file = "requests-2.32.4.tar.gz", hash = "sha256:27d0316682c8a29834d3264820024b62a36942083d52caf2f14c0591336d3422"}, ] [package.dependencies] certifi = ">=2017.4.17" -charset-normalizer = ">=2,<4" +charset_normalizer = ">=2,<4" idna = ">=2.5,<4" urllib3 = ">=1.21.1,<3" From b87edc823a59eb02fdd478e25ef8c77bb8d64749 Mon Sep 17 00:00:00 2001 From: Ceri Loosley <7449028+miawgogo@users.noreply.github.com> Date: Thu, 12 Jun 2025 18:34:24 +0100 Subject: [PATCH 06/19] fix: handle recipe-scraper returning a int causing clean_time to return None (#5522) --- mealie/services/scraper/cleaner.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/mealie/services/scraper/cleaner.py b/mealie/services/scraper/cleaner.py index b5acb88b7..0e1040742 100644 --- a/mealie/services/scraper/cleaner.py +++ b/mealie/services/scraper/cleaner.py @@ -2,6 +2,7 @@ import contextlib import functools import html import json +import numbers import operator import re import typing @@ -392,7 +393,7 @@ def clean_yield(yields: str | list[str] | None) -> tuple[float, float, str]: return servings_qty, yld_qty, yld_str -def clean_time(time_entry: str | timedelta | None, translator: Translator) -> None | str: +def clean_time(time_entry: str | timedelta | int | float | None, translator: Translator) -> None | str: """_summary_ Supported Structures: @@ -401,6 +402,7 @@ def clean_time(time_entry: str | timedelta | None, translator: Translator) -> No - `"PT1H30M"` - returns "1 hour 30 minutes" - `timedelta(hours=1, minutes=30)` - returns "1 hour 30 minutes" - `{"minValue": "PT1H30M"}` - returns "1 hour 30 minutes" + - `30` - as a `int` or `float` assumed to be in minutes, returns "30 minutes" Raises: TypeError: if the type is not supported a TypeError is raised @@ -412,6 +414,10 @@ def clean_time(time_entry: str | timedelta | None, translator: Translator) -> No return None match time_entry: + case numbers.Number(): + # type checked by case statement + time_delta = timedelta(minutes=time_entry) # type: ignore + return pretty_print_timedelta(time_delta, translator) case str(time_entry): if not time_entry.strip(): return None @@ -431,7 +437,9 @@ def clean_time(time_entry: str | timedelta | None, translator: Translator) -> No # TODO: Not sure what to do here return str(time_entry) case _: - logger.warning("[SCRAPER] Unexpected type or structure for variable time_entry") + logger.warning( + "[SCRAPER] Unexpected type(%s) or structure for variable time_entry: %s", type(time_entry), time_entry + ) return None From 1697d6299e009b30a3c082f2aaee322518bd5794 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 16 Jun 2025 11:57:07 -0500 Subject: [PATCH 07/19] chore(deps): update dependency mypy to v1.16.1 (#5533) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- poetry.lock | 48 +++++++++++++++--------------------------------- 1 file changed, 15 insertions(+), 33 deletions(-) diff --git a/poetry.lock b/poetry.lock index 9722164e3..0a4de2d0e 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1666,44 +1666,26 @@ files = [ [[package]] name = "mypy" -version = "1.16.0" +version = "1.16.1" description = "Optional static typing for Python" optional = false python-versions = ">=3.9" groups = ["dev"] files = [ - {file = "mypy-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7909541fef256527e5ee9c0a7e2aeed78b6cda72ba44298d1334fe7881b05c5c"}, - {file = "mypy-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e71d6f0090c2256c713ed3d52711d01859c82608b5d68d4fa01a3fe30df95571"}, - {file = "mypy-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:936ccfdd749af4766be824268bfe22d1db9eb2f34a3ea1d00ffbe5b5265f5491"}, - {file = "mypy-1.16.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4086883a73166631307fdd330c4a9080ce24913d4f4c5ec596c601b3a4bdd777"}, - {file = "mypy-1.16.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:feec38097f71797da0231997e0de3a58108c51845399669ebc532c815f93866b"}, - {file = "mypy-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:09a8da6a0ee9a9770b8ff61b39c0bb07971cda90e7297f4213741b48a0cc8d93"}, - {file = "mypy-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9f826aaa7ff8443bac6a494cf743f591488ea940dd360e7dd330e30dd772a5ab"}, - {file = "mypy-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:82d056e6faa508501af333a6af192c700b33e15865bda49611e3d7d8358ebea2"}, - {file = "mypy-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:089bedc02307c2548eb51f426e085546db1fa7dd87fbb7c9fa561575cf6eb1ff"}, - {file = "mypy-1.16.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6a2322896003ba66bbd1318c10d3afdfe24e78ef12ea10e2acd985e9d684a666"}, - {file = "mypy-1.16.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:021a68568082c5b36e977d54e8f1de978baf401a33884ffcea09bd8e88a98f4c"}, - {file = "mypy-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:54066fed302d83bf5128632d05b4ec68412e1f03ef2c300434057d66866cea4b"}, - {file = "mypy-1.16.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c5436d11e89a3ad16ce8afe752f0f373ae9620841c50883dc96f8b8805620b13"}, - {file = "mypy-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f2622af30bf01d8fc36466231bdd203d120d7a599a6d88fb22bdcb9dbff84090"}, - {file = "mypy-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d045d33c284e10a038f5e29faca055b90eee87da3fc63b8889085744ebabb5a1"}, - {file = "mypy-1.16.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b4968f14f44c62e2ec4a038c8797a87315be8df7740dc3ee8d3bfe1c6bf5dba8"}, - {file = "mypy-1.16.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:eb14a4a871bb8efb1e4a50360d4e3c8d6c601e7a31028a2c79f9bb659b63d730"}, - {file = "mypy-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:bd4e1ebe126152a7bbaa4daedd781c90c8f9643c79b9748caa270ad542f12bec"}, - {file = "mypy-1.16.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a9e056237c89f1587a3be1a3a70a06a698d25e2479b9a2f57325ddaaffc3567b"}, - {file = "mypy-1.16.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0b07e107affb9ee6ce1f342c07f51552d126c32cd62955f59a7db94a51ad12c0"}, - {file = "mypy-1.16.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c6fb60cbd85dc65d4d63d37cb5c86f4e3a301ec605f606ae3a9173e5cf34997b"}, - {file = "mypy-1.16.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a7e32297a437cc915599e0578fa6bc68ae6a8dc059c9e009c628e1c47f91495d"}, - {file = "mypy-1.16.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:afe420c9380ccec31e744e8baff0d406c846683681025db3531b32db56962d52"}, - {file = "mypy-1.16.0-cp313-cp313-win_amd64.whl", hash = "sha256:55f9076c6ce55dd3f8cd0c6fff26a008ca8e5131b89d5ba6d86bd3f47e736eeb"}, - {file = "mypy-1.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f56236114c425620875c7cf71700e3d60004858da856c6fc78998ffe767b73d3"}, - {file = "mypy-1.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:15486beea80be24ff067d7d0ede673b001d0d684d0095803b3e6e17a886a2a92"}, - {file = "mypy-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f2ed0e0847a80655afa2c121835b848ed101cc7b8d8d6ecc5205aedc732b1436"}, - {file = "mypy-1.16.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:eb5fbc8063cb4fde7787e4c0406aa63094a34a2daf4673f359a1fb64050e9cb2"}, - {file = "mypy-1.16.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:a5fcfdb7318c6a8dd127b14b1052743b83e97a970f0edb6c913211507a255e20"}, - {file = "mypy-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:2e7e0ad35275e02797323a5aa1be0b14a4d03ffdb2e5f2b0489fa07b89c67b21"}, - {file = "mypy-1.16.0-py3-none-any.whl", hash = "sha256:29e1499864a3888bca5c1542f2d7232c6e586295183320caa95758fc84034031"}, - {file = "mypy-1.16.0.tar.gz", hash = "sha256:84b94283f817e2aa6350a14b4a8fb2a35a53c286f97c9d30f53b63620e7af8ab"}, + {file = "mypy-1.16.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:86042bbf9f5a05ea000d3203cf87aa9d0ccf9a01f73f71c58979eb9249f46d72"}, + {file = "mypy-1.16.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ea7469ee5902c95542bea7ee545f7006508c65c8c54b06dc2c92676ce526f3ea"}, + {file = "mypy-1.16.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ff9fa5b16e4c1364eb89a4d16bcda9987f05d39604e1e6c35378a2987c1aac2d"}, + {file = "mypy-1.16.1-cp310-cp310-win_amd64.whl", hash = "sha256:1256688e284632382f8f3b9e2123df7d279f603c561f099758e66dd6ed4e8bd6"}, + {file = "mypy-1.16.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:472e4e4c100062488ec643f6162dd0d5208e33e2f34544e1fc931372e806c0cc"}, + {file = "mypy-1.16.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:22d76a63a42619bfb90122889b903519149879ddbf2ba4251834727944c8baca"}, + {file = "mypy-1.16.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:2c7ce0662b6b9dc8f4ed86eb7a5d505ee3298c04b40ec13b30e572c0e5ae17c4"}, + {file = "mypy-1.16.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0ab5eca37b50188163fa7c1b73c685ac66c4e9bdee4a85c9adac0e91d8895e15"}, + {file = "mypy-1.16.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:dedb6229b2c9086247e21a83c309754b9058b438704ad2f6807f0d8227f6ebdd"}, + {file = "mypy-1.16.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0a7cfb0fe29fe5a9841b7c8ee6dffb52382c45acdf68f032145b75620acfbd6f"}, + {file = "mypy-1.16.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:d5d2309511cc56c021b4b4e462907c2b12f669b2dbeb68300110ec27723971be"}, + {file = "mypy-1.16.1-cp313-cp313-win_amd64.whl", hash = "sha256:4f58ac32771341e38a853c5d0ec0dfe27e18e27da9cdb8bbc882d2249c71a3ee"}, + {file = "mypy-1.16.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:13c7cd5b1cb2909aa318a90fd1b7e31f17c50b242953e7dd58345b2a814f6383"}, + {file = "mypy-1.16.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:58e07fb958bc5d752a280da0e890c538f1515b79a65757bbdc54252ba82e0b40"}, ] [package.dependencies] From 038fbd38ef5c28f4ac3bd857bd4d0a1a8e158337 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 16 Jun 2025 17:08:11 +0000 Subject: [PATCH 08/19] fix(deps): update dependency pydantic to v2.11.7 (#5527) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- poetry.lock | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/poetry.lock b/poetry.lock index 0a4de2d0e..3ec822447 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1672,20 +1672,38 @@ optional = false python-versions = ">=3.9" groups = ["dev"] files = [ + {file = "mypy-1.16.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b4f0fed1022a63c6fec38f28b7fc77fca47fd490445c69d0a66266c59dd0b88a"}, {file = "mypy-1.16.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:86042bbf9f5a05ea000d3203cf87aa9d0ccf9a01f73f71c58979eb9249f46d72"}, {file = "mypy-1.16.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ea7469ee5902c95542bea7ee545f7006508c65c8c54b06dc2c92676ce526f3ea"}, + {file = "mypy-1.16.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:352025753ef6a83cb9e7f2427319bb7875d1fdda8439d1e23de12ab164179574"}, {file = "mypy-1.16.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ff9fa5b16e4c1364eb89a4d16bcda9987f05d39604e1e6c35378a2987c1aac2d"}, {file = "mypy-1.16.1-cp310-cp310-win_amd64.whl", hash = "sha256:1256688e284632382f8f3b9e2123df7d279f603c561f099758e66dd6ed4e8bd6"}, {file = "mypy-1.16.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:472e4e4c100062488ec643f6162dd0d5208e33e2f34544e1fc931372e806c0cc"}, + {file = "mypy-1.16.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ea16e2a7d2714277e349e24d19a782a663a34ed60864006e8585db08f8ad1782"}, + {file = "mypy-1.16.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:08e850ea22adc4d8a4014651575567b0318ede51e8e9fe7a68f25391af699507"}, {file = "mypy-1.16.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:22d76a63a42619bfb90122889b903519149879ddbf2ba4251834727944c8baca"}, {file = "mypy-1.16.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:2c7ce0662b6b9dc8f4ed86eb7a5d505ee3298c04b40ec13b30e572c0e5ae17c4"}, + {file = "mypy-1.16.1-cp311-cp311-win_amd64.whl", hash = "sha256:211287e98e05352a2e1d4e8759c5490925a7c784ddc84207f4714822f8cf99b6"}, + {file = "mypy-1.16.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:af4792433f09575d9eeca5c63d7d90ca4aeceda9d8355e136f80f8967639183d"}, + {file = "mypy-1.16.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:66df38405fd8466ce3517eda1f6640611a0b8e70895e2a9462d1d4323c5eb4b9"}, + {file = "mypy-1.16.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:44e7acddb3c48bd2713994d098729494117803616e116032af192871aed80b79"}, {file = "mypy-1.16.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0ab5eca37b50188163fa7c1b73c685ac66c4e9bdee4a85c9adac0e91d8895e15"}, {file = "mypy-1.16.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:dedb6229b2c9086247e21a83c309754b9058b438704ad2f6807f0d8227f6ebdd"}, + {file = "mypy-1.16.1-cp312-cp312-win_amd64.whl", hash = "sha256:1f0435cf920e287ff68af3d10a118a73f212deb2ce087619eb4e648116d1fe9b"}, + {file = "mypy-1.16.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ddc91eb318c8751c69ddb200a5937f1232ee8efb4e64e9f4bc475a33719de438"}, + {file = "mypy-1.16.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:87ff2c13d58bdc4bbe7dc0dedfe622c0f04e2cb2a492269f3b418df2de05c536"}, {file = "mypy-1.16.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0a7cfb0fe29fe5a9841b7c8ee6dffb52382c45acdf68f032145b75620acfbd6f"}, + {file = "mypy-1.16.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:051e1677689c9d9578b9c7f4d206d763f9bbd95723cd1416fad50db49d52f359"}, {file = "mypy-1.16.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:d5d2309511cc56c021b4b4e462907c2b12f669b2dbeb68300110ec27723971be"}, {file = "mypy-1.16.1-cp313-cp313-win_amd64.whl", hash = "sha256:4f58ac32771341e38a853c5d0ec0dfe27e18e27da9cdb8bbc882d2249c71a3ee"}, + {file = "mypy-1.16.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7fc688329af6a287567f45cc1cefb9db662defeb14625213a5b7da6e692e2069"}, + {file = "mypy-1.16.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5e198ab3f55924c03ead626ff424cad1732d0d391478dfbf7bb97b34602395da"}, + {file = "mypy-1.16.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:09aa4f91ada245f0a45dbc47e548fd94e0dd5a8433e0114917dc3b526912a30c"}, {file = "mypy-1.16.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:13c7cd5b1cb2909aa318a90fd1b7e31f17c50b242953e7dd58345b2a814f6383"}, {file = "mypy-1.16.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:58e07fb958bc5d752a280da0e890c538f1515b79a65757bbdc54252ba82e0b40"}, + {file = "mypy-1.16.1-cp39-cp39-win_amd64.whl", hash = "sha256:f895078594d918f93337a505f8add9bd654d1a24962b4c6ed9390e12531eb31b"}, + {file = "mypy-1.16.1-py3-none-any.whl", hash = "sha256:5fc2ac4027d0ef28d6ba69a0343737a23c4d1b83672bf38d1fe237bdc0643b37"}, + {file = "mypy-1.16.1.tar.gz", hash = "sha256:6bd00a0a2094841c5e47e7374bb42b83d64c527a502e3334e1173a0c24437bab"}, ] [package.dependencies] @@ -2359,14 +2377,14 @@ files = [ [[package]] name = "pydantic" -version = "2.11.5" +version = "2.11.7" description = "Data validation using Python type hints" optional = false python-versions = ">=3.9" groups = ["main", "dev"] files = [ - {file = "pydantic-2.11.5-py3-none-any.whl", hash = "sha256:f9c26ba06f9747749ca1e5c94d6a85cb84254577553c8785576fd38fa64dc0f7"}, - {file = "pydantic-2.11.5.tar.gz", hash = "sha256:7f853db3d0ce78ce8bbb148c401c2cdd6431b3473c0cdff2755c7690952a7b7a"}, + {file = "pydantic-2.11.7-py3-none-any.whl", hash = "sha256:dde5df002701f6de26248661f6835bbe296a47bf73990135c7d07ce741b9623b"}, + {file = "pydantic-2.11.7.tar.gz", hash = "sha256:d989c3c6cb79469287b1569f7447a17848c998458d49ebe294e975b9baf0f0db"}, ] [package.dependencies] From 69488bd6dfcc24f9bd2bd4aa9754e27230affb50 Mon Sep 17 00:00:00 2001 From: Sravan Kumar Date: Tue, 17 Jun 2025 07:05:17 -0700 Subject: [PATCH 09/19] fix: Fixing the OpenAPI Spec and the Call to delete a shared recipe. (#5537) --- mealie/routes/shared/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mealie/routes/shared/__init__.py b/mealie/routes/shared/__init__.py index 61bb31efd..99ee1a083 100644 --- a/mealie/routes/shared/__init__.py +++ b/mealie/routes/shared/__init__.py @@ -46,5 +46,5 @@ class RecipeSharedController(BaseUserController): return self.mixins.get_one(item_id) @router.delete("/{item_id}") - def delete_one(self, item_id: UUID4 | None = None) -> None: + def delete_one(self, item_id: UUID4) -> None: return self.mixins.delete_one(item_id) From 384bb7480fb2823ddefb4292c165072844923c39 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 17 Jun 2025 10:46:27 -0500 Subject: [PATCH 10/19] fix(deps): update dependency fastapi to v0.115.13 (#5538) --- poetry.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/poetry.lock b/poetry.lock index 3ec822447..502746399 100644 --- a/poetry.lock +++ b/poetry.lock @@ -684,14 +684,14 @@ cli = ["requests"] [[package]] name = "fastapi" -version = "0.115.12" +version = "0.115.13" description = "FastAPI framework, high performance, easy to learn, fast to code, ready for production" optional = false python-versions = ">=3.8" groups = ["main"] files = [ - {file = "fastapi-0.115.12-py3-none-any.whl", hash = "sha256:e94613d6c05e27be7ffebdd6ea5f388112e5e430c8f7d6494a9d1d88d43e814d"}, - {file = "fastapi-0.115.12.tar.gz", hash = "sha256:1e2c2a2646905f9e83d32f04a3f86aff4a286669c6c950ca95b5fd68c2602681"}, + {file = "fastapi-0.115.13-py3-none-any.whl", hash = "sha256:0a0cab59afa7bab22f5eb347f8c9864b681558c278395e94035a741fc10cd865"}, + {file = "fastapi-0.115.13.tar.gz", hash = "sha256:55d1d25c2e1e0a0a50aceb1c8705cd932def273c102bff0b1c1da88b3c6eb307"}, ] [package.dependencies] From 4a9095fcbb4b3e840717cfd3dd9f205eebf531c4 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 17 Jun 2025 13:11:55 -0500 Subject: [PATCH 11/19] chore(deps): update dependency coverage to v7.9.1 (#5523) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- poetry.lock | 136 ++++++++++++++++++++++++++-------------------------- 1 file changed, 68 insertions(+), 68 deletions(-) diff --git a/poetry.lock b/poetry.lock index 502746399..83f29d0d6 100644 --- a/poetry.lock +++ b/poetry.lock @@ -478,79 +478,79 @@ markers = {main = "platform_system == \"Windows\" or sys_platform == \"win32\""} [[package]] name = "coverage" -version = "7.8.2" +version = "7.9.1" description = "Code coverage measurement for Python" optional = false python-versions = ">=3.9" groups = ["dev"] files = [ - {file = "coverage-7.8.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bd8ec21e1443fd7a447881332f7ce9d35b8fbd2849e761bb290b584535636b0a"}, - {file = "coverage-7.8.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4c26c2396674816deaeae7ded0e2b42c26537280f8fe313335858ffff35019be"}, - {file = "coverage-7.8.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1aec326ed237e5880bfe69ad41616d333712c7937bcefc1343145e972938f9b3"}, - {file = "coverage-7.8.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5e818796f71702d7a13e50c70de2a1924f729228580bcba1607cccf32eea46e6"}, - {file = "coverage-7.8.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:546e537d9e24efc765c9c891328f30f826e3e4808e31f5d0f87c4ba12bbd1622"}, - {file = "coverage-7.8.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ab9b09a2349f58e73f8ebc06fac546dd623e23b063e5398343c5270072e3201c"}, - {file = "coverage-7.8.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:fd51355ab8a372d89fb0e6a31719e825cf8df8b6724bee942fb5b92c3f016ba3"}, - {file = "coverage-7.8.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:0774df1e093acb6c9e4d58bce7f86656aeed6c132a16e2337692c12786b32404"}, - {file = "coverage-7.8.2-cp310-cp310-win32.whl", hash = "sha256:00f2e2f2e37f47e5f54423aeefd6c32a7dbcedc033fcd3928a4f4948e8b96af7"}, - {file = "coverage-7.8.2-cp310-cp310-win_amd64.whl", hash = "sha256:145b07bea229821d51811bf15eeab346c236d523838eda395ea969d120d13347"}, - {file = "coverage-7.8.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b99058eef42e6a8dcd135afb068b3d53aff3921ce699e127602efff9956457a9"}, - {file = "coverage-7.8.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5feb7f2c3e6ea94d3b877def0270dff0947b8d8c04cfa34a17be0a4dc1836879"}, - {file = "coverage-7.8.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:670a13249b957bb9050fab12d86acef7bf8f6a879b9d1a883799276e0d4c674a"}, - {file = "coverage-7.8.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0bdc8bf760459a4a4187b452213e04d039990211f98644c7292adf1e471162b5"}, - {file = "coverage-7.8.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:07a989c867986c2a75f158f03fdb413128aad29aca9d4dbce5fc755672d96f11"}, - {file = "coverage-7.8.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2db10dedeb619a771ef0e2949ccba7b75e33905de959c2643a4607bef2f3fb3a"}, - {file = "coverage-7.8.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e6ea7dba4e92926b7b5f0990634b78ea02f208d04af520c73a7c876d5a8d36cb"}, - {file = "coverage-7.8.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ef2f22795a7aca99fc3c84393a55a53dd18ab8c93fb431004e4d8f0774150f54"}, - {file = "coverage-7.8.2-cp311-cp311-win32.whl", hash = "sha256:641988828bc18a6368fe72355df5f1703e44411adbe49bba5644b941ce6f2e3a"}, - {file = "coverage-7.8.2-cp311-cp311-win_amd64.whl", hash = "sha256:8ab4a51cb39dc1933ba627e0875046d150e88478dbe22ce145a68393e9652975"}, - {file = "coverage-7.8.2-cp311-cp311-win_arm64.whl", hash = "sha256:8966a821e2083c74d88cca5b7dcccc0a3a888a596a04c0b9668a891de3a0cc53"}, - {file = "coverage-7.8.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:e2f6fe3654468d061942591aef56686131335b7a8325684eda85dacdf311356c"}, - {file = "coverage-7.8.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:76090fab50610798cc05241bf83b603477c40ee87acd358b66196ab0ca44ffa1"}, - {file = "coverage-7.8.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2bd0a0a5054be160777a7920b731a0570284db5142abaaf81bcbb282b8d99279"}, - {file = "coverage-7.8.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:da23ce9a3d356d0affe9c7036030b5c8f14556bd970c9b224f9c8205505e3b99"}, - {file = "coverage-7.8.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9392773cffeb8d7e042a7b15b82a414011e9d2b5fdbbd3f7e6a6b17d5e21b20"}, - {file = "coverage-7.8.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:876cbfd0b09ce09d81585d266c07a32657beb3eaec896f39484b631555be0fe2"}, - {file = "coverage-7.8.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3da9b771c98977a13fbc3830f6caa85cae6c9c83911d24cb2d218e9394259c57"}, - {file = "coverage-7.8.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:9a990f6510b3292686713bfef26d0049cd63b9c7bb17e0864f133cbfd2e6167f"}, - {file = "coverage-7.8.2-cp312-cp312-win32.whl", hash = "sha256:bf8111cddd0f2b54d34e96613e7fbdd59a673f0cf5574b61134ae75b6f5a33b8"}, - {file = "coverage-7.8.2-cp312-cp312-win_amd64.whl", hash = "sha256:86a323a275e9e44cdf228af9b71c5030861d4d2610886ab920d9945672a81223"}, - {file = "coverage-7.8.2-cp312-cp312-win_arm64.whl", hash = "sha256:820157de3a589e992689ffcda8639fbabb313b323d26388d02e154164c57b07f"}, - {file = "coverage-7.8.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ea561010914ec1c26ab4188aef8b1567272ef6de096312716f90e5baa79ef8ca"}, - {file = "coverage-7.8.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:cb86337a4fcdd0e598ff2caeb513ac604d2f3da6d53df2c8e368e07ee38e277d"}, - {file = "coverage-7.8.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26a4636ddb666971345541b59899e969f3b301143dd86b0ddbb570bd591f1e85"}, - {file = "coverage-7.8.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5040536cf9b13fb033f76bcb5e1e5cb3b57c4807fef37db9e0ed129c6a094257"}, - {file = "coverage-7.8.2-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dc67994df9bcd7e0150a47ef41278b9e0a0ea187caba72414b71dc590b99a108"}, - {file = "coverage-7.8.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6e6c86888fd076d9e0fe848af0a2142bf606044dc5ceee0aa9eddb56e26895a0"}, - {file = "coverage-7.8.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:684ca9f58119b8e26bef860db33524ae0365601492e86ba0b71d513f525e7050"}, - {file = "coverage-7.8.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8165584ddedb49204c4e18da083913bdf6a982bfb558632a79bdaadcdafd0d48"}, - {file = "coverage-7.8.2-cp313-cp313-win32.whl", hash = "sha256:34759ee2c65362163699cc917bdb2a54114dd06d19bab860725f94ef45a3d9b7"}, - {file = "coverage-7.8.2-cp313-cp313-win_amd64.whl", hash = "sha256:2f9bc608fbafaee40eb60a9a53dbfb90f53cc66d3d32c2849dc27cf5638a21e3"}, - {file = "coverage-7.8.2-cp313-cp313-win_arm64.whl", hash = "sha256:9fe449ee461a3b0c7105690419d0b0aba1232f4ff6d120a9e241e58a556733f7"}, - {file = "coverage-7.8.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:8369a7c8ef66bded2b6484053749ff220dbf83cba84f3398c84c51a6f748a008"}, - {file = "coverage-7.8.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:159b81df53a5fcbc7d45dae3adad554fdbde9829a994e15227b3f9d816d00b36"}, - {file = "coverage-7.8.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e6fcbbd35a96192d042c691c9e0c49ef54bd7ed865846a3c9d624c30bb67ce46"}, - {file = "coverage-7.8.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:05364b9cc82f138cc86128dc4e2e1251c2981a2218bfcd556fe6b0fbaa3501be"}, - {file = "coverage-7.8.2-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:46d532db4e5ff3979ce47d18e2fe8ecad283eeb7367726da0e5ef88e4fe64740"}, - {file = "coverage-7.8.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4000a31c34932e7e4fa0381a3d6deb43dc0c8f458e3e7ea6502e6238e10be625"}, - {file = "coverage-7.8.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:43ff5033d657cd51f83015c3b7a443287250dc14e69910577c3e03bd2e06f27b"}, - {file = "coverage-7.8.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:94316e13f0981cbbba132c1f9f365cac1d26716aaac130866ca812006f662199"}, - {file = "coverage-7.8.2-cp313-cp313t-win32.whl", hash = "sha256:3f5673888d3676d0a745c3d0e16da338c5eea300cb1f4ada9c872981265e76d8"}, - {file = "coverage-7.8.2-cp313-cp313t-win_amd64.whl", hash = "sha256:2c08b05ee8d7861e45dc5a2cc4195c8c66dca5ac613144eb6ebeaff2d502e73d"}, - {file = "coverage-7.8.2-cp313-cp313t-win_arm64.whl", hash = "sha256:1e1448bb72b387755e1ff3ef1268a06617afd94188164960dba8d0245a46004b"}, - {file = "coverage-7.8.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:496948261eaac5ac9cf43f5d0a9f6eb7a6d4cb3bedb2c5d294138142f5c18f2a"}, - {file = "coverage-7.8.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:eacd2de0d30871eff893bab0b67840a96445edcb3c8fd915e6b11ac4b2f3fa6d"}, - {file = "coverage-7.8.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b039ffddc99ad65d5078ef300e0c7eed08c270dc26570440e3ef18beb816c1ca"}, - {file = "coverage-7.8.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0e49824808d4375ede9dd84e9961a59c47f9113039f1a525e6be170aa4f5c34d"}, - {file = "coverage-7.8.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b069938961dfad881dc2f8d02b47645cd2f455d3809ba92a8a687bf513839787"}, - {file = "coverage-7.8.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:de77c3ba8bb686d1c411e78ee1b97e6e0b963fb98b1637658dd9ad2c875cf9d7"}, - {file = "coverage-7.8.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:1676628065a498943bd3f64f099bb573e08cf1bc6088bbe33cf4424e0876f4b3"}, - {file = "coverage-7.8.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:8e1a26e7e50076e35f7afafde570ca2b4d7900a491174ca357d29dece5aacee7"}, - {file = "coverage-7.8.2-cp39-cp39-win32.whl", hash = "sha256:6782a12bf76fa61ad9350d5a6ef5f3f020b57f5e6305cbc663803f2ebd0f270a"}, - {file = "coverage-7.8.2-cp39-cp39-win_amd64.whl", hash = "sha256:1efa4166ba75ccefd647f2d78b64f53f14fb82622bc94c5a5cb0a622f50f1c9e"}, - {file = "coverage-7.8.2-pp39.pp310.pp311-none-any.whl", hash = "sha256:ec455eedf3ba0bbdf8f5a570012617eb305c63cb9f03428d39bf544cb2b94837"}, - {file = "coverage-7.8.2-py3-none-any.whl", hash = "sha256:726f32ee3713f7359696331a18daf0c3b3a70bb0ae71141b9d3c52be7c595e32"}, - {file = "coverage-7.8.2.tar.gz", hash = "sha256:a886d531373a1f6ff9fad2a2ba4a045b68467b779ae729ee0b3b10ac20033b27"}, + {file = "coverage-7.9.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:cc94d7c5e8423920787c33d811c0be67b7be83c705f001f7180c7b186dcf10ca"}, + {file = "coverage-7.9.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:16aa0830d0c08a2c40c264cef801db8bc4fc0e1892782e45bcacbd5889270509"}, + {file = "coverage-7.9.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf95981b126f23db63e9dbe4cf65bd71f9a6305696fa5e2262693bc4e2183f5b"}, + {file = "coverage-7.9.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f05031cf21699785cd47cb7485f67df619e7bcdae38e0fde40d23d3d0210d3c3"}, + {file = "coverage-7.9.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb4fbcab8764dc072cb651a4bcda4d11fb5658a1d8d68842a862a6610bd8cfa3"}, + {file = "coverage-7.9.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:0f16649a7330ec307942ed27d06ee7e7a38417144620bb3d6e9a18ded8a2d3e5"}, + {file = "coverage-7.9.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:cea0a27a89e6432705fffc178064503508e3c0184b4f061700e771a09de58187"}, + {file = "coverage-7.9.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e980b53a959fa53b6f05343afbd1e6f44a23ed6c23c4b4c56c6662bbb40c82ce"}, + {file = "coverage-7.9.1-cp310-cp310-win32.whl", hash = "sha256:70760b4c5560be6ca70d11f8988ee6542b003f982b32f83d5ac0b72476607b70"}, + {file = "coverage-7.9.1-cp310-cp310-win_amd64.whl", hash = "sha256:a66e8f628b71f78c0e0342003d53b53101ba4e00ea8dabb799d9dba0abbbcebe"}, + {file = "coverage-7.9.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:95c765060e65c692da2d2f51a9499c5e9f5cf5453aeaf1420e3fc847cc060582"}, + {file = "coverage-7.9.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ba383dc6afd5ec5b7a0d0c23d38895db0e15bcba7fb0fa8901f245267ac30d86"}, + {file = "coverage-7.9.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:37ae0383f13cbdcf1e5e7014489b0d71cc0106458878ccde52e8a12ced4298ed"}, + {file = "coverage-7.9.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:69aa417a030bf11ec46149636314c24c8d60fadb12fc0ee8f10fda0d918c879d"}, + {file = "coverage-7.9.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0a4be2a28656afe279b34d4f91c3e26eccf2f85500d4a4ff0b1f8b54bf807338"}, + {file = "coverage-7.9.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:382e7ddd5289f140259b610e5f5c58f713d025cb2f66d0eb17e68d0a94278875"}, + {file = "coverage-7.9.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e5532482344186c543c37bfad0ee6069e8ae4fc38d073b8bc836fc8f03c9e250"}, + {file = "coverage-7.9.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a39d18b3f50cc121d0ce3838d32d58bd1d15dab89c910358ebefc3665712256c"}, + {file = "coverage-7.9.1-cp311-cp311-win32.whl", hash = "sha256:dd24bd8d77c98557880def750782df77ab2b6885a18483dc8588792247174b32"}, + {file = "coverage-7.9.1-cp311-cp311-win_amd64.whl", hash = "sha256:6b55ad10a35a21b8015eabddc9ba31eb590f54adc9cd39bcf09ff5349fd52125"}, + {file = "coverage-7.9.1-cp311-cp311-win_arm64.whl", hash = "sha256:6ad935f0016be24c0e97fc8c40c465f9c4b85cbbe6eac48934c0dc4d2568321e"}, + {file = "coverage-7.9.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a8de12b4b87c20de895f10567639c0797b621b22897b0af3ce4b4e204a743626"}, + {file = "coverage-7.9.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5add197315a054e92cee1b5f686a2bcba60c4c3e66ee3de77ace6c867bdee7cb"}, + {file = "coverage-7.9.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:600a1d4106fe66f41e5d0136dfbc68fe7200a5cbe85610ddf094f8f22e1b0300"}, + {file = "coverage-7.9.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2a876e4c3e5a2a1715a6608906aa5a2e0475b9c0f68343c2ada98110512ab1d8"}, + {file = "coverage-7.9.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:81f34346dd63010453922c8e628a52ea2d2ccd73cb2487f7700ac531b247c8a5"}, + {file = "coverage-7.9.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:888f8eee13f2377ce86d44f338968eedec3291876b0b8a7289247ba52cb984cd"}, + {file = "coverage-7.9.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:9969ef1e69b8c8e1e70d591f91bbc37fc9a3621e447525d1602801a24ceda898"}, + {file = "coverage-7.9.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:60c458224331ee3f1a5b472773e4a085cc27a86a0b48205409d364272d67140d"}, + {file = "coverage-7.9.1-cp312-cp312-win32.whl", hash = "sha256:5f646a99a8c2b3ff4c6a6e081f78fad0dde275cd59f8f49dc4eab2e394332e74"}, + {file = "coverage-7.9.1-cp312-cp312-win_amd64.whl", hash = "sha256:30f445f85c353090b83e552dcbbdad3ec84c7967e108c3ae54556ca69955563e"}, + {file = "coverage-7.9.1-cp312-cp312-win_arm64.whl", hash = "sha256:af41da5dca398d3474129c58cb2b106a5d93bbb196be0d307ac82311ca234342"}, + {file = "coverage-7.9.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:31324f18d5969feef7344a932c32428a2d1a3e50b15a6404e97cba1cc9b2c631"}, + {file = "coverage-7.9.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0c804506d624e8a20fb3108764c52e0eef664e29d21692afa375e0dd98dc384f"}, + {file = "coverage-7.9.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ef64c27bc40189f36fcc50c3fb8f16ccda73b6a0b80d9bd6e6ce4cffcd810bbd"}, + {file = "coverage-7.9.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d4fe2348cc6ec372e25adec0219ee2334a68d2f5222e0cba9c0d613394e12d86"}, + {file = "coverage-7.9.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:34ed2186fe52fcc24d4561041979a0dec69adae7bce2ae8d1c49eace13e55c43"}, + {file = "coverage-7.9.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:25308bd3d00d5eedd5ae7d4357161f4df743e3c0240fa773ee1b0f75e6c7c0f1"}, + {file = "coverage-7.9.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:73e9439310f65d55a5a1e0564b48e34f5369bee943d72c88378f2d576f5a5751"}, + {file = "coverage-7.9.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:37ab6be0859141b53aa89412a82454b482c81cf750de4f29223d52268a86de67"}, + {file = "coverage-7.9.1-cp313-cp313-win32.whl", hash = "sha256:64bdd969456e2d02a8b08aa047a92d269c7ac1f47e0c977675d550c9a0863643"}, + {file = "coverage-7.9.1-cp313-cp313-win_amd64.whl", hash = "sha256:be9e3f68ca9edb897c2184ad0eee815c635565dbe7a0e7e814dc1f7cbab92c0a"}, + {file = "coverage-7.9.1-cp313-cp313-win_arm64.whl", hash = "sha256:1c503289ffef1d5105d91bbb4d62cbe4b14bec4d13ca225f9c73cde9bb46207d"}, + {file = "coverage-7.9.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0b3496922cb5f4215bf5caaef4cf12364a26b0be82e9ed6d050f3352cf2d7ef0"}, + {file = "coverage-7.9.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:9565c3ab1c93310569ec0d86b017f128f027cab0b622b7af288696d7ed43a16d"}, + {file = "coverage-7.9.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2241ad5dbf79ae1d9c08fe52b36d03ca122fb9ac6bca0f34439e99f8327ac89f"}, + {file = "coverage-7.9.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3bb5838701ca68b10ebc0937dbd0eb81974bac54447c55cd58dea5bca8451029"}, + {file = "coverage-7.9.1-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b30a25f814591a8c0c5372c11ac8967f669b97444c47fd794926e175c4047ece"}, + {file = "coverage-7.9.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:2d04b16a6062516df97969f1ae7efd0de9c31eb6ebdceaa0d213b21c0ca1a683"}, + {file = "coverage-7.9.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:7931b9e249edefb07cd6ae10c702788546341d5fe44db5b6108a25da4dca513f"}, + {file = "coverage-7.9.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:52e92b01041151bf607ee858e5a56c62d4b70f4dac85b8c8cb7fb8a351ab2c10"}, + {file = "coverage-7.9.1-cp313-cp313t-win32.whl", hash = "sha256:684e2110ed84fd1ca5f40e89aa44adf1729dc85444004111aa01866507adf363"}, + {file = "coverage-7.9.1-cp313-cp313t-win_amd64.whl", hash = "sha256:437c576979e4db840539674e68c84b3cda82bc824dd138d56bead1435f1cb5d7"}, + {file = "coverage-7.9.1-cp313-cp313t-win_arm64.whl", hash = "sha256:18a0912944d70aaf5f399e350445738a1a20b50fbea788f640751c2ed9208b6c"}, + {file = "coverage-7.9.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6f424507f57878e424d9a95dc4ead3fbdd72fd201e404e861e465f28ea469951"}, + {file = "coverage-7.9.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:535fde4001b2783ac80865d90e7cc7798b6b126f4cd8a8c54acfe76804e54e58"}, + {file = "coverage-7.9.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:02532fd3290bb8fa6bec876520842428e2a6ed6c27014eca81b031c2d30e3f71"}, + {file = "coverage-7.9.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:56f5eb308b17bca3bbff810f55ee26d51926d9f89ba92707ee41d3c061257e55"}, + {file = "coverage-7.9.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfa447506c1a52271f1b0de3f42ea0fa14676052549095e378d5bff1c505ff7b"}, + {file = "coverage-7.9.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:9ca8e220006966b4a7b68e8984a6aee645a0384b0769e829ba60281fe61ec4f7"}, + {file = "coverage-7.9.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:49f1d0788ba5b7ba65933f3a18864117c6506619f5ca80326b478f72acf3f385"}, + {file = "coverage-7.9.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:68cd53aec6f45b8e4724c0950ce86eacb775c6be01ce6e3669fe4f3a21e768ed"}, + {file = "coverage-7.9.1-cp39-cp39-win32.whl", hash = "sha256:95335095b6c7b1cc14c3f3f17d5452ce677e8490d101698562b2ffcacc304c8d"}, + {file = "coverage-7.9.1-cp39-cp39-win_amd64.whl", hash = "sha256:e1b5191d1648acc439b24721caab2fd0c86679d8549ed2c84d5a7ec1bedcc244"}, + {file = "coverage-7.9.1-pp39.pp310.pp311-none-any.whl", hash = "sha256:db0f04118d1db74db6c9e1cb1898532c7dcc220f1d2718f058601f7c3f499514"}, + {file = "coverage-7.9.1-py3-none-any.whl", hash = "sha256:66b974b145aa189516b6bf2d8423e888b742517d37872f6ee4c5be0073bd9a3c"}, + {file = "coverage-7.9.1.tar.gz", hash = "sha256:6cf43c78c4282708a28e466316935ec7489a9c487518a77fa68f716c67909cec"}, ] [package.extras] From 079cfe7fe04cf845a3584a8324d6cbfe81e44fe4 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 17 Jun 2025 13:29:19 -0500 Subject: [PATCH 12/19] fix(deps): update dependency openai to v1.88.0 (#5536) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- poetry.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/poetry.lock b/poetry.lock index 83f29d0d6..6e039179b 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1855,14 +1855,14 @@ signedtoken = ["cryptography (>=3.0.0)", "pyjwt (>=2.0.0,<3)"] [[package]] name = "openai" -version = "1.86.0" +version = "1.88.0" description = "The official Python library for the openai API" optional = false python-versions = ">=3.8" groups = ["main"] files = [ - {file = "openai-1.86.0-py3-none-any.whl", hash = "sha256:c8889c39410621fe955c230cc4c21bfe36ec887f4e60a957de05f507d7e1f349"}, - {file = "openai-1.86.0.tar.gz", hash = "sha256:c64d5b788359a8fdf69bd605ae804ce41c1ce2e78b8dd93e2542e0ee267f1e4b"}, + {file = "openai-1.88.0-py3-none-any.whl", hash = "sha256:7edd7826b3b83f5846562a6f310f040c79576278bf8e3687b30ba05bb5dff978"}, + {file = "openai-1.88.0.tar.gz", hash = "sha256:122d35e42998255cf1fc84560f6ee49a844e65c054cd05d3e42fda506b832bb1"}, ] [package.dependencies] From ac984a2d049f6792c98aa2d85035fad0d9d76a30 Mon Sep 17 00:00:00 2001 From: Craig Matear Date: Tue, 17 Jun 2025 19:41:35 +0100 Subject: [PATCH 13/19] fix: #5511, list item state doesn't change when offline (#5512) Co-authored-by: Michael Genson <71845777+michael-genson@users.noreply.github.com> --- .../use-shopping-list-item-actions.ts | 26 +++++++++++++++++-- frontend/package.json | 2 +- frontend/pages/shopping-lists/_id.vue | 5 ++-- 3 files changed, 27 insertions(+), 6 deletions(-) diff --git a/frontend/composables/use-shopping-list-item-actions.ts b/frontend/composables/use-shopping-list-item-actions.ts index ec6491499..ccc683fe7 100644 --- a/frontend/composables/use-shopping-list-item-actions.ts +++ b/frontend/composables/use-shopping-list-item-actions.ts @@ -89,9 +89,31 @@ export function useShoppingListItemActions(shoppingListId: string) { return true; } + function mergeListItemsByLatest( + list1: ShoppingListItemOut[], + list2: ShoppingListItemOut[] + ) { + const mergedList = [...list1]; + list2.forEach((list2Item) => { + const conflictingItem = mergedList.find((item) => item.id === list2Item.id) + if (conflictingItem && + list2Item.updatedAt && conflictingItem.updatedAt && + list2Item.updatedAt > conflictingItem.updatedAt) { + mergedList.splice(mergedList.indexOf(conflictingItem), 1, list2Item) + } else if (!conflictingItem) { + mergedList.push(list2Item) + } + }) + return mergedList + } + async function getList() { const response = await api.shopping.lists.getOne(shoppingListId); - return response.data; + if (window.$nuxt.isOffline && response.data) { + const createAndUpdateQueues = mergeListItemsByLatest(queue.update, queue.create); + response.data.listItems = mergeListItemsByLatest(response.data.listItems ?? [], createAndUpdateQueues); + } + return response.data } function createItem(item: ShoppingListItemOut) { @@ -188,7 +210,7 @@ export function useShoppingListItemActions(shoppingListId: string) { } async function process() { - if(queueEmpty.value) { + if (queueEmpty.value) { queue.lastUpdate = Date.now(); return; } diff --git a/frontend/package.json b/frontend/package.json index a9d71ebe4..00a418ec4 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,6 +1,6 @@ { "name": "mealie", -"version": "2.8.0", + "version": "2.8.0", "private": true, "scripts": { "dev": "nuxt", diff --git a/frontend/pages/shopping-lists/_id.vue b/frontend/pages/shopping-lists/_id.vue index 62a8c4407..48a71625c 100644 --- a/frontend/pages/shopping-lists/_id.vue +++ b/frontend/pages/shopping-lists/_id.vue @@ -878,10 +878,9 @@ export default defineComponent({ // make sure the item is at the end of the list with the other checked items item.position = shoppingList.value.listItems.length; - - // set a temporary updatedAt timestamp prior to refresh so it appears at the top of the checked items - item.updatedAt = new Date().toISOString(); } + // set a temporary updatedAt timestamp prior to refresh so it appears at the top of the checked items + item.updatedAt = new Date().toISOString(); // make updates reflect immediately if (shoppingList.value.listItems) { From 78b55c0b981572841547563f2142dfb84175d0e8 Mon Sep 17 00:00:00 2001 From: Felix Schneider Date: Wed, 18 Jun 2025 21:57:51 +0200 Subject: [PATCH 14/19] feat: add the selected recipe servings and yields in the content of the recipe post action (#5340) Co-authored-by: Michael Genson <71845777+michael-genson@users.noreply.github.com> --- frontend/composables/use-group-recipe-actions.ts | 3 ++- frontend/lib/api/user/group-recipe-actions.ts | 4 ++-- .../routes/households/controller_group_recipe_actions.py | 8 +++++--- mealie/schema/household/group_recipe_action.py | 1 + .../user_household_tests/test_group_recipe_actions.py | 2 ++ 5 files changed, 12 insertions(+), 6 deletions(-) diff --git a/frontend/composables/use-group-recipe-actions.ts b/frontend/composables/use-group-recipe-actions.ts index d1c5171e7..4a0be4668 100644 --- a/frontend/composables/use-group-recipe-actions.ts +++ b/frontend/composables/use-group-recipe-actions.ts @@ -4,6 +4,7 @@ import { useUserApi } from "~/composables/api"; import { GroupRecipeActionOut, GroupRecipeActionType } from "~/lib/api/types/household"; import { RequestResponse } from "~/lib/api/types/non-generated"; import { Recipe } from "~/lib/api/types/recipe"; +import { useScaledAmount } from "~/composables/recipes/use-scaled-amount"; const groupRecipeActions = ref(null); const loading = ref(false); @@ -69,7 +70,7 @@ export const useGroupRecipeActions = function ( window.open(url, "_blank")?.focus(); return; case "post": - return await api.groupRecipeActions.triggerAction(action.id, recipe.slug || ""); + return await api.groupRecipeActions.triggerAction(action.id, recipe.slug || "", useScaledAmount(recipe.recipeServings || 1, recipeScale).scaledAmount); default: break; } diff --git a/frontend/lib/api/user/group-recipe-actions.ts b/frontend/lib/api/user/group-recipe-actions.ts index d49cdecec..e2e0fe86e 100644 --- a/frontend/lib/api/user/group-recipe-actions.ts +++ b/frontend/lib/api/user/group-recipe-actions.ts @@ -13,7 +13,7 @@ const routes = { baseRoute = routes.groupRecipeActions; itemRoute = routes.groupRecipeActionsId; - async triggerAction(id: string | number, recipeSlug: string) { - return await this.requests.post(routes.groupRecipeActionsIdTriggerRecipeSlug(id, recipeSlug), {}); + async triggerAction(id: string | number, recipeSlug: string, scaledAmount: number) { + return await this.requests.post(routes.groupRecipeActionsIdTriggerRecipeSlug(id, recipeSlug), {scaledAmount}); } } diff --git a/mealie/routes/households/controller_group_recipe_actions.py b/mealie/routes/households/controller_group_recipe_actions.py index a99c57765..ab210cd18 100644 --- a/mealie/routes/households/controller_group_recipe_actions.py +++ b/mealie/routes/households/controller_group_recipe_actions.py @@ -1,7 +1,7 @@ from functools import cached_property import requests -from fastapi import APIRouter, BackgroundTasks, Depends, HTTPException, status +from fastapi import APIRouter, BackgroundTasks, Body, Depends, HTTPException, status from fastapi.encoders import jsonable_encoder from pydantic import UUID4 @@ -68,7 +68,9 @@ class GroupRecipeActionController(BaseUserController): # Actions @router.post("/{item_id}/trigger/{recipe_slug}", status_code=202) - def trigger_action(self, item_id: UUID4, recipe_slug: str, bg_tasks: BackgroundTasks) -> None: + def trigger_action( + self, item_id: UUID4, recipe_slug: str, bg_tasks: BackgroundTasks, scaled_amount: float = Body(1, embed=True) + ) -> None: recipe_action = self.repos.group_recipe_actions.get_one(item_id) if not recipe_action: raise HTTPException( @@ -93,7 +95,7 @@ class GroupRecipeActionController(BaseUserController): detail=ErrorResponse.respond(message="Not found."), ) from e - payload = GroupRecipeActionPayload(action=recipe_action, content=recipe) + payload = GroupRecipeActionPayload(action=recipe_action, content=recipe, scaled_amount=scaled_amount) bg_tasks.add_task( task_action, url=recipe_action.url, diff --git a/mealie/schema/household/group_recipe_action.py b/mealie/schema/household/group_recipe_action.py index 4794c8e65..7d96b4ccc 100644 --- a/mealie/schema/household/group_recipe_action.py +++ b/mealie/schema/household/group_recipe_action.py @@ -44,3 +44,4 @@ class GroupRecipeActionPagination(PaginationBase): class GroupRecipeActionPayload(MealieModel): action: GroupRecipeActionOut content: Any + scaled_amount: float diff --git a/tests/integration_tests/user_household_tests/test_group_recipe_actions.py b/tests/integration_tests/user_household_tests/test_group_recipe_actions.py index b55a9bfc6..11442ffb9 100644 --- a/tests/integration_tests/user_household_tests/test_group_recipe_actions.py +++ b/tests/integration_tests/user_household_tests/test_group_recipe_actions.py @@ -173,6 +173,7 @@ def test_group_recipe_actions_trigger_post( response = api_client.post( api_routes.households_recipe_actions_item_id_trigger_recipe_slug(action_id, recipe_slug), headers=unique_user.token, + json={"scaled_amount": 1.0}, ) if missing_action or missing_recipe: @@ -189,6 +190,7 @@ def test_group_recipe_actions_trigger_invalid_type(api_client: TestClient, uniqu response = api_client.post( api_routes.households_recipe_actions_item_id_trigger_recipe_slug(recipe_action.id, recipe.id), headers=unique_user.token, + json={"scaled_amount": 1.0}, ) assert response.status_code == 400 From 89ab7fac25e614a98175b9f81c5a333f4c49934a Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 18 Jun 2025 20:09:25 +0000 Subject: [PATCH 15/19] fix(deps): update dependency alembic to v1.16.2 (#5535) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- poetry.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/poetry.lock b/poetry.lock index 6e039179b..ade2f995e 100644 --- a/poetry.lock +++ b/poetry.lock @@ -14,14 +14,14 @@ files = [ [[package]] name = "alembic" -version = "1.16.1" +version = "1.16.2" description = "A database migration tool for SQLAlchemy." optional = false python-versions = ">=3.9" groups = ["main"] files = [ - {file = "alembic-1.16.1-py3-none-any.whl", hash = "sha256:0cdd48acada30d93aa1035767d67dff25702f8de74d7c3919f2e8492c8db2e67"}, - {file = "alembic-1.16.1.tar.gz", hash = "sha256:43d37ba24b3d17bc1eb1024fe0f51cd1dc95aeb5464594a02c6bb9ca9864bfa4"}, + {file = "alembic-1.16.2-py3-none-any.whl", hash = "sha256:5f42e9bd0afdbd1d5e3ad856c01754530367debdebf21ed6894e34af52b3bb03"}, + {file = "alembic-1.16.2.tar.gz", hash = "sha256:e53c38ff88dadb92eb22f8b150708367db731d58ad7e9d417c9168ab516cbed8"}, ] [package.dependencies] From c24d5326085ec8977054459c2bacb08e00661252 Mon Sep 17 00:00:00 2001 From: "Hoa (Kyle) Trinh" Date: Fri, 20 Jun 2025 00:09:12 +0700 Subject: [PATCH 16/19] feat: Migrate to Nuxt 3 framework (#5184) Co-authored-by: Michael Genson <71845777+michael-genson@users.noreply.github.com> Co-authored-by: Kuchenpirat <24235032+Kuchenpirat@users.noreply.github.com> --- .devcontainer/devcontainer.json | 5 +- .github/workflows/build-package.yml | 2 +- .github/workflows/e2e.yml | 2 +- .github/workflows/test-frontend.yml | 6 +- .gitignore | 5 + .vscode/settings.json | 1 + Taskfile.yml | 2 +- dev/code-generation/gen_ts_locales.py | 9 +- docker/Dockerfile | 2 +- frontend/.eslintrc.js | 74 - frontend/assets/css/fonts.css | 192 +- frontend/assets/css/main.css | 16 +- .../Domain/Cookbook/CookbookEditor.vue | 68 +- .../Domain/Cookbook/CookbookPage.vue | 214 +- .../Domain/Group/GroupExportData.vue | 29 +- .../Domain/Group/GroupPreferencesEditor.vue | 22 +- .../Household/GroupHouseholdSelector.vue | 26 +- .../Household/GroupMealPlanDayContextMenu.vue | 59 +- .../Household/GroupMealPlanRuleForm.vue | 49 +- .../Domain/Household/GroupWebhookEditor.vue | 47 +- .../Household/HouseholdPreferencesEditor.vue | 261 +- .../components/Domain/QueryFilterBuilder.vue | 768 +- .../Domain/Recipe/RecipeActionMenu.vue | 72 +- .../components/Domain/Recipe/RecipeAssets.vue | 116 +- .../components/Domain/Recipe/RecipeCard.vue | 67 +- .../Domain/Recipe/RecipeCardImage.vue | 25 +- .../Domain/Recipe/RecipeCardMobile.vue | 175 +- .../Domain/Recipe/RecipeCardSection.vue | 278 +- .../components/Domain/Recipe/RecipeChips.vue | 22 +- .../Domain/Recipe/RecipeContextMenu.vue | 138 +- .../Recipe/RecipeDataAliasManagerDialog.vue | 64 +- .../Domain/Recipe/RecipeDataTable.vue | 140 +- .../Recipe/RecipeDialogAddToShoppingList.vue | 143 +- .../Domain/Recipe/RecipeDialogBulkAdd.vue | 90 +- .../Recipe/RecipeDialogPrintPreferences.vue | 73 +- .../Domain/Recipe/RecipeDialogSearch.vue | 80 +- .../Domain/Recipe/RecipeDialogShare.vue | 123 +- .../Domain/Recipe/RecipeExplorerPage.vue | 308 +- .../Domain/Recipe/RecipeFavoriteBadge.vue | 42 +- .../Domain/Recipe/RecipeImageUploadBtn.vue | 41 +- .../Domain/Recipe/RecipeIngredientEditor.vue | 461 +- .../Domain/Recipe/RecipeIngredientHtml.vue | 10 +- .../Recipe/RecipeIngredientListItem.vue | 55 +- .../Domain/Recipe/RecipeIngredients.vue | 62 +- .../Domain/Recipe/RecipeLastMade.vue | 116 +- .../components/Domain/Recipe/RecipeList.vue | 174 +- .../components/Domain/Recipe/RecipeNotes.vue | 95 +- .../Domain/Recipe/RecipeNutrition.vue | 58 +- .../Domain/Recipe/RecipeOrganizerDialog.vue | 70 +- .../Domain/Recipe/RecipeOrganizerPage.vue | 113 +- .../Domain/Recipe/RecipeOrganizerSelector.vue | 77 +- .../Domain/Recipe/RecipePage/RecipePage.vue | 463 +- .../RecipePageParts/RecipePageComments.vue | 136 +- .../RecipePageEditorToolbar.vue | 115 +- .../RecipePageParts/RecipePageFooter.vue | 142 +- .../RecipePageParts/RecipePageHeader.vue | 27 +- .../RecipePageParts/RecipePageInfoCard.vue | 50 +- .../RecipePageInfoCardImage.vue | 22 +- .../RecipePageParts/RecipePageInfoEditor.vue | 144 +- .../RecipePageIngredientEditor.vue | 229 +- .../RecipePageIngredientToolsView.vue | 63 +- .../RecipePageInstructions.vue | 527 +- .../RecipePageParts/RecipePageOrganizers.vue | 80 +- .../RecipePageParts/RecipePageScale.vue | 26 +- .../Domain/Recipe/RecipePage/index.ts | 3 - .../Domain/Recipe/RecipePrintContainer.vue | 15 +- .../Domain/Recipe/RecipePrintView.vue | 175 +- .../components/Domain/Recipe/RecipeRating.vue | 50 +- .../Domain/Recipe/RecipeScaleEditButton.vue | 112 +- .../Recipe/RecipeSearchFilterSelector.vue | 21 +- .../Domain/Recipe/RecipeSettingsMenu.vue | 43 +- .../Domain/Recipe/RecipeSettingsSwitches.vue | 56 +- .../Domain/Recipe/RecipeSuggestion.vue | 47 +- .../Domain/Recipe/RecipeTimeCard.vue | 93 +- .../Domain/Recipe/RecipeTimeline.vue | 195 +- .../Domain/Recipe/RecipeTimelineBadge.vue | 53 +- .../Recipe/RecipeTimelineContextMenu.vue | 285 +- .../Domain/Recipe/RecipeTimelineItem.vue | 123 +- .../components/Domain/Recipe/RecipeYield.vue | 31 +- frontend/components/Domain/SearchFilter.vue | 157 +- .../Domain/ShoppingList/MultiPurposeLabel.vue | 14 +- .../ShoppingList/MultiPurposeLabelSection.vue | 33 +- .../Domain/ShoppingList/ShoppingListItem.vue | 169 +- .../ShoppingList/ShoppingListItemEditor.vue | 73 +- .../components/Domain/User/UserAvatar.vue | 45 +- .../Domain/User/UserInviteDialog.vue | 83 +- .../Domain/User/UserPasswordStrength.vue | 9 +- .../Domain/User/UserProfileLinkCard.vue | 72 +- .../Domain/User/UserRegistrationForm.vue | 46 +- frontend/components/Layout/DefaultLayout.vue | 230 +- .../Layout/LayoutParts/AppFooter.vue | 29 +- .../Layout/LayoutParts/AppHeader.vue | 102 +- .../Layout/LayoutParts/AppSidebar.vue | 213 +- .../Layout/LayoutParts/TheSnackbar.vue | 58 +- frontend/components/global/AdvancedOnly.vue | 10 +- frontend/components/global/AppButtonCopy.vue | 27 +- .../components/global/AppButtonUpload.vue | 45 +- frontend/components/global/AppLoader.vue | 38 +- frontend/components/global/AppToolbar.vue | 22 +- frontend/components/global/AutoForm.vue | 311 +- .../components/global/BannerExperimental.vue | 14 +- frontend/components/global/BannerWarning.vue | 20 +- frontend/components/global/BaseButton.vue | 40 +- .../components/global/BaseButtonGroup.vue | 54 +- .../global/BaseCardSectionTitle.vue | 18 +- frontend/components/global/BaseDialog.vue | 284 +- frontend/components/global/BaseDivider.vue | 10 +- .../components/global/BaseOverflowButton.vue | 150 +- frontend/components/global/BasePageTitle.vue | 29 +- frontend/components/global/BaseStatCard.vue | 38 +- frontend/components/global/BaseWizard.vue | 98 +- frontend/components/global/ButtonLink.vue | 15 +- frontend/components/global/ContextMenu.vue | 33 +- frontend/components/global/CrudTable.vue | 112 +- frontend/components/global/DevDumpJson.vue | 4 +- frontend/components/global/DocLink.vue | 18 +- frontend/components/global/DropZone.vue | 34 +- frontend/components/global/HelpIcon.vue | 28 +- frontend/components/global/ImageCropper.vue | 287 +- frontend/components/global/InputColor.vue | 45 +- frontend/components/global/InputLabelType.vue | 43 +- frontend/components/global/InputQuantity.vue | 23 +- frontend/components/global/LanguageDialog.vue | 74 +- frontend/components/global/MarkdownEditor.vue | 29 +- .../components/global/RecipeJsonEditor.vue | 56 +- frontend/components/global/ReportTable.vue | 37 +- frontend/components/global/SafeMarkdown.vue | 43 +- frontend/components/global/StatsCards.vue | 28 +- frontend/components/global/ToggleState.vue | 18 +- frontend/components/global/WakelockSwitch.vue | 80 +- frontend/composables/api/api-client.ts | 21 +- frontend/composables/api/static-routes.ts | 13 +- frontend/composables/api/use-app-info.ts | 12 +- .../composables/api/use-axios-download.ts | 22 - frontend/composables/api/use-downloader.ts | 18 + .../partials/use-actions-factory.ts | 29 +- .../composables/partials/use-store-factory.ts | 19 +- .../composables/recipe-page/shared-state.ts | 29 +- .../use-extract-ingredient-references.test.ts | 89 +- .../use-extract-ingredient-references.ts | 76 +- frontend/composables/recipes/use-fraction.ts | 12 +- .../recipes/use-recipe-ingredients.test.ts | 18 +- .../recipes/use-recipe-ingredients.ts | 14 +- .../recipes/use-recipe-nutrition.ts | 52 +- .../recipes/use-recipe-permissions.test.ts | 16 +- .../recipes/use-recipe-permissions.ts | 10 +- .../composables/recipes/use-recipe-search.ts | 9 +- .../recipes/use-recipe-timeline-events.ts | 16 +- .../composables/recipes/use-recipe-tools.ts | 15 +- frontend/composables/recipes/use-recipe.ts | 3 +- frontend/composables/recipes/use-recipes.ts | 18 +- .../composables/recipes/use-scaled-amount.ts | 4 +- .../composables/store/use-category-store.ts | 9 +- frontend/composables/store/use-food-store.ts | 9 +- .../composables/store/use-household-store.ts | 7 +- frontend/composables/store/use-label-store.ts | 7 +- frontend/composables/store/use-tag-store.ts | 9 +- frontend/composables/store/use-tool-store.ts | 9 +- frontend/composables/store/use-unit-store.ts | 7 +- frontend/composables/store/use-user-store.ts | 7 +- frontend/composables/use-backups.ts | 5 +- frontend/composables/use-context-presents.ts | 11 +- frontend/composables/use-copy.ts | 21 +- frontend/composables/use-group-cookbooks.ts | 28 +- frontend/composables/use-group-mealplan.ts | 26 +- .../composables/use-group-recipe-actions.ts | 20 +- frontend/composables/use-group-webhooks.ts | 12 +- frontend/composables/use-groups.ts | 17 +- frontend/composables/use-households.ts | 25 +- .../use-locales/available-locales.ts | 2 +- .../composables/use-locales/use-locales.ts | 44 +- frontend/composables/use-logged-in-state.ts | 15 +- .../composables/use-navigation-warning.ts | 10 +- frontend/composables/use-passwords.test.ts | 5 +- frontend/composables/use-passwords.ts | 32 +- .../composables/use-query-filter-builder.ts | 87 +- frontend/composables/use-router.ts | 11 +- .../use-setup/common-settings-form.ts | 49 +- .../use-shopping-list-item-actions.ts | 69 +- frontend/composables/use-text-color.ts | 4 +- frontend/composables/use-toast.ts | 2 - frontend/composables/use-user.ts | 43 +- frontend/composables/use-users/preferences.ts | 26 +- frontend/composables/use-users/user-form.ts | 33 +- .../composables/use-users/user-ratings.ts | 13 +- .../use-users/user-registration-form.ts | 18 +- frontend/composables/use-utils.ts | 44 +- frontend/composables/use-validators.ts | 7 +- frontend/composables/useMealieAuth.ts | 61 + frontend/eslint.config.mjs | 24 + frontend/i18n.config.ts | 57 + frontend/lang/locales/af-ZA.ts | 8 + frontend/lang/locales/ar-SA.ts | 8 + frontend/lang/locales/bg-BG.ts | 8 + frontend/lang/locales/ca-ES.ts | 8 + frontend/lang/locales/cs-CZ.ts | 8 + frontend/lang/locales/da-DK.ts | 8 + frontend/lang/locales/de-DE.ts | 8 + frontend/lang/locales/el-GR.ts | 8 + frontend/lang/locales/en-GB.ts | 8 + frontend/lang/locales/en-US.ts | 9 + frontend/lang/locales/es-ES.ts | 8 + frontend/lang/locales/et-EE.ts | 8 + frontend/lang/locales/fi-FI.ts | 8 + frontend/lang/locales/fr-BE.ts | 8 + frontend/lang/locales/fr-CA.ts | 8 + frontend/lang/locales/fr-FR.ts | 8 + frontend/lang/locales/gl-ES.ts | 8 + frontend/lang/locales/he-IL.ts | 8 + frontend/lang/locales/hr-HR.ts | 8 + frontend/lang/locales/hu-HU.ts | 8 + frontend/lang/locales/is-IS.ts | 8 + frontend/lang/locales/it-IT.ts | 8 + frontend/lang/locales/ja-JP.ts | 8 + frontend/lang/locales/ko-KR.ts | 8 + frontend/lang/locales/lt-LT.ts | 8 + frontend/lang/locales/lv-LV.ts | 8 + frontend/lang/locales/nl-NL.ts | 8 + frontend/lang/locales/no-NO.ts | 8 + frontend/lang/locales/pl-PL.ts | 8 + frontend/lang/locales/pt-BR.ts | 8 + frontend/lang/locales/pt-PT.ts | 8 + frontend/lang/locales/ro-RO.ts | 8 + frontend/lang/locales/ru-RU.ts | 8 + frontend/lang/locales/sk-SK.ts | 8 + frontend/lang/locales/sl-SI.ts | 8 + frontend/lang/locales/sr-SP.ts | 8 + frontend/lang/locales/sv-SE.ts | 8 + frontend/lang/locales/tr-TR.ts | 8 + frontend/lang/locales/uk-UA.ts | 8 + frontend/lang/locales/vi-VN.ts | 8 + frontend/lang/locales/zh-CN.ts | 8 + frontend/lang/locales/zh-TW.ts | 8 + frontend/lang/messages/hr-HR.json | 2 +- frontend/layouts/admin.vue | 184 +- frontend/layouts/basic.vue | 11 +- frontend/layouts/blank.vue | 15 +- frontend/layouts/default.vue | 4 +- frontend/layouts/error.vue | 72 +- frontend/lib/api/admin/admin-about.ts | 2 +- frontend/lib/api/admin/admin-analytics.ts | 2 +- frontend/lib/api/admin/admin-backups.ts | 4 +- frontend/lib/api/admin/admin-debug.ts | 2 +- frontend/lib/api/admin/admin-groups.ts | 5 +- frontend/lib/api/admin/admin-households.ts | 3 +- frontend/lib/api/admin/admin-maintenance.ts | 4 +- frontend/lib/api/admin/admin-users.ts | 2 +- frontend/lib/api/base/base-clients.ts | 28 +- frontend/lib/api/base/route.ts | 3 +- frontend/lib/api/client-admin.ts | 2 +- frontend/lib/api/client-public.ts | 2 +- frontend/lib/api/client-user.ts | 2 +- frontend/lib/api/public/explore/cookbooks.ts | 11 +- frontend/lib/api/public/explore/foods.ts | 11 +- frontend/lib/api/public/explore/households.ts | 11 +- frontend/lib/api/public/explore/organizers.ts | 33 +- frontend/lib/api/public/explore/recipes.ts | 11 +- frontend/lib/api/types/admin.ts | 2 +- frontend/lib/api/types/analytics.ts | 2 +- frontend/lib/api/types/cookbook.ts | 2 +- frontend/lib/api/types/events.ts | 2 +- frontend/lib/api/types/group.ts | 2 +- frontend/lib/api/types/household.ts | 2 +- frontend/lib/api/types/labels.ts | 2 +- frontend/lib/api/types/meal-plan.ts | 7 +- frontend/lib/api/types/non-generated.ts | 2 +- frontend/lib/api/types/recipe.ts | 4 +- frontend/lib/api/types/reports.ts | 2 +- frontend/lib/api/types/response.ts | 2 +- frontend/lib/api/types/user.ts | 3 +- frontend/lib/api/user/backups.ts | 2 +- frontend/lib/api/user/email.ts | 6 +- frontend/lib/api/user/group-cookbooks.ts | 2 +- frontend/lib/api/user/group-event-notifier.ts | 2 +- frontend/lib/api/user/group-mealplan-rules.ts | 2 +- frontend/lib/api/user/group-mealplan.ts | 2 +- frontend/lib/api/user/group-migrations.ts | 4 +- .../api/user/group-multiple-purpose-labels.ts | 2 +- frontend/lib/api/user/group-recipe-actions.ts | 22 +- frontend/lib/api/user/group-reports.ts | 2 +- frontend/lib/api/user/group-seeder.ts | 4 +- frontend/lib/api/user/group-shopping-lists.ts | 4 +- frontend/lib/api/user/group-webhooks.ts | 2 +- frontend/lib/api/user/groups.ts | 8 +- frontend/lib/api/user/households.ts | 10 +- frontend/lib/api/user/organizer-categories.ts | 2 +- frontend/lib/api/user/organizer-tags.ts | 2 +- frontend/lib/api/user/organizer-tools.ts | 2 +- frontend/lib/api/user/recipe-bulk-actions.ts | 8 +- frontend/lib/api/user/recipe-foods.ts | 3 +- frontend/lib/api/user/recipe-units.ts | 3 +- .../lib/api/user/recipes/recipe-comments.ts | 2 +- frontend/lib/api/user/recipes/recipe-share.ts | 2 +- frontend/lib/api/user/recipes/recipe.ts | 18 +- frontend/lib/api/user/upload.ts | 4 +- frontend/lib/api/user/user-registration.ts | 2 +- frontend/lib/api/user/users.ts | 2 +- frontend/lib/api/user/utils.ts | 2 +- frontend/lib/icons/icon-type.ts | 2 +- frontend/lib/icons/icons.ts | 6 +- frontend/lib/validators/inputs.test.ts | 1 + frontend/lib/validators/inputs.ts | 4 +- frontend/middleware/admin-only.ts | 17 +- frontend/middleware/advanced-only.ts | 19 +- .../middleware/can-manage-household-only.ts | 14 +- frontend/middleware/can-manage-only.ts | 14 +- frontend/middleware/can-organize-only.ts | 19 +- frontend/middleware/group-only.ts | 15 +- frontend/nuxt.config.js | 538 - frontend/nuxt.config.ts | 479 + frontend/package.json | 86 +- frontend/pages/admin.vue | 9 + frontend/pages/admin/backups.vue | 151 +- frontend/pages/admin/debug/openai.vue | 68 +- frontend/pages/admin/debug/parser.vue | 118 +- frontend/pages/admin/maintenance/index.vue | 91 +- .../admin/manage/groups/{_id.vue => [id].vue} | 81 +- frontend/pages/admin/manage/groups/index.vue | 88 +- .../manage/households/{_id.vue => [id].vue} | 90 +- .../pages/admin/manage/households/index.vue | 128 +- .../admin/manage/users/{_id.vue => [id].vue} | 129 +- frontend/pages/admin/manage/users/create.vue | 56 +- frontend/pages/admin/manage/users/index.vue | 101 +- frontend/pages/admin/setup.vue | 712 +- frontend/pages/admin/site-settings.vue | 725 +- frontend/pages/forgot-password.vue | 72 +- .../cookbooks/[slug].vue} | 5 +- .../pages/g/[groupSlug]/cookbooks/index.vue | 260 + .../g/{_groupSlug => [groupSlug]}/index.vue | 3 +- .../pages/g/[groupSlug]/r/[slug]/index.vue | 58 + .../r/[slug]}/ingredient-parser.vue | 169 +- .../{_groupSlug => [groupSlug]}/r/create.vue | 70 +- .../r/create/bulk.vue | 114 +- .../r/create/debug.vue | 53 +- .../r/create/html.vue | 88 +- .../r/create/image.vue | 67 +- .../r/create/index.vue | 6 +- .../r/create/new.vue | 32 +- .../r/create/url.vue | 105 +- .../r/create/zip.vue | 27 +- .../recipes/categories/index.vue | 19 +- .../recipes/finder/index.vue | 313 +- .../recipes/tags/index.vue | 19 +- .../pages/g/[groupSlug]/recipes/timeline.vue | 67 + .../recipes/tools/index.vue | 37 +- .../pages/g/[groupSlug]/shared/r/[id].vue | 47 + .../pages/g/_groupSlug/cookbooks/index.vue | 232 - frontend/pages/g/_groupSlug/r/_slug/index.vue | 60 - .../pages/g/_groupSlug/recipes/timeline.vue | 50 - frontend/pages/g/_groupSlug/shared/r/_id.vue | 49 - frontend/pages/group/data.vue | 85 +- frontend/pages/group/data/categories.vue | 75 +- frontend/pages/group/data/foods.vue | 234 +- frontend/pages/group/data/index.vue | 12 +- frontend/pages/group/data/labels.vue | 119 +- frontend/pages/group/data/recipe-actions.vue | 78 +- frontend/pages/group/data/recipes.vue | 190 +- frontend/pages/group/data/tags.vue | 75 +- frontend/pages/group/data/tools.vue | 100 +- frontend/pages/group/data/units.vue | 227 +- frontend/pages/group/index.vue | 39 +- frontend/pages/group/migrations.vue | 163 +- frontend/pages/group/reports/[id].vue | 88 + frontend/pages/group/reports/_id.vue | 70 - frontend/pages/household/index.vue | 240 +- frontend/pages/household/mealplan/planner.vue | 91 +- .../pages/household/mealplan/planner/edit.vue | 197 +- .../pages/household/mealplan/planner/types.ts | 6 +- .../pages/household/mealplan/planner/view.vue | 62 +- .../pages/household/mealplan/settings.vue | 119 +- frontend/pages/household/members.vue | 137 +- frontend/pages/household/notifiers.vue | 177 +- frontend/pages/household/webhooks.vue | 65 +- frontend/pages/index.vue | 34 +- frontend/pages/login.vue | 312 +- frontend/pages/register/index.vue | 288 +- frontend/pages/register/states.ts | 2 - frontend/pages/reset-password.vue | 70 +- .../shopping-lists/{_id.vue => [id].vue} | 574 +- frontend/pages/shopping-lists/index.vue | 177 +- .../pages/user/{_id => [id]}/favorites.vue | 27 +- frontend/pages/user/profile/api-tokens.vue | 119 +- frontend/pages/user/profile/edit.vue | 168 +- frontend/pages/user/profile/index.vue | 247 +- frontend/plugins/axios.ts | 44 + frontend/plugins/dark-mode.client.ts | 25 +- frontend/plugins/globals.ts | 44 +- frontend/plugins/theme.ts | 80 +- frontend/plugins/toast.client.ts | 18 - frontend/server/api/[...].ts | 12 + frontend/server/routes/docs.ts | 9 + frontend/server/routes/openapi.json.ts | 9 + frontend/tests/utils.ts | 13 +- frontend/tsconfig.json | 36 +- frontend/types/auth.d.ts | 11 + frontend/types/auto-forms.ts | 4 + frontend/types/components.d.ts | 74 +- frontend/types/ts-shim.d.ts | 1 + frontend/types/vuetify.ts | 11 - frontend/yarn.lock | 18247 ++++++++-------- tests/e2e/login.spec.ts | 58 +- tests/e2e/playwright.config.ts | 2 +- tests/e2e/yarn.lock | 24 +- 403 files changed, 23959 insertions(+), 19557 deletions(-) delete mode 100644 frontend/.eslintrc.js delete mode 100644 frontend/components/Domain/Recipe/RecipePage/index.ts delete mode 100644 frontend/composables/api/use-axios-download.ts create mode 100644 frontend/composables/api/use-downloader.ts create mode 100644 frontend/composables/useMealieAuth.ts create mode 100644 frontend/eslint.config.mjs create mode 100644 frontend/i18n.config.ts create mode 100644 frontend/lang/locales/af-ZA.ts create mode 100644 frontend/lang/locales/ar-SA.ts create mode 100644 frontend/lang/locales/bg-BG.ts create mode 100644 frontend/lang/locales/ca-ES.ts create mode 100644 frontend/lang/locales/cs-CZ.ts create mode 100644 frontend/lang/locales/da-DK.ts create mode 100644 frontend/lang/locales/de-DE.ts create mode 100644 frontend/lang/locales/el-GR.ts create mode 100644 frontend/lang/locales/en-GB.ts create mode 100644 frontend/lang/locales/en-US.ts create mode 100644 frontend/lang/locales/es-ES.ts create mode 100644 frontend/lang/locales/et-EE.ts create mode 100644 frontend/lang/locales/fi-FI.ts create mode 100644 frontend/lang/locales/fr-BE.ts create mode 100644 frontend/lang/locales/fr-CA.ts create mode 100644 frontend/lang/locales/fr-FR.ts create mode 100644 frontend/lang/locales/gl-ES.ts create mode 100644 frontend/lang/locales/he-IL.ts create mode 100644 frontend/lang/locales/hr-HR.ts create mode 100644 frontend/lang/locales/hu-HU.ts create mode 100644 frontend/lang/locales/is-IS.ts create mode 100644 frontend/lang/locales/it-IT.ts create mode 100644 frontend/lang/locales/ja-JP.ts create mode 100644 frontend/lang/locales/ko-KR.ts create mode 100644 frontend/lang/locales/lt-LT.ts create mode 100644 frontend/lang/locales/lv-LV.ts create mode 100644 frontend/lang/locales/nl-NL.ts create mode 100644 frontend/lang/locales/no-NO.ts create mode 100644 frontend/lang/locales/pl-PL.ts create mode 100644 frontend/lang/locales/pt-BR.ts create mode 100644 frontend/lang/locales/pt-PT.ts create mode 100644 frontend/lang/locales/ro-RO.ts create mode 100644 frontend/lang/locales/ru-RU.ts create mode 100644 frontend/lang/locales/sk-SK.ts create mode 100644 frontend/lang/locales/sl-SI.ts create mode 100644 frontend/lang/locales/sr-SP.ts create mode 100644 frontend/lang/locales/sv-SE.ts create mode 100644 frontend/lang/locales/tr-TR.ts create mode 100644 frontend/lang/locales/uk-UA.ts create mode 100644 frontend/lang/locales/vi-VN.ts create mode 100644 frontend/lang/locales/zh-CN.ts create mode 100644 frontend/lang/locales/zh-TW.ts delete mode 100644 frontend/nuxt.config.js create mode 100644 frontend/nuxt.config.ts create mode 100644 frontend/pages/admin.vue rename frontend/pages/admin/manage/groups/{_id.vue => [id].vue} (53%) rename frontend/pages/admin/manage/households/{_id.vue => [id].vue} (56%) rename frontend/pages/admin/manage/users/{_id.vue => [id].vue} (62%) rename frontend/pages/g/{_groupSlug/cookbooks/_slug.vue => [groupSlug]/cookbooks/[slug].vue} (65%) create mode 100644 frontend/pages/g/[groupSlug]/cookbooks/index.vue rename frontend/pages/g/{_groupSlug => [groupSlug]}/index.vue (70%) create mode 100644 frontend/pages/g/[groupSlug]/r/[slug]/index.vue rename frontend/pages/g/{_groupSlug/r/_slug => [groupSlug]/r/[slug]}/ingredient-parser.vue (71%) rename frontend/pages/g/{_groupSlug => [groupSlug]}/r/create.vue (50%) rename frontend/pages/g/{_groupSlug => [groupSlug]}/r/create/bulk.vue (63%) rename frontend/pages/g/{_groupSlug => [groupSlug]}/r/create/debug.vue (68%) rename frontend/pages/g/{_groupSlug => [groupSlug]}/r/create/html.vue (63%) rename frontend/pages/g/{_groupSlug => [groupSlug]}/r/create/image.vue (75%) rename frontend/pages/g/{_groupSlug => [groupSlug]}/r/create/index.vue (64%) rename frontend/pages/g/{_groupSlug => [groupSlug]}/r/create/new.vue (72%) rename frontend/pages/g/{_groupSlug => [groupSlug]}/r/create/url.vue (66%) rename frontend/pages/g/{_groupSlug => [groupSlug]}/r/create/zip.vue (75%) rename frontend/pages/g/{_groupSlug => [groupSlug]}/recipes/categories/index.vue (69%) rename frontend/pages/g/{_groupSlug => [groupSlug]}/recipes/finder/index.vue (68%) rename frontend/pages/g/{_groupSlug => [groupSlug]}/recipes/tags/index.vue (70%) create mode 100644 frontend/pages/g/[groupSlug]/recipes/timeline.vue rename frontend/pages/g/{_groupSlug => [groupSlug]}/recipes/tools/index.vue (67%) create mode 100644 frontend/pages/g/[groupSlug]/shared/r/[id].vue delete mode 100644 frontend/pages/g/_groupSlug/cookbooks/index.vue delete mode 100644 frontend/pages/g/_groupSlug/r/_slug/index.vue delete mode 100644 frontend/pages/g/_groupSlug/recipes/timeline.vue delete mode 100644 frontend/pages/g/_groupSlug/shared/r/_id.vue create mode 100644 frontend/pages/group/reports/[id].vue delete mode 100644 frontend/pages/group/reports/_id.vue rename frontend/pages/shopping-lists/{_id.vue => [id].vue} (65%) rename frontend/pages/user/{_id => [id]}/favorites.vue (69%) create mode 100644 frontend/plugins/axios.ts delete mode 100644 frontend/plugins/toast.client.ts create mode 100644 frontend/server/api/[...].ts create mode 100644 frontend/server/routes/docs.ts create mode 100644 frontend/server/routes/openapi.json.ts create mode 100644 frontend/types/auth.d.ts delete mode 100644 frontend/types/vuetify.ts diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index b83fbf19c..2ceae625a 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -11,7 +11,7 @@ // Use -bullseye variants on local on arm64/Apple Silicon. "VARIANT": "3.12-bullseye", // Options - "NODE_VERSION": "16" + "NODE_VERSION": "20" } }, "mounts": [ @@ -55,5 +55,6 @@ "ghcr.io/devcontainers/features/docker-in-docker:2": { "dockerDashComposeVersion": "v2" } - } + }, + "appPort": 3000 } diff --git a/.github/workflows/build-package.yml b/.github/workflows/build-package.yml index bae0de02c..dddc7a2f4 100644 --- a/.github/workflows/build-package.yml +++ b/.github/workflows/build-package.yml @@ -19,7 +19,7 @@ jobs: - name: Setup node env 🏗 uses: actions/setup-node@v4.0.0 with: - node-version: 16 + node-version: 20 check-latest: true - name: Get yarn cache directory path 🛠 diff --git a/.github/workflows/e2e.yml b/.github/workflows/e2e.yml index a13cc2d23..07fd7adfc 100644 --- a/.github/workflows/e2e.yml +++ b/.github/workflows/e2e.yml @@ -13,7 +13,7 @@ jobs: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: - node-version: 18 + node-version: 20 cache: 'yarn' cache-dependency-path: ./tests/e2e/yarn.lock - name: Set up Docker Buildx diff --git a/.github/workflows/test-frontend.yml b/.github/workflows/test-frontend.yml index 00f8a2673..20d9c98f6 100644 --- a/.github/workflows/test-frontend.yml +++ b/.github/workflows/test-frontend.yml @@ -14,7 +14,7 @@ jobs: - name: Setup node env 🏗 uses: actions/setup-node@v4.0.0 with: - node-version: 16 + node-version: 20 check-latest: true - name: Get yarn cache directory path 🛠 @@ -34,6 +34,10 @@ jobs: run: yarn working-directory: "frontend" + - name: Prepare nuxt 🚀 + run: yarn nuxt prepare + working-directory: "frontend" + - name: Run linter 👀 run: yarn lint working-directory: "frontend" diff --git a/.gitignore b/.gitignore index cd0725b3a..b24f03a93 100644 --- a/.gitignore +++ b/.gitignore @@ -10,6 +10,9 @@ docs/site/ *temp/* .secret frontend/dist/ +frontend/.output/* +frontend/.yarn/* +frontend/.yarnrc.yml dev/code-generation/generated/* dev/data/mealie.db-journal @@ -164,3 +167,5 @@ dev/code-generation/openapi.json .run/ .task/* +.dev.env +frontend/eslint.config.deprecated.js diff --git a/.vscode/settings.json b/.vscode/settings.json index b842cd45e..61ab0e239 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -18,6 +18,7 @@ "source.organizeImports": "never" }, "editor.formatOnSave": true, + "eslint.useFlatConfig": true, "eslint.workingDirectories": [ "./frontend" ], diff --git a/Taskfile.yml b/Taskfile.yml index c42cb76c7..ccff66fd6 100644 --- a/Taskfile.yml +++ b/Taskfile.yml @@ -243,7 +243,7 @@ tasks: desc: runs the frontend server dir: frontend cmds: - - yarn run dev + - yarn run dev --no-fork docker:build-from-package: desc: Builds the Docker image from the existing Python package in dist/ diff --git a/dev/code-generation/gen_ts_locales.py b/dev/code-generation/gen_ts_locales.py index e1b73242a..6ff441d22 100644 --- a/dev/code-generation/gen_ts_locales.py +++ b/dev/code-generation/gen_ts_locales.py @@ -156,12 +156,13 @@ PROJECT_DIR = Path(__file__).parent.parent.parent datetime_dir = PROJECT_DIR / "frontend" / "lang" / "dateTimeFormats" locales_dir = PROJECT_DIR / "frontend" / "lang" / "messages" -nuxt_config = PROJECT_DIR / "frontend" / "nuxt.config.js" +nuxt_config = PROJECT_DIR / "frontend" / "nuxt.config.ts" +i18n_config = PROJECT_DIR / "frontend" / "i18n.config.ts" reg_valid = PROJECT_DIR / "mealie" / "schema" / "_mealie" / "validators.py" """ This snippet walks the message and dat locales directories and generates the import information -for the nuxt.config.js file and automatically injects it into the nuxt.config.js file. Note that +for the nuxt.config.ts file and automatically injects it into the nuxt.config.ts file. Note that the code generation ID is hardcoded into the script and required in the nuxt config. """ @@ -173,12 +174,12 @@ def inject_nuxt_values(): all_langs = [] for match in locales_dir.glob("*.json"): - lang_string = f'{{ code: "{match.stem}", file: "{match.name}" }},' + lang_string = f'{{ code: "{match.stem}", file: "{match.name.replace(".json", ".ts")}" }},' all_langs.append(lang_string) log.debug(f"injecting locales into nuxt config -> {nuxt_config}") inject_inline(nuxt_config, CodeKeys.nuxt_local_messages, all_langs) - inject_inline(nuxt_config, CodeKeys.nuxt_local_dates, all_date_locales) + inject_inline(i18n_config, CodeKeys.nuxt_local_dates, all_date_locales) def inject_registration_validation_values(): diff --git a/docker/Dockerfile b/docker/Dockerfile index ada531826..f199602d6 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -1,7 +1,7 @@ ############################################### # Frontend Build ############################################### -FROM node:16 AS frontend-builder +FROM node:20 AS frontend-builder WORKDIR /frontend diff --git a/frontend/.eslintrc.js b/frontend/.eslintrc.js deleted file mode 100644 index f6ab3103b..000000000 --- a/frontend/.eslintrc.js +++ /dev/null @@ -1,74 +0,0 @@ -module.exports = { - root: true, - env: { - browser: true, - node: true, - }, - parser: "vue-eslint-parser", - parserOptions: { - parser: "@typescript-eslint/parser", - requireConfigFile: false, - tsConfigRootDir: __dirname, - project: ["./tsconfig.json"], - extraFileExtensions: [".vue"], - }, - extends: [ - "@nuxtjs/eslint-config-typescript", - "plugin:nuxt/recommended", - "eslint:recommended", - "plugin:@typescript-eslint/recommended", - "plugin:@typescript-eslint/recommended-requiring-type-checking", - // "plugin:prettier/recommended", - "prettier", - ], - // Re-add once we use nuxt bridge - // See https://v3.nuxtjs.org/getting-started/bridge#update-nuxtconfig - ignorePatterns: ["nuxt.config.js", "lib/api/types/**/*.ts"], - plugins: ["prettier"], - // add your custom rules here - rules: { - "no-console": process.env.NODE_ENV === "production" ? "warn" : "off", - "no-debugger": process.env.NODE_ENV === "production" ? "warn" : "off", - quotes: ["error", "double"], - "vue/component-name-in-template-casing": ["error", "PascalCase"], - camelcase: 0, - "vue/singleline-html-element-content-newline": "off", - "vue/multiline-html-element-content-newline": "off", - "vue/no-mutating-props": "off", - "vue/no-v-text-v-html-on-component": "warn", - "vue/no-v-for-template-key-on-child": "off", - "vue/valid-v-slot": [ - "error", - { - allowModifiers: true, - }, - ], - "@typescript-eslint/ban-ts-comment": [ - "error", - { - "ts-ignore": "allow-with-description", - }, - ], - "no-restricted-imports": [ - "error", - { paths: ["@vue/reactivity", "@vue/runtime-dom", "@vue/composition-api", "vue-demi"] }, - ], - - // TODO Gradually activate all rules - // Allow Promise in onMounted - "@typescript-eslint/no-misused-promises": [ - "error", - { - checksVoidReturn: { - arguments: false, - }, - }, - ], - "@typescript-eslint/no-unsafe-assignment": "off", - "@typescript-eslint/no-unsafe-member-access": "off", - "@typescript-eslint/explicit-module-boundary-types": "off", - "@typescript-eslint/no-unsafe-call": "off", - "@typescript-eslint/no-floating-promises": "off", - "@typescript-eslint/no-explicit-any": "off", - }, -}; diff --git a/frontend/assets/css/fonts.css b/frontend/assets/css/fonts.css index 15d2f1305..b8c8be4c7 100644 --- a/frontend/assets/css/fonts.css +++ b/frontend/assets/css/fonts.css @@ -1,378 +1,390 @@ /* cyrillic-ext */ @font-face { - font-family: 'Roboto'; + font-family: "Roboto"; font-style: normal; font-weight: 100; font-display: swap; - src: url('~assets/fonts/Roboto-100-cyrillic-ext1.woff2') format('woff2'); + src: url("~assets/fonts/Roboto-100-cyrillic-ext1.woff2") format("woff2"); unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; } /* cyrillic */ @font-face { - font-family: 'Roboto'; + font-family: "Roboto"; font-style: normal; font-weight: 100; font-display: swap; - src: url('~assets/fonts/Roboto-100-cyrillic2.woff2') format('woff2'); + src: url("~assets/fonts/Roboto-100-cyrillic2.woff2") format("woff2"); unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; } /* greek-ext */ @font-face { - font-family: 'Roboto'; + font-family: "Roboto"; font-style: normal; font-weight: 100; font-display: swap; - src: url('~assets/fonts/Roboto-100-greek-ext3.woff2') format('woff2'); + src: url("~assets/fonts/Roboto-100-greek-ext3.woff2") format("woff2"); unicode-range: U+1F00-1FFF; } /* greek */ @font-face { - font-family: 'Roboto'; + font-family: "Roboto"; font-style: normal; font-weight: 100; font-display: swap; - src: url('~assets/fonts/Roboto-100-greek4.woff2') format('woff2'); + src: url("~assets/fonts/Roboto-100-greek4.woff2") format("woff2"); unicode-range: U+0370-03FF; } /* vietnamese */ @font-face { - font-family: 'Roboto'; + font-family: "Roboto"; font-style: normal; font-weight: 100; font-display: swap; - src: url('~assets/fonts/Roboto-100-vietnamese5.woff2') format('woff2'); + src: url("~assets/fonts/Roboto-100-vietnamese5.woff2") format("woff2"); unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB; } /* latin-ext */ @font-face { - font-family: 'Roboto'; + font-family: "Roboto"; font-style: normal; font-weight: 100; font-display: swap; - src: url('~assets/fonts/Roboto-100-latin-ext6.woff2') format('woff2'); + src: url("~assets/fonts/Roboto-100-latin-ext6.woff2") format("woff2"); unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; } /* latin */ @font-face { - font-family: 'Roboto'; + font-family: "Roboto"; font-style: normal; font-weight: 100; font-display: swap; - src: url('~assets/fonts/Roboto-100-latin7.woff2') format('woff2'); - unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; + src: url("~assets/fonts/Roboto-100-latin7.woff2") format("woff2"); + unicode-range: + U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, + U+2193, U+2212, U+2215, U+FEFF, U+FFFD; } /* cyrillic-ext */ @font-face { - font-family: 'Roboto'; + font-family: "Roboto"; font-style: normal; font-weight: 300; font-display: swap; - src: url('~assets/fonts/Roboto-300-cyrillic-ext8.woff2') format('woff2'); + src: url("~assets/fonts/Roboto-300-cyrillic-ext8.woff2") format("woff2"); unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; } /* cyrillic */ @font-face { - font-family: 'Roboto'; + font-family: "Roboto"; font-style: normal; font-weight: 300; font-display: swap; - src: url('~assets/fonts/Roboto-300-cyrillic9.woff2') format('woff2'); + src: url("~assets/fonts/Roboto-300-cyrillic9.woff2") format("woff2"); unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; } /* greek-ext */ @font-face { - font-family: 'Roboto'; + font-family: "Roboto"; font-style: normal; font-weight: 300; font-display: swap; - src: url('~assets/fonts/Roboto-300-greek-ext10.woff2') format('woff2'); + src: url("~assets/fonts/Roboto-300-greek-ext10.woff2") format("woff2"); unicode-range: U+1F00-1FFF; } /* greek */ @font-face { - font-family: 'Roboto'; + font-family: "Roboto"; font-style: normal; font-weight: 300; font-display: swap; - src: url('~assets/fonts/Roboto-300-greek11.woff2') format('woff2'); + src: url("~assets/fonts/Roboto-300-greek11.woff2") format("woff2"); unicode-range: U+0370-03FF; } /* vietnamese */ @font-face { - font-family: 'Roboto'; + font-family: "Roboto"; font-style: normal; font-weight: 300; font-display: swap; - src: url('~assets/fonts/Roboto-300-vietnamese12.woff2') format('woff2'); + src: url("~assets/fonts/Roboto-300-vietnamese12.woff2") format("woff2"); unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB; } /* latin-ext */ @font-face { - font-family: 'Roboto'; + font-family: "Roboto"; font-style: normal; font-weight: 300; font-display: swap; - src: url('~assets/fonts/Roboto-300-latin-ext13.woff2') format('woff2'); + src: url("~assets/fonts/Roboto-300-latin-ext13.woff2") format("woff2"); unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; } /* latin */ @font-face { - font-family: 'Roboto'; + font-family: "Roboto"; font-style: normal; font-weight: 300; font-display: swap; - src: url('~assets/fonts/Roboto-300-latin14.woff2') format('woff2'); - unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; + src: url("~assets/fonts/Roboto-300-latin14.woff2") format("woff2"); + unicode-range: + U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, + U+2193, U+2212, U+2215, U+FEFF, U+FFFD; } /* cyrillic-ext */ @font-face { - font-family: 'Roboto'; + font-family: "Roboto"; font-style: normal; font-weight: 400; font-display: swap; - src: url('~assets/fonts/Roboto-400-cyrillic-ext15.woff2') format('woff2'); + src: url("~assets/fonts/Roboto-400-cyrillic-ext15.woff2") format("woff2"); unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; } /* cyrillic */ @font-face { - font-family: 'Roboto'; + font-family: "Roboto"; font-style: normal; font-weight: 400; font-display: swap; - src: url('~assets/fonts/Roboto-400-cyrillic16.woff2') format('woff2'); + src: url("~assets/fonts/Roboto-400-cyrillic16.woff2") format("woff2"); unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; } /* greek-ext */ @font-face { - font-family: 'Roboto'; + font-family: "Roboto"; font-style: normal; font-weight: 400; font-display: swap; - src: url('~assets/fonts/Roboto-400-greek-ext17.woff2') format('woff2'); + src: url("~assets/fonts/Roboto-400-greek-ext17.woff2") format("woff2"); unicode-range: U+1F00-1FFF; } /* greek */ @font-face { - font-family: 'Roboto'; + font-family: "Roboto"; font-style: normal; font-weight: 400; font-display: swap; - src: url('~assets/fonts/Roboto-400-greek18.woff2') format('woff2'); + src: url("~assets/fonts/Roboto-400-greek18.woff2") format("woff2"); unicode-range: U+0370-03FF; } /* vietnamese */ @font-face { - font-family: 'Roboto'; + font-family: "Roboto"; font-style: normal; font-weight: 400; font-display: swap; - src: url('~assets/fonts/Roboto-400-vietnamese19.woff2') format('woff2'); + src: url("~assets/fonts/Roboto-400-vietnamese19.woff2") format("woff2"); unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB; } /* latin-ext */ @font-face { - font-family: 'Roboto'; + font-family: "Roboto"; font-style: normal; font-weight: 400; font-display: swap; - src: url('~assets/fonts/Roboto-400-latin-ext20.woff2') format('woff2'); + src: url("~assets/fonts/Roboto-400-latin-ext20.woff2") format("woff2"); unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; } /* latin */ @font-face { - font-family: 'Roboto'; + font-family: "Roboto"; font-style: normal; font-weight: 400; font-display: swap; - src: url('~assets/fonts/Roboto-400-latin21.woff2') format('woff2'); - unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; + src: url("~assets/fonts/Roboto-400-latin21.woff2") format("woff2"); + unicode-range: + U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, + U+2193, U+2212, U+2215, U+FEFF, U+FFFD; } /* cyrillic-ext */ @font-face { - font-family: 'Roboto'; + font-family: "Roboto"; font-style: normal; font-weight: 500; font-display: swap; - src: url('~assets/fonts/Roboto-500-cyrillic-ext22.woff2') format('woff2'); + src: url("~assets/fonts/Roboto-500-cyrillic-ext22.woff2") format("woff2"); unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; } /* cyrillic */ @font-face { - font-family: 'Roboto'; + font-family: "Roboto"; font-style: normal; font-weight: 500; font-display: swap; - src: url('~assets/fonts/Roboto-500-cyrillic23.woff2') format('woff2'); + src: url("~assets/fonts/Roboto-500-cyrillic23.woff2") format("woff2"); unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; } /* greek-ext */ @font-face { - font-family: 'Roboto'; + font-family: "Roboto"; font-style: normal; font-weight: 500; font-display: swap; - src: url('~assets/fonts/Roboto-500-greek-ext24.woff2') format('woff2'); + src: url("~assets/fonts/Roboto-500-greek-ext24.woff2") format("woff2"); unicode-range: U+1F00-1FFF; } /* greek */ @font-face { - font-family: 'Roboto'; + font-family: "Roboto"; font-style: normal; font-weight: 500; font-display: swap; - src: url('~assets/fonts/Roboto-500-greek25.woff2') format('woff2'); + src: url("~assets/fonts/Roboto-500-greek25.woff2") format("woff2"); unicode-range: U+0370-03FF; } /* vietnamese */ @font-face { - font-family: 'Roboto'; + font-family: "Roboto"; font-style: normal; font-weight: 500; font-display: swap; - src: url('~assets/fonts/Roboto-500-vietnamese26.woff2') format('woff2'); + src: url("~assets/fonts/Roboto-500-vietnamese26.woff2") format("woff2"); unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB; } /* latin-ext */ @font-face { - font-family: 'Roboto'; + font-family: "Roboto"; font-style: normal; font-weight: 500; font-display: swap; - src: url('~assets/fonts/Roboto-500-latin-ext27.woff2') format('woff2'); + src: url("~assets/fonts/Roboto-500-latin-ext27.woff2") format("woff2"); unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; } /* latin */ @font-face { - font-family: 'Roboto'; + font-family: "Roboto"; font-style: normal; font-weight: 500; font-display: swap; - src: url('~assets/fonts/Roboto-500-latin28.woff2') format('woff2'); - unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; + src: url("~assets/fonts/Roboto-500-latin28.woff2") format("woff2"); + unicode-range: + U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, + U+2193, U+2212, U+2215, U+FEFF, U+FFFD; } /* cyrillic-ext */ @font-face { - font-family: 'Roboto'; + font-family: "Roboto"; font-style: normal; font-weight: 700; font-display: swap; - src: url('~assets/fonts/Roboto-700-cyrillic-ext29.woff2') format('woff2'); + src: url("~assets/fonts/Roboto-700-cyrillic-ext29.woff2") format("woff2"); unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; } /* cyrillic */ @font-face { - font-family: 'Roboto'; + font-family: "Roboto"; font-style: normal; font-weight: 700; font-display: swap; - src: url('~assets/fonts/Roboto-700-cyrillic30.woff2') format('woff2'); + src: url("~assets/fonts/Roboto-700-cyrillic30.woff2") format("woff2"); unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; } /* greek-ext */ @font-face { - font-family: 'Roboto'; + font-family: "Roboto"; font-style: normal; font-weight: 700; font-display: swap; - src: url('~assets/fonts/Roboto-700-greek-ext31.woff2') format('woff2'); + src: url("~assets/fonts/Roboto-700-greek-ext31.woff2") format("woff2"); unicode-range: U+1F00-1FFF; } /* greek */ @font-face { - font-family: 'Roboto'; + font-family: "Roboto"; font-style: normal; font-weight: 700; font-display: swap; - src: url('~assets/fonts/Roboto-700-greek32.woff2') format('woff2'); + src: url("~assets/fonts/Roboto-700-greek32.woff2") format("woff2"); unicode-range: U+0370-03FF; } /* vietnamese */ @font-face { - font-family: 'Roboto'; + font-family: "Roboto"; font-style: normal; font-weight: 700; font-display: swap; - src: url('~assets/fonts/Roboto-700-vietnamese33.woff2') format('woff2'); + src: url("~assets/fonts/Roboto-700-vietnamese33.woff2") format("woff2"); unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB; } /* latin-ext */ @font-face { - font-family: 'Roboto'; + font-family: "Roboto"; font-style: normal; font-weight: 700; font-display: swap; - src: url('~assets/fonts/Roboto-700-latin-ext34.woff2') format('woff2'); + src: url("~assets/fonts/Roboto-700-latin-ext34.woff2") format("woff2"); unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; } /* latin */ @font-face { - font-family: 'Roboto'; + font-family: "Roboto"; font-style: normal; font-weight: 700; font-display: swap; - src: url('~assets/fonts/Roboto-700-latin35.woff2') format('woff2'); - unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; + src: url("~assets/fonts/Roboto-700-latin35.woff2") format("woff2"); + unicode-range: + U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, + U+2193, U+2212, U+2215, U+FEFF, U+FFFD; } /* cyrillic-ext */ @font-face { - font-family: 'Roboto'; + font-family: "Roboto"; font-style: normal; font-weight: 900; font-display: swap; - src: url('~assets/fonts/Roboto-900-cyrillic-ext36.woff2') format('woff2'); + src: url("~assets/fonts/Roboto-900-cyrillic-ext36.woff2") format("woff2"); unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; } /* cyrillic */ @font-face { - font-family: 'Roboto'; + font-family: "Roboto"; font-style: normal; font-weight: 900; font-display: swap; - src: url('~assets/fonts/Roboto-900-cyrillic37.woff2') format('woff2'); + src: url("~assets/fonts/Roboto-900-cyrillic37.woff2") format("woff2"); unicode-range: U+0301, U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; } /* greek-ext */ @font-face { - font-family: 'Roboto'; + font-family: "Roboto"; font-style: normal; font-weight: 900; font-display: swap; - src: url('~assets/fonts/Roboto-900-greek-ext38.woff2') format('woff2'); + src: url("~assets/fonts/Roboto-900-greek-ext38.woff2") format("woff2"); unicode-range: U+1F00-1FFF; } /* greek */ @font-face { - font-family: 'Roboto'; + font-family: "Roboto"; font-style: normal; font-weight: 900; font-display: swap; - src: url('~assets/fonts/Roboto-900-greek39.woff2') format('woff2'); + src: url("~assets/fonts/Roboto-900-greek39.woff2") format("woff2"); unicode-range: U+0370-03FF; } /* vietnamese */ @font-face { - font-family: 'Roboto'; + font-family: "Roboto"; font-style: normal; font-weight: 900; font-display: swap; - src: url('~assets/fonts/Roboto-900-vietnamese40.woff2') format('woff2'); + src: url("~assets/fonts/Roboto-900-vietnamese40.woff2") format("woff2"); unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB; } /* latin-ext */ @font-face { - font-family: 'Roboto'; + font-family: "Roboto"; font-style: normal; font-weight: 900; font-display: swap; - src: url('~assets/fonts/Roboto-900-latin-ext41.woff2') format('woff2'); + src: url("~assets/fonts/Roboto-900-latin-ext41.woff2") format("woff2"); unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; } /* latin */ @font-face { - font-family: 'Roboto'; + font-family: "Roboto"; font-style: normal; font-weight: 900; font-display: swap; - src: url('~assets/fonts/Roboto-900-latin42.woff2') format('woff2'); - unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; + src: url("~assets/fonts/Roboto-900-latin42.woff2") format("woff2"); + unicode-range: + U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, + U+2193, U+2212, U+2215, U+FEFF, U+FFFD; } diff --git a/frontend/assets/css/main.css b/frontend/assets/css/main.css index 74257bd4a..b421c15eb 100644 --- a/frontend/assets/css/main.css +++ b/frontend/assets/css/main.css @@ -17,11 +17,11 @@ } .theme--dark.v-application { - background-color: var(--v-background-base, #1e1e1e) !important; + background-color: rgb(var(--v-theme-background, 30, 30, 30)) !important; } .theme--dark.v-navigation-drawer { - background-color: var(--v-background-base, #1e1e1e) !important; + background-color: rgb(var(--v-theme-background, 30, 30, 30)) !important; } .theme--dark.v-card { @@ -29,11 +29,11 @@ } .left-border { - border-left: 5px solid var(--v-primary-base) !important; + border-left: 5px solid rgb(var(--v-theme-primary)) !important; } .left-warning-border { - border-left: 5px solid var(--v-warning-base) !important; + border-left: 5px solid rgb(var(--v-theme-warning)) !important; } .handle { @@ -56,3 +56,11 @@ text-overflow: ellipsis; max-width: 100%; } + +a { + color: rgb(var(--v-theme-primary)); +} + +.fill-height { + min-height: 100vh; +} diff --git a/frontend/components/Domain/Cookbook/CookbookEditor.vue b/frontend/components/Domain/Cookbook/CookbookEditor.vue index 8b42656f7..1ee47067d 100644 --- a/frontend/components/Domain/Cookbook/CookbookEditor.vue +++ b/frontend/components/Domain/Cookbook/CookbookEditor.vue @@ -1,17 +1,41 @@ + useSeoMeta({ + title: book?.value?.name || "Cookbook", + }); + + return { + book, + slug, + tab, + appendRecipes, + assignSorted, + recipes, + removeRecipe, + replaceRecipes, + canEdit, + dialogStates, + editTarget, + handleEditCookbook, + editCookbook, + actions, + }; + }, +}); + diff --git a/frontend/components/Domain/Group/GroupExportData.vue b/frontend/components/Domain/Group/GroupExportData.vue index 64cf4efe0..fc2f0c05f 100644 --- a/frontend/components/Domain/Group/GroupExportData.vue +++ b/frontend/components/Domain/Group/GroupExportData.vue @@ -7,21 +7,24 @@ class="elevation-0" @click:row="downloadData" > -