diff --git a/.github/dependabot.yml b/.github/dependabot.yml index e474455f..18232995 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -15,6 +15,13 @@ updates: schedule: interval: "weekly" open-pull-requests-limit: 5 + ignore: + - dependency-name: "eslint" + update-types: + - "version-update:semver-major" + - dependency-name: "@eslint/js" + update-types: + - "version-update:semver-major" groups: frontend-dependencies: patterns: diff --git a/SESSION.md b/SESSION.md index e3b5508e..7ab82f25 100644 --- a/SESSION.md +++ b/SESSION.md @@ -13,4 +13,3 @@ docker inspect newsletter-maker-django-1 --format '{{json .Mounts}}' pytest core/tests/test_embeddings.py -q ruff check core/management/commands/seed_demo.py core/tests/test_embeddings.py ``` - diff --git a/celerybeat-schedule b/celerybeat-schedule deleted file mode 100644 index 6c433076..00000000 Binary files a/celerybeat-schedule and /dev/null differ diff --git a/core/management/commands/seed_demo.py b/core/management/commands/seed_demo.py index 86319ba0..e848e8d0 100644 --- a/core/management/commands/seed_demo.py +++ b/core/management/commands/seed_demo.py @@ -1,7 +1,7 @@ from __future__ import annotations from datetime import timedelta -from typing import Any +from typing import Any, cast from django.conf import settings from django.contrib.auth import get_user_model @@ -578,14 +578,15 @@ def _seed_entities(self, tenant: Tenant) -> dict[str, Entity]: def _seed_source_configs(self, tenant: Tenant) -> int: now = timezone.now() for spec in SOURCE_CONFIG_SPECS: + hours_ago = cast(int | None, spec["hours_ago"]) last_fetched_at = None - if spec["hours_ago"] is not None: - last_fetched_at = now - timedelta(hours=spec["hours_ago"]) + if hours_ago is not None: + last_fetched_at = now - timedelta(hours=hours_ago) SourceConfig.objects.create( tenant=tenant, - plugin_name=spec["plugin_name"], + plugin_name=cast(str, spec["plugin_name"]), config=spec["config"], - is_active=spec["is_active"], + is_active=cast(bool, spec["is_active"]), last_fetched_at=last_fetched_at, ) return len(SOURCE_CONFIG_SPECS) @@ -829,16 +830,18 @@ def _seed_ingestion_runs(self, tenant: Tenant) -> int: ] now = timezone.now() for spec in run_specs: + started_hours_ago = cast(int, spec["started_hours_ago"]) + duration_minutes = cast(int, spec["duration_minutes"]) run = IngestionRun.objects.create( tenant=tenant, - plugin_name=spec["plugin_name"], - status=spec["status"], - items_fetched=spec["items_fetched"], - items_ingested=spec["items_ingested"], - error_message=spec["error_message"], + plugin_name=cast(str, spec["plugin_name"]), + status=cast(str, spec["status"]), + items_fetched=cast(int, spec["items_fetched"]), + items_ingested=cast(int, spec["items_ingested"]), + error_message=cast(str, spec["error_message"]), ) - run.started_at = now - timedelta(hours=spec["started_hours_ago"]) - run.completed_at = run.started_at + timedelta(minutes=spec["duration_minutes"]) + run.started_at = now - timedelta(hours=started_hours_ago) + run.completed_at = run.started_at + timedelta(minutes=duration_minutes) run.save(update_fields=["started_at", "completed_at"]) return len(run_specs) diff --git a/core/tests/test_admin.py b/core/tests/test_admin.py index 0aede5b5..301cb7a0 100644 --- a/core/tests/test_admin.py +++ b/core/tests/test_admin.py @@ -6,8 +6,22 @@ from django.contrib.admin.sites import AdminSite from django.utils import timezone -from core.admin import ContentAdmin, IngestionRunAdmin, ReviewQueueAdmin, SourceConfigAdmin -from core.models import Content, IngestionRun, ReviewQueue, ReviewReason, RunStatus, SourceConfig, SourcePluginName, Tenant +from core.admin import ( + ContentAdmin, + IngestionRunAdmin, + ReviewQueueAdmin, + SourceConfigAdmin, +) +from core.models import ( + Content, + IngestionRun, + ReviewQueue, + ReviewReason, + RunStatus, + SourceConfig, + SourcePluginName, + Tenant, +) pytestmark = pytest.mark.django_db diff --git a/docs/GENRES.md b/docs/GENRES.md deleted file mode 100644 index 7a8009f7..00000000 --- a/docs/GENRES.md +++ /dev/null @@ -1,40 +0,0 @@ -# Genres and Layout of Newsletter - -## Reusable Templates - -- **Hook/Personal Note:** A 150-300 word opening hook. -- **The Main Dish:** Your core article or curated insight. -- **"ABCs" or Recurring Segments:** Aphorisms (quotes), Books, Cool tools, or links. -- **Call to Action (CTA):** A clear link to your product, service, or social media. - -AI-generated header image for newsletters - -## **Newsletter Genres and Types** - -"State of the industry" newsletters, however wide or narrow that industry is defined. Examples are the programming language newsletters. It is not for ideological newsletters, like a religion might publish. It's not for industries that lack clear boundaries, like food newsletters that cover enormous ground. It's not for self-promotional newsletters. - -### Aggregation Newsletters - -- **Curated Newsletters (Roundups):** Gathers top industry links, articles, or resources, saving subscribers research time. -- **Practical / Educational Newsletters:** Delivers actionable tips, tutorials, "how-to" advice, and "insider" knowledge. -- **Company / Brand Updates:** Keeps subscribers informed about company culture, new products, and official announcements. -- **Magazine Style:** Features short excerpts and multiple links designed to drive traffic back to a website. - -### Single-Article Newsletters - -- **Single Topic Style:** Delivers one long-form, comprehensive topic within the email itself, requiring no clicks. (*The Pragmatic Engineer*) -- **Analytical / Analysis Newsletters:** Offers deep insights, expert opinions, and commentary on industry news, commonly used by experts and SaaS brands. -- **"Letter-from-the-Editor" (Personal Essay):** Focuses on a single, personal, or thought-leadership article from the author, building a direct connection. -- **Episodic / POV Newsletters:** Tells a story over a series of emails (serialized content), building suspense and loyalty. - -### Other - -- **Hybrid Newsletters:** Combines curated content with personalized commentary or promotional information. -- **Artistic / Visual Newsletters:** Focuses on creative, visual content showcasing an author's vision, popular in art-focused businesses. -- **UGC (User-Generated Content):** Highlights customer reviews, testimonials, and fan-tagged photos. - -## Scope - -It seems like the scope of a newsletter topic matters. For example, coming up with content ideas for a recipe, food, fashion, or cosmetics newsletter wouldn't be just referencing new recipes somebody posted on their blog. It would take surfacing original insight - like maybe a newsletter themed to a particular ingredient. - -So there's a contrast between simply reporting "state of the industry" style content like popular articles, and developing a theme for a newsletter and balancing the content to match it. Maybe the system could suggest themes. diff --git a/docs/OLLAMA.md b/docs/OLLAMA.md deleted file mode 100644 index eae69dca..00000000 --- a/docs/OLLAMA.md +++ /dev/null @@ -1,148 +0,0 @@ -## Ollama and LLM Models - -Ollama is an open-source tool designed to run Large Language Models (LLMs) like Llama 3, Mistral, and Gemma directly on your local machine (Windows, macOS, Linux). It simplifies the process of setting up and running AI models, providing a user-friendly CLI to download and manage them without needing complex configurations or cloud subscriptions. - -- Running AI coding assistants. -- Building local RAG (Retrieval-Augmented Generation) applications. -- Chatting with local models for privacy-sensitive work. - -## Model Vendors - -- **Llama (3, 3.1, 4):** Developed by Meta (Facebook). It is a highly influential open-weight model family, known for its general reasoning and ecosystem support. -- **Gemma (2, 3, 4):** Built by Google DeepMind. These models use the same research and technology as Google's Gemini models but are optimized for local performance. -- **Mistral / Mixtral:** Created by Mistral AI, a French company. They use the "Mixture of Experts" (MoE) architecture. This allows the models to be intelligent and efficient enough to run on consumer hardware. -- **DeepSeek-R1 (by DeepSeek-AI):** This model is designed for reasoning. It is considered one of the highest-rated open models for math, logic, and reasoning. -- **Qwen (3, 3.5) (by Alibaba Cloud):** It is considered one of the best models for coding and technical tasks. It often outperforms other open models in programming benchmarks. -- **Command R / R+ (by Cohere):** This model is designed for RAG (Retrieval-Augmented Generation). It is optimized for using long documents as context and is useful for tasks like summarization and professional writing. - -## Speed - -| Model Size | Where it runs | Estimated Speed (Tokens/Sec) | User Experience | -| :------------------------------ | :------------- | :--------------------------- | :----------------------------------------- | -| **8B (Llama 3, Qwen)** | Mostly GPU | **15–20+ t/s** | Very fast; faster than a human can read. | -| **14B–32B (Gemma, DeepSeek)** | Split GPU/CPU | **3–8 t/s** | Usable; like watching a fast typist. | -| **70B+ (Llama 3.1, Command R)** | Mostly CPU/RAM | **1–2 t/s** | Very slow; best for long background tasks. | - -## Quant - -The "B" refers to number of parameters in billions. A larger model at low quantization usually beats a small model at high quantization. For example, a **Llama 70B** compressed to **4-bit (Q4)** will almost always be much smarter than a **Llama 8B** running at "perfect" **16-bit (FP16)**, even though they might take up similar amounts of RAM. The jump in "intelligence" from a high-quality 8-bit (Q8) version to the full 16-bit version is mathematically measurable but practically invisible to a human user. - -- **FP16 (16-bit):** The "original" high-quality version. It uses 2 bytes per number. A 7B model takes ~14GB of RAM. -- **Q8 (8-bit):** Uses 1 byte per number. This is almost indistinguishable from the original in quality but cuts the RAM requirement in half (~7GB for a 7B model). -- **Q4 (4-bit):** The "sweet spot." It uses only half a byte per number. A 7B model now only needs ~3.5GB to 4GB of RAM. You lose about 1–5% in accuracy, but the model becomes 3–4x faster. -- **Q2 (2-bit):** Extreme compression. The model becomes very small and fast, but it often starts to "hallucinate" or lose its ability to follow complex logic. - -**Decoding the Suffixes (e.g., Q4_K_M)** - -- **Q4:** The number of bits (4-bit). -- **_K:** "K-Quants," a modern method that uses higher precision for the most important parts of the model and lower precision for the less important ones. -- **_S, _M, _L:** Small, Medium, or Large versions of that bit-level. **_M (Medium)** is usually the recommended default as it balances size and smarts perfectly. - -## Large Models - -- **Llama 3.1 405B:** This is currently one of the largest open-weight models. At full FP16 precision, it requires over **800GB**, but using 4-bit (INT4) quantization, it fits into roughly **203GB to 256GB**. A 512GB workstation can run this comfortably while leaving room for a massive context window (KV cache). -- **DeepSeek-V3 (671B):** This "MoE" (Mixture of Experts) model is massive but efficient. At 4-bit quantization, it needs approximately **405GB**. Running this requires the exact 512GB RAM setup you described. -- **Qwen 3.5 397B:** Another massive MoE model that typically requires nearly **200GB to 400GB** depending on the quantization level used. - -## Availability and Licensing - -- **[Llama 3.1](https://ai.meta.com/blog/meta-llama-3-1/) (Meta):** Available for local download and use via [Ollama](https://ollama.com/library/llama3.1) and Hugging Face. It is released under the **Llama 3.1 Community License**, which allows for free commercial and research use for most users. However, companies with over **700 million** monthly active users must request a separate license, and it includes specific "Acceptable Use" restrictions. -- **[DeepSeek-V3](https://github.com/deepseek-ai/deepseek-v3) (DeepSeek-AI):** This model is widely considered "open-weight" and is free to run locally. While originally under a custom license, DeepSeek recently moved their flagship models to the **MIT License**, which is a standard, highly permissive open-source license allowing for unrestricted commercial use, modification, and distribution. -- **[Qwen 3.5](https://www.reddit.com/r/DeepSeek/comments/1s1nesc/qwen_35_vs_deepseekv3_which_opensource_model_is/) (Alibaba Cloud):** Like its predecessors, it is released under the **Apache 2.0 License**, another standard permissive open-source license used for commercial production. - -## AMD GPU - -ROCm allows using AMD GPUs with Llama. The 5000 series is not "officially" supported in the latest professional enterprise lists, it works reliably using a simple override command. After a standard Ollama installation, you just set an environment variable: HSA_OVERRIDE_GFX_VERSION=10.1.0. A 16GB card can hold a 14B model *plus* a large amount of "context" (the documents you are chatting with) entirely on the GPU. - -**The "Sweet Spot" for Your 128GB Build** - -Since you have 128GB, your "Full Quality" ceiling is actually the **70B/72B class** of models: - -| Model | Recommended Quant | Approx. Size | Logic for your Setup | -| :--------------------- | :----------------- | :----------- | :----------------------------------------------------------- | -| **Llama 3.1 70B** | **Q8_0 (8-bit)** | ~75 GB | **High Quality.** Since this is your "General Manager," you want the highest precision. It fits comfortably in 128GB with 50GB to spare. | -| **Qwen 2.5 72B** | **Q6_K (6-bit)** | ~58 GB | **The "Smart" Compromise.** 6-bit is virtually indistinguishable from 8-bit but saves RAM for the messy HTML context you'll be feeding it. | -| **Command R+ (104B)** | **Q4_K_M (4-bit)** | ~63 GB | **Efficiency.** At 104B, 8-bit would consume 104GB+, leaving no room for your Vector DB data. 4-bit is the professional standard for this model. | -| **DeepSeek-V3 (671B)** | **IQ2_M (2-bit)** | ~120 GB | **Experimental.** This is a massive MoE model. At 2-bit, it will *barely* fit. It will be slow and may lose some nuance, but it's the only way to run it on 128GB. | -| **Gemma 2 27B (GPU)** | Q4_K_M (4-bit) | ~16 GB | **Speed.** Fits on your **5800XT** for instant, high-speed drafting (20+ t/s). | -| **Gemma 2 27B (RAM)** | Q8_0 (8-bit) | ~29 GB | **Quality.** Use this if you want the "perfect" version for drafting and don't mind CPU speeds. | - -On your current setup, a **70B model at 8-bit** will be the "smartest" thing you can run comfortably with high reliability. - -For Gemma: - -- **On the GPU (16GB VRAM):** Use **4-bit**. This is the best way to get "ChatGPT-like" typing speeds for your final newsletter summaries. -- **In System RAM (128GB RAM):** Use **8-bit**. If you find the 4-bit version is losing too much "flair" in its writing, move it to your system RAM. It will be slower, but it will use its full 27B parameter "brain" at higher precision - -## Model Choice - -While **Llama 3.1 70B** is the "steady hand" for general logic, **DeepSeek-V3** and **Qwen 2.5/3.5** offer significant advantages for coding and structured data tasks. DeepSeek-V3 is currently the top-performing open-weight model for coding, often outperforming Llama 3.1 in complex Python and SQL tasks. - -**Skill-by-Skill Recommendations** - -| Skill | Best 70B Class Model | Why? | -| :-------------------------------- | :-------------------- | :----------------------------------------------------------- | -| **1. Content Classification** | **Llama 3.1 70B** | Best-in-class instruction following. It handles "nuanced" categories (Opinion vs. Tutorial) with fewer hallucinations. | -| **2. Relevance Scoring** | **Command R+ 104B** | **The RAG Specialist.** It is specifically trained for "citation" and "grounding." It is better than almost any other model at explaining relevance based on a provided reference corpus. | -| **3. Deduplication / Clustering** | **Command R+ 104B** | Its massive context window and "cross-referencing" training make it the best at comparing a new item against multiple existing records to pick a "winner." | -| **4. Summarization** | **Gemma 2 27B** | The "Punchy" Writer. Gemma 2 has a very modern, clean writing style that feels less "AI-generated" than Llama. At 27B, it’s fast enough to run entirely in your 16GB VRAM. Perfect for short tasks like 2–3 sentence newsletter summaries. | -| **5. Theme Detection** | **DeepSeek-V3 (MoE)** | Excellent at "Global Reasoning." It can connect disparate dots across a large batch of ingested content to find emerging patterns. | -| **6. Email Data Extraction** | **Qwen 2.5 72B** | The "JSON King." Qwen is specifically optimized for structured data and HTML parsing; it is much less likely to break the JSON schema than Llama. | -| **7. Entity Extraction** | **Qwen 2.5 72B** | Extremely accurate at identifying obscure company names and matching them to existing profiles without making up new entities. | - -Since you are automating a pipeline, you could have **Command R+** do the heavy analysis in the background (slowly), and then "hand off" the final notes to **Gemma 2** on the GPU to quickly write the user-facing text. - -## Context Window RAM Size - -### How to increase the context window - -You can increase the context window from the model default in three ways: - -1. **For a single session:** - Inside the Ollama chat terminal (`ollama run llama3.1:70b...`), type: - - bash - - ``` - /set parameter num_ctx 32768 - ``` - - *(Note: This resets when you exit the session)*. - -2. **Permanently via a Modelfile:** - Create a file named `Modelfile` and add these two lines: - - dockerfile - - ``` - FROM llama3.1:70b-instruct-q8_0 - PARAMETER num_ctx 32768 - ``` - - Then, create your custom version: - `ollama create llama3.1-70b-32k -f Modelfile`. - -3. **Globally via Environment Variable:** - Set `OLLAMA_NUM_CTX=32768` in your environment variables to apply it to all models by default. - -### Model Memory Comparison Table - -| Model | Install Command | Max Context | Default Context | RAM at 2k / 8k / 32k | RAM at Max Context | -| :--------------------------- | :---------------------------------------------- | :---------- | :-------------- | :------------------- | :----------------- | -| **Llama 3.1 70B (Q8_0)** | `ollama run llama3.1:70b-instruct-q8_0` | 128k | 2k–4k | 76 / 78 / 86 GB | ~132 GB (OOM) | -| **Qwen 2.5 72B (Q4_K_M)** | `ollama run qwen2.5:72b` | 128k | 2k–4k | 48 / 50 / 58 GB | ~104 GB | -| **Qwen3-Embedding:8b** | `ollama pull qwen3-embedding:8b` | 32k | 32k | 6 / 7 / 9 GB | ~9 GB | -| **Command R+ 104B (Q4_K_M)** | `ollama run command-r-plus:104b-08-2024-q4_K_M` | 128k | 4k | 64 / 67 / 79 GB | ~144 GB (OOM) | -| **Gemma 2 27B (Q4_K_M)** | `ollama run gemma2:27b` | 8k | 2k–8k | 18 / 19 / N/A | ~19 GB | - -Notice that **Qwen 2.5 72B** is much more efficient. Even though it is a similar size to Llama 70B, its "Max Context" RAM (~104 GB) fits on your machine because its KV Cache is architecturally smaller (it uses more efficient "Heads"). - -## Token Comparison - -| Unit | Approx. Token Count | -| :---------------------------------- | :----------------------------------------- | -| **1 Word** | 1.3 Tokens | -| **1 Standard Page (Single spaced)** | 500 – 700 Tokens | -| **1 MB of Plain Text** | ~250,000 Tokens | -| **Ollama Default (2k-4k)** | ~1,500 – 3,000 words (Small chapter) | -| **Your "Safe" Max (32k)** | ~24,000 words (Novelette/Technical Manual) | diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 8f734a60..0258c204 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -8,10 +8,10 @@ "name": "newsletter-maker-frontend", "version": "0.1.0", "dependencies": { - "@eslint/js": "^9.39.4", + "@eslint/js": "9.39.4", "@tailwindcss/postcss": "^4.2.4", "@tanstack/react-query": "^5.100.5", - "eslint": "^9.39.4", + "eslint": "9.39.4", "eslint-config-next": "^16.2.4", "eslint-config-prettier": "^10.1.8", "eslint-plugin-jsx-a11y": "^6.10.2", @@ -35,7 +35,7 @@ "@types/react-dom": "19.2.3", "@vitejs/plugin-react": "^6.0.1", "eslint-formatter-compact": "^9.0.1", - "jsdom": "^29.0.2", + "jsdom": "^29.1.0", "typescript": "^6.0.3", "vite-tsconfig-paths": "^6.1.1", "vitest": "^4.1.5" @@ -600,6 +600,34 @@ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, + "node_modules/@eslint/config-array/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" + }, + "node_modules/@eslint/config-array/node_modules/brace-expansion": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", + "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/config-array/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/@eslint/config-helpers": { "version": "0.4.2", "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", @@ -647,6 +675,22 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/@eslint/eslintrc/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" + }, + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", + "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "node_modules/@eslint/eslintrc/node_modules/globals": { "version": "14.0.0", "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", @@ -659,6 +703,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/@eslint/js": { "version": "9.39.4", "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.4.tgz", @@ -865,9 +921,6 @@ "cpu": [ "arm" ], - "libc": [ - "glibc" - ], "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -884,9 +937,6 @@ "cpu": [ "arm64" ], - "libc": [ - "glibc" - ], "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -903,9 +953,6 @@ "cpu": [ "ppc64" ], - "libc": [ - "glibc" - ], "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -922,9 +969,6 @@ "cpu": [ "riscv64" ], - "libc": [ - "glibc" - ], "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -941,9 +985,6 @@ "cpu": [ "s390x" ], - "libc": [ - "glibc" - ], "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -960,9 +1001,6 @@ "cpu": [ "x64" ], - "libc": [ - "glibc" - ], "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -979,9 +1017,6 @@ "cpu": [ "arm64" ], - "libc": [ - "musl" - ], "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -998,9 +1033,6 @@ "cpu": [ "x64" ], - "libc": [ - "musl" - ], "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -1017,9 +1049,6 @@ "cpu": [ "arm" ], - "libc": [ - "glibc" - ], "license": "Apache-2.0", "optional": true, "os": [ @@ -1042,9 +1071,6 @@ "cpu": [ "arm64" ], - "libc": [ - "glibc" - ], "license": "Apache-2.0", "optional": true, "os": [ @@ -1067,9 +1093,6 @@ "cpu": [ "ppc64" ], - "libc": [ - "glibc" - ], "license": "Apache-2.0", "optional": true, "os": [ @@ -1092,9 +1115,6 @@ "cpu": [ "riscv64" ], - "libc": [ - "glibc" - ], "license": "Apache-2.0", "optional": true, "os": [ @@ -1117,9 +1137,6 @@ "cpu": [ "s390x" ], - "libc": [ - "glibc" - ], "license": "Apache-2.0", "optional": true, "os": [ @@ -1142,9 +1159,6 @@ "cpu": [ "x64" ], - "libc": [ - "glibc" - ], "license": "Apache-2.0", "optional": true, "os": [ @@ -1167,9 +1181,6 @@ "cpu": [ "arm64" ], - "libc": [ - "musl" - ], "license": "Apache-2.0", "optional": true, "os": [ @@ -1192,9 +1203,6 @@ "cpu": [ "x64" ], - "libc": [ - "musl" - ], "license": "Apache-2.0", "optional": true, "os": [ @@ -1397,9 +1405,6 @@ "cpu": [ "arm64" ], - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -1416,9 +1421,6 @@ "cpu": [ "arm64" ], - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -1435,9 +1437,6 @@ "cpu": [ "x64" ], - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -1454,9 +1453,6 @@ "cpu": [ "x64" ], - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -1645,9 +1641,6 @@ "arm64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -1665,9 +1658,6 @@ "arm64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -1685,9 +1675,6 @@ "ppc64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -1705,9 +1692,6 @@ "s390x" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -1725,9 +1709,6 @@ "x64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -1745,9 +1726,6 @@ "x64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -2000,9 +1978,6 @@ "cpu": [ "arm64" ], - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -2019,9 +1994,6 @@ "cpu": [ "arm64" ], - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -2038,9 +2010,6 @@ "cpu": [ "x64" ], - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -2057,9 +2026,6 @@ "cpu": [ "x64" ], - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -2098,6 +2064,64 @@ "node": ">=14.0.0" } }, + "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/core": { + "version": "1.8.1", + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.1.0", + "tslib": "^2.4.0" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/runtime": { + "version": "1.8.1", + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/wasi-threads": { + "version": "1.1.0", + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@napi-rs/wasm-runtime": { + "version": "1.1.1", + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.7.1", + "@emnapi/runtime": "^1.7.1", + "@tybys/wasm-util": "^0.10.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Brooooooklyn" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@tybys/wasm-util": { + "version": "0.10.1", + "inBundle": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/tslib": { + "version": "2.8.1", + "inBundle": true, + "license": "0BSD", + "optional": true + }, "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { "version": "4.2.4", "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.2.4.tgz", @@ -2530,42 +2554,6 @@ "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/balanced-match": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", - "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", - "license": "MIT", - "engines": { - "node": "18 || 20 || >=22" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", - "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", - "license": "MIT", - "dependencies": { - "balanced-match": "^4.0.2" - }, - "engines": { - "node": "18 || 20 || >=22" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { - "version": "10.2.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", - "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", - "license": "BlueOak-1.0.0", - "dependencies": { - "brace-expansion": "^5.0.5" - }, - "engines": { - "node": "18 || 20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/@typescript-eslint/utils": { "version": "8.59.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.59.0.tgz", @@ -2704,9 +2692,6 @@ "cpu": [ "arm64" ], - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -2720,9 +2705,6 @@ "cpu": [ "arm64" ], - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -2736,9 +2718,6 @@ "cpu": [ "ppc64" ], - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -2752,9 +2731,6 @@ "cpu": [ "riscv64" ], - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -2768,9 +2744,6 @@ "cpu": [ "riscv64" ], - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -2784,9 +2757,6 @@ "cpu": [ "s390x" ], - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -2800,9 +2770,6 @@ "cpu": [ "x64" ], - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -2816,9 +2783,6 @@ "cpu": [ "x64" ], - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -3307,10 +3271,13 @@ } }, "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "license": "MIT" + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } }, "node_modules/baseline-browser-mapping": { "version": "2.10.23", @@ -3335,13 +3302,15 @@ } }, "node_modules/brace-expansion": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", - "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", + "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", "license": "MIT", "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" } }, "node_modules/braces": { @@ -4076,52 +4045,23 @@ } } }, - "node_modules/eslint-config-prettier": { - "version": "10.1.8", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.1.8.tgz", - "integrity": "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==", - "license": "MIT", - "bin": { - "eslint-config-prettier": "bin/cli.js" - }, - "funding": { - "url": "https://opencollective.com/eslint-config-prettier" - }, - "peerDependencies": { - "eslint": ">=7.0.0" - } - }, - "node_modules/eslint-formatter-compact": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/eslint-formatter-compact/-/eslint-formatter-compact-9.0.1.tgz", - "integrity": "sha512-mBAti2tb403dQGMyilQTYHU80stem3N7jdtKW+tmn5gj3JNF7ki0rgCZtJFw4iMayTH862FTUIqCdp70ug0S0Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/eslint-import-resolver-node": { - "version": "0.3.10", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.10.tgz", - "integrity": "sha512-tRrKqFyCaKict5hOd244sL6EQFNycnMQnBe+j8uqGNXYzsImGbGUU4ibtoaBmv5FLwJwcFJNeg1GeVjQfbMrDQ==", - "license": "MIT", - "dependencies": { - "debug": "^3.2.7", - "is-core-module": "^2.16.1", - "resolve": "^2.0.0-next.6" - } + "node_modules/eslint-config-next/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" }, - "node_modules/eslint-import-resolver-node/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "node_modules/eslint-config-next/node_modules/brace-expansion": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", + "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", "license": "MIT", "dependencies": { - "ms": "^2.1.1" + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" } }, - "node_modules/eslint-import-resolver-typescript": { + "node_modules/eslint-config-next/node_modules/eslint-import-resolver-typescript": { "version": "3.10.1", "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.10.1.tgz", "integrity": "sha512-A1rHYb06zjMGAxdLSkN2fXPBwuSaQ0iO5M/hdyS0Ajj1VBaRp0sPD3dn1FhME3c/JluGFbwSxyCfqdSbtQLAHQ==", @@ -4155,33 +4095,7 @@ } } }, - "node_modules/eslint-module-utils": { - "version": "2.12.1", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz", - "integrity": "sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==", - "license": "MIT", - "dependencies": { - "debug": "^3.2.7" - }, - "engines": { - "node": ">=4" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - } - } - }, - "node_modules/eslint-module-utils/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-import": { + "node_modules/eslint-config-next/node_modules/eslint-plugin-import": { "version": "2.32.0", "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz", "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", @@ -4214,7 +4128,7 @@ "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" } }, - "node_modules/eslint-plugin-import/node_modules/debug": { + "node_modules/eslint-config-next/node_modules/eslint-plugin-import/node_modules/debug": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", @@ -4223,7 +4137,19 @@ "ms": "^2.1.1" } }, - "node_modules/eslint-plugin-import/node_modules/semver": { + "node_modules/eslint-config-next/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eslint-config-next/node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", @@ -4232,6 +4158,77 @@ "semver": "bin/semver.js" } }, + "node_modules/eslint-config-prettier": { + "version": "10.1.8", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.1.8.tgz", + "integrity": "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==", + "license": "MIT", + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "funding": { + "url": "https://opencollective.com/eslint-config-prettier" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-formatter-compact": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/eslint-formatter-compact/-/eslint-formatter-compact-9.0.1.tgz", + "integrity": "sha512-mBAti2tb403dQGMyilQTYHU80stem3N7jdtKW+tmn5gj3JNF7ki0rgCZtJFw4iMayTH862FTUIqCdp70ug0S0Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.10", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.10.tgz", + "integrity": "sha512-tRrKqFyCaKict5hOd244sL6EQFNycnMQnBe+j8uqGNXYzsImGbGUU4ibtoaBmv5FLwJwcFJNeg1GeVjQfbMrDQ==", + "license": "MIT", + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.16.1", + "resolve": "^2.0.0-next.6" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz", + "integrity": "sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==", + "license": "MIT", + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, "node_modules/eslint-plugin-jsx-a11y": { "version": "6.10.2", "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz", @@ -4261,6 +4258,34 @@ "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" } }, + "node_modules/eslint-plugin-jsx-a11y/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" + }, + "node_modules/eslint-plugin-jsx-a11y/node_modules/brace-expansion": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", + "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint-plugin-jsx-a11y/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/eslint-plugin-react": { "version": "7.37.5", "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", @@ -4312,6 +4337,34 @@ "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 || ^10.0.0" } }, + "node_modules/eslint-plugin-react/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" + }, + "node_modules/eslint-plugin-react/node_modules/brace-expansion": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", + "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint-plugin-react/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/eslint-plugin-react/node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -4358,6 +4411,22 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/eslint/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" + }, + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", + "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "node_modules/eslint/node_modules/eslint-visitor-keys": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", @@ -4370,6 +4439,18 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/espree": { "version": "10.4.0", "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", @@ -5405,28 +5486,28 @@ } }, "node_modules/jsdom": { - "version": "29.0.2", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-29.0.2.tgz", - "integrity": "sha512-9VnGEBosc/ZpwyOsJBCQ/3I5p7Q5ngOY14a9bf5btenAORmZfDse1ZEheMiWcJ3h81+Fv7HmJFdS0szo/waF2w==", + "version": "29.1.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-29.1.0.tgz", + "integrity": "sha512-YNUc7fB9QuvSSQWfrH0xF+TyABkxUwx8sswgIDaCrw4Hol8BghdZDkITtZheRJeMtzWlnTfsM3bBBusRvpO1wg==", "dev": true, "license": "MIT", "dependencies": { - "@asamuzakjp/css-color": "^5.1.5", - "@asamuzakjp/dom-selector": "^7.0.6", + "@asamuzakjp/css-color": "^5.1.11", + "@asamuzakjp/dom-selector": "^7.1.1", "@bramus/specificity": "^2.4.2", - "@csstools/css-syntax-patches-for-csstree": "^1.1.1", + "@csstools/css-syntax-patches-for-csstree": "^1.1.3", "@exodus/bytes": "^1.15.0", "css-tree": "^3.2.1", "data-urls": "^7.0.0", "decimal.js": "^10.6.0", "html-encoding-sniffer": "^6.0.0", "is-potential-custom-element-name": "^1.0.1", - "lru-cache": "^11.2.7", - "parse5": "^8.0.0", + "lru-cache": "^11.3.5", + "parse5": "^8.0.1", "saxes": "^6.0.0", "symbol-tree": "^3.2.4", "tough-cookie": "^6.0.1", - "undici": "^7.24.5", + "undici": "^7.25.0", "w3c-xmlserializer": "^5.0.0", "webidl-conversions": "^8.0.1", "whatwg-mimetype": "^5.0.0", @@ -5688,9 +5769,6 @@ "cpu": [ "arm64" ], - "libc": [ - "glibc" - ], "license": "MPL-2.0", "optional": true, "os": [ @@ -5711,9 +5789,6 @@ "cpu": [ "arm64" ], - "libc": [ - "musl" - ], "license": "MPL-2.0", "optional": true, "os": [ @@ -5734,9 +5809,6 @@ "cpu": [ "x64" ], - "libc": [ - "glibc" - ], "license": "MPL-2.0", "optional": true, "os": [ @@ -5757,9 +5829,6 @@ "cpu": [ "x64" ], - "libc": [ - "musl" - ], "license": "MPL-2.0", "optional": true, "os": [ @@ -5923,15 +5992,18 @@ } }, "node_modules/minimatch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", - "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", - "license": "ISC", + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "license": "BlueOak-1.0.0", "dependencies": { - "brace-expansion": "^1.1.7" + "brace-expansion": "^5.0.5" }, "engines": { - "node": "*" + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/minimist": { diff --git a/frontend/package.json b/frontend/package.json index a38c7677..d3ad6a7c 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -15,10 +15,10 @@ "test:run": "vitest run" }, "dependencies": { - "@eslint/js": "^9.39.4", + "@eslint/js": "9.39.4", "@tailwindcss/postcss": "^4.2.4", "@tanstack/react-query": "^5.100.5", - "eslint": "^9.39.4", + "eslint": "9.39.4", "eslint-config-next": "^16.2.4", "eslint-config-prettier": "^10.1.8", "eslint-plugin-jsx-a11y": "^6.10.2", @@ -42,7 +42,7 @@ "@types/react-dom": "19.2.3", "@vitejs/plugin-react": "^6.0.1", "eslint-formatter-compact": "^9.0.1", - "jsdom": "^29.0.2", + "jsdom": "^29.1.0", "typescript": "^6.0.3", "vite-tsconfig-paths": "^6.1.1", "vitest": "^4.1.5"