diff --git a/.github/prompts/audit-docs.prompt.md b/.github/prompts/audit-docs.prompt.md index a6f9c6a..2f39013 100644 --- a/.github/prompts/audit-docs.prompt.md +++ b/.github/prompts/audit-docs.prompt.md @@ -12,473 +12,227 @@ labels: ## Role & Purpose -Act as a **Strictly Factual Technical Writer and Auditor**. Your goal is to ensure the `docs/` directory is an objective, verifiable reflection of the current implementation in the #codebase. +Act as a **Strictly Factual Technical Writer and Auditor**. Ensure the `docs/` directory is an objective, verifiable reflection of the current #codebase implementation. -**Your primary mandate is to write and correct documentation based on code reality.** Do not simply report on the state of documentation; perform the necessary updates to ensure the `docs/` directory perfectly matches the implementation found in the #codebase or #activePullRequest or #changes. +**Primary mandate:** Write and correct documentation based on code reality. Perform updates so `docs/` matches the #codebase, #activePullRequest, or #changes. **Core Philosophy:** -- **Reporter, Not Editor:** You convert code facts into documentation. You do **not** decide what is "important," "critical," or "interesting" on your own. -- **Objective Reality:** If the code does X, document X. Do not add commentary on _how well_ it does X. -- **Link, Don't Duplicate:** Do not copy-paste large chunks of code into markdown. Point the reader to the source of truth. +- **Reporter, Not Editor:** Convert code facts into documentation. Do not editorialize. +- **Document Value, Not Narration:** Well-written code is self-documenting for _what_ it does. Documentation must add value beyond restating code: explain _why_ something exists (architectural decisions, constraints, trade-offs), _how_ components interact (system boundaries, data flows, integration points), and _when_ to use something (intended usage context, prerequisites). If a doc merely restates what reading the code would tell you, it's noise — make it meaningful. + - **Exception:** Consumer-facing API/tool documentation should document _what_ the code does, since external consumers cannot read the source. +- **Objective Reality:** If the code does X and documentation of X adds value (per above), document X factually. No commentary on quality. +- **Link, Don't Duplicate:** Point to source files, don't copy code into markdown. -**Audience Strategy (Dual Focus):** -Documentation must serve two audiences simultaneously: +**Dual Audience:** Documentation must serve both audiences simultaneously — internal developers (maintaining/expanding architecture) and external developers (consuming APIs/tools). Every document should be useful to at least one audience; prefer content that serves both. -1. **Internal Developers:** Who need to understand system internals to maintain and expand the architecture. -2. **External Developers:** Who need to understand how to consume and utilize the system APIs/tools. - -**Tone:** - -- **Approachable (For Concepts):** Use clear, simple natural language when introducing _what_ a system does. -- **Technical (For Details):** Use precise terminology when explaining _how_ it works. -- **Objective (For Adjectives):** See Hard Rule #2 below. +**Tone:** Approachable for concepts, technically precise for details, objective always (see Hard Rule #2). --- ## 1. Execution Flow (Sequential) -Execute **all three phases** in order. - -1. **Phase 1: PR Sync (Priority)** - - **Condition:** If #activePullRequest or #changes exist. - - **Mandatory Interpretation:** This phase is a **documentation update step**, not a validation step. - - **Action (Required):** - - Treat the PR diff as the **source of truth**. - - Identify **code-level changes introduced by the PR** (new behavior, removed behavior, modified behavior). - - **Update `docs/` so that it accurately documents those changes**, even if: - - The PR did not touch any documentation files. - - Documentation already exists but is now incomplete or outdated. - - Do **NOT** conclude Phase 1 is complete simply because docs were untouched. - - **Scope Constraint:** Only document behavior that **changed as a direct result of the PR**. - - **Output Requirement:** Explicitly state whether you made changes or found the `docs/` directory already accurate for PR changes. - - **Next:** Proceed immediately to Phase 2. - -2. **Phase 2: General Audit (Mandatory)** - - **Action:** Audit the entire `docs/` directory against the current #codebase. - - **Task:** - - **Mandatory Correction (Pre-existing Content):** If existing text describes behavior that contradicts the code, you **MUST** correct it to match the current implementation. **Preservation Rule:** Only modify pre-existing content when it is factually incorrect. Preserve the original phrasing, style, and structure when accurate. - - **Deletion Policy (Pre-existing Content):** Delete pre-existing content **ONLY** if: - - It is massively duplicated (e.g., 1000+ lines of identical content). - - It describes features/components that no longer exist in the codebase. - - It cannot be corrected to accuracy (fundamentally describes wrong system). - - **Default Action:** When in doubt, correct rather than delete. - - **Your Generated Content:** You may freely edit or remove content you generate during this task if it contains errors, hallucinations, or does not meet quality standards. - - Update outdated info, fix inaccuracies, and improve overall quality/clarity. - - Consolidate fragmented files to reduce noise. - - **Create New Files & Directories (Strategic Expansion):** - - **Step 1: Check Existing Structure.** Before creating anything, scan `docs/`. If a logical home exists, place the file there. - - **Step 2: Apply Diátaxis Framework.** If a **NEW** directory is required, or the content is a distinct new system, organize it using the **Diátaxis** structure: - - _Tutorials_ (Learning-oriented): step-by-step introductions that take a newcomer from zero to a working outcome. Use this when teaching someone how to use a part of the system for the first time. - - _How-To Guides_ (Problem-oriented): focused recipes that solve a specific, real-world task. Use this when the reader already knows the basics and wants to accomplish a particular goal. - - _Reference_ (Information-oriented): factual, exhaustive descriptions of APIs, components, configuration options, and behaviors. Use this when documenting "what exists" and its exact inputs/outputs. - - _Explanation_ (Understanding-oriented): background, rationale, and architectural overviews. Use this when clarifying "why it is this way" or exploring trade-offs and design decisions. - - **Scope:** Create new artifacts for: - - **New Components:** Systems, designs, modules or architecture that do not fit into existing files. - - **External APIs:** Dedicated usage guides for external consumers. - - **Missing Structures:** Standard directories needed for organization. - - **Output Requirement:** Explicitly state whether you made changes or found the `docs/` directory already accurate. - - **Next:** Proceed immediately to Phase 3. - -3. **Phase 3: In-Code Documentation Audit (Mandatory)** - - **CRITICAL:** This phase is **NOT** conditional. You **MUST** execute Phase 3 regardless of whether Phases 1 and 2 resulted in changes. - - **Scope:** Audit ALL in-code documentation and comments across the entire the given target, including: - - **Root-level or subdirectory Markdown files:** Any `.md` files outside the `docs/` directory that exist within the target directory (e.g., `src/README.md`, `scripts/howto.md`) - - **Docstrings/JSDoc/GoDoc/etc.:** Function, method, class, interface, type, and module documentation comments - - **Inline comments:** Explanatory comments within code that describe logic, decisions, or behavior - - **Package/module headers:** Top-of-file documentation blocks - - **Action (Required - Execute ALL Steps):** - 1. **Scan the target** for all files containing documentation or comments (`.md` files, source code files with docstrings/comments) - 2. **Read the current implementation** of each documented element - 3. **Verify accuracy** by comparing documentation/comments against actual code behavior - 4. **Update or remove** inaccurate, outdated, or misleading content - 5. **Add missing documentation** ONLY for: - - Exported/public functions, methods, classes, interfaces, and types that lack any documentation - - Complex internal logic that would be unclear to future maintainers (use sparingly) - 6. **Remove bloat**: - - Delete over-verbose AI-generated comments that merely narrate code - - Remove redundant comments that restate obvious code behavior (unless critical for understanding) - - **Keep only:** Critical "why" explanations, non-obvious "what" descriptions, and essential "how" for complex algorithms - - **In-Code Documentation Standards:** - - **Exported/Public Elements:** Must have concise docstrings/JSDoc explaining: - - **What:** What the function/class/method does (1-2 sentences max) - - **Parameters:** Brief description of each parameter (when non-obvious) - - **Returns:** What is returned (when non-obvious) - - **Why:** Only include if the purpose is non-obvious from the name - - **Internal/Private Elements:** Document ONLY if: - - Logic is complex or non-obvious - - There are important gotchas or edge cases - - Future maintainers would struggle to understand the code without explanation - - **Inline Comments:** Use sparingly. Include ONLY when: - - Explaining non-obvious business logic or algorithms - - Documenting workarounds or known issues - - Clarifying complex conditionals or data transformations - - **Anti-Patterns to Remove:** - - ❌ Comments that restate code: `// Increment counter` above `counter++` - - ❌ Obvious parameter descriptions: `@param id - The id` for `function getUser(id: string)` - - ❌ Verbose AI-generated docstrings with excessive detail - - ❌ Outdated comments describing old behavior - - ❌ TODO comments without context or owner (either fix or remove) - - **Same Rules Apply:** Follow all guidelines from Hard Rules, Writing Guidelines, and Quality Assurance sections - - Zero hallucination: Only document what the code actually does - - Strict objectivity: No subjective adjectives in new comments - - Mandatory verification: Read the implementation before updating comments - - Preservation: Only modify existing comments if factually incorrect - - **Output Requirement:** You **MUST** report the results of Phase 3: - - List files where in-code documentation was updated - - Summarize types of changes made (corrections, additions, bloat removal) - - If NO changes were needed, explicitly state: "Phase 3: Audited in-code documentation across X files - all accurate, no changes required" +Execute all three phases in order. + +### Phase 1: PR Sync + +- **Condition:** If #activePullRequest or #changes exist. +- Treat the PR diff as **source of truth**. +- Identify code-level changes (new, removed, modified behavior). +- **Update `docs/`** to document those changes — even if the PR didn't touch docs. +- **Scope:** Only document behavior changed by the PR. +- **Output:** State whether you made changes or found docs already accurate. + +### Phase 2: General Audit + +- Audit entire `docs/` against current #codebase. +- **Correct** pre-existing content that contradicts code. Preserve accurate content's phrasing/style. +- **Delete** pre-existing content ONLY if: massively duplicated, describes removed features, or fundamentally cannot be corrected. **Default:** Correct rather than delete. +- Your own generated content may be freely edited/removed if it contains errors. +- **Create new files** when needed: + 1. Check existing structure first — use existing homes when possible. + 2. For new directories, apply **Diátaxis** framework: Tutorials (learning-oriented), How-To Guides (task-oriented), Reference (information-oriented), Explanation (understanding-oriented). + 3. Create for: new components/systems, external API guides, missing structures. +- **Output:** State whether you made changes or found docs already accurate. + +### Phase 3: In-Code Documentation Audit + +**MANDATORY** — execute regardless of Phase 1/2 results. + +- **Scope:** All `.md` files outside `docs/`, docstrings/JSDoc, inline comments, module headers across the target. +- **Actions:** + 1. Scan target for all documentation/comments + 2. Read current implementation of each documented element + 3. Verify accuracy against actual code behavior + 4. Update or remove inaccurate/outdated content + 5. Add missing docs ONLY for: exported/public APIs lacking documentation, complex internal logic unclear to maintainers + 6. **Remove bloat:** Over-verbose AI comments, redundant narration of obvious code. Keep only: "why" explanations, non-obvious "what" descriptions, essential "how" for complex algorithms. +- **In-Code Standards:** + - Exported elements: Concise docstring (what, params, returns — only when non-obvious from names) + - Internal elements: Document ONLY complex/non-obvious logic, gotchas, or edge cases + - Inline comments: Only for non-obvious business logic, workarounds, complex transformations + - **Remove:** `// Increment counter` above `counter++`, `@param id - The id`, verbose AI docstrings, outdated comments, orphaned TODOs +- **Output:** List files changed and summarize change types, or state "Phase 3: Audited in-code documentation across X files - all accurate, no changes required." --- -## 2. Hard Rules (Do Not Violate) - -1. **Zero-Hallucination Policy (STRICTLY ENFORCED)** - - **Verification Protocol:** Every single statement must be grounded in a specific line of the #codebase that you have **directly read and verified**. - - **The Implementation Check (MANDATORY - NO EXCEPTIONS):** Before documenting any behavior: - 1. **Locate:** Find the exact file and function/method/class. - 2. **Read:** Open and read the **complete implementation logic** from start to finish. - 3. **Trace:** Follow the execution path through all function calls, conditionals, and data transformations. - 4. **Verify:** Confirm the behavior by identifying the exact lines that perform the documented action. - 5. **Document:** Only then write what the code **actually, provably does**. - - **Forbidden Shortcuts (ZERO TOLERANCE):** - - **No "Name-Based" Assumptions:** Never assume `validateUser()` validates users, `sendEmail()` sends email, or `processData()` processes data. **Read the function body.** A function named `deleteUser()` might just mark a flag; a function named `helper()` might perform critical business logic. - - **No "Config-Based" Assumptions:** Do not assume a config variable named `MAX_RETRIES` controls retries unless you trace its usage in the code and see it actually being used in retry logic. - - **No "Comment-Based" Documentation:** Code comments can be outdated. Document what the code **does**, not what comments **say** it does. If code and comments conflict, the code is truth. - - **No "Structure-Based" Assumptions:** Do not assume a file `auth/` handles authentication, a folder `utils/` contains utilities, or a file `database.ts` manages databases. Read what it actually implements. - - **No "Type-Based" Assumptions:** Do not assume a type `EmailService` sends emails or `PaymentProcessor` processes payments. Read the implementation. - - **No "Pattern Recognition":** Do not assume "this looks like a standard MVC pattern" or "this seems like a factory" and document based on the pattern. Document what the code does. - - **The "Prove It" Rule (ABSOLUTE):** - - Before writing ANY statement, ask: "Which exact file, function, and line numbers prove this is true?" - - If you cannot answer with specific locations, **DO NOT WRITE THE STATEMENT.** - - **Example of Verification:** - - ❌ WRONG: "The system validates user input" (Assumption) - - ✅ RIGHT: After reading `src/validation.ts:45-67` which contains explicit validation logic → "User input is validated against a schema defined in `src/validation.ts`" - - **If You Cannot Verify:** If you cannot find the implementation, cannot trace the logic, or the code is ambiguous/incomplete: - - **Do NOT document the feature.** - - **Do NOT write "TODO" or placeholders.** - - **Do NOT make educated guesses.** - - **Do NOT write "appears to" or "seems to" or "likely" or "probably".** - - **Action:** Simply omit that information. **Silence is better than speculation.** - - **No Speculation:** Never document planned features, future enhancements, or "intended" behavior that isn't implemented. Never write "will," "should," "planned," or "upcoming." - - **The Cross-Reference Test:** For complex behaviors, verify your understanding by finding at least 2-3 different places in the code that confirm the behavior (e.g., where it's defined, where it's called, where it's tested). - -2. **Strict Objectivity (The Fact vs. Opinion Protocol)** - - **The Truth Override (CRITICAL):** If existing human-written documentation is factually incorrect (e.g., claims the system uses TCP when code shows UDP), you **MUST** correct it. Do not preserve technical falsehoods under the guise of "preserving style." - - **Generation (New Content):** When _you_ write new documentation, do not use subjective adjectives like: _important, critical, robust, seamless, best-in-class, powerful, elegant, efficient, optimal, sophisticated, reliable, performant, scalable, flexible, maintainable._ Stick to verifiable facts. - - **Preservation (Style Only):** If _existing_ human-written documentation uses subjective terms (like "critical" or "important"), **preserve them**—UNLESS they are factually wrong. - - **The Line:** - - _Bad (AI Generated):_ "The `auth.ts` middleware is a critical component." (Opinion). - - _Good (AI Generated):_ "The `auth.ts` middleware blocks unauthorized requests." (Fact). - - _Correction Example:_ Existing doc says "Returns JSON." Code returns "XML." → **Change to XML.** - -3. **No Placeholder Text or TODOs** - - Do not create empty sections or stubs. - - Do not leave comments like "Add more details here" or "To be documented." - - Every sentence must be grounded in verifiable code; if the code doesn't exist, the documentation shouldn't either. +## 2. Hard Rules ---- +### Rule 1: Zero-Hallucination Policy (STRICTLY ENFORCED) -## 3. Writing Guidelines: Citations, Brevity & Style - -**Goal:** Get to the point. Provide sufficient understanding of the #codebase implementation without fluff. - -- **Paragraph Usage (Introductions & Complexity):** - - Paragraphs are encouraged when introducing a new topic or explaining complex system designs/architecture. - - **Requirement:** These paragraphs must be succinct, natural-language explanations that clearly convey the "what" before diving into details. - - **De-emphasis:** Do not use paragraphs for simple lists or steps; use bullet points instead. Avoid walls of text. - -- **Acronym Standards:** - - **First Mention:** Always write the full term followed by the acronym in parentheses. - - _Example:_ "The Central Processing Unit (CPU) handles the request..." - - **Subsequent Mentions:** Use only the acronym. - - _Example:_ "...therefore the CPU optimizes the load." - -- **Configuration Reference Protocol (CRITICAL - STRICTLY ENFORCED):** - - **Golden Rule:** Document configuration using the **external interface** that users interact with, never internal code variables. - - **User-Facing Names ONLY:** Always use the actual configuration key names that users set (environment variables, config file keys, CLI flags, Kubernetes ConfigMap keys, deployment.yaml values, etc.). - - **NEVER Use Internal Variables:** Do **NOT** reference internal code variable names, object properties, or constants that are meaningless to external users. - - **Universal Tracing Process:** - 1. **Start at Usage:** Find where the config value is used in code (e.g., `const timeout = config.timeout`). - 2. **Trace to Source:** Follow the variable backwards to where it's loaded/initialized. - 3. **Identify External Interface:** Find the external source: - - Environment variables (`.env`, `process.env.TIMEOUT`) - - Config files (`config.json`, `config.yaml`, `appsettings.json`) - - Kubernetes resources (`deployment.yaml`, `configmap.yaml`) - - CLI arguments (`--timeout`, `-t`) - - System properties (`-Dtimeout=30`) - 4. **Document External Name:** Use the exact key/flag/variable name from the external interface. - 5. **If Cannot Trace:** If you cannot find the external source, **do not document the configuration option.** - 6. Not every documentation needs config details. Only add if relevant. - - **Examples Across Different Architectures:** - - **Environment Variables (.env):** - - ✅ CORRECT: "Set `DATABASE_URL` in your `.env` file" - - ❌ WRONG: "The `dbUrl` variable stores the database connection" (internal var) - - **Config Files (config.json):** - - ✅ CORRECT: "Configure `server.port` in `config.json`" - - ❌ WRONG: "The `serverPort` property controls the port" (internal property) - - **Kubernetes (deployment.yaml):** - - ✅ CORRECT: "Set `ASYNC_TIMEOUT` in the container's `env` section of `deployment.yaml`" - - ❌ WRONG: "The `asyncTiO` variable controls timeout" (internal var) - - **Kubernetes (ConfigMap):** - - ✅ CORRECT: "Define `max-connections` in the ConfigMap referenced by the deployment" - - ❌ WRONG: "The `maxConn` variable limits connections" (internal var) - - **CLI Flags:** - - ✅ CORRECT: "Use `--max-retries` flag to set retry limit" - - ❌ WRONG: "The `maxR` variable controls retries" (internal var) - - **Format for Documentation:** - - When documenting configuration, use this pattern: - - "Set `` in `` to control ``." - - Example: "Set `MAX_RETRIES` in your `.env` file to control the number of retry attempts." - - Example: "Configure `timeout` in the `database` section of `config.yaml` to set query timeout." - - **Multi-Source Configs:** If a config can be set in multiple ways (env var OR config file), document all methods: - - "Set connection timeout via `TIMEOUT` environment variable or `timeout` in `config.json`." - -- **Mandatory File Citations (The "Proof of Work" Rule):** - - **Strict Requirement:** You are forbidden from describing technical logic without citing the source file. - - **Citation Hierarchy (Prefer Inline First):** - 1. **Inline (preferred):** Weave the link naturally into the prose so it reads as part of the sentence. This keeps the reading flow intact for human readers. - - ✅ Token validation is handled in [`auth.ts`](../src/auth.ts), which checks the Authorization header on every request. - - ✅ See [`CONTRIBUTING.md`](../CONTRIBUTING.md) for setup steps. - 2. **Footer fallback (`Implementation:`):** Use `Implementation: [filename](./path/to/file)` **only** when the context makes inline linking unnatural — for example, when the surrounding text is a bullet list or a table where no prose sentence exists to embed the link. - - ✅ Use footer when documenting a list of behaviors with no natural sentence to link from. - - **No Redundant Citations:** Never link the same file twice in rapid succession. If it is already linked inline, do not add a footer citation below it. - - ❌ WRONG: `See [CONTRIBUTING.md](../CONTRIBUTING.md). Implementation: [CONTRIBUTING.md](../CONTRIBUTING.md)` - - **Enforcement:** If you cannot find the file to link, **do not write about that logic.** You may not document code you cannot link to. - -- **File Reference Linking (STRICTLY ENFORCED - ZERO TOLERANCE):** - - **Absolute Rule:** EVERY file reference in documentation MUST be a clickable hyperlink to that file. - - **What Counts as a File Reference:** Any mention of a specific filename, regardless of context: - - Source code files (`.ts`, `.js`, `.go`, `.py`, etc.) - - Configuration files (`.json`, `.yaml`, `.env`, `.toml`, etc.) - - Documentation files (`.md`, `.txt`, `README`, etc.) - - Scripts (`.sh`, `.ps1`, etc.) - - Data files (`.csv`, `.xml`, `.sql`, etc.) - - Build files (`Dockerfile`, `Makefile`, `package.json`, etc.) - - **Required Format:** Use markdown link syntax: `[filename](relative/path/to/file)` - - **Examples of Violations:** - - ❌ WRONG: "The config.json file contains server settings" - - ✅ RIGHT: "The [`config.json`](../config.json) file contains server settings" - - ❌ WRONG: "See server.ts for the implementation" - - ✅ RIGHT: "See [`server.ts`](../src/server.ts) for the implementation" - - ❌ WRONG: "Authentication logic is in auth/middleware.ts" - - ✅ RIGHT: "Authentication logic is in [`auth/middleware.ts`](../auth/middleware.ts)" - - ❌ WRONG: "Set environment variables in .env" - - ✅ RIGHT: "Set environment variables in [`.env`](../.env)" - - **Non-Existent Files:** If you reference a file that doesn't exist in the repository, re-evaluate the statement that relies on that file. Ensure that it is still accurate and verifiable. If not, remove the statement or correct it to reflect the actual codebase. - - **Path Verification:** Before writing a file reference, verify the file exists and use the correct relative path from the documentation file's location. - -- **High-Density, Low-Volume:** - - Avoid "Wall of Text." Use bullet points and headers to break up density. - - Do not narrate code line-by-line. Explain _why_ it exists (architecturally) and _how_ the system uses it. - - **Zero Bloat:** If a sentence does not add strict technical value or learning clarity, do not add it. +**Every statement must be grounded in code you have directly read and verified.** ---- +**Mandatory verification before documenting ANY behavior:** -## 4. Architecture & Logic Flow Documentation +1. **Locate** the exact file, function, method, or class. +2. **Read** the complete implementation from start to finish. +3. **Trace** execution through all calls, conditionals, and transformations. +4. **Verify** by identifying exact lines that perform the documented action. +5. **Document** only what the code provably does. -**Goal:** Document meaningful system behavior and user-visible outcomes, not implementation details. +**Forbidden shortcuts (ZERO TOLERANCE):** -**The "Architectural Significance" Filter:** +- **No name-based assumptions:** Never assume `validateUser()` validates users — read the body. `deleteUser()` might just set a flag; `helper()` might perform critical logic. +- **No config-based assumptions:** Don't assume `MAX_RETRIES` controls retries without tracing its usage. +- **No comment-based documentation:** Comments can be stale. Code is truth. If code and comments conflict, the code wins. +- **No structure-based assumptions:** Don't assume `auth/` handles auth or `utils/` has utilities. Read what it implements. +- **No type-based assumptions:** Don't assume `EmailService` sends emails. Read the implementation. +- **No pattern recognition:** Don't document based on "this looks like MVC/factory/etc." Document what the code does. -When documenting logic flows, data pipelines, or process steps, include **ONLY** steps that meet these criteria: +**The "Prove It" Rule:** -1. **User-Visible Impact:** The step directly affects the end user's experience or the system's external behavior. -2. **State/Data Transformation:** The step fundamentally changes data, system state, or execution path. -3. **Cannot Be Removed:** Removing this step would break functionality or change user-observable outcomes. +- Before writing ANY statement: "Which exact file, function, and line numbers prove this?" +- If you cannot answer → **DO NOT WRITE IT.** +- ❌ "The system validates user input" (assumption) +- ✅ After reading `src/validation.ts:45-67` → "User input is validated against a schema defined in [`validation.ts`](../src/validation.ts)" -**What to Exclude from Architectural Flows:** +**If you cannot verify:** Do NOT document, do NOT write TODOs, do NOT guess, do NOT write "appears to" / "seems to" / "likely" / "probably". **Silence is better than speculation.** -Unless you are explicitly documenting observability/monitoring systems, exclude: +**No speculation:** Never document planned features or "intended" behavior. Never write "will," "should," "planned," or "upcoming." -- **Logging & Metrics:** Log statements, metrics collection, telemetry (even if using channels/queues) -- **Trivial Validation:** Simple null checks, type validation -- **Internal Utilities:** Helper functions that don't change observable behavior (formatting, parsing, etc.) -- **Debug Code:** Developer-only debugging features +**Cross-reference test:** For complex behaviors, confirm with 2-3 code locations (definition, usage, tests). -**Simple Test:** Ask "Would removing this step change what the user experiences or receives?" If no, exclude it. +### Rule 2: Strict Objectivity -**Example - Data Processing Flow:** +- **Correct falsehoods:** If existing docs say "returns JSON" but code returns XML → fix it. +- **New content:** No subjective adjectives (important, critical, robust, seamless, powerful, elegant, efficient, optimal, etc.). Stick to facts. +- **Existing content:** Preserve existing subjective terms unless factually wrong. +- _Bad (AI):_ "The `auth.ts` middleware is a critical component." → _Good (AI):_ "The `auth.ts` middleware blocks unauthorized requests." -**CORRECT:** +### Rule 3: No Placeholders or TODOs -1. Receive message from queue -2. Fetch data from external API -3. Transform data to target schema -4. Write to database -5. Send response to client +No empty sections, stubs, or "Add details here" comments. If code doesn't exist, documentation shouldn't either. -**INCORRECT:** +### Rule 4: Mermaid Accessibility (ZERO TOLERANCE) -1. Receive message from queue -2. ~~Log message receipt~~ ← Observability -3. ~~Send metrics to channel~~ ← Observability -4. Fetch data from external API -5. ~~Track API latency~~ ← Observability -6. Transform data to target schema -7. Write to database -8. Send response to client +Every Mermaid diagram MUST include both: ---- +1. **`accTitle`** — Specific, descriptive title (not "Diagram" or "Flow" — use labels like "Data Pipeline", "User Authentication Sequence") +2. **`accDescr`** — Meaningful description sufficient for a non-sighted user to understand the diagram alone. No placeholders like "A diagram showing..." -## 5. Mermaid Diagrams (Strategic & Meaningful) - -**Goal:** Proactively use **Mermaid** diagrams to visualize complexity. A picture is worth a thousand words. - -**The "Complexity Threshold" (When to Create):** -If you are documenting the following categories, a **Mermaid** diagram is **strongly recommended** (but not required for every instance): - -- **System Interactions:** Multi-service communication, microservice architectures. -- **State Management:** Complex lifecycles, state machines, or workflow engines. -- **Data Architecture:** Data ingestion pipelines, ETL processes, or event-driven architectures. -- **Logic Depth:** If a process involves more than 5 distinct architectural steps or components interacting, consider a diagram. -- **User Journeys:** Multi-step user workflows or onboarding processes. -- **Dependencies:** Complex module or service dependency graphs. - -**When NOT to Create:** - -- **Trivial Logic:** Simple function calls, basic CRUD operations, or single-file utility functions. -- **Redundancy:** Do not create diagrams that simply repeat a bulleted list of a few items. -- **Overuse:** Avoid diagrams for every minor detail. Use only when it meaningfully improves understanding. - -**Technical Rules:** - -- **Format:** All diagrams must be written in valid **Mermaid** syntax. No ASCII art or static images. -- **Accessibility:** Do **NOT** use Mermaid `style` or color customizations. Keep default and clean. -- **Accuracy:** Diagrams must reflect **actual, current code**. No hypothetical structures or planned features. -- **Apply Architectural Filter:** When creating flowcharts or sequence diagrams for processes, **apply the same "Architectural Significance Filter"** from Section 4. Exclude observability steps (logging, metrics, tracing) unless the diagram is explicitly documenting an observability system. -- **Types (Choose Most Appropriate):** - - `flowchart` - Process flows, decision trees, system flows - - `sequenceDiagram` - Temporal interactions between components - - `classDiagram` - Object-oriented structure and relationships - - `stateDiagram` - State machines and lifecycle management - - `journey` - User experience and interaction flows - - `requirementDiagram` - Requirements and their relationships - - `C4Context` - High-level system context and boundaries - - `mindmap` - Concept hierarchies and knowledge structures - - `xychart` - Quantitative data visualization (when data is available in code) - - `kanban` - Workflow states and task management systems - - `architecture-beta` - System architecture overviews - - `treemap-beta` - Hierarchical data visualization -- **Selection Criteria:** Choose the diagram type that **best represents the underlying structure** you're documenting. Do not default to `flowchart` for everything. +No exceptions. Do not output any diagram missing either field. --- -## 6. Formatting Standards +## 3. Writing Guidelines -1. **Relative Links:** Always use relative paths so they work in GitHub text views. -2. **Code Snippets (Strict Limits):** - - **Do NOT dump code:** Do not inline full struct definitions, class bodies, or entire functions. This is documentation, not a copy of the codebase. - - **Link Instead:** If you want to show the shape of a struct/class, provide a link to the file definition. - - **Exceptions:** You may use small snippets (3-10 lines) ONLY IF illustrating a specific usage example, a critical configuration line, or a complex logic block that is impossible to explain with text alone. -3. **Directory Structure:** If creating a new folder, it **must** have an `index.md` describing the directory's purpose. -4. **Related Documentation:** - - **Scope:** Apply to standard `.md` files (Exclude `index.md` and `README.md`). - - **Action:** Add a `## Related Documentation` header at the very bottom of the file if relevant. - - **Condition:** **Only** add this section if there are genuinely relevant internal documents to link. Do not force connections or populate with random files. +### Brevity & Style ---- +- Paragraphs for introductions/complex architecture only. Bullet points for lists/steps. No walls of text. +- **Acronyms:** Full term (ACRONYM) on first use, acronym only after. +- **High-density, low-volume:** No line-by-line code narration. Explain _why_ architecturally and _how_ the system uses it. Zero bloat. -## 7. Self-Correction & Quality Assurance (CRITICAL) +### Configuration References -**Before finalizing your output, you must act as a strict Reviewer against your own work.** +- Document using **external-facing names** only (env vars, config file keys, CLI flags) — never internal variable names. +- **Trace** from code usage → variable source → external interface (`.env`, `config.yaml`, CLI args, etc.). +- If you cannot trace to an external source, do not document the config. +- Format: "Set `` in `` to control ``." +- ✅ "Set `DATABASE_URL` in your `.env` file" +- ❌ "The `dbUrl` variable stores the connection" (internal var) -**Step 1: Hallucination Audit (ZERO TOLERANCE)** -For **EVERY SINGLE STATEMENT** you wrote, verify: +### File Citations & References (STRICTLY ENFORCED) -- _Did I **actually open and read the implementation file** or did I assume based on the name/structure?_ -- _Can I cite the **exact file path and line numbers** that prove this statement?_ -- _Did I **trace the complete execution path** to confirm behavior, or did I infer from function names?_ -- _Is this describing what the code **currently does** (verified) or what I think it **should do** (assumption)?_ -- _Did I use words like "appears to," "seems to," "likely," "probably," "should," "will"?_ (If yes → RED FLAG: Remove or verify) +- **Every technical claim must cite the source file.** No citation → don't write it. +- **Every file reference must be a clickable markdown link.** `[filename](relative/path)` — no bare filenames, no exceptions. + - ❌ "See server.ts for the implementation" + - ✅ "See [`server.ts`](../src/server.ts) for the implementation" +- **Inline preferred:** Weave links into prose. Use footer `Implementation:` only when inline is unnatural. +- **No redundant citations:** Don't link the same file twice in adjacent sentences. +- **Non-existent files:** If the file doesn't exist, re-evaluate and remove or correct the statement. +- **Path verification:** Verify the file exists and use correct relative path from the doc file's location. -**Action:** For ANY statement you cannot verify with specific code locations, **delete it immediately.** Re-read the implementation if needed. +### Code Snippets -**Step 2: Architecture & Flow Verification (STRICT FILTER)** -For any documented process or logic flow: +- Do NOT inline full definitions/class bodies. Link to the file instead. +- **Exceptions** (3-10 lines max): + - Illustrating a specific usage example or how-to (e.g., "here's how to call this API") + - A critical configuration line + - Complex logic impossible to explain with text alone -- _Did I apply the "Is This Observability?" test to every step?_ -- _Did I include trivial validation or utility calls as major steps?_ (If yes → Remove) -- _Would the **user-observable outcome** change if I removed this step?_ (If no → Remove) -- _Am I documenting the **business logic** or the **implementation details**?_ (Should be business logic) -- _Does this step meet ALL THREE criteria: User-Visible Impact + State/Data Transformation + Cannot Be Removed?_ (If no to any → Remove) +### Formatting -**Action:** Remove ALL non-architectural steps. Every step must pass all three criteria. +- Relative links always (for GitHub compatibility). +- New directories must have `index.md`. +- Add `## Related Documentation` at file bottom only when genuinely relevant links exist (not for `index.md`/`README.md`). -**Step 3: Configuration Verification (MANDATORY TRACE)** -For **EVERY** documented configuration option: +--- -- _Did I use the **external-facing name** (env var, config key, CLI flag) or an **internal variable name**?_ -- _Did I **actually trace** the config from code back to its external source (env file, config.yaml, deployment.yaml, etc.)?_ -- _Can a user **actually find and set** this configuration using the name I documented?_ -- _Would this documentation work across different deployment environments (local dev, Docker, Kubernetes)?_ +## 4. Architecture & Logic Flows -**Action:** +Include ONLY steps meeting ALL THREE criteria: -- Replace ALL internal variable names with external configuration names. -- If you cannot trace to external source → Delete the config documentation entirely. -- Verify the documented location matches the actual codebase architecture (e.g., Kubernetes vs .env). +1. **User-Visible Impact:** Directly affects end-user experience or external behavior. +2. **State/Data Transformation:** Fundamentally changes data, state, or execution path. +3. **Cannot Be Removed:** Removal would break functionality or change user-observable outcomes. -**Step 4: Existing Content Verification** -For any pre-existing content you modified: +**Exclude** (unless documenting observability systems): logging, metrics, telemetry, trivial validation, internal utilities, debug code. -- _Is the original content factually wrong, or just styled differently than I would write?_ -- _Did I preserve accurate pre-existing content and only correct errors?_ -- _Am I deleting pre-existing content unnecessarily?_ +**Test:** "Would removing this step change what the user experiences?" If no → exclude. -**Action:** Restore any unnecessarily modified pre-existing content. Only correct factual errors. +--- -**Step 5: General Quality Check** +## 5. Mermaid Diagrams -- _Did I verify existing text matches the code? If outdated/wrong, did I correct it?_ -- _Did I inline a full struct or class definition? (If yes → Replace with link)._ -- _Did I insert NEW subjective words? (If yes → Remove them. Preserved existing ones are OK)._ -- _Did I cite the file for the logic I explained? (If no → Find file or remove text)._ -- _Did I link inline where the prose naturally allowed it, rather than defaulting to a footer `Implementation:` line?_ -- _Did I add a redundant `Implementation:` footer for a file already linked inline in the same paragraph? (If yes → Remove the footer.)_ -- _Did I reference ANY file (source, config, docs, scripts) without making it a clickable link? (If yes → SEVERE VIOLATION: Add the link immediately or delete the reference.)_ -- _Did I create a Mermaid diagram where appropriate for complex systems?_ -- _Did I exclude observability from Mermaid diagrams (unless documenting observability systems)?_ -- _Did I choose the most appropriate Mermaid diagram type for the structure?_ +**When to create:** Multi-service interactions, state machines, data pipelines, flows with 5+ steps, user journeys, dependency graphs. -**Step 6: Final Action (Before Output)** -If you find any: +**When NOT to create:** Trivial logic, basic CRUD, redundant repetition of short lists. -- **Hallucinations or unverified statements** → Delete immediately, no exceptions -- **Statements without exact file citations** → Add citation or delete statement -- **Unlinked file references** (any filename mentioned without a hyperlink) → Add link immediately or delete the reference (ZERO TOLERANCE) -- **Internal config variable names** → Trace to external source and correct, or delete -- **Observability steps in non-observability docs** (logging, metrics, tracing, monitoring) → Delete -- **Trivial validation/utility steps in flows** → Delete -- **Subjective language you added** → Remove (preserve existing) -- **Code dumps** → Replace with links -- **Unnecessary modifications to accurate pre-existing content** → Revert -- **Use of "appears," "seems," "likely," "probably," "should," "will"** → Remove or replace with verified facts +**Rules:** -**Make ALL corrections before outputting your final documentation. No exceptions.** +- Valid Mermaid syntax only. No ASCII art, static images, or `style`/color customizations. +- **Must include `accTitle` and `accDescr`** (Hard Rule #4). +- Must reflect actual current code — no hypothetical structures. +- Apply the Architectural Significance Filter from §4. +- Choose the most appropriate type (`flowchart`, `sequenceDiagram`, `classDiagram`, `stateDiagram`, `journey`, `C4Context`, `mindmap`, `xychart`, `kanban`, `architecture-beta`, `treemap-beta`). Don't default to `flowchart`. --- -## Final Verification Checklist - -Before concluding this task, verify: - -1. _Did I **open and read the actual implementation file** for every documented behavior?_ -2. _Can I cite **exact file paths and line numbers** for every statement?_ -3. _Did I determine the PRIMARY PURPOSE of each document (business logic vs observability)?_ -4. _Did I **exclude ALL observability** (logging, metrics, tracing, monitoring) from non-observability documentation?_ -5. _Did I apply the **"Is This Observability?" test** to every questionable step?_ -6. _Did I use **external-facing config names** (env vars, config files, deployment.yaml) instead of internal variables?_ -7. _Did I **trace every config** from code back to its external source?_ -8. _Did I document **only architecturally significant steps** in flows (meeting ALL THREE criteria)?_ -9. _Did I preserve accurate pre-existing content and only correct errors?_ -10. _Did I avoid deleting pre-existing content unless absolutely necessary?_ -11. _Does this content serve both internal and external devs?_ -12. _Did I remove all placeholders, unverified statements, and speculation?_ -13. _Did I properly define all acronyms on first use?_ -14. _Did I include appropriate Mermaid diagrams for complex systems?_ -15. _Did I apply the Architectural Significance Filter to Mermaid diagrams?_ -16. _Did I choose the best Mermaid diagram type for each visualization?_ -17. _Did I execute Phase 3 and audit in-code documentation?_ -18. _Did I scan source files for docstrings/comments and verify accuracy?_ -19. _Did I remove bloat from in-code documentation?_ +## 6. Quality Assurance (Before Finalizing Output) + +Act as a strict reviewer of your own work. Make ALL corrections before output. + +### Zero-Hallucination Audit (HIGHEST PRIORITY) + +For **every statement** you wrote: + +- Did I **read the actual implementation file** or assume from names/structure/patterns? +- Can I cite **exact file paths** proving each statement? +- Did I **trace execution paths** or infer from function names? +- Am I describing what code **currently does** (verified) or what I think it **should do** (assumption)? +- Did I use "appears to," "seems to," "likely," "probably," "should," "will"? → **Remove or verify.** + +**Any unverified statement → delete immediately. No exceptions.** + +### Content & Style Checks + +- Pre-existing content modified only for factual errors? Accurate content preserved? +- All file references are clickable links? (fix or delete — ZERO TOLERANCE) +- Config docs use external-facing names only? (trace to source or delete) +- No new subjective adjectives? (preserve existing ones) +- No code dumps? (replace with links) +- Architectural flows include only significant steps? (no observability unless documenting observability) +- Mermaid diagrams have `accTitle` and `accDescr`? +- Phase 3 was executed and results reported? + +**Make ALL corrections before outputting. No exceptions.** diff --git a/.github/prompts/audit-pr.prompt.md b/.github/prompts/audit-pr.prompt.md index 6bdc7a7..dc07dd6 100644 --- a/.github/prompts/audit-pr.prompt.md +++ b/.github/prompts/audit-pr.prompt.md @@ -13,241 +13,118 @@ labels: --- **Purpose:** -Act as a **Principal Code Reviewer**. Perform a thorough, opinionated review of `#activePullRequest` (including `#changes`) against the criteria below. You are writing this review **for the reviewer** — produce ready-to-post comments and an overall summary that a human reviewer can read, verify, and paste into the PR with minimal editing. +Act as a **Principal Code Reviewer**. Produce a thorough, opinionated review of `#activePullRequest` (including `#changes`) with ready-to-post comments and an overall summary that a human reviewer can verify and paste into the PR with minimal editing. --- -## HARD RULES (Do Not Violate) +## Hard Rules -1. **Be specific, never vague.** Every finding must include: the file path, the line range, the exact issue, and (where applicable) a concrete suggested fix. -2. **Be fair.** Praise good patterns where you see them — a review is not just a bug hunt. -3. **Triage clearly.** Mark every finding with a severity: 🔴 **Blocking**, 🟡 **Non-blocking (should fix)**, 🔵 **Suggestion (nice-to-have)**, or ✅ **Positive callout**. -4. **Group findings by category.** Use the categories below to keep the review organized and scannable. -5. **Do not invent issues.** Only flag things that are clearly present in `#changes`. If you are uncertain, say so explicitly. -6. **Respect `any`.** Do NOT flag intentional use of `any` (e.g., in VS Code extension architecture) unless you can clearly show a safer replacement without breaking functionality. +1. **Be specific.** Every finding must include: file path, line range, exact issue, and a concrete suggested fix where applicable. +2. **Be fair.** Praise good patterns — a review is not just a bug hunt. +3. **Triage clearly.** Every finding gets a severity: 🔴 **Blocking**, 🟡 **Non-blocking (should fix)**, 🔵 **Suggestion**, or ✅ **Positive callout**. +4. **Group by category.** Use the categories below. +5. **No invented issues.** Only flag what is clearly present in `#changes`. State uncertainty explicitly. +6. **Respect `any`.** Do NOT flag intentional `any` usage unless you can show a safer, non-breaking replacement. --- -## Review Structure +## Finding Format -For **every finding**, output it in this exact format: +Use this structure for every finding: +``` ### [SEVERITY EMOJI] [Short Title] **File:** `path/to/file.ts`, lines X–Y -**Category:** [Category Name — see below] -**Severity:** Blocking / Non-blocking / Suggestion +**Category:** [Category Name] -**Issue:** -[Explain clearly why this is a problem: what can go wrong, what rule/best practice it violates, what the risk is.] +**Issue:** [What's wrong, what can go wrong, what rule/practice it violates] **Code (current):** - -```language -// the problematic snippet -``` +[problematic snippet] **Suggested Fix:** - -```language -// the corrected snippet, or pseudocode if a full fix is complex +[corrected snippet or pseudocode — omit for questions/positive callouts] ``` -[If no fix is needed (e.g., a question or positive callout), omit the "Suggested Fix" block and explain instead.] - --- ## Step 1 — PR Alignment Check -Before reviewing any code, answer these questions by reading `#activePullRequest`: - -- **PR Title & Description:** Does the title accurately describe the change? Is the description complete and clear? -- **Linked Ticket (Jira / GitHub Issue):** If a ticket/issue is linked, does the code actually implement what the ticket describes? Call out any gaps, scope creep, or unfinished work. - - For **GitHub Issues**, use: - - `#issue_fetch` - - `#issue_read` - - For **Jira tickets**, use: - - `#getJiraIssue` - - `#getJiraIssueRemoteIssueLinks` - - `#getJiraIssueTypeMetaWithFields` - - `#getJiraProjectIssueTypesMetadata` - - `#searchJiraIssuesUsingJql` - - **Note:** These tools may not be available in all GitHub Copilot environments and may require further set-up. If you cannot access them, do not attempt to call them; instead, infer requirements from the PR title/description, visible ticket links, and any in-PR context. -- **Diff Scope:** Are there any files changed that seem unrelated to the PR's stated purpose? -- **Breaking Changes:** Does the PR introduce breaking changes without documenting them? -- **PR Size:** Is the PR too large to review meaningfully? If so, note it. - -Output a short **PR Alignment Summary** (3–8 sentences) before any code-level findings. +Before code review, assess the PR itself: ---- +- **Title & Description:** Accurate and complete? +- **Linked Ticket:** If a ticket/issue is linked, does the code implement what it describes? Call out gaps, scope creep, or unfinished work. + - Use `#issue_fetch` / `#issue_read` for GitHub Issues, or `#getJiraIssue` / `#searchJiraIssuesUsingJql` for Jira — if available. If unavailable, infer from PR context. +- **Diff Scope:** Any files changed that seem unrelated to the PR's stated purpose? +- **Breaking Changes:** Introduced without documentation? +- **PR Size:** Too large to review meaningfully? -## Step 2 — Code Review by Category - -Review `#activePullRequest #changes` across all of the following categories. Skip categories that are clearly not applicable (e.g., "Accessibility" for a pure backend change) — but **explicitly state** that you skipped them and why. - ---- - -### Category 1 — Correctness & Logic - -- Does the code actually do what the PR claims it does? -- Are there off-by-one errors, wrong conditionals, or inverted logic? -- Are edge cases handled (empty inputs, null/undefined, zero values, large inputs)? -- Are any algorithms or business logic implementations incorrect? -- Are there any obvious runtime errors or exceptions that would be thrown in normal usage? +Output a **PR Alignment Summary** (3–8 sentences) before code-level findings. --- -### Category 2 — Security & Vulnerability - -- **Input Validation:** Is all user input validated and sanitized before use? -- **Injection Risks:** Any SQL injection, XSS, command injection, or path traversal risks? -- **Authentication & Authorization:** Are proper access controls applied to new endpoints or functions? Is auth bypassed anywhere? -- **Secrets & Credentials:** Are any API keys, passwords, tokens, or secrets hardcoded or accidentally committed? -- **Dependency Risks:** Are any newly added dependencies known to be vulnerable or unnecessarily high-risk? -- **HTTPS/TLS:** Is data in transit always encrypted? -- **CSRF/CORS:** Are CORS headers or CSRF protections applied correctly on new endpoints? -- **Sensitive Data Exposure:** Is PHI, PII, or other sensitive data exposed in error messages, logs, or API responses? - ---- +## Step 2 — Code Review by Category -### Category 3 — Privacy & Data Protection +Review `#activePullRequest #changes` across all applicable categories below. **Skip inapplicable categories** (e.g., Accessibility for pure backend changes) but explicitly state you skipped them and why. -- Are new data flows involving PHI/PII (personally identifiable information or protected health information) properly protected? -- Is sensitive data encrypted at rest and in transit? -- Is the minimum necessary data being collected (data minimization)? -- Are there any new logging statements that could leak sensitive user data (emails, names, health data, IDs)? - - Risky: user inputs, API request/response bodies, database records - - Never log: passwords, tokens, API keys, session IDs -- Is role-based access control (RBAC) applied to sensitive data correctly? +The model knows standard review practices for each category. Focus your review effort on **what matters for this specific PR** rather than mechanically checking every generic sub-item. Key areas: ---- +### 1. Correctness & Logic -### Category 4 — Error Handling & Resilience +Does the code do what the PR claims? Off-by-one errors, wrong conditionals, unhandled edge cases, runtime exceptions. -- Are all error paths handled, including async/promise rejections? -- Are errors surfaced to the user in a helpful, non-leaking way (no raw stack traces or DB errors shown to end users)? -- Are retries, timeouts, and circuit breakers applied where appropriate for external calls? -- Is graceful degradation in place if a dependency fails? -- Are custom error types/codes used consistently, or are bare `Error` objects thrown? +### 2. Security & Vulnerability ---- +Input validation, injection risks (SQL/XSS/command/path traversal), auth/authz, hardcoded secrets, dependency vulnerabilities, HTTPS/TLS, CSRF/CORS, sensitive data exposure in errors/logs/responses. -### Category 5 — Code Quality & Cleanliness +### 3. Privacy & Data Protection -- **Dead Code:** Any unused variables, functions, imports, or commented-out code blocks that should be removed? -- **DRY Violations:** Repeated logic that should be extracted into a shared function or constant? -- **Naming:** Are variables, functions, and types named clearly and consistently? Avoid single-letter names outside of loop counters. -- **Function Length & Complexity:** Are functions doing too many things (cyclomatic complexity > 10)? Flag for decomposition. -- **Code Smells:** Long parameter lists, feature envy, primitive obsession, magic numbers/strings without named constants. -- **Spelling & Grammar:** Check all identifiers, comments, strings, log messages, and documentation for typos and grammatical errors. -- **Formatting:** Is the code consistently formatted (spacing, indentation, bracket style)? Note if it deviates from the project's established style. +PHI/PII data flow protection, encryption at rest/in transit, data minimization, logging leaks (never log: passwords, tokens, API keys, session IDs), RBAC for sensitive data. ---- +### 4. Error Handling & Resilience -### Category 6 — Architecture & Design +All error paths handled (including async rejections), no raw stack traces to users, retries/timeouts/circuit breakers for external calls, graceful degradation, consistent error types. -- Does the change introduce tight coupling between modules that should be independent? -- Does it violate the Single Responsibility Principle (one class/function doing too many things)? -- Does it follow the existing project's architecture patterns, or does it introduce an inconsistent pattern? -- Is there unnecessary over-engineering or premature abstraction for the scope of this change? -- Are concerns (data fetching, business logic, presentation) properly separated? -- Does the change introduce any circular dependencies? +### 5. Code Quality & Cleanliness ---- +Dead code, DRY violations, naming clarity, function complexity (>10 cyclomatic), code smells (magic numbers, feature envy, primitive obsession), spelling/grammar, formatting consistency. -### Category 7 — Testing +### 6. Architecture & Design -- Are there tests for the new or changed behaviour? -- Do the tests cover happy paths **and** edge cases / error paths? -- Are test names descriptive and human-readable? -- Are there any tests that assert nothing meaningful (always-passing tests)? -- Is there over-mocking that reduces the real coverage ("if you mock everything, you test nothing")? -- Are tests brittle or likely to be flaky (time-dependent, order-dependent, environment-dependent)? -- If critical paths were modified, is the existing test coverage sufficient, or are additional tests needed? +Tight coupling, SRP violations, inconsistent patterns, over-engineering, separation of concerns, circular dependencies. ---- +### 7. Testing -### Category 8 — Performance & Efficiency - -- Are there any obvious O(n²) or worse algorithms where a better approach exists? -- Are database queries or API calls being made inside loops (N+1 problem)? -- Is there missing caching for expensive or frequently-repeated operations? -- Are large payloads being passed where references or streaming would be better? -- Does the change introduce any synchronous blocking operations in an async context? -- Are there any memory leaks (event listeners not cleaned up, subscriptions not unsubscribed, file handles not closed)? - -### Category 9 — Documentation & Comments - -- Are public APIs, functions, types, and classes documented (JSDoc/TSDoc/GoDoc/docstrings)? -- Do existing comments accurately reflect what the code now does after the change (outdated comments are worse than no comments)? -- Are complex or non-obvious sections of code explained with a "why" comment, not just "what"? -- Is the PR description or linked ticket updated to reflect the implementation approach? -- Are any README or external docs that describe changed functionality updated? -- Does the changes in the PR cause existing documentation to become inaccurate or misleading (drift)? If so, flag the specific docs that need updating. -- Do the changes in the PR cause existing documentation to become inaccurate or misleading (drift)? If so, flag the specific docs that need updating. - -### Category 10 — Standards & Style Consistency - -Apply the relevant style guide for the detected language(s): - -- **TypeScript/JavaScript:** Google JS/TS Style Guide, TypeScript best practices -- **Python/Jupyter:** PEP 8, PEP 257, Google Python Style Guide -- **Go:** Effective Go, Go Code Review Comments, Google Go Style Guide -- **C#/Visual Basic:** Microsoft C# Coding Conventions, .NET best practices -- **Terraform:** HashiCorp Terraform Style Guide, HCL best practices -- **Protobuf:** Protobuf Style Guide, proto3 best practices -- **R:** Google R Style Guide -- **HTML & CSS/SCSS:** W3C standards -- **SQL:** Consistent naming, query optimization, proper indexing -- **Bash/Shell:** ShellCheck compliance, POSIX compatibility -- **YAML/JSON:** Consistent indentation, key naming conventions -- **Markdown:** CommonMark, consistent heading hierarchy, accurate links -- **Other detected languages:** Apply appropriate community style guide +Tests for new/changed behavior covering happy paths and edge cases, meaningful assertions, descriptive names, no over-mocking ("if you mock everything, you test nothing"), no brittle/flaky tests. ---- +### 8. Performance & Efficiency -### Category 11 — Accessibility (UI changes only) +O(n²) algorithms, N+1 queries, missing caching, unnecessary large payloads, sync blocking in async context, memory leaks (uncleaned listeners, subscriptions, handles). -Skip this category if the PR contains no UI changes — state this explicitly. +### 9. Documentation & Comments -- Is semantic HTML used (headings, landmarks, lists, buttons vs. divs)? -- Do all images and icons have meaningful `alt` text or `aria-label`? -- Is keyboard navigation supported for all interactive elements? -- Are ARIA attributes used correctly (not overused or incorrectly applied)? -- Are colour contrast ratios sufficient (4.5:1 for normal text, 3:1 for large text)? -- Are form fields properly labelled with visible or accessible labels? -- Is `prefers-reduced-motion` respected for animations? -- Does the change maintain or improve WCAG 2.1 AA compliance? +Public APIs documented, existing comments still accurate after changes, "why" comments for non-obvious logic, PR description updated, external docs still accurate (flag specific drift). ---- +### 10. Standards & Style -### Category 12 — Concurrency & Thread Safety (if applicable) +Apply the relevant style guide for the detected language(s) (e.g., Google Style Guides, PEP 8, Effective Go, W3C, CommonMark). Flag deviations from whichever standards the project follows. -Skip this category if the PR contains no concurrent or async code — state this explicitly. +### 11. Accessibility (UI changes only) -- Is shared state accessed without proper synchronisation? -- Could there be race conditions in async code? -- Are promises/async-await error paths fully handled (`try/catch` or `.catch()`)? -- Is there any potential for deadlocks? -- Are operations that should be idempotent actually idempotent? +Semantic HTML, alt text/aria-labels, keyboard navigation, ARIA correctness, color contrast (4.5:1 normal, 3:1 large), form labels, `prefers-reduced-motion`, WCAG 2.1 AA. ---- +### 12. Concurrency & Thread Safety (if applicable) -### Category 13 — Regulatory & Compliance (if applicable) +Unsynchronized shared state, race conditions, unhandled async errors, deadlock potential, idempotency. -Only apply checks relevant to the system's data and geography. State explicitly which regulations are in scope and why. +### 13. Regulatory & Compliance (if applicable) -- **HIPAA** (if PHI is handled): Are new PHI data flows properly protected and auditable? -- **GDPR** (if EU personal data is processed): Are data subject rights maintained? Is consent properly captured? -- **PIPEDA** (Canadian federal): Is personal information handled with appropriate consent and security? -- **PHIPA** (Ontario health data): Is personal health information protected per custodian requirements? -- **PIPA** (South Korea): Is personal information processed with appropriate consent and safeguards? +Only apply regulations relevant to the system's data/geography. State which are in scope and why. Check: HIPAA, GDPR, PIPEDA, PHIPA, PIPA as applicable. --- -## Step 3 — Overall Review Summary - -After all findings, output a structured summary: +## Step 3 — Overall Summary ```markdown ## ✅ / 🟡 / 🔴 Overall Verdict: [APPROVED / APPROVED WITH SUGGESTIONS / CHANGES REQUESTED] @@ -263,25 +140,24 @@ After all findings, output a structured summary: ### Top Concerns -[Bullet list of the most critical issues — these are the ones that must be resolved before merge] +[Bullet list of critical issues that must be resolved before merge] ### What's Done Well -[Bullet list of genuinely good patterns, decisions, or improvements in this PR] +[Bullet list of genuinely good patterns or improvements in this PR] ### Before Merging - [ ] [Action item 1] - [ ] [Action item 2] -- [ ] ... ``` --- -## Tone Guidelines +## Tone -- Be direct and specific. Avoid vague feedback like "this could be improved." -- Be respectful. Critique the code, not the author. -- Acknowledge trade-offs. If there's a valid reason for a pattern, say so — but still flag the risk. -- Use "consider" for suggestions, "should" for non-blocking issues, and "must" for blocking issues. -- Do not pad the review. If a category has no issues, say: ✅ _No issues found in this category._ +- Direct and specific. No vague "this could be improved." +- Critique the code, not the author. +- Acknowledge trade-offs — flag risk even if the pattern is valid. +- Use "consider" for suggestions, "should" for non-blocking, "must" for blocking. +- If a category has no issues: ✅ _No issues found._ diff --git a/.github/prompts/audit-quality.prompt.md b/.github/prompts/audit-quality.prompt.md index 10e125c..317759c 100644 --- a/.github/prompts/audit-quality.prompt.md +++ b/.github/prompts/audit-quality.prompt.md @@ -13,391 +13,116 @@ labels: --- **Purpose:** -Act as a **Principal Code Reviewer, Security Auditor, and Refactoring Architect**. Perform a comprehensive audit of the #codebase to identify architectural flaws, security vulnerabilities, compliance gaps, technical debt, and maintainability issues. Once identified, proactively implement improvements to ensure a high-standard, robust, scalable, secure, and compliant implementation. +Act as a **Principal Code Reviewer, Security Auditor, and Refactoring Architect**. Audit the #codebase to identify architectural flaws, security vulnerabilities, compliance gaps, technical debt, and maintainability issues — then proactively implement improvements. --- -## HARD RULES (Do Not Violate) - -1. **The "Any" Rule:** - - Acknowledge that `any` is often intentionally required (e.g., VS Code extension architecture). - - Do **NOT** replace `any` with `unknown`. - - Do **NOT** add `no-explicit-any` to ESLint configuration. - - Only replace `any` if: - - You understand the full context of its usage - - It can be simply swapped with a specific type without breaking functionality - - The replacement improves type safety meaningfully - - **Go-specific:** Replace `interface{}` with `any` if it doesn't break the codebase. - -2. **Proactive Improvement:** - - Do not ask for permission to proceed with fixes. - - Once issues are identified, immediately implement improvements. - - Make incremental, validated changes rather than large sweeping refactors. - -3. **Validation Discipline:** - - Frequently run validation commands (check #file:package.json or #file:Makefile for `validate`, `test`, `lint`, `format` commands). - - If validation fails, fix issues immediately before proceeding. - - Never proceed to the next audit area if current changes break validation. - -4. **Change Documentation:** - - After ALL fixes are applied and validation passes, provide a comprehensive report of: - - **WHAT** was changed (specific files, functions, patterns) - - **WHY** it was changed (the issue identified and rationale for the fix) - - This enables human review and informed decision-making about keeping or modifying changes. +## Hard Rules ---- - -## Execution Order (CRITICAL) +1. **The `any` Rule:** Do NOT replace `any` with `unknown` or add `no-explicit-any` to ESLint. Do NOT introduce `unknown` as a new type annotation anywhere — if the code uses `any`, leave it as `any` unless you can substitute a **specific, concrete type** (e.g., `string`, `MyInterface`, `Record`) without breaking functionality. **Go-specific:** Replace `interface{}` with `any` if safe. -1. **Priority Audit - Active Changes:** - - **FIRST:** If #changes or #activePullRequest are present, audit those files and changes with highest priority - - Apply the same comprehensive audit criteria to changed files as you would to the entire codebase - - Validate that PR/changes don't introduce issues before proceeding to broader audit +2. **No Duplication of Existing Infrastructure:** Before adding any capability (error tracking, logging, monitoring, analytics, validation, caching, auth, etc.), verify whether it already exists in the codebase. Read config files, initialization code, and existing integrations first. Never add functionality the codebase already provides — doing so creates double-tracking, conflicting behavior, or dead code. -2. **Breadth-First Audit:** Analyze codebase structure, patterns, and systemic issues across all files. +3. **Proactive Improvement:** Do not ask permission. Once issues are identified, implement fixes immediately. Make incremental, validated changes — not sweeping refactors. -3. **Incremental Fix & Validate:** Apply fixes incrementally with frequent validation runs. +4. **Validation Discipline:** After every batch of related changes, run the **full** validation pipeline. Detect the project's language/tooling and find the appropriate commands: + - **Discover:** Check for a top-level task runner or config file (e.g., `package.json`, `Makefile`, `pyproject.toml`, `composer.json`). Look for a single `validate` or `check` command that runs the full pipeline. + - **If no single command exists**, run each step individually in order: format → lint → typecheck (if applicable) → unit tests → integration/e2e tests. + - **All tests must pass before making the next change.** If any test fails, stop and fix immediately. Never move to the next audit area while current changes break any test. -4. **Test Coverage:** Ensure or update test coverage for modified code. +5. **Change Documentation:** After all fixes pass validation, report **what** was changed (files, functions, patterns) and **why** (issue identified and rationale). -5. **Documentation Update:** Update both in-code and external documentation to reflect changes. +--- -6. **Final Validation:** Run complete validation suite to ensure stability. +## Execution Order -7. **Change Report:** Generate comprehensive report of all changes and rationale. +1. **Codebase Discovery (mandatory before any changes)** — Read config files, entry points, and key modules to map what already exists: error tracking (e.g., Sentry), analytics, logging, CI/CD, auth, state management, styling patterns, testing setup, and any other integrated services or conventions. Build a clear picture of established infrastructure and patterns so you never duplicate, conflict with, or undermine existing functionality. +2. **Priority: Active Changes** — If #changes or #activePullRequest exist, audit those first with full criteria. Validate before proceeding to broader audit. +3. **Breadth-First Audit** — Analyze codebase structure, patterns, and systemic issues. +4. **Incremental Fix & Validate** — Apply fixes in small batches (1–3 related changes). After each batch, run the full validation suite (including e2e tests). Do NOT accumulate multiple changes before testing — if a change breaks something, you need to know which change caused it. +5. **Test Coverage** — Ensure/update tests for modified code. Run the full test suite again after adding/modifying tests. +6. **Documentation Update** — Update in-code and external documentation to reflect changes. +7. **Final Validation** — Run complete validation suite. +8. **Change Report** — Comprehensive report of all changes and rationale. --- -## Audit Categories & Criteria +## Audit Categories ### 1. Architecture & Design -**Objective:** Ensure modular, maintainable, and well-designed code structure. - -- **Modularity:** Flag monolithic files; enforce small, focused modules with single responsibility. -- **SOLID Principles:** Identify violations of Single Responsibility, Open/Closed, Liskov Substitution, Interface Segregation, and Dependency Inversion. -- **Coupling & Cohesion:** Analyze loose coupling vs. tight coupling; ensure high cohesion within modules. -- **Design Patterns:** Identify anti-patterns, code smells, and inappropriate pattern usage. -- **Over-Engineering:** Flag premature abstractions, unnecessary complexity, or over-generalization. -- **Boundaries:** Assess clear separation of concerns, layers, and module boundaries. +Ensure modular, maintainable structure. Check: modularity (flag monolithic files), SOLID principles, coupling vs. cohesion, anti-patterns/code smells, over-engineering/premature abstraction, separation of concerns and layer boundaries. ### 2. Code Health & Quality -**Objective:** Maintain clean, clear, and maintainable code. - -- **Correctness:** Verify logic correctness and proper algorithm implementation. -- **Clarity:** Ensure code is self-documenting with clear naming and structure. -- **Cyclomatic Complexity:** Identify overly complex functions (recommend refactoring if complexity > 10). -- **DRY Violations:** Find and eliminate repeated code patterns. -- **Dead Code:** Remove unused variables, functions, imports, and utilities. -- **Code Smells:** Identify long methods, large classes, primitive obsession, feature envy, etc. -- **Clean Code:** Apply clean code principles (meaningful names, small functions, minimal side effects). +Clean, correct, maintainable code. Check: logic correctness, clarity/self-documenting code, cyclomatic complexity (refactor if >10), DRY violations, dead code (unused vars/functions/imports), code smells (long methods, primitive obsession, feature envy), clean code principles (meaningful names, small functions, minimal side effects). ### 3. Error Handling, Observability & Resilience -**Objective:** Robust error handling, monitoring, logging, and tracing without compromising privacy while maintaining debugging utility. - -- **Error Handling:** - - Ensure all error paths are handled appropriately - - Implement proper error boundaries and fallback mechanisms - - Provide helpful, actionable error messages without leaking sensitive data - - Use structured error handling (custom error types, error codes) - -- **Logging:** - - Implement consistent, structured logging across the application - - Use appropriate log levels (DEBUG, INFO, WARN, ERROR, FATAL) - - **CRITICAL - Selective PHI/PII Sanitization:** - - **Identify logs at risk:** Audit logging statements to identify which logs may contain PHI/PII (e.g., user inputs, API request/response bodies, database records, error objects containing user data) - - **Sanitize ONLY risky logs:** Apply sanitization, redaction, or hashing ONLY to logs that may contain sensitive data - - **Preserve debugging utility:** Keep logs maximally useful for debugging by NOT sanitizing logs that don't contain sensitive data - - **Examples of what to sanitize:** User identifiers (replace with opaque but consistent identifiers such as randomly generated UUIDs; if hashing is used, ensure a stable hashing mechanism is applied consistently so log entries remain correlatable), email addresses, phone numbers, health information, addresses, SSN/SIN, credit card numbers - - **Examples of safe logs:** Application state, configuration values (non-secret), flow control messages, performance metrics, non-sensitive error codes - - **Never log:** Authentication tokens, passwords, API keys, session identifiers, encryption keys - - Include correlation IDs for request tracing - - Avoid excessive logging that creates noise or performance issues - - **Balance:** Logs should be comprehensive enough to debug production issues while protecting sensitive data - -- **Monitoring:** - - Track key performance indicators (KPIs) and business metrics - - Monitor error rates, response times, and resource utilization - - Set up alerting for critical failures or anomalies - - Ensure monitoring data is aggregated and anonymized (no PHI/PII in metrics) - -- **Tracing:** - - Implement distributed tracing for microservices or multi-component systems - - Use correlation IDs to trace requests across service boundaries - - Ensure trace data is sanitized and does not contain PHI/PII - - Implement sampling strategies for high-volume tracing to reduce costs - -- **Resilience:** - - Graceful degradation when dependencies fail - - Implement appropriate retry mechanisms with exponential backoff for transient failures - - Circuit breaker patterns for external dependencies - - Timeout configurations to prevent hanging operations - - Fallback strategies for critical operations - -### 4. Security & Vulnerability Assessment - -**Objective:** Protect users, data, and infrastructure from security threats. - -- **Input Validation:** Validate and sanitize all user inputs. -- **Injection Prevention:** Protect against SQL injection, XSS, command injection, LDAP injection, etc. -- **Authentication & Authorization:** Verify proper access controls and session management. -- **API Security:** Ensure proper API authentication, rate limiting, and secure endpoints. -- **Dependency Vulnerabilities:** Check for known vulnerabilities in dependencies. -- **Secrets Management:** Ensure no hardcoded credentials, API keys, or secrets in code. -- **HTTPS/TLS:** Verify encrypted communication for data in transit. -- **CSRF/CORS:** Implement proper CSRF tokens and CORS policies. -- **Server Security:** Protect against DDoS, server-side vulnerabilities, and malicious attacks. - -### 5. Privacy & Data Protection (CRITICAL PRIORITY) - -**Objective:** Maximum protection of user privacy and sensitive data. - -- **PHI/PII Handling:** Identify all PHI/PII data flows and ensure proper protection. -- **Data Minimization:** Collect only necessary data; dispose of data when no longer needed. -- **Encryption:** Ensure data encryption at rest and in transit. -- **Access Controls:** Implement role-based access control (RBAC) for sensitive data. -- **Data Leakage Prevention:** Prevent PHI/PII exposure in logs, analytics, error messages, stack traces, monitoring systems, or third-party services. -- **User Consent:** Verify proper consent mechanisms for data collection and processing. -- **Data Retention:** Implement and enforce appropriate data retention policies. +Robust error handling and monitoring without compromising privacy. -### 6. Regulatory Compliance +- **Error Handling:** All paths handled, error boundaries/fallbacks, actionable messages without leaking sensitive data, structured error types. +- **Logging:** Consistent structured logging with appropriate levels. **Sanitize only logs at risk of containing PHI/PII** (user inputs, API bodies, DB records, error objects with user data). Preserve debugging utility in safe logs (app state, config, flow control, metrics). **Never log:** auth tokens, passwords, API keys, session IDs, encryption keys. Include correlation IDs. Avoid excessive noise. +- **Monitoring:** Track KPIs, error rates, response times, resource utilization. Alerting for critical failures. Anonymized metrics (no PHI/PII). +- **Tracing:** Distributed tracing with correlation IDs for multi-component systems. Sanitize trace data. Implement sampling for high-volume traces. +- **Resilience:** Graceful degradation, retry with exponential backoff, circuit breakers, timeouts, fallback strategies. -**Objective:** Ensure compliance with applicable data protection and privacy regulations. +### 4. Security & Vulnerability -Not all regulations apply to every codebase. Determine which regulations are in scope based on the system's data subjects, geography, data types, and regulated activities. Only perform compliance checks for regulations that apply, and explicitly state why any listed regulation is out of scope. +Protect users, data, and infrastructure. Check: input validation/sanitization, injection prevention (SQL/XSS/command/LDAP/path traversal), auth/authz and session management, API security (authentication, rate limiting), dependency vulnerabilities, secrets management (no hardcoded credentials), HTTPS/TLS, CSRF/CORS, server security (DDoS, SSRF). -Check compliance with: +### 5. Privacy & Data Protection -- **United States:** HIPAA (Health Insurance Portability and Accountability Act) - - Applies when the system handles protected health information (PHI) for a covered entity or business associate. -- **European Union & Ireland:** GDPR (General Data Protection Regulation) - - Applies when the system processes personal data, especially if it profiles users, tracks behavior, or makes decisions that affect individuals. -- **Canada (Federal):** PIPEDA (Personal Information Protection and Electronic Documents Act) - - Applies when the system processes personal information for commercial activities in the private sector. -- **Canada - Ontario (Provincial):** PHIPA (Personal Health Information Protection Act) - - Applies when the system handles personal health information for a health information custodian or their agent. -- **South Korea:** PIPA (Personal Information Protection Act) - - Applies when the system processes personal information, including identifiers, contact data, or behavioral data. +Maximum protection of user privacy. Check: PHI/PII data flow protection, data minimization, encryption at rest and in transit, RBAC for sensitive data, data leakage prevention (logs, analytics, errors, stack traces, third-party services), consent mechanisms, data retention policies. -For each applicable regulation, verify: +### 6. Regulatory Compliance -- Right to access, rectification, erasure, and data portability -- Breach notification procedures -- Data processing agreements -- Privacy impact assessments where required +Determine which regulations are in scope based on data subjects, geography, and data types. State why any regulation is out of scope. Check applicable regulations: **HIPAA** (US, PHI), **GDPR** (EU, personal data), **PIPEDA** (Canada federal), **PHIPA** (Ontario health), **PIPA** (South Korea). For each: verify data subject rights, breach notification, processing agreements, privacy impact assessments. ### 7. Standards, Style & Best Practices -**Objective:** Consistent, idiomatic code following industry standards. - -Apply best practices and style guides for all detected languages: - -- **JavaScript/TypeScript:** Google JavaScript & TypeScript Style Guide, TypeScript best practices -- **HTML/CSS/SCSS:** W3C standards, accessibility guidelines, BEM or other naming conventions, Google HTML & CSS Style Guide -- **Go:** Effective Go, Go Code Review Comments, Google Go Style Guide -- **Python:** PEP 8, PEP 257 (including CGI scripts and Jupyter notebooks), Google Python Style Guide -- **C#:** Microsoft C# Coding Conventions, Google C# Style Guide -- **R:** Google's R Style Guide, tidyverse style guide -- **Visual Basic:** Microsoft VB coding conventions -- **Markdown:** CommonMark specification, consistent formatting, Google Markdown Style Guide -- **YAML:** Proper indentation, key naming conventions -- **Protocol Buffers (proto):** Style guide for proto files -- **Gherkin/Feature files:** Consistent scenario structure -- **FHIR-specific:** FHIRPath and FSH (FHIR Shorthand) best practices -- **Data formats:** JSON, XML, Turtle (RDF) - proper structure and validation, Google JSON Style Guide -- **SQL:** Consistent naming, query optimization -- **PHP:** PSR standards (PSR-1, PSR-12) -- **Bash/Shell:** ShellCheck compliance, POSIX compatibility where applicable, Google Shell Style Guide -- **SVG:** Optimized, accessible SVG markup - -### 8. Accessibility (A11y) - -**Objective:** Ensure all UI/UX is accessible to users with disabilities. - -- **WCAG Compliance:** Target WCAG 2.1 Level AA minimum. -- **Color Contrast:** Ensure sufficient contrast ratios (4.5:1 for normal text, 3:1 for large text). -- **Screen Readers:** Proper ARIA labels, semantic HTML, alt text for images. -- **Keyboard Navigation:** Full keyboard accessibility, logical tab order, focus indicators. -- **Visual Disabilities:** Support for screen magnification, high contrast modes. -- **Dyslexia Support:** Consider font choices, line spacing, and text formatting. -- **Motion & Animations:** Respect `prefers-reduced-motion` for users sensitive to motion. -- **Form Accessibility:** Proper labels, error messages, and form validation feedback. +Consistent, idiomatic code. Apply the appropriate style guide for each detected language (e.g., Google Style Guides for JS/TS/Python/Go/C#/R/Shell/HTML/CSS/Markdown/JSON, PSR for PHP). Flag deviations from whichever standards the project follows. -### 9. Testing & Quality Assurance +### 8. Accessibility -**Objective:** Comprehensive, meaningful test coverage. +Target WCAG 2.1 Level AA minimum. Check: color contrast (4.5:1 normal, 3:1 large), semantic HTML and ARIA labels, keyboard navigation and focus indicators, alt text, screen magnification/high contrast support, `prefers-reduced-motion`, form labels and error feedback. -- **Unit Testing:** Test individual functions and components in isolation. -- **Integration Testing:** Test interaction between modules and external services (where applicable). -- **End-to-End Testing:** Test complete user workflows (where applicable). -- **Load/Performance Testing:** Verify performance under expected load (where applicable). -- **Test Coverage:** Achieve meaningful coverage (not just high percentages, but testing critical paths). -- **Test Quality:** Eliminate bloat, useless tests, or tests that assert nothing meaningful. -- **Test Readability:** Write clear, human-readable tests with descriptive names. -- **Test Tables/Cases:** Use data-driven testing with test cases/tables where applicable. -- **Test Maintainability:** Avoid brittle tests, over-mocking, or flaky tests. Remember the motto: "If you mock everything, you test nothing". +### 9. Testing & Quality Assurance -### 10. Documentation +Comprehensive, meaningful test coverage. Check: unit tests (isolated), integration tests (module interactions), E2E tests (user workflows), meaningful coverage (critical paths, not just percentages), test quality (no bloat, no meaningless assertions), descriptive test names, data-driven test cases where applicable, no brittle/flaky tests, no over-mocking ("if you mock everything, you test nothing"). -**Objective:** Thorough, accurate, and useful documentation. +### 10. Documentation -- **In-Code Documentation:** - - Clear comments explaining "why" not just the "what" for complex logic - - JSDoc/TSDoc/GoDoc/docstrings for public APIs - - Inline documentation for non-obvious code -- **External Documentation:** - - README files with clear setup and usage instructions - - API documentation - - Architecture diagrams - - Contributing guidelines -- **Documentation Accuracy:** Ensure docs reflect actual implementation (never outdated). +Accurate, useful documentation serving both internal and external developers. **In-code:** "why" comments for complex logic, JSDoc/docstrings for public APIs, inline docs for non-obvious code only. **External:** README with setup/usage, API docs, architecture diagrams, contributing guidelines. Ensure docs reflect actual implementation. ### 11. Performance & Optimization -**Objective:** Fast, responsive, and efficient application. +Fast, efficient application. Check: response times, 60fps for animations (where applicable), UI blocking/freezing, crash prevention, algorithm efficiency (avoid O(n²) where O(n) works), lazy loading, caching strategies, query optimization (indexes, N+1). -- **Response Times:** Optimize for quick response times in user-facing operations. -- **Frame Rate:** Maintain smooth 60fps for animations and interactive UI (where applicable). -- **Hanging/Freezing:** Identify and fix code that causes UI blocking or application freezes. -- **Crashes:** Prevent application crashes due to unhandled exceptions or resource exhaustion. -- **Algorithm Efficiency:** Use appropriate data structures and algorithms (avoid O(n²) where O(n) is possible). -- **Lazy Loading:** Implement lazy loading for resources where appropriate. -- **Caching:** Utilize caching strategies to reduce redundant operations. -- **Database Queries:** Optimize queries, use indexes, avoid N+1 problems. +### 12. Build & Bundle Size -### 12. Build & Bundle Size Optimization +**Applies to:** Apps producing build artifacts (web, mobile, distributed binaries). **Skip for:** local-only CLI tools. -**Objective:** Minimize build output and bundle sizes for faster deployment and user experience. - -**Note:** This applies to applications that produce build artifacts (web apps, mobile apps, distributed binaries). Not applicable to local-only CLI tools or offline applications without distribution requirements. - -- **Bundle Analysis:** - - Analyze bundle composition to identify large dependencies - - Use bundle analyzer tools (webpack-bundle-analyzer, source-map-explorer, etc.) - - Identify and eliminate duplicate dependencies - -- **Code Splitting:** - - Implement route-based code splitting for web applications - - Split vendor bundles from application code - - Lazy load non-critical features and components - -- **Tree Shaking:** - - Ensure proper ES module imports for tree shaking - - Remove unused exports and dead code - - Use side-effect-free packages where possible - -- **Dependency Optimization:** - - Replace heavy dependencies with lighter alternatives - - Use specific imports instead of entire libraries (e.g., `import { specific } from 'library'`) - - Consider removing dependencies that provide minimal value - - Audit transitive dependencies and flatten where possible - -- **Asset Optimization:** - - Compress and optimize images (WebP, AVIF formats where supported) - - Minimize CSS and JavaScript - - Use SVG for icons instead of icon fonts - - Implement proper cache headers for static assets - -- **Build Configuration:** - - Enable production optimizations (minification, compression) - - Use modern build tools with better optimization (esbuild, swc, Vite) - - Configure proper source maps (external or hidden for production) - - Remove development-only code from production builds +Check: bundle composition (identify large/duplicate deps), code splitting (route-based, vendor separation, lazy loading), tree shaking (proper ES module imports, remove unused exports), dependency optimization (lighter alternatives, specific imports), asset optimization (WebP/AVIF, minification, SVG icons, cache headers), build config (production optimizations, modern tooling, proper source maps, no dev code in production). ### 13. Operational Cost Optimization -**Objective:** Reduce infrastructure and operational costs where applicable. - -**Note:** This applies to applications using cloud services, hosted infrastructure, or CI/CD platforms. Not applicable to purely offline/local CLI tools or applications without operational expenses. - -- **Cloud Service Optimization:** - - **Compute Resources:** - - Right-size instances/containers (avoid over-provisioning) - - Use auto-scaling to match demand - - Implement serverless functions for sporadic workloads - - Shutdown or scale down non-production environments when not in use - - - **Storage Costs:** - - Implement lifecycle policies to archive or delete old data - - Use appropriate storage classes (hot vs. cold storage) - - Compress data before storage where appropriate - - Clean up unused storage resources (orphaned volumes, old snapshots) - - - **Database Optimization:** - - Optimize queries to reduce compute time - - Use read replicas efficiently - - Implement connection pooling to reduce overhead - - Archive historical data to cheaper storage - - Consider database sizing and reserved capacity for predictable workloads - - - **Network & Bandwidth:** - - Enable compression for API responses - - Implement CDN for static assets - - Optimize data transfer between regions/zones - - Cache frequently accessed data closer to users - -- **CI/CD Cost Reduction:** - - **GitHub Actions/Workflows:** - - Use matrix strategies efficiently - - Cache dependencies and build artifacts - - Run tests in parallel where possible - - Use self-hosted runners for high-volume builds - - Skip unnecessary workflow runs (e.g., documentation-only changes) - - - **Build Optimization:** - - Reduce build frequency for non-critical branches - - Use incremental builds when possible - - Optimize container image layers for better caching - -- **API & Third-Party Services:** - - Monitor and optimize API call volumes - - Implement caching to reduce redundant API calls - - Use batch operations where supported - - Review and eliminate unused third-party service subscriptions - -- **Monitoring & Logging Costs:** - - Implement log retention policies - - Use log sampling for high-volume applications - - Filter out noisy or low-value logs - - Use cost-effective monitoring tiers appropriately - -- **Platform-Specific Optimization:** - - **Google Cloud Platform (GCP):** Use committed use discounts, preemptible VMs, Cloud Functions for event-driven workloads - - **AWS:** Use Reserved Instances, Spot Instances, Lambda for serverless, S3 Intelligent-Tiering - - **Vercel:** Optimize for build minutes, bandwidth usage, and serverless function execution time - - **Azure:** Use Reserved Instances, Azure Functions consumption plan, Blob storage tiers +**Applies to:** Apps using cloud services, hosted infrastructure, or CI/CD. **Skip for:** purely offline/local tools. -### 14. Concurrency & Resilience +Check: compute right-sizing and auto-scaling, storage lifecycle policies and cleanup, database query optimization and connection pooling, CDN and compression for network/bandwidth, CI/CD efficiency (caching, parallelism, skipping unnecessary runs), API call optimization (caching, batching), log retention policies and sampling, platform-specific discounts (reserved/spot instances, serverless for sporadic workloads). -**Objective:** Prevent race conditions, deadlocks, and concurrency issues. +### 14. Concurrency & Resilience -- **Race Conditions:** Identify and fix shared state access without proper synchronization. -- **Deadlocks:** Prevent circular dependencies in lock acquisition. -- **Thread Safety:** Ensure thread-safe operations in concurrent code. -- **Async Handling:** Proper promise/async-await usage, error handling in async code. -- **Resource Locking:** Implement appropriate locking mechanisms. -- **Idempotency:** Ensure operations can be safely retried without unintended side effects. -- **Reproducibility:** Ensure consistent, predictable behavior across runs. +Prevent race conditions, deadlocks, and concurrency issues. Check: shared state synchronization, deadlock prevention, thread safety, proper async/await error handling, resource locking, idempotency, reproducibility. ### 15. Memory Management -**Objective:** Efficient memory usage without leaks. - -- **Memory Leaks:** Identify and fix memory leaks (event listeners, closures, circular references). -- **Stack Overflow:** Prevent deep recursion or large stack allocations. -- **Heap Management:** Optimize heap usage, proper object lifecycle management. -- **Resource Cleanup:** Ensure proper disposal of resources (file handles, database connections, subscriptions). -- **Garbage Collection:** Consider GC pressure in hot paths. +Efficient memory usage. Check: memory leaks (event listeners, closures, circular references), stack overflow prevention, heap optimization, resource cleanup (file handles, DB connections, subscriptions), GC pressure in hot paths. ### 16. Scalability -**Objective:** Code ready for significant scale (100,000+ concurrent users). +Code ready for significant scale (100,000+ concurrent users). Check: stateless components for horizontal scaling, load distribution, database scaling strategies (replicas, sharding, partitioning). -- **Horizontal Scaling:** Design for stateless components where possible. -- **Load Distribution:** Consider load balancing and distributed systems. -- **Database Scaling:** Plan for read replicas, sharding, or partitioning. - **Caching Strategy:** Implement distributed caching (Redis, Memcached). - **Asynchronous Processing:** Use message queues for heavy operations. - **Rate Limiting:** Implement rate limiting to prevent abuse. @@ -421,9 +146,9 @@ Apply best practices and style guides for all detected languages: ## Final Steps 1. **Run Complete Validation:** - - Execute all validation commands (e.g., `npm run validate`, `make validate`). - - Run formatters, linters, and complete test suite. - - Ensure zero errors and warnings (or document intentional exceptions). + - Execute the full validation command (e.g., `npm run validate`, `make validate`) which must include unit tests **and** e2e tests. + - If e2e tests are not part of the main validation command, run them separately (e.g., `npm run test:cypress:e2e`). + - Ensure zero errors and warnings across all test types (or document intentional exceptions). 2. **Generate Change Report:** - **WHAT Changed:** List all files modified, functions refactored, patterns updated. diff --git a/.github/prompts/readme.md b/.github/prompts/readme.md index 007b4d9..8dd640c 100644 --- a/.github/prompts/readme.md +++ b/.github/prompts/readme.md @@ -58,79 +58,42 @@ targets: ### [`audit-pr.prompt.md`](./audit-pr.prompt.md) -**Purpose:** Perform a thorough, opinionated code review of a pull request across 13 comprehensive categories. Acts as a Principal Code Reviewer to identify issues, suggest fixes, and provide actionable feedback ready for human review and posting. +**Purpose:** Perform a thorough, opinionated code review of a pull request across 13 categories. Produces ready-to-post comments with severity triage and an overall summary for human review. **Key Features:** - **3-Step Review Process:** - - Step 1: PR Alignment Check (verify PR title, description, linked ticket, diff scope, breaking changes, and PR size) - - Step 2: Categorized Code Review (13 review categories covering correctness, security, privacy, performance, testing, and more) - - Step 3: Overall Summary (structured verdict with stats, top concerns, and positive callouts) -- **13 Review Categories:** - 1. Correctness & Logic - 2. Security & Vulnerability - 3. Privacy & Data Protection - 4. Error Handling & Resilience - 5. Code Quality & Cleanliness - 6. Architecture & Design - 7. Testing - 8. Performance & Efficiency - 9. Documentation & Comments - 10. Standards & Style Consistency - 11. Accessibility (UI changes only) - 12. Concurrency & Thread Safety - 13. Regulatory & Compliance -- **Severity Triage:** Marks findings as 🔴 Blocking, 🟡 Non-blocking, 🔵 Suggestions, or ✅ Positive callouts -- **Specific, Actionable Feedback:** Every finding includes file path, line range, issue description, and suggested fix (where applicable) + - Step 1: PR Alignment Check (title, description, linked ticket, diff scope, breaking changes, PR size) + - Step 2: Categorized Code Review (13 categories — correctness, security, privacy, performance, testing, etc.) + - Step 3: Overall Summary (verdict, stats, top concerns, positive callouts) +- **Severity Triage:** 🔴 Blocking, 🟡 Non-blocking, 🔵 Suggestions, ✅ Positive callouts +- **Actionable Findings:** Every finding includes file path, line range, issue description, and suggested fix **When to Use:** - During pull request reviews (before merge) - As a second opinion on code changes -- To ensure comprehensive coverage of security, privacy, and performance concerns - When you need detailed, ready-to-post review comments -**Assumptions:** - -- Active GitHub pull request with `#activePullRequest` and `#changes` accessible -- No external tools required (GitHub/Jira tools are optional and noted as conditional) - --- ### [`audit-quality.prompt.md`](./audit-quality.prompt.md) -**Purpose:** Perform a deep-dive audit of your codebase to identify architectural flaws, technical debt, and maintainability issues—then automatically implement improvements. +**Purpose:** Perform a deep-dive audit of your codebase to identify architectural flaws, technical debt, and maintainability issues — then automatically implement improvements. **Key Features:** -- **Breadth-First Audit:** Analyzes code architecture, design patterns, code health, security, and standards -- **Test-Driven Implementation:** Applies refactors using a TDD (Test-Driven Development) approach -- **Automatic Validation:** Runs your project's validation command to ensure changes work -- **Documentation Sync:** Updates documentation to reflect code changes (Step n-1 before final validation) - -**What It Analyzes:** - -- Architecture & design patterns (coupling, modularity, over-engineering) -- Code health (correctness, clarity, cyclomatic complexity, dead code, DRY violations) -- Robustness & error handling (resilience, idempotency, swallowed errors) -- Security & privacy concerns -- Standards & style adherence -- Accessibility (for UI code) -- Test quality and coverage +- **Breadth-First Audit:** Analyzes architecture, code health, security, privacy, performance, and 16 total categories +- **Proactive Implementation:** Identifies issues and immediately implements fixes +- **Incremental Validation:** Runs your project's validation command after each change +- **Documentation Sync:** Updates documentation to reflect code changes **When to Use:** -- During code review cycles (before PR merge) - As part of regular maintenance sprints - When tackling technical debt - Before major releases (ensure code quality baseline) -**Assumptions:** - -- Your project has a test suite (Jest, Cypress, etc.) -- You have a validation script defined (e.g., `npm run validate`) -- You follow a specific style guide (defaults to Google Style Guide) - --- ## Prerequisites diff --git a/docs/architecture/app-directory.md b/docs/architecture/app-directory.md index bc95328..10d5dbe 100644 --- a/docs/architecture/app-directory.md +++ b/docs/architecture/app-directory.md @@ -21,6 +21,8 @@ The portfolio uses Next.js App Router, where file names in [src/app/](../../src/ ```mermaid flowchart TD + accTitle: App Router Component Hierarchy + accDescr: Layout wraps all routes and provides metadata, includes GeneralLayout which contains Navbar, Footer, StarsBackground and CookieSnackbar. Page renders Banner, ProjectsGrid, and Publications Layout[layout.tsx] -->|Wraps| Page[page.tsx] Layout -->|Provides| Metadata[SEO & Metadata] Layout -->|Includes| GL[GeneralLayout] diff --git a/docs/architecture/components/avatar.md b/docs/architecture/components/avatar.md index 0801d67..f143dd1 100644 --- a/docs/architecture/components/avatar.md +++ b/docs/architecture/components/avatar.md @@ -69,6 +69,8 @@ Implementation: [src/components/banner/Avatar.tsx](../../src/components/banner/A ```mermaid sequenceDiagram + accTitle: Avatar Sneeze and Easter Egg Interaction Sequence + accDescr: User hovers avatar on 5th time triggering sneeze animation and logging event. On 30th time (6th sneeze), aaaahhhh helper is called to transform page and log event participant User participant Avatar participant Helper diff --git a/docs/architecture/components/cookie-snackbar.md b/docs/architecture/components/cookie-snackbar.md index c434cc4..519d4eb 100644 --- a/docs/architecture/components/cookie-snackbar.md +++ b/docs/architecture/components/cookie-snackbar.md @@ -12,6 +12,8 @@ The CookieSnackbar component displays a cookie consent notification to users whe ```mermaid flowchart TD + accTitle: Cookie Snackbar State Management + accDescr: CookieSnackbar checks if browser cookie is set. If not set, shows notification and expires in 1 year. If set, hides notification CookieSnackbar[CookieSnackbar] -->|Checks| Cookie[Browser Cookie] Cookie -->|Not Set| Show[Show Notification] Cookie -->|Set| Hide[Hide Notification] @@ -69,6 +71,8 @@ const handleClose = () => { ```mermaid sequenceDiagram + accTitle: Cookie Consent Component Sequence + accDescr: When user visits site, component mounts on client and checks document cookie. If cookie exists, notification is hidden. If not, it shows notification and sets cookie after 1 second, or user can click close participant User participant Component participant Browser diff --git a/docs/architecture/components/index.md b/docs/architecture/components/index.md index 19cad3a..cbae68e 100644 --- a/docs/architecture/components/index.md +++ b/docs/architecture/components/index.md @@ -19,6 +19,8 @@ This document describes the internal architecture, relationships, and usage of m ```mermaid flowchart TD + accTitle: Page Component Composition Tree + accDescr: Root Layout wraps Navbar, Main Content, Footer, and ServiceWorkerRegister. Main Content contains Banner, ProjectsGrid, Publications, StarsBackground, CookieSnackbar. Banner contains Avatar. ProjectsGrid and Publications generate cards. Footer contains social links RootLayout[Root Layout] --> Navbar RootLayout --> Main[Main Content] RootLayout --> Footer @@ -186,6 +188,8 @@ Data flow: ```mermaid sequenceDiagram + accTitle: Page Data Integration and Analytics Flow + accDescr: Page imports projects, publications, socials from data. Data is passed as props to components. Components render UI and log analytics events to Firebase participant Page participant Data participant Component @@ -231,6 +235,8 @@ sequenceDiagram ```mermaid flowchart LR + accTitle: Component Data and Event Flow + accDescr: Data is imported from src/data into page.tsx. Page passes data as props to ProjectsGrid, Publications, Footer, Navbar and Avatar. All components log events to Firebase Data[src/data/] -->|Import| Page[page.tsx] Page -->|Props| ProjectsGrid Page -->|Props| Publications diff --git a/docs/architecture/components/navbar.md b/docs/architecture/components/navbar.md index f7a1f35..ae5212a 100644 --- a/docs/architecture/components/navbar.md +++ b/docs/architecture/components/navbar.md @@ -10,14 +10,18 @@ The Navbar component is a fixed-position navigation bar located in [`src/compone ```mermaid flowchart LR + accTitle: Navbar Navigation Structure + accDescr: Navbar contains Home button and links for Projects, Publications, Socials, and Resume. Each item scrolls to or opens its target section or PDF Navbar[Navbar] -->|Contains| Home[Home Button] Navbar -->|Contains| Projects[Projects Link] Navbar -->|Contains| Pubs[Publications Link] + Navbar -->|Contains| Socials[Socials Link] Navbar -->|Contains| Resume[Resume Link] Home -->|Scroll to| Top[Page Top] Projects -->|Scroll to| ProjectsGrid[Projects Grid] Pubs -->|Scroll to| PublicationsList[Publications] + Socials -->|Scroll to| Footer[Footer / Socials] Resume -->|Opens| PDF[Resume PDF] ``` @@ -57,6 +61,7 @@ logAnalyticsEvent('navbar_home', { - `navbar_home` - Home button click - `navbar_projects` - Projects link click - `navbar_publications` - Publications link click +- `navbar_socials` - Socials link click - `navbar_resume` - Resume link click ### 3. Responsive Design @@ -121,6 +126,18 @@ if (pathname === '/') { **Target:** `#publications` section **Text:** "Publications" +### Socials Link + +**Icon:** Profile picture (drawn avatar) +**Target:** `#socials` section (Footer) +**Behavior:** Displays a small profile image that links to the social media links in the footer + +```tsx + + Logo + +``` + ### Resume Link **Target:** External PDF (`/resume/resume.pdf`) @@ -147,6 +164,8 @@ if (pathname === '/') { ```mermaid sequenceDiagram + accTitle: Navbar Navigation Interaction Sequence + accDescr: User clicks navbar items. Navbar logs events, checks pathname, then either smooth scrolls on home page or navigates to hash on other pages. Shows both Projects and Socials click flows participant User participant Navbar participant Router @@ -164,6 +183,18 @@ sequenceDiagram Navbar->>Router: Navigate to /#projects-grid Router->>DOM: Scroll to section end + + User->>Navbar: Click Socials + Navbar->>Analytics: Log event + Navbar->>Router: Check pathname + + alt On Home Page + Navbar->>DOM: getElementById('socials') + DOM->>DOM: scrollIntoView({behavior: 'smooth'}) + else On Other Page + Navbar->>Router: Navigate to /#socials + Router->>DOM: Scroll to section + end ``` ## Accessibility Features diff --git a/docs/architecture/components/projects.md b/docs/architecture/components/projects.md index 8c0f15e..f2eda7d 100644 --- a/docs/architecture/components/projects.md +++ b/docs/architecture/components/projects.md @@ -22,6 +22,8 @@ The projects grid is displayed using the `ProjectsGrid` component located in [Pr ```mermaid flowchart LR + accTitle: Projects Grid Data Flow + accDescr: ProjectsGrid component fetches projects data, maps to grid items, displays project cards with thumbnail image, name, title/employer, and action links. Includes network-aware video autoplay A[ProjectsGrid Component] -->|Fetches| B[Projects Data] B --> C[Maps Projects to Grid Items] C --> D[Displays Project Cards] diff --git a/docs/architecture/components/publications.md b/docs/architecture/components/publications.md index 2af65a3..ed0aa6c 100644 --- a/docs/architecture/components/publications.md +++ b/docs/architecture/components/publications.md @@ -18,6 +18,8 @@ The publications list is displayed using the `Publications` component located in ```mermaid flowchart LR + accTitle: Publications List Data Flow + accDescr: Publications component fetches publication data, maps to list items, displays publication cards with title, authors, metadata, and abstract A[Publications Component] -->|Fetches| B[Publications Data] B --> C[Maps Publications to List Items] C --> D[Displays Publication Cards] diff --git a/docs/architecture/components/socials.md b/docs/architecture/components/socials.md index 656cb15..4ccbc22 100644 --- a/docs/architecture/components/socials.md +++ b/docs/architecture/components/socials.md @@ -17,6 +17,8 @@ The social media links are displayed using the `Footer` component located in [Fo ```mermaid flowchart LR + accTitle: Social Media Links Display Flow + accDescr: Footer component fetches socials data, maps to grid items, displays social media icons with tooltips and links to each platform A[Footer Component] -->|Fetches| B[Socials Data] B --> C[Maps Socials to Grid Items] C --> D[Displays Social Media Icons] diff --git a/docs/architecture/components/stars.md b/docs/architecture/components/stars.md index e6f1869..7bd1a59 100644 --- a/docs/architecture/components/stars.md +++ b/docs/architecture/components/stars.md @@ -12,6 +12,8 @@ The StarsBackground component creates a visually appealing animated background w ```mermaid flowchart TD + accTitle: StarsBackground Component Architecture + accDescr: StarsBackground creates a sky container with star elements that have random positions, sizes, twinkle animations, and occasional shooting star effects StarsBackground[StarsBackground] -->|Creates| Container[Sky Container] Container -->|Generates| Stars[Star Elements] Stars -->|Random| Position[Random Positions] @@ -94,8 +96,6 @@ The `twinkle` keyframe animation should be defined in global styles: Stars can become shooting stars on hover or through automatic triggering: ```typescript -import { THRESHOLDS } from '@constants/index'; - const handleStarAnimation = (e: React.MouseEvent | { target: HTMLElement }): void => { const target = e.target as HTMLElement; const shootingStarSpeed = Math.random() * 4 + 1; @@ -140,6 +140,8 @@ const handleForceStarAnimation = () => { ```mermaid sequenceDiagram + accTitle: StarsBackground Mount and Rendering Sequence + accDescr: On mount, component calculates star count, generates star properties, updates state, renders elements, and applies CSS animations participant Component participant State participant DOM @@ -242,6 +244,8 @@ To customize the background: ```mermaid stateDiagram-v2 + accTitle: Star Twinkle Animation Life Cycle + accDescr: Stars cycle through visible (opacity 1), fading (2-5s random), dim (opacity 0.3), brightening (2-5s random), then back to visible state [*] --> Visible: opacity 1 Visible --> Fading: 2-5s random Fading --> Dim: opacity 0.3 diff --git a/docs/architecture/data.md b/docs/architecture/data.md index e018a8e..02d85b5 100644 --- a/docs/architecture/data.md +++ b/docs/architecture/data.md @@ -6,6 +6,8 @@ The portfolio stores all content as TypeScript files in [src/data/](../../src/da ```mermaid sequenceDiagram + accTitle: Build-Time Data Integration Sequence + accDescr: Shows how build process imports and type-checks data files, passes them as props to components, renders HTML with embedded data, avoiding any runtime data fetching participant Build[Build Process] participant Data[Data Files] participant Component diff --git a/docs/architecture/helpers.md b/docs/architecture/helpers.md index cd7f178..adefe0b 100644 --- a/docs/architecture/helpers.md +++ b/docs/architecture/helpers.md @@ -25,6 +25,8 @@ The AAAAHHHH helper ([src/helpers/aaaahhhh.ts](../../src/helpers/aaaahhhh.ts)) t ```mermaid flowchart TD + accTitle: AAAAHHHH Transformation Logic Flow + accDescr: When avatar sneezes 6 times, the aaaahhhh function is called which transforms text (first half becomes A, second half becomes H) and replaces all images with the aaaahhhh image, then applies changes to the page Trigger[Avatar sneezes 6 times] --> Call[aaaahhhh function] Call --> Text[textAAAAHHHH] Call --> Images[imageAAAAHHHH] diff --git a/docs/architecture/index.md b/docs/architecture/index.md index eb6c509..7f791ff 100644 --- a/docs/architecture/index.md +++ b/docs/architecture/index.md @@ -30,6 +30,8 @@ The application follows this request lifecycle: ```mermaid flowchart TD + accTitle: System Request Lifecycle + accDescr: Request flow showing how a browser request is processed by Next.js server, rendered using static data, and hydrated on client with service worker and Firebase initialization Browser[User Browser] -->|HTTP Request| NextJS[Next.js Server] NextJS -->|SSR| Layout[Render Root Layout] Layout -->|Nest| Page[Render Page] diff --git a/docs/architecture/layouts.md b/docs/architecture/layouts.md index 0213921..ad7a963 100644 --- a/docs/architecture/layouts.md +++ b/docs/architecture/layouts.md @@ -29,6 +29,8 @@ The GeneralLayout component wraps all page content and provides a consistent str ```mermaid flowchart TD + accTitle: GeneralLayout Component Composition + accDescr: GeneralLayout main wrapper contains Navbar, Main content area (flex container), StarsBackground, CookieSnackbar, and Footer. Main content holds page-specific children GeneralLayout["GeneralLayout
(Main Wrapper)"] GeneralLayout -->|Contains| Navbar GeneralLayout -->|Contains| Main["Main Content
(Flex Container)"] diff --git a/docs/architecture/pwa.md b/docs/architecture/pwa.md index 44ee0f2..59e780b 100644 --- a/docs/architecture/pwa.md +++ b/docs/architecture/pwa.md @@ -18,6 +18,8 @@ The PWA implementation relies on Next.js's built-in metadata and route handlers, ```mermaid flowchart TD + accTitle: PWA Manifest and Icons Request Flow + accDescr: Browser requests PWA manifest from Next.js server which generates JSON and references icons. Browser downloads icons and shows install prompt to user Browser[User Browser] Manifest["src/app/manifest.ts"] Icons["public/icon/"] diff --git a/docs/architecture/utils.md b/docs/architecture/utils.md index ec635e1..2281f16 100644 --- a/docs/architecture/utils.md +++ b/docs/architecture/utils.md @@ -43,6 +43,8 @@ The function checks three network characteristics: ```mermaid flowchart TD + accTitle: Network Speed Detection Decision Tree + accDescr: Decision tree showing how isNetworkFast checks Connection API availability, save data mode, network type, downlink speed, and RTT to determine if network is fast enough for video autoplay A["isNetworkFast() called"] --> B{"Connection API
available?"} B -->|No| C["Assume fast
(return true)"] B -->|Yes| D{"Save Data
mode?"} diff --git a/docs/usage/testing.md b/docs/usage/testing.md index 1bfb8e9..43c5511 100644 --- a/docs/usage/testing.md +++ b/docs/usage/testing.md @@ -20,6 +20,8 @@ The testing setup in this codebase uses Cypress for end-to-end (E2E) testing. Th ```mermaid flowchart TD + accTitle: Validation Pipeline Workflow + accDescr: npm run validate executes: Prettier formatting, ESLint code quality, TypeScript type checking, Jest unit tests, Cypress E2E tests, Next.js build, and Markdown linting. Each step can fail with specific fix commands Validate[npm run validate] --> Prettier[Prettier Format] Prettier --> ESLint[ESLint Check] ESLint --> TSC[TypeScript Check] diff --git a/eslint.config.js b/eslint.config.js index beb66eb..d37159b 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -1,4 +1,3 @@ -const eslintPluginPrettier = require('eslint-plugin-prettier'); const globals = require('globals'); const react = require('eslint-plugin-react'); const reactHooks = require('eslint-plugin-react-hooks'); @@ -34,7 +33,6 @@ module.exports = [ }, }, plugins: { - prettier: eslintPluginPrettier, react, 'react-hooks': reactHooks, }, @@ -53,7 +51,6 @@ module.exports = [ 'no-param-reassign': 'off', 'no-restricted-syntax': 'off', 'no-unused-vars': ['error', { argsIgnorePattern: '^_', varsIgnorePattern: '^_' }], - 'prettier/prettier': 'warn', radix: 'off', 'react-hooks/rules-of-hooks': 'error', 'react/forbid-prop-types': 'off', diff --git a/jest.config.js b/jest.config.js index fb88185..f256fcf 100644 --- a/jest.config.js +++ b/jest.config.js @@ -1,15 +1,25 @@ module.exports = { preset: 'ts-jest', moduleNameMapper: { + '^@$': '/src/index.ts', '^@/(.*)$': '/src/$1', + '^@components$': '/src/components/index.ts', '^@components/(.*)$': '/src/components/$1', + '^@configs$': '/src/configs/index.ts', '^@configs/(.*)$': '/src/configs/$1', + '^@constants$': '/src/constants/index.ts', '^@constants/(.*)$': '/src/constants/$1', + '^@data$': '/src/data/index.ts', '^@data/(.*)$': '/src/data/$1', + '^@helpers$': '/src/helpers/index.ts', '^@helpers/(.*)$': '/src/helpers/$1', + '^@images$': '/src/images/index.ts', '^@images/(.*)$': '/src/images/$1', + '^@layouts$': '/src/layouts/index.ts', '^@layouts/(.*)$': '/src/layouts/$1', + '^@styles$': '/src/styles/index.ts', '^@styles/(.*)$': '/src/styles/$1', + '^@util$': '/src/util/index.ts', '^@util/(.*)$': '/src/util/$1', '\\.(css|less|scss|sass)$': 'jest-transform-stub', '\\.(svg|png|jpg|jpeg|gif|webp)$': '/jest/svg-mock.js', diff --git a/package-lock.json b/package-lock.json index 101c94d..7245edc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,49 +10,47 @@ "dependencies": { "@emotion/react": "^11.14.0", "@emotion/styled": "^11.14.1", - "@mui/icons-material": "^7.3.8", - "@mui/material": "^7.3.8", + "@mui/icons-material": "^7.3.9", + "@mui/material": "^7.3.9", "@sentry/integrations": "^7.114.0", - "@sentry/nextjs": "^10.39.0", - "@vercel/speed-insights": "^1.3.1", - "firebase": "^12.9.0", + "@sentry/nextjs": "^10.43.0", + "@vercel/speed-insights": "^2.0.0", + "firebase": "^12.10.0", "lodash": "^4.17.23", "next": "^16.1.6", "react": "^19.2.4", "react-dom": "^19.2.4", "sharp": "^0.34.5", - "webpack": "^5.105.2" + "webpack": "^5.105.4" }, "devDependencies": { - "@sentry/core": "^10.39.0", - "@sentry/types": "^10.39.0", + "@sentry/core": "^10.43.0", + "@sentry/types": "^10.43.0", "@svgr/webpack": "^8.1.0", "@testing-library/jest-dom": "^6.9.1", "@testing-library/react": "^16.3.2", "@trivago/prettier-plugin-sort-imports": "^6.0.2", "@types/jest": "^30.0.0", - "@types/lodash": "^4.17.23", - "@types/node": "^25.3.0", + "@types/lodash": "^4.17.24", + "@types/node": "^25.4.0", "@types/react": "^19.2.14", "@types/react-dom": "^19.2.3", - "caniuse-lite": "^1.0.30001770", + "caniuse-lite": "^1.0.30001777", "concurrently": "^9.2.1", - "cypress": "^15.10.0", + "cypress": "^15.11.0", "cypress-axe": "^1.7.0", - "eslint": "^9.39.2", - "eslint-config-prettier": "^10.1.8", - "eslint-plugin-cypress": "^6.0.0", - "eslint-plugin-prettier": "^5.5.5", + "eslint": "^9.39.4", + "eslint-plugin-cypress": "^6.2.0", "eslint-plugin-react": "^7.37.5", "eslint-plugin-react-hooks": "^7.0.1", - "globals": "^17.3.0", - "jest": "^30.2.0", - "jest-environment-jsdom": "^30.2.0", + "globals": "^17.4.0", + "jest": "^30.3.0", + "jest-environment-jsdom": "^30.3.0", "jest-transform-stub": "^2.0.0", - "markdownlint-cli": "^0.47.0", + "markdownlint-cli": "^0.48.0", "prettier": "^3.8.1", - "sass": "^1.97.3", - "start-server-and-test": "^2.1.3", + "sass": "^1.98.0", + "start-server-and-test": "^2.1.5", "ts-jest": "^29.4.6", "typescript": "^5.9.3" } @@ -64,23 +62,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@apm-js-collab/code-transformer": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/@apm-js-collab/code-transformer/-/code-transformer-0.8.2.tgz", - "integrity": "sha512-YRjJjNq5KFSjDUoqu5pFUWrrsvGOxl6c3bu+uMFc9HNNptZ2rNU/TI2nLw4jnhQNtka972Ee2m3uqbvDQtPeCA==", - "license": "Apache-2.0" - }, - "node_modules/@apm-js-collab/tracing-hooks": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@apm-js-collab/tracing-hooks/-/tracing-hooks-0.3.1.tgz", - "integrity": "sha512-Vu1CbmPURlN5fTboVuKMoJjbO5qcq9fA5YXpskx3dXe/zTBvjODFoerw+69rVBlRLrJpwPqSDqEuJDEKIrTldw==", - "license": "Apache-2.0", - "dependencies": { - "@apm-js-collab/code-transformer": "^0.8.0", - "debug": "^4.4.1", - "module-details-from-path": "^1.0.4" - } - }, "node_modules/@asamuzakjp/css-color": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-3.2.0.tgz", @@ -247,9 +228,9 @@ } }, "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.6.6", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.6.tgz", - "integrity": "sha512-mOAsxeeKkUKayvZR3HeTYD/fICpCPLJrU5ZjelT/PA6WHtNDBOE436YiaEUvHN454bRM3CebhDsIpieCc4texA==", + "version": "0.6.7", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.7.tgz", + "integrity": "sha512-6Fqi8MtQ/PweQ9xvux65emkLQ83uB+qAVtfHkC9UodyHMIZdxNI01HjLCLUtybElp2KY2XNE0nOgyP1E1vXw9w==", "dev": true, "license": "MIT", "dependencies": { @@ -2179,6 +2160,14 @@ "tslib": "^2.4.0" } }, + "node_modules/@emnapi/core/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD", + "optional": true + }, "node_modules/@emnapi/runtime": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.8.1.tgz", @@ -2189,6 +2178,13 @@ "tslib": "^2.4.0" } }, + "node_modules/@emnapi/runtime/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD", + "optional": true + }, "node_modules/@emnapi/wasi-threads": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz", @@ -2200,6 +2196,14 @@ "tslib": "^2.4.0" } }, + "node_modules/@emnapi/wasi-threads/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD", + "optional": true + }, "node_modules/@emotion/babel-plugin": { "version": "11.13.5", "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.13.5.tgz", @@ -2389,20 +2393,27 @@ } }, "node_modules/@eslint/config-array": { - "version": "0.21.1", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz", - "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==", + "version": "0.21.2", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.2.tgz", + "integrity": "sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw==", "dev": true, "license": "Apache-2.0", "dependencies": { "@eslint/object-schema": "^2.1.7", "debug": "^4.3.1", - "minimatch": "^3.1.2" + "minimatch": "^3.1.5" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, + "node_modules/@eslint/config-array/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, "node_modules/@eslint/config-array/node_modules/brace-expansion": { "version": "1.1.12", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", @@ -2415,9 +2426,9 @@ } }, "node_modules/@eslint/config-array/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, "license": "ISC", "dependencies": { @@ -2454,20 +2465,20 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.3.tgz", - "integrity": "sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==", + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.5.tgz", + "integrity": "sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg==", "dev": true, "license": "MIT", "dependencies": { - "ajv": "^6.12.4", + "ajv": "^6.14.0", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.1", - "minimatch": "^3.1.2", + "minimatch": "^3.1.5", "strip-json-comments": "^3.1.1" }, "engines": { @@ -2477,6 +2488,13 @@ "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==", + "dev": true, + "license": "MIT" + }, "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { "version": "1.1.12", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", @@ -2502,9 +2520,9 @@ } }, "node_modules/@eslint/eslintrc/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, "license": "ISC", "dependencies": { @@ -2515,9 +2533,9 @@ } }, "node_modules/@eslint/js": { - "version": "9.39.2", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.2.tgz", - "integrity": "sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==", + "version": "9.39.4", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.4.tgz", + "integrity": "sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw==", "dev": true, "license": "MIT", "engines": { @@ -2551,16 +2569,70 @@ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, + "node_modules/@fastify/otel": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/@fastify/otel/-/otel-0.16.0.tgz", + "integrity": "sha512-2304BdM5Q/kUvQC9qJO1KZq3Zn1WWsw+WWkVmFEaj1UE2hEIiuFqrPeglQOwEtw/ftngisqfQ3v70TWMmwhhHA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "MIT", + "dependencies": { + "@opentelemetry/core": "^2.0.0", + "@opentelemetry/instrumentation": "^0.208.0", + "@opentelemetry/semantic-conventions": "^1.28.0", + "minimatch": "^10.0.3" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.9.0" + } + }, + "node_modules/@fastify/otel/node_modules/@opentelemetry/api-logs": { + "version": "0.208.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.208.0.tgz", + "integrity": "sha512-CjruKY9V6NMssL/T1kAFgzosF1v9o6oeN+aX5JB/C/xPNtmgIJqcXHG7fA82Ou1zCpWGl4lROQUKwUNE1pMCyg==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api": "^1.3.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@fastify/otel/node_modules/@opentelemetry/instrumentation": { + "version": "0.208.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.208.0.tgz", + "integrity": "sha512-Eju0L4qWcQS+oXxi6pgh7zvE2byogAkcsVv0OjHF/97iOz1N/aKE6etSGowYkie+YA1uo6DNwdSxaaNnLvcRlA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.208.0", + "import-in-the-middle": "^2.0.0", + "require-in-the-middle": "^8.0.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, "node_modules/@firebase/ai": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/@firebase/ai/-/ai-2.8.0.tgz", - "integrity": "sha512-grWYGFPsSo+pt+6CYeKR0kWnUfoLLS3xgWPvNrhAS5EPxl6xWq7+HjDZqX24yLneETyl45AVgDsTbVgxeWeRfg==", + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/@firebase/ai/-/ai-2.9.0.tgz", + "integrity": "sha512-NPvBBuvdGo9x3esnABAucFYmqbBmXvyTMimBq2PCuLZbdANZoHzGlx7vfzbwNDaEtCBq4RGGNMliLIv6bZ+PtA==", "license": "Apache-2.0", "dependencies": { "@firebase/app-check-interop-types": "0.3.3", - "@firebase/component": "0.7.0", + "@firebase/component": "0.7.1", "@firebase/logger": "0.5.0", - "@firebase/util": "1.13.0", + "@firebase/util": "1.14.0", "tslib": "^2.1.0" }, "engines": { @@ -2571,16 +2643,22 @@ "@firebase/app-types": "0.x" } }, + "node_modules/@firebase/ai/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, "node_modules/@firebase/analytics": { - "version": "0.10.19", - "resolved": "https://registry.npmjs.org/@firebase/analytics/-/analytics-0.10.19.tgz", - "integrity": "sha512-3wU676fh60gaiVYQEEXsbGS4HbF2XsiBphyvvqDbtC1U4/dO4coshbYktcCHq+HFaGIK07iHOh4pME0hEq1fcg==", + "version": "0.10.20", + "resolved": "https://registry.npmjs.org/@firebase/analytics/-/analytics-0.10.20.tgz", + "integrity": "sha512-adGTNVUWH5q66tI/OQuKLSN6mamPpfYhj0radlH2xt+3eL6NFPtXoOs+ulvs+UsmK27vNFx5FjRDfWk+TyduHg==", "license": "Apache-2.0", "dependencies": { - "@firebase/component": "0.7.0", - "@firebase/installations": "0.6.19", + "@firebase/component": "0.7.1", + "@firebase/installations": "0.6.20", "@firebase/logger": "0.5.0", - "@firebase/util": "1.13.0", + "@firebase/util": "1.14.0", "tslib": "^2.1.0" }, "peerDependencies": { @@ -2588,36 +2666,48 @@ } }, "node_modules/@firebase/analytics-compat": { - "version": "0.2.25", - "resolved": "https://registry.npmjs.org/@firebase/analytics-compat/-/analytics-compat-0.2.25.tgz", - "integrity": "sha512-fdzoaG0BEKbqksRDhmf4JoyZf16Wosrl0Y7tbZtJyVDOOwziE0vrFjmZuTdviL0yhak+Nco6rMsUUbkbD+qb6Q==", + "version": "0.2.26", + "resolved": "https://registry.npmjs.org/@firebase/analytics-compat/-/analytics-compat-0.2.26.tgz", + "integrity": "sha512-0j2ruLOoVSwwcXAF53AMoniJKnkwiTjGVfic5LDzqiRkR13vb5j6TXMeix787zbLeQtN/m1883Yv1TxI0gItbA==", "license": "Apache-2.0", "dependencies": { - "@firebase/analytics": "0.10.19", + "@firebase/analytics": "0.10.20", "@firebase/analytics-types": "0.8.3", - "@firebase/component": "0.7.0", - "@firebase/util": "1.13.0", + "@firebase/component": "0.7.1", + "@firebase/util": "1.14.0", "tslib": "^2.1.0" }, "peerDependencies": { "@firebase/app-compat": "0.x" } }, + "node_modules/@firebase/analytics-compat/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, "node_modules/@firebase/analytics-types": { "version": "0.8.3", "resolved": "https://registry.npmjs.org/@firebase/analytics-types/-/analytics-types-0.8.3.tgz", "integrity": "sha512-VrIp/d8iq2g501qO46uGz3hjbDb8xzYMrbu8Tp0ovzIzrvJZ2fvmj649gTjge/b7cCCcjT0H37g1gVtlNhnkbg==", "license": "Apache-2.0" }, + "node_modules/@firebase/analytics/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, "node_modules/@firebase/app": { - "version": "0.14.8", - "resolved": "https://registry.npmjs.org/@firebase/app/-/app-0.14.8.tgz", - "integrity": "sha512-WiE9uCGRLUnShdjb9iP20sA3ToWrBbNXr14/N5mow7Nls9dmKgfGaGX5cynLvrltxq2OrDLh1VDNaUgsnS/k/g==", + "version": "0.14.9", + "resolved": "https://registry.npmjs.org/@firebase/app/-/app-0.14.9.tgz", + "integrity": "sha512-3gtUX0e584MYkKBQMgSECMvE1Dwzg+eONefDQ0wxVSe5YMBsZwdN5pL7UapwWBlV8+i8QCztF9TP947tEjZAGA==", "license": "Apache-2.0", "dependencies": { - "@firebase/component": "0.7.0", + "@firebase/component": "0.7.1", "@firebase/logger": "0.5.0", - "@firebase/util": "1.13.0", + "@firebase/util": "1.14.0", "idb": "7.1.1", "tslib": "^2.1.0" }, @@ -2626,14 +2716,14 @@ } }, "node_modules/@firebase/app-check": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@firebase/app-check/-/app-check-0.11.0.tgz", - "integrity": "sha512-XAvALQayUMBJo58U/rxW02IhsesaxxfWVmVkauZvGEz3vOAjMEQnzFlyblqkc2iAaO82uJ2ZVyZv9XzPfxjJ6w==", + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/@firebase/app-check/-/app-check-0.11.1.tgz", + "integrity": "sha512-gmKfwQ2k8aUQlOyRshc+fOQLq0OwUmibIZvpuY1RDNu2ho0aTMlwxOuEiJeYOs7AxzhSx7gnXPFNsXCFbnvXUQ==", "license": "Apache-2.0", "dependencies": { - "@firebase/component": "0.7.0", + "@firebase/component": "0.7.1", "@firebase/logger": "0.5.0", - "@firebase/util": "1.13.0", + "@firebase/util": "1.14.0", "tslib": "^2.1.0" }, "engines": { @@ -2644,16 +2734,16 @@ } }, "node_modules/@firebase/app-check-compat": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@firebase/app-check-compat/-/app-check-compat-0.4.0.tgz", - "integrity": "sha512-UfK2Q8RJNjYM/8MFORltZRG9lJj11k0nW84rrffiKvcJxLf1jf6IEjCIkCamykHE73C6BwqhVfhIBs69GXQV0g==", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@firebase/app-check-compat/-/app-check-compat-0.4.1.tgz", + "integrity": "sha512-yjSvSl5B1u4CirnxhzirN1uiTRCRfx+/qtfbyeyI+8Cx8Cw1RWAIO/OqytPSVwLYbJJ1vEC3EHfxazRaMoWKaA==", "license": "Apache-2.0", "dependencies": { - "@firebase/app-check": "0.11.0", + "@firebase/app-check": "0.11.1", "@firebase/app-check-types": "0.5.3", - "@firebase/component": "0.7.0", + "@firebase/component": "0.7.1", "@firebase/logger": "0.5.0", - "@firebase/util": "1.13.0", + "@firebase/util": "1.14.0", "tslib": "^2.1.0" }, "engines": { @@ -2663,6 +2753,12 @@ "@firebase/app-compat": "0.x" } }, + "node_modules/@firebase/app-check-compat/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, "node_modules/@firebase/app-check-interop-types": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/@firebase/app-check-interop-types/-/app-check-interop-types-0.3.3.tgz", @@ -2675,37 +2771,55 @@ "integrity": "sha512-hyl5rKSj0QmwPdsAxrI5x1otDlByQ7bvNvVt8G/XPO2CSwE++rmSVf3VEhaeOR4J8ZFaF0Z0NDSmLejPweZ3ng==", "license": "Apache-2.0" }, + "node_modules/@firebase/app-check/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, "node_modules/@firebase/app-compat": { - "version": "0.5.8", - "resolved": "https://registry.npmjs.org/@firebase/app-compat/-/app-compat-0.5.8.tgz", - "integrity": "sha512-4De6SUZ36zozl9kh5rZSxKWULpgty27rMzZ6x+xkoo7+NWyhWyFdsdvhFsWhTw/9GGj0wXIcbTjwHYCUIUuHyg==", + "version": "0.5.9", + "resolved": "https://registry.npmjs.org/@firebase/app-compat/-/app-compat-0.5.9.tgz", + "integrity": "sha512-e5LzqjO69/N2z7XcJeuMzIp4wWnW696dQeaHAUpQvGk89gIWHAIvG6W+mA3UotGW6jBoqdppEJ9DnuwbcBByug==", "license": "Apache-2.0", "dependencies": { - "@firebase/app": "0.14.8", - "@firebase/component": "0.7.0", + "@firebase/app": "0.14.9", + "@firebase/component": "0.7.1", "@firebase/logger": "0.5.0", - "@firebase/util": "1.13.0", + "@firebase/util": "1.14.0", "tslib": "^2.1.0" }, "engines": { "node": ">=20.0.0" } }, + "node_modules/@firebase/app-compat/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, "node_modules/@firebase/app-types": { "version": "0.9.3", "resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.9.3.tgz", "integrity": "sha512-kRVpIl4vVGJ4baogMDINbyrIOtOxqhkZQg4jTq3l8Lw6WSk0xfpEYzezFu+Kl4ve4fbPl79dvwRtaFqAC/ucCw==", "license": "Apache-2.0" }, + "node_modules/@firebase/app/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, "node_modules/@firebase/auth": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/@firebase/auth/-/auth-1.12.0.tgz", - "integrity": "sha512-zkvLpsrxynWHk07qGrUDfCSqKf4AvfZGEqJ7mVCtYGjNNDbGE71k0Yn84rg8QEZu4hQw1BC0qDEHzpNVBcSVmA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@firebase/auth/-/auth-1.12.1.tgz", + "integrity": "sha512-nXKj7d5bMBlnq6XpcQQpmnSVwEeHBkoVbY/+Wk0P1ebLSICoH4XPtvKOFlXKfIHmcS84mLQ99fk3njlDGKSDtw==", "license": "Apache-2.0", "dependencies": { - "@firebase/component": "0.7.0", + "@firebase/component": "0.7.1", "@firebase/logger": "0.5.0", - "@firebase/util": "1.13.0", + "@firebase/util": "1.14.0", "tslib": "^2.1.0" }, "engines": { @@ -2722,15 +2836,15 @@ } }, "node_modules/@firebase/auth-compat": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/@firebase/auth-compat/-/auth-compat-0.6.2.tgz", - "integrity": "sha512-8UhCzF6pav9bw/eXA8Zy1QAKssPRYEYXaWagie1ewLTwHkXv6bKp/j6/IwzSYQP67sy/BMFXIFaCCsoXzFLr7A==", + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/@firebase/auth-compat/-/auth-compat-0.6.3.tgz", + "integrity": "sha512-nHOkupcYuGVxI1AJJ/OBhLPaRokbP14Gq4nkkoVvf1yvuREEWqdnrYB/CdsSnPxHMAnn5wJIKngxBF9jNX7s/Q==", "license": "Apache-2.0", "dependencies": { - "@firebase/auth": "1.12.0", + "@firebase/auth": "1.12.1", "@firebase/auth-types": "0.13.0", - "@firebase/component": "0.7.0", - "@firebase/util": "1.13.0", + "@firebase/component": "0.7.1", + "@firebase/util": "1.14.0", "tslib": "^2.1.0" }, "engines": { @@ -2740,6 +2854,12 @@ "@firebase/app-compat": "0.x" } }, + "node_modules/@firebase/auth-compat/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, "node_modules/@firebase/auth-interop-types": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/@firebase/auth-interop-types/-/auth-interop-types-0.2.4.tgz", @@ -2756,46 +2876,64 @@ "@firebase/util": "1.x" } }, + "node_modules/@firebase/auth/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, "node_modules/@firebase/component": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.7.0.tgz", - "integrity": "sha512-wR9En2A+WESUHexjmRHkqtaVH94WLNKt6rmeqZhSLBybg4Wyf0Umk04SZsS6sBq4102ZsDBFwoqMqJYj2IoDSg==", + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.7.1.tgz", + "integrity": "sha512-mFzsm7CLHR60o08S23iLUY8m/i6kLpOK87wdEFPLhdlCahaxKmWOwSVGiWoENYSmFJJoDhrR3gKSCxz7ENdIww==", "license": "Apache-2.0", "dependencies": { - "@firebase/util": "1.13.0", + "@firebase/util": "1.14.0", "tslib": "^2.1.0" }, "engines": { "node": ">=20.0.0" } }, + "node_modules/@firebase/component/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, "node_modules/@firebase/data-connect": { - "version": "0.3.12", - "resolved": "https://registry.npmjs.org/@firebase/data-connect/-/data-connect-0.3.12.tgz", - "integrity": "sha512-baPddcoNLj/+vYo+HSJidJUdr5W4OkhT109c5qhR8T1dJoZcyJpkv/dFpYlw/VJ3dV66vI8GHQFrmAZw/xUS4g==", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@firebase/data-connect/-/data-connect-0.4.0.tgz", + "integrity": "sha512-vLXM6WHNIR3VtEeYNUb/5GTsUOyl3Of4iWNZHBe1i9f88sYFnxybJNWVBjvJ7flhCyF8UdxGpzWcUnv6F5vGfg==", "license": "Apache-2.0", "dependencies": { "@firebase/auth-interop-types": "0.2.4", - "@firebase/component": "0.7.0", + "@firebase/component": "0.7.1", "@firebase/logger": "0.5.0", - "@firebase/util": "1.13.0", + "@firebase/util": "1.14.0", "tslib": "^2.1.0" }, "peerDependencies": { "@firebase/app": "0.x" } }, + "node_modules/@firebase/data-connect/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, "node_modules/@firebase/database": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@firebase/database/-/database-1.1.0.tgz", - "integrity": "sha512-gM6MJFae3pTyNLoc9VcJNuaUDej0ctdjn3cVtILo3D5lpp0dmUHHLFN/pUKe7ImyeB1KAvRlEYxvIHNF04Filg==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@firebase/database/-/database-1.1.1.tgz", + "integrity": "sha512-LwIXe8+mVHY5LBPulWECOOIEXDiatyECp/BOlu0gOhe+WOcKjWHROaCbLlkFTgHMY7RHr5MOxkLP/tltWAH3dA==", "license": "Apache-2.0", "dependencies": { "@firebase/app-check-interop-types": "0.3.3", "@firebase/auth-interop-types": "0.2.4", - "@firebase/component": "0.7.0", + "@firebase/component": "0.7.1", "@firebase/logger": "0.5.0", - "@firebase/util": "1.13.0", + "@firebase/util": "1.14.0", "faye-websocket": "0.11.4", "tslib": "^2.1.0" }, @@ -2804,41 +2942,53 @@ } }, "node_modules/@firebase/database-compat": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@firebase/database-compat/-/database-compat-2.1.0.tgz", - "integrity": "sha512-8nYc43RqxScsePVd1qe1xxvWNf0OBnbwHxmXJ7MHSuuTVYFO3eLyLW3PiCKJ9fHnmIz4p4LbieXwz+qtr9PZDg==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@firebase/database-compat/-/database-compat-2.1.1.tgz", + "integrity": "sha512-heAEVZ9Z8c8PnBUcmGh91JHX0cXcVa1yESW/xkLuwaX7idRFyLiN8sl73KXpR8ZArGoPXVQDanBnk6SQiekRCQ==", "license": "Apache-2.0", "dependencies": { - "@firebase/component": "0.7.0", - "@firebase/database": "1.1.0", - "@firebase/database-types": "1.0.16", + "@firebase/component": "0.7.1", + "@firebase/database": "1.1.1", + "@firebase/database-types": "1.0.17", "@firebase/logger": "0.5.0", - "@firebase/util": "1.13.0", + "@firebase/util": "1.14.0", "tslib": "^2.1.0" }, "engines": { "node": ">=20.0.0" } }, + "node_modules/@firebase/database-compat/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, "node_modules/@firebase/database-types": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-1.0.16.tgz", - "integrity": "sha512-xkQLQfU5De7+SPhEGAXFBnDryUWhhlFXelEg2YeZOQMCdoe7dL64DDAd77SQsR+6uoXIZY5MB4y/inCs4GTfcw==", + "version": "1.0.17", + "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-1.0.17.tgz", + "integrity": "sha512-4eWaM5fW3qEIHjGzfi3cf0Jpqi1xQsAdT6rSDE1RZPrWu8oGjgrq6ybMjobtyHQFgwGCykBm4YM89qDzc+uG/w==", "license": "Apache-2.0", "dependencies": { "@firebase/app-types": "0.9.3", - "@firebase/util": "1.13.0" + "@firebase/util": "1.14.0" } }, + "node_modules/@firebase/database/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, "node_modules/@firebase/firestore": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/@firebase/firestore/-/firestore-4.11.0.tgz", - "integrity": "sha512-Zb88s8rssBd0J2Tt+NUXMPt2sf+Dq7meatKiJf5t9oto1kZ8w9gK59Koe1uPVbaKfdgBp++N/z0I4G/HamyEhg==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@firebase/firestore/-/firestore-4.12.0.tgz", + "integrity": "sha512-PM47OyiiAAoAMB8kkq4Je14mTciaRoAPDd3ng3Ckqz9i2TX9D9LfxIRcNzP/OxzNV4uBKRq6lXoOggkJBQR3Gw==", "license": "Apache-2.0", "dependencies": { - "@firebase/component": "0.7.0", + "@firebase/component": "0.7.1", "@firebase/logger": "0.5.0", - "@firebase/util": "1.13.0", + "@firebase/util": "1.14.0", "@firebase/webchannel-wrapper": "1.0.5", "@grpc/grpc-js": "~1.9.0", "@grpc/proto-loader": "^0.7.8", @@ -2852,15 +3002,15 @@ } }, "node_modules/@firebase/firestore-compat": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/@firebase/firestore-compat/-/firestore-compat-0.4.5.tgz", - "integrity": "sha512-yVX1CkVvqBI4qbA56uZo42xFA4TNU0ICQ+9AFDvYq9U9Xu6iAx9lFDAk/tN+NGereQQXXCSnpISwc/oxsQqPLA==", + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/@firebase/firestore-compat/-/firestore-compat-0.4.6.tgz", + "integrity": "sha512-NgVyR4hHHN2FvSNQOtbgBOuVsEdD/in30d9FKbEvvITiAChrBN2nBstmhfjI4EOTnHaP8zigwvkNYFI9yKGAkQ==", "license": "Apache-2.0", "dependencies": { - "@firebase/component": "0.7.0", - "@firebase/firestore": "4.11.0", + "@firebase/component": "0.7.1", + "@firebase/firestore": "4.12.0", "@firebase/firestore-types": "3.0.3", - "@firebase/util": "1.13.0", + "@firebase/util": "1.14.0", "tslib": "^2.1.0" }, "engines": { @@ -2870,6 +3020,12 @@ "@firebase/app-compat": "0.x" } }, + "node_modules/@firebase/firestore-compat/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, "node_modules/@firebase/firestore-types": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@firebase/firestore-types/-/firestore-types-3.0.3.tgz", @@ -2880,17 +3036,23 @@ "@firebase/util": "1.x" } }, + "node_modules/@firebase/firestore/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, "node_modules/@firebase/functions": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/@firebase/functions/-/functions-0.13.1.tgz", - "integrity": "sha512-sUeWSb0rw5T+6wuV2o9XNmh9yHxjFI9zVGFnjFi+n7drTEWpl7ZTz1nROgGrSu472r+LAaj+2YaSicD4R8wfbw==", + "version": "0.13.2", + "resolved": "https://registry.npmjs.org/@firebase/functions/-/functions-0.13.2.tgz", + "integrity": "sha512-tHduUD+DeokM3NB1QbHCvEMoL16e8Z8JSkmuVA4ROoJKPxHn8ibnecHPO2e3nVCJR1D9OjuKvxz4gksfq92/ZQ==", "license": "Apache-2.0", "dependencies": { "@firebase/app-check-interop-types": "0.3.3", "@firebase/auth-interop-types": "0.2.4", - "@firebase/component": "0.7.0", + "@firebase/component": "0.7.1", "@firebase/messaging-interop-types": "0.2.3", - "@firebase/util": "1.13.0", + "@firebase/util": "1.14.0", "tslib": "^2.1.0" }, "engines": { @@ -2901,15 +3063,15 @@ } }, "node_modules/@firebase/functions-compat": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@firebase/functions-compat/-/functions-compat-0.4.1.tgz", - "integrity": "sha512-AxxUBXKuPrWaVNQ8o1cG1GaCAtXT8a0eaTDfqgS5VsRYLAR0ALcfqDLwo/QyijZj1w8Qf8n3Qrfy/+Im245hOQ==", + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@firebase/functions-compat/-/functions-compat-0.4.2.tgz", + "integrity": "sha512-YNxgnezvZDkqxqXa6cT7/oTeD4WXbxgIP7qZp4LFnathQv5o2omM6EoIhXiT9Ie5AoQDcIhG9Y3/dj+DFJGaGQ==", "license": "Apache-2.0", "dependencies": { - "@firebase/component": "0.7.0", - "@firebase/functions": "0.13.1", + "@firebase/component": "0.7.1", + "@firebase/functions": "0.13.2", "@firebase/functions-types": "0.6.3", - "@firebase/util": "1.13.0", + "@firebase/util": "1.14.0", "tslib": "^2.1.0" }, "engines": { @@ -2919,20 +3081,32 @@ "@firebase/app-compat": "0.x" } }, + "node_modules/@firebase/functions-compat/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, "node_modules/@firebase/functions-types": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/@firebase/functions-types/-/functions-types-0.6.3.tgz", "integrity": "sha512-EZoDKQLUHFKNx6VLipQwrSMh01A1SaL3Wg6Hpi//x6/fJ6Ee4hrAeswK99I5Ht8roiniKHw4iO0B1Oxj5I4plg==", "license": "Apache-2.0" }, + "node_modules/@firebase/functions/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, "node_modules/@firebase/installations": { - "version": "0.6.19", - "resolved": "https://registry.npmjs.org/@firebase/installations/-/installations-0.6.19.tgz", - "integrity": "sha512-nGDmiwKLI1lerhwfwSHvMR9RZuIH5/8E3kgUWnVRqqL7kGVSktjLTWEMva7oh5yxQ3zXfIlIwJwMcaM5bK5j8Q==", + "version": "0.6.20", + "resolved": "https://registry.npmjs.org/@firebase/installations/-/installations-0.6.20.tgz", + "integrity": "sha512-LOzvR7XHPbhS0YB5ANXhqXB5qZlntPpwU/4KFwhSNpXNsGk/sBQ9g5hepi0y0/MfenJLe2v7t644iGOOElQaHQ==", "license": "Apache-2.0", "dependencies": { - "@firebase/component": "0.7.0", - "@firebase/util": "1.13.0", + "@firebase/component": "0.7.1", + "@firebase/util": "1.14.0", "idb": "7.1.1", "tslib": "^2.1.0" }, @@ -2941,21 +3115,27 @@ } }, "node_modules/@firebase/installations-compat": { - "version": "0.2.19", - "resolved": "https://registry.npmjs.org/@firebase/installations-compat/-/installations-compat-0.2.19.tgz", - "integrity": "sha512-khfzIY3EI5LePePo7vT19/VEIH1E3iYsHknI/6ek9T8QCozAZshWT9CjlwOzZrKvTHMeNcbpo/VSOSIWDSjWdQ==", + "version": "0.2.20", + "resolved": "https://registry.npmjs.org/@firebase/installations-compat/-/installations-compat-0.2.20.tgz", + "integrity": "sha512-9C9pL/DIEGucmoPj8PlZTnztbX3nhNj5RTYVpUM7wQq/UlHywaYv99969JU/WHLvi9ptzIogXYS9d1eZ6XFe9g==", "license": "Apache-2.0", "dependencies": { - "@firebase/component": "0.7.0", - "@firebase/installations": "0.6.19", + "@firebase/component": "0.7.1", + "@firebase/installations": "0.6.20", "@firebase/installations-types": "0.5.3", - "@firebase/util": "1.13.0", + "@firebase/util": "1.14.0", "tslib": "^2.1.0" }, "peerDependencies": { "@firebase/app-compat": "0.x" } }, + "node_modules/@firebase/installations-compat/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, "node_modules/@firebase/installations-types": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/@firebase/installations-types/-/installations-types-0.5.3.tgz", @@ -2965,6 +3145,12 @@ "@firebase/app-types": "0.x" } }, + "node_modules/@firebase/installations/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, "node_modules/@firebase/logger": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.5.0.tgz", @@ -2977,16 +3163,22 @@ "node": ">=20.0.0" } }, + "node_modules/@firebase/logger/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, "node_modules/@firebase/messaging": { - "version": "0.12.23", - "resolved": "https://registry.npmjs.org/@firebase/messaging/-/messaging-0.12.23.tgz", - "integrity": "sha512-cfuzv47XxqW4HH/OcR5rM+AlQd1xL/VhuaeW/wzMW1LFrsFcTn0GND/hak1vkQc2th8UisBcrkVcQAnOnKwYxg==", + "version": "0.12.24", + "resolved": "https://registry.npmjs.org/@firebase/messaging/-/messaging-0.12.24.tgz", + "integrity": "sha512-UtKoubegAhHyehcB7iQjvQ8OVITThPbbWk3g2/2ze42PrQr6oe6OmCElYQkBrE5RDCeMTNucXejbdulrQ2XwVg==", "license": "Apache-2.0", "dependencies": { - "@firebase/component": "0.7.0", - "@firebase/installations": "0.6.19", + "@firebase/component": "0.7.1", + "@firebase/installations": "0.6.20", "@firebase/messaging-interop-types": "0.2.3", - "@firebase/util": "1.13.0", + "@firebase/util": "1.14.0", "idb": "7.1.1", "tslib": "^2.1.0" }, @@ -2995,36 +3187,48 @@ } }, "node_modules/@firebase/messaging-compat": { - "version": "0.2.23", - "resolved": "https://registry.npmjs.org/@firebase/messaging-compat/-/messaging-compat-0.2.23.tgz", - "integrity": "sha512-SN857v/kBUvlQ9X/UjAqBoQ2FEaL1ZozpnmL1ByTe57iXkmnVVFm9KqAsTfmf+OEwWI4kJJe9NObtN/w22lUgg==", + "version": "0.2.24", + "resolved": "https://registry.npmjs.org/@firebase/messaging-compat/-/messaging-compat-0.2.24.tgz", + "integrity": "sha512-wXH8FrKbJvFuFe6v98TBhAtvgknxKIZtGM/wCVsfpOGmaAE80bD8tBxztl+uochjnFb9plihkd6mC4y7sZXSpA==", "license": "Apache-2.0", "dependencies": { - "@firebase/component": "0.7.0", - "@firebase/messaging": "0.12.23", - "@firebase/util": "1.13.0", + "@firebase/component": "0.7.1", + "@firebase/messaging": "0.12.24", + "@firebase/util": "1.14.0", "tslib": "^2.1.0" }, "peerDependencies": { "@firebase/app-compat": "0.x" } }, + "node_modules/@firebase/messaging-compat/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, "node_modules/@firebase/messaging-interop-types": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/@firebase/messaging-interop-types/-/messaging-interop-types-0.2.3.tgz", "integrity": "sha512-xfzFaJpzcmtDjycpDeCUj0Ge10ATFi/VHVIvEEjDNc3hodVBQADZ7BWQU7CuFpjSHE+eLuBI13z5F/9xOoGX8Q==", "license": "Apache-2.0" }, + "node_modules/@firebase/messaging/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, "node_modules/@firebase/performance": { - "version": "0.7.9", - "resolved": "https://registry.npmjs.org/@firebase/performance/-/performance-0.7.9.tgz", - "integrity": "sha512-UzybENl1EdM2I1sjYm74xGt/0JzRnU/0VmfMAKo2LSpHJzaj77FCLZXmYQ4oOuE+Pxtt8Wy2BVJEENiZkaZAzQ==", + "version": "0.7.10", + "resolved": "https://registry.npmjs.org/@firebase/performance/-/performance-0.7.10.tgz", + "integrity": "sha512-8nRFld+Ntzp5cLKzZuG9g+kBaSn8Ks9dmn87UQGNFDygbmR6ebd8WawauEXiJjMj1n70ypkvAOdE+lzeyfXtGA==", "license": "Apache-2.0", "dependencies": { - "@firebase/component": "0.7.0", - "@firebase/installations": "0.6.19", + "@firebase/component": "0.7.1", + "@firebase/installations": "0.6.20", "@firebase/logger": "0.5.0", - "@firebase/util": "1.13.0", + "@firebase/util": "1.14.0", "tslib": "^2.1.0", "web-vitals": "^4.2.4" }, @@ -3033,38 +3237,50 @@ } }, "node_modules/@firebase/performance-compat": { - "version": "0.2.22", - "resolved": "https://registry.npmjs.org/@firebase/performance-compat/-/performance-compat-0.2.22.tgz", - "integrity": "sha512-xLKxaSAl/FVi10wDX/CHIYEUP13jXUjinL+UaNXT9ByIvxII5Ne5150mx6IgM8G6Q3V+sPiw9C8/kygkyHUVxg==", + "version": "0.2.23", + "resolved": "https://registry.npmjs.org/@firebase/performance-compat/-/performance-compat-0.2.23.tgz", + "integrity": "sha512-c7qOAGBUAOpIuUlHu1axWcrCVtIYKPMhH0lMnoCDWnPwn1HcPuPUBVTWETbC7UWw71RMJF8DpirfWXzMWJQfgA==", "license": "Apache-2.0", "dependencies": { - "@firebase/component": "0.7.0", + "@firebase/component": "0.7.1", "@firebase/logger": "0.5.0", - "@firebase/performance": "0.7.9", + "@firebase/performance": "0.7.10", "@firebase/performance-types": "0.2.3", - "@firebase/util": "1.13.0", + "@firebase/util": "1.14.0", "tslib": "^2.1.0" }, "peerDependencies": { "@firebase/app-compat": "0.x" } }, + "node_modules/@firebase/performance-compat/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, "node_modules/@firebase/performance-types": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/@firebase/performance-types/-/performance-types-0.2.3.tgz", "integrity": "sha512-IgkyTz6QZVPAq8GSkLYJvwSLr3LS9+V6vNPQr0x4YozZJiLF5jYixj0amDtATf1X0EtYHqoPO48a9ija8GocxQ==", "license": "Apache-2.0" }, + "node_modules/@firebase/performance/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, "node_modules/@firebase/remote-config": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@firebase/remote-config/-/remote-config-0.8.0.tgz", - "integrity": "sha512-sJz7C2VACeE257Z/3kY9Ap2WXbFsgsDLfaGfZmmToKAK39ipXxFan+vzB9CSbF6mP7bzjyzEnqPcMXhAnYE6fQ==", + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@firebase/remote-config/-/remote-config-0.8.1.tgz", + "integrity": "sha512-L86TReBnPiiJOWd7k9iaiE9f7rHtMpjAoYN0fH2ey2ZRzsOChHV0s5sYf1+IIUYzplzsE46pjlmAUNkRRKwHSQ==", "license": "Apache-2.0", "dependencies": { - "@firebase/component": "0.7.0", - "@firebase/installations": "0.6.19", + "@firebase/component": "0.7.1", + "@firebase/installations": "0.6.20", "@firebase/logger": "0.5.0", - "@firebase/util": "1.13.0", + "@firebase/util": "1.14.0", "tslib": "^2.1.0" }, "peerDependencies": { @@ -3072,36 +3288,48 @@ } }, "node_modules/@firebase/remote-config-compat": { - "version": "0.2.21", - "resolved": "https://registry.npmjs.org/@firebase/remote-config-compat/-/remote-config-compat-0.2.21.tgz", - "integrity": "sha512-9+lm0eUycxbu8GO25JfJe4s6R2xlDqlVt0CR6CvN9E6B4AFArEV4qfLoDVRgIEB7nHKwvH2nYRocPWfmjRQTnw==", + "version": "0.2.22", + "resolved": "https://registry.npmjs.org/@firebase/remote-config-compat/-/remote-config-compat-0.2.22.tgz", + "integrity": "sha512-uW/eNKKtRBot2gnCC5mnoy5Voo2wMzZuQ7dwqqGHU176fO9zFgMwKiRzk+aaC99NLrFk1KOmr0ZVheD+zdJmjQ==", "license": "Apache-2.0", "dependencies": { - "@firebase/component": "0.7.0", + "@firebase/component": "0.7.1", "@firebase/logger": "0.5.0", - "@firebase/remote-config": "0.8.0", + "@firebase/remote-config": "0.8.1", "@firebase/remote-config-types": "0.5.0", - "@firebase/util": "1.13.0", + "@firebase/util": "1.14.0", "tslib": "^2.1.0" }, "peerDependencies": { "@firebase/app-compat": "0.x" } }, + "node_modules/@firebase/remote-config-compat/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, "node_modules/@firebase/remote-config-types": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/@firebase/remote-config-types/-/remote-config-types-0.5.0.tgz", "integrity": "sha512-vI3bqLoF14L/GchtgayMiFpZJF+Ao3uR8WCde0XpYNkSokDpAKca2DxvcfeZv7lZUqkUwQPL2wD83d3vQ4vvrg==", "license": "Apache-2.0" }, + "node_modules/@firebase/remote-config/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, "node_modules/@firebase/storage": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@firebase/storage/-/storage-0.14.0.tgz", - "integrity": "sha512-xWWbb15o6/pWEw8H01UQ1dC5U3rf8QTAzOChYyCpafV6Xki7KVp3Yaw2nSklUwHEziSWE9KoZJS7iYeyqWnYFA==", + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/@firebase/storage/-/storage-0.14.1.tgz", + "integrity": "sha512-uIpYgBBsv1vIET+5xV20XT7wwqV+H4GFp6PBzfmLUcEgguS4SWNFof56Z3uOC2lNDh0KDda1UflYq2VwD9Nefw==", "license": "Apache-2.0", "dependencies": { - "@firebase/component": "0.7.0", - "@firebase/util": "1.13.0", + "@firebase/component": "0.7.1", + "@firebase/util": "1.14.0", "tslib": "^2.1.0" }, "engines": { @@ -3112,15 +3340,15 @@ } }, "node_modules/@firebase/storage-compat": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@firebase/storage-compat/-/storage-compat-0.4.0.tgz", - "integrity": "sha512-vDzhgGczr1OfcOy285YAPur5pWDEvD67w4thyeCUh6Ys0izN9fNYtA1MJERmNBfqjqu0lg0FM5GLbw0Il21M+g==", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@firebase/storage-compat/-/storage-compat-0.4.1.tgz", + "integrity": "sha512-bgl3FHHfXAmBgzIK/Fps6Xyv2HiAQlSTov07CBL+RGGhrC5YIk4lruS8JVIC+UkujRdYvnf8cpQFGn2RCilJ/A==", "license": "Apache-2.0", "dependencies": { - "@firebase/component": "0.7.0", - "@firebase/storage": "0.14.0", + "@firebase/component": "0.7.1", + "@firebase/storage": "0.14.1", "@firebase/storage-types": "0.8.3", - "@firebase/util": "1.13.0", + "@firebase/util": "1.14.0", "tslib": "^2.1.0" }, "engines": { @@ -3130,6 +3358,12 @@ "@firebase/app-compat": "0.x" } }, + "node_modules/@firebase/storage-compat/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, "node_modules/@firebase/storage-types": { "version": "0.8.3", "resolved": "https://registry.npmjs.org/@firebase/storage-types/-/storage-types-0.8.3.tgz", @@ -3140,10 +3374,16 @@ "@firebase/util": "1.x" } }, + "node_modules/@firebase/storage/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, "node_modules/@firebase/util": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.13.0.tgz", - "integrity": "sha512-0AZUyYUfpMNcztR5l09izHwXkZpghLgCUaAGjtMwXnCg3bj4ml5VgiwqOMOxJ+Nw4qN/zJAaOQBcJ7KGkWStqQ==", + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.14.0.tgz", + "integrity": "sha512-/gnejm7MKkVIXnSJGpc9L2CvvvzJvtDPeAEq5jAwgVlf/PeNxot+THx/bpD20wQ8uL5sz0xqgXy1nisOYMU+mw==", "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { @@ -3153,6 +3393,12 @@ "node": ">=20.0.0" } }, + "node_modules/@firebase/util/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, "node_modules/@firebase/webchannel-wrapper": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/@firebase/webchannel-wrapper/-/webchannel-wrapper-1.0.5.tgz", @@ -3297,9 +3543,9 @@ } }, "node_modules/@img/colour": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.0.0.tgz", - "integrity": "sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.1.0.tgz", + "integrity": "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==", "license": "MIT", "engines": { "node": ">=18" @@ -3765,6 +4011,7 @@ "version": "8.0.2", "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, "license": "ISC", "dependencies": { "string-width": "^5.1.2", @@ -3782,6 +4029,7 @@ "version": "6.2.2", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, "license": "MIT", "engines": { "node": ">=12" @@ -3790,16 +4038,31 @@ "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/@isaacs/cliui/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "license": "MIT" + "node_modules/@isaacs/cliui/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" }, "node_modules/@isaacs/cliui/node_modules/string-width": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, "license": "MIT", "dependencies": { "eastasianwidth": "^0.2.0", @@ -3814,12 +4077,13 @@ } }, "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", - "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", + "dev": true, "license": "MIT", "dependencies": { - "ansi-regex": "^6.0.1" + "ansi-regex": "^6.2.2" }, "engines": { "node": ">=12" @@ -3828,6 +4092,24 @@ "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, + "node_modules/@isaacs/cliui/node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", @@ -3956,17 +4238,17 @@ } }, "node_modules/@jest/console": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-30.2.0.tgz", - "integrity": "sha512-+O1ifRjkvYIkBqASKWgLxrpEhQAAE7hY77ALLUufSk5717KfOShg6IbqLmdsLMPdUiFvA2kTs0R7YZy+l0IzZQ==", + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-30.3.0.tgz", + "integrity": "sha512-PAwCvFJ4696XP2qZj+LAn1BWjZaJ6RjG6c7/lkMaUJnkyMS34ucuIsfqYvfskVNvUI27R/u4P1HMYFnlVXG/Ww==", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "30.2.0", + "@jest/types": "30.3.0", "@types/node": "*", "chalk": "^4.1.2", - "jest-message-util": "30.2.0", - "jest-util": "30.2.0", + "jest-message-util": "30.3.0", + "jest-util": "30.3.0", "slash": "^3.0.0" }, "engines": { @@ -3974,39 +4256,38 @@ } }, "node_modules/@jest/core": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-30.2.0.tgz", - "integrity": "sha512-03W6IhuhjqTlpzh/ojut/pDB2LPRygyWX8ExpgHtQA8H/3K7+1vKmcINx5UzeOX1se6YEsBsOHQ1CRzf3fOwTQ==", + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-30.3.0.tgz", + "integrity": "sha512-U5mVPsBxLSO6xYbf+tgkymLx+iAhvZX43/xI1+ej2ZOPnPdkdO1CzDmFKh2mZBn2s4XZixszHeQnzp1gm/DIxw==", "dev": true, "license": "MIT", "dependencies": { - "@jest/console": "30.2.0", + "@jest/console": "30.3.0", "@jest/pattern": "30.0.1", - "@jest/reporters": "30.2.0", - "@jest/test-result": "30.2.0", - "@jest/transform": "30.2.0", - "@jest/types": "30.2.0", + "@jest/reporters": "30.3.0", + "@jest/test-result": "30.3.0", + "@jest/transform": "30.3.0", + "@jest/types": "30.3.0", "@types/node": "*", "ansi-escapes": "^4.3.2", "chalk": "^4.1.2", "ci-info": "^4.2.0", "exit-x": "^0.2.2", "graceful-fs": "^4.2.11", - "jest-changed-files": "30.2.0", - "jest-config": "30.2.0", - "jest-haste-map": "30.2.0", - "jest-message-util": "30.2.0", + "jest-changed-files": "30.3.0", + "jest-config": "30.3.0", + "jest-haste-map": "30.3.0", + "jest-message-util": "30.3.0", "jest-regex-util": "30.0.1", - "jest-resolve": "30.2.0", - "jest-resolve-dependencies": "30.2.0", - "jest-runner": "30.2.0", - "jest-runtime": "30.2.0", - "jest-snapshot": "30.2.0", - "jest-util": "30.2.0", - "jest-validate": "30.2.0", - "jest-watcher": "30.2.0", - "micromatch": "^4.0.8", - "pretty-format": "30.2.0", + "jest-resolve": "30.3.0", + "jest-resolve-dependencies": "30.3.0", + "jest-runner": "30.3.0", + "jest-runtime": "30.3.0", + "jest-snapshot": "30.3.0", + "jest-util": "30.3.0", + "jest-validate": "30.3.0", + "jest-watcher": "30.3.0", + "pretty-format": "30.3.0", "slash": "^3.0.0" }, "engines": { @@ -4035,9 +4316,9 @@ } }, "node_modules/@jest/core/node_modules/pretty-format": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.2.0.tgz", - "integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==", + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.3.0.tgz", + "integrity": "sha512-oG4T3wCbfeuvljnyAzhBvpN45E8iOTXCU/TD3zXW80HA3dQ4ahdqMkWGiPWZvjpQwlbyHrPTWUAqUzGzv4l1JQ==", "dev": true, "license": "MIT", "dependencies": { @@ -4057,9 +4338,9 @@ "license": "MIT" }, "node_modules/@jest/diff-sequences": { - "version": "30.0.1", - "resolved": "https://registry.npmjs.org/@jest/diff-sequences/-/diff-sequences-30.0.1.tgz", - "integrity": "sha512-n5H8QLDJ47QqbCNn5SuFjCRDrOLEZ0h8vAHCK5RL9Ls7Xa8AQLa/YxAc9UjFqoEDM48muwtBGjtMY5cr0PLDCw==", + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/@jest/diff-sequences/-/diff-sequences-30.3.0.tgz", + "integrity": "sha512-cG51MVnLq1ecVUaQ3fr6YuuAOitHK1S4WUJHnsPFE/quQr33ADUx1FfrTCpMCRxvy0Yr9BThKpDjSlcTi91tMA==", "dev": true, "license": "MIT", "engines": { @@ -4067,35 +4348,35 @@ } }, "node_modules/@jest/environment": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-30.2.0.tgz", - "integrity": "sha512-/QPTL7OBJQ5ac09UDRa3EQes4gt1FTEG/8jZ/4v5IVzx+Cv7dLxlVIvfvSVRiiX2drWyXeBjkMSR8hvOWSog5g==", + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-30.3.0.tgz", + "integrity": "sha512-SlLSF4Be735yQXyh2+mctBOzNDx5s5uLv88/j8Qn1wH679PDcwy67+YdADn8NJnGjzlXtN62asGH/T4vWOkfaw==", "dev": true, "license": "MIT", "dependencies": { - "@jest/fake-timers": "30.2.0", - "@jest/types": "30.2.0", + "@jest/fake-timers": "30.3.0", + "@jest/types": "30.3.0", "@types/node": "*", - "jest-mock": "30.2.0" + "jest-mock": "30.3.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/@jest/environment-jsdom-abstract": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/@jest/environment-jsdom-abstract/-/environment-jsdom-abstract-30.2.0.tgz", - "integrity": "sha512-kazxw2L9IPuZpQ0mEt9lu9Z98SqR74xcagANmMBU16X0lS23yPc0+S6hGLUz8kVRlomZEs/5S/Zlpqwf5yu6OQ==", + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/@jest/environment-jsdom-abstract/-/environment-jsdom-abstract-30.3.0.tgz", + "integrity": "sha512-0hNFs5N6We3DMCwobzI0ydhkY10sT1tZSC0AAiy+0g2Dt/qEWgrcV5BrMxPczhe41cxW4qm6X+jqZaUdpZIajA==", "dev": true, "license": "MIT", "dependencies": { - "@jest/environment": "30.2.0", - "@jest/fake-timers": "30.2.0", - "@jest/types": "30.2.0", + "@jest/environment": "30.3.0", + "@jest/fake-timers": "30.3.0", + "@jest/types": "30.3.0", "@types/jsdom": "^21.1.7", "@types/node": "*", - "jest-mock": "30.2.0", - "jest-util": "30.2.0" + "jest-mock": "30.3.0", + "jest-util": "30.3.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" @@ -4111,23 +4392,23 @@ } }, "node_modules/@jest/expect": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-30.2.0.tgz", - "integrity": "sha512-V9yxQK5erfzx99Sf+7LbhBwNWEZ9eZay8qQ9+JSC0TrMR1pMDHLMY+BnVPacWU6Jamrh252/IKo4F1Xn/zfiqA==", + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-30.3.0.tgz", + "integrity": "sha512-76Nlh4xJxk2D/9URCn3wFi98d2hb19uWE1idLsTt2ywhvdOldbw3S570hBgn25P4ICUZ/cBjybrBex2g17IDbg==", "dev": true, "license": "MIT", "dependencies": { - "expect": "30.2.0", - "jest-snapshot": "30.2.0" + "expect": "30.3.0", + "jest-snapshot": "30.3.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/@jest/expect-utils": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-30.2.0.tgz", - "integrity": "sha512-1JnRfhqpD8HGpOmQp180Fo9Zt69zNtC+9lR+kT7NVL05tNXIi+QC8Csz7lfidMoVLPD3FnOtcmp0CEFnxExGEA==", + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-30.3.0.tgz", + "integrity": "sha512-j0+W5iQQ8hBh7tHZkTQv3q2Fh/M7Je72cIsYqC4OaktgtO7v1So9UTjp6uPBHIaB6beoF/RRsCgMJKvti0wADA==", "dev": true, "license": "MIT", "dependencies": { @@ -4138,18 +4419,18 @@ } }, "node_modules/@jest/fake-timers": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-30.2.0.tgz", - "integrity": "sha512-HI3tRLjRxAbBy0VO8dqqm7Hb2mIa8d5bg/NJkyQcOk7V118ObQML8RC5luTF/Zsg4474a+gDvhce7eTnP4GhYw==", + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-30.3.0.tgz", + "integrity": "sha512-WUQDs8SOP9URStX1DzhD425CqbN/HxUYCTwVrT8sTVBfMvFqYt/s61EK5T05qnHu0po6RitXIvP9otZxYDzTGQ==", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "30.2.0", - "@sinonjs/fake-timers": "^13.0.0", + "@jest/types": "30.3.0", + "@sinonjs/fake-timers": "^15.0.0", "@types/node": "*", - "jest-message-util": "30.2.0", - "jest-mock": "30.2.0", - "jest-util": "30.2.0" + "jest-message-util": "30.3.0", + "jest-mock": "30.3.0", + "jest-util": "30.3.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" @@ -4166,16 +4447,16 @@ } }, "node_modules/@jest/globals": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-30.2.0.tgz", - "integrity": "sha512-b63wmnKPaK+6ZZfpYhz9K61oybvbI1aMcIs80++JI1O1rR1vaxHUCNqo3ITu6NU0d4V34yZFoHMn/uoKr/Rwfw==", + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-30.3.0.tgz", + "integrity": "sha512-+owLCBBdfpgL3HU+BD5etr1SvbXpSitJK0is1kiYjJxAAJggYMRQz5hSdd5pq1sSggfxPbw2ld71pt4x5wwViA==", "dev": true, "license": "MIT", "dependencies": { - "@jest/environment": "30.2.0", - "@jest/expect": "30.2.0", - "@jest/types": "30.2.0", - "jest-mock": "30.2.0" + "@jest/environment": "30.3.0", + "@jest/expect": "30.3.0", + "@jest/types": "30.3.0", + "jest-mock": "30.3.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" @@ -4196,32 +4477,32 @@ } }, "node_modules/@jest/reporters": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-30.2.0.tgz", - "integrity": "sha512-DRyW6baWPqKMa9CzeiBjHwjd8XeAyco2Vt8XbcLFjiwCOEKOvy82GJ8QQnJE9ofsxCMPjH4MfH8fCWIHHDKpAQ==", + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-30.3.0.tgz", + "integrity": "sha512-a09z89S+PkQnL055bVj8+pe2Caed2PBOaczHcXCykW5ngxX9EWx/1uAwncxc/HiU0oZqfwseMjyhxgRjS49qPw==", "dev": true, "license": "MIT", "dependencies": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "30.2.0", - "@jest/test-result": "30.2.0", - "@jest/transform": "30.2.0", - "@jest/types": "30.2.0", + "@jest/console": "30.3.0", + "@jest/test-result": "30.3.0", + "@jest/transform": "30.3.0", + "@jest/types": "30.3.0", "@jridgewell/trace-mapping": "^0.3.25", "@types/node": "*", "chalk": "^4.1.2", "collect-v8-coverage": "^1.0.2", "exit-x": "^0.2.2", - "glob": "^10.3.10", + "glob": "^10.5.0", "graceful-fs": "^4.2.11", "istanbul-lib-coverage": "^3.0.0", "istanbul-lib-instrument": "^6.0.0", "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^5.0.0", "istanbul-reports": "^3.1.3", - "jest-message-util": "30.2.0", - "jest-util": "30.2.0", - "jest-worker": "30.2.0", + "jest-message-util": "30.3.0", + "jest-util": "30.3.0", + "jest-worker": "30.3.0", "slash": "^3.0.0", "string-length": "^4.0.2", "v8-to-istanbul": "^9.0.1" @@ -4238,6 +4519,85 @@ } } }, + "node_modules/@jest/reporters/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==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jest/reporters/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@jest/reporters/node_modules/glob": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@jest/reporters/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/@jest/reporters/node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@jest/reporters/node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/@jest/schemas": { "version": "30.0.5", "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.0.5.tgz", @@ -4252,13 +4612,13 @@ } }, "node_modules/@jest/snapshot-utils": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/@jest/snapshot-utils/-/snapshot-utils-30.2.0.tgz", - "integrity": "sha512-0aVxM3RH6DaiLcjj/b0KrIBZhSX1373Xci4l3cW5xiUWPctZ59zQ7jj4rqcJQ/Z8JuN/4wX3FpJSa3RssVvCug==", + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/@jest/snapshot-utils/-/snapshot-utils-30.3.0.tgz", + "integrity": "sha512-ORbRN9sf5PP82v3FXNSwmO1OTDR2vzR2YTaR+E3VkSBZ8zadQE6IqYdYEeFH1NIkeB2HIGdF02dapb6K0Mj05g==", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "30.2.0", + "@jest/types": "30.3.0", "chalk": "^4.1.2", "graceful-fs": "^4.2.11", "natural-compare": "^1.4.0" @@ -4283,14 +4643,14 @@ } }, "node_modules/@jest/test-result": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-30.2.0.tgz", - "integrity": "sha512-RF+Z+0CCHkARz5HT9mcQCBulb1wgCP3FBvl9VFokMX27acKphwyQsNuWH3c+ojd1LeWBLoTYoxF0zm6S/66mjg==", + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-30.3.0.tgz", + "integrity": "sha512-e/52nJGuD74AKTSe0P4y5wFRlaXP0qmrS17rqOMHeSwm278VyNyXE3gFO/4DTGF9w+65ra3lo3VKj0LBrzmgdQ==", "dev": true, "license": "MIT", "dependencies": { - "@jest/console": "30.2.0", - "@jest/types": "30.2.0", + "@jest/console": "30.3.0", + "@jest/types": "30.3.0", "@types/istanbul-lib-coverage": "^2.0.6", "collect-v8-coverage": "^1.0.2" }, @@ -4299,15 +4659,15 @@ } }, "node_modules/@jest/test-sequencer": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-30.2.0.tgz", - "integrity": "sha512-wXKgU/lk8fKXMu/l5Hog1R61bL4q5GCdT6OJvdAFz1P+QrpoFuLU68eoKuVc4RbrTtNnTL5FByhWdLgOPSph+Q==", + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-30.3.0.tgz", + "integrity": "sha512-dgbWy9b8QDlQeRZcv7LNF+/jFiiYHTKho1xirauZ7kVwY7avjFF6uTT0RqlgudB5OuIPagFdVtfFMosjVbk1eA==", "dev": true, "license": "MIT", "dependencies": { - "@jest/test-result": "30.2.0", + "@jest/test-result": "30.3.0", "graceful-fs": "^4.2.11", - "jest-haste-map": "30.2.0", + "jest-haste-map": "30.3.0", "slash": "^3.0.0" }, "engines": { @@ -4315,24 +4675,23 @@ } }, "node_modules/@jest/transform": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-30.2.0.tgz", - "integrity": "sha512-XsauDV82o5qXbhalKxD7p4TZYYdwcaEXC77PPD2HixEFF+6YGppjrAAQurTl2ECWcEomHBMMNS9AH3kcCFx8jA==", + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-30.3.0.tgz", + "integrity": "sha512-TLKY33fSLVd/lKB2YI1pH69ijyUblO/BQvCj566YvnwuzoTNr648iE0j22vRvVNk2HsPwByPxATg3MleS3gf5A==", "dev": true, "license": "MIT", "dependencies": { "@babel/core": "^7.27.4", - "@jest/types": "30.2.0", + "@jest/types": "30.3.0", "@jridgewell/trace-mapping": "^0.3.25", "babel-plugin-istanbul": "^7.0.1", "chalk": "^4.1.2", "convert-source-map": "^2.0.0", "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.11", - "jest-haste-map": "30.2.0", + "jest-haste-map": "30.3.0", "jest-regex-util": "30.0.1", - "jest-util": "30.2.0", - "micromatch": "^4.0.8", + "jest-util": "30.3.0", "pirates": "^4.0.7", "slash": "^3.0.0", "write-file-atomic": "^5.0.1" @@ -4349,9 +4708,9 @@ "license": "MIT" }, "node_modules/@jest/types": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.2.0.tgz", - "integrity": "sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg==", + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.3.0.tgz", + "integrity": "sha512-JHm87k7bA33hpBngtU8h6UBub/fqqA9uXfw+21j5Hmk7ooPHlboRNxHq0JcMtC+n8VJGP1mcfnD3Mk+XKe1oSw==", "dev": true, "license": "MIT", "dependencies": { @@ -4423,9 +4782,9 @@ } }, "node_modules/@mui/core-downloads-tracker": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-7.3.8.tgz", - "integrity": "sha512-s9UHZo7QJVly7gNArEZkbbsimHqJZhElgBpXIJdehZ4OWXt+CCr0SBDgUCDJnQrqpd1dWK2dLq5rmO4mCBmI3w==", + "version": "7.3.9", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-7.3.9.tgz", + "integrity": "sha512-MOkOCTfbMJwLshlBCKJ59V2F/uaLYfmKnN76kksj6jlGUVdI25A9Hzs08m+zjBRdLv+sK7Rqdsefe8X7h/6PCw==", "license": "MIT", "funding": { "type": "opencollective", @@ -4433,9 +4792,9 @@ } }, "node_modules/@mui/icons-material": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-7.3.8.tgz", - "integrity": "sha512-88sWg/UJc1X82OMO+ISR4E3P58I3BjFVg0qkmDu7OWlN8VijneZD3ylFA+ImxuPjMHW3SHosfSJYy1fztoz0fw==", + "version": "7.3.9", + "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-7.3.9.tgz", + "integrity": "sha512-BT+zPJXss8Hg/oEMRmHl17Q97bPACG4ufFSfGEdhiE96jOyR5Dz1ty7ZWt1fVGR0y1p+sSgEwQT/MNZQmoWDCw==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.28.6" @@ -4448,7 +4807,7 @@ "url": "https://opencollective.com/mui-org" }, "peerDependencies": { - "@mui/material": "^7.3.8", + "@mui/material": "^7.3.9", "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", "react": "^17.0.0 || ^18.0.0 || ^19.0.0" }, @@ -4459,16 +4818,16 @@ } }, "node_modules/@mui/material": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/@mui/material/-/material-7.3.8.tgz", - "integrity": "sha512-QKd1RhDXE1hf2sQDNayA9ic9jGkEgvZOf0tTkJxlBPG8ns8aS4rS8WwYURw2x5y3739p0HauUXX9WbH7UufFLw==", + "version": "7.3.9", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-7.3.9.tgz", + "integrity": "sha512-I8yO3t4T0y7bvDiR1qhIN6iBWZOTBfVOnmLlM7K6h3dx5YX2a7rnkuXzc2UkZaqhxY9NgTnEbdPlokR1RxCNRQ==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.28.6", - "@mui/core-downloads-tracker": "^7.3.8", - "@mui/system": "^7.3.8", - "@mui/types": "^7.4.11", - "@mui/utils": "^7.3.8", + "@mui/core-downloads-tracker": "^7.3.9", + "@mui/system": "^7.3.9", + "@mui/types": "^7.4.12", + "@mui/utils": "^7.3.9", "@popperjs/core": "^2.11.8", "@types/react-transition-group": "^4.4.12", "clsx": "^2.1.1", @@ -4487,7 +4846,7 @@ "peerDependencies": { "@emotion/react": "^11.5.0", "@emotion/styled": "^11.3.0", - "@mui/material-pigment-css": "^7.3.8", + "@mui/material-pigment-css": "^7.3.9", "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", "react": "^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" @@ -4508,13 +4867,13 @@ } }, "node_modules/@mui/private-theming": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-7.3.8.tgz", - "integrity": "sha512-du5dlPZ9XL3xW2apHoGDXBI+QLtyVJGrXNCfcNYfP/ojkz1RQ0rRV6VG9Rkm1DqEFRG8mjjTL7zmE1Bvn1eR4A==", + "version": "7.3.9", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-7.3.9.tgz", + "integrity": "sha512-ErIyRQvsiQEq7Yvcvfw9UDHngaqjMy9P3JDPnRAaKG5qhpl2C4tX/W1S4zJvpu+feihmZJStjIyvnv6KDbIrlw==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.28.6", - "@mui/utils": "^7.3.8", + "@mui/utils": "^7.3.9", "prop-types": "^15.8.1" }, "engines": { @@ -4535,9 +4894,9 @@ } }, "node_modules/@mui/styled-engine": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-7.3.8.tgz", - "integrity": "sha512-JHAeXQzS0tJ+Fq3C6J4TVDsW+yKhO4uuxuiLaopNStJeQYBIUCXpKYyUCcgXym4AmhbznQnv9RlHywSH6b0FOg==", + "version": "7.3.9", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-7.3.9.tgz", + "integrity": "sha512-JqujWt5bX4okjUPGpVof/7pvgClqh7HvIbsIBIOOlCh2u3wG/Bwp4+E1bc1dXSwkrkp9WUAoNdI5HEC+5HKvMw==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.28.6", @@ -4569,16 +4928,16 @@ } }, "node_modules/@mui/system": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/@mui/system/-/system-7.3.8.tgz", - "integrity": "sha512-hoFRj4Zw2Km8DPWZp/nKG+ao5Jw5LSk2m/e4EGc6M3RRwXKEkMSG4TgtfVJg7dS2homRwtdXSMW+iRO0ZJ4+IA==", + "version": "7.3.9", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-7.3.9.tgz", + "integrity": "sha512-aL1q9am8XpRrSabv9qWf5RHhJICJql34wnrc1nz0MuOglPRYF/liN+c8VqZdTvUn9qg+ZjRVbKf4sJVFfIDtmg==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.28.6", - "@mui/private-theming": "^7.3.8", - "@mui/styled-engine": "^7.3.8", - "@mui/types": "^7.4.11", - "@mui/utils": "^7.3.8", + "@mui/private-theming": "^7.3.9", + "@mui/styled-engine": "^7.3.9", + "@mui/types": "^7.4.12", + "@mui/utils": "^7.3.9", "clsx": "^2.1.1", "csstype": "^3.2.3", "prop-types": "^15.8.1" @@ -4609,9 +4968,9 @@ } }, "node_modules/@mui/types": { - "version": "7.4.11", - "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.4.11.tgz", - "integrity": "sha512-fZ2xO9D08IKOxO2oUBi1nnVKH6oJUD+64cnv4YAaFoC0E5+i1+S5AHbNqqvZlYYsbPEQ6qEVwuBqY3jl5W4G+Q==", + "version": "7.4.12", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.4.12.tgz", + "integrity": "sha512-iKNAF2u9PzSIj40CjvKJWxFXJo122jXVdrmdh0hMYd+FR+NuJMkr/L88XwWLCRiJ5P1j+uyac25+Kp6YC4hu6w==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.28.6" @@ -4626,13 +4985,13 @@ } }, "node_modules/@mui/utils": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-7.3.8.tgz", - "integrity": "sha512-kZRcE2620CBGr+XI8YMmwPj6WIPwSF7uMJjvSfqd8zXVvlz0MCJbzRRUGNf8NgflCLthdji2DdS643TeyJ3+nA==", + "version": "7.3.9", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-7.3.9.tgz", + "integrity": "sha512-U6SdZaGbfb65fqTsH3V5oJdFj9uYwyLE2WVuNvmbggTSDBb8QHrFsqY8BN3taK9t3yJ8/BPHD/kNvLNyjwM7Yw==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.28.6", - "@mui/types": "^7.4.11", + "@mui/types": "^7.4.12", "@types/prop-types": "^15.7.15", "clsx": "^2.1.1", "prop-types": "^15.8.1", @@ -4824,9 +5183,9 @@ } }, "node_modules/@opentelemetry/context-async-hooks": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-2.5.1.tgz", - "integrity": "sha512-MHbu8XxCHcBn6RwvCt2Vpn1WnLMNECfNKYB14LI5XypcgH4IE0/DiVifVR9tAkwPMyLXN8dOoPJfya3IryLQVw==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-2.6.0.tgz", + "integrity": "sha512-L8UyDwqpTcbkIK5cgwDRDYDoEhQoj8wp8BwsO19w3LB1Z41yEQm2VJyNfAi9DrLP/YTqXqWpKHyZfR9/tFYo1Q==", "license": "Apache-2.0", "engines": { "node": "^18.19.0 || >=20.6.0" @@ -4836,9 +5195,9 @@ } }, "node_modules/@opentelemetry/core": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.5.1.tgz", - "integrity": "sha512-Dwlc+3HAZqpgTYq0MUyZABjFkcrKTePwuiFVLjahGD8cx3enqihmpAmdgNFO1R4m/sIe5afjJrA25Prqy4NXlA==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.6.0.tgz", + "integrity": "sha512-HLM1v2cbZ4TgYN6KEOj+Bbj8rAKriOdkF9Ed3tG25FoprSiQl7kYc+RRT6fUZGOvx0oMi5U67GoFdT+XUn8zEg==", "license": "Apache-2.0", "dependencies": { "@opentelemetry/semantic-conventions": "^1.29.0" @@ -5259,12 +5618,12 @@ } }, "node_modules/@opentelemetry/resources": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.5.1.tgz", - "integrity": "sha512-BViBCdE/GuXRlp9k7nS1w6wJvY5fnFX5XvuEtWsTAOQFIO89Eru7lGW3WbfbxtCuZ/GbrJfAziXG0w0dpxL7eQ==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.6.0.tgz", + "integrity": "sha512-D4y/+OGe3JSuYUCBxtH5T9DSAWNcvCb/nQWIga8HNtXTVPQn59j0nTBAgaAXxUVBDl40mG3Tc76b46wPlZaiJQ==", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "2.5.1", + "@opentelemetry/core": "2.6.0", "@opentelemetry/semantic-conventions": "^1.29.0" }, "engines": { @@ -5275,13 +5634,13 @@ } }, "node_modules/@opentelemetry/sdk-trace-base": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-2.5.1.tgz", - "integrity": "sha512-iZH3Gw8cxQn0gjpOjJMmKLd9GIaNh/E3v3ST67vyzLSxHBs14HsG4dy7jMYyC5WXGdBVEcM7U/XTF5hCQxjDMw==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-2.6.0.tgz", + "integrity": "sha512-g/OZVkqlxllgFM7qMKqbPV9c1DUPhQ7d4n3pgZFcrnrNft9eJXZM2TNHTPYREJBrtNdRytYyvwjgL5geDKl3EQ==", "license": "Apache-2.0", "dependencies": { - "@opentelemetry/core": "2.5.1", - "@opentelemetry/resources": "2.5.1", + "@opentelemetry/core": "2.6.0", + "@opentelemetry/resources": "2.6.0", "@opentelemetry/semantic-conventions": "^1.29.0" }, "engines": { @@ -5292,9 +5651,9 @@ } }, "node_modules/@opentelemetry/semantic-conventions": { - "version": "1.39.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.39.0.tgz", - "integrity": "sha512-R5R9tb2AXs2IRLNKLBJDynhkfmx7mX0vi8NkhZb3gUkPWHn6HXk5J8iQ/dql0U3ApfWym4kXXmBDRGO+oeOfjg==", + "version": "1.40.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.40.0.tgz", + "integrity": "sha512-cifvXDhcqMwwTlTK04GBNeIe7yyo28Mfby85QXFe1Yk8nmi36Ab/5UQwptOx84SsoGNRg+EVSjwzfSZMy6pmlw==", "license": "Apache-2.0", "engines": { "node": ">=14" @@ -5615,6 +5974,7 @@ "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, "license": "MIT", "optional": true, "engines": { @@ -5798,9 +6158,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.57.1.tgz", - "integrity": "sha512-A6ehUVSiSaaliTxai040ZpZ2zTevHYbvu/lDoeAteHI8QnaosIzm4qwtezfRg1jOYaUmnzLX1AOD6Z+UJjtifg==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.59.0.tgz", + "integrity": "sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg==", "cpu": [ "arm" ], @@ -5811,9 +6171,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.57.1.tgz", - "integrity": "sha512-dQaAddCY9YgkFHZcFNS/606Exo8vcLHwArFZ7vxXq4rigo2bb494/xKMMwRRQW6ug7Js6yXmBZhSBRuBvCCQ3w==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.59.0.tgz", + "integrity": "sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q==", "cpu": [ "arm64" ], @@ -5824,9 +6184,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.57.1.tgz", - "integrity": "sha512-crNPrwJOrRxagUYeMn/DZwqN88SDmwaJ8Cvi/TN1HnWBU7GwknckyosC2gd0IqYRsHDEnXf328o9/HC6OkPgOg==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.59.0.tgz", + "integrity": "sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg==", "cpu": [ "arm64" ], @@ -5837,9 +6197,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.57.1.tgz", - "integrity": "sha512-Ji8g8ChVbKrhFtig5QBV7iMaJrGtpHelkB3lsaKzadFBe58gmjfGXAOfI5FV0lYMH8wiqsxKQ1C9B0YTRXVy4w==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.59.0.tgz", + "integrity": "sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w==", "cpu": [ "x64" ], @@ -5850,9 +6210,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.57.1.tgz", - "integrity": "sha512-R+/WwhsjmwodAcz65guCGFRkMb4gKWTcIeLy60JJQbXrJ97BOXHxnkPFrP+YwFlaS0m+uWJTstrUA9o+UchFug==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.59.0.tgz", + "integrity": "sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9RlTTA==", "cpu": [ "arm64" ], @@ -5863,9 +6223,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.57.1.tgz", - "integrity": "sha512-IEQTCHeiTOnAUC3IDQdzRAGj3jOAYNr9kBguI7MQAAZK3caezRrg0GxAb6Hchg4lxdZEI5Oq3iov/w/hnFWY9Q==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.59.0.tgz", + "integrity": "sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3Vg==", "cpu": [ "x64" ], @@ -5876,9 +6236,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.57.1.tgz", - "integrity": "sha512-F8sWbhZ7tyuEfsmOxwc2giKDQzN3+kuBLPwwZGyVkLlKGdV1nvnNwYD0fKQ8+XS6hp9nY7B+ZeK01EBUE7aHaw==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.59.0.tgz", + "integrity": "sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw==", "cpu": [ "arm" ], @@ -5889,9 +6249,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.57.1.tgz", - "integrity": "sha512-rGfNUfn0GIeXtBP1wL5MnzSj98+PZe/AXaGBCRmT0ts80lU5CATYGxXukeTX39XBKsxzFpEeK+Mrp9faXOlmrw==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.59.0.tgz", + "integrity": "sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA==", "cpu": [ "arm" ], @@ -5902,9 +6262,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.57.1.tgz", - "integrity": "sha512-MMtej3YHWeg/0klK2Qodf3yrNzz6CGjo2UntLvk2RSPlhzgLvYEB3frRvbEF2wRKh1Z2fDIg9KRPe1fawv7C+g==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.59.0.tgz", + "integrity": "sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA==", "cpu": [ "arm64" ], @@ -5915,9 +6275,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.57.1.tgz", - "integrity": "sha512-1a/qhaaOXhqXGpMFMET9VqwZakkljWHLmZOX48R0I/YLbhdxr1m4gtG1Hq7++VhVUmf+L3sTAf9op4JlhQ5u1Q==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.59.0.tgz", + "integrity": "sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA==", "cpu": [ "arm64" ], @@ -5928,9 +6288,9 @@ ] }, "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.57.1.tgz", - "integrity": "sha512-QWO6RQTZ/cqYtJMtxhkRkidoNGXc7ERPbZN7dVW5SdURuLeVU7lwKMpo18XdcmpWYd0qsP1bwKPf7DNSUinhvA==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.59.0.tgz", + "integrity": "sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg==", "cpu": [ "loong64" ], @@ -5941,9 +6301,9 @@ ] }, "node_modules/@rollup/rollup-linux-loong64-musl": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.57.1.tgz", - "integrity": "sha512-xpObYIf+8gprgWaPP32xiN5RVTi/s5FCR+XMXSKmhfoJjrpRAjCuuqQXyxUa/eJTdAE6eJ+KDKaoEqjZQxh3Gw==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.59.0.tgz", + "integrity": "sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q==", "cpu": [ "loong64" ], @@ -5954,9 +6314,9 @@ ] }, "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.57.1.tgz", - "integrity": "sha512-4BrCgrpZo4hvzMDKRqEaW1zeecScDCR+2nZ86ATLhAoJ5FQ+lbHVD3ttKe74/c7tNT9c6F2viwB3ufwp01Oh2w==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.59.0.tgz", + "integrity": "sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA==", "cpu": [ "ppc64" ], @@ -5967,9 +6327,9 @@ ] }, "node_modules/@rollup/rollup-linux-ppc64-musl": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.57.1.tgz", - "integrity": "sha512-NOlUuzesGauESAyEYFSe3QTUguL+lvrN1HtwEEsU2rOwdUDeTMJdO5dUYl/2hKf9jWydJrO9OL/XSSf65R5+Xw==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.59.0.tgz", + "integrity": "sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA==", "cpu": [ "ppc64" ], @@ -5980,9 +6340,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.57.1.tgz", - "integrity": "sha512-ptA88htVp0AwUUqhVghwDIKlvJMD/fmL/wrQj99PRHFRAG6Z5nbWoWG4o81Nt9FT+IuqUQi+L31ZKAFeJ5Is+A==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.59.0.tgz", + "integrity": "sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg==", "cpu": [ "riscv64" ], @@ -5993,9 +6353,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.57.1.tgz", - "integrity": "sha512-S51t7aMMTNdmAMPpBg7OOsTdn4tySRQvklmL3RpDRyknk87+Sp3xaumlatU+ppQ+5raY7sSTcC2beGgvhENfuw==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.59.0.tgz", + "integrity": "sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg==", "cpu": [ "riscv64" ], @@ -6006,9 +6366,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.57.1.tgz", - "integrity": "sha512-Bl00OFnVFkL82FHbEqy3k5CUCKH6OEJL54KCyx2oqsmZnFTR8IoNqBF+mjQVcRCT5sB6yOvK8A37LNm/kPJiZg==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.59.0.tgz", + "integrity": "sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w==", "cpu": [ "s390x" ], @@ -6019,9 +6379,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.57.1.tgz", - "integrity": "sha512-ABca4ceT4N+Tv/GtotnWAeXZUZuM/9AQyCyKYyKnpk4yoA7QIAuBt6Hkgpw8kActYlew2mvckXkvx0FfoInnLg==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.59.0.tgz", + "integrity": "sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg==", "cpu": [ "x64" ], @@ -6032,9 +6392,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.57.1.tgz", - "integrity": "sha512-HFps0JeGtuOR2convgRRkHCekD7j+gdAuXM+/i6kGzQtFhlCtQkpwtNzkNj6QhCDp7DRJ7+qC/1Vg2jt5iSOFw==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.59.0.tgz", + "integrity": "sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg==", "cpu": [ "x64" ], @@ -6045,9 +6405,9 @@ ] }, "node_modules/@rollup/rollup-openbsd-x64": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.57.1.tgz", - "integrity": "sha512-H+hXEv9gdVQuDTgnqD+SQffoWoc0Of59AStSzTEj/feWTBAnSfSD3+Dql1ZruJQxmykT/JVY0dE8Ka7z0DH1hw==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.59.0.tgz", + "integrity": "sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ==", "cpu": [ "x64" ], @@ -6058,9 +6418,9 @@ ] }, "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.57.1.tgz", - "integrity": "sha512-4wYoDpNg6o/oPximyc/NG+mYUejZrCU2q+2w6YZqrAs2UcNUChIZXjtafAiiZSUc7On8v5NyNj34Kzj/Ltk6dQ==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.59.0.tgz", + "integrity": "sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA==", "cpu": [ "arm64" ], @@ -6071,9 +6431,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.57.1.tgz", - "integrity": "sha512-O54mtsV/6LW3P8qdTcamQmuC990HDfR71lo44oZMZlXU4tzLrbvTii87Ni9opq60ds0YzuAlEr/GNwuNluZyMQ==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.59.0.tgz", + "integrity": "sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A==", "cpu": [ "arm64" ], @@ -6084,9 +6444,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.57.1.tgz", - "integrity": "sha512-P3dLS+IerxCT/7D2q2FYcRdWRl22dNbrbBEtxdWhXrfIMPP9lQhb5h4Du04mdl5Woq05jVCDPCMF7Ub0NAjIew==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.59.0.tgz", + "integrity": "sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA==", "cpu": [ "ia32" ], @@ -6097,9 +6457,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.57.1.tgz", - "integrity": "sha512-VMBH2eOOaKGtIJYleXsi2B8CPVADrh+TyNxJ4mWPnKfLB/DBUmzW+5m1xUrcwWoMfSLagIRpjUFeW5CO5hyciQ==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.59.0.tgz", + "integrity": "sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA==", "cpu": [ "x64" ], @@ -6110,9 +6470,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.57.1.tgz", - "integrity": "sha512-mxRFDdHIWRxg3UfIIAwCm6NzvxG0jDX/wBN6KsQFTvKFqqg9vTrWUE68qEjHt19A5wwx5X5aUi2zuZT7YR0jrA==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.59.0.tgz", + "integrity": "sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA==", "cpu": [ "x64" ], @@ -6123,115 +6483,102 @@ ] }, "node_modules/@sentry-internal/browser-utils": { - "version": "10.39.0", - "resolved": "https://registry.npmjs.org/@sentry-internal/browser-utils/-/browser-utils-10.39.0.tgz", - "integrity": "sha512-W6WODonMGiI13Az5P7jd/m2lj/JpIyuVKg7wE4X+YdlMehLspAv6I7gRE4OBSumS14ZjdaYDpD/lwtnBwKAzcA==", + "version": "10.43.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/browser-utils/-/browser-utils-10.43.0.tgz", + "integrity": "sha512-8zYTnzhAPvNkVH1Irs62wl0J/c+0QcJ62TonKnzpSFUUD3V5qz8YDZbjIDGfxy+1EB9fO0sxtddKCzwTHF/MbQ==", "license": "MIT", "dependencies": { - "@sentry/core": "10.39.0" + "@sentry/core": "10.43.0" }, "engines": { "node": ">=18" } }, "node_modules/@sentry-internal/feedback": { - "version": "10.39.0", - "resolved": "https://registry.npmjs.org/@sentry-internal/feedback/-/feedback-10.39.0.tgz", - "integrity": "sha512-cRXmmDeOr5FzVsBNRLU4WDEuC3fhuD0XV362EWl4DI3XBGao8ukaueKcLIKic5WZx6uXimjWw/UJmDLgxeCqkg==", + "version": "10.43.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/feedback/-/feedback-10.43.0.tgz", + "integrity": "sha512-YoXuwluP6eOcQxTeTtaWb090++MrLyWOVsUTejzUQQ6LFL13Jwt+bDPF1kvBugMq4a7OHw/UNKQfd6//rZMn2g==", "license": "MIT", "dependencies": { - "@sentry/core": "10.39.0" + "@sentry/core": "10.43.0" }, "engines": { "node": ">=18" } }, "node_modules/@sentry-internal/replay": { - "version": "10.39.0", - "resolved": "https://registry.npmjs.org/@sentry-internal/replay/-/replay-10.39.0.tgz", - "integrity": "sha512-obZoYOrUfxIYBHkmtPpItRdE38VuzF1VIxSgZ8Mbtq/9UvCWh+eOaVWU2stN/cVu1KYuYX0nQwBvdN28L6y/JA==", + "version": "10.43.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/replay/-/replay-10.43.0.tgz", + "integrity": "sha512-khCXlGrlH1IU7P5zCEAJFestMeH97zDVCekj8OsNNDtN/1BmCJ46k6Xi0EqAUzdJgrOLJeLdoYdgtiIjovZ8Sg==", "license": "MIT", "dependencies": { - "@sentry-internal/browser-utils": "10.39.0", - "@sentry/core": "10.39.0" + "@sentry-internal/browser-utils": "10.43.0", + "@sentry/core": "10.43.0" }, "engines": { "node": ">=18" } }, "node_modules/@sentry-internal/replay-canvas": { - "version": "10.39.0", - "resolved": "https://registry.npmjs.org/@sentry-internal/replay-canvas/-/replay-canvas-10.39.0.tgz", - "integrity": "sha512-TTiX0XWCcqTqFGJjEZYObk93j/sJmXcqPzcu0cN2mIkKnnaHDY3w74SHZCshKqIr0AOQdt1HDNa36s3TCdt0Jw==", + "version": "10.43.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/replay-canvas/-/replay-canvas-10.43.0.tgz", + "integrity": "sha512-ZIw1UNKOFXo1LbPCJPMAx9xv7D8TMZQusLDUgb6BsPQJj0igAuwd7KRGTkjjgnrwBp2O/sxcQFRhQhknWk7QPg==", "license": "MIT", "dependencies": { - "@sentry-internal/replay": "10.39.0", - "@sentry/core": "10.39.0" + "@sentry-internal/replay": "10.43.0", + "@sentry/core": "10.43.0" }, "engines": { "node": ">=18" } }, "node_modules/@sentry/babel-plugin-component-annotate": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/@sentry/babel-plugin-component-annotate/-/babel-plugin-component-annotate-4.9.1.tgz", - "integrity": "sha512-0gEoi2Lb54MFYPOmdTfxlNKxI7kCOvNV7gP8lxMXJ7nCazF5OqOOZIVshfWjDLrc0QrSV6XdVvwPV9GDn4wBMg==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@sentry/babel-plugin-component-annotate/-/babel-plugin-component-annotate-5.1.1.tgz", + "integrity": "sha512-x2wEpBHwsTyTF2rWsLKJlzrRF1TTIGOfX+ngdE+Yd5DBkoS58HwQv824QOviPGQRla4/ypISqAXzjdDPL/zalg==", "license": "MIT", "engines": { - "node": ">= 14" + "node": ">= 18" } }, "node_modules/@sentry/browser": { - "version": "10.39.0", - "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-10.39.0.tgz", - "integrity": "sha512-I50W/1PDJWyqgNrGufGhBYCmmO3Bb159nx2Ut2bKoVveTfgH/hLEtDyW0kHo8Fu454mW+ukyXfU4L4s+kB9aaw==", + "version": "10.43.0", + "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-10.43.0.tgz", + "integrity": "sha512-2V3I3sXi3SMeiZpKixd9ztokSgK27cmvsD9J5oyOyjhGLTW/6QKCwHbKnluMgQMXq20nixQk5zN4wRjRUma3sg==", "license": "MIT", "dependencies": { - "@sentry-internal/browser-utils": "10.39.0", - "@sentry-internal/feedback": "10.39.0", - "@sentry-internal/replay": "10.39.0", - "@sentry-internal/replay-canvas": "10.39.0", - "@sentry/core": "10.39.0" + "@sentry-internal/browser-utils": "10.43.0", + "@sentry-internal/feedback": "10.43.0", + "@sentry-internal/replay": "10.43.0", + "@sentry-internal/replay-canvas": "10.43.0", + "@sentry/core": "10.43.0" }, "engines": { "node": ">=18" } }, "node_modules/@sentry/bundler-plugin-core": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/@sentry/bundler-plugin-core/-/bundler-plugin-core-4.9.1.tgz", - "integrity": "sha512-moii+w7N8k8WdvkX7qCDY9iRBlhgHlhTHTUQwF2FNMhBHuqlNpVcSJJqJMjFUQcjYMBDrZgxhfKV18bt5ixwlQ==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@sentry/bundler-plugin-core/-/bundler-plugin-core-5.1.1.tgz", + "integrity": "sha512-F+itpwR9DyQR7gEkrXd2tigREPTvtF5lC8qu6e4anxXYRTui1+dVR0fXNwjpyAZMhIesLfXRN7WY7ggdj7hi0Q==", "license": "MIT", "dependencies": { "@babel/core": "^7.18.5", - "@sentry/babel-plugin-component-annotate": "4.9.1", - "@sentry/cli": "^2.57.0", + "@sentry/babel-plugin-component-annotate": "5.1.1", + "@sentry/cli": "^2.58.5", "dotenv": "^16.3.1", "find-up": "^5.0.0", - "glob": "^10.5.0", - "magic-string": "0.30.8", - "unplugin": "1.0.1" + "glob": "^13.0.6", + "magic-string": "~0.30.8" }, "engines": { - "node": ">= 14" - } - }, - "node_modules/@sentry/bundler-plugin-core/node_modules/magic-string": { - "version": "0.30.8", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.8.tgz", - "integrity": "sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==", - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.15" - }, - "engines": { - "node": ">=12" + "node": ">= 18" } }, "node_modules/@sentry/cli": { - "version": "2.58.4", - "resolved": "https://registry.npmjs.org/@sentry/cli/-/cli-2.58.4.tgz", - "integrity": "sha512-ArDrpuS8JtDYEvwGleVE+FgR+qHaOp77IgdGSacz6SZy6Lv90uX0Nu4UrHCQJz8/xwIcNxSqnN22lq0dH4IqTg==", + "version": "2.58.5", + "resolved": "https://registry.npmjs.org/@sentry/cli/-/cli-2.58.5.tgz", + "integrity": "sha512-tavJ7yGUZV+z3Ct2/ZB6mg339i08sAk6HDkgqmSRuQEu2iLS5sl9HIvuXfM6xjv8fwlgFOSy++WNABNAcGHUbg==", "hasInstallScript": true, "license": "FSL-1.1-MIT", "dependencies": { @@ -6248,20 +6595,20 @@ "node": ">= 10" }, "optionalDependencies": { - "@sentry/cli-darwin": "2.58.4", - "@sentry/cli-linux-arm": "2.58.4", - "@sentry/cli-linux-arm64": "2.58.4", - "@sentry/cli-linux-i686": "2.58.4", - "@sentry/cli-linux-x64": "2.58.4", - "@sentry/cli-win32-arm64": "2.58.4", - "@sentry/cli-win32-i686": "2.58.4", - "@sentry/cli-win32-x64": "2.58.4" + "@sentry/cli-darwin": "2.58.5", + "@sentry/cli-linux-arm": "2.58.5", + "@sentry/cli-linux-arm64": "2.58.5", + "@sentry/cli-linux-i686": "2.58.5", + "@sentry/cli-linux-x64": "2.58.5", + "@sentry/cli-win32-arm64": "2.58.5", + "@sentry/cli-win32-i686": "2.58.5", + "@sentry/cli-win32-x64": "2.58.5" } }, "node_modules/@sentry/cli-darwin": { - "version": "2.58.4", - "resolved": "https://registry.npmjs.org/@sentry/cli-darwin/-/cli-darwin-2.58.4.tgz", - "integrity": "sha512-kbTD+P4X8O+nsNwPxCywtj3q22ecyRHWff98rdcmtRrvwz8CKi/T4Jxn/fnn2i4VEchy08OWBuZAqaA5Kh2hRQ==", + "version": "2.58.5", + "resolved": "https://registry.npmjs.org/@sentry/cli-darwin/-/cli-darwin-2.58.5.tgz", + "integrity": "sha512-lYrNzenZFJftfwSya7gwrHGxtE+Kob/e1sr9lmHMFOd4utDlmq0XFDllmdZAMf21fxcPRI1GL28ejZ3bId01fQ==", "license": "FSL-1.1-MIT", "optional": true, "os": [ @@ -6272,9 +6619,9 @@ } }, "node_modules/@sentry/cli-linux-arm": { - "version": "2.58.4", - "resolved": "https://registry.npmjs.org/@sentry/cli-linux-arm/-/cli-linux-arm-2.58.4.tgz", - "integrity": "sha512-rdQ8beTwnN48hv7iV7e7ZKucPec5NJkRdrrycMJMZlzGBPi56LqnclgsHySJ6Kfq506A2MNuQnKGaf/sBC9REA==", + "version": "2.58.5", + "resolved": "https://registry.npmjs.org/@sentry/cli-linux-arm/-/cli-linux-arm-2.58.5.tgz", + "integrity": "sha512-KtHweSIomYL4WVDrBrYSYJricKAAzxUgX86kc6OnlikbyOhoK6Fy8Vs6vwd52P6dvWPjgrMpUYjW2M5pYXQDUw==", "cpu": [ "arm" ], @@ -6290,9 +6637,9 @@ } }, "node_modules/@sentry/cli-linux-arm64": { - "version": "2.58.4", - "resolved": "https://registry.npmjs.org/@sentry/cli-linux-arm64/-/cli-linux-arm64-2.58.4.tgz", - "integrity": "sha512-0g0KwsOozkLtzN8/0+oMZoOuQ0o7W6O+hx+ydVU1bktaMGKEJLMAWxOQNjsh1TcBbNIXVOKM/I8l0ROhaAb8Ig==", + "version": "2.58.5", + "resolved": "https://registry.npmjs.org/@sentry/cli-linux-arm64/-/cli-linux-arm64-2.58.5.tgz", + "integrity": "sha512-/4gywFeBqRB6tR/iGMRAJ3HRqY6Z7Yp4l8ZCbl0TDLAfHNxu7schEw4tSnm2/Hh9eNMiOVy4z58uzAWlZXAYBQ==", "cpu": [ "arm64" ], @@ -6308,9 +6655,9 @@ } }, "node_modules/@sentry/cli-linux-i686": { - "version": "2.58.4", - "resolved": "https://registry.npmjs.org/@sentry/cli-linux-i686/-/cli-linux-i686-2.58.4.tgz", - "integrity": "sha512-NseoIQAFtkziHyjZNPTu1Gm1opeQHt7Wm1LbLrGWVIRvUOzlslO9/8i6wETUZ6TjlQxBVRgd3Q0lRBG2A8rFYA==", + "version": "2.58.5", + "resolved": "https://registry.npmjs.org/@sentry/cli-linux-i686/-/cli-linux-i686-2.58.5.tgz", + "integrity": "sha512-G7261dkmyxqlMdyvyP06b+RTIVzp1gZNgglj5UksxSouSUqRd/46W/2pQeOMPhloDYo9yLtCN2YFb3Mw4aUsWw==", "cpu": [ "x86", "ia32" @@ -6327,9 +6674,9 @@ } }, "node_modules/@sentry/cli-linux-x64": { - "version": "2.58.4", - "resolved": "https://registry.npmjs.org/@sentry/cli-linux-x64/-/cli-linux-x64-2.58.4.tgz", - "integrity": "sha512-d3Arz+OO/wJYTqCYlSN3Ktm+W8rynQ/IMtSZLK8nu0ryh5mJOh+9XlXY6oDXw4YlsM8qCRrNquR8iEI1Y/IH+Q==", + "version": "2.58.5", + "resolved": "https://registry.npmjs.org/@sentry/cli-linux-x64/-/cli-linux-x64-2.58.5.tgz", + "integrity": "sha512-rP04494RSmt86xChkQ+ecBNRYSPbyXc4u0IA7R7N1pSLCyO74e5w5Al+LnAq35cMfVbZgz5Sm0iGLjyiUu4I1g==", "cpu": [ "x64" ], @@ -6345,9 +6692,9 @@ } }, "node_modules/@sentry/cli-win32-arm64": { - "version": "2.58.4", - "resolved": "https://registry.npmjs.org/@sentry/cli-win32-arm64/-/cli-win32-arm64-2.58.4.tgz", - "integrity": "sha512-bqYrF43+jXdDBh0f8HIJU3tbvlOFtGyRjHB8AoRuMQv9TEDUfENZyCelhdjA+KwDKYl48R1Yasb4EHNzsoO83w==", + "version": "2.58.5", + "resolved": "https://registry.npmjs.org/@sentry/cli-win32-arm64/-/cli-win32-arm64-2.58.5.tgz", + "integrity": "sha512-AOJ2nCXlQL1KBaCzv38m3i2VmSHNurUpm7xVKd6yAHX+ZoVBI8VT0EgvwmtJR2TY2N2hNCC7UrgRmdUsQ152bA==", "cpu": [ "arm64" ], @@ -6361,9 +6708,9 @@ } }, "node_modules/@sentry/cli-win32-i686": { - "version": "2.58.4", - "resolved": "https://registry.npmjs.org/@sentry/cli-win32-i686/-/cli-win32-i686-2.58.4.tgz", - "integrity": "sha512-3triFD6jyvhVcXOmGyttf+deKZcC1tURdhnmDUIBkiDPJKGT/N5xa4qAtHJlAB/h8L9jgYih9bvJnvvFVM7yug==", + "version": "2.58.5", + "resolved": "https://registry.npmjs.org/@sentry/cli-win32-i686/-/cli-win32-i686-2.58.5.tgz", + "integrity": "sha512-EsuboLSOnlrN7MMPJ1eFvfMDm+BnzOaSWl8eYhNo8W/BIrmNgpRUdBwnWn9Q2UOjJj5ZopukmsiMYtU/D7ml9g==", "cpu": [ "x86", "ia32" @@ -6378,9 +6725,9 @@ } }, "node_modules/@sentry/cli-win32-x64": { - "version": "2.58.4", - "resolved": "https://registry.npmjs.org/@sentry/cli-win32-x64/-/cli-win32-x64-2.58.4.tgz", - "integrity": "sha512-cSzN4PjM1RsCZ4pxMjI0VI7yNCkxiJ5jmWncyiwHXGiXrV1eXYdQ3n1LhUYLZ91CafyprR0OhDcE+RVZ26Qb5w==", + "version": "2.58.5", + "resolved": "https://registry.npmjs.org/@sentry/cli-win32-x64/-/cli-win32-x64-2.58.5.tgz", + "integrity": "sha512-IZf+XIMiQwj+5NzqbOQfywlOitmCV424Vtf9c+ep61AaVScUFD1TSrQbOcJJv5xGxhlxNOMNgMeZhdexdzrKZg==", "cpu": [ "x64" ], @@ -6394,9 +6741,9 @@ } }, "node_modules/@sentry/core": { - "version": "10.39.0", - "resolved": "https://registry.npmjs.org/@sentry/core/-/core-10.39.0.tgz", - "integrity": "sha512-xCLip2mBwCdRrvXHtVEULX0NffUTYZZBhEUGht0WFL+GNdNQ7gmBOGOczhZlrf2hgFFtDO0fs1xiP9bqq5orEQ==", + "version": "10.43.0", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-10.43.0.tgz", + "integrity": "sha512-l0SszQAPiQGWl/ferw8GP3ALyHXiGiRKJaOvNmhGO+PrTQyZTZ6OYyPnGijAFRg58dE1V3RCH/zw5d2xSUIiNg==", "license": "MIT", "engines": { "node": ">=18" @@ -6440,22 +6787,22 @@ } }, "node_modules/@sentry/nextjs": { - "version": "10.39.0", - "resolved": "https://registry.npmjs.org/@sentry/nextjs/-/nextjs-10.39.0.tgz", - "integrity": "sha512-u8Wp8V5zA2OTREmBXNm1UNtdQv3oJOH/ZC83tQH8wV8GCJfkSw7qDp89T1fbyMvYKOdQuhT4pxeriHCq8S5L0g==", + "version": "10.43.0", + "resolved": "https://registry.npmjs.org/@sentry/nextjs/-/nextjs-10.43.0.tgz", + "integrity": "sha512-SmybDiZdI4c7GQYvi+HNBKbnKOmIaiqsLj67vVVV0tN6A1iX9OrP5jldxawzrd9wn5oXDhHSyzJmyKwdOu7/MQ==", "license": "MIT", "dependencies": { "@opentelemetry/api": "^1.9.0", "@opentelemetry/semantic-conventions": "^1.37.0", "@rollup/plugin-commonjs": "28.0.1", - "@sentry-internal/browser-utils": "10.39.0", - "@sentry/bundler-plugin-core": "^4.9.0", - "@sentry/core": "10.39.0", - "@sentry/node": "10.39.0", - "@sentry/opentelemetry": "10.39.0", - "@sentry/react": "10.39.0", - "@sentry/vercel-edge": "10.39.0", - "@sentry/webpack-plugin": "^4.8.0", + "@sentry-internal/browser-utils": "10.43.0", + "@sentry/bundler-plugin-core": "^5.1.0", + "@sentry/core": "10.43.0", + "@sentry/node": "10.43.0", + "@sentry/opentelemetry": "10.43.0", + "@sentry/react": "10.43.0", + "@sentry/vercel-edge": "10.43.0", + "@sentry/webpack-plugin": "^5.1.0", "rollup": "^4.35.0", "stacktrace-parser": "^0.1.10" }, @@ -6467,14 +6814,15 @@ } }, "node_modules/@sentry/node": { - "version": "10.39.0", - "resolved": "https://registry.npmjs.org/@sentry/node/-/node-10.39.0.tgz", - "integrity": "sha512-dx66DtU/xkCTPEDsjU+mYSIEbzu06pzKNQcDA2wvx7wvwsUciZ5yA32Ce/o6p2uHHgy0/joJX9rP5J/BIijaOA==", + "version": "10.43.0", + "resolved": "https://registry.npmjs.org/@sentry/node/-/node-10.43.0.tgz", + "integrity": "sha512-oNwXcuZUc4uTTr0WbHZBBIKsKwAKvNMTgbXwxfB37CfzV18wbTirbQABZ/Ir3WNxSgi6ZcnC6UE013jF5XWPqw==", "license": "MIT", "dependencies": { + "@fastify/otel": "0.16.0", "@opentelemetry/api": "^1.9.0", - "@opentelemetry/context-async-hooks": "^2.5.0", - "@opentelemetry/core": "^2.5.0", + "@opentelemetry/context-async-hooks": "^2.5.1", + "@opentelemetry/core": "^2.5.1", "@opentelemetry/instrumentation": "^0.211.0", "@opentelemetry/instrumentation-amqplib": "0.58.0", "@opentelemetry/instrumentation-connect": "0.54.0", @@ -6498,29 +6846,27 @@ "@opentelemetry/instrumentation-redis": "0.59.0", "@opentelemetry/instrumentation-tedious": "0.30.0", "@opentelemetry/instrumentation-undici": "0.21.0", - "@opentelemetry/resources": "^2.5.0", - "@opentelemetry/sdk-trace-base": "^2.5.0", + "@opentelemetry/resources": "^2.5.1", + "@opentelemetry/sdk-trace-base": "^2.5.1", "@opentelemetry/semantic-conventions": "^1.39.0", "@prisma/instrumentation": "7.2.0", - "@sentry/core": "10.39.0", - "@sentry/node-core": "10.39.0", - "@sentry/opentelemetry": "10.39.0", - "import-in-the-middle": "^2.0.6", - "minimatch": "^9.0.0" + "@sentry/core": "10.43.0", + "@sentry/node-core": "10.43.0", + "@sentry/opentelemetry": "10.43.0", + "import-in-the-middle": "^2.0.6" }, "engines": { "node": ">=18" } }, "node_modules/@sentry/node-core": { - "version": "10.39.0", - "resolved": "https://registry.npmjs.org/@sentry/node-core/-/node-core-10.39.0.tgz", - "integrity": "sha512-xdeBG00TmtAcGvXnZNbqOCvnZ5kY3s5aT/L8wUQ0w0TT2KmrC9XL/7UHUfJ45TLbjl10kZOtaMQXgUjpwSJW+g==", + "version": "10.43.0", + "resolved": "https://registry.npmjs.org/@sentry/node-core/-/node-core-10.43.0.tgz", + "integrity": "sha512-w2H3NSkNMoYOS7o7mR55BM7+xL++dPxMSv1/XDfsra9FYHGppO+Mxk667Ee5k+uDi+wNIioICIh+5XOvZh4+HQ==", "license": "MIT", "dependencies": { - "@apm-js-collab/tracing-hooks": "^0.3.1", - "@sentry/core": "10.39.0", - "@sentry/opentelemetry": "10.39.0", + "@sentry/core": "10.43.0", + "@sentry/opentelemetry": "10.43.0", "import-in-the-middle": "^2.0.6" }, "engines": { @@ -6560,12 +6906,12 @@ } }, "node_modules/@sentry/opentelemetry": { - "version": "10.39.0", - "resolved": "https://registry.npmjs.org/@sentry/opentelemetry/-/opentelemetry-10.39.0.tgz", - "integrity": "sha512-eU8t/pyxjy7xYt6PNCVxT+8SJw5E3pnupdcUNN4ClqG4O5lX4QCDLtId48ki7i30VqrLtR7vmCHMSvqXXdvXPA==", + "version": "10.43.0", + "resolved": "https://registry.npmjs.org/@sentry/opentelemetry/-/opentelemetry-10.43.0.tgz", + "integrity": "sha512-+fIcnnLdvBHdq4nKq23t9v/B9D4L97fPWEDksXbpGs11o6BsqY4Tlzmce6cP95iiQhPckCEag3FthSND+BYtYQ==", "license": "MIT", "dependencies": { - "@sentry/core": "10.39.0" + "@sentry/core": "10.43.0" }, "engines": { "node": ">=18" @@ -6579,13 +6925,13 @@ } }, "node_modules/@sentry/react": { - "version": "10.39.0", - "resolved": "https://registry.npmjs.org/@sentry/react/-/react-10.39.0.tgz", - "integrity": "sha512-qxReWHFhDcXNGEyAlYzhR7+K70es+vXaSknTZui1q7TfQwCT1rZlLKn/K8GDpNsb35RC5QhiIphU6pKbyYgZqw==", + "version": "10.43.0", + "resolved": "https://registry.npmjs.org/@sentry/react/-/react-10.43.0.tgz", + "integrity": "sha512-shvErEpJ41i0Q3lIZl0CDWYQ7m8yHLi7ECG0gFvN8zf8pEdl5grQIOoe3t/GIUzcpCcor16F148ATmKJJypc/Q==", "license": "MIT", "dependencies": { - "@sentry/browser": "10.39.0", - "@sentry/core": "10.39.0" + "@sentry/browser": "10.43.0", + "@sentry/core": "10.43.0" }, "engines": { "node": ">=18" @@ -6595,13 +6941,13 @@ } }, "node_modules/@sentry/types": { - "version": "10.39.0", - "resolved": "https://registry.npmjs.org/@sentry/types/-/types-10.39.0.tgz", - "integrity": "sha512-tRPFcjnBoljGYCNXql3aJBCLcHreoqXYv3SMr6bpFGY7JIP5HryXuESkEiDI8r3yggeb3TOCjqJ9GaixzEc71g==", + "version": "10.43.0", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-10.43.0.tgz", + "integrity": "sha512-AbKGWFGmDJkl0F7yvNTqZEovMJTAEdVbsZC/Zy6w2PFUk7pHUtIJQ5DXkBxJ9QVZhOjGmHQRLKvXYaeXmI/6PA==", "dev": true, "license": "MIT", "dependencies": { - "@sentry/core": "10.39.0" + "@sentry/core": "10.43.0" }, "engines": { "node": ">=18" @@ -6629,34 +6975,33 @@ } }, "node_modules/@sentry/vercel-edge": { - "version": "10.39.0", - "resolved": "https://registry.npmjs.org/@sentry/vercel-edge/-/vercel-edge-10.39.0.tgz", - "integrity": "sha512-73QxAyOSBUpmBc/A8AcJfom/sPN+0thGQRLHzH6uvRxbap2+a3qhKJzQsDkcEUkzY0ScTf2R3j/soYNn1pKlaQ==", + "version": "10.43.0", + "resolved": "https://registry.npmjs.org/@sentry/vercel-edge/-/vercel-edge-10.43.0.tgz", + "integrity": "sha512-souwH0QGKh2KE5ZH1ZYii1dbT5qsCP1VN+wpIG89ui85+eSmUQfakIjyS2Trs6JfxZ9TIYmmBTkWE9ziEseItg==", "license": "MIT", "dependencies": { "@opentelemetry/api": "^1.9.0", - "@opentelemetry/resources": "^2.5.0", - "@sentry/core": "10.39.0" + "@opentelemetry/resources": "^2.5.1", + "@sentry/core": "10.43.0" }, "engines": { "node": ">=18" } }, "node_modules/@sentry/webpack-plugin": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/@sentry/webpack-plugin/-/webpack-plugin-4.9.1.tgz", - "integrity": "sha512-Ssx2lHiq8VWywUGd/hmW3U3VYBC0Up7D6UzUiDAWvy18PbTCVszaa54fKMFEQ1yIBg/ePRET53pIzfkcZgifmQ==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@sentry/webpack-plugin/-/webpack-plugin-5.1.1.tgz", + "integrity": "sha512-XgQg+t2aVrlQDfIiAEizqR/bsy6GtBygwgR+Kw11P/cYczj4W9PZ2IYqQEStBzHqnRTh5DbpyMcUNW2CujdA9A==", "license": "MIT", "dependencies": { - "@sentry/bundler-plugin-core": "4.9.1", - "unplugin": "1.0.1", + "@sentry/bundler-plugin-core": "5.1.1", "uuid": "^9.0.0" }, "engines": { - "node": ">= 14" + "node": ">= 18" }, "peerDependencies": { - "webpack": ">=4.40.0" + "webpack": ">=5.0.0" } }, "node_modules/@sinclair/typebox": { @@ -6677,9 +7022,9 @@ } }, "node_modules/@sinonjs/fake-timers": { - "version": "13.0.5", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-13.0.5.tgz", - "integrity": "sha512-36/hTbH2uaWuGVERyC6da9YwGWnzUZXuPro/F2LfsdOsLnCojz/iSH8MxUt/FD2S5XBSVPhmArFUXcpCQ2Hkiw==", + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-15.1.1.tgz", + "integrity": "sha512-cO5W33JgAPbOh07tvZjUOJ7oWhtaqGHiZw+11DPbyqh2kHTBc3eF/CjJDeQ4205RLQsX6rxCuYOroFQwl7JDRw==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -6973,6 +7318,12 @@ "tslib": "^2.8.0" } }, + "node_modules/@swc/helpers/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, "node_modules/@testing-library/dom": { "version": "10.4.1", "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.1.tgz", @@ -7090,14 +7441,37 @@ } } }, - "node_modules/@trysound/sax": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", - "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", + "node_modules/@trivago/prettier-plugin-sort-imports/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==", + "dev": true, + "license": "MIT" + }, + "node_modules/@trivago/prettier-plugin-sort-imports/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@trivago/prettier-plugin-sort-imports/node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", "dev": true, "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.2" + }, "engines": { - "node": ">=10.13.0" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/@tybys/wasm-util": { @@ -7111,6 +7485,14 @@ "tslib": "^2.4.0" } }, + "node_modules/@tybys/wasm-util/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD", + "optional": true + }, "node_modules/@types/aria-query": { "version": "5.0.4", "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", @@ -7261,9 +7643,9 @@ } }, "node_modules/@types/jest/node_modules/pretty-format": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.2.0.tgz", - "integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==", + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.3.0.tgz", + "integrity": "sha512-oG4T3wCbfeuvljnyAzhBvpN45E8iOTXCU/TD3zXW80HA3dQ4ahdqMkWGiPWZvjpQwlbyHrPTWUAqUzGzv4l1JQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7308,9 +7690,9 @@ "license": "MIT" }, "node_modules/@types/lodash": { - "version": "4.17.23", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.23.tgz", - "integrity": "sha512-RDvF6wTulMPjrNdCoYRC8gNR880JNGT8uB+REUpC2Ns4pRqQJhGz90wh7rgdXDPpCczF3VGktDuFGVnz8zP7HA==", + "version": "4.17.24", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.24.tgz", + "integrity": "sha512-gIW7lQLZbue7lRSWEFql49QJJWThrTFFeIMJdp3eH4tKoxm1OvEPg02rm4wCCSHS0cL3/Fizimb35b7k8atwsQ==", "dev": true, "license": "MIT" }, @@ -7331,9 +7713,9 @@ } }, "node_modules/@types/node": { - "version": "25.3.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-25.3.0.tgz", - "integrity": "sha512-4K3bqJpXpqfg2XKGK9bpDTc6xO/xoUP/RBWS7AtRMug6zZFaRekiLzjVtAoZMquxoAbzBvy5nxQ7veS5eYzf8A==", + "version": "25.4.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-25.4.0.tgz", + "integrity": "sha512-9wLpoeWuBlcbBpOY3XmzSTG3oscB6xjBEEtn+pYXTfhyXhIxC5FsBer2KTopBlvKEiW9l13po9fq+SJY/5lkhw==", "license": "MIT", "dependencies": { "undici-types": "~7.18.0" @@ -7755,13 +8137,14 @@ ] }, "node_modules/@vercel/speed-insights": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@vercel/speed-insights/-/speed-insights-1.3.1.tgz", - "integrity": "sha512-PbEr7FrMkUrGYvlcLHGkXdCkxnylCWePx7lPxxq36DNdfo9mcUjLOmqOyPDHAOgnfqgGGdmE3XI9L/4+5fr+vQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@vercel/speed-insights/-/speed-insights-2.0.0.tgz", + "integrity": "sha512-jwkNcrTeafWxjmWq4AHBaptSqZiJkYU5adLC9QBSqeim0GcqDMgN5Ievh8OG1rJ6W3A4l1oiP7qr9CWxGuzu3w==", "license": "Apache-2.0", "peerDependencies": { "@sveltejs/kit": "^1 || ^2", "next": ">= 13", + "nuxt": ">= 3", "react": "^18 || ^19 || ^19.0.0-rc", "svelte": ">= 4", "vue": "^3", @@ -7774,6 +8157,9 @@ "next": { "optional": true }, + "nuxt": { + "optional": true + }, "react": { "optional": true }, @@ -7947,9 +8333,9 @@ "license": "Apache-2.0" }, "node_modules/acorn": { - "version": "8.15.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", "license": "MIT", "bin": { "acorn": "bin/acorn" @@ -8016,9 +8402,9 @@ } }, "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.14.0.tgz", + "integrity": "sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw==", "dev": true, "license": "MIT", "dependencies": { @@ -8138,6 +8524,7 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, "license": "ISC", "dependencies": { "normalize-path": "^3.0.0", @@ -8151,6 +8538,7 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, "license": "MIT", "engines": { "node": ">=8.6" @@ -8444,9 +8832,9 @@ } }, "node_modules/axios": { - "version": "1.13.5", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.5.tgz", - "integrity": "sha512-cz4ur7Vb0xS4/KUN0tPWe44eqxrIu31me+fbang3ijiNscE129POzipJJA6zniq2C/Z6sJCjMimjS8Lc/GAs8Q==", + "version": "1.13.6", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.6.tgz", + "integrity": "sha512-ChTCHMouEe2kn713WHbQGcuYrr6fXTBiu460OTwWrWob16g1bXn4vtz07Ope7ewMozJAnEquLk5lWQWtBig9DQ==", "dev": true, "license": "MIT", "dependencies": { @@ -8456,16 +8844,16 @@ } }, "node_modules/babel-jest": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-30.2.0.tgz", - "integrity": "sha512-0YiBEOxWqKkSQWL9nNGGEgndoeL0ZpWrbLMNL5u/Kaxrli3Eaxlt3ZtIDktEvXt4L/R9r3ODr2zKwGM/2BjxVw==", + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-30.3.0.tgz", + "integrity": "sha512-gRpauEU2KRrCox5Z296aeVHR4jQ98BCnu0IO332D/xpHNOsIH/bgSRk9k6GbKIbBw8vFeN6ctuu6tV8WOyVfYQ==", "dev": true, "license": "MIT", "dependencies": { - "@jest/transform": "30.2.0", + "@jest/transform": "30.3.0", "@types/babel__core": "^7.20.5", "babel-plugin-istanbul": "^7.0.1", - "babel-preset-jest": "30.2.0", + "babel-preset-jest": "30.3.0", "chalk": "^4.1.2", "graceful-fs": "^4.2.11", "slash": "^3.0.0" @@ -8498,9 +8886,9 @@ } }, "node_modules/babel-plugin-jest-hoist": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-30.2.0.tgz", - "integrity": "sha512-ftzhzSGMUnOzcCXd6WHdBGMyuwy15Wnn0iyyWGKgBDLxf9/s5ABuraCSpBX2uG0jUg4rqJnxsLc5+oYBqoxVaA==", + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-30.3.0.tgz", + "integrity": "sha512-+TRkByhsws6sfPjVaitzadk1I0F5sPvOVUH5tyTSzhePpsGIVrdeunHSw/C36QeocS95OOk8lunc4rlu5Anwsg==", "dev": true, "license": "MIT", "dependencies": { @@ -8542,14 +8930,14 @@ } }, "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.15", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.15.tgz", - "integrity": "sha512-hR3GwrRwHUfYwGfrisXPIDP3JcYfBrW7wKE7+Au6wDYl7fm/ka1NEII6kORzxNU556JjfidZeBsO10kYvtV1aw==", + "version": "0.4.16", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.16.tgz", + "integrity": "sha512-xaVwwSfebXf0ooE11BJovZYKhFjIvQo7TsyVpETuIeH2JHv0k/T6Y5j22pPTvqYqmpkxdlPAJlyJ0tfOJAoMxw==", "dev": true, "license": "MIT", "dependencies": { "@babel/compat-data": "^7.28.6", - "@babel/helper-define-polyfill-provider": "^0.6.6", + "@babel/helper-define-polyfill-provider": "^0.6.7", "semver": "^6.3.1" }, "peerDependencies": { @@ -8557,13 +8945,13 @@ } }, "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.14.0.tgz", - "integrity": "sha512-AvDcMxJ34W4Wgy4KBIIePQTAOP1Ie2WFwkQp3dB7FQ/f0lI5+nM96zUnYEOE1P9sEg0es5VCP0HxiWu5fUHZAQ==", + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.14.1.tgz", + "integrity": "sha512-ENp89vM9Pw4kv/koBb5N2f9bDZsR0hpf3BdPMOg/pkS3pwO4dzNnQZVXtBbeyAadgm865DmQG2jMMLqmZXvuCw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.6", + "@babel/helper-define-polyfill-provider": "^0.6.7", "core-js-compat": "^3.48.0" }, "peerDependencies": { @@ -8571,13 +8959,13 @@ } }, "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.6.6", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.6.tgz", - "integrity": "sha512-hYm+XLYRMvupxiQzrvXUj7YyvFFVfv5gI0R71AJzudg1g2AI2vyCPPIFEBjk162/wFzti3inBHo7isWFuEVS/A==", + "version": "0.6.7", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.7.tgz", + "integrity": "sha512-OTYbUlSwXhNgr4g6efMZgsO8//jA61P7ZbRX3iTT53VON8l+WQS8IAUEVo4a4cWknrg2W8Cj4gQhRYNCJ8GkAA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.6" + "@babel/helper-define-polyfill-provider": "^0.6.7" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" @@ -8611,13 +8999,13 @@ } }, "node_modules/babel-preset-jest": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-30.2.0.tgz", - "integrity": "sha512-US4Z3NOieAQumwFnYdUWKvUKh8+YSnS/gB3t6YBiz0bskpu7Pine8pPCheNxlPEW4wnUkma2a94YuW2q3guvCQ==", + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-30.3.0.tgz", + "integrity": "sha512-6ZcUbWHC+dMz2vfzdNwi87Z1gQsLNK2uLuK1Q89R11xdvejcivlYYwDlEv0FHX3VwEXpbBQ9uufB/MUNpZGfhQ==", "dev": true, "license": "MIT", "dependencies": { - "babel-plugin-jest-hoist": "30.2.0", + "babel-plugin-jest-hoist": "30.3.0", "babel-preset-current-node-syntax": "^1.2.0" }, "engines": { @@ -8628,10 +9016,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/base64-js": { "version": "1.5.1", @@ -8655,12 +9046,15 @@ "license": "MIT" }, "node_modules/baseline-browser-mapping": { - "version": "2.9.19", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.9.19.tgz", - "integrity": "sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg==", + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.0.tgz", + "integrity": "sha512-lIyg0szRfYbiy67j9KN8IyeD7q7hcmqnJ1ddWmNt19ItGpNN64mnllmxUNFIOdOm6by97jlL6wfpTTJrmnjWAA==", "license": "Apache-2.0", "bin": { - "baseline-browser-mapping": "dist/cli.js" + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" } }, "node_modules/bcrypt-pbkdf": { @@ -8673,18 +9067,6 @@ "tweetnacl": "^0.14.3" } }, - "node_modules/binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/blob-util": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/blob-util/-/blob-util-2.0.2.tgz", @@ -8707,24 +9089,15 @@ "license": "ISC" }, "node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.4.tgz", + "integrity": "sha512-h+DEnpVvxmfVefa4jFbCf5HdH5YMDXRsmKflpf1pILZWRFlTbJpxeU55nJl4Smt5HQaGzg1o6RHFPJaOqnmBDg==", "license": "MIT", "dependencies": { - "fill-range": "^7.1.1" + "balanced-match": "^4.0.2" }, "engines": { - "node": ">=8" + "node": "18 || 20 || >=22" } }, "node_modules/browserslist": { @@ -8907,9 +9280,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001770", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001770.tgz", - "integrity": "sha512-x/2CLQ1jHENRbHg5PSId2sXq1CIO1CISvwWAj027ltMVG2UNgW+w9oH2+HzgEIRFembL8bUlXtfbBHR1fCg2xw==", + "version": "1.0.30001777", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001777.tgz", + "integrity": "sha512-tmN+fJxroPndC74efCdp12j+0rk0RHwV5Jwa1zWaFVyw2ZxAuPeG8ZgWC3Wz7uSjT3qMRQ5XHZ4COgQmsCMJAQ==", "funding": [ { "type": "opencollective", @@ -9139,23 +9512,6 @@ "node": ">=12" } }, - "node_modules/cliui/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, "node_modules/clsx": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", @@ -9348,6 +9704,7 @@ "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, "license": "MIT", "dependencies": { "path-key": "^3.1.0", @@ -9466,9 +9823,9 @@ "license": "MIT" }, "node_modules/cypress": { - "version": "15.10.0", - "resolved": "https://registry.npmjs.org/cypress/-/cypress-15.10.0.tgz", - "integrity": "sha512-OtUh7OMrfEjKoXydlAD1CfG2BvKxIqgWGY4/RMjrqQ3BKGBo5JFKoYNH+Tpcj4xKxWH4XK0Xri+9y8WkxhYbqQ==", + "version": "15.11.0", + "resolved": "https://registry.npmjs.org/cypress/-/cypress-15.11.0.tgz", + "integrity": "sha512-NXDE6/fqZuzh1Zr53nyhCCa4lcANNTYWQNP9fJO+tzD3qVTDaTUni5xXMuigYjMujQ7CRiT9RkJJONmPQSsDFw==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -9510,9 +9867,10 @@ "proxy-from-env": "1.0.0", "request-progress": "^3.0.0", "supports-color": "^8.1.1", - "systeminformation": "^5.27.14", + "systeminformation": "^5.31.1", "tmp": "~0.2.4", "tree-kill": "1.2.2", + "tslib": "1.14.1", "untildify": "^4.0.0", "yauzl": "^2.10.0" }, @@ -9671,9 +10029,9 @@ } }, "node_modules/dedent": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.1.tgz", - "integrity": "sha512-9JmrhGZpOlEgOLdQgSm0zxFaYoQon408V1v49aqTWuXENVlnCuY9JBZcXZiCsZQWDjTm5Qf/nIvAy77mXDAjEg==", + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.2.tgz", + "integrity": "sha512-WzMx3mW98SN+zn3hgemf4OzdmyNhhhKz5Ay0pUfQiMQ3e1g+xmTJWp/pKdwKVXhdSkAEGIIzqeuWrL3mV/AXbA==", "dev": true, "license": "MIT", "peerDependencies": { @@ -9902,6 +10260,13 @@ "tslib": "^2.0.3" } }, + "node_modules/dot-case/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD" + }, "node_modules/dotenv": { "version": "16.6.1", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz", @@ -9940,6 +10305,7 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true, "license": "MIT" }, "node_modules/ecc-jsbn": { @@ -9954,9 +10320,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.286", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.286.tgz", - "integrity": "sha512-9tfDXhJ4RKFNerfjdCcZfufu49vg620741MNs26a9+bhLThdB+plgMeou98CAaHu/WATj2iHOOHTp1hWtABj2A==", + "version": "1.5.307", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.307.tgz", + "integrity": "sha512-5z3uFKBWjiNR44nFcYdkcXjKMbg5KXNdciu7mhTPo9tB7NbqSNP2sSnGR+fqknZSCwKkBN+oxiiajWs4dT6ORg==", "license": "ISC" }, "node_modules/emittery": { @@ -9989,9 +10355,9 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.19.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.19.0.tgz", - "integrity": "sha512-phv3E1Xl4tQOShqSte26C7Fl84EwUdZsyOuSSk9qtAGyyQs2s3jJzComh+Abf4g187lUUAvH+H26omrqia2aGg==", + "version": "5.20.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.20.0.tgz", + "integrity": "sha512-/ce7+jQ1PQ6rVXwe+jKEg5hW5ciicHwIQUagZkp6IufBoY3YDgdTTY1azVs0qoRgVmvsNB+rbjLJxDAeHHtwsQ==", "license": "MIT", "dependencies": { "graceful-fs": "^4.2.4", @@ -10127,9 +10493,9 @@ } }, "node_modules/es-iterator-helpers": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.2.tgz", - "integrity": "sha512-BrUQ0cPTB/IwXj23HtwHjS9n7O4h9FX94b4xc5zlTHxeLgTAdzYUDyy6KdExAl9lbN5rtfe44xpjpmj9grxs5w==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.3.0.tgz", + "integrity": "sha512-04cg8iJFDOxWcYlu0GFFWgs7vtaEPCmr5w1nrj9V3z3axu/48HCMwK6VMp45Zh3ZB+xLP1ifbJfrq86+1ypKKQ==", "dev": true, "license": "MIT", "dependencies": { @@ -10148,6 +10514,7 @@ "has-symbols": "^1.1.0", "internal-slot": "^1.1.0", "iterator.prototype": "^1.1.5", + "math-intrinsics": "^1.1.0", "safe-array-concat": "^1.1.3" }, "engines": { @@ -10242,25 +10609,25 @@ } }, "node_modules/eslint": { - "version": "9.39.2", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.2.tgz", - "integrity": "sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==", + "version": "9.39.4", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.4.tgz", + "integrity": "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.21.1", + "@eslint/config-array": "^0.21.2", "@eslint/config-helpers": "^0.4.2", "@eslint/core": "^0.17.0", - "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.39.2", + "@eslint/eslintrc": "^3.3.5", + "@eslint/js": "9.39.4", "@eslint/plugin-kit": "^0.4.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", - "ajv": "^6.12.4", + "ajv": "^6.14.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", @@ -10279,7 +10646,7 @@ "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", + "minimatch": "^3.1.5", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, @@ -10301,26 +10668,10 @@ } } }, - "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==", - "dev": true, - "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-plugin-cypress": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-cypress/-/eslint-plugin-cypress-6.0.0.tgz", - "integrity": "sha512-J96t5BLt8lYSiQ5b4vZ2IpUcsAc3XOw9Esy5sFSvgbx4Od/MIwlbXM8QazrcbEKrKKsynOnyXzZwiAQTtGCEyA==", + "node_modules/eslint-plugin-cypress": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-cypress/-/eslint-plugin-cypress-6.2.0.tgz", + "integrity": "sha512-G/8XT9Si0GaqGRVM0sgnRACCI9mbzsC4CisvaaiuJlQoCseKz6C51kq5fcC/yKmwO4dTsWCdhbgaiQtZFGSONg==", "dev": true, "license": "MIT", "dependencies": { @@ -10330,37 +10681,6 @@ "eslint": ">=9" } }, - "node_modules/eslint-plugin-prettier": { - "version": "5.5.5", - "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.5.5.tgz", - "integrity": "sha512-hscXkbqUZ2sPithAuLm5MXL+Wph+U7wHngPBv9OMWwlP8iaflyxpjTYZkmdgB4/vPIhemRlBEoLrH7UC1n7aUw==", - "dev": true, - "license": "MIT", - "dependencies": { - "prettier-linter-helpers": "^1.0.1", - "synckit": "^0.11.12" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint-plugin-prettier" - }, - "peerDependencies": { - "@types/eslint": ">=8.0.0", - "eslint": ">=8.0.0", - "eslint-config-prettier": ">= 7.0.0 <10.0.0 || >=10.1.0", - "prettier": ">=3.0.0" - }, - "peerDependenciesMeta": { - "@types/eslint": { - "optional": true - }, - "eslint-config-prettier": { - "optional": true - } - } - }, "node_modules/eslint-plugin-react": { "version": "7.37.5", "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", @@ -10414,6 +10734,13 @@ "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" } }, + "node_modules/eslint-plugin-react/node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, "node_modules/eslint-plugin-react/node_modules/brace-expansion": { "version": "1.1.12", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", @@ -10426,9 +10753,9 @@ } }, "node_modules/eslint-plugin-react/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, "license": "ISC", "dependencies": { @@ -10492,6 +10819,13 @@ "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==", + "dev": true, + "license": "MIT" + }, "node_modules/eslint/node_modules/brace-expansion": { "version": "1.1.12", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", @@ -10504,9 +10838,9 @@ } }, "node_modules/eslint/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, "license": "ISC", "dependencies": { @@ -10678,18 +11012,18 @@ } }, "node_modules/expect": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-30.2.0.tgz", - "integrity": "sha512-u/feCi0GPsI+988gU2FLcsHyAHTU0MX1Wg68NhAnN7z/+C5wqG+CY8J53N9ioe8RXgaoz0nBR/TYMf3AycUuPw==", + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-30.3.0.tgz", + "integrity": "sha512-1zQrciTiQfRdo7qJM1uG4navm8DayFa2TgCSRlzUyNkhcJ6XUZF3hjnpkyr3VhAqPH7i/9GkG7Tv5abz6fqz0Q==", "dev": true, "license": "MIT", "dependencies": { - "@jest/expect-utils": "30.2.0", + "@jest/expect-utils": "30.3.0", "@jest/get-type": "30.1.0", - "jest-matcher-utils": "30.2.0", - "jest-message-util": "30.2.0", - "jest-mock": "30.2.0", - "jest-util": "30.2.0" + "jest-matcher-utils": "30.3.0", + "jest-message-util": "30.3.0", + "jest-mock": "30.3.0", + "jest-util": "30.3.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" @@ -10739,13 +11073,6 @@ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "license": "MIT" }, - "node_modules/fast-diff": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", - "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", - "dev": true, - "license": "Apache-2.0" - }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", @@ -10864,18 +11191,6 @@ "node": ">=16.0.0" } }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/find-root": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", @@ -10899,39 +11214,39 @@ } }, "node_modules/firebase": { - "version": "12.9.0", - "resolved": "https://registry.npmjs.org/firebase/-/firebase-12.9.0.tgz", - "integrity": "sha512-CwwTYoqZg6KxygPOaaJqIc4aoLvo0RCRrXoln9GoxLE8QyAwTydBaSLGVlR4WPcuOgN3OEL0tJLT1H4IU/dv7w==", + "version": "12.10.0", + "resolved": "https://registry.npmjs.org/firebase/-/firebase-12.10.0.tgz", + "integrity": "sha512-tAjHnEirksqWpa+NKDUSUMjulOnsTcsPC1X1rQ+gwPtjlhJS572na91CwaBXQJHXharIrfj7sw/okDkXOsphjA==", "license": "Apache-2.0", "dependencies": { - "@firebase/ai": "2.8.0", - "@firebase/analytics": "0.10.19", - "@firebase/analytics-compat": "0.2.25", - "@firebase/app": "0.14.8", - "@firebase/app-check": "0.11.0", - "@firebase/app-check-compat": "0.4.0", - "@firebase/app-compat": "0.5.8", + "@firebase/ai": "2.9.0", + "@firebase/analytics": "0.10.20", + "@firebase/analytics-compat": "0.2.26", + "@firebase/app": "0.14.9", + "@firebase/app-check": "0.11.1", + "@firebase/app-check-compat": "0.4.1", + "@firebase/app-compat": "0.5.9", "@firebase/app-types": "0.9.3", - "@firebase/auth": "1.12.0", - "@firebase/auth-compat": "0.6.2", - "@firebase/data-connect": "0.3.12", - "@firebase/database": "1.1.0", - "@firebase/database-compat": "2.1.0", - "@firebase/firestore": "4.11.0", - "@firebase/firestore-compat": "0.4.5", - "@firebase/functions": "0.13.1", - "@firebase/functions-compat": "0.4.1", - "@firebase/installations": "0.6.19", - "@firebase/installations-compat": "0.2.19", - "@firebase/messaging": "0.12.23", - "@firebase/messaging-compat": "0.2.23", - "@firebase/performance": "0.7.9", - "@firebase/performance-compat": "0.2.22", - "@firebase/remote-config": "0.8.0", - "@firebase/remote-config-compat": "0.2.21", - "@firebase/storage": "0.14.0", - "@firebase/storage-compat": "0.4.0", - "@firebase/util": "1.13.0" + "@firebase/auth": "1.12.1", + "@firebase/auth-compat": "0.6.3", + "@firebase/data-connect": "0.4.0", + "@firebase/database": "1.1.1", + "@firebase/database-compat": "2.1.1", + "@firebase/firestore": "4.12.0", + "@firebase/firestore-compat": "0.4.6", + "@firebase/functions": "0.13.2", + "@firebase/functions-compat": "0.4.2", + "@firebase/installations": "0.6.20", + "@firebase/installations-compat": "0.2.20", + "@firebase/messaging": "0.12.24", + "@firebase/messaging-compat": "0.2.24", + "@firebase/performance": "0.7.10", + "@firebase/performance-compat": "0.2.23", + "@firebase/remote-config": "0.8.1", + "@firebase/remote-config-compat": "0.2.22", + "@firebase/storage": "0.14.1", + "@firebase/storage-compat": "0.4.1", + "@firebase/util": "1.14.0" } }, "node_modules/flat-cache": { @@ -10949,9 +11264,9 @@ } }, "node_modules/flatted": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", - "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.1.tgz", + "integrity": "sha512-IxfVbRFVlV8V/yRaGzk0UVIcsKKHMSfYw66T/u4nTwlWteQePsxe//LjudR1AMX4tZW3WFCh3Zqa/sjlqpbURQ==", "dev": true, "license": "ISC" }, @@ -10996,6 +11311,7 @@ "version": "3.3.1", "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dev": true, "license": "ISC", "dependencies": { "cross-spawn": "^7.0.6", @@ -11012,6 +11328,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, "license": "ISC", "engines": { "node": ">=14" @@ -11272,21 +11589,17 @@ } }, "node_modules/glob": { - "version": "10.5.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", - "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", - "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", - "license": "ISC", + "version": "13.0.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz", + "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==", + "license": "BlueOak-1.0.0", "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" + "minimatch": "^10.2.2", + "minipass": "^7.1.3", + "path-scurry": "^2.0.2" }, - "bin": { - "glob": "dist/esm/bin.mjs" + "engines": { + "node": "18 || 20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -11328,9 +11641,9 @@ } }, "node_modules/globals": { - "version": "17.3.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-17.3.0.tgz", - "integrity": "sha512-yMqGUQVVCkD4tqjOJf3TnrvaaHDMYp4VlUSObbkIiuCPe/ofdMBFIAcBbCSRFWOnos6qRiTVStDwqPLUclaxIw==", + "version": "17.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-17.4.0.tgz", + "integrity": "sha512-hjrNztw/VajQwOLsMNT1cbJiH2muO3OROCHnbehc8eY5JyD2gqz4AcMHPqgaOR59DjgUjYAYLeH699g/eWi2jw==", "dev": true, "license": "MIT", "engines": { @@ -11694,9 +12007,9 @@ "license": "MIT" }, "node_modules/immutable": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.4.tgz", - "integrity": "sha512-p6u1bG3YSnINT5RQmx/yRZBpenIl30kVxkTLDyHLIMk0gict704Q9n+thfDI7lTRm9vXdDYutVzXhzcThxTnXA==", + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.5.tgz", + "integrity": "sha512-t7xcm2siw+hlUM68I+UEOK+z84RzmN59as9DZ7P1l0994DKUWV7UXBMQZVxaoMSRQ+PBZbHCOoBt7a2wxOMt+A==", "devOptional": true, "license": "MIT" }, @@ -11898,18 +12211,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "license": "MIT", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/is-boolean-object": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", @@ -12005,6 +12306,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "devOptional": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -12069,6 +12371,7 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "devOptional": true, "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" @@ -12131,15 +12434,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, "node_modules/is-number-object": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", @@ -12500,6 +12794,7 @@ "version": "3.4.3", "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, "license": "BlueOak-1.0.0", "dependencies": { "@isaacs/cliui": "^8.0.2" @@ -12519,16 +12814,16 @@ "license": "MIT" }, "node_modules/jest": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-30.2.0.tgz", - "integrity": "sha512-F26gjC0yWN8uAA5m5Ss8ZQf5nDHWGlN/xWZIh8S5SRbsEKBovwZhxGd6LJlbZYxBgCYOtreSUyb8hpXyGC5O4A==", + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-30.3.0.tgz", + "integrity": "sha512-AkXIIFcaazymvey2i/+F94XRnM6TsVLZDhBMLsd1Sf/W0wzsvvpjeyUrCZD6HGG4SDYPgDJDBKeiJTBb10WzMg==", "dev": true, "license": "MIT", "dependencies": { - "@jest/core": "30.2.0", - "@jest/types": "30.2.0", + "@jest/core": "30.3.0", + "@jest/types": "30.3.0", "import-local": "^3.2.0", - "jest-cli": "30.2.0" + "jest-cli": "30.3.0" }, "bin": { "jest": "bin/jest.js" @@ -12546,14 +12841,14 @@ } }, "node_modules/jest-changed-files": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-30.2.0.tgz", - "integrity": "sha512-L8lR1ChrRnSdfeOvTrwZMlnWV8G/LLjQ0nG9MBclwWZidA2N5FviRki0Bvh20WRMOX31/JYvzdqTJrk5oBdydQ==", + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-30.3.0.tgz", + "integrity": "sha512-B/7Cny6cV5At6M25EWDgf9S617lHivamL8vl6KEpJqkStauzcG4e+WPfDgMMF+H4FVH4A2PLRyvgDJan4441QA==", "dev": true, "license": "MIT", "dependencies": { "execa": "^5.1.1", - "jest-util": "30.2.0", + "jest-util": "30.3.0", "p-limit": "^3.1.0" }, "engines": { @@ -12608,29 +12903,29 @@ } }, "node_modules/jest-circus": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-30.2.0.tgz", - "integrity": "sha512-Fh0096NC3ZkFx05EP2OXCxJAREVxj1BcW/i6EWqqymcgYKWjyyDpral3fMxVcHXg6oZM7iULer9wGRFvfpl+Tg==", + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-30.3.0.tgz", + "integrity": "sha512-PyXq5szeSfR/4f1lYqCmmQjh0vqDkURUYi9N6whnHjlRz4IUQfMcXkGLeEoiJtxtyPqgUaUUfyQlApXWBSN1RA==", "dev": true, "license": "MIT", "dependencies": { - "@jest/environment": "30.2.0", - "@jest/expect": "30.2.0", - "@jest/test-result": "30.2.0", - "@jest/types": "30.2.0", + "@jest/environment": "30.3.0", + "@jest/expect": "30.3.0", + "@jest/test-result": "30.3.0", + "@jest/types": "30.3.0", "@types/node": "*", "chalk": "^4.1.2", "co": "^4.6.0", "dedent": "^1.6.0", "is-generator-fn": "^2.1.0", - "jest-each": "30.2.0", - "jest-matcher-utils": "30.2.0", - "jest-message-util": "30.2.0", - "jest-runtime": "30.2.0", - "jest-snapshot": "30.2.0", - "jest-util": "30.2.0", + "jest-each": "30.3.0", + "jest-matcher-utils": "30.3.0", + "jest-message-util": "30.3.0", + "jest-runtime": "30.3.0", + "jest-snapshot": "30.3.0", + "jest-util": "30.3.0", "p-limit": "^3.1.0", - "pretty-format": "30.2.0", + "pretty-format": "30.3.0", "pure-rand": "^7.0.0", "slash": "^3.0.0", "stack-utils": "^2.0.6" @@ -12653,9 +12948,9 @@ } }, "node_modules/jest-circus/node_modules/pretty-format": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.2.0.tgz", - "integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==", + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.3.0.tgz", + "integrity": "sha512-oG4T3wCbfeuvljnyAzhBvpN45E8iOTXCU/TD3zXW80HA3dQ4ahdqMkWGiPWZvjpQwlbyHrPTWUAqUzGzv4l1JQ==", "dev": true, "license": "MIT", "dependencies": { @@ -12675,21 +12970,21 @@ "license": "MIT" }, "node_modules/jest-cli": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-30.2.0.tgz", - "integrity": "sha512-Os9ukIvADX/A9sLt6Zse3+nmHtHaE6hqOsjQtNiugFTbKRHYIYtZXNGNK9NChseXy7djFPjndX1tL0sCTlfpAA==", + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-30.3.0.tgz", + "integrity": "sha512-l6Tqx+j1fDXJEW5bqYykDQQ7mQg+9mhWXtnj+tQZrTWYHyHoi6Be8HPumDSA+UiX2/2buEgjA58iJzdj146uCw==", "dev": true, "license": "MIT", "dependencies": { - "@jest/core": "30.2.0", - "@jest/test-result": "30.2.0", - "@jest/types": "30.2.0", + "@jest/core": "30.3.0", + "@jest/test-result": "30.3.0", + "@jest/types": "30.3.0", "chalk": "^4.1.2", "exit-x": "^0.2.2", "import-local": "^3.2.0", - "jest-config": "30.2.0", - "jest-util": "30.2.0", - "jest-validate": "30.2.0", + "jest-config": "30.3.0", + "jest-util": "30.3.0", + "jest-validate": "30.3.0", "yargs": "^17.7.2" }, "bin": { @@ -12708,34 +13003,33 @@ } }, "node_modules/jest-config": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-30.2.0.tgz", - "integrity": "sha512-g4WkyzFQVWHtu6uqGmQR4CQxz/CH3yDSlhzXMWzNjDx843gYjReZnMRanjRCq5XZFuQrGDxgUaiYWE8BRfVckA==", + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-30.3.0.tgz", + "integrity": "sha512-WPMAkMAtNDY9P/oKObtsRG/6KTrhtgPJoBTmk20uDn4Uy6/3EJnnaZJre/FMT1KVRx8cve1r7/FlMIOfRVWL4w==", "dev": true, "license": "MIT", "dependencies": { "@babel/core": "^7.27.4", "@jest/get-type": "30.1.0", "@jest/pattern": "30.0.1", - "@jest/test-sequencer": "30.2.0", - "@jest/types": "30.2.0", - "babel-jest": "30.2.0", + "@jest/test-sequencer": "30.3.0", + "@jest/types": "30.3.0", + "babel-jest": "30.3.0", "chalk": "^4.1.2", "ci-info": "^4.2.0", "deepmerge": "^4.3.1", - "glob": "^10.3.10", + "glob": "^10.5.0", "graceful-fs": "^4.2.11", - "jest-circus": "30.2.0", + "jest-circus": "30.3.0", "jest-docblock": "30.2.0", - "jest-environment-node": "30.2.0", + "jest-environment-node": "30.3.0", "jest-regex-util": "30.0.1", - "jest-resolve": "30.2.0", - "jest-runner": "30.2.0", - "jest-util": "30.2.0", - "jest-validate": "30.2.0", - "micromatch": "^4.0.8", + "jest-resolve": "30.3.0", + "jest-runner": "30.3.0", + "jest-util": "30.3.0", + "jest-validate": "30.3.0", "parse-json": "^5.2.0", - "pretty-format": "30.2.0", + "pretty-format": "30.3.0", "slash": "^3.0.0", "strip-json-comments": "^3.1.1" }, @@ -12772,10 +13066,89 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/jest-config/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==", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-config/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/jest-config/node_modules/glob": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/jest-config/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/jest-config/node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/jest-config/node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/jest-config/node_modules/pretty-format": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.2.0.tgz", - "integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==", + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.3.0.tgz", + "integrity": "sha512-oG4T3wCbfeuvljnyAzhBvpN45E8iOTXCU/TD3zXW80HA3dQ4ahdqMkWGiPWZvjpQwlbyHrPTWUAqUzGzv4l1JQ==", "dev": true, "license": "MIT", "dependencies": { @@ -12795,16 +13168,16 @@ "license": "MIT" }, "node_modules/jest-diff": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-30.2.0.tgz", - "integrity": "sha512-dQHFo3Pt4/NLlG5z4PxZ/3yZTZ1C7s9hveiOj+GCN+uT109NC2QgsoVZsVOAvbJ3RgKkvyLGXZV9+piDpWbm6A==", + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-30.3.0.tgz", + "integrity": "sha512-n3q4PDQjS4LrKxfWB3Z5KNk1XjXtZTBwQp71OP0Jo03Z6V60x++K5L8k6ZrW8MY8pOFylZvHM0zsjS1RqlHJZQ==", "dev": true, "license": "MIT", "dependencies": { - "@jest/diff-sequences": "30.0.1", + "@jest/diff-sequences": "30.3.0", "@jest/get-type": "30.1.0", "chalk": "^4.1.2", - "pretty-format": "30.2.0" + "pretty-format": "30.3.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" @@ -12824,9 +13197,9 @@ } }, "node_modules/jest-diff/node_modules/pretty-format": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.2.0.tgz", - "integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==", + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.3.0.tgz", + "integrity": "sha512-oG4T3wCbfeuvljnyAzhBvpN45E8iOTXCU/TD3zXW80HA3dQ4ahdqMkWGiPWZvjpQwlbyHrPTWUAqUzGzv4l1JQ==", "dev": true, "license": "MIT", "dependencies": { @@ -12859,17 +13232,17 @@ } }, "node_modules/jest-each": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-30.2.0.tgz", - "integrity": "sha512-lpWlJlM7bCUf1mfmuqTA8+j2lNURW9eNafOy99knBM01i5CQeY5UH1vZjgT9071nDJac1M4XsbyI44oNOdhlDQ==", + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-30.3.0.tgz", + "integrity": "sha512-V8eMndg/aZ+3LnCJgSm13IxS5XSBM22QSZc9BtPK8Dek6pm+hfUNfwBdvsB3d342bo1q7wnSkC38zjX259qZNA==", "dev": true, "license": "MIT", "dependencies": { "@jest/get-type": "30.1.0", - "@jest/types": "30.2.0", + "@jest/types": "30.3.0", "chalk": "^4.1.2", - "jest-util": "30.2.0", - "pretty-format": "30.2.0" + "jest-util": "30.3.0", + "pretty-format": "30.3.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" @@ -12889,9 +13262,9 @@ } }, "node_modules/jest-each/node_modules/pretty-format": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.2.0.tgz", - "integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==", + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.3.0.tgz", + "integrity": "sha512-oG4T3wCbfeuvljnyAzhBvpN45E8iOTXCU/TD3zXW80HA3dQ4ahdqMkWGiPWZvjpQwlbyHrPTWUAqUzGzv4l1JQ==", "dev": true, "license": "MIT", "dependencies": { @@ -12911,16 +13284,14 @@ "license": "MIT" }, "node_modules/jest-environment-jsdom": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-30.2.0.tgz", - "integrity": "sha512-zbBTiqr2Vl78pKp/laGBREYzbZx9ZtqPjOK4++lL4BNDhxRnahg51HtoDrk9/VjIy9IthNEWdKVd7H5bqBhiWQ==", + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-30.3.0.tgz", + "integrity": "sha512-RLEOJy6ip1lpw0yqJ8tB3i88FC7VBz7i00Zvl2qF71IdxjS98gC9/0SPWYIBVXHm5hgCYK0PAlSlnHGGy9RoMg==", "dev": true, "license": "MIT", "dependencies": { - "@jest/environment": "30.2.0", - "@jest/environment-jsdom-abstract": "30.2.0", - "@types/jsdom": "^21.1.7", - "@types/node": "*", + "@jest/environment": "30.3.0", + "@jest/environment-jsdom-abstract": "30.3.0", "jsdom": "^26.1.0" }, "engines": { @@ -12936,40 +13307,40 @@ } }, "node_modules/jest-environment-node": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-30.2.0.tgz", - "integrity": "sha512-ElU8v92QJ9UrYsKrxDIKCxu6PfNj4Hdcktcn0JX12zqNdqWHB0N+hwOnnBBXvjLd2vApZtuLUGs1QSY+MsXoNA==", + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-30.3.0.tgz", + "integrity": "sha512-4i6HItw/JSiJVsC5q0hnKIe/hbYfZLVG9YJ/0pU9Hz2n/9qZe3Rhn5s5CUZA5ORZlcdT/vmAXRMyONXJwPrmYQ==", "dev": true, "license": "MIT", "dependencies": { - "@jest/environment": "30.2.0", - "@jest/fake-timers": "30.2.0", - "@jest/types": "30.2.0", + "@jest/environment": "30.3.0", + "@jest/fake-timers": "30.3.0", + "@jest/types": "30.3.0", "@types/node": "*", - "jest-mock": "30.2.0", - "jest-util": "30.2.0", - "jest-validate": "30.2.0" + "jest-mock": "30.3.0", + "jest-util": "30.3.0", + "jest-validate": "30.3.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/jest-haste-map": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-30.2.0.tgz", - "integrity": "sha512-sQA/jCb9kNt+neM0anSj6eZhLZUIhQgwDt7cPGjumgLM4rXsfb9kpnlacmvZz3Q5tb80nS+oG/if+NBKrHC+Xw==", + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-30.3.0.tgz", + "integrity": "sha512-mMi2oqG4KRU0R9QEtscl87JzMXfUhbKaFqOxmjb2CKcbHcUGFrJCBWHmnTiUqi6JcnzoBlO4rWfpdl2k/RfLCA==", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "30.2.0", + "@jest/types": "30.3.0", "@types/node": "*", "anymatch": "^3.1.3", "fb-watchman": "^2.0.2", "graceful-fs": "^4.2.11", "jest-regex-util": "30.0.1", - "jest-util": "30.2.0", - "jest-worker": "30.2.0", - "micromatch": "^4.0.8", + "jest-util": "30.3.0", + "jest-worker": "30.3.0", + "picomatch": "^4.0.3", "walker": "^1.0.8" }, "engines": { @@ -12980,14 +13351,14 @@ } }, "node_modules/jest-leak-detector": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-30.2.0.tgz", - "integrity": "sha512-M6jKAjyzjHG0SrQgwhgZGy9hFazcudwCNovY/9HPIicmNSBuockPSedAP9vlPK6ONFJ1zfyH/M2/YYJxOz5cdQ==", + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-30.3.0.tgz", + "integrity": "sha512-cuKmUUGIjfXZAiGJ7TbEMx0bcqNdPPI6P1V+7aF+m/FUJqFDxkFR4JqkTu8ZOiU5AaX/x0hZ20KaaIPXQzbMGQ==", "dev": true, "license": "MIT", "dependencies": { "@jest/get-type": "30.1.0", - "pretty-format": "30.2.0" + "pretty-format": "30.3.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" @@ -13007,9 +13378,9 @@ } }, "node_modules/jest-leak-detector/node_modules/pretty-format": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.2.0.tgz", - "integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==", + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.3.0.tgz", + "integrity": "sha512-oG4T3wCbfeuvljnyAzhBvpN45E8iOTXCU/TD3zXW80HA3dQ4ahdqMkWGiPWZvjpQwlbyHrPTWUAqUzGzv4l1JQ==", "dev": true, "license": "MIT", "dependencies": { @@ -13029,16 +13400,16 @@ "license": "MIT" }, "node_modules/jest-matcher-utils": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-30.2.0.tgz", - "integrity": "sha512-dQ94Nq4dbzmUWkQ0ANAWS9tBRfqCrn0bV9AMYdOi/MHW726xn7eQmMeRTpX2ViC00bpNaWXq+7o4lIQ3AX13Hg==", + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-30.3.0.tgz", + "integrity": "sha512-HEtc9uFQgaUHkC7nLSlQL3Tph4Pjxt/yiPvkIrrDCt9jhoLIgxaubo1G+CFOnmHYMxHwwdaSN7mkIFs6ZK8OhA==", "dev": true, "license": "MIT", "dependencies": { "@jest/get-type": "30.1.0", "chalk": "^4.1.2", - "jest-diff": "30.2.0", - "pretty-format": "30.2.0" + "jest-diff": "30.3.0", + "pretty-format": "30.3.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" @@ -13058,9 +13429,9 @@ } }, "node_modules/jest-matcher-utils/node_modules/pretty-format": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.2.0.tgz", - "integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==", + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.3.0.tgz", + "integrity": "sha512-oG4T3wCbfeuvljnyAzhBvpN45E8iOTXCU/TD3zXW80HA3dQ4ahdqMkWGiPWZvjpQwlbyHrPTWUAqUzGzv4l1JQ==", "dev": true, "license": "MIT", "dependencies": { @@ -13080,19 +13451,19 @@ "license": "MIT" }, "node_modules/jest-message-util": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-30.2.0.tgz", - "integrity": "sha512-y4DKFLZ2y6DxTWD4cDe07RglV88ZiNEdlRfGtqahfbIjfsw1nMCPx49Uev4IA/hWn3sDKyAnSPwoYSsAEdcimw==", + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-30.3.0.tgz", + "integrity": "sha512-Z/j4Bo+4ySJ+JPJN3b2Qbl9hDq3VrXmnjjGEWD/x0BCXeOXPTV1iZYYzl2X8c1MaCOL+ewMyNBcm88sboE6YWw==", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.27.1", - "@jest/types": "30.2.0", + "@jest/types": "30.3.0", "@types/stack-utils": "^2.0.3", "chalk": "^4.1.2", "graceful-fs": "^4.2.11", - "micromatch": "^4.0.8", - "pretty-format": "30.2.0", + "picomatch": "^4.0.3", + "pretty-format": "30.3.0", "slash": "^3.0.0", "stack-utils": "^2.0.6" }, @@ -13114,9 +13485,9 @@ } }, "node_modules/jest-message-util/node_modules/pretty-format": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.2.0.tgz", - "integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==", + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.3.0.tgz", + "integrity": "sha512-oG4T3wCbfeuvljnyAzhBvpN45E8iOTXCU/TD3zXW80HA3dQ4ahdqMkWGiPWZvjpQwlbyHrPTWUAqUzGzv4l1JQ==", "dev": true, "license": "MIT", "dependencies": { @@ -13136,15 +13507,15 @@ "license": "MIT" }, "node_modules/jest-mock": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-30.2.0.tgz", - "integrity": "sha512-JNNNl2rj4b5ICpmAcq+WbLH83XswjPbjH4T7yvGzfAGCPh1rw+xVNbtk+FnRslvt9lkCcdn9i1oAoKUuFsOxRw==", + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-30.3.0.tgz", + "integrity": "sha512-OTzICK8CpE+t4ndhKrwlIdbM6Pn8j00lvmSmq5ejiO+KxukbLjgOflKWMn3KE34EZdQm5RqTuKj+5RIEniYhog==", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "30.2.0", + "@jest/types": "30.3.0", "@types/node": "*", - "jest-util": "30.2.0" + "jest-util": "30.3.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" @@ -13179,18 +13550,18 @@ } }, "node_modules/jest-resolve": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-30.2.0.tgz", - "integrity": "sha512-TCrHSxPlx3tBY3hWNtRQKbtgLhsXa1WmbJEqBlTBrGafd5fiQFByy2GNCEoGR+Tns8d15GaL9cxEzKOO3GEb2A==", + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-30.3.0.tgz", + "integrity": "sha512-NRtTAHQlpd15F9rUR36jqwelbrDV/dY4vzNte3S2kxCKUJRYNd5/6nTSbYiak1VX5g8IoFF23Uj5TURkUW8O5g==", "dev": true, "license": "MIT", "dependencies": { "chalk": "^4.1.2", "graceful-fs": "^4.2.11", - "jest-haste-map": "30.2.0", + "jest-haste-map": "30.3.0", "jest-pnp-resolver": "^1.2.3", - "jest-util": "30.2.0", - "jest-validate": "30.2.0", + "jest-util": "30.3.0", + "jest-validate": "30.3.0", "slash": "^3.0.0", "unrs-resolver": "^1.7.11" }, @@ -13199,46 +13570,46 @@ } }, "node_modules/jest-resolve-dependencies": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-30.2.0.tgz", - "integrity": "sha512-xTOIGug/0RmIe3mmCqCT95yO0vj6JURrn1TKWlNbhiAefJRWINNPgwVkrVgt/YaerPzY3iItufd80v3lOrFJ2w==", + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-30.3.0.tgz", + "integrity": "sha512-9ev8s3YN6Hsyz9LV75XUwkCVFlwPbaFn6Wp75qnI0wzAINYWY8Fb3+6y59Rwd3QaS3kKXffHXsZMziMavfz/nw==", "dev": true, "license": "MIT", "dependencies": { "jest-regex-util": "30.0.1", - "jest-snapshot": "30.2.0" + "jest-snapshot": "30.3.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/jest-runner": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-30.2.0.tgz", - "integrity": "sha512-PqvZ2B2XEyPEbclp+gV6KO/F1FIFSbIwewRgmROCMBo/aZ6J1w8Qypoj2pEOcg3G2HzLlaP6VUtvwCI8dM3oqQ==", + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-30.3.0.tgz", + "integrity": "sha512-gDv6C9LGKWDPLia9TSzZwf4h3kMQCqyTpq+95PODnTRDO0g9os48XIYYkS6D236vjpBir2fF63YmJFtqkS5Duw==", "dev": true, "license": "MIT", "dependencies": { - "@jest/console": "30.2.0", - "@jest/environment": "30.2.0", - "@jest/test-result": "30.2.0", - "@jest/transform": "30.2.0", - "@jest/types": "30.2.0", + "@jest/console": "30.3.0", + "@jest/environment": "30.3.0", + "@jest/test-result": "30.3.0", + "@jest/transform": "30.3.0", + "@jest/types": "30.3.0", "@types/node": "*", "chalk": "^4.1.2", "emittery": "^0.13.1", "exit-x": "^0.2.2", "graceful-fs": "^4.2.11", "jest-docblock": "30.2.0", - "jest-environment-node": "30.2.0", - "jest-haste-map": "30.2.0", - "jest-leak-detector": "30.2.0", - "jest-message-util": "30.2.0", - "jest-resolve": "30.2.0", - "jest-runtime": "30.2.0", - "jest-util": "30.2.0", - "jest-watcher": "30.2.0", - "jest-worker": "30.2.0", + "jest-environment-node": "30.3.0", + "jest-haste-map": "30.3.0", + "jest-leak-detector": "30.3.0", + "jest-message-util": "30.3.0", + "jest-resolve": "30.3.0", + "jest-runtime": "30.3.0", + "jest-util": "30.3.0", + "jest-watcher": "30.3.0", + "jest-worker": "30.3.0", "p-limit": "^3.1.0", "source-map-support": "0.5.13" }, @@ -13247,32 +13618,32 @@ } }, "node_modules/jest-runtime": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-30.2.0.tgz", - "integrity": "sha512-p1+GVX/PJqTucvsmERPMgCPvQJpFt4hFbM+VN3n8TMo47decMUcJbt+rgzwrEme0MQUA/R+1de2axftTHkKckg==", + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-30.3.0.tgz", + "integrity": "sha512-CgC+hIBJbuh78HEffkhNKcbXAytQViplcl8xupqeIWyKQF50kCQA8J7GeJCkjisC6hpnC9Muf8jV5RdtdFbGng==", "dev": true, "license": "MIT", "dependencies": { - "@jest/environment": "30.2.0", - "@jest/fake-timers": "30.2.0", - "@jest/globals": "30.2.0", + "@jest/environment": "30.3.0", + "@jest/fake-timers": "30.3.0", + "@jest/globals": "30.3.0", "@jest/source-map": "30.0.1", - "@jest/test-result": "30.2.0", - "@jest/transform": "30.2.0", - "@jest/types": "30.2.0", + "@jest/test-result": "30.3.0", + "@jest/transform": "30.3.0", + "@jest/types": "30.3.0", "@types/node": "*", "chalk": "^4.1.2", "cjs-module-lexer": "^2.1.0", "collect-v8-coverage": "^1.0.2", - "glob": "^10.3.10", + "glob": "^10.5.0", "graceful-fs": "^4.2.11", - "jest-haste-map": "30.2.0", - "jest-message-util": "30.2.0", - "jest-mock": "30.2.0", + "jest-haste-map": "30.3.0", + "jest-message-util": "30.3.0", + "jest-mock": "30.3.0", "jest-regex-util": "30.0.1", - "jest-resolve": "30.2.0", - "jest-snapshot": "30.2.0", - "jest-util": "30.2.0", + "jest-resolve": "30.3.0", + "jest-snapshot": "30.3.0", + "jest-util": "30.3.0", "slash": "^3.0.0", "strip-bom": "^4.0.0" }, @@ -13280,10 +13651,89 @@ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, + "node_modules/jest-runtime/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==", + "dev": true, + "license": "MIT" + }, + "node_modules/jest-runtime/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/jest-runtime/node_modules/glob": { + "version": "10.5.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz", + "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/jest-runtime/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/jest-runtime/node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/jest-runtime/node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/jest-snapshot": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-30.2.0.tgz", - "integrity": "sha512-5WEtTy2jXPFypadKNpbNkZ72puZCa6UjSr/7djeecHWOu7iYhSXSnHScT8wBz3Rn8Ena5d5RYRcsyKIeqG1IyA==", + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-30.3.0.tgz", + "integrity": "sha512-f14c7atpb4O2DeNhwcvS810Y63wEn8O1HqK/luJ4F6M4NjvxmAKQwBUWjbExUtMxWJQ0wVgmCKymeJK6NZMnfQ==", "dev": true, "license": "MIT", "dependencies": { @@ -13292,20 +13742,20 @@ "@babel/plugin-syntax-jsx": "^7.27.1", "@babel/plugin-syntax-typescript": "^7.27.1", "@babel/types": "^7.27.3", - "@jest/expect-utils": "30.2.0", + "@jest/expect-utils": "30.3.0", "@jest/get-type": "30.1.0", - "@jest/snapshot-utils": "30.2.0", - "@jest/transform": "30.2.0", - "@jest/types": "30.2.0", + "@jest/snapshot-utils": "30.3.0", + "@jest/transform": "30.3.0", + "@jest/types": "30.3.0", "babel-preset-current-node-syntax": "^1.2.0", "chalk": "^4.1.2", - "expect": "30.2.0", + "expect": "30.3.0", "graceful-fs": "^4.2.11", - "jest-diff": "30.2.0", - "jest-matcher-utils": "30.2.0", - "jest-message-util": "30.2.0", - "jest-util": "30.2.0", - "pretty-format": "30.2.0", + "jest-diff": "30.3.0", + "jest-matcher-utils": "30.3.0", + "jest-message-util": "30.3.0", + "jest-util": "30.3.0", + "pretty-format": "30.3.0", "semver": "^7.7.2", "synckit": "^0.11.8" }, @@ -13327,9 +13777,9 @@ } }, "node_modules/jest-snapshot/node_modules/pretty-format": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.2.0.tgz", - "integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==", + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.3.0.tgz", + "integrity": "sha512-oG4T3wCbfeuvljnyAzhBvpN45E8iOTXCU/TD3zXW80HA3dQ4ahdqMkWGiPWZvjpQwlbyHrPTWUAqUzGzv4l1JQ==", "dev": true, "license": "MIT", "dependencies": { @@ -13369,36 +13819,36 @@ "license": "MIT" }, "node_modules/jest-util": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.2.0.tgz", - "integrity": "sha512-QKNsM0o3Xe6ISQU869e+DhG+4CK/48aHYdJZGlFQVTjnbvgpcKyxpzk29fGiO7i/J8VENZ+d2iGnSsvmuHywlA==", + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.3.0.tgz", + "integrity": "sha512-/jZDa00a3Sz7rdyu55NLrQCIrbyIkbBxareejQI315f/i8HjYN+ZWsDLLpoQSiUIEIyZF/R8fDg3BmB8AtHttg==", "dev": true, "license": "MIT", "dependencies": { - "@jest/types": "30.2.0", + "@jest/types": "30.3.0", "@types/node": "*", "chalk": "^4.1.2", "ci-info": "^4.2.0", "graceful-fs": "^4.2.11", - "picomatch": "^4.0.2" + "picomatch": "^4.0.3" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, "node_modules/jest-validate": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-30.2.0.tgz", - "integrity": "sha512-FBGWi7dP2hpdi8nBoWxSsLvBFewKAg0+uSQwBaof4Y4DPgBabXgpSYC5/lR7VmnIlSpASmCi/ntRWPbv7089Pw==", + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-30.3.0.tgz", + "integrity": "sha512-I/xzC8h5G+SHCb2P2gWkJYrNiTbeL47KvKeW5EzplkyxzBRBw1ssSHlI/jXec0ukH2q7x2zAWQm7015iusg62Q==", "dev": true, "license": "MIT", "dependencies": { "@jest/get-type": "30.1.0", - "@jest/types": "30.2.0", + "@jest/types": "30.3.0", "camelcase": "^6.3.0", "chalk": "^4.1.2", "leven": "^3.1.0", - "pretty-format": "30.2.0" + "pretty-format": "30.3.0" }, "engines": { "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" @@ -13418,9 +13868,9 @@ } }, "node_modules/jest-validate/node_modules/pretty-format": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.2.0.tgz", - "integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==", + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.3.0.tgz", + "integrity": "sha512-oG4T3wCbfeuvljnyAzhBvpN45E8iOTXCU/TD3zXW80HA3dQ4ahdqMkWGiPWZvjpQwlbyHrPTWUAqUzGzv4l1JQ==", "dev": true, "license": "MIT", "dependencies": { @@ -13440,19 +13890,19 @@ "license": "MIT" }, "node_modules/jest-watcher": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-30.2.0.tgz", - "integrity": "sha512-PYxa28dxJ9g777pGm/7PrbnMeA0Jr7osHP9bS7eJy9DuAjMgdGtxgf0uKMyoIsTWAkIbUW5hSDdJ3urmgXBqxg==", + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-30.3.0.tgz", + "integrity": "sha512-PJ1d9ThtTR8aMiBWUdcownq9mDdLXsQzJayTk4kmaBRHKvwNQn+ANveuhEBUyNI2hR1TVhvQ8D5kHubbzBHR/w==", "dev": true, "license": "MIT", "dependencies": { - "@jest/test-result": "30.2.0", - "@jest/types": "30.2.0", + "@jest/test-result": "30.3.0", + "@jest/types": "30.3.0", "@types/node": "*", "ansi-escapes": "^4.3.2", "chalk": "^4.1.2", "emittery": "^0.13.1", - "jest-util": "30.2.0", + "jest-util": "30.3.0", "string-length": "^4.0.2" }, "engines": { @@ -13460,15 +13910,15 @@ } }, "node_modules/jest-worker": { - "version": "30.2.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-30.2.0.tgz", - "integrity": "sha512-0Q4Uk8WF7BUwqXHuAjc23vmopWJw5WH7w2tqBoUOZpOjW/ZnR44GXXd1r82RvnmI2GZge3ivrYXk/BE2+VtW2g==", + "version": "30.3.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-30.3.0.tgz", + "integrity": "sha512-DrCKkaQwHexjRUFTmPzs7sHQe0TSj9nvDALKGdwmK5mW9v7j90BudWirKAJHt3QQ9Dhrg1F7DogPzhChppkJpQ==", "dev": true, "license": "MIT", "dependencies": { "@types/node": "*", "@ungap/structured-clone": "^1.3.0", - "jest-util": "30.2.0", + "jest-util": "30.3.0", "merge-stream": "^2.0.0", "supports-color": "^8.1.1" }, @@ -13713,9 +14163,9 @@ } }, "node_modules/katex": { - "version": "0.16.28", - "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.28.tgz", - "integrity": "sha512-YHzO7721WbmAL6Ov1uzN/l5mY5WWWhJBSW+jq4tkfZfsxmo1hu6frS0EOswvjBUnWE6NtjEs48SFn5CQESRLZg==", + "version": "0.16.38", + "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.38.tgz", + "integrity": "sha512-cjHooZUmIAUmDsHBN+1n8LaZdpmbj03LtYeYPyuYB7OuloiaeaV6N4LcfjcnHVzGWjVQmKrxxTrpDcmSzEZQwQ==", "dev": true, "funding": [ "https://opencollective.com/katex", @@ -13836,24 +14286,6 @@ } } }, - "node_modules/listr2/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, "node_modules/loader-runner": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.1.tgz", @@ -14035,6 +14467,13 @@ "tslib": "^2.0.3" } }, + "node_modules/lower-case/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD" + }, "node_modules/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -14159,53 +14598,30 @@ } }, "node_modules/markdownlint-cli": { - "version": "0.47.0", - "resolved": "https://registry.npmjs.org/markdownlint-cli/-/markdownlint-cli-0.47.0.tgz", - "integrity": "sha512-HOcxeKFAdDoldvoYDofd85vI8LgNWy8vmYpCwnlLV46PJcodmGzD7COSSBlhHwsfT4o9KrAStGodImVBus31Bg==", + "version": "0.48.0", + "resolved": "https://registry.npmjs.org/markdownlint-cli/-/markdownlint-cli-0.48.0.tgz", + "integrity": "sha512-NkZQNu2E0Q5qLEEHwWj674eYISTLD4jMHkBzDobujXd1kv+yCxi8jOaD/rZoQNW1FBBMMGQpuW5So8B51N/e0A==", "dev": true, "license": "MIT", "dependencies": { - "commander": "~14.0.2", + "commander": "~14.0.3", "deep-extend": "~0.6.0", "ignore": "~7.0.5", - "js-yaml": "~4.1.1", - "jsonc-parser": "~3.3.1", - "jsonpointer": "~5.0.1", - "markdown-it": "~14.1.0", - "markdownlint": "~0.40.0", - "minimatch": "~10.1.1", - "run-con": "~1.3.2", - "smol-toml": "~1.5.2", - "tinyglobby": "~0.2.15" - }, - "bin": { - "markdownlint": "markdownlint.js" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/markdownlint-cli/node_modules/balanced-match": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.3.tgz", - "integrity": "sha512-1pHv8LX9CpKut1Zp4EXey7Z8OfH11ONNH6Dhi2WDUt31VVZFXZzKwXcysBgqSumFCmR+0dqjMK5v5JiFHzi0+g==", - "dev": true, - "license": "MIT", - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/markdownlint-cli/node_modules/brace-expansion": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.2.tgz", - "integrity": "sha512-Pdk8c9poy+YhOgVWw1JNN22/HcivgKWwpxKq04M/jTmHyCZn12WPJebZxdjSa5TmBqISrUSgNYU3eRORljfCCw==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^4.0.2" + "js-yaml": "~4.1.1", + "jsonc-parser": "~3.3.1", + "jsonpointer": "~5.0.1", + "markdown-it": "~14.1.1", + "markdownlint": "~0.40.0", + "minimatch": "~10.2.4", + "run-con": "~1.3.2", + "smol-toml": "~1.6.0", + "tinyglobby": "~0.2.15" + }, + "bin": { + "markdownlint": "markdownlint.js" }, "engines": { - "node": "20 || >=22" + "node": ">=20" } }, "node_modules/markdownlint-cli/node_modules/commander": { @@ -14228,22 +14644,6 @@ "node": ">= 4" } }, - "node_modules/markdownlint-cli/node_modules/minimatch": { - "version": "10.1.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.1.3.tgz", - "integrity": "sha512-IF6URNyBX7Z6XfvjpaNy5meRxPZiIf2OqtOoSLs+hLJ9pJAScnM1RjrFcbCaD85y42KcI+oZmKjFIJKYDFjQfg==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "brace-expansion": "^5.0.2" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/markdownlint/node_modules/ansi-regex": { "version": "6.2.2", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", @@ -14275,13 +14675,13 @@ } }, "node_modules/markdownlint/node_modules/strip-ansi": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", - "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz", + "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==", "dev": true, "license": "MIT", "dependencies": { - "ansi-regex": "^6.0.1" + "ansi-regex": "^6.2.2" }, "engines": { "node": ">=12" @@ -14856,33 +15256,6 @@ ], "license": "MIT" }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "dev": true, - "license": "MIT", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/micromatch/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", @@ -14925,15 +15298,15 @@ } }, "node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "license": "ISC", + "version": "10.2.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.4.tgz", + "integrity": "sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg==", + "license": "BlueOak-1.0.0", "dependencies": { - "brace-expansion": "^2.0.1" + "brace-expansion": "^5.0.2" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": "18 || 20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -15081,6 +15454,13 @@ "tslib": "^2.0.3" } }, + "node_modules/no-case/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD" + }, "node_modules/node-addon-api": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", @@ -15157,15 +15537,16 @@ "license": "MIT" }, "node_modules/node-releases": { - "version": "2.0.27", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", - "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", + "version": "2.0.36", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.36.tgz", + "integrity": "sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA==", "license": "MIT" }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -15440,6 +15821,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true, "license": "BlueOak-1.0.0" }, "node_modules/parent-module": { @@ -15558,6 +15940,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -15570,26 +15953,29 @@ "license": "MIT" }, "node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz", + "integrity": "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==", "license": "BlueOak-1.0.0", "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" }, "engines": { - "node": ">=16 || 14 >=14.18" + "node": "18 || 20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "license": "ISC" + "version": "11.2.6", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.6.tgz", + "integrity": "sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ==", + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } }, "node_modules/path-type": { "version": "4.0.0", @@ -15637,9 +16023,9 @@ } }, "node_modules/pg-protocol": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.11.0.tgz", - "integrity": "sha512-pfsxk2M9M3BuGgDOfuy37VNRRX3jmKgMjcvAcWqNDpZSf4cUmv8HSOl5ViRQFsfARFn0KuUQTgLxVMbNq5NW3g==", + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.13.0.tgz", + "integrity": "sha512-zzdvXfS6v89r6v7OcFCHfHlyG/wvry1ALxZo4LqgUoy7W9xhBDMaqOuMiF3qEV45VqsN6rdlcehHrfDtlCPc8w==", "license": "MIT" }, "node_modules/pg-types": { @@ -15868,19 +16254,6 @@ "url": "https://github.com/prettier/prettier?sponsor=1" } }, - "node_modules/prettier-linter-helpers": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.1.tgz", - "integrity": "sha512-SxToR7P8Y2lWmv/kTzVLC1t/GDI2WGjMwNhLLE9qtH8Q13C+aEmuRlzDst4Up4s0Wc8sF2M+J57iB3cMLqftfg==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-diff": "^1.1.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/pretty-bytes": { "version": "5.6.0", "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", @@ -16015,9 +16388,9 @@ } }, "node_modules/pump": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz", - "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.4.tgz", + "integrity": "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==", "dev": true, "license": "MIT", "dependencies": { @@ -16078,15 +16451,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "license": "MIT", - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, "node_modules/react": { "version": "19.2.4", "resolved": "https://registry.npmjs.org/react/-/react-19.2.4.tgz", @@ -16375,9 +16739,9 @@ "license": "MIT" }, "node_modules/rollup": { - "version": "4.57.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.57.1.tgz", - "integrity": "sha512-oQL6lgK3e2QZeQ7gcgIkS2YZPg5slw37hYufJ3edKlfQSGGm8ICoxswK15ntSzF/a8+h7ekRy7k7oWc3BQ7y8A==", + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.59.0.tgz", + "integrity": "sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg==", "license": "MIT", "dependencies": { "@types/estree": "1.0.8" @@ -16390,31 +16754,31 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.57.1", - "@rollup/rollup-android-arm64": "4.57.1", - "@rollup/rollup-darwin-arm64": "4.57.1", - "@rollup/rollup-darwin-x64": "4.57.1", - "@rollup/rollup-freebsd-arm64": "4.57.1", - "@rollup/rollup-freebsd-x64": "4.57.1", - "@rollup/rollup-linux-arm-gnueabihf": "4.57.1", - "@rollup/rollup-linux-arm-musleabihf": "4.57.1", - "@rollup/rollup-linux-arm64-gnu": "4.57.1", - "@rollup/rollup-linux-arm64-musl": "4.57.1", - "@rollup/rollup-linux-loong64-gnu": "4.57.1", - "@rollup/rollup-linux-loong64-musl": "4.57.1", - "@rollup/rollup-linux-ppc64-gnu": "4.57.1", - "@rollup/rollup-linux-ppc64-musl": "4.57.1", - "@rollup/rollup-linux-riscv64-gnu": "4.57.1", - "@rollup/rollup-linux-riscv64-musl": "4.57.1", - "@rollup/rollup-linux-s390x-gnu": "4.57.1", - "@rollup/rollup-linux-x64-gnu": "4.57.1", - "@rollup/rollup-linux-x64-musl": "4.57.1", - "@rollup/rollup-openbsd-x64": "4.57.1", - "@rollup/rollup-openharmony-arm64": "4.57.1", - "@rollup/rollup-win32-arm64-msvc": "4.57.1", - "@rollup/rollup-win32-ia32-msvc": "4.57.1", - "@rollup/rollup-win32-x64-gnu": "4.57.1", - "@rollup/rollup-win32-x64-msvc": "4.57.1", + "@rollup/rollup-android-arm-eabi": "4.59.0", + "@rollup/rollup-android-arm64": "4.59.0", + "@rollup/rollup-darwin-arm64": "4.59.0", + "@rollup/rollup-darwin-x64": "4.59.0", + "@rollup/rollup-freebsd-arm64": "4.59.0", + "@rollup/rollup-freebsd-x64": "4.59.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.59.0", + "@rollup/rollup-linux-arm-musleabihf": "4.59.0", + "@rollup/rollup-linux-arm64-gnu": "4.59.0", + "@rollup/rollup-linux-arm64-musl": "4.59.0", + "@rollup/rollup-linux-loong64-gnu": "4.59.0", + "@rollup/rollup-linux-loong64-musl": "4.59.0", + "@rollup/rollup-linux-ppc64-gnu": "4.59.0", + "@rollup/rollup-linux-ppc64-musl": "4.59.0", + "@rollup/rollup-linux-riscv64-gnu": "4.59.0", + "@rollup/rollup-linux-riscv64-musl": "4.59.0", + "@rollup/rollup-linux-s390x-gnu": "4.59.0", + "@rollup/rollup-linux-x64-gnu": "4.59.0", + "@rollup/rollup-linux-x64-musl": "4.59.0", + "@rollup/rollup-openbsd-x64": "4.59.0", + "@rollup/rollup-openharmony-arm64": "4.59.0", + "@rollup/rollup-win32-arm64-msvc": "4.59.0", + "@rollup/rollup-win32-ia32-msvc": "4.59.0", + "@rollup/rollup-win32-x64-gnu": "4.59.0", + "@rollup/rollup-win32-x64-msvc": "4.59.0", "fsevents": "~2.3.2" } }, @@ -16461,6 +16825,13 @@ "tslib": "^2.1.0" } }, + "node_modules/rxjs/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD" + }, "node_modules/safe-array-concat": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", @@ -16544,14 +16915,14 @@ "license": "MIT" }, "node_modules/sass": { - "version": "1.97.3", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.97.3.tgz", - "integrity": "sha512-fDz1zJpd5GycprAbu4Q2PV/RprsRtKC/0z82z0JLgdytmcq0+ujJbJ/09bPGDxCLkKY3Np5cRAOcWiVkLXJURg==", + "version": "1.98.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.98.0.tgz", + "integrity": "sha512-+4N/u9dZ4PrgzGgPlKnaaRQx64RO0JBKs9sDhQ2pLgN6JQZ25uPQZKQYaBJU48Kd5BxgXoJ4e09Dq7nMcOUW3A==", "devOptional": true, "license": "MIT", "dependencies": { "chokidar": "^4.0.0", - "immutable": "^5.0.2", + "immutable": "^5.1.5", "source-map-js": ">=0.6.2 <2.0.0" }, "bin": { @@ -16564,6 +16935,16 @@ "@parcel/watcher": "^2.4.1" } }, + "node_modules/sax": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.5.0.tgz", + "integrity": "sha512-21IYA3Q5cQf089Z6tgaUTr7lDAyzoTPx5HRtbhsME8Udispad8dC/+sziTNugOEx54ilvatQ9YCzl4KQLPcRHA==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=11.0.0" + } + }, "node_modules/saxes": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", @@ -16645,15 +17026,6 @@ "semver": "bin/semver.js" } }, - "node_modules/serialize-javascript": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", - "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", - "license": "BSD-3-Clause", - "dependencies": { - "randombytes": "^2.1.0" - } - }, "node_modules/set-function-length": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", @@ -16763,6 +17135,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" @@ -16775,6 +17148,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -16902,9 +17276,9 @@ } }, "node_modules/smol-toml": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.5.2.tgz", - "integrity": "sha512-QlaZEqcAH3/RtNyet1IPIYPsEWAaYyXXv1Krsi+1L/QHppjX4Ifm8MQsBISz9vE8cHicIq3clogsheili5vhaQ==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.6.0.tgz", + "integrity": "sha512-4zemZi0HvTnYwLfrpk/CF9LOd9Lt87kAt50GnqhMpyF9U3poDAP2+iukq2bZsO/ufegbYehBkqINbsWxj4l4cw==", "dev": true, "license": "BSD-3-Clause", "engines": { @@ -16925,6 +17299,13 @@ "tslib": "^2.0.3" } }, + "node_modules/snake-case/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD" + }, "node_modules/source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", @@ -17055,9 +17436,9 @@ } }, "node_modules/start-server-and-test": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/start-server-and-test/-/start-server-and-test-2.1.3.tgz", - "integrity": "sha512-k4EcbNjeg0odaDkAMlIeDVDByqX9PIgL4tivgP2tES6Zd8o+4pTq/HgbWCyA3VHIoZopB+wGnNPKYGGSByNriQ==", + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/start-server-and-test/-/start-server-and-test-2.1.5.tgz", + "integrity": "sha512-A/SbXpgXE25ScSkpLLqvGvVZT0ykN6+AzS8tVqMBCTxbJy2Nwuen59opT+afalK5aS+AuQmZs0EsLwjnuDN+/g==", "dev": true, "license": "MIT", "dependencies": { @@ -17068,7 +17449,7 @@ "execa": "5.1.1", "lazy-ass": "1.6.0", "ps-tree": "1.2.0", - "wait-on": "9.0.3" + "wait-on": "9.0.4" }, "bin": { "server-test": "src/bin/start.js", @@ -17183,6 +17564,7 @@ "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", @@ -17308,6 +17690,7 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" @@ -17426,19 +17809,19 @@ "license": "MIT" }, "node_modules/svgo": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.3.2.tgz", - "integrity": "sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.3.3.tgz", + "integrity": "sha512-+wn7I4p7YgJhHs38k2TNjy1vCfPIfLIJWR5MnCStsN8WuuTcBnRKcMHQLMM2ijxGZmDoZwNv8ipl5aTTen62ng==", "dev": true, "license": "MIT", "dependencies": { - "@trysound/sax": "0.2.0", "commander": "^7.2.0", "css-select": "^5.1.0", "css-tree": "^2.3.1", "css-what": "^6.1.0", "csso": "^5.0.5", - "picocolors": "^1.0.0" + "picocolors": "^1.0.0", + "sax": "^1.5.0" }, "bin": { "svgo": "bin/svgo" @@ -17485,9 +17868,9 @@ } }, "node_modules/systeminformation": { - "version": "5.31.1", - "resolved": "https://registry.npmjs.org/systeminformation/-/systeminformation-5.31.1.tgz", - "integrity": "sha512-6pRwxoGeV/roJYpsfcP6tN9mep6pPeCtXbUOCdVa0nme05Brwcwdge/fVNhIZn2wuUitAKZm4IYa7QjnRIa9zA==", + "version": "5.31.4", + "resolved": "https://registry.npmjs.org/systeminformation/-/systeminformation-5.31.4.tgz", + "integrity": "sha512-lZppDyQx91VdS5zJvAyGkmwe+Mq6xY978BDUG2wRkWE+jkmUF5ti8cvOovFQoN5bvSFKCXVkyKEaU5ec3SJiRg==", "dev": true, "license": "MIT", "os": [ @@ -17543,15 +17926,14 @@ } }, "node_modules/terser-webpack-plugin": { - "version": "5.3.16", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.16.tgz", - "integrity": "sha512-h9oBFCWrq78NyWWVcSwZarJkZ01c2AyGrzs1crmHZO3QUg9D61Wu4NPjBy69n7JqylFF5y+CsUZYmYEIZ3mR+Q==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.4.0.tgz", + "integrity": "sha512-Bn5vxm48flOIfkdl5CaD2+1CiUVbonWQ3KQPyP7/EuIl9Gbzq/gQFOzaMFUEgVjB1396tcK0SG8XcNJ/2kDH8g==", "license": "MIT", "dependencies": { "@jridgewell/trace-mapping": "^0.3.25", "jest-worker": "^27.4.5", "schema-utils": "^4.3.0", - "serialize-javascript": "^6.0.2", "terser": "^5.31.1" }, "engines": { @@ -17630,6 +18012,13 @@ "node": ">=8" } }, + "node_modules/test-exclude/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==", + "dev": true, + "license": "MIT" + }, "node_modules/test-exclude/node_modules/brace-expansion": { "version": "1.1.12", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", @@ -17664,9 +18053,9 @@ } }, "node_modules/test-exclude/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, "license": "ISC", "dependencies": { @@ -17747,18 +18136,6 @@ "dev": true, "license": "BSD-3-Clause" }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, "node_modules/tough-cookie": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-5.1.2.tgz", @@ -17875,9 +18252,10 @@ } }, "node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true, "license": "0BSD" }, "node_modules/tunnel-agent": { @@ -18125,78 +18503,6 @@ "node": ">= 10.0.0" } }, - "node_modules/unplugin": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.0.1.tgz", - "integrity": "sha512-aqrHaVBWW1JVKBHmGo33T5TxeL0qWzfvjWokObHA9bYmN7eNDkwOxmLjhioHl9878qDFMAaT51XNroRyuz7WxA==", - "license": "MIT", - "dependencies": { - "acorn": "^8.8.1", - "chokidar": "^3.5.3", - "webpack-sources": "^3.2.3", - "webpack-virtual-modules": "^0.5.0" - } - }, - "node_modules/unplugin/node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "license": "MIT", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/unplugin/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/unplugin/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/unplugin/node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "license": "MIT", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, "node_modules/unrs-resolver": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.11.1.tgz", @@ -18346,15 +18652,15 @@ } }, "node_modules/wait-on": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-9.0.3.tgz", - "integrity": "sha512-13zBnyYvFDW1rBvWiJ6Av3ymAaq8EDQuvxZnPIw3g04UqGi4TyoIJABmfJ6zrvKo9yeFQExNkOk7idQbDJcuKA==", + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-9.0.4.tgz", + "integrity": "sha512-k8qrgfwrPVJXTeFY8tl6BxVHiclK11u72DVKhpybHfUL/K6KM4bdyK9EhIVYGytB5MJe/3lq4Tf0hrjM+pvJZQ==", "dev": true, "license": "MIT", "dependencies": { - "axios": "^1.13.2", - "joi": "^18.0.1", - "lodash": "^4.17.21", + "axios": "^1.13.5", + "joi": "^18.0.2", + "lodash": "^4.17.23", "minimist": "^1.2.8", "rxjs": "^7.8.2" }, @@ -18405,9 +18711,9 @@ } }, "node_modules/webpack": { - "version": "5.105.2", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.105.2.tgz", - "integrity": "sha512-dRXm0a2qcHPUBEzVk8uph0xWSjV/xZxenQQbLwnwP7caQCYpqG1qddwlyEkIDkYn0K8tvmcrZ+bOrzoQ3HxCDw==", + "version": "5.105.4", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.105.4.tgz", + "integrity": "sha512-jTywjboN9aHxFlToqb0K0Zs9SbBoW4zRUlGzI2tYNxVYcEi/IPpn+Xi4ye5jTLvX2YeLuic/IvxNot+Q1jMoOw==", "license": "MIT", "dependencies": { "@types/eslint-scope": "^3.7.7", @@ -18416,11 +18722,11 @@ "@webassemblyjs/ast": "^1.14.1", "@webassemblyjs/wasm-edit": "^1.14.1", "@webassemblyjs/wasm-parser": "^1.14.1", - "acorn": "^8.15.0", + "acorn": "^8.16.0", "acorn-import-phases": "^1.0.3", "browserslist": "^4.28.1", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.19.0", + "enhanced-resolve": "^5.20.0", "es-module-lexer": "^2.0.0", "eslint-scope": "5.1.1", "events": "^3.2.0", @@ -18432,9 +18738,9 @@ "neo-async": "^2.6.2", "schema-utils": "^4.3.3", "tapable": "^2.3.0", - "terser-webpack-plugin": "^5.3.16", + "terser-webpack-plugin": "^5.3.17", "watchpack": "^2.5.1", - "webpack-sources": "^3.3.3" + "webpack-sources": "^3.3.4" }, "bin": { "webpack": "bin/webpack.js" @@ -18461,12 +18767,6 @@ "node": ">=10.13.0" } }, - "node_modules/webpack-virtual-modules": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.5.0.tgz", - "integrity": "sha512-kyDivFZ7ZM0BVOUteVbDFhlRt7Ah/CSPwJdi8hBpkK7QLumUqdLtVfm/PX/hkcnrvr0i77fO5+TjZ94Pe+C9iw==", - "license": "MIT" - }, "node_modules/webpack/node_modules/eslint-scope": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", @@ -18672,17 +18972,17 @@ "license": "MIT" }, "node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "license": "MIT", "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "engines": { - "node": ">=12" + "node": ">=10" }, "funding": { "url": "https://github.com/chalk/wrap-ansi?sponsor=1" @@ -18693,6 +18993,7 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", @@ -18706,68 +19007,6 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", - "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "license": "MIT" - }, - "node_modules/wrap-ansi/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", - "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", diff --git a/package.json b/package.json index 28293b9..b954db4 100644 --- a/package.json +++ b/package.json @@ -34,49 +34,47 @@ "dependencies": { "@emotion/react": "^11.14.0", "@emotion/styled": "^11.14.1", - "@mui/icons-material": "^7.3.8", - "@mui/material": "^7.3.8", + "@mui/icons-material": "^7.3.9", + "@mui/material": "^7.3.9", "@sentry/integrations": "^7.114.0", - "@sentry/nextjs": "^10.39.0", - "@vercel/speed-insights": "^1.3.1", - "firebase": "^12.9.0", + "@sentry/nextjs": "^10.43.0", + "@vercel/speed-insights": "^2.0.0", + "firebase": "^12.10.0", "lodash": "^4.17.23", "next": "^16.1.6", "react": "^19.2.4", "react-dom": "^19.2.4", "sharp": "^0.34.5", - "webpack": "^5.105.2" + "webpack": "^5.105.4" }, "devDependencies": { - "@sentry/core": "^10.39.0", - "@sentry/types": "^10.39.0", + "@sentry/core": "^10.43.0", + "@sentry/types": "^10.43.0", "@svgr/webpack": "^8.1.0", "@testing-library/jest-dom": "^6.9.1", "@testing-library/react": "^16.3.2", "@trivago/prettier-plugin-sort-imports": "^6.0.2", "@types/jest": "^30.0.0", - "@types/lodash": "^4.17.23", - "@types/node": "^25.3.0", + "@types/lodash": "^4.17.24", + "@types/node": "^25.4.0", "@types/react": "^19.2.14", "@types/react-dom": "^19.2.3", - "caniuse-lite": "^1.0.30001770", + "caniuse-lite": "^1.0.30001777", "concurrently": "^9.2.1", - "cypress": "^15.10.0", + "cypress": "^15.11.0", "cypress-axe": "^1.7.0", - "eslint": "^9.39.2", - "eslint-config-prettier": "^10.1.8", - "eslint-plugin-cypress": "^6.0.0", - "eslint-plugin-prettier": "^5.5.5", + "eslint": "^9.39.4", + "eslint-plugin-cypress": "^6.2.0", "eslint-plugin-react": "^7.37.5", "eslint-plugin-react-hooks": "^7.0.1", - "globals": "^17.3.0", - "jest": "^30.2.0", - "jest-environment-jsdom": "^30.2.0", + "globals": "^17.4.0", + "jest": "^30.3.0", + "jest-environment-jsdom": "^30.3.0", "jest-transform-stub": "^2.0.0", - "markdownlint-cli": "^0.47.0", + "markdownlint-cli": "^0.48.0", "prettier": "^3.8.1", - "sass": "^1.97.3", - "start-server-and-test": "^2.1.3", + "sass": "^1.98.0", + "start-server-and-test": "^2.1.5", "ts-jest": "^29.4.6", "typescript": "^5.9.3" }, diff --git a/src/app/page.tsx b/src/app/page.tsx index 18ad5b4..712d427 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -14,12 +14,6 @@ export default function Home() { init(); debounceConsoleLogLogo(); - - if (typeof navigator !== 'undefined' && 'serviceWorker' in navigator) { - navigator.serviceWorker.register('/sw.js').catch(function (err) { - console.error('Service Worker registration failed: ', err); - }); - } }, []); return ( diff --git a/src/components/ServiceWorkerRegister.tsx b/src/components/ServiceWorkerRegister.tsx index 1d18238..72834f8 100644 --- a/src/components/ServiceWorkerRegister.tsx +++ b/src/components/ServiceWorkerRegister.tsx @@ -1,19 +1,59 @@ 'use client'; -import { useEffect } from 'react'; +import { useEffect, useRef } from 'react'; + +/** Maximum number of retry attempts for service worker registration */ +const MAX_SW_RETRIES = 3; +/** Delay in milliseconds between retry attempts (linear backoff) */ +const INITIAL_RETRY_DELAY = 1000; export default function ServiceWorkerRegister() { + /** Ref to track pending retry timeouts for cleanup on unmount */ + const retryTimeoutRef = useRef(null); + useEffect(() => { - if ('serviceWorker' in navigator) { + if (!('serviceWorker' in navigator)) { + return; + } + + /** + * Register the service worker with linear backoff retry logic + * @param retriesLeft Number of retry attempts remaining + */ + const registerWithRetry = (retriesLeft: number = MAX_SW_RETRIES): void => { navigator.serviceWorker .register('/sw.js') .then((registration) => { console.log('Service Worker registered with scope:', registration.scope); }) .catch((error) => { - console.error('Service Worker registration failed:', error); + if (retriesLeft > 0) { + const delayMs = INITIAL_RETRY_DELAY * (MAX_SW_RETRIES - retriesLeft + 1); + console.warn( + `Service Worker registration failed, retrying in ${delayMs}ms (${retriesLeft} attempts remaining):`, + error, + ); + + // Schedule retry with linear backoff + retryTimeoutRef.current = setTimeout(() => { + registerWithRetry(retriesLeft - 1); + }, delayMs); + } else { + // Final failure after all retries + console.error('Service Worker registration failed after all retries:', error); + } }); - } + }; + + // Attempt registration + registerWithRetry(); + + // Cleanup: clear any pending retry timeout on unmount + return () => { + if (retryTimeoutRef.current) { + clearTimeout(retryTimeoutRef.current); + } + }; }, []); return null; diff --git a/src/components/Stars/StarsBackground.tsx b/src/components/Stars/StarsBackground.tsx index 3dce491..116e206 100644 --- a/src/components/Stars/StarsBackground.tsx +++ b/src/components/Stars/StarsBackground.tsx @@ -1,6 +1,7 @@ 'use client'; import { logAnalyticsEvent } from '@configs/firebase'; +import { MAX_STARS } from '@constants/index'; import { Box, Fade } from '@mui/material'; import { isEmpty } from 'lodash'; import { ReactElement, useEffect, useRef, useState } from 'react'; @@ -95,8 +96,12 @@ export default function StarsBackground(): ReactElement | null { /** The array of stars */ const starsArray: ReactElement[] = []; - /** The max number of stars to create */ - const maxStars = typeof window !== 'undefined' && window?.innerWidth ? window?.innerWidth : 400; + + /** Calculate max stars based on screen width but cap at MAX_STARS to prevent performance issues */ + const screenWidth = typeof window !== 'undefined' && window?.innerWidth ? window?.innerWidth : 400; + // Cap at MAX_STARS stars maximum + const maxStars = Math.min(screenWidth, MAX_STARS); + /** The number of stars to create */ const numberOfStars = Math.floor(Math.random() * (maxStars / 2)) + 10; @@ -117,7 +122,7 @@ export default function StarsBackground(): ReactElement | null { starsArray.push( { diff --git a/src/components/cookie-snackbar/CookieSnackbar.test.tsx b/src/components/cookie-snackbar/CookieSnackbar.test.tsx index 6273190..7196413 100644 --- a/src/components/cookie-snackbar/CookieSnackbar.test.tsx +++ b/src/components/cookie-snackbar/CookieSnackbar.test.tsx @@ -1,5 +1,5 @@ import '@testing-library/jest-dom'; -import { act, fireEvent, render, screen, waitFor } from '@testing-library/react'; +import { fireEvent, render, screen, waitFor } from '@testing-library/react'; import CookieSnackbar from './CookieSnackbar'; // Mock document.cookie @@ -52,31 +52,21 @@ describe('CookieSnackbar', () => { }); }); - it('should auto-set cookie after 1 second if not already set', async () => { - jest.useFakeTimers(); + it('should only set cookie when user explicitly clicks close button', async () => { render(); - expect(document.cookie).not.toContain('cookie-consent=true'); - await act(async () => { - jest.advanceTimersByTime(1000); - }); - expect(document.cookie).toContain('cookie-consent=true'); - jest.useRealTimers(); - }); - it('should not double-set cookie on repeated mounts', async () => { - jest.useFakeTimers(); - render(); - await act(async () => { - jest.advanceTimersByTime(1000); - }); - expect(document.cookie.match(/cookie-consent=true/g)?.length || 0).toBe(1); - // Unmount and re-mount - document.cookie = ''; - render(); - await act(async () => { - jest.advanceTimersByTime(1000); + await waitFor(() => { + expect(screen.getByText(/This website uses cookies to enhance the user experience/)).toBeInTheDocument(); }); - expect(document.cookie.match(/cookie-consent=true/g)?.length || 0).toBe(1); - jest.useRealTimers(); + + // Verify cookie is not set initially + expect(document.cookie).not.toContain('cookie-consent=true'); + + // Click the close button + const closeButton = screen.getByRole('button', { name: /close/i }); + fireEvent.click(closeButton); + + // Verify cookie is now set + expect(document.cookie).toContain('cookie-consent=true'); }); }); diff --git a/src/components/cookie-snackbar/CookieSnackbar.tsx b/src/components/cookie-snackbar/CookieSnackbar.tsx index b2758c5..97ee309 100644 --- a/src/components/cookie-snackbar/CookieSnackbar.tsx +++ b/src/components/cookie-snackbar/CookieSnackbar.tsx @@ -2,6 +2,7 @@ import CloseRoundedIcon from '@mui/icons-material/CloseRounded'; import { Alert, IconButton, Snackbar, Stack } from '@mui/material'; +import { hasCookieConsent, setCookieConsent } from '@util/cookieConsent'; import { useEffect, useState } from 'react'; /** Renders the cookie snackbar. */ @@ -12,21 +13,16 @@ export default function CookieSnackbar() { const [open, setOpen] = useState(false); const handleClose = () => { - document.cookie = 'cookie-consent=true; max-age=31536000; path=/'; + setCookieConsent(); setOpen(false); }; useEffect(() => { setMounted(true); - // If the cookie 'cookie-consent' is set to true, don't show the snackbar - if (document.cookie.includes('cookie-consent=true')) { - setOpen(false); - } else { + // Only show snackbar if user hasn't already accepted cookies + if (!hasCookieConsent()) { setOpen(true); - setTimeout(() => { - document.cookie = 'cookie-consent=true; max-age=31536000; path=/'; - }, 1000); } }, []); diff --git a/src/configs/firebase.test.ts b/src/configs/firebase.test.ts index f947f61..c3926b0 100644 --- a/src/configs/firebase.test.ts +++ b/src/configs/firebase.test.ts @@ -3,8 +3,12 @@ const mockInitializeApp = jest.fn(); const mockGetAnalytics = jest.fn(); const mockLogEvent = jest.fn(); const mockGetPerformance = jest.fn(); +const mockGetApps = jest.fn(); +const mockGetApp = jest.fn(); jest.mock('firebase/app', () => ({ initializeApp: mockInitializeApp, + getApps: mockGetApps, + getApp: mockGetApp, })); jest.mock('firebase/analytics', () => ({ getAnalytics: mockGetAnalytics, @@ -20,6 +24,8 @@ describe('firebase config', () => { const mockApp = {}; beforeEach(() => { jest.clearAllMocks(); + mockGetApps.mockReturnValue([]); // Return empty array by default (not initialized) + mockGetApp.mockReturnValue(mockApp); mockInitializeApp.mockReturnValue(mockApp); mockGetAnalytics.mockReturnValue('analytics'); mockGetPerformance.mockReturnValue('perf'); @@ -34,6 +40,7 @@ describe('firebase config', () => { it('init initializes firebase, analytics, and performance', () => { init(); + expect(mockGetApps).toHaveBeenCalled(); expect(mockInitializeApp).toHaveBeenCalled(); expect(mockGetAnalytics).toHaveBeenCalledWith(mockApp); expect(mockGetPerformance).toHaveBeenCalledWith(mockApp); diff --git a/src/configs/firebase.ts b/src/configs/firebase.ts index c1384e8..f791249 100644 --- a/src/configs/firebase.ts +++ b/src/configs/firebase.ts @@ -1,7 +1,6 @@ -/* eslint-disable no-unused-vars, @typescript-eslint/no-unused-vars */ // Import the functions you need from the SDKs you need import { Analytics, getAnalytics, logEvent } from 'firebase/analytics'; -import { initializeApp } from 'firebase/app'; +import { getApp, getApps, initializeApp } from 'firebase/app'; import { getPerformance } from 'firebase/performance'; // https://firebase.google.com/docs/web/setup#available-libraries @@ -31,16 +30,28 @@ export function logAnalyticsEvent(eventName: string, eventParams?: object): void } } -/** Initializes Firebase app, analytics, and performance monitoring. */ +/** + * Initializes Firebase app, analytics, and performance monitoring. + * Must be called once on the client side before logAnalyticsEvent will function. + * Typically called in app initialization (e.g., in a page useEffect or client component). + * Safe to call multiple times; only the first call will initialize the analytics instance. + */ export function init(): void { - // Initialize Firebase - const app = initializeApp(firebaseConfig); + // Only initialize if Firebase hasn't been initialized yet + if (getApps().length === 0) { + // Initialize Firebase + const app = initializeApp(firebaseConfig); - if (app) { - // Initialize Performance Monitoring and get a reference to the service - analytics = getAnalytics(app); + if (app) { + // Initialize Analytics and get a reference to the service + analytics = getAnalytics(app); - // Initialize Performance Monitoring and get a reference to the service - const perf = getPerformance(app); + // Initialize Performance Monitoring + getPerformance(app); + } + } else if (!analytics) { + // Firebase is initialized but analytics hasn't been set up yet + const app = getApp(); + analytics = getAnalytics(app); } } diff --git a/src/constants/index.ts b/src/constants/index.ts index 3ba2331..6316a09 100644 --- a/src/constants/index.ts +++ b/src/constants/index.ts @@ -37,3 +37,6 @@ export const ANIMATIONS = { SNEEZE_STAGE_2: 300, SNEEZE_STAGE_3: 1000, } as const; + +/** The maximum number of stars to render in the background */ +export const MAX_STARS = 600; diff --git a/src/helpers/aaaahhhh.test.ts b/src/helpers/aaaahhhh.test.ts index 864bc67..88ddd7d 100644 --- a/src/helpers/aaaahhhh.test.ts +++ b/src/helpers/aaaahhhh.test.ts @@ -38,7 +38,7 @@ describe('aaaahhhh', () => { item: (i: number) => arr[i] ?? null, namedItem: () => null, [Symbol.iterator]: function* () { - for (let el of arr) yield el; + for (const el of arr) yield el; }, }, arr, diff --git a/src/helpers/aaaahhhh.ts b/src/helpers/aaaahhhh.ts index aed45d6..9de8e93 100644 --- a/src/helpers/aaaahhhh.ts +++ b/src/helpers/aaaahhhh.ts @@ -1,6 +1,6 @@ export const aaaahhhhImage = '/images/aaaahhhh/aaaahhhh.webp'; -/** imageAAAAHHHH */ +/** Replaces all images and background images on the page with the AAAAHHHH image. */ export function imageAAAAHHHH(): void { const docs = document.querySelectorAll('div[style]'); for (const doc of docs) { @@ -20,7 +20,7 @@ export function imageAAAAHHHH(): void { } } - // Change background image of id='sky' to aaaaahhhh image + // Set the sky background element to the aaaahhhh image const skyElement = document.getElementById('sky'); if (skyElement) { skyElement.style.backgroundImage = `url(${aaaahhhhImage})`; @@ -30,18 +30,18 @@ export function imageAAAAHHHH(): void { } /** - * convertAAAAHH - * @param {String} aaaahhhh AAAAHHHH STRING - * @returns {String} aaaahhhh AAAAHHHH STRING + * Converts string characters to A or H based on position. + * First half of characters become 'A', second half become 'H'. + * Preserves spaces and capitalization. + * @param aaaaahhhh - The input string to transform + * @returns Transformed string with A/H characters */ export function convertAAAAHH(aaaaahhhh: string): string { let newAAAAHHHH = ''; - /** AAAAHHHHlength */ const AAAAHHHHlength: number = aaaaahhhh.length; - - /** splitAAAAHHHH */ const splitAAAAHHHH = aaaaahhhh.split(''); + for (let i = 0; i < AAAAHHHHlength; i += 1) { if (splitAAAAHHHH[i] === ' ') { newAAAAHHHH += ' '; @@ -66,7 +66,7 @@ export function convertAAAAHH(aaaaahhhh: string): string { return newAAAAHHHH; } -/** textAAAAHHHH */ +/** Transforms all text elements on the page to AAAAHHHH format. */ export function textAAAAHHHH(): void { const docs = [ ...document.getElementsByTagName('span'), @@ -77,12 +77,12 @@ export function textAAAAHHHH(): void { ...document.getElementsByTagName('button'), ]; - for (const i in docs) { + for (let i = 0; i < docs.length; i += 1) { if (docs[i]?.childNodes) { - for (const c in docs[i].childNodes) { + for (let c = 0; c < docs[i].childNodes.length; c += 1) { if (docs[i].childNodes[c].nodeName === '#text') { /** AAAAHHHH OLD TEXT */ - const text = docs?.[i]?.childNodes?.[c]?.textContent; + const text = docs[i].childNodes[c].textContent; if (text) { /** AAAAHHHH NEW TEXT */ @@ -105,7 +105,7 @@ export function textAAAAHHHH(): void { } } -/** aaaahhhh */ +/** Transforms entire page into AAAAHHHH format by calling image and text transformations. */ export function aaaahhhh(): void { imageAAAAHHHH(); textAAAAHHHH(); diff --git a/src/images/icons.tsx b/src/images/icons.tsx index 2367664..587a992 100644 --- a/src/images/icons.tsx +++ b/src/images/icons.tsx @@ -1,4 +1,5 @@ import SvgIcon, { SvgIconProps } from '@mui/material/SvgIcon'; +import { ComponentType, ReactElement } from 'react'; import BAR from './icons/bar.svg'; import BlueSky from './icons/bluesky.svg'; import GitHub from './icons/github.svg'; @@ -22,36 +23,37 @@ import VSCode from './icons/vscode.svg'; import X from './icons/x.svg'; /** - * Generates a JSX element for the given SVG icon. - * @returns The JSX element representing the SVG icon. + * Wraps an SVG icon component with Material-UI SvgIcon for consistent styling and sizing. + * @param icon The SVG component to wrap + * @param props MUI SvgIcon props (color, fontSize, etc.) + * @returns JSX element rendering the wrapped SVG icon */ -function generateIconJSX( - /** The SVG icon to generate JSX for. */ - icon: any, - /** The properties to apply to the SVG icon. */ - props: any, -) { +function generateIconJSX(icon: ComponentType, props: SvgIconProps): ReactElement { return ; } -export const BarIcon = (props: SvgIconProps) => generateIconJSX(BAR, props); -export const BlueSkyIcon = (props: SvgIconProps) => generateIconJSX(BlueSky, props); -export const GitHubIcon = (props: SvgIconProps) => generateIconJSX(GitHub, props); -export const GolangGopherIcon = (props: SvgIconProps) => generateIconJSX(GolangGopher, props); -export const GooglePlayStoreIcon = (props: SvgIconProps) => generateIconJSX(GooglePlayStore, props); -export const ImpactDepthIcon = (props: SvgIconProps) => generateIconJSX(ImpactDepth, props); -export const InstagramIcon = (props: SvgIconProps) => generateIconJSX(Instagram, props); -export const iOSIcon = (props: SvgIconProps) => generateIconJSX(iOS, props); -export const LinkedInIcon = (props: SvgIconProps) => generateIconJSX(LinkedIn, props); -export const MetaIcon = (props: SvgIconProps) => generateIconJSX(Meta, props); -export const MPXIcon = (props: SvgIconProps) => generateIconJSX(MPX, props); -export const OpenVSXIcon = (props: SvgIconProps) => generateIconJSX(OpenVSX, props); -export const PublishIcon = (props: SvgIconProps) => generateIconJSX(Publish, props); -export const SciGradeIcon = (props: SvgIconProps) => generateIconJSX(SciGrade, props); -export const SmallDevTalkIcon = (props: SvgIconProps) => generateIconJSX(SmallDevTalk, props); -export const ThreadsIcon = (props: SvgIconProps) => generateIconJSX(threads, props); -export const TwitchIcon = (props: SvgIconProps) => generateIconJSX(Twitch, props); -export const UofTIcon = (props: SvgIconProps) => generateIconJSX(UofT, props); -export const VerilyIcon = (props: SvgIconProps) => generateIconJSX(Verily, props); -export const VSCodeIcon = (props: SvgIconProps) => generateIconJSX(VSCode, props); -export const XIcon = (props: SvgIconProps) => generateIconJSX(X, props); +export const BarIcon = (props: SvgIconProps): ReactElement => generateIconJSX(BAR as ComponentType, props); +export const BlueSkyIcon = (props: SvgIconProps): ReactElement => generateIconJSX(BlueSky as ComponentType, props); +export const GitHubIcon = (props: SvgIconProps): ReactElement => generateIconJSX(GitHub as ComponentType, props); +export const GolangGopherIcon = (props: SvgIconProps): ReactElement => + generateIconJSX(GolangGopher as ComponentType, props); +export const GooglePlayStoreIcon = (props: SvgIconProps): ReactElement => + generateIconJSX(GooglePlayStore as ComponentType, props); +export const ImpactDepthIcon = (props: SvgIconProps): ReactElement => + generateIconJSX(ImpactDepth as ComponentType, props); +export const InstagramIcon = (props: SvgIconProps): ReactElement => generateIconJSX(Instagram as ComponentType, props); +export const iOSIcon = (props: SvgIconProps): ReactElement => generateIconJSX(iOS as ComponentType, props); +export const LinkedInIcon = (props: SvgIconProps): ReactElement => generateIconJSX(LinkedIn as ComponentType, props); +export const MetaIcon = (props: SvgIconProps): ReactElement => generateIconJSX(Meta as ComponentType, props); +export const MPXIcon = (props: SvgIconProps): ReactElement => generateIconJSX(MPX as ComponentType, props); +export const OpenVSXIcon = (props: SvgIconProps): ReactElement => generateIconJSX(OpenVSX as ComponentType, props); +export const PublishIcon = (props: SvgIconProps): ReactElement => generateIconJSX(Publish as ComponentType, props); +export const SciGradeIcon = (props: SvgIconProps): ReactElement => generateIconJSX(SciGrade as ComponentType, props); +export const SmallDevTalkIcon = (props: SvgIconProps): ReactElement => + generateIconJSX(SmallDevTalk as ComponentType, props); +export const ThreadsIcon = (props: SvgIconProps): ReactElement => generateIconJSX(threads as ComponentType, props); +export const TwitchIcon = (props: SvgIconProps): ReactElement => generateIconJSX(Twitch as ComponentType, props); +export const UofTIcon = (props: SvgIconProps): ReactElement => generateIconJSX(UofT as ComponentType, props); +export const VerilyIcon = (props: SvgIconProps): ReactElement => generateIconJSX(Verily as ComponentType, props); +export const VSCodeIcon = (props: SvgIconProps): ReactElement => generateIconJSX(VSCode as ComponentType, props); +export const XIcon = (props: SvgIconProps): ReactElement => generateIconJSX(X as ComponentType, props); diff --git a/src/util/cookieConsent.ts b/src/util/cookieConsent.ts new file mode 100644 index 0000000..690d448 --- /dev/null +++ b/src/util/cookieConsent.ts @@ -0,0 +1,47 @@ +/** + * Utility functions for GDPR-compliant cookie consent management + */ + +const COOKIE_NAME = 'cookie-consent'; +const COOKIE_VALUE = 'true'; + +/** + * Generate cookie options string based on current environment + * @returns Cookie attributes string (e.g., "max-age=31536000; path=/; SameSite=Strict; Secure") + */ +function getCookieOptions(): string { + // Only include Secure flag on HTTPS connections (not on localhost) + const secure = typeof window !== 'undefined' && window.location.protocol === 'https:' ? '; Secure' : ''; + + return `max-age=31536000; path=/; SameSite=Strict${secure}`; +} + +/** + * Set the cookie consent cookie to indicate user has accepted + * Only call this after explicit user action (button click, etc.) + */ +export function setCookieConsent(): void { + document.cookie = `${COOKIE_NAME}=${COOKIE_VALUE}; ${getCookieOptions()}`; +} + +/** + * Check if the user has already accepted cookies + * Parses document.cookie to avoid false positives from substring matching + * @returns true if user has accepted cookies, false otherwise + */ +export function hasCookieConsent(): boolean { + if (typeof document === 'undefined') { + return false; + } + + // Parse cookies into key-value pairs to avoid substring false positives + const cookies = document.cookie.split(';'); + for (const cookie of cookies) { + const [key, value] = cookie.trim().split('='); + if (key === COOKIE_NAME && value === COOKIE_VALUE) { + return true; + } + } + + return false; +} diff --git a/src/util/isNetworkFast.ts b/src/util/isNetworkFast.ts index a6283ec..004b993 100644 --- a/src/util/isNetworkFast.ts +++ b/src/util/isNetworkFast.ts @@ -15,7 +15,19 @@ interface NavigatorWithConnection extends Navigator { /** * Checks if the current network connection is fast. * - * @returns {boolean} True if the network is fast, false otherwise. + * Uses the Network Information API to determine connection quality based on: + * - Data saver mode (saveData flag indicates user preference for reduced data usage) + * - Effective connection type (2g, 3g, 4g, slow-2g categorization) + * - Downlink speed in Mbps (>= 1.5 Mbps considered fast for video/media) + * - Round-trip time in milliseconds (<= 100ms considered fast for interactivity) + * + * Threshold rationale: + * - 1.5 Mbps downlink: Sufficient for video playback and heavy asset loading + * - 100ms RTT: Acceptable for interactive features and real-time responsiveness + * - Slow network types (2g, slow-2g, 3g): Limited performance for heavy assets + * + * @returns {boolean} True if the network connection is fast, false if slow or saving data. + * Returns true if Network Information API is unavailable (optimistic assumption). */ export function isNetworkFast(): boolean { // Check if the connection API is available in the navigator