diff --git a/.github/workflows/autofix.yml b/.github/workflows/autofix.yml index 5413f83c27..d3f71c4647 100644 --- a/.github/workflows/autofix.yml +++ b/.github/workflows/autofix.yml @@ -16,14 +16,14 @@ jobs: - name: Check Docker Compose inputs id: docker-compose-changes - uses: tj-actions/changed-files@v46 + uses: tj-actions/changed-files@v47 with: files: | docker/generate_docker_compose docker/.env.example docker/docker-compose-template.yaml docker/docker-compose.yaml - - uses: actions/setup-python@v5 + - uses: actions/setup-python@v6 with: python-version: "3.11" diff --git a/.github/workflows/build-push.yml b/.github/workflows/build-push.yml index bbf89236de..704d896192 100644 --- a/.github/workflows/build-push.yml +++ b/.github/workflows/build-push.yml @@ -112,7 +112,7 @@ jobs: context: "web" steps: - name: Download digests - uses: actions/download-artifact@v4 + uses: actions/download-artifact@v7 with: path: /tmp/digests pattern: digests-${{ matrix.context }}-* diff --git a/.github/workflows/deploy-agent-dev.yml b/.github/workflows/deploy-agent-dev.yml index dff48b5510..dd759f7ba5 100644 --- a/.github/workflows/deploy-agent-dev.yml +++ b/.github/workflows/deploy-agent-dev.yml @@ -19,7 +19,7 @@ jobs: github.event.workflow_run.head_branch == 'deploy/agent-dev' steps: - name: Deploy to server - uses: appleboy/ssh-action@v0.1.8 + uses: appleboy/ssh-action@v1 with: host: ${{ secrets.AGENT_DEV_SSH_HOST }} username: ${{ secrets.SSH_USER }} diff --git a/.github/workflows/deploy-dev.yml b/.github/workflows/deploy-dev.yml index cd1c86e668..38fa0b9a7f 100644 --- a/.github/workflows/deploy-dev.yml +++ b/.github/workflows/deploy-dev.yml @@ -16,7 +16,7 @@ jobs: github.event.workflow_run.head_branch == 'deploy/dev' steps: - name: Deploy to server - uses: appleboy/ssh-action@v0.1.8 + uses: appleboy/ssh-action@v1 with: host: ${{ secrets.SSH_HOST }} username: ${{ secrets.SSH_USER }} diff --git a/.github/workflows/deploy-hitl.yml b/.github/workflows/deploy-hitl.yml index 8144ba4f08..7d5f0a22e7 100644 --- a/.github/workflows/deploy-hitl.yml +++ b/.github/workflows/deploy-hitl.yml @@ -20,7 +20,7 @@ jobs: ) steps: - name: Deploy to server - uses: appleboy/ssh-action@v0.1.8 + uses: appleboy/ssh-action@v1 with: host: ${{ secrets.HITL_SSH_HOST }} username: ${{ secrets.SSH_USER }} diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml index 1870b1f670..b6df1d7e93 100644 --- a/.github/workflows/stale.yml +++ b/.github/workflows/stale.yml @@ -18,7 +18,7 @@ jobs: pull-requests: write steps: - - uses: actions/stale@v5 + - uses: actions/stale@v10 with: days-before-issue-stale: 15 days-before-issue-close: 3 diff --git a/.github/workflows/style.yml b/.github/workflows/style.yml index 86b66bf9df..debf4ba648 100644 --- a/.github/workflows/style.yml +++ b/.github/workflows/style.yml @@ -106,8 +106,9 @@ jobs: if: steps.changed-files.outputs.any_changed == 'true' working-directory: ./web run: | - pnpm run lint:report - continue-on-error: true + pnpm run lint:ci + # pnpm run lint:report + # continue-on-error: true # - name: Annotate Code # if: steps.changed-files.outputs.any_changed == 'true' && github.event_name == 'pull_request' @@ -126,11 +127,6 @@ jobs: working-directory: ./web run: pnpm run knip - - name: Web build check - if: steps.changed-files.outputs.any_changed == 'true' - working-directory: ./web - run: pnpm run build - superlinter: name: SuperLinter runs-on: ubuntu-latest diff --git a/.github/workflows/trigger-i18n-sync.yml b/.github/workflows/trigger-i18n-sync.yml index de093c9235..66a29453b4 100644 --- a/.github/workflows/trigger-i18n-sync.yml +++ b/.github/workflows/trigger-i18n-sync.yml @@ -21,7 +21,7 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@v6 with: fetch-depth: 0 diff --git a/.github/workflows/web-tests.yml b/.github/workflows/web-tests.yml index 65c958a453..191ce56aaa 100644 --- a/.github/workflows/web-tests.yml +++ b/.github/workflows/web-tests.yml @@ -366,3 +366,48 @@ jobs: path: web/coverage retention-days: 30 if-no-files-found: error + + web-build: + name: Web Build + runs-on: ubuntu-latest + defaults: + run: + working-directory: ./web + + steps: + - name: Checkout code + uses: actions/checkout@v6 + with: + persist-credentials: false + + - name: Check changed files + id: changed-files + uses: tj-actions/changed-files@v47 + with: + files: | + web/** + .github/workflows/web-tests.yml + + - name: Install pnpm + uses: pnpm/action-setup@v4 + with: + package_json_file: web/package.json + run_install: false + + - name: Setup NodeJS + uses: actions/setup-node@v6 + if: steps.changed-files.outputs.any_changed == 'true' + with: + node-version: 24 + cache: pnpm + cache-dependency-path: ./web/pnpm-lock.yaml + + - name: Web dependencies + if: steps.changed-files.outputs.any_changed == 'true' + working-directory: ./web + run: pnpm install --frozen-lockfile + + - name: Web build check + if: steps.changed-files.outputs.any_changed == 'true' + working-directory: ./web + run: pnpm run build diff --git a/AGENTS.md b/AGENTS.md index 782861ad36..deab7c8629 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -12,12 +12,8 @@ The codebase is split into: ## Backend Workflow +- Read `api/AGENTS.md` for details - Run backend CLI commands through `uv run --project api `. - -- Before submission, all backend modifications must pass local checks: `make lint`, `make type-check`, and `uv run --project api --dev dev/pytest/pytest_unit_tests.sh`. - -- Use Makefile targets for linting and formatting; `make lint` and `make type-check` cover the required checks. - - Integration tests are CI-only and are not expected to run in the local environment. ## Frontend Workflow diff --git a/Makefile b/Makefile index 60c32948b9..e92a7b1314 100644 --- a/Makefile +++ b/Makefile @@ -61,7 +61,8 @@ check: lint: @echo "🔧 Running ruff format, check with fixes, import linter, and dotenv-linter..." - @uv run --project api --dev sh -c 'ruff format ./api && ruff check --fix ./api' + @uv run --project api --dev ruff format ./api + @uv run --project api --dev ruff check --fix ./api @uv run --directory api --dev lint-imports @uv run --project api --dev dotenv-linter ./api/.env.example ./web/.env.example @echo "✅ Linting complete" @@ -73,7 +74,12 @@ type-check: test: @echo "🧪 Running backend unit tests..." - @uv run --project api --dev dev/pytest/pytest_unit_tests.sh + @if [ -n "$(TARGET_TESTS)" ]; then \ + echo "Target: $(TARGET_TESTS)"; \ + uv run --project api --dev pytest $(TARGET_TESTS); \ + else \ + uv run --project api --dev dev/pytest/pytest_unit_tests.sh; \ + fi @echo "✅ Tests complete" # Build Docker images @@ -125,7 +131,7 @@ help: @echo " make check - Check code with ruff" @echo " make lint - Format, fix, and lint code (ruff, imports, dotenv)" @echo " make type-check - Run type checking with basedpyright" - @echo " make test - Run backend unit tests" + @echo " make test - Run backend unit tests (or TARGET_TESTS=./api/tests/)" @echo "" @echo "Docker Build Targets:" @echo " make build-web - Build web Docker image" diff --git a/agent-notes/.gitkeep b/agent-notes/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/api/AGENTS.md b/api/AGENTS.md index 17398ec4b8..6ce419828b 100644 --- a/api/AGENTS.md +++ b/api/AGENTS.md @@ -1,62 +1,236 @@ -# Agent Skill Index +# API Agent Guide + +## Agent Notes (must-check) + +Before you start work on any backend file under `api/`, you MUST check whether a related note exists under: + +- `agent-notes/.md` + +Rules: + +- **Path mapping**: for a target file `/.py`, the note must be `agent-notes//.py.md` (same folder structure, same filename, plus `.md`). +- **Before working**: + - If the note exists, read it first and follow any constraints/decisions recorded there. + - If the note conflicts with the current code, or references an "origin" file/path that has been deleted, renamed, or migrated, treat the **code as the single source of truth** and update the note to match reality. + - If the note does not exist, create it with a short architecture/intent summary and any relevant invariants/edge cases. +- **During working**: + - Keep the note in sync as you discover constraints, make decisions, or change approach. + - If you move/rename a file, migrate its note to the new mapped path (and fix any outdated references inside the note). + - Record non-obvious edge cases, trade-offs, and the test/verification plan as you go (not just at the end). + - Keep notes **coherent**: integrate new findings into the relevant sections and rewrite for clarity; avoid append-only “recent fix” / changelog-style additions unless the note is explicitly intended to be a changelog. +- **When finishing work**: + - Update the related note(s) to reflect what changed, why, and any new edge cases/tests. + - If a file is deleted, remove or clearly deprecate the corresponding note so it cannot be mistaken as current guidance. + - Keep notes concise and accurate; they are meant to prevent repeated rediscovery. + +## Skill Index Start with the section that best matches your need. Each entry lists the problems it solves plus key files/concepts so you know what to expect before opening it. -______________________________________________________________________ +### Platform Foundations -## Platform Foundations - -- **[Infrastructure Overview](agent_skills/infra.md)**\ - When to read this: +#### [Infrastructure Overview](agent_skills/infra.md) +- **When to read this** - You need to understand where a feature belongs in the architecture. - You’re wiring storage, Redis, vector stores, or OTEL. - - You’re about to add CLI commands or async jobs.\ - What it covers: configuration stack (`configs/app_config.py`, remote settings), storage entry points (`extensions/ext_storage.py`, `core/file/file_manager.py`), Redis conventions (`extensions/ext_redis.py`), plugin runtime topology, vector-store factory (`core/rag/datasource/vdb/*`), observability hooks, SSRF proxy usage, and core CLI commands. + - You’re about to add CLI commands or async jobs. +- **What it covers** + - Configuration stack (`configs/app_config.py`, remote settings) + - Storage entry points (`extensions/ext_storage.py`, `core/file/file_manager.py`) + - Redis conventions (`extensions/ext_redis.py`) + - Plugin runtime topology + - Vector-store factory (`core/rag/datasource/vdb/*`) + - Observability hooks + - SSRF proxy usage + - Core CLI commands -- **[Coding Style](agent_skills/coding_style.md)**\ - When to read this: +### Plugin & Extension Development - - You’re writing or reviewing backend code and need the authoritative checklist. - - You’re unsure about Pydantic validators, SQLAlchemy session usage, or logging patterns. - - You want the exact lint/type/test commands used in PRs.\ - Includes: Ruff & BasedPyright commands, no-annotation policy, session examples (`with Session(db.engine, ...)`), `@field_validator` usage, logging expectations, and the rule set for file size, helpers, and package management. - -______________________________________________________________________ - -## Plugin & Extension Development - -- **[Plugin Systems](agent_skills/plugin.md)**\ - When to read this: +#### [Plugin Systems](agent_skills/plugin.md) +- **When to read this** - You’re building or debugging a marketplace plugin. - - You need to know how manifests, providers, daemons, and migrations fit together.\ - What it covers: plugin manifests (`core/plugin/entities/plugin.py`), installation/upgrade flows (`services/plugin/plugin_service.py`, CLI commands), runtime adapters (`core/plugin/impl/*` for tool/model/datasource/trigger/endpoint/agent), daemon coordination (`core/plugin/entities/plugin_daemon.py`), and how provider registries surface capabilities to the rest of the platform. + - You need to know how manifests, providers, daemons, and migrations fit together. +- **What it covers** + - Plugin manifests (`core/plugin/entities/plugin.py`) + - Installation/upgrade flows (`services/plugin/plugin_service.py`, CLI commands) + - Runtime adapters (`core/plugin/impl/*` for tool/model/datasource/trigger/endpoint/agent) + - Daemon coordination (`core/plugin/entities/plugin_daemon.py`) + - How provider registries surface capabilities to the rest of the platform -- **[Plugin OAuth](agent_skills/plugin_oauth.md)**\ - When to read this: +#### [Plugin OAuth](agent_skills/plugin_oauth.md) +- **When to read this** - You must integrate OAuth for a plugin or datasource. - - You’re handling credential encryption or refresh flows.\ - Topics: credential storage, encryption helpers (`core/helper/provider_encryption.py`), OAuth client bootstrap (`services/plugin/oauth_service.py`, `services/plugin/plugin_parameter_service.py`), and how console/API layers expose the flows. + - You’re handling credential encryption or refresh flows. +- **Topics** + - Credential storage + - Encryption helpers (`core/helper/provider_encryption.py`) + - OAuth client bootstrap (`services/plugin/oauth_service.py`, `services/plugin/plugin_parameter_service.py`) + - How console/API layers expose the flows -______________________________________________________________________ +### Workflow Entry & Execution -## Workflow Entry & Execution +#### [Trigger Concepts](agent_skills/trigger.md) -- **[Trigger Concepts](agent_skills/trigger.md)**\ - When to read this: +- **When to read this** - You’re debugging why a workflow didn’t start. - You’re adding a new trigger type or hook. - - You need to trace async execution, draft debugging, or webhook/schedule pipelines.\ - Details: Start-node taxonomy, webhook & schedule internals (`core/workflow/nodes/trigger_*`, `services/trigger/*`), async orchestration (`services/async_workflow_service.py`, Celery queues), debug event bus, and storage/logging interactions. + - You need to trace async execution, draft debugging, or webhook/schedule pipelines. +- **Details** + - Start-node taxonomy + - Webhook & schedule internals (`core/workflow/nodes/trigger_*`, `services/trigger/*`) + - Async orchestration (`services/async_workflow_service.py`, Celery queues) + - Debug event bus + - Storage/logging interactions -______________________________________________________________________ +## General Reminders -## Additional Notes for Agents - -- All skill docs assume you follow the coding style guide—run Ruff/BasedPyright/tests listed there before submitting changes. +- All skill docs assume you follow the coding style rules below—run the lint/type/test commands before submitting changes. - When you cannot find an answer in these briefs, search the codebase using the paths referenced (e.g., `core/plugin/impl/tool.py`, `services/dataset_service.py`). - If you run into cross-cutting concerns (tenancy, configuration, storage), check the infrastructure guide first; it links to most supporting modules. - Keep multi-tenancy and configuration central: everything flows through `configs.dify_config` and `tenant_id`. - When touching plugins or triggers, consult both the system overview and the specialised doc to ensure you adjust lifecycle, storage, and observability consistently. + +## Coding Style + +This is the default standard for backend code in this repo. Follow it for new code and use it as the checklist when reviewing changes. + +### Linting & Formatting + +- Use Ruff for formatting and linting (follow `.ruff.toml`). +- Keep each line under 120 characters (including spaces). + +### Naming Conventions + +- Use `snake_case` for variables and functions. +- Use `PascalCase` for classes. +- Use `UPPER_CASE` for constants. + +### Typing & Class Layout + +- Code should usually include type annotations that match the repo’s current Python version (avoid untyped public APIs and “mystery” values). +- Prefer modern typing forms (e.g. `list[str]`, `dict[str, int]`) and avoid `Any` unless there’s a strong reason. +- For classes, declare member variables at the top of the class body (before `__init__`) so the class shape is obvious at a glance: + +```python +from datetime import datetime + + +class Example: + user_id: str + created_at: datetime + + def __init__(self, user_id: str, created_at: datetime) -> None: + self.user_id = user_id + self.created_at = created_at +``` + +### General Rules + +- Use Pydantic v2 conventions. +- Use `uv` for Python package management in this repo (usually with `--project api`). +- Prefer simple functions over small “utility classes” for lightweight helpers. +- Avoid implementing dunder methods unless it’s clearly needed and matches existing patterns. +- Never start long-running services as part of agent work (`uv run app.py`, `flask run`, etc.); running tests is allowed. +- Keep files below ~800 lines; split when necessary. +- Keep code readable and explicit—avoid clever hacks. + +### Architecture & Boundaries + +- Mirror the layered architecture: controller → service → core/domain. +- Reuse existing helpers in `core/`, `services/`, and `libs/` before creating new abstractions. +- Optimise for observability: deterministic control flow, clear logging, actionable errors. + +### Logging & Errors + +- Never use `print`; use a module-level logger: + - `logger = logging.getLogger(__name__)` +- Include tenant/app/workflow identifiers in log context when relevant. +- Raise domain-specific exceptions (`services/errors`, `core/errors`) and translate them into HTTP responses in controllers. +- Log retryable events at `warning`, terminal failures at `error`. + +### SQLAlchemy Patterns + +- Models inherit from `models.base.TypeBase`; do not create ad-hoc metadata or engines. +- Open sessions with context managers: + +```python +from sqlalchemy.orm import Session + +with Session(db.engine, expire_on_commit=False) as session: + stmt = select(Workflow).where( + Workflow.id == workflow_id, + Workflow.tenant_id == tenant_id, + ) + workflow = session.execute(stmt).scalar_one_or_none() +``` + +- Prefer SQLAlchemy expressions; avoid raw SQL unless necessary. +- Always scope queries by `tenant_id` and protect write paths with safeguards (`FOR UPDATE`, row counts, etc.). +- Introduce repository abstractions only for very large tables (e.g., workflow executions) or when alternative storage strategies are required. + +### Storage & External I/O + +- Access storage via `extensions.ext_storage.storage`. +- Use `core.helper.ssrf_proxy` for outbound HTTP fetches. +- Background tasks that touch storage must be idempotent, and should log relevant object identifiers. + +### Pydantic Usage + +- Define DTOs with Pydantic v2 models and forbid extras by default. +- Use `@field_validator` / `@model_validator` for domain rules. + +Example: + +```python +from pydantic import BaseModel, ConfigDict, HttpUrl, field_validator + + +class TriggerConfig(BaseModel): + endpoint: HttpUrl + secret: str + + model_config = ConfigDict(extra="forbid") + + @field_validator("secret") + def ensure_secret_prefix(cls, value: str) -> str: + if not value.startswith("dify_"): + raise ValueError("secret must start with dify_") + return value +``` + +### Generics & Protocols + +- Use `typing.Protocol` to define behavioural contracts (e.g., cache interfaces). +- Apply generics (`TypeVar`, `Generic`) for reusable utilities like caches or providers. +- Validate dynamic inputs at runtime when generics cannot enforce safety alone. + +### Tooling & Checks + +Quick checks while iterating: + +- Format: `make format` +- Lint (includes auto-fix): `make lint` +- Type check: `make type-check` +- Targeted tests: `make test TARGET_TESTS=./api/tests/` + +Before opening a PR / submitting: + +- `make lint` +- `make type-check` +- `make test` + +### Controllers & Services + +- Controllers: parse input via Pydantic, invoke services, return serialised responses; no business logic. +- Services: coordinate repositories, providers, background tasks; keep side effects explicit. +- Document non-obvious behaviour with concise comments. + +### Miscellaneous + +- Use `configs.dify_config` for configuration—never read environment variables directly. +- Maintain tenant awareness end-to-end; `tenant_id` must flow through every layer touching shared resources. +- Queue async work through `services/async_workflow_service`; implement tasks under `tasks/` with explicit queue selection. +- Keep experimental scripts under `dev/`; do not ship them in production builds. diff --git a/api/agent_skills/coding_style.md b/api/agent_skills/coding_style.md deleted file mode 100644 index a2b66f0bd5..0000000000 --- a/api/agent_skills/coding_style.md +++ /dev/null @@ -1,115 +0,0 @@ -## Linter - -- Always follow `.ruff.toml`. -- Run `uv run ruff check --fix --unsafe-fixes`. -- Keep each line under 100 characters (including spaces). - -## Code Style - -- `snake_case` for variables and functions. -- `PascalCase` for classes. -- `UPPER_CASE` for constants. - -## Rules - -- Use Pydantic v2 standard. -- Use `uv` for package management. -- Do not override dunder methods like `__init__`, `__iadd__`, etc. -- Never launch services (`uv run app.py`, `flask run`, etc.); running tests under `tests/` is allowed. -- Prefer simple functions over classes for lightweight helpers. -- Keep files below 800 lines; split when necessary. -- Keep code readable—no clever hacks. -- Never use `print`; log with `logger = logging.getLogger(__name__)`. - -## Guiding Principles - -- Mirror the project’s layered architecture: controller → service → core/domain. -- Reuse existing helpers in `core/`, `services/`, and `libs/` before creating new abstractions. -- Optimise for observability: deterministic control flow, clear logging, actionable errors. - -## SQLAlchemy Patterns - -- Models inherit from `models.base.Base`; never create ad-hoc metadata or engines. - -- Open sessions with context managers: - - ```python - from sqlalchemy.orm import Session - - with Session(db.engine, expire_on_commit=False) as session: - stmt = select(Workflow).where( - Workflow.id == workflow_id, - Workflow.tenant_id == tenant_id, - ) - workflow = session.execute(stmt).scalar_one_or_none() - ``` - -- Use SQLAlchemy expressions; avoid raw SQL unless necessary. - -- Introduce repository abstractions only for very large tables (e.g., workflow executions) to support alternative storage strategies. - -- Always scope queries by `tenant_id` and protect write paths with safeguards (`FOR UPDATE`, row counts, etc.). - -## Storage & External IO - -- Access storage via `extensions.ext_storage.storage`. -- Use `core.helper.ssrf_proxy` for outbound HTTP fetches. -- Background tasks that touch storage must be idempotent and log the relevant object identifiers. - -## Pydantic Usage - -- Define DTOs with Pydantic v2 models and forbid extras by default. - -- Use `@field_validator` / `@model_validator` for domain rules. - -- Example: - - ```python - from pydantic import BaseModel, ConfigDict, HttpUrl, field_validator - - class TriggerConfig(BaseModel): - endpoint: HttpUrl - secret: str - - model_config = ConfigDict(extra="forbid") - - @field_validator("secret") - def ensure_secret_prefix(cls, value: str) -> str: - if not value.startswith("dify_"): - raise ValueError("secret must start with dify_") - return value - ``` - -## Generics & Protocols - -- Use `typing.Protocol` to define behavioural contracts (e.g., cache interfaces). -- Apply generics (`TypeVar`, `Generic`) for reusable utilities like caches or providers. -- Validate dynamic inputs at runtime when generics cannot enforce safety alone. - -## Error Handling & Logging - -- Raise domain-specific exceptions (`services/errors`, `core/errors`) and translate to HTTP responses in controllers. -- Declare `logger = logging.getLogger(__name__)` at module top. -- Include tenant/app/workflow identifiers in log context. -- Log retryable events at `warning`, terminal failures at `error`. - -## Tooling & Checks - -- Format/lint: `uv run --project api --dev ruff format ./api` and `uv run --project api --dev ruff check --fix --unsafe-fixes ./api`. -- Type checks: `uv run --directory api --dev basedpyright`. -- Tests: `uv run --project api --dev dev/pytest/pytest_unit_tests.sh`. -- Run all of the above before submitting your work. - -## Controllers & Services - -- Controllers: parse input via Pydantic, invoke services, return serialised responses; no business logic. -- Services: coordinate repositories, providers, background tasks; keep side effects explicit. -- Avoid repositories unless necessary; direct SQLAlchemy usage is preferred for typical tables. -- Document non-obvious behaviour with concise comments. - -## Miscellaneous - -- Use `configs.dify_config` for configuration—never read environment variables directly. -- Maintain tenant awareness end-to-end; `tenant_id` must flow through every layer touching shared resources. -- Queue async work through `services/async_workflow_service`; implement tasks under `tasks/` with explicit queue selection. -- Keep experimental scripts under `dev/`; do not ship them in production builds. diff --git a/api/controllers/console/tag/tags.py b/api/controllers/console/tag/tags.py index e9fbb515e4..023ffc991a 100644 --- a/api/controllers/console/tag/tags.py +++ b/api/controllers/console/tag/tags.py @@ -30,6 +30,11 @@ class TagBindingRemovePayload(BaseModel): type: Literal["knowledge", "app"] | None = Field(default=None, description="Tag type") +class TagListQueryParam(BaseModel): + type: Literal["knowledge", "app", ""] = Field("", description="Tag type filter") + keyword: str | None = Field(None, description="Search keyword") + + register_schema_models( console_ns, TagBasePayload, @@ -43,12 +48,15 @@ class TagListApi(Resource): @setup_required @login_required @account_initialization_required + @console_ns.doc( + params={"type": 'Tag type filter. Can be "knowledge" or "app".', "keyword": "Search keyword for tag name."} + ) @marshal_with(dataset_tag_fields) def get(self): _, current_tenant_id = current_account_with_tenant() - tag_type = request.args.get("type", type=str, default="") - keyword = request.args.get("keyword", default=None, type=str) - tags = TagService.get_tags(tag_type, current_tenant_id, keyword) + raw_args = request.args.to_dict() + param = TagListQueryParam.model_validate(raw_args) + tags = TagService.get_tags(param.type, current_tenant_id, param.keyword) return tags, 200 diff --git a/api/core/llm_generator/llm_generator.py b/api/core/llm_generator/llm_generator.py index b4c3ec1caf..be1e306d47 100644 --- a/api/core/llm_generator/llm_generator.py +++ b/api/core/llm_generator/llm_generator.py @@ -71,8 +71,8 @@ class LLMGenerator: response: LLMResult = model_instance.invoke_llm( prompt_messages=list(prompts), model_parameters={"max_tokens": 500, "temperature": 1}, stream=False ) - answer = cast(str, response.message.content) - if answer is None: + answer = response.message.get_text_content() + if answer == "": return "" try: result_dict = json.loads(answer) @@ -184,7 +184,7 @@ class LLMGenerator: prompt_messages=list(prompt_messages), model_parameters=model_parameters, stream=False ) - rule_config["prompt"] = cast(str, response.message.content) + rule_config["prompt"] = response.message.get_text_content() except InvokeError as e: error = str(e) @@ -237,13 +237,11 @@ class LLMGenerator: return rule_config - rule_config["prompt"] = cast(str, prompt_content.message.content) + rule_config["prompt"] = prompt_content.message.get_text_content() - if not isinstance(prompt_content.message.content, str): - raise NotImplementedError("prompt content is not a string") parameter_generate_prompt = parameter_template.format( inputs={ - "INPUT_TEXT": prompt_content.message.content, + "INPUT_TEXT": prompt_content.message.get_text_content(), }, remove_template_variables=False, ) @@ -253,7 +251,7 @@ class LLMGenerator: statement_generate_prompt = statement_template.format( inputs={ "TASK_DESCRIPTION": instruction, - "INPUT_TEXT": prompt_content.message.content, + "INPUT_TEXT": prompt_content.message.get_text_content(), }, remove_template_variables=False, ) @@ -263,7 +261,7 @@ class LLMGenerator: parameter_content: LLMResult = model_instance.invoke_llm( prompt_messages=list(parameter_messages), model_parameters=model_parameters, stream=False ) - rule_config["variables"] = re.findall(r'"\s*([^"]+)\s*"', cast(str, parameter_content.message.content)) + rule_config["variables"] = re.findall(r'"\s*([^"]+)\s*"', parameter_content.message.get_text_content()) except InvokeError as e: error = str(e) error_step = "generate variables" @@ -272,7 +270,7 @@ class LLMGenerator: statement_content: LLMResult = model_instance.invoke_llm( prompt_messages=list(statement_messages), model_parameters=model_parameters, stream=False ) - rule_config["opening_statement"] = cast(str, statement_content.message.content) + rule_config["opening_statement"] = statement_content.message.get_text_content() except InvokeError as e: error = str(e) error_step = "generate conversation opener" @@ -315,7 +313,7 @@ class LLMGenerator: prompt_messages=list(prompt_messages), model_parameters=model_parameters, stream=False ) - generated_code = cast(str, response.message.content) + generated_code = response.message.get_text_content() return {"code": generated_code, "language": code_language, "error": ""} except InvokeError as e: @@ -351,7 +349,7 @@ class LLMGenerator: raise TypeError("Expected LLMResult when stream=False") response = result - answer = cast(str, response.message.content) + answer = response.message.get_text_content() return answer.strip() @classmethod @@ -375,10 +373,7 @@ class LLMGenerator: prompt_messages=list(prompt_messages), model_parameters=model_parameters, stream=False ) - raw_content = response.message.content - - if not isinstance(raw_content, str): - raise ValueError(f"LLM response content must be a string, got: {type(raw_content)}") + raw_content = response.message.get_text_content() try: parsed_content = json.loads(raw_content) diff --git a/web/__mocks__/zustand.ts b/web/__mocks__/zustand.ts new file mode 100644 index 0000000000..7255e5ef86 --- /dev/null +++ b/web/__mocks__/zustand.ts @@ -0,0 +1,56 @@ +import type * as ZustandExportedTypes from 'zustand' +import { act } from '@testing-library/react' + +export * from 'zustand' + +const { create: actualCreate, createStore: actualCreateStore } + // eslint-disable-next-line antfu/no-top-level-await + = await vi.importActual('zustand') + +export const storeResetFns = new Set<() => void>() + +const createUncurried = ( + stateCreator: ZustandExportedTypes.StateCreator, +) => { + const store = actualCreate(stateCreator) + const initialState = store.getInitialState() + storeResetFns.add(() => { + store.setState(initialState, true) + }) + return store +} + +export const create = (( + stateCreator: ZustandExportedTypes.StateCreator, +) => { + return typeof stateCreator === 'function' + ? createUncurried(stateCreator) + : createUncurried +}) as typeof ZustandExportedTypes.create + +const createStoreUncurried = ( + stateCreator: ZustandExportedTypes.StateCreator, +) => { + const store = actualCreateStore(stateCreator) + const initialState = store.getInitialState() + storeResetFns.add(() => { + store.setState(initialState, true) + }) + return store +} + +export const createStore = (( + stateCreator: ZustandExportedTypes.StateCreator, +) => { + return typeof stateCreator === 'function' + ? createStoreUncurried(stateCreator) + : createStoreUncurried +}) as typeof ZustandExportedTypes.createStore + +afterEach(() => { + act(() => { + storeResetFns.forEach((resetFn) => { + resetFn() + }) + }) +}) diff --git a/web/app/(commonLayout)/app/(appDetailLayout)/[appId]/overview/card-view.tsx b/web/app/(commonLayout)/app/(appDetailLayout)/[appId]/overview/card-view.tsx index 939e4e9fe6..81b4f2474e 100644 --- a/web/app/(commonLayout)/app/(appDetailLayout)/[appId]/overview/card-view.tsx +++ b/web/app/(commonLayout)/app/(appDetailLayout)/[appId]/overview/card-view.tsx @@ -65,15 +65,17 @@ const CardView: FC = ({ appId, isInPanel, className }) => {
{t('overview.disableTooltip.triggerMode', { ns: 'appOverview', feature: featureName })}
-
{ event.stopPropagation() - window.open(triggerDocUrl, '_blank') }} > {t('overview.appInfo.enableTooltip.learnMore', { ns: 'appOverview' })} -
+ ), [t, triggerDocUrl]) diff --git a/web/app/components/app/app-access-control/access-control.spec.tsx b/web/app/components/app/app-access-control/access-control.spec.tsx index b73ed5c266..3950bdf7ee 100644 --- a/web/app/components/app/app-access-control/access-control.spec.tsx +++ b/web/app/components/app/app-access-control/access-control.spec.tsx @@ -3,9 +3,7 @@ import type { App } from '@/types/app' import { fireEvent, render, screen, waitFor } from '@testing-library/react' import userEvent from '@testing-library/user-event' import useAccessControlStore from '@/context/access-control-store' -import { useGlobalPublicStore } from '@/context/global-public-context' import { AccessMode, SubjectType } from '@/models/access-control' -import { defaultSystemFeatures } from '@/types/feature' import Toast from '../../base/toast' import AccessControlDialog from './access-control-dialog' import AccessControlItem from './access-control-item' @@ -105,22 +103,6 @@ const memberSubject: Subject = { accountData: baseMember, } as Subject -const resetAccessControlStore = () => { - useAccessControlStore.setState({ - appId: '', - specificGroups: [], - specificMembers: [], - currentMenu: AccessMode.SPECIFIC_GROUPS_MEMBERS, - selectedGroupsForBreadcrumb: [], - }) -} - -const resetGlobalStore = () => { - useGlobalPublicStore.setState({ - systemFeatures: defaultSystemFeatures, - }) -} - beforeAll(() => { class MockIntersectionObserver { observe = vi.fn(() => undefined) @@ -132,9 +114,6 @@ beforeAll(() => { }) beforeEach(() => { - vi.clearAllMocks() - resetAccessControlStore() - resetGlobalStore() mockMutateAsync.mockResolvedValue(undefined) mockUseUpdateAccessMode.mockReturnValue({ isPending: false, diff --git a/web/app/components/app/configuration/dataset-config/select-dataset/index.tsx b/web/app/components/app/configuration/dataset-config/select-dataset/index.tsx index b60f6797bf..36d78920fa 100644 --- a/web/app/components/app/configuration/dataset-config/select-dataset/index.tsx +++ b/web/app/components/app/configuration/dataset-config/select-dataset/index.tsx @@ -189,6 +189,7 @@ const SelectDataSet: FC = ({ } ))} + {isFetchingNextPage && } )} diff --git a/web/app/components/apps/app-card-skeleton.tsx b/web/app/components/apps/app-card-skeleton.tsx index 806f19973a..5fc41f76ab 100644 --- a/web/app/components/apps/app-card-skeleton.tsx +++ b/web/app/components/apps/app-card-skeleton.tsx @@ -21,15 +21,15 @@ export const AppCardSkeleton = React.memo(({ count = 6 }: AppCardSkeletonProps) > - +
- - + +
- - + +
diff --git a/web/app/components/apps/list.tsx b/web/app/components/apps/list.tsx index 84150ad480..8a236fe260 100644 --- a/web/app/components/apps/list.tsx +++ b/web/app/components/apps/list.tsx @@ -248,6 +248,9 @@ const List = () => { // No apps - show empty state return })()} + {isFetchingNextPage && ( + + )} {isCurrentWorkspaceEditor && ( diff --git a/web/app/components/base/loading/index.tsx b/web/app/components/base/loading/index.tsx index 0f0cc9f24e..a946edf36c 100644 --- a/web/app/components/base/loading/index.tsx +++ b/web/app/components/base/loading/index.tsx @@ -1,21 +1,25 @@ 'use client' -import * as React from 'react' import { useTranslation } from 'react-i18next' - +import { cn } from '@/utils/classnames' import './style.css' type ILoadingProps = { type?: 'area' | 'app' + className?: string } -const Loading = ( - { type = 'area' }: ILoadingProps = { type: 'area' }, -) => { + +const Loading = (props?: ILoadingProps) => { + const { type = 'area', className } = props || {} const { t } = useTranslation() return (
) } + export default Loading diff --git a/web/app/components/base/search-input/index.tsx b/web/app/components/base/search-input/index.tsx index fe92a5d092..a2752373f1 100644 --- a/web/app/components/base/search-input/index.tsx +++ b/web/app/components/base/search-input/index.tsx @@ -20,6 +20,7 @@ const SearchInput: FC = ({ white, }) => { const { t } = useTranslation() + const inputRef = useRef(null) const [focus, setFocus] = useState(false) const isComposing = useRef(false) const [compositionValue, setCompositionValue] = useState('') @@ -36,6 +37,7 @@ const SearchInput: FC = ({
= ({ autoComplete="off" /> {value && ( -
{ onChange('') + inputRef.current?.focus() }} > -
+ )} ) diff --git a/web/app/components/datasets/documents/detail/completed/index.tsx b/web/app/components/datasets/documents/detail/completed/index.tsx index d50e6f1231..83f7e03248 100644 --- a/web/app/components/datasets/documents/detail/completed/index.tsx +++ b/web/app/components/datasets/documents/detail/completed/index.tsx @@ -447,6 +447,10 @@ const Completed: FC = ({ setFullScreen(!fullScreen) }, [fullScreen]) + const toggleCollapsed = useCallback(() => { + setIsCollapsed(prev => !prev) + }, []) + const viewNewlyAddedChunk = useCallback(async () => { const totalPages = segmentListData?.total_pages || 0 const total = segmentListData?.total || 0 @@ -583,15 +587,16 @@ const Completed: FC = ({ return selectedStatus ? 1 : 0 }, [selectedStatus]) + const contextValue = useMemo(() => ({ + isCollapsed, + fullScreen, + toggleFullScreen, + currSegment, + currChildChunk, + }), [isCollapsed, fullScreen, toggleFullScreen, currSegment, currChildChunk]) + return ( - + {/* Menu Bar */} {!isFullDocMode && (
@@ -623,7 +628,7 @@ const Completed: FC = ({ onClear={() => handleInputChange('')} /> - setIsCollapsed(!isCollapsed)} /> +
)} {/* Segment list */} diff --git a/web/app/components/datasets/documents/detail/completed/segment-card/chunk-content.tsx b/web/app/components/datasets/documents/detail/completed/segment-card/chunk-content.tsx index dda2d9bf80..cd329345a1 100644 --- a/web/app/components/datasets/documents/detail/completed/segment-card/chunk-content.tsx +++ b/web/app/components/datasets/documents/detail/completed/segment-card/chunk-content.tsx @@ -1,4 +1,5 @@ import type { FC } from 'react' +import type { SegmentListContextValue } from '..' import * as React from 'react' import { Markdown } from '@/app/components/base/markdown' import { cn } from '@/utils/classnames' @@ -14,13 +15,15 @@ type ChunkContentProps = { className?: string } +const selectIsCollapsed = (s: SegmentListContextValue) => s.isCollapsed + const ChunkContent: FC = ({ detail, isFullDocMode, className, }) => { const { answer, content, sign_content } = detail - const isCollapsed = useSegmentListContext(s => s.isCollapsed) + const isCollapsed = useSegmentListContext(selectIsCollapsed) if (answer) { return ( diff --git a/web/app/components/datasets/list/datasets.tsx b/web/app/components/datasets/list/datasets.tsx index 44b6553750..817b927e6b 100644 --- a/web/app/components/datasets/list/datasets.tsx +++ b/web/app/components/datasets/list/datasets.tsx @@ -2,6 +2,7 @@ import { useEffect, useRef } from 'react' import { useTranslation } from 'react-i18next' +import Loading from '@/app/components/base/loading' import { useSelector as useAppContextWithSelector } from '@/context/app-context' import { useDatasetList, useInvalidDatasetList } from '@/service/knowledge/use-dataset' import DatasetCard from './dataset-card' @@ -25,6 +26,7 @@ const Datasets = ({ fetchNextPage, hasNextPage, isFetching, + isFetchingNextPage, } = useDatasetList({ initialPage: 1, tag_ids: tags, @@ -60,6 +62,7 @@ const Datasets = ({ {datasetList?.pages.map(({ data: datasets }) => datasets.map(dataset => ( ), ))} + {isFetchingNextPage && }
diff --git a/web/app/components/header/app-nav/index.tsx b/web/app/components/header/app-nav/index.tsx index cc4f32a7ca..737dd96bab 100644 --- a/web/app/components/header/app-nav/index.tsx +++ b/web/app/components/header/app-nav/index.tsx @@ -33,6 +33,7 @@ const AppNav = () => { data: appsData, fetchNextPage, hasNextPage, + isFetchingNextPage, refetch, } = useInfiniteAppList({ page: 1, @@ -111,6 +112,7 @@ const AppNav = () => { createText={t('menus.newApp', { ns: 'common' })} onCreate={openModal} onLoadMore={handleLoadMore} + isLoadingMore={isFetchingNextPage} /> { data: datasetList, fetchNextPage, hasNextPage, + isFetchingNextPage, } = useDatasetList({ initialPage: 1, limit: 30, @@ -93,6 +94,7 @@ const DatasetNav = () => { createText={t('menus.newDataset', { ns: 'common' })} onCreate={() => router.push(createRoute)} onLoadMore={handleLoadMore} + isLoadingMore={isFetchingNextPage} /> ) } diff --git a/web/app/components/header/nav/index.tsx b/web/app/components/header/nav/index.tsx index 2edc64486e..ca4498e4fb 100644 --- a/web/app/components/header/nav/index.tsx +++ b/web/app/components/header/nav/index.tsx @@ -30,6 +30,7 @@ const Nav = ({ createText, onCreate, onLoadMore, + isLoadingMore, isApp, }: INavProps) => { const setAppDetail = useAppStore(state => state.setAppDetail) @@ -81,6 +82,7 @@ const Nav = ({ createText={createText} onCreate={onCreate} onLoadMore={onLoadMore} + isLoadingMore={isLoadingMore} /> ) diff --git a/web/app/components/header/nav/nav-selector/index.tsx b/web/app/components/header/nav/nav-selector/index.tsx index 178cba2f28..e66837c06c 100644 --- a/web/app/components/header/nav/nav-selector/index.tsx +++ b/web/app/components/header/nav/nav-selector/index.tsx @@ -14,6 +14,7 @@ import { useStore as useAppStore } from '@/app/components/app/store' import { AppTypeIcon } from '@/app/components/app/type-selector' import AppIcon from '@/app/components/base/app-icon' import { FileArrow01, FilePlus01, FilePlus02 } from '@/app/components/base/icons/src/vender/line/files' +import Loading from '@/app/components/base/loading' import { useAppContext } from '@/context/app-context' import { cn } from '@/utils/classnames' @@ -34,9 +35,10 @@ export type INavSelectorProps = { isApp?: boolean onCreate: (state: string) => void onLoadMore?: () => void + isLoadingMore?: boolean } -const NavSelector = ({ curNav, navigationItems, createText, isApp, onCreate, onLoadMore }: INavSelectorProps) => { +const NavSelector = ({ curNav, navigationItems, createText, isApp, onCreate, onLoadMore, isLoadingMore }: INavSelectorProps) => { const { t } = useTranslation() const router = useRouter() const { isCurrentWorkspaceEditor } = useAppContext() @@ -106,6 +108,11 @@ const NavSelector = ({ curNav, navigationItems, createText, isApp, onCreate, onL )) } + {isLoadingMore && ( +
+ +
+ )}
{!isApp && isCurrentWorkspaceEditor && ( diff --git a/web/app/components/plugins/marketplace/list/list-wrapper.tsx b/web/app/components/plugins/marketplace/list/list-wrapper.tsx index a1b0c2529a..950b73ddbd 100644 --- a/web/app/components/plugins/marketplace/list/list-wrapper.tsx +++ b/web/app/components/plugins/marketplace/list/list-wrapper.tsx @@ -19,6 +19,7 @@ const ListWrapper = ({ marketplaceCollections, marketplaceCollectionPluginsMap, isLoading, + isFetchingNextPage, page, } = useMarketplaceData() @@ -53,6 +54,11 @@ const ListWrapper = ({ /> ) } + { + isFetchingNextPage && ( + + ) + } ) } diff --git a/web/app/components/plugins/marketplace/state.ts b/web/app/components/plugins/marketplace/state.ts index 9c76a21e92..4954acd60c 100644 --- a/web/app/components/plugins/marketplace/state.ts +++ b/web/app/components/plugins/marketplace/state.ts @@ -33,7 +33,7 @@ export function useMarketplaceData() { }, [isSearchMode, searchPluginText, activePluginType, filterPluginTags, sort]) const pluginsQuery = useMarketplacePlugins(queryParams) - const { hasNextPage, fetchNextPage, isFetching } = pluginsQuery + const { hasNextPage, fetchNextPage, isFetching, isFetchingNextPage } = pluginsQuery const handlePageChange = useCallback(() => { if (hasNextPage && !isFetching) @@ -50,5 +50,6 @@ export function useMarketplaceData() { pluginsTotal: pluginsQuery.data?.pages[0]?.total, page: pluginsQuery.data?.pages.length || 1, isLoading: collectionsQuery.isLoading || pluginsQuery.isLoading, + isFetchingNextPage, } } diff --git a/web/app/components/plugins/plugin-page/filter-management/index.spec.tsx b/web/app/components/plugins/plugin-page/filter-management/index.spec.tsx index 58474b4723..b942a360b0 100644 --- a/web/app/components/plugins/plugin-page/filter-management/index.spec.tsx +++ b/web/app/components/plugins/plugin-page/filter-management/index.spec.tsx @@ -144,17 +144,6 @@ describe('constant.ts - Type Definitions', () => { // ==================== store.ts Tests ==================== describe('store.ts - Zustand Store', () => { - beforeEach(() => { - // Reset store to initial state - const { setState } = useStore - setState({ - tagList: [], - categoryList: [], - showTagManagementModal: false, - showCategoryManagementModal: false, - }) - }) - describe('Initial State', () => { it('should have empty tagList initially', () => { const { result } = renderHook(() => useStore(state => state.tagList)) diff --git a/web/app/components/plugins/plugin-page/plugins-panel.tsx b/web/app/components/plugins/plugin-page/plugins-panel.tsx index ff765d39ab..d2ba8b2363 100644 --- a/web/app/components/plugins/plugin-page/plugins-panel.tsx +++ b/web/app/components/plugins/plugin-page/plugins-panel.tsx @@ -5,11 +5,11 @@ import { useDebounceFn } from 'ahooks' import { useMemo } from 'react' import { useTranslation } from 'react-i18next' import Button from '@/app/components/base/button' +import Loading from '@/app/components/base/loading' import PluginDetailPanel from '@/app/components/plugins/plugin-detail-panel' import { useGetLanguage } from '@/context/i18n' import { renderI18nObject } from '@/i18n-config' import { useInstalledLatestVersion, useInstalledPluginList, useInvalidateInstalledPluginList } from '@/service/use-plugins' -import Loading from '../../base/loading' import { PluginSource } from '../types' import { usePluginPageContext } from './context' import Empty from './empty' @@ -107,12 +107,17 @@ const PluginsPanel = () => {
- {!isLastPage && !isFetching && ( - + {!isLastPage && ( +
+ {isFetching + ? + : ( + + )} +
)} - {isFetching &&
{t('detail.loading', { ns: 'appLog' })}
} ) : ( diff --git a/web/app/components/plugins/readme-panel/index.spec.tsx b/web/app/components/plugins/readme-panel/index.spec.tsx index 8d795eac10..d636b18d71 100644 --- a/web/app/components/plugins/readme-panel/index.spec.tsx +++ b/web/app/components/plugins/readme-panel/index.spec.tsx @@ -134,13 +134,6 @@ describe('BUILTIN_TOOLS_ARRAY', () => { // Store Tests // ================================ describe('useReadmePanelStore', () => { - beforeEach(() => { - vi.clearAllMocks() - // Reset store state before each test - const { setCurrentPluginDetail } = useReadmePanelStore.getState() - setCurrentPluginDetail() - }) - describe('Initial State', () => { it('should have undefined currentPluginDetail initially', () => { const { currentPluginDetail } = useReadmePanelStore.getState() @@ -228,13 +221,6 @@ describe('useReadmePanelStore', () => { // ReadmeEntrance Component Tests // ================================ describe('ReadmeEntrance', () => { - beforeEach(() => { - vi.clearAllMocks() - // Reset store state - const { setCurrentPluginDetail } = useReadmePanelStore.getState() - setCurrentPluginDetail() - }) - // ================================ // Rendering Tests // ================================ @@ -417,11 +403,6 @@ describe('ReadmeEntrance', () => { // ================================ describe('ReadmePanel', () => { beforeEach(() => { - vi.clearAllMocks() - // Reset store state - const { setCurrentPluginDetail } = useReadmePanelStore.getState() - setCurrentPluginDetail() - // Reset mock mockUsePluginReadme.mockReturnValue({ data: null, isLoading: false, diff --git a/web/app/components/workflow/nodes/_base/components/editor/code-editor/editor-support-vars.tsx b/web/app/components/workflow/nodes/_base/components/editor/code-editor/editor-support-vars.tsx index ae14e7ccbc..346ee7efe6 100644 --- a/web/app/components/workflow/nodes/_base/components/editor/code-editor/editor-support-vars.tsx +++ b/web/app/components/workflow/nodes/_base/components/editor/code-editor/editor-support-vars.tsx @@ -5,6 +5,7 @@ import type { NodeOutPutVar, Variable } from '@/app/components/workflow/types' import { useBoolean } from 'ahooks' import * as React from 'react' import { useEffect, useRef, useState } from 'react' +import { createPortal } from 'react-dom' import { useTranslation } from 'react-i18next' import VarReferenceVars from '@/app/components/workflow/nodes/_base/components/variable/var-reference-vars' import { cn } from '@/utils/classnames' @@ -147,7 +148,7 @@ const CodeEditor: FC = ({ onMount={onEditorMounted} placeholder={t('common.jinjaEditorPlaceholder', { ns: 'workflow' })!} /> - {isShowVarPicker && ( + {isShowVarPicker && createPortal(
= ({ onChange={handleSelectVar} isSupportFileVar={false} /> -
+ , + document.body, )} ) diff --git a/web/eslint-suppressions.json b/web/eslint-suppressions.json new file mode 100644 index 0000000000..b043a2d951 --- /dev/null +++ b/web/eslint-suppressions.json @@ -0,0 +1,5107 @@ +{ + "__tests__/check-i18n.test.ts": { + "regexp/no-unused-capturing-group": { + "count": 1 + }, + "ts/no-explicit-any": { + "count": 2 + } + }, + "__tests__/document-detail-navigation-fix.test.tsx": { + "no-console": { + "count": 10 + } + }, + "__tests__/document-list-sorting.test.tsx": { + "ts/no-explicit-any": { + "count": 3 + } + }, + "__tests__/embedded-user-id-auth.test.tsx": { + "ts/no-explicit-any": { + "count": 8 + } + }, + "__tests__/embedded-user-id-store.test.tsx": { + "ts/no-explicit-any": { + "count": 3 + } + }, + "__tests__/goto-anything/command-selector.test.tsx": { + "ts/no-explicit-any": { + "count": 2 + } + }, + "__tests__/goto-anything/slash-command-modes.test.tsx": { + "ts/no-explicit-any": { + "count": 3 + } + }, + "__tests__/i18n-upload-features.test.ts": { + "no-console": { + "count": 3 + } + }, + "__tests__/navigation-utils.test.ts": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "__tests__/plugin-tool-workflow-error.test.tsx": { + "ts/no-explicit-any": { + "count": 2 + } + }, + "__tests__/real-browser-flicker.test.tsx": { + "no-console": { + "count": 16 + }, + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 4 + }, + "ts/no-explicit-any": { + "count": 1 + } + }, + "__tests__/unified-tags-logic.test.ts": { + "ts/no-explicit-any": { + "count": 8 + } + }, + "__tests__/workflow-onboarding-integration.test.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/(commonLayout)/app/(appDetailLayout)/[appId]/layout-main.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 2 + }, + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/(commonLayout)/app/(appDetailLayout)/[appId]/overview/time-range-picker/range-selector.tsx": { + "react-hooks/preserve-manual-memoization": { + "count": 1 + } + }, + "app/(commonLayout)/app/(appDetailLayout)/[appId]/overview/tracing/__tests__/svg-attribute-error-reproduction.spec.tsx": { + "no-console": { + "count": 19 + }, + "ts/no-explicit-any": { + "count": 3 + } + }, + "app/(commonLayout)/app/(appDetailLayout)/[appId]/overview/tracing/provider-panel.tsx": { + "react-hooks/static-components": { + "count": 1 + }, + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/(commonLayout)/datasets/(datasetDetailLayout)/[datasetId]/layout-main.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/(shareLayout)/components/splash.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 1 + } + }, + "app/(shareLayout)/webapp-reset-password/layout.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/(shareLayout)/webapp-signin/components/mail-and-password-auth.tsx": { + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/account/(commonLayout)/account-page/email-change-modal.tsx": { + "ts/no-explicit-any": { + "count": 5 + } + }, + "app/account/(commonLayout)/account-page/index.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/account/(commonLayout)/delete-account/components/feed-back.tsx": { + "react-hooks/preserve-manual-memoization": { + "count": 1 + } + }, + "app/account/(commonLayout)/delete-account/components/verify-email.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 1 + } + }, + "app/account/oauth/authorize/layout.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/account/oauth/authorize/page.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/app-sidebar/app-info.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/app-sidebar/app-operations.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 4 + } + }, + "app/components/app-sidebar/dataset-info/dropdown.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/app-sidebar/index.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/app-sidebar/navLink.spec.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/app-sidebar/sidebar-animation-issues.spec.tsx": { + "no-console": { + "count": 26 + } + }, + "app/components/app-sidebar/text-squeeze-fix-verification.spec.tsx": { + "no-console": { + "count": 51 + }, + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/app/annotation/batch-add-annotation-modal/csv-downloader.spec.tsx": { + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/app/annotation/batch-add-annotation-modal/index.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 1 + }, + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/app/annotation/edit-annotation-modal/edit-item/index.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 1 + } + }, + "app/components/app/annotation/edit-annotation-modal/index.spec.tsx": { + "test/prefer-hooks-in-order": { + "count": 1 + } + }, + "app/components/app/annotation/header-opts/index.spec.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/app/annotation/header-opts/index.tsx": { + "react/no-nested-component-definitions": { + "count": 1 + }, + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/app/annotation/index.spec.tsx": { + "ts/no-explicit-any": { + "count": 7 + } + }, + "app/components/app/annotation/index.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 1 + }, + "ts/no-explicit-any": { + "count": 5 + } + }, + "app/components/app/annotation/view-annotation-modal/index.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 5 + }, + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/app/app-access-control/access-control.spec.tsx": { + "ts/no-explicit-any": { + "count": 7 + } + }, + "app/components/app/app-publisher/features-wrapper.tsx": { + "react-hooks/preserve-manual-memoization": { + "count": 19 + }, + "ts/no-explicit-any": { + "count": 4 + } + }, + "app/components/app/app-publisher/index.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 3 + }, + "ts/no-explicit-any": { + "count": 6 + } + }, + "app/components/app/configuration/config-prompt/advanced-prompt-input.tsx": { + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/app/configuration/config-prompt/conversation-history/edit-modal.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/app/configuration/config-prompt/index.spec.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/app/configuration/config-prompt/prompt-editor-height-resize-wrap.tsx": { + "react-hooks/use-memo": { + "count": 1 + } + }, + "app/components/app/configuration/config-prompt/simple-prompt-input.tsx": { + "ts/no-explicit-any": { + "count": 3 + } + }, + "app/components/app/configuration/config-var/config-modal/index.tsx": { + "ts/no-explicit-any": { + "count": 6 + } + }, + "app/components/app/configuration/config-var/select-var-type.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/app/configuration/config-vision/index.spec.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/app/configuration/config/agent-setting-button.spec.tsx": { + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/app/configuration/config/agent/agent-setting/index.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 1 + }, + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/app/configuration/config/agent/agent-tools/index.spec.tsx": { + "react-hooks/globals": { + "count": 1 + }, + "ts/no-explicit-any": { + "count": 5 + } + }, + "app/components/app/configuration/config/agent/agent-tools/index.tsx": { + "ts/no-explicit-any": { + "count": 9 + } + }, + "app/components/app/configuration/config/agent/agent-tools/setting-built-in-tool.spec.tsx": { + "ts/no-explicit-any": { + "count": 5 + } + }, + "app/components/app/configuration/config/agent/agent-tools/setting-built-in-tool.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 1 + }, + "ts/no-explicit-any": { + "count": 4 + } + }, + "app/components/app/configuration/config/assistant-type-picker/index.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/app/configuration/config/automatic/get-automatic-res.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 4 + }, + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/app/configuration/config/automatic/instruction-editor.tsx": { + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/app/configuration/config/automatic/prompt-res-in-workflow.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/app/configuration/config/automatic/prompt-res.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 1 + } + }, + "app/components/app/configuration/config/automatic/version-selector.tsx": { + "react-hooks/preserve-manual-memoization": { + "count": 1 + } + }, + "app/components/app/configuration/config/code-generator/get-code-generator-res.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 4 + }, + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/app/configuration/config/config-audio.spec.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/app/configuration/config/config-document.spec.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/app/configuration/config/index.spec.tsx": { + "ts/no-explicit-any": { + "count": 6 + } + }, + "app/components/app/configuration/dataset-config/card-item/index.spec.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/app/configuration/dataset-config/index.spec.tsx": { + "ts/no-explicit-any": { + "count": 37 + } + }, + "app/components/app/configuration/dataset-config/index.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/app/configuration/dataset-config/params-config/config-content.tsx": { + "react-hooks/preserve-manual-memoization": { + "count": 1 + } + }, + "app/components/app/configuration/dataset-config/params-config/index.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 1 + } + }, + "app/components/app/configuration/dataset-config/select-dataset/index.spec.tsx": { + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/app/configuration/dataset-config/select-dataset/index.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 2 + } + }, + "app/components/app/configuration/dataset-config/settings-modal/index.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 2 + }, + "ts/no-explicit-any": { + "count": 3 + } + }, + "app/components/app/configuration/dataset-config/settings-modal/retrieval-section.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/app/configuration/debug/debug-with-multiple-model/chat-item.tsx": { + "ts/no-explicit-any": { + "count": 6 + } + }, + "app/components/app/configuration/debug/debug-with-multiple-model/index.spec.tsx": { + "ts/no-explicit-any": { + "count": 5 + } + }, + "app/components/app/configuration/debug/debug-with-multiple-model/index.tsx": { + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/app/configuration/debug/debug-with-multiple-model/text-generation-item.tsx": { + "ts/no-explicit-any": { + "count": 8 + } + }, + "app/components/app/configuration/debug/debug-with-single-model/index.spec.tsx": { + "react/no-create-ref": { + "count": 2 + }, + "ts/no-explicit-any": { + "count": 3 + } + }, + "app/components/app/configuration/debug/debug-with-single-model/index.tsx": { + "ts/no-explicit-any": { + "count": 5 + } + }, + "app/components/app/configuration/debug/hooks.tsx": { + "react-hooks/refs": { + "count": 7 + }, + "ts/no-explicit-any": { + "count": 3 + } + }, + "app/components/app/configuration/debug/index.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 2 + }, + "ts/no-explicit-any": { + "count": 11 + } + }, + "app/components/app/configuration/debug/types.ts": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/app/configuration/index.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 1 + }, + "style/multiline-ternary": { + "count": 2 + }, + "ts/no-explicit-any": { + "count": 24 + } + }, + "app/components/app/configuration/prompt-value-panel/index.spec.tsx": { + "ts/no-explicit-any": { + "count": 3 + } + }, + "app/components/app/configuration/prompt-value-panel/utils.ts": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/app/configuration/tools/external-data-tool-modal.tsx": { + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/app/create-app-dialog/app-card/index.spec.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/app/create-app-dialog/app-list/index.spec.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/app/create-app-modal/index.spec.tsx": { + "ts/no-explicit-any": { + "count": 7 + } + }, + "app/components/app/create-app-modal/index.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 1 + }, + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/app/create-from-dsl-modal/index.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 2 + } + }, + "app/components/app/log/index.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 1 + } + }, + "app/components/app/log/list.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 6 + }, + "react-hooks/refs": { + "count": 2 + }, + "style/multiline-ternary": { + "count": 2 + }, + "ts/no-explicit-any": { + "count": 14 + } + }, + "app/components/app/log/model-info.tsx": { + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/app/overview/__tests__/toggle-logic.test.ts": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/app/overview/app-card.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 3 + }, + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/app/overview/app-chart.tsx": { + "ts/no-explicit-any": { + "count": 13 + } + }, + "app/components/app/overview/embedded/index.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 1 + } + }, + "app/components/app/overview/settings/index.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 3 + }, + "regexp/no-unused-capturing-group": { + "count": 1 + } + }, + "app/components/app/overview/trigger-card.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/app/switch-app-modal/index.spec.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/app/switch-app-modal/index.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 1 + } + }, + "app/components/app/text-generate/item/index.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 3 + }, + "ts/no-explicit-any": { + "count": 4 + } + }, + "app/components/app/text-generate/item/result-tab.tsx": { + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/app/workflow-log/list.spec.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/app/workflow-log/list.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 2 + } + }, + "app/components/app/workflow-log/trigger-by-display.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/apps/app-card.spec.tsx": { + "ts/no-explicit-any": { + "count": 22 + } + }, + "app/components/apps/app-card.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 1 + }, + "react/no-nested-component-definitions": { + "count": 1 + }, + "ts/no-explicit-any": { + "count": 4 + } + }, + "app/components/apps/list.spec.tsx": { + "ts/no-explicit-any": { + "count": 9 + } + }, + "app/components/apps/list.tsx": { + "unused-imports/no-unused-vars": { + "count": 1 + } + }, + "app/components/apps/new-app-card.spec.tsx": { + "ts/no-explicit-any": { + "count": 4 + } + }, + "app/components/apps/new-app-card.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/base/agent-log-modal/detail.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/base/agent-log-modal/index.stories.tsx": { + "no-console": { + "count": 1 + }, + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/base/agent-log-modal/index.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 1 + } + }, + "app/components/base/agent-log-modal/result.tsx": { + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/base/agent-log-modal/tool-call.tsx": { + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/base/amplitude/utils.ts": { + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/base/app-icon-picker/ImageInput.tsx": { + "react/no-create-ref": { + "count": 1 + } + }, + "app/components/base/audio-btn/audio.ts": { + "node/prefer-global/buffer": { + "count": 1 + }, + "ts/no-explicit-any": { + "count": 3 + } + }, + "app/components/base/audio-gallery/AudioPlayer.tsx": { + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/base/auto-height-textarea/index.stories.tsx": { + "no-console": { + "count": 2 + }, + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/base/avatar/index.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 1 + } + }, + "app/components/base/block-input/index.stories.tsx": { + "no-console": { + "count": 2 + }, + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/base/block-input/index.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 1 + }, + "react/no-nested-component-definitions": { + "count": 1 + } + }, + "app/components/base/button/add-button.stories.tsx": { + "no-console": { + "count": 1 + } + }, + "app/components/base/button/sync-button.stories.tsx": { + "no-console": { + "count": 1 + } + }, + "app/components/base/chat/chat-with-history/chat-wrapper.tsx": { + "react-hooks/refs": { + "count": 1 + }, + "ts/no-explicit-any": { + "count": 6 + } + }, + "app/components/base/chat/chat-with-history/context.tsx": { + "ts/no-explicit-any": { + "count": 7 + } + }, + "app/components/base/chat/chat-with-history/header-in-mobile.tsx": { + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/base/chat/chat-with-history/header/index.tsx": { + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/base/chat/chat-with-history/hooks.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 4 + }, + "ts/no-explicit-any": { + "count": 18 + } + }, + "app/components/base/chat/chat-with-history/index.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 1 + } + }, + "app/components/base/chat/chat-with-history/inputs-form/content.tsx": { + "ts/no-explicit-any": { + "count": 3 + } + }, + "app/components/base/chat/chat-with-history/sidebar/operation.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 1 + } + }, + "app/components/base/chat/chat/answer/agent-content.tsx": { + "style/multiline-ternary": { + "count": 2 + }, + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/base/chat/chat/answer/index.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 2 + } + }, + "app/components/base/chat/chat/answer/workflow-process.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 1 + } + }, + "app/components/base/chat/chat/chat-input-area/index.tsx": { + "ts/no-explicit-any": { + "count": 3 + } + }, + "app/components/base/chat/chat/check-input-forms-hooks.ts": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/base/chat/chat/citation/index.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 3 + }, + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/base/chat/chat/hooks.ts": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 2 + }, + "react-hooks/refs": { + "count": 2 + }, + "ts/no-explicit-any": { + "count": 15 + } + }, + "app/components/base/chat/chat/index.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 1 + }, + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/base/chat/chat/type.ts": { + "ts/no-explicit-any": { + "count": 5 + } + }, + "app/components/base/chat/chat/utils.ts": { + "ts/no-explicit-any": { + "count": 3 + } + }, + "app/components/base/chat/embedded-chatbot/chat-wrapper.tsx": { + "react-hooks/refs": { + "count": 1 + }, + "ts/no-explicit-any": { + "count": 6 + } + }, + "app/components/base/chat/embedded-chatbot/context.tsx": { + "ts/no-explicit-any": { + "count": 7 + } + }, + "app/components/base/chat/embedded-chatbot/hooks.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 6 + }, + "react-hooks/refs": { + "count": 5 + }, + "ts/no-explicit-any": { + "count": 16 + } + }, + "app/components/base/chat/embedded-chatbot/inputs-form/content.tsx": { + "ts/no-explicit-any": { + "count": 3 + } + }, + "app/components/base/chat/utils.ts": { + "ts/no-explicit-any": { + "count": 10 + } + }, + "app/components/base/checkbox/index.stories.tsx": { + "no-console": { + "count": 1 + }, + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/base/chip/index.tsx": { + "ts/no-explicit-any": { + "count": 3 + } + }, + "app/components/base/confirm/index.stories.tsx": { + "no-console": { + "count": 4 + }, + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/base/confirm/index.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 2 + } + }, + "app/components/base/content-dialog/index.stories.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 1 + } + }, + "app/components/base/date-and-time-picker/date-picker/index.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 4 + }, + "react-hooks/refs": { + "count": 5 + } + }, + "app/components/base/date-and-time-picker/time-picker/index.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 2 + }, + "react-hooks/preserve-manual-memoization": { + "count": 3 + } + }, + "app/components/base/dialog/index.stories.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 1 + } + }, + "app/components/base/emoji-picker/Inner.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 1 + } + }, + "app/components/base/error-boundary/index.tsx": { + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/base/features/context.tsx": { + "react-hooks/refs": { + "count": 2 + } + }, + "app/components/base/features/new-feature-panel/annotation-reply/index.tsx": { + "ts/no-explicit-any": { + "count": 3 + } + }, + "app/components/base/features/new-feature-panel/annotation-reply/score-slider/base-slider/index.tsx": { + "unicorn/prefer-number-properties": { + "count": 1 + } + }, + "app/components/base/features/new-feature-panel/annotation-reply/use-annotation-config.ts": { + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/base/features/new-feature-panel/conversation-opener/index.tsx": { + "react-hooks/preserve-manual-memoization": { + "count": 1 + } + }, + "app/components/base/features/new-feature-panel/conversation-opener/modal.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 1 + } + }, + "app/components/base/features/new-feature-panel/feature-card.tsx": { + "ts/no-explicit-any": { + "count": 5 + } + }, + "app/components/base/features/new-feature-panel/file-upload/setting-modal.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/base/features/new-feature-panel/moderation/index.tsx": { + "react-hooks/preserve-manual-memoization": { + "count": 1 + }, + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/base/features/new-feature-panel/moderation/moderation-setting-modal.tsx": { + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/base/features/new-feature-panel/text-to-speech/voice-settings.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/base/features/types.ts": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/base/file-uploader/dynamic-pdf-preview.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/base/file-uploader/file-list-in-log.tsx": { + "react/no-missing-key": { + "count": 1 + } + }, + "app/components/base/file-uploader/hooks.ts": { + "react-hooks/use-memo": { + "count": 2 + }, + "ts/no-explicit-any": { + "count": 3 + } + }, + "app/components/base/file-uploader/store.tsx": { + "react-hooks/refs": { + "count": 2 + } + }, + "app/components/base/file-uploader/utils.spec.ts": { + "test/no-identical-title": { + "count": 1 + }, + "ts/no-explicit-any": { + "count": 3 + } + }, + "app/components/base/file-uploader/utils.ts": { + "ts/no-explicit-any": { + "count": 3 + } + }, + "app/components/base/form/components/base/base-field.tsx": { + "react-hooks/preserve-manual-memoization": { + "count": 2 + }, + "ts/no-explicit-any": { + "count": 3 + } + }, + "app/components/base/form/components/base/base-form.tsx": { + "react-hooks/preserve-manual-memoization": { + "count": 2 + }, + "ts/no-explicit-any": { + "count": 6 + } + }, + "app/components/base/form/components/field/mixed-variable-text-input/placeholder.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/base/form/components/field/variable-or-constant-input.tsx": { + "no-console": { + "count": 2 + }, + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/base/form/components/field/variable-selector.tsx": { + "no-console": { + "count": 1 + } + }, + "app/components/base/form/form-scenarios/base/field.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/base/form/form-scenarios/base/types.ts": { + "ts/no-explicit-any": { + "count": 3 + } + }, + "app/components/base/form/form-scenarios/demo/index.tsx": { + "no-console": { + "count": 2 + } + }, + "app/components/base/form/form-scenarios/input-field/field.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/base/form/form-scenarios/input-field/types.ts": { + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/base/form/form-scenarios/node-panel/field.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/base/form/form-scenarios/node-panel/types.ts": { + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/base/form/hooks/use-check-validated.ts": { + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/base/form/hooks/use-get-validators.ts": { + "react-hooks/preserve-manual-memoization": { + "count": 1 + }, + "ts/no-explicit-any": { + "count": 3 + } + }, + "app/components/base/form/types.ts": { + "ts/no-explicit-any": { + "count": 16 + } + }, + "app/components/base/form/utils/secret-input/index.ts": { + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/base/icons/icon-gallery.stories.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/base/icons/utils.ts": { + "ts/no-explicit-any": { + "count": 3 + } + }, + "app/components/base/image-uploader/hooks.ts": { + "ts/no-explicit-any": { + "count": 4 + } + }, + "app/components/base/image-uploader/image-link-input.tsx": { + "regexp/no-unused-capturing-group": { + "count": 1 + } + }, + "app/components/base/image-uploader/image-preview.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/base/image-uploader/utils.ts": { + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/base/inline-delete-confirm/index.stories.tsx": { + "no-console": { + "count": 2 + } + }, + "app/components/base/input-number/index.stories.tsx": { + "no-console": { + "count": 2 + }, + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/base/input-with-copy/index.spec.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/base/input/index.spec.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/base/input/index.stories.tsx": { + "no-console": { + "count": 2 + }, + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/base/markdown-blocks/audio-block.tsx": { + "ts/no-explicit-any": { + "count": 5 + } + }, + "app/components/base/markdown-blocks/button.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/base/markdown-blocks/code-block.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 10 + }, + "react-hooks/refs": { + "count": 1 + }, + "ts/no-explicit-any": { + "count": 9 + } + }, + "app/components/base/markdown-blocks/form.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 1 + }, + "ts/no-explicit-any": { + "count": 11 + } + }, + "app/components/base/markdown-blocks/img.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/base/markdown-blocks/link.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/base/markdown-blocks/paragraph.tsx": { + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/base/markdown-blocks/plugin-img.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 2 + } + }, + "app/components/base/markdown-blocks/plugin-paragraph.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 2 + }, + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/base/markdown-blocks/pre-code.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/base/markdown-blocks/script-block.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/base/markdown-blocks/think-block.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 1 + }, + "ts/no-explicit-any": { + "count": 4 + } + }, + "app/components/base/markdown-blocks/video-block.tsx": { + "ts/no-explicit-any": { + "count": 5 + } + }, + "app/components/base/markdown/error-boundary.tsx": { + "ts/no-explicit-any": { + "count": 3 + } + }, + "app/components/base/markdown/markdown-utils.ts": { + "regexp/no-unused-capturing-group": { + "count": 1 + } + }, + "app/components/base/markdown/react-markdown-wrapper.tsx": { + "ts/no-explicit-any": { + "count": 8 + } + }, + "app/components/base/mermaid/index.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 7 + }, + "react-hooks/purity": { + "count": 1 + }, + "regexp/no-super-linear-backtracking": { + "count": 3 + }, + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/base/mermaid/utils.ts": { + "regexp/no-unused-capturing-group": { + "count": 1 + }, + "ts/no-explicit-any": { + "count": 4 + } + }, + "app/components/base/message-log-modal/index.stories.tsx": { + "no-console": { + "count": 1 + }, + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/base/message-log-modal/index.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 1 + }, + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/base/modal-like-wrap/index.stories.tsx": { + "no-console": { + "count": 3 + } + }, + "app/components/base/modal/index.stories.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 1 + } + }, + "app/components/base/modal/modal.stories.tsx": { + "no-console": { + "count": 4 + }, + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 1 + } + }, + "app/components/base/new-audio-button/index.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/base/notion-connector/index.stories.tsx": { + "no-console": { + "count": 1 + } + }, + "app/components/base/notion-page-selector/base.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 2 + } + }, + "app/components/base/notion-page-selector/page-selector/index.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 1 + }, + "react-hooks/immutability": { + "count": 1 + } + }, + "app/components/base/pagination/index.tsx": { + "react-hooks/refs": { + "count": 2 + }, + "unicorn/prefer-number-properties": { + "count": 1 + } + }, + "app/components/base/pagination/type.ts": { + "ts/no-empty-object-type": { + "count": 1 + } + }, + "app/components/base/param-item/top-k-item.tsx": { + "unicorn/prefer-number-properties": { + "count": 1 + } + }, + "app/components/base/portal-to-follow-elem/index.tsx": { + "react-hooks/preserve-manual-memoization": { + "count": 2 + }, + "react-hooks/refs": { + "count": 1 + }, + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/base/prompt-editor/index.stories.tsx": { + "no-console": { + "count": 1 + }, + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/base/prompt-editor/index.tsx": { + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/base/prompt-editor/plugins/component-picker-block/hooks.tsx": { + "react-hooks/preserve-manual-memoization": { + "count": 2 + } + }, + "app/components/base/prompt-editor/plugins/component-picker-block/index.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/base/prompt-editor/plugins/context-block/component.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/base/prompt-editor/plugins/history-block/component.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/base/prompt-editor/plugins/on-blur-or-focus-block.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/base/prompt-editor/plugins/update-block.tsx": { + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/base/prompt-editor/plugins/workflow-variable-block/node.tsx": { + "ts/no-explicit-any": { + "count": 5 + } + }, + "app/components/base/prompt-editor/plugins/workflow-variable-block/workflow-variable-block-replacement-block.tsx": { + "react-hooks/preserve-manual-memoization": { + "count": 1 + }, + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/base/prompt-log-modal/index.stories.tsx": { + "no-console": { + "count": 1 + } + }, + "app/components/base/prompt-log-modal/index.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 1 + } + }, + "app/components/base/radio-card/index.stories.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/base/radio/component/group/index.tsx": { + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/base/radio/context/index.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/base/radio/index.stories.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/base/search-input/index.stories.tsx": { + "no-console": { + "count": 3 + }, + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/base/search-input/index.tsx": { + "react-hooks/refs": { + "count": 1 + } + }, + "app/components/base/select/index.stories.tsx": { + "no-console": { + "count": 4 + }, + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/base/select/index.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 2 + }, + "style/multiline-ternary": { + "count": 2 + }, + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/base/select/pure.tsx": { + "react-hooks/preserve-manual-memoization": { + "count": 2 + } + }, + "app/components/base/slider/index.stories.tsx": { + "no-console": { + "count": 2 + }, + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/base/sort/index.tsx": { + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/base/svg-gallery/index.tsx": { + "node/prefer-global/buffer": { + "count": 1 + } + }, + "app/components/base/switch/index.stories.tsx": { + "no-console": { + "count": 1 + }, + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/base/switch/index.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 1 + } + }, + "app/components/base/tab-slider/index.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 2 + } + }, + "app/components/base/tag-input/index.stories.tsx": { + "no-console": { + "count": 2 + }, + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/base/text-generation/hooks.ts": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/base/textarea/index.stories.tsx": { + "no-console": { + "count": 1 + }, + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/base/video-gallery/VideoPlayer.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 1 + } + }, + "app/components/base/voice-input/index.stories.tsx": { + "no-console": { + "count": 2 + }, + "react-hooks/purity": { + "count": 1 + }, + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/base/voice-input/index.tsx": { + "react-hooks/immutability": { + "count": 1 + } + }, + "app/components/base/voice-input/utils.ts": { + "ts/no-explicit-any": { + "count": 4 + } + }, + "app/components/base/with-input-validation/index.spec.tsx": { + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/base/with-input-validation/index.stories.tsx": { + "no-console": { + "count": 1 + } + }, + "app/components/base/with-input-validation/index.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/base/zendesk/utils.ts": { + "ts/no-explicit-any": { + "count": 4 + } + }, + "app/components/billing/plan/index.tsx": { + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/billing/pricing/plans/cloud-plan-item/index.spec.tsx": { + "test/prefer-hooks-in-order": { + "count": 1 + } + }, + "app/components/billing/pricing/plans/self-hosted-plan-item/index.spec.tsx": { + "test/prefer-hooks-in-order": { + "count": 1 + } + }, + "app/components/billing/upgrade-btn/index.spec.tsx": { + "ts/no-explicit-any": { + "count": 9 + } + }, + "app/components/billing/upgrade-btn/index.tsx": { + "ts/no-explicit-any": { + "count": 3 + } + }, + "app/components/billing/usage-info/index.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/custom/custom-web-app-brand/index.spec.tsx": { + "ts/no-explicit-any": { + "count": 7 + } + }, + "app/components/custom/custom-web-app-brand/index.tsx": { + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/datasets/common/document-picker/index.spec.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/datasets/common/document-picker/preview-document-picker.spec.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/datasets/common/document-status-with-action/auto-disabled-document.tsx": { + "react-hooks/preserve-manual-memoization": { + "count": 5 + } + }, + "app/components/datasets/common/image-previewer/index.tsx": { + "no-irregular-whitespace": { + "count": 1 + } + }, + "app/components/datasets/common/image-uploader/hooks/use-upload.ts": { + "ts/no-explicit-any": { + "count": 3 + } + }, + "app/components/datasets/common/image-uploader/store.tsx": { + "react-hooks/refs": { + "count": 2 + } + }, + "app/components/datasets/common/image-uploader/utils.ts": { + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/datasets/common/retrieval-method-config/index.spec.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/datasets/common/retrieval-param-config/index.tsx": { + "react-hooks/preserve-manual-memoization": { + "count": 1 + } + }, + "app/components/datasets/create/file-preview/index.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 1 + } + }, + "app/components/datasets/create/file-uploader/index.tsx": { + "react-hooks/immutability": { + "count": 1 + }, + "ts/no-explicit-any": { + "count": 3 + } + }, + "app/components/datasets/create/index.spec.tsx": { + "ts/no-explicit-any": { + "count": 16 + } + }, + "app/components/datasets/create/notion-page-preview/index.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 1 + } + }, + "app/components/datasets/create/step-three/index.spec.tsx": { + "ts/no-explicit-any": { + "count": 7 + } + }, + "app/components/datasets/create/step-two/hooks/use-indexing-config.ts": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 3 + } + }, + "app/components/datasets/create/stop-embedding-modal/index.spec.tsx": { + "test/prefer-hooks-in-order": { + "count": 1 + } + }, + "app/components/datasets/create/website/firecrawl/index.tsx": { + "no-console": { + "count": 1 + }, + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 1 + }, + "ts/no-explicit-any": { + "count": 5 + } + }, + "app/components/datasets/create/website/firecrawl/options.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/datasets/create/website/jina-reader/index.tsx": { + "no-console": { + "count": 1 + }, + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 1 + }, + "ts/no-explicit-any": { + "count": 3 + } + }, + "app/components/datasets/create/website/jina-reader/options.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/datasets/create/website/watercrawl/index.tsx": { + "no-console": { + "count": 1 + }, + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 1 + }, + "ts/no-explicit-any": { + "count": 5 + } + }, + "app/components/datasets/create/website/watercrawl/options.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/datasets/documents/components/list.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 2 + }, + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/datasets/documents/create-from-pipeline/data-source/base/credential-selector/index.spec.tsx": { + "ts/no-explicit-any": { + "count": 4 + } + }, + "app/components/datasets/documents/create-from-pipeline/data-source/base/header.spec.tsx": { + "ts/no-explicit-any": { + "count": 4 + } + }, + "app/components/datasets/documents/create-from-pipeline/data-source/online-documents/index.spec.tsx": { + "ts/no-explicit-any": { + "count": 10 + } + }, + "app/components/datasets/documents/create-from-pipeline/data-source/online-documents/index.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/datasets/documents/create-from-pipeline/data-source/online-documents/page-selector/index.spec.tsx": { + "ts/no-explicit-any": { + "count": 5 + } + }, + "app/components/datasets/documents/create-from-pipeline/data-source/online-documents/page-selector/index.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 1 + }, + "react-hooks/immutability": { + "count": 1 + } + }, + "app/components/datasets/documents/create-from-pipeline/data-source/online-drive/connect/index.spec.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/datasets/documents/create-from-pipeline/data-source/online-drive/file-list/index.spec.tsx": { + "ts/no-explicit-any": { + "count": 3 + } + }, + "app/components/datasets/documents/create-from-pipeline/data-source/online-drive/file-list/list/index.spec.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/datasets/documents/create-from-pipeline/data-source/online-drive/index.spec.tsx": { + "ts/no-explicit-any": { + "count": 11 + } + }, + "app/components/datasets/documents/create-from-pipeline/data-source/online-drive/index.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 5 + } + }, + "app/components/datasets/documents/create-from-pipeline/data-source/online-drive/utils.ts": { + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/datasets/documents/create-from-pipeline/data-source/store/provider.tsx": { + "react-hooks/refs": { + "count": 2 + } + }, + "app/components/datasets/documents/create-from-pipeline/data-source/store/slices/online-drive.ts": { + "ts/no-explicit-any": { + "count": 4 + } + }, + "app/components/datasets/documents/create-from-pipeline/data-source/website-crawl/base/options/index.spec.tsx": { + "ts/no-explicit-any": { + "count": 9 + } + }, + "app/components/datasets/documents/create-from-pipeline/data-source/website-crawl/base/options/index.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/datasets/documents/create-from-pipeline/data-source/website-crawl/index.spec.tsx": { + "ts/no-explicit-any": { + "count": 11 + } + }, + "app/components/datasets/documents/create-from-pipeline/data-source/website-crawl/index.tsx": { + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/datasets/documents/create-from-pipeline/process-documents/form.tsx": { + "ts/no-explicit-any": { + "count": 3 + } + }, + "app/components/datasets/documents/create-from-pipeline/process-documents/index.tsx": { + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/datasets/documents/detail/batch-modal/index.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 1 + } + }, + "app/components/datasets/documents/detail/completed/child-segment-list.tsx": { + "react-hooks/preserve-manual-memoization": { + "count": 2 + } + }, + "app/components/datasets/documents/detail/completed/common/chunk-content.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 1 + } + }, + "app/components/datasets/documents/detail/completed/common/regeneration-modal.tsx": { + "react-hooks/purity": { + "count": 1 + } + }, + "app/components/datasets/documents/detail/completed/index.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 6 + }, + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/datasets/documents/detail/completed/new-child-segment.tsx": { + "react-hooks/preserve-manual-memoization": { + "count": 1 + }, + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/datasets/documents/detail/context.ts": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/datasets/documents/detail/embedding/index.tsx": { + "react-hooks/immutability": { + "count": 1 + }, + "react-hooks/preserve-manual-memoization": { + "count": 2 + } + }, + "app/components/datasets/documents/detail/index.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/datasets/documents/detail/metadata/index.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 4 + }, + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/datasets/documents/detail/new-segment.tsx": { + "react-hooks/purity": { + "count": 1 + }, + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/datasets/documents/detail/settings/document-settings.tsx": { + "react-hooks/preserve-manual-memoization": { + "count": 1 + } + }, + "app/components/datasets/documents/detail/settings/pipeline-settings/index.tsx": { + "react-hooks/refs": { + "count": 1 + }, + "ts/no-explicit-any": { + "count": 6 + } + }, + "app/components/datasets/documents/detail/settings/pipeline-settings/process-documents/index.tsx": { + "ts/no-explicit-any": { + "count": 3 + } + }, + "app/components/datasets/documents/hooks/use-documents-page-state.ts": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 12 + } + }, + "app/components/datasets/documents/index.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 2 + } + }, + "app/components/datasets/external-api/external-api-modal/index.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 1 + } + }, + "app/components/datasets/external-knowledge-base/create/ExternalApiSelect.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 1 + } + }, + "app/components/datasets/external-knowledge-base/create/ExternalApiSelection.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 1 + } + }, + "app/components/datasets/extra-info/service-api/card.tsx": { + "react-hooks/preserve-manual-memoization": { + "count": 1 + } + }, + "app/components/datasets/formatted-text/flavours/edit-slice.tsx": { + "react-hooks/refs": { + "count": 1 + } + }, + "app/components/datasets/formatted-text/flavours/preview-slice.tsx": { + "react-hooks/refs": { + "count": 1 + } + }, + "app/components/datasets/formatted-text/flavours/type.ts": { + "ts/no-empty-object-type": { + "count": 1 + } + }, + "app/components/datasets/hit-testing/components/score.tsx": { + "unicorn/prefer-number-properties": { + "count": 1 + } + }, + "app/components/datasets/hit-testing/index.tsx": { + "react-hooks/purity": { + "count": 1 + } + }, + "app/components/datasets/list/dataset-card/hooks/use-dataset-card-state.ts": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 1 + } + }, + "app/components/datasets/metadata/base/date-picker.tsx": { + "react-hooks/purity": { + "count": 1 + } + }, + "app/components/datasets/metadata/edit-metadata-batch/input-combined.tsx": { + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/datasets/metadata/hooks/use-edit-dataset-metadata.ts": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 1 + } + }, + "app/components/datasets/metadata/hooks/use-metadata-document.ts": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/datasets/metadata/metadata-dataset/create-content.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/datasets/metadata/metadata-dataset/create-metadata-modal.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/datasets/metadata/metadata-dataset/dataset-metadata-drawer.tsx": { + "react-hooks/static-components": { + "count": 1 + } + }, + "app/components/datasets/settings/form/index.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 2 + }, + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/datasets/settings/permission-selector/index.tsx": { + "react/no-missing-key": { + "count": 1 + } + }, + "app/components/develop/code.tsx": { + "ts/no-empty-object-type": { + "count": 1 + }, + "ts/no-explicit-any": { + "count": 9 + } + }, + "app/components/develop/doc.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 2 + }, + "ts/no-explicit-any": { + "count": 3 + } + }, + "app/components/develop/md.tsx": { + "ts/no-empty-object-type": { + "count": 1 + }, + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/explore/app-card/index.spec.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/explore/create-app-modal/index.tsx": { + "ts/no-explicit-any": { + "count": 1 + }, + "unicorn/prefer-number-properties": { + "count": 1 + } + }, + "app/components/explore/index.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 1 + } + }, + "app/components/explore/item-operation/index.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 1 + } + }, + "app/components/explore/sidebar/index.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/goto-anything/actions/commands/command-bus.ts": { + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/goto-anything/actions/commands/registry.ts": { + "ts/no-explicit-any": { + "count": 3 + } + }, + "app/components/goto-anything/actions/commands/slash.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/goto-anything/actions/commands/types.ts": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/goto-anything/actions/types.ts": { + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/goto-anything/context.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 4 + } + }, + "app/components/goto-anything/index.spec.tsx": { + "ts/no-explicit-any": { + "count": 5 + } + }, + "app/components/goto-anything/index.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 1 + }, + "react-hooks/preserve-manual-memoization": { + "count": 9 + } + }, + "app/components/header/account-setting/data-source-page-new/card.tsx": { + "react-hooks/immutability": { + "count": 1 + }, + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/header/account-setting/data-source-page-new/hooks/use-marketplace-all-plugins.ts": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/header/account-setting/data-source-page-new/install-from-marketplace.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/header/account-setting/data-source-page-new/item.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/header/account-setting/data-source-page-new/operator.tsx": { + "react-hooks/preserve-manual-memoization": { + "count": 1 + } + }, + "app/components/header/account-setting/data-source-page-new/types.ts": { + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/header/account-setting/data-source-page/data-source-website/index.tsx": { + "react-hooks/preserve-manual-memoization": { + "count": 1 + }, + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/header/account-setting/data-source-page/panel/config-item.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/header/account-setting/index.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 1 + } + }, + "app/components/header/account-setting/key-validator/declarations.ts": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/header/account-setting/members-page/invite-modal/index.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 3 + }, + "react-hooks/preserve-manual-memoization": { + "count": 3 + } + }, + "app/components/header/account-setting/members-page/transfer-ownership-modal/index.tsx": { + "ts/no-explicit-any": { + "count": 3 + } + }, + "app/components/header/account-setting/members-page/transfer-ownership-modal/member-selector.tsx": { + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/header/account-setting/model-provider-page/declarations.ts": { + "ts/no-explicit-any": { + "count": 4 + } + }, + "app/components/header/account-setting/model-provider-page/hooks.spec.ts": { + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/header/account-setting/model-provider-page/hooks.ts": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 1 + }, + "ts/no-explicit-any": { + "count": 3 + } + }, + "app/components/header/account-setting/model-provider-page/model-auth/add-credential-in-load-balancing.tsx": { + "ts/no-explicit-any": { + "count": 4 + } + }, + "app/components/header/account-setting/model-provider-page/model-auth/authorized/index.tsx": { + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/header/account-setting/model-provider-page/model-auth/hooks/use-auth.ts": { + "ts/no-explicit-any": { + "count": 6 + } + }, + "app/components/header/account-setting/model-provider-page/model-auth/hooks/use-model-form-schemas.ts": { + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/header/account-setting/model-provider-page/model-auth/switch-credential-in-load-balancing.tsx": { + "ts/no-explicit-any": { + "count": 3 + } + }, + "app/components/header/account-setting/model-provider-page/model-modal/Form.tsx": { + "ts/no-explicit-any": { + "count": 6 + } + }, + "app/components/header/account-setting/model-provider-page/model-modal/Input.tsx": { + "unicorn/prefer-number-properties": { + "count": 2 + } + }, + "app/components/header/account-setting/model-provider-page/model-modal/index.tsx": { + "react-hooks/preserve-manual-memoization": { + "count": 2 + }, + "ts/no-explicit-any": { + "count": 5 + } + }, + "app/components/header/account-setting/model-provider-page/model-parameter-modal/configuration-button.tsx": { + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/header/account-setting/model-provider-page/model-parameter-modal/model-display.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/header/account-setting/model-provider-page/model-parameter-modal/status-indicators.tsx": { + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/header/account-setting/model-provider-page/provider-added-card/cooldown-timer.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 2 + }, + "react-hooks/immutability": { + "count": 1 + }, + "react-hooks/purity": { + "count": 1 + } + }, + "app/components/header/account-setting/model-provider-page/provider-added-card/credential-panel.tsx": { + "react-hooks/preserve-manual-memoization": { + "count": 2 + }, + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/header/account-setting/model-provider-page/provider-added-card/index.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/header/account-setting/model-provider-page/provider-added-card/model-load-balancing-configs.tsx": { + "ts/no-explicit-any": { + "count": 5 + } + }, + "app/components/header/account-setting/model-provider-page/provider-added-card/model-load-balancing-modal.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 1 + }, + "ts/no-explicit-any": { + "count": 3 + } + }, + "app/components/header/account-setting/model-provider-page/utils.ts": { + "ts/no-explicit-any": { + "count": 5 + } + }, + "app/components/header/account-setting/plugin-page/utils.ts": { + "ts/no-explicit-any": { + "count": 4 + } + }, + "app/components/header/app-nav/index.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 2 + }, + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/header/dataset-nav/index.tsx": { + "react-hooks/preserve-manual-memoization": { + "count": 6 + } + }, + "app/components/header/header-wrapper.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/header/nav/nav-selector/index.tsx": { + "react-hooks/use-memo": { + "count": 1 + } + }, + "app/components/plugins/install-plugin/hooks.ts": { + "ts/no-explicit-any": { + "count": 4 + } + }, + "app/components/plugins/install-plugin/install-bundle/item/github-item.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 1 + } + }, + "app/components/plugins/install-plugin/install-bundle/steps/install-multi.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 5 + }, + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/plugins/install-plugin/install-bundle/steps/install.tsx": { + "react-hooks/preserve-manual-memoization": { + "count": 1 + } + }, + "app/components/plugins/install-plugin/install-from-github/index.tsx": { + "ts/no-explicit-any": { + "count": 3 + } + }, + "app/components/plugins/install-plugin/install-from-github/steps/selectPackage.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/plugins/install-plugin/install-from-local-package/steps/uploading.tsx": { + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/plugins/install-plugin/install-from-marketplace/steps/install.spec.tsx": { + "ts/no-explicit-any": { + "count": 3 + }, + "unused-imports/no-unused-vars": { + "count": 2 + } + }, + "app/components/plugins/marketplace/sort-dropdown/index.spec.tsx": { + "unused-imports/no-unused-vars": { + "count": 1 + } + }, + "app/components/plugins/plugin-auth/authorize/add-oauth-button.tsx": { + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/plugins/plugin-auth/authorize/api-key-modal.tsx": { + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/plugins/plugin-auth/authorize/oauth-client-settings.tsx": { + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/plugins/plugin-auth/authorized-in-node.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/plugins/plugin-auth/authorized/index.tsx": { + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/plugins/plugin-auth/authorized/item.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/plugins/plugin-auth/hooks/use-plugin-auth-action.ts": { + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/plugins/plugin-auth/plugin-auth-in-agent.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/plugins/plugin-auth/types.ts": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/plugins/plugin-auth/utils.ts": { + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/plugins/plugin-detail-panel/agent-strategy-list.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/plugins/plugin-detail-panel/app-selector/app-inputs-form.tsx": { + "ts/no-explicit-any": { + "count": 8 + } + }, + "app/components/plugins/plugin-detail-panel/app-selector/app-inputs-panel.tsx": { + "ts/no-explicit-any": { + "count": 8 + } + }, + "app/components/plugins/plugin-detail-panel/app-selector/index.tsx": { + "ts/no-explicit-any": { + "count": 5 + } + }, + "app/components/plugins/plugin-detail-panel/datasource-action-list.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/plugins/plugin-detail-panel/detail-header.tsx": { + "react-hooks/preserve-manual-memoization": { + "count": 1 + } + }, + "app/components/plugins/plugin-detail-panel/endpoint-card.tsx": { + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/plugins/plugin-detail-panel/endpoint-list.tsx": { + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/plugins/plugin-detail-panel/endpoint-modal.tsx": { + "ts/no-explicit-any": { + "count": 7 + } + }, + "app/components/plugins/plugin-detail-panel/model-list.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/plugins/plugin-detail-panel/model-selector/index.tsx": { + "ts/no-explicit-any": { + "count": 3 + } + }, + "app/components/plugins/plugin-detail-panel/model-selector/tts-params-panel.tsx": { + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/plugins/plugin-detail-panel/multiple-tool-selector/index.spec.tsx": { + "ts/no-explicit-any": { + "count": 5 + }, + "unused-imports/no-unused-vars": { + "count": 2 + } + }, + "app/components/plugins/plugin-detail-panel/multiple-tool-selector/index.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/plugins/plugin-detail-panel/strategy-detail.tsx": { + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/plugins/plugin-detail-panel/subscription-list/create/common-modal.tsx": { + "react-hooks/preserve-manual-memoization": { + "count": 1 + } + }, + "app/components/plugins/plugin-detail-panel/subscription-list/create/index.tsx": { + "react-hooks/preserve-manual-memoization": { + "count": 1 + }, + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/plugins/plugin-detail-panel/subscription-list/create/oauth-client.tsx": { + "react-hooks/immutability": { + "count": 1 + } + }, + "app/components/plugins/plugin-detail-panel/subscription-list/delete-confirm.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/plugins/plugin-detail-panel/subscription-list/log-viewer.tsx": { + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/plugins/plugin-detail-panel/tool-selector/index.tsx": { + "ts/no-explicit-any": { + "count": 15 + } + }, + "app/components/plugins/plugin-detail-panel/tool-selector/reasoning-config-form.tsx": { + "ts/no-explicit-any": { + "count": 24 + } + }, + "app/components/plugins/plugin-detail-panel/tool-selector/tool-credentials-form.tsx": { + "ts/no-explicit-any": { + "count": 3 + } + }, + "app/components/plugins/plugin-detail-panel/tool-selector/tool-item.tsx": { + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/plugins/plugin-detail-panel/trigger/event-detail-drawer.tsx": { + "ts/no-explicit-any": { + "count": 5 + } + }, + "app/components/plugins/plugin-item/action.spec.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/plugins/plugin-item/index.spec.tsx": { + "ts/no-explicit-any": { + "count": 10 + } + }, + "app/components/plugins/plugin-item/index.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/plugins/plugin-mutation-model/index.spec.tsx": { + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/plugins/plugin-page/context.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/plugins/plugin-page/empty/index.spec.tsx": { + "ts/no-explicit-any": { + "count": 7 + } + }, + "app/components/plugins/plugin-page/empty/index.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 2 + } + }, + "app/components/plugins/plugin-page/install-plugin-dropdown.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 2 + } + }, + "app/components/plugins/plugin-page/list/index.spec.tsx": { + "ts/no-explicit-any": { + "count": 4 + } + }, + "app/components/plugins/plugin-page/plugin-tasks/index.spec.tsx": { + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/plugins/reference-setting-modal/auto-update-setting/index.spec.tsx": { + "ts/no-explicit-any": { + "count": 7 + } + }, + "app/components/plugins/reference-setting-modal/index.spec.tsx": { + "ts/no-explicit-any": { + "count": 7 + } + }, + "app/components/plugins/types.ts": { + "ts/no-explicit-any": { + "count": 30 + } + }, + "app/components/plugins/update-plugin/index.spec.tsx": { + "ts/no-explicit-any": { + "count": 5 + } + }, + "app/components/rag-pipeline/components/panel/input-field/editor/form/hidden-fields.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/rag-pipeline/components/panel/input-field/editor/form/hooks.ts": { + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/rag-pipeline/components/panel/input-field/editor/form/initial-fields.tsx": { + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/rag-pipeline/components/panel/input-field/editor/form/show-all-settings.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/rag-pipeline/components/panel/input-field/editor/form/types.ts": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/rag-pipeline/components/panel/input-field/field-list/hooks.ts": { + "react-hooks/preserve-manual-memoization": { + "count": 3 + } + }, + "app/components/rag-pipeline/components/panel/input-field/field-list/index.spec.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/rag-pipeline/components/panel/input-field/hooks.ts": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 1 + } + }, + "app/components/rag-pipeline/components/panel/input-field/index.tsx": { + "react-hooks/refs": { + "count": 3 + } + }, + "app/components/rag-pipeline/components/panel/test-run/header.tsx": { + "react-hooks/preserve-manual-memoization": { + "count": 1 + } + }, + "app/components/rag-pipeline/components/panel/test-run/preparation/document-processing/index.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/rag-pipeline/components/panel/test-run/preparation/document-processing/options.tsx": { + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/rag-pipeline/components/panel/test-run/preparation/index.tsx": { + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/rag-pipeline/components/panel/test-run/result/index.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/rag-pipeline/components/panel/test-run/result/result-preview/index.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/rag-pipeline/components/panel/test-run/result/result-preview/utils.ts": { + "ts/no-explicit-any": { + "count": 4 + } + }, + "app/components/rag-pipeline/components/rag-pipeline-children.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/rag-pipeline/components/rag-pipeline-header/run-mode.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/rag-pipeline/components/rag-pipeline-main.tsx": { + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/rag-pipeline/components/update-dsl-modal.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/rag-pipeline/hooks/use-DSL.ts": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/rag-pipeline/hooks/use-available-nodes-meta-data.ts": { + "react-hooks/preserve-manual-memoization": { + "count": 1 + } + }, + "app/components/rag-pipeline/hooks/use-configs-map.ts": { + "react-hooks/preserve-manual-memoization": { + "count": 1 + } + }, + "app/components/rag-pipeline/hooks/use-input-fields.ts": { + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/rag-pipeline/hooks/use-nodes-sync-draft.ts": { + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/rag-pipeline/hooks/use-pipeline-config.ts": { + "ts/no-explicit-any": { + "count": 4 + } + }, + "app/components/rag-pipeline/hooks/use-pipeline-init.ts": { + "react-hooks/immutability": { + "count": 1 + }, + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/rag-pipeline/hooks/use-pipeline-run.ts": { + "react-hooks/preserve-manual-memoization": { + "count": 2 + }, + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/rag-pipeline/hooks/use-pipeline-start-run.tsx": { + "react-hooks/preserve-manual-memoization": { + "count": 1 + } + }, + "app/components/rag-pipeline/index.spec.tsx": { + "ts/no-explicit-any": { + "count": 8 + } + }, + "app/components/rag-pipeline/store/index.ts": { + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/rag-pipeline/utils/nodes.ts": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/share/text-generation/index.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 1 + }, + "ts/no-explicit-any": { + "count": 8 + } + }, + "app/components/share/text-generation/menu-dropdown.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 1 + } + }, + "app/components/share/text-generation/no-data/index.tsx": { + "ts/no-empty-object-type": { + "count": 1 + } + }, + "app/components/share/text-generation/result/index.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 3 + }, + "ts/no-explicit-any": { + "count": 3 + } + }, + "app/components/share/text-generation/run-batch/csv-download/index.spec.tsx": { + "react-hooks/globals": { + "count": 1 + } + }, + "app/components/share/text-generation/run-batch/csv-reader/index.spec.tsx": { + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/share/text-generation/run-batch/csv-reader/index.tsx": { + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/share/text-generation/run-batch/res-download/index.spec.tsx": { + "react-hooks/globals": { + "count": 1 + } + }, + "app/components/share/text-generation/run-once/index.spec.tsx": { + "react-hooks/globals": { + "count": 1 + }, + "ts/no-explicit-any": { + "count": 4 + } + }, + "app/components/share/text-generation/run-once/index.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 1 + }, + "ts/no-explicit-any": { + "count": 8 + } + }, + "app/components/share/utils.ts": { + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/tools/edit-custom-collection-modal/get-schema.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/tools/edit-custom-collection-modal/index.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 4 + }, + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/tools/edit-custom-collection-modal/test-api.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/tools/mcp/create-card.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/tools/mcp/detail/content.tsx": { + "ts/no-explicit-any": { + "count": 3 + } + }, + "app/components/tools/mcp/detail/operation-dropdown.tsx": { + "react-hooks/preserve-manual-memoization": { + "count": 1 + } + }, + "app/components/tools/mcp/mcp-server-modal.tsx": { + "ts/no-explicit-any": { + "count": 5 + } + }, + "app/components/tools/mcp/mcp-server-param-item.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/tools/mcp/mcp-service-card.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 1 + }, + "ts/no-explicit-any": { + "count": 4 + } + }, + "app/components/tools/mcp/modal.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 20 + } + }, + "app/components/tools/mcp/provider-card.tsx": { + "ts/no-explicit-any": { + "count": 3 + } + }, + "app/components/tools/provider-list.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/tools/provider/custom-create-card.tsx": { + "react-hooks/preserve-manual-memoization": { + "count": 1 + } + }, + "app/components/tools/provider/empty.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/tools/setting/build-in/config-credentials.tsx": { + "ts/no-explicit-any": { + "count": 3 + } + }, + "app/components/tools/types.ts": { + "ts/no-explicit-any": { + "count": 4 + } + }, + "app/components/tools/utils/to-form-schema.ts": { + "ts/no-explicit-any": { + "count": 15 + } + }, + "app/components/tools/workflow-tool/configure-button.tsx": { + "react-hooks/preserve-manual-memoization": { + "count": 2 + } + }, + "app/components/tools/workflow-tool/index.tsx": { + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/workflow-app/components/workflow-children.tsx": { + "no-console": { + "count": 1 + }, + "ts/no-explicit-any": { + "count": 3 + } + }, + "app/components/workflow-app/components/workflow-header/features-trigger.tsx": { + "react-hooks/preserve-manual-memoization": { + "count": 1 + } + }, + "app/components/workflow-app/components/workflow-main.tsx": { + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/workflow-app/components/workflow-onboarding-modal/index.spec.tsx": { + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/workflow-app/components/workflow-onboarding-modal/start-node-selection-panel.spec.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/workflow-app/hooks/use-DSL.ts": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/workflow-app/hooks/use-configs-map.ts": { + "react-hooks/preserve-manual-memoization": { + "count": 1 + } + }, + "app/components/workflow-app/hooks/use-nodes-sync-draft.ts": { + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/workflow-app/hooks/use-workflow-init.ts": { + "react-hooks/immutability": { + "count": 1 + }, + "ts/no-explicit-any": { + "count": 3 + } + }, + "app/components/workflow-app/hooks/use-workflow-refresh-draft.ts": { + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/workflow-app/hooks/use-workflow-run.ts": { + "react-hooks/preserve-manual-memoization": { + "count": 1 + }, + "ts/no-explicit-any": { + "count": 13 + } + }, + "app/components/workflow-app/hooks/use-workflow-template.ts": { + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/workflow-app/index.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/workflow-app/store/workflow/workflow-slice.ts": { + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/workflow/__tests__/trigger-status-sync.test.tsx": { + "react-hooks/use-memo": { + "count": 1 + }, + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/workflow/block-selector/all-start-blocks.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 1 + } + }, + "app/components/workflow/block-selector/data-sources.tsx": { + "react-hooks/refs": { + "count": 2 + } + }, + "app/components/workflow/block-selector/featured-tools.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 2 + }, + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/workflow/block-selector/featured-triggers.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 2 + }, + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/workflow/block-selector/hooks.ts": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 1 + } + }, + "app/components/workflow/block-selector/market-place-plugin/action.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 1 + } + }, + "app/components/workflow/block-selector/rag-tool-recommendations/index.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 1 + } + }, + "app/components/workflow/block-selector/tool/tool-list-flat-view/list.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/workflow/block-selector/tool/tool.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 2 + }, + "react-hooks/preserve-manual-memoization": { + "count": 4 + } + }, + "app/components/workflow/block-selector/trigger-plugin/action-item.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/workflow/block-selector/trigger-plugin/item.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 2 + }, + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/workflow/block-selector/use-check-vertical-scrollbar.ts": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 1 + } + }, + "app/components/workflow/candidate-node-main.tsx": { + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/workflow/context.tsx": { + "react-hooks/refs": { + "count": 2 + } + }, + "app/components/workflow/datasets-detail-store/provider.tsx": { + "react-hooks/refs": { + "count": 2 + } + }, + "app/components/workflow/header/header-in-normal.tsx": { + "react-hooks/preserve-manual-memoization": { + "count": 1 + } + }, + "app/components/workflow/header/run-mode.tsx": { + "no-console": { + "count": 1 + }, + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/workflow/header/view-workflow-history.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/workflow/hooks-store/provider.tsx": { + "react-hooks/refs": { + "count": 2 + } + }, + "app/components/workflow/hooks-store/store.ts": { + "ts/no-explicit-any": { + "count": 6 + } + }, + "app/components/workflow/hooks/use-checklist.ts": { + "ts/no-empty-object-type": { + "count": 2 + }, + "ts/no-explicit-any": { + "count": 4 + } + }, + "app/components/workflow/hooks/use-dynamic-test-run-options.tsx": { + "ts/no-explicit-any": { + "count": 3 + } + }, + "app/components/workflow/hooks/use-helpline.ts": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/workflow/hooks/use-inspect-vars-crud-common.ts": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/workflow/hooks/use-node-data-update.ts": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/workflow/hooks/use-nodes-interactions.ts": { + "react-hooks/immutability": { + "count": 1 + }, + "ts/no-explicit-any": { + "count": 8 + } + }, + "app/components/workflow/hooks/use-nodes-layout.ts": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/workflow/hooks/use-serial-async-callback.ts": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/workflow/hooks/use-workflow-interactions.ts": { + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/workflow/hooks/use-workflow-run-event/use-workflow-agent-log.ts": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/workflow/hooks/use-workflow-run-event/use-workflow-finished.ts": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/workflow/hooks/use-workflow-search.tsx": { + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/workflow/hooks/use-workflow-variables.ts": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/workflow/index.tsx": { + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/workflow/nodes/_base/components/add-variable-popup-with-position.tsx": { + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/workflow/nodes/_base/components/agent-strategy-selector.tsx": { + "ts/no-explicit-any": { + "count": 4 + } + }, + "app/components/workflow/nodes/_base/components/agent-strategy.tsx": { + "ts/no-empty-object-type": { + "count": 1 + }, + "ts/no-explicit-any": { + "count": 4 + } + }, + "app/components/workflow/nodes/_base/components/before-run-form/form-item.tsx": { + "ts/no-explicit-any": { + "count": 11 + } + }, + "app/components/workflow/nodes/_base/components/before-run-form/form.tsx": { + "ts/no-explicit-any": { + "count": 3 + } + }, + "app/components/workflow/nodes/_base/components/before-run-form/index.tsx": { + "ts/no-explicit-any": { + "count": 8 + } + }, + "app/components/workflow/nodes/_base/components/editor/code-editor/editor-support-vars.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 1 + }, + "ts/no-explicit-any": { + "count": 6 + } + }, + "app/components/workflow/nodes/_base/components/editor/code-editor/index.tsx": { + "ts/no-explicit-any": { + "count": 6 + } + }, + "app/components/workflow/nodes/_base/components/error-handle/default-value.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/workflow/nodes/_base/components/error-handle/types.ts": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/workflow/nodes/_base/components/form-input-item.tsx": { + "ts/no-explicit-any": { + "count": 33 + } + }, + "app/components/workflow/nodes/_base/components/input-support-select-var.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/workflow/nodes/_base/components/input-var-type-icon.tsx": { + "react-hooks/static-components": { + "count": 1 + }, + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/workflow/nodes/_base/components/memory-config.tsx": { + "unicorn/prefer-number-properties": { + "count": 1 + } + }, + "app/components/workflow/nodes/_base/components/mixed-variable-text-input/index.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/workflow/nodes/_base/components/mixed-variable-text-input/placeholder.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/workflow/nodes/_base/components/next-step/add.tsx": { + "react-hooks/preserve-manual-memoization": { + "count": 2 + } + }, + "app/components/workflow/nodes/_base/components/node-handle.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 1 + } + }, + "app/components/workflow/nodes/_base/components/prompt/editor.tsx": { + "ts/no-explicit-any": { + "count": 4 + } + }, + "app/components/workflow/nodes/_base/components/readonly-input-with-select-var.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/workflow/nodes/_base/components/selector.tsx": { + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/workflow/nodes/_base/components/setting-item.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/workflow/nodes/_base/components/toggle-expand-btn.tsx": { + "react-hooks/preserve-manual-memoization": { + "count": 1 + } + }, + "app/components/workflow/nodes/_base/components/variable/match-schema-type.ts": { + "ts/no-explicit-any": { + "count": 8 + } + }, + "app/components/workflow/nodes/_base/components/variable/output-var-list.tsx": { + "react-hooks/preserve-manual-memoization": { + "count": 1 + } + }, + "app/components/workflow/nodes/_base/components/variable/utils.ts": { + "ts/no-explicit-any": { + "count": 32 + } + }, + "app/components/workflow/nodes/_base/components/variable/var-list.tsx": { + "react-hooks/preserve-manual-memoization": { + "count": 1 + } + }, + "app/components/workflow/nodes/_base/components/variable/var-reference-picker.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 2 + }, + "ts/no-explicit-any": { + "count": 3 + } + }, + "app/components/workflow/nodes/_base/components/variable/variable-label/base/variable-icon.tsx": { + "react-hooks/static-components": { + "count": 1 + } + }, + "app/components/workflow/nodes/_base/components/variable/variable-label/hooks.ts": { + "react-hooks/use-memo": { + "count": 2 + } + }, + "app/components/workflow/nodes/_base/components/workflow-panel/index.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 3 + }, + "react-hooks/preserve-manual-memoization": { + "count": 1 + }, + "ts/no-explicit-any": { + "count": 6 + } + }, + "app/components/workflow/nodes/_base/components/workflow-panel/last-run/index.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 7 + }, + "ts/no-explicit-any": { + "count": 5 + } + }, + "app/components/workflow/nodes/_base/components/workflow-panel/last-run/use-last-run.ts": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 1 + }, + "react-hooks/preserve-manual-memoization": { + "count": 3 + }, + "ts/no-explicit-any": { + "count": 7 + } + }, + "app/components/workflow/nodes/_base/components/workflow-panel/tab.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/workflow/nodes/_base/hooks/use-one-step-run.ts": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 2 + }, + "ts/no-explicit-any": { + "count": 22 + } + }, + "app/components/workflow/nodes/_base/hooks/use-output-var-list.ts": { + "ts/no-explicit-any": { + "count": 8 + } + }, + "app/components/workflow/nodes/_base/hooks/use-toggle-expend.ts": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 1 + }, + "react-hooks/refs": { + "count": 2 + } + }, + "app/components/workflow/nodes/_base/hooks/use-var-list.ts": { + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/workflow/nodes/_base/node.tsx": { + "ts/no-explicit-any": { + "count": 3 + } + }, + "app/components/workflow/nodes/_base/types.ts": { + "ts/no-explicit-any": { + "count": 3 + } + }, + "app/components/workflow/nodes/agent/components/model-bar.tsx": { + "ts/no-empty-object-type": { + "count": 1 + } + }, + "app/components/workflow/nodes/agent/default.ts": { + "ts/no-explicit-any": { + "count": 3 + } + }, + "app/components/workflow/nodes/agent/node.tsx": { + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/workflow/nodes/agent/panel.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/workflow/nodes/agent/types.ts": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/workflow/nodes/agent/use-config.ts": { + "ts/no-explicit-any": { + "count": 7 + } + }, + "app/components/workflow/nodes/agent/use-single-run-form-params.ts": { + "ts/no-explicit-any": { + "count": 3 + } + }, + "app/components/workflow/nodes/answer/default.ts": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/workflow/nodes/assigner/default.ts": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/workflow/nodes/assigner/hooks.ts": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/workflow/nodes/assigner/types.ts": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/workflow/nodes/assigner/use-single-run-form-params.ts": { + "ts/no-explicit-any": { + "count": 3 + } + }, + "app/components/workflow/nodes/assigner/utils.ts": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/workflow/nodes/code/default.ts": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/workflow/nodes/code/use-config.ts": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 2 + }, + "regexp/no-useless-assertions": { + "count": 2 + }, + "ts/no-explicit-any": { + "count": 6 + } + }, + "app/components/workflow/nodes/code/use-single-run-form-params.ts": { + "ts/no-explicit-any": { + "count": 5 + } + }, + "app/components/workflow/nodes/components.ts": { + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/workflow/nodes/data-source-empty/hooks.ts": { + "react-hooks/preserve-manual-memoization": { + "count": 3 + }, + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/workflow/nodes/data-source-empty/index.tsx": { + "react-hooks/preserve-manual-memoization": { + "count": 1 + } + }, + "app/components/workflow/nodes/data-source/default.ts": { + "ts/no-explicit-any": { + "count": 5 + } + }, + "app/components/workflow/nodes/data-source/hooks/use-before-run-form.ts": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/workflow/nodes/data-source/hooks/use-config.ts": { + "ts/no-explicit-any": { + "count": 6 + } + }, + "app/components/workflow/nodes/data-source/panel.tsx": { + "style/multiline-ternary": { + "count": 2 + }, + "ts/no-explicit-any": { + "count": 3 + } + }, + "app/components/workflow/nodes/data-source/types.ts": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/workflow/nodes/data-source/utils.ts": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/workflow/nodes/document-extractor/default.ts": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/workflow/nodes/document-extractor/use-single-run-form-params.ts": { + "ts/no-explicit-any": { + "count": 4 + } + }, + "app/components/workflow/nodes/end/default.ts": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/workflow/nodes/end/node.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/workflow/nodes/http/components/key-value/key-value-edit/index.tsx": { + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/workflow/nodes/http/components/key-value/key-value-edit/item.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/workflow/nodes/http/default.ts": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/workflow/nodes/http/use-config.ts": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 1 + }, + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/workflow/nodes/http/use-single-run-form-params.ts": { + "ts/no-explicit-any": { + "count": 5 + } + }, + "app/components/workflow/nodes/if-else/components/condition-list/condition-input.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/workflow/nodes/if-else/components/condition-list/condition-item.tsx": { + "react-hooks/preserve-manual-memoization": { + "count": 1 + } + }, + "app/components/workflow/nodes/if-else/default.ts": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/workflow/nodes/if-else/use-single-run-form-params.ts": { + "ts/no-explicit-any": { + "count": 5 + } + }, + "app/components/workflow/nodes/index.tsx": { + "react-hooks/static-components": { + "count": 1 + } + }, + "app/components/workflow/nodes/iteration/default.ts": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/workflow/nodes/iteration/node.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 1 + } + }, + "app/components/workflow/nodes/iteration/use-interactions.ts": { + "react-hooks/preserve-manual-memoization": { + "count": 1 + } + }, + "app/components/workflow/nodes/iteration/use-single-run-form-params.ts": { + "ts/no-explicit-any": { + "count": 6 + } + }, + "app/components/workflow/nodes/knowledge-base/components/retrieval-setting/hooks.tsx": { + "ts/no-explicit-any": { + "count": 4 + } + }, + "app/components/workflow/nodes/knowledge-base/components/retrieval-setting/top-k-and-score-threshold.tsx": { + "unicorn/prefer-number-properties": { + "count": 1 + } + }, + "app/components/workflow/nodes/knowledge-base/components/retrieval-setting/type.ts": { + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/workflow/nodes/knowledge-base/use-single-run-form-params.ts": { + "ts/no-explicit-any": { + "count": 3 + } + }, + "app/components/workflow/nodes/knowledge-retrieval/components/metadata/condition-list/condition-item.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/workflow/nodes/knowledge-retrieval/default.ts": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/workflow/nodes/knowledge-retrieval/node.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 2 + } + }, + "app/components/workflow/nodes/knowledge-retrieval/types.ts": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/workflow/nodes/knowledge-retrieval/use-config.ts": { + "ts/no-explicit-any": { + "count": 3 + } + }, + "app/components/workflow/nodes/knowledge-retrieval/use-single-run-form-params.ts": { + "react-hooks/refs": { + "count": 3 + }, + "ts/no-explicit-any": { + "count": 5 + } + }, + "app/components/workflow/nodes/list-operator/components/filter-condition.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/workflow/nodes/list-operator/components/sub-variable-picker.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/workflow/nodes/list-operator/default.ts": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/workflow/nodes/llm/components/config-prompt-item.tsx": { + "ts/no-explicit-any": { + "count": 3 + } + }, + "app/components/workflow/nodes/llm/components/config-prompt.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/workflow/nodes/llm/components/json-schema-config-modal/code-editor.tsx": { + "react-hooks/preserve-manual-memoization": { + "count": 2 + }, + "ts/no-explicit-any": { + "count": 4 + } + }, + "app/components/workflow/nodes/llm/components/json-schema-config-modal/json-importer.tsx": { + "ts/no-explicit-any": { + "count": 3 + } + }, + "app/components/workflow/nodes/llm/components/json-schema-config-modal/json-schema-generator/generated-result.tsx": { + "style/multiline-ternary": { + "count": 2 + } + }, + "app/components/workflow/nodes/llm/components/json-schema-config-modal/json-schema-generator/index.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 2 + } + }, + "app/components/workflow/nodes/llm/components/json-schema-config-modal/visual-editor/context.tsx": { + "react-hooks/refs": { + "count": 2 + } + }, + "app/components/workflow/nodes/llm/components/json-schema-config-modal/visual-editor/edit-card/auto-width-input.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 1 + } + }, + "app/components/workflow/nodes/llm/components/json-schema-config-modal/visual-editor/hooks.ts": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/workflow/nodes/llm/components/structure-output.tsx": { + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/workflow/nodes/llm/default.ts": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/workflow/nodes/llm/use-config.ts": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 2 + }, + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/workflow/nodes/llm/use-single-run-form-params.ts": { + "react-hooks/refs": { + "count": 3 + }, + "ts/no-explicit-any": { + "count": 9 + } + }, + "app/components/workflow/nodes/llm/utils.ts": { + "ts/no-explicit-any": { + "count": 10 + } + }, + "app/components/workflow/nodes/loop/components/condition-list/condition-input.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/workflow/nodes/loop/components/loop-variables/form-item.tsx": { + "ts/no-explicit-any": { + "count": 3 + } + }, + "app/components/workflow/nodes/loop/components/loop-variables/item.tsx": { + "react-hooks/preserve-manual-memoization": { + "count": 3 + }, + "ts/no-explicit-any": { + "count": 4 + } + }, + "app/components/workflow/nodes/loop/default.ts": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/workflow/nodes/loop/types.ts": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/workflow/nodes/loop/use-config.ts": { + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/workflow/nodes/loop/use-single-run-form-params.ts": { + "ts/no-explicit-any": { + "count": 4 + } + }, + "app/components/workflow/nodes/parameter-extractor/components/extract-parameter/update.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/workflow/nodes/parameter-extractor/default.ts": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/workflow/nodes/parameter-extractor/use-config.ts": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 2 + }, + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/workflow/nodes/parameter-extractor/use-single-run-form-params.ts": { + "react-hooks/refs": { + "count": 2 + }, + "ts/no-explicit-any": { + "count": 9 + } + }, + "app/components/workflow/nodes/question-classifier/components/class-item.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 1 + } + }, + "app/components/workflow/nodes/question-classifier/components/class-list.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 1 + } + }, + "app/components/workflow/nodes/question-classifier/default.ts": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/workflow/nodes/question-classifier/use-config.ts": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 2 + }, + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/workflow/nodes/question-classifier/use-single-run-form-params.ts": { + "react-hooks/refs": { + "count": 2 + }, + "ts/no-explicit-any": { + "count": 8 + } + }, + "app/components/workflow/nodes/start/components/var-list.tsx": { + "react-hooks/preserve-manual-memoization": { + "count": 1 + } + }, + "app/components/workflow/nodes/start/panel.tsx": { + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/workflow/nodes/start/use-config.ts": { + "react-hooks/preserve-manual-memoization": { + "count": 1 + }, + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/workflow/nodes/start/use-single-run-form-params.ts": { + "ts/no-explicit-any": { + "count": 3 + } + }, + "app/components/workflow/nodes/template-transform/default.ts": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/workflow/nodes/template-transform/use-config.ts": { + "ts/no-explicit-any": { + "count": 4 + } + }, + "app/components/workflow/nodes/template-transform/use-single-run-form-params.ts": { + "ts/no-explicit-any": { + "count": 5 + } + }, + "app/components/workflow/nodes/tool/__tests__/output-schema-utils.test.ts": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/workflow/nodes/tool/components/input-var-list.tsx": { + "ts/no-explicit-any": { + "count": 7 + } + }, + "app/components/workflow/nodes/tool/components/mixed-variable-text-input/index.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/workflow/nodes/tool/components/mixed-variable-text-input/placeholder.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/workflow/nodes/tool/components/tool-form/index.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/workflow/nodes/tool/components/tool-form/item.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/workflow/nodes/tool/default.ts": { + "ts/no-explicit-any": { + "count": 7 + } + }, + "app/components/workflow/nodes/tool/output-schema-utils.ts": { + "ts/no-explicit-any": { + "count": 4 + } + }, + "app/components/workflow/nodes/tool/panel.tsx": { + "style/multiline-ternary": { + "count": 2 + }, + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/workflow/nodes/tool/types.ts": { + "ts/no-explicit-any": { + "count": 3 + } + }, + "app/components/workflow/nodes/tool/use-config.ts": { + "ts/no-explicit-any": { + "count": 6 + } + }, + "app/components/workflow/nodes/tool/use-single-run-form-params.ts": { + "ts/no-explicit-any": { + "count": 6 + } + }, + "app/components/workflow/nodes/trigger-plugin/components/trigger-form/index.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/workflow/nodes/trigger-plugin/components/trigger-form/item.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/workflow/nodes/trigger-plugin/default.ts": { + "ts/no-explicit-any": { + "count": 11 + } + }, + "app/components/workflow/nodes/trigger-plugin/node.tsx": { + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/workflow/nodes/trigger-plugin/panel.tsx": { + "ts/no-explicit-any": { + "count": 3 + } + }, + "app/components/workflow/nodes/trigger-plugin/types.ts": { + "ts/no-explicit-any": { + "count": 4 + } + }, + "app/components/workflow/nodes/trigger-plugin/use-config.ts": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/workflow/nodes/trigger-plugin/utils/__tests__/form-helpers.test.ts": { + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/workflow/nodes/trigger-plugin/utils/form-helpers.ts": { + "ts/no-explicit-any": { + "count": 7 + } + }, + "app/components/workflow/nodes/trigger-schedule/default.ts": { + "regexp/no-unused-capturing-group": { + "count": 2 + }, + "ts/no-explicit-any": { + "count": 10 + } + }, + "app/components/workflow/nodes/trigger-webhook/default.ts": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/workflow/nodes/utils.ts": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/workflow/nodes/variable-assigner/components/var-group-item.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/workflow/nodes/variable-assigner/default.ts": { + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/workflow/nodes/variable-assigner/use-single-run-form-params.ts": { + "ts/no-explicit-any": { + "count": 5 + } + }, + "app/components/workflow/note-node/index.tsx": { + "react-hooks/refs": { + "count": 1 + } + }, + "app/components/workflow/note-node/note-editor/context.tsx": { + "react-hooks/refs": { + "count": 2 + } + }, + "app/components/workflow/note-node/note-editor/plugins/link-editor-plugin/component.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 1 + }, + "react-hooks/refs": { + "count": 1 + } + }, + "app/components/workflow/note-node/note-editor/utils.ts": { + "regexp/no-useless-quantifier": { + "count": 1 + } + }, + "app/components/workflow/operator/add-block.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/workflow/operator/hooks.ts": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/workflow/panel/chat-record/index.tsx": { + "ts/no-explicit-any": { + "count": 8 + } + }, + "app/components/workflow/panel/chat-record/user-input.tsx": { + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/workflow/panel/chat-variable-panel/components/array-bool-list.tsx": { + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/workflow/panel/chat-variable-panel/components/array-value-list.tsx": { + "ts/no-explicit-any": { + "count": 4 + } + }, + "app/components/workflow/panel/chat-variable-panel/components/object-value-item.tsx": { + "ts/no-explicit-any": { + "count": 5 + }, + "unicorn/prefer-number-properties": { + "count": 2 + } + }, + "app/components/workflow/panel/chat-variable-panel/components/object-value-list.tsx": { + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/workflow/panel/chat-variable-panel/components/variable-modal.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 8 + }, + "ts/no-explicit-any": { + "count": 3 + } + }, + "app/components/workflow/panel/chat-variable-panel/components/variable-type-select.tsx": { + "ts/no-explicit-any": { + "count": 4 + } + }, + "app/components/workflow/panel/debug-and-preview/chat-wrapper.tsx": { + "ts/no-explicit-any": { + "count": 5 + } + }, + "app/components/workflow/panel/debug-and-preview/conversation-variable-modal.tsx": { + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/workflow/panel/debug-and-preview/hooks.ts": { + "react-hooks/purity": { + "count": 1 + }, + "ts/no-explicit-any": { + "count": 7 + } + }, + "app/components/workflow/panel/env-panel/variable-modal.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 4 + }, + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/workflow/panel/index.tsx": { + "react-hooks/use-memo": { + "count": 1 + } + }, + "app/components/workflow/panel/inputs-panel.tsx": { + "react-hooks/preserve-manual-memoization": { + "count": 1 + }, + "ts/no-explicit-any": { + "count": 4 + } + }, + "app/components/workflow/panel/version-history-panel/context-menu/use-context-menu.ts": { + "react-hooks/preserve-manual-memoization": { + "count": 1 + } + }, + "app/components/workflow/panel/version-history-panel/index.spec.tsx": { + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/workflow/panel/workflow-preview.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 1 + }, + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/workflow/run/hooks.ts": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/workflow/run/index.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 2 + } + }, + "app/components/workflow/run/iteration-log/iteration-log-trigger.tsx": { + "ts/no-explicit-any": { + "count": 1 + }, + "unicorn/prefer-number-properties": { + "count": 1 + } + }, + "app/components/workflow/run/loop-log/loop-log-trigger.tsx": { + "unicorn/prefer-number-properties": { + "count": 1 + } + }, + "app/components/workflow/run/node.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 1 + } + }, + "app/components/workflow/run/output-panel.tsx": { + "ts/no-explicit-any": { + "count": 3 + } + }, + "app/components/workflow/run/result-panel.tsx": { + "ts/no-explicit-any": { + "count": 4 + } + }, + "app/components/workflow/run/result-text.tsx": { + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/workflow/run/utils/format-log/agent/index.spec.ts": { + "ts/no-explicit-any": { + "count": 3 + } + }, + "app/components/workflow/run/utils/format-log/agent/index.ts": { + "ts/no-explicit-any": { + "count": 11 + } + }, + "app/components/workflow/run/utils/format-log/graph-to-log-struct.ts": { + "ts/no-explicit-any": { + "count": 7 + } + }, + "app/components/workflow/run/utils/format-log/index.ts": { + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/workflow/run/utils/format-log/iteration/index.spec.ts": { + "ts/no-explicit-any": { + "count": 3 + } + }, + "app/components/workflow/run/utils/format-log/iteration/index.ts": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/workflow/run/utils/format-log/loop/index.spec.ts": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/workflow/run/utils/format-log/loop/index.ts": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/workflow/run/utils/format-log/parallel/index.ts": { + "no-console": { + "count": 4 + }, + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/workflow/run/utils/format-log/retry/index.spec.ts": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/workflow/selection-contextmenu.tsx": { + "ts/no-explicit-any": { + "count": 4 + } + }, + "app/components/workflow/store/workflow/debug/inspect-vars-slice.ts": { + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/workflow/store/workflow/workflow-draft-slice.ts": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/workflow/types.ts": { + "ts/no-empty-object-type": { + "count": 3 + }, + "ts/no-explicit-any": { + "count": 8 + } + }, + "app/components/workflow/update-dsl-modal.tsx": { + "react-hooks/preserve-manual-memoization": { + "count": 1 + }, + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/workflow/utils/data-source.ts": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/workflow/utils/debug.ts": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/workflow/utils/node-navigation.ts": { + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/workflow/utils/node.ts": { + "regexp/no-super-linear-backtracking": { + "count": 1 + } + }, + "app/components/workflow/utils/tool.ts": { + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/workflow/utils/workflow-init.ts": { + "ts/no-explicit-any": { + "count": 12 + } + }, + "app/components/workflow/utils/workflow.ts": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/workflow/variable-inspect/display-content.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/workflow/variable-inspect/group.tsx": { + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/workflow/variable-inspect/left.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/workflow/variable-inspect/listening.tsx": { + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/workflow/variable-inspect/panel.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/workflow/variable-inspect/right.tsx": { + "react-hooks/preserve-manual-memoization": { + "count": 1 + }, + "ts/no-explicit-any": { + "count": 3 + } + }, + "app/components/workflow/variable-inspect/trigger.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/workflow/variable-inspect/utils.tsx": { + "ts/no-explicit-any": { + "count": 2 + } + }, + "app/components/workflow/variable-inspect/value-content.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 5 + }, + "regexp/no-super-linear-backtracking": { + "count": 1 + }, + "regexp/no-unused-capturing-group": { + "count": 2 + }, + "ts/no-explicit-any": { + "count": 8 + } + }, + "app/components/workflow/workflow-preview/components/nodes/constants.ts": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/components/workflow/workflow-preview/components/note-node/index.tsx": { + "react-hooks/refs": { + "count": 1 + } + }, + "app/education-apply/hooks.ts": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 5 + } + }, + "app/education-apply/search-input.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/education-apply/verify-state-modal.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 1 + } + }, + "app/forgot-password/ForgotPasswordForm.spec.tsx": { + "ts/no-explicit-any": { + "count": 5 + } + }, + "app/init/InitPasswordPopup.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/install/installForm.spec.tsx": { + "ts/no-explicit-any": { + "count": 7 + } + }, + "app/reset-password/layout.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/signin/components/mail-and-password-auth.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/signin/invite-settings/page.tsx": { + "react-hooks/preserve-manual-memoization": { + "count": 1 + } + }, + "app/signin/layout.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/signin/one-more-step.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/signup/layout.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "app/signup/set-password/page.tsx": { + "react-hooks/preserve-manual-memoization": { + "count": 2 + } + }, + "context/app-context.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "context/hooks/use-trigger-events-limit-modal.ts": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 3 + } + }, + "context/modal-context.test.tsx": { + "ts/no-explicit-any": { + "count": 3 + } + }, + "context/modal-context.tsx": { + "ts/no-explicit-any": { + "count": 5 + } + }, + "context/provider-context.tsx": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "hooks/use-async-window-open.spec.ts": { + "ts/no-explicit-any": { + "count": 6 + } + }, + "hooks/use-format-time-from-now.spec.ts": { + "regexp/no-dupe-disjunctions": { + "count": 5 + }, + "ts/no-explicit-any": { + "count": 1 + } + }, + "hooks/use-metadata.ts": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "hooks/use-mitt.ts": { + "ts/no-explicit-any": { + "count": 2 + } + }, + "hooks/use-moderate.ts": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 1 + }, + "react-hooks/refs": { + "count": 1 + } + }, + "hooks/use-oauth.ts": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "hooks/use-pay.tsx": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 4 + } + }, + "i18n-config/README.md": { + "no-irregular-whitespace": { + "count": 1 + } + }, + "i18n/de-DE/billing.json": { + "no-irregular-whitespace": { + "count": 1 + } + }, + "i18n/en-US/app-debug.json": { + "no-irregular-whitespace": { + "count": 1 + } + }, + "i18n/en-US/common.json": { + "no-irregular-whitespace": { + "count": 3 + } + }, + "i18n/fr-FR/app-debug.json": { + "no-irregular-whitespace": { + "count": 1 + } + }, + "i18n/fr-FR/app.json": { + "no-irregular-whitespace": { + "count": 1 + } + }, + "i18n/fr-FR/plugin-trigger.json": { + "no-irregular-whitespace": { + "count": 1 + } + }, + "i18n/fr-FR/tools.json": { + "no-irregular-whitespace": { + "count": 1 + } + }, + "i18n/fr-FR/workflow.json": { + "no-irregular-whitespace": { + "count": 2 + } + }, + "i18n/pt-BR/common.json": { + "no-irregular-whitespace": { + "count": 1 + } + }, + "i18n/ru-RU/common.json": { + "no-irregular-whitespace": { + "count": 2 + } + }, + "i18n/uk-UA/app-debug.json": { + "no-irregular-whitespace": { + "count": 1 + } + }, + "middleware.ts": { + "node/prefer-global/buffer": { + "count": 1 + } + }, + "models/common.ts": { + "ts/no-explicit-any": { + "count": 3 + } + }, + "models/datasets.ts": { + "ts/no-explicit-any": { + "count": 5 + } + }, + "models/debug.ts": { + "ts/no-explicit-any": { + "count": 4 + } + }, + "models/log.ts": { + "ts/no-explicit-any": { + "count": 7 + } + }, + "models/pipeline.ts": { + "ts/no-explicit-any": { + "count": 6 + } + }, + "models/share.ts": { + "ts/no-empty-object-type": { + "count": 1 + }, + "ts/no-explicit-any": { + "count": 2 + } + }, + "scripts/analyze-component.js": { + "unused-imports/no-unused-vars": { + "count": 1 + } + }, + "scripts/component-analyzer.js": { + "regexp/no-unused-capturing-group": { + "count": 6 + } + }, + "scripts/optimize-standalone.js": { + "unused-imports/no-unused-vars": { + "count": 2 + } + }, + "service/annotation.ts": { + "ts/no-explicit-any": { + "count": 4 + } + }, + "service/apps.ts": { + "ts/no-explicit-any": { + "count": 17 + } + }, + "service/base.ts": { + "ts/no-explicit-any": { + "count": 3 + } + }, + "service/common.ts": { + "ts/no-explicit-any": { + "count": 29 + } + }, + "service/datasets.ts": { + "ts/no-explicit-any": { + "count": 8 + } + }, + "service/debug.ts": { + "ts/no-explicit-any": { + "count": 7 + } + }, + "service/explore.ts": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "service/fetch.ts": { + "regexp/no-unused-capturing-group": { + "count": 1 + }, + "ts/no-explicit-any": { + "count": 2 + } + }, + "service/share.ts": { + "ts/no-explicit-any": { + "count": 4 + } + }, + "service/tools.ts": { + "ts/no-explicit-any": { + "count": 2 + } + }, + "service/use-apps.ts": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "service/use-common.ts": { + "ts/no-empty-object-type": { + "count": 1 + }, + "ts/no-explicit-any": { + "count": 1 + } + }, + "service/use-endpoints.ts": { + "ts/no-explicit-any": { + "count": 7 + } + }, + "service/use-pipeline.ts": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "service/use-plugins-auth.ts": { + "ts/no-explicit-any": { + "count": 4 + } + }, + "service/use-plugins.ts": { + "react-hooks-extra/no-direct-set-state-in-use-effect": { + "count": 1 + }, + "regexp/no-unused-capturing-group": { + "count": 1 + }, + "ts/no-explicit-any": { + "count": 3 + } + }, + "service/use-tools.ts": { + "ts/no-explicit-any": { + "count": 2 + } + }, + "service/use-workflow.ts": { + "ts/no-explicit-any": { + "count": 2 + } + }, + "service/utils.spec.ts": { + "ts/no-explicit-any": { + "count": 2 + } + }, + "service/workflow-payload.ts": { + "ts/no-explicit-any": { + "count": 10 + } + }, + "testing/testing.md": { + "ts/no-explicit-any": { + "count": 2 + } + }, + "types/app.ts": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "types/assets.d.ts": { + "ts/no-explicit-any": { + "count": 5 + } + }, + "types/lamejs.d.ts": { + "ts/no-explicit-any": { + "count": 3 + } + }, + "types/pipeline.tsx": { + "ts/no-explicit-any": { + "count": 3 + } + }, + "types/react-18-input-autosize.d.ts": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "types/workflow.ts": { + "ts/no-explicit-any": { + "count": 15 + } + }, + "utils/clipboard.ts": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "utils/completion-params.spec.ts": { + "ts/no-explicit-any": { + "count": 3 + } + }, + "utils/completion-params.ts": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "utils/error-parser.ts": { + "no-console": { + "count": 1 + }, + "ts/no-explicit-any": { + "count": 1 + } + }, + "utils/format.spec.ts": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "utils/get-icon.spec.ts": { + "ts/no-explicit-any": { + "count": 2 + } + }, + "utils/gtag.ts": { + "ts/no-explicit-any": { + "count": 2 + } + }, + "utils/index.spec.ts": { + "test/no-identical-title": { + "count": 2 + }, + "ts/no-explicit-any": { + "count": 8 + } + }, + "utils/index.ts": { + "ts/no-explicit-any": { + "count": 3 + } + }, + "utils/mcp.ts": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "utils/model-config.spec.ts": { + "ts/no-explicit-any": { + "count": 13 + } + }, + "utils/model-config.ts": { + "ts/no-explicit-any": { + "count": 6 + } + }, + "utils/navigation.spec.ts": { + "ts/no-explicit-any": { + "count": 4 + } + }, + "utils/tool-call.spec.ts": { + "ts/no-explicit-any": { + "count": 1 + } + }, + "utils/validators.ts": { + "ts/no-explicit-any": { + "count": 2 + } + }, + "vitest.config.ts": { + "ts/no-explicit-any": { + "count": 1 + } + } +} diff --git a/web/eslint.config.mjs b/web/eslint.config.mjs index b8191a5eea..05c7502612 100644 --- a/web/eslint.config.mjs +++ b/web/eslint.config.mjs @@ -9,29 +9,15 @@ import difyI18n from './eslint-rules/index.js' export default antfu( { react: { + reactCompiler: true, overrides: { 'react/no-context-provider': 'off', 'react/no-forward-ref': 'off', 'react/no-use-context': 'off', - 'react/prefer-namespace-import': 'error', - // React Compiler rules - // Set to warn for gradual adoption - 'react-hooks/config': 'warn', - 'react-hooks/error-boundaries': 'warn', - 'react-hooks/component-hook-factories': 'warn', - 'react-hooks/gating': 'warn', - 'react-hooks/globals': 'warn', - 'react-hooks/immutability': 'warn', - 'react-hooks/preserve-manual-memoization': 'warn', - 'react-hooks/purity': 'warn', - 'react-hooks/refs': 'warn', - 'react-hooks/set-state-in-effect': 'warn', - 'react-hooks/set-state-in-render': 'warn', - 'react-hooks/static-components': 'warn', - 'react-hooks/unsupported-syntax': 'warn', - 'react-hooks/use-memo': 'warn', - 'react-hooks/incompatible-library': 'warn', + // prefer react-hooks-extra/no-direct-set-state-in-use-effect + 'react-hooks/set-state-in-effect': 'off', + 'react-hooks-extra/no-direct-set-state-in-use-effect': 'error', }, }, nextjs: true, @@ -39,7 +25,7 @@ export default antfu( typescript: { overrides: { 'ts/consistent-type-definitions': ['error', 'type'], - 'ts/no-explicit-any': 'warn', + 'ts/no-explicit-any': 'error', }, }, test: { @@ -53,30 +39,17 @@ export default antfu( }, }, }, - // downgrade some rules from error to warn for gradual adoption - // we should fix these in following pull requests { - // @keep-sorted rules: { - 'next/inline-script-id': 'warn', - 'no-console': 'warn', - 'no-irregular-whitespace': 'warn', - 'node/prefer-global/buffer': 'warn', - 'node/prefer-global/process': 'warn', - 'react/no-create-ref': 'warn', - 'react/no-missing-key': 'warn', - 'react/no-nested-component-definitions': 'warn', - 'regexp/no-dupe-disjunctions': 'warn', - 'regexp/no-super-linear-backtracking': 'warn', - 'regexp/no-unused-capturing-group': 'warn', - 'regexp/no-useless-assertions': 'warn', - 'regexp/no-useless-quantifier': 'warn', - 'style/multiline-ternary': 'warn', - 'test/no-identical-title': 'warn', - 'test/prefer-hooks-in-order': 'warn', - 'ts/no-empty-object-type': 'warn', - 'unicorn/prefer-number-properties': 'warn', - 'unused-imports/no-unused-vars': 'warn', + 'node/prefer-global/process': 'off', + }, + }, + { + files: ['**/*.ts', '**/*.tsx'], + settings: { + 'react-x': { + additionalStateHooks: '/^use\\w*State(?:s)?|useAtom$/u', + }, }, }, storybook.configs['flat/recommended'], @@ -169,19 +142,19 @@ export default antfu( }, }, // dify i18n namespace migration - { - files: ['**/*.ts', '**/*.tsx'], - ignores: ['eslint-rules/**', 'i18n/**', 'i18n-config/**'], - plugins: { - 'dify-i18n': difyI18n, - }, - rules: { - // 'dify-i18n/no-as-any-in-t': ['error', { mode: 'all' }], - 'dify-i18n/no-as-any-in-t': 'error', - // 'dify-i18n/no-legacy-namespace-prefix': 'error', - // 'dify-i18n/require-ns-option': 'error', - }, - }, + // { + // files: ['**/*.ts', '**/*.tsx'], + // ignores: ['eslint-rules/**', 'i18n/**', 'i18n-config/**'], + // plugins: { + // 'dify-i18n': difyI18n, + // }, + // rules: { + // // 'dify-i18n/no-as-any-in-t': ['error', { mode: 'all' }], + // 'dify-i18n/no-as-any-in-t': 'error', + // // 'dify-i18n/no-legacy-namespace-prefix': 'error', + // // 'dify-i18n/require-ns-option': 'error', + // }, + // }, // i18n JSON validation rules { files: ['i18n/**/*.json'], diff --git a/web/package.json b/web/package.json index 5ca90c75ea..56475a8da5 100644 --- a/web/package.json +++ b/web/package.json @@ -28,6 +28,7 @@ "build:docker": "next build && node scripts/optimize-standalone.js", "start": "node ./scripts/copy-and-start.mjs", "lint": "eslint --cache --cache-location node_modules/.cache/eslint/.eslint-cache", + "lint:ci": "pnpm lint --concurrency 3", "lint:fix": "pnpm lint --fix", "lint:quiet": "pnpm lint --quiet", "lint:complexity": "pnpm lint --rule 'complexity: [error, {max: 15}]' --quiet", @@ -153,9 +154,9 @@ "zustand": "^5.0.9" }, "devDependencies": { - "@antfu/eslint-config": "^6.7.3", + "@antfu/eslint-config": "^7.0.1", "@chromatic-com/storybook": "^4.1.1", - "@eslint-react/eslint-plugin": "^2.3.13", + "@eslint-react/eslint-plugin": "^2.7.0", "@mdx-js/loader": "^3.1.1", "@mdx-js/react": "^3.1.1", "@next/bundle-analyzer": "15.5.9", @@ -190,7 +191,7 @@ "@types/semver": "^7.7.1", "@types/sortablejs": "^1.15.8", "@types/uuid": "^10.0.0", - "@typescript-eslint/parser": "^8.50.0", + "@typescript-eslint/parser": "^8.53.0", "@typescript/native-preview": "^7.0.0-dev", "@vitejs/plugin-react": "^5.1.2", "@vitest/coverage-v8": "4.0.16", @@ -202,7 +203,7 @@ "eslint-plugin-react-hooks": "^7.0.1", "eslint-plugin-react-refresh": "^0.4.26", "eslint-plugin-sonarjs": "^3.0.5", - "eslint-plugin-storybook": "^10.1.10", + "eslint-plugin-storybook": "^10.1.11", "eslint-plugin-tailwindcss": "^3.18.2", "husky": "^9.1.7", "jsdom": "^27.3.0", @@ -225,7 +226,6 @@ }, "pnpm": { "overrides": { - "@eslint/plugin-kit@<0.3.4": "0.3.4", "@monaco-editor/loader": "1.5.0", "@nolyfill/safe-buffer": "npm:safe-buffer@^5.2.1", "array-includes": "npm:@nolyfill/array-includes@^1", @@ -276,7 +276,6 @@ ] }, "resolutions": { - "@eslint/plugin-kit": "~0.3", "@types/react": "~19.2.7", "@types/react-dom": "~19.2.3", "brace-expansion": "~2.0", diff --git a/web/pnpm-lock.yaml b/web/pnpm-lock.yaml index c8797e3d65..50e2bd543a 100644 --- a/web/pnpm-lock.yaml +++ b/web/pnpm-lock.yaml @@ -5,7 +5,6 @@ settings: excludeLinksFromLockfile: false overrides: - '@eslint/plugin-kit': ~0.3 '@types/react': ~19.2.7 '@types/react-dom': ~19.2.3 brace-expansion: ~2.0 @@ -13,7 +12,6 @@ overrides: pbkdf2: ~3.1.3 prismjs: ~1.30 string-width: ~4.2.3 - '@eslint/plugin-kit@<0.3.4': 0.3.4 '@monaco-editor/loader': 1.5.0 '@nolyfill/safe-buffer': npm:safe-buffer@^5.2.1 array-includes: npm:@nolyfill/array-includes@^1 @@ -362,14 +360,14 @@ importers: version: 5.0.9(@types/react@19.2.7)(immer@11.1.0)(react@19.2.3)(use-sync-external-store@1.6.0(react@19.2.3)) devDependencies: '@antfu/eslint-config': - specifier: ^6.7.3 - version: 6.7.3(@eslint-react/eslint-plugin@2.3.13(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(@next/eslint-plugin-next@15.5.9)(@vue/compiler-sfc@3.5.25)(eslint-plugin-react-hooks@7.0.1(eslint@9.39.2(jiti@1.21.7)))(eslint-plugin-react-refresh@0.4.26(eslint@9.39.2(jiti@1.21.7)))(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3)(vitest@4.0.16(@types/node@18.15.0)(happy-dom@20.0.11)(jiti@1.21.7)(jsdom@27.3.0(canvas@3.2.0))(sass@1.95.0)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) + specifier: ^7.0.1 + version: 7.0.1(@eslint-react/eslint-plugin@2.7.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(@next/eslint-plugin-next@15.5.9)(@vue/compiler-sfc@3.5.25)(eslint-plugin-react-hooks@7.0.1(eslint@9.39.2(jiti@1.21.7)))(eslint-plugin-react-refresh@0.4.26(eslint@9.39.2(jiti@1.21.7)))(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3)(vitest@4.0.16(@types/node@18.15.0)(happy-dom@20.0.11)(jiti@1.21.7)(jsdom@27.3.0(canvas@3.2.0))(sass@1.95.0)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) '@chromatic-com/storybook': specifier: ^4.1.1 version: 4.1.3(storybook@9.1.17(@testing-library/dom@10.4.1)(vite@7.3.0(@types/node@18.15.0)(jiti@1.21.7)(sass@1.95.0)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))) '@eslint-react/eslint-plugin': - specifier: ^2.3.13 - version: 2.3.13(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + specifier: ^2.7.0 + version: 2.7.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) '@mdx-js/loader': specifier: ^3.1.1 version: 3.1.1(webpack@5.103.0(esbuild@0.27.2)(uglify-js@3.19.3)) @@ -473,8 +471,8 @@ importers: specifier: ^10.0.0 version: 10.0.0 '@typescript-eslint/parser': - specifier: ^8.50.0 - version: 8.50.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + specifier: ^8.53.0 + version: 8.53.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) '@typescript/native-preview': specifier: ^7.0.0-dev version: 7.0.0-dev.20251209.1 @@ -509,8 +507,8 @@ importers: specifier: ^3.0.5 version: 3.0.5(eslint@9.39.2(jiti@1.21.7)) eslint-plugin-storybook: - specifier: ^10.1.10 - version: 10.1.10(eslint@9.39.2(jiti@1.21.7))(storybook@9.1.17(@testing-library/dom@10.4.1)(vite@7.3.0(@types/node@18.15.0)(jiti@1.21.7)(sass@1.95.0)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)))(typescript@5.9.3) + specifier: ^10.1.11 + version: 10.1.11(eslint@9.39.2(jiti@1.21.7))(storybook@9.1.17(@testing-library/dom@10.4.1)(vite@7.3.0(@types/node@18.15.0)(jiti@1.21.7)(sass@1.95.0)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)))(typescript@5.9.3) eslint-plugin-tailwindcss: specifier: ^3.18.2 version: 3.18.2(tailwindcss@3.4.18(tsx@4.21.0)(yaml@2.8.2)) @@ -658,8 +656,8 @@ packages: '@amplitude/targeting@0.2.0': resolution: {integrity: sha512-/50ywTrC4hfcfJVBbh5DFbqMPPfaIOivZeb5Gb+OGM03QrA+lsUqdvtnKLNuWtceD4H6QQ2KFzPJ5aAJLyzVDA==} - '@antfu/eslint-config@6.7.3': - resolution: {integrity: sha512-0tYYzY59uLnxWgbP9xpuxpvodTcWDacj439kTAJZB3sn7O0BnPfVxTnRvleGYaKCEALBZkzdC/wCho9FD7ICLw==} + '@antfu/eslint-config@7.0.1': + resolution: {integrity: sha512-QbCDrLPo2Bpn9/W5PnpGvUuD/EIKhiCmLBuIj9ylxeMvl47XSkXy3MZyinqUVsBJzk196B7BcJQByDZRr5TbZQ==} hasBin: true peerDependencies: '@eslint-react/eslint-plugin': ^2.0.1 @@ -1411,14 +1409,14 @@ packages: '@epic-web/invariant@1.0.0': resolution: {integrity: sha512-lrTPqgvfFQtR/eY/qkIzp98OGdNJu0m5ji3q/nJI8v3SXkRKEnWiOxMmbvcSoAIzv/cGiuvRy57k4suKQSAdwA==} - '@es-joy/jsdoccomment@0.76.0': - resolution: {integrity: sha512-g+RihtzFgGTx2WYCuTHbdOXJeAlGnROws0TeALx9ow/ZmOROOZkVg5wp/B44n0WJgI4SQFP1eWM2iRPlU2Y14w==} - engines: {node: '>=20.11.0'} - '@es-joy/jsdoccomment@0.78.0': resolution: {integrity: sha512-rQkU5u8hNAq2NVRzHnIUUvR6arbO0b6AOlvpTNS48CkiKSn/xtNfOzBK23JE4SiW89DgvU7GtxLVgV4Vn2HBAw==} engines: {node: '>=20.11.0'} + '@es-joy/jsdoccomment@0.79.0': + resolution: {integrity: sha512-q/Nc241VsVRC5b1dgbsOI0fnWfrb1S9sdceFewpDHto4+4r2o6SSCpcY+Z+EdLdMPN6Nsj/PjlPcKag6WbU6XQ==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + '@es-joy/resolve.exports@1.2.0': resolution: {integrity: sha512-Q9hjxWI5xBM+qW2enxfe8wDKdFWMfd0Z29k5ZJnuBqD/CasY5Zryj09aCA6owbGATWz+39p5uIdaHXpopOcG8g==} engines: {node: '>=10'} @@ -1579,8 +1577,8 @@ packages: cpu: [x64] os: [win32] - '@eslint-community/eslint-plugin-eslint-comments@4.5.0': - resolution: {integrity: sha512-MAhuTKlr4y/CE3WYX26raZjy+I/kS2PLKSzvfmDCGrBLTFHOYwqROZdr4XwPgXwX3K9rjzMr4pSmUWGnzsUyMg==} + '@eslint-community/eslint-plugin-eslint-comments@4.6.0': + resolution: {integrity: sha512-2EX2bBQq1ez++xz2o9tEeEQkyvfieWgUFMH4rtJJri2q0Azvhja3hZGXsjPXs31R4fQkZDtWzNDDK2zQn5UE5g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 @@ -1591,6 +1589,12 @@ packages: peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + '@eslint-community/eslint-utils@4.9.1': + resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + '@eslint-community/regexpp@4.12.1': resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} @@ -1599,40 +1603,40 @@ packages: resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint-react/ast@2.3.13': - resolution: {integrity: sha512-OP2rOhHYLx2nfd9uA9uACKZJN9z9rX9uuAMx4PjT75JNOdYr1GgqWQZcYCepyJ+gmVNCyiXcLXuyhavqxCSM8Q==} + '@eslint-react/ast@2.7.0': + resolution: {integrity: sha512-GGrvel9+kR++wK7orcS2kS1xtHpY0o0rh6hbHbiGVWsSiZmg0X8jZfK1nSf8a3FLJR2WLtQlUsrrtJ4hObaqeQ==} engines: {node: '>=20.19.0'} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@eslint-react/core@2.3.13': - resolution: {integrity: sha512-4bWBE+1kApuxJKIrLJH2FuFtCbM4fXfDs6Ou8MNamGoX6hdynlntssvaMZTd/lk/L8dt01H/3btr7xBX4+4BNA==} + '@eslint-react/core@2.7.0': + resolution: {integrity: sha512-xeRSnzLI35Msr2lnGjH4vxgOwohODy2FaXRmXUS1IpmMRDp1Ct+7I3SDknfeW/YExjGZXvpxR0uD2P9dSjU6NA==} engines: {node: '>=20.19.0'} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@eslint-react/eff@2.3.13': - resolution: {integrity: sha512-byXsssozwh3VaiqcOonAKQgLXgpMVNSxBWFjdfbNhW7+NttorSt950qtiw+P7A9JoRab1OuGYk4MDY5UVBno8Q==} + '@eslint-react/eff@2.7.0': + resolution: {integrity: sha512-+uUI53LkS6EDU0ysVUeM2SdyZQwt/xEfh4OSJ0JMLT8fJbseZY8c0hyev7X5arifcLs0PVPHwUP1IPcNhSLOFw==} engines: {node: '>=20.19.0'} - '@eslint-react/eslint-plugin@2.3.13': - resolution: {integrity: sha512-gq0Z0wADAXvJS8Y/Wk3isK7WIEcfrQGGGdWvorAv0T7MxPd3d32TVwdc1Gx3hVLka3fYq1BBlQ5Fr8e1VgNuIg==} + '@eslint-react/eslint-plugin@2.7.0': + resolution: {integrity: sha512-Bog14dOrsG/jBA9B8URZPJMI6dZuEwqHdkPcTuIkJe92EjFj8NwyziNGFXKY3j7o9AU9ILCBbjfC4JFq56lwjQ==} engines: {node: '>=20.19.0'} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@eslint-react/shared@2.3.13': - resolution: {integrity: sha512-ESE7dVeOXtem3K6BD6k2wJaFt35kPtTT9SWCL99LFk7pym4OEGoMxPcyB2R7PMWiVudwl63BmiOgQOdaFYPONg==} + '@eslint-react/shared@2.7.0': + resolution: {integrity: sha512-/lF5uiGYd+XIfO5t2YMC5RdbQ9lxLkxfL4icZgrbiJIPndirAKjFNl1cdXd+C/qqRCYDACrTPqI8HEL1T4N1Iw==} engines: {node: '>=20.19.0'} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@eslint-react/var@2.3.13': - resolution: {integrity: sha512-BozBfUZkzzobD6x/M8XERAnZQ3UvZPsD49zTGFKKU9M/bgsM78HwzxAPLkiu88W55v3sO/Kqf8fQTXT4VEeZ/g==} + '@eslint-react/var@2.7.0': + resolution: {integrity: sha512-EFztHstOAYYCrFFNUOPZ7+J3o/X/zawqPKgLL7b5/271rhL6/DMxUmTcKtJIHO7hCdFPMcGT+vPxe+omq62Ukg==} engines: {node: '>=20.19.0'} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -1655,14 +1659,14 @@ packages: resolution: {integrity: sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/core@0.15.2': - resolution: {integrity: sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/core@0.17.0': resolution: {integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/core@1.0.1': + resolution: {integrity: sha512-r18fEAj9uCk+VjzGt2thsbOmychS+4kxI14spVNibUO2vqKX7obOG+ymZljAwuPZl+S3clPGwCwTDtrdqTiY6Q==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + '@eslint/eslintrc@3.3.3': resolution: {integrity: sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -1679,10 +1683,14 @@ packages: resolution: {integrity: sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/plugin-kit@0.3.5': - resolution: {integrity: sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w==} + '@eslint/plugin-kit@0.4.1': + resolution: {integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/plugin-kit@0.5.1': + resolution: {integrity: sha512-hZ2uC1jbf6JMSsF2ZklhRQqf6GLpYyux6DlzegnW/aFlpu6qJj5GO7ub7WOETCrEl6pl6DAX7RgTgj/fyG+6BQ==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + '@floating-ui/core@1.7.3': resolution: {integrity: sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==} @@ -3206,8 +3214,8 @@ packages: typescript: optional: true - '@stylistic/eslint-plugin@5.6.1': - resolution: {integrity: sha512-JCs+MqoXfXrRPGbGmho/zGS/jMcn3ieKl/A8YImqib76C8kjgZwq5uUFzc30lJkMvcchuRn6/v8IApLxli3Jyw==} + '@stylistic/eslint-plugin@5.7.0': + resolution: {integrity: sha512-PsSugIf9ip1H/mWKj4bi/BlEoerxXAda9ByRFsYuwsmr6af9NxJL0AaiNXs8Le7R21QR5KMiD/KdxZZ71LjAxQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: '>=9.0.0' @@ -3702,62 +3710,40 @@ packages: '@types/zen-observable@0.8.3': resolution: {integrity: sha512-fbF6oTd4sGGy0xjHPKAt+eS2CrxJ3+6gQ3FGcBoIJR2TLAyCkCyI8JqZNy+FeON0AhVgNJoUumVoZQjBFUqHkw==} - '@typescript-eslint/eslint-plugin@8.50.0': - resolution: {integrity: sha512-O7QnmOXYKVtPrfYzMolrCTfkezCJS9+ljLdKW/+DCvRsc3UAz+sbH6Xcsv7p30+0OwUbeWfUDAQE0vpabZ3QLg==} + '@typescript-eslint/eslint-plugin@8.53.0': + resolution: {integrity: sha512-eEXsVvLPu8Z4PkFibtuFJLJOTAV/nPdgtSjkGoPpddpFk3/ym2oy97jynY6ic2m6+nc5M8SE1e9v/mHKsulcJg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.50.0 + '@typescript-eslint/parser': ^8.53.0 eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/parser@8.50.0': - resolution: {integrity: sha512-6/cmF2piao+f6wSxUsJLZjck7OQsYyRtcOZS02k7XINSNlz93v6emM8WutDQSXnroG2xwYlEVHJI+cPA7CPM3Q==} + '@typescript-eslint/parser@8.53.0': + resolution: {integrity: sha512-npiaib8XzbjtzS2N4HlqPvlpxpmZ14FjSJrteZpPxGUaYPlvhzlzUZ4mZyABo0EFrOWnvyd0Xxroq//hKhtAWg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/project-service@8.49.0': - resolution: {integrity: sha512-/wJN0/DKkmRUMXjZUXYZpD1NEQzQAAn9QWfGwo+Ai8gnzqH7tvqS7oNVdTjKqOcPyVIdZdyCMoqN66Ia789e7g==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.0.0' - - '@typescript-eslint/project-service@8.50.0': - resolution: {integrity: sha512-Cg/nQcL1BcoTijEWyx4mkVC56r8dj44bFDvBdygifuS20f3OZCHmFbjF34DPSi07kwlFvqfv/xOLnJ5DquxSGQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/project-service@8.50.1': resolution: {integrity: sha512-E1ur1MCVf+YiP89+o4Les/oBAVzmSbeRB0MQLfSlYtbWU17HPxZ6Bhs5iYmKZRALvEuBoXIZMOIRRc/P++Ortg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/scope-manager@8.49.0': - resolution: {integrity: sha512-npgS3zi+/30KSOkXNs0LQXtsg9ekZ8OISAOLGWA/ZOEn0ZH74Ginfl7foziV8DT+D98WfQ5Kopwqb/PZOaIJGg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/scope-manager@8.50.0': - resolution: {integrity: sha512-xCwfuCZjhIqy7+HKxBLrDVT5q/iq7XBVBXLn57RTIIpelLtEIZHXAF/Upa3+gaCpeV1NNS5Z9A+ID6jn50VD4A==} + '@typescript-eslint/project-service@8.53.0': + resolution: {integrity: sha512-Bl6Gdr7NqkqIP5yP9z1JU///Nmes4Eose6L1HwpuVHwScgDPPuEWbUVhvlZmb8hy0vX9syLk5EGNL700WcBlbg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' '@typescript-eslint/scope-manager@8.50.1': resolution: {integrity: sha512-mfRx06Myt3T4vuoHaKi8ZWNTPdzKPNBhiblze5N50//TSHOAQQevl/aolqA/BcqqbJ88GUnLqjjcBc8EWdBcVw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/tsconfig-utils@8.49.0': - resolution: {integrity: sha512-8prixNi1/6nawsRYxet4YOhnbW+W9FK/bQPxsGB1D3ZrDzbJ5FXw5XmzxZv82X3B+ZccuSxo/X8q9nQ+mFecWA==} + '@typescript-eslint/scope-manager@8.53.0': + resolution: {integrity: sha512-kWNj3l01eOGSdVBnfAF2K1BTh06WS0Yet6JUgb9Cmkqaz3Jlu0fdVUjj9UI8gPidBWSMqDIglmEXifSgDT/D0g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.0.0' - - '@typescript-eslint/tsconfig-utils@8.50.0': - resolution: {integrity: sha512-vxd3G/ybKTSlm31MOA96gqvrRGv9RJ7LGtZCn2Vrc5htA0zCDvcMqUkifcjrWNNKXHUU3WCkYOzzVSFBd0wa2w==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.0.0' '@typescript-eslint/tsconfig-utils@8.50.1': resolution: {integrity: sha512-ooHmotT/lCWLXi55G4mvaUF60aJa012QzvLK0Y+Mp4WdSt17QhMhWOaBWeGTFVkb2gDgBe19Cxy1elPXylslDw==} @@ -3765,43 +3751,26 @@ packages: peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/type-utils@8.49.0': - resolution: {integrity: sha512-KTExJfQ+svY8I10P4HdxKzWsvtVnsuCifU5MvXrRwoP2KOlNZ9ADNEWWsQTJgMxLzS5VLQKDjkCT/YzgsnqmZg==} + '@typescript-eslint/tsconfig-utils@8.53.0': + resolution: {integrity: sha512-K6Sc0R5GIG6dNoPdOooQ+KtvT5KCKAvTcY8h2rIuul19vxH5OTQk7ArKkd4yTzkw66WnNY0kPPzzcmWA+XRmiA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + + '@typescript-eslint/type-utils@8.53.0': + resolution: {integrity: sha512-BBAUhlx7g4SmcLhn8cnbxoxtmS7hcq39xKCgiutL3oNx1TaIp+cny51s8ewnKMpVUKQUGb41RAUWZ9kxYdovuw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/type-utils@8.50.0': - resolution: {integrity: sha512-7OciHT2lKCewR0mFoBrvZJ4AXTMe/sYOe87289WAViOocEmDjjv8MvIOT2XESuKj9jp8u3SZYUSh89QA4S1kQw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <6.0.0' - - '@typescript-eslint/types@8.49.0': - resolution: {integrity: sha512-e9k/fneezorUo6WShlQpMxXh8/8wfyc+biu6tnAqA81oWrEic0k21RHzP9uqqpyBBeBKu4T+Bsjy9/b8u7obXQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/types@8.50.0': - resolution: {integrity: sha512-iX1mgmGrXdANhhITbpp2QQM2fGehBse9LbTf0sidWK6yg/NE+uhV5dfU1g6EYPlcReYmkE9QLPq/2irKAmtS9w==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/types@8.50.1': resolution: {integrity: sha512-v5lFIS2feTkNyMhd7AucE/9j/4V9v5iIbpVRncjk/K0sQ6Sb+Np9fgYS/63n6nwqahHQvbmujeBL7mp07Q9mlA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.49.0': - resolution: {integrity: sha512-jrLdRuAbPfPIdYNppHJ/D0wN+wwNfJ32YTAm10eJVsFmrVpXQnDWBn8niCSMlWjvml8jsce5E/O+86IQtTbJWA==} + '@typescript-eslint/types@8.53.0': + resolution: {integrity: sha512-Bmh9KX31Vlxa13+PqPvt4RzKRN1XORYSLlAE+sO1i28NkisGbTtSLFVB3l7PWdHtR3E0mVMuC7JilWJ99m2HxQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.0.0' - - '@typescript-eslint/typescript-estree@8.50.0': - resolution: {integrity: sha512-W7SVAGBR/IX7zm1t70Yujpbk+zdPq/u4soeFSknWFdXIFuWsBGBOUu/Tn/I6KHSKvSh91OiMuaSnYp3mtPt5IQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <6.0.0' '@typescript-eslint/typescript-estree@8.50.1': resolution: {integrity: sha512-woHPdW+0gj53aM+cxchymJCrh0cyS7BTIdcDxWUNsclr9VDkOSbqC13juHzxOmQ22dDkMZEpZB+3X1WpUvzgVQ==} @@ -3809,18 +3778,10 @@ packages: peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/utils@8.49.0': - resolution: {integrity: sha512-N3W7rJw7Rw+z1tRsHZbK395TWSYvufBXumYtEGzypgMUthlg0/hmCImeA8hgO2d2G4pd7ftpxxul2J8OdtdaFA==} + '@typescript-eslint/typescript-estree@8.53.0': + resolution: {integrity: sha512-pw0c0Gdo7Z4xOG987u3nJ8akL9093yEEKv8QTJ+Bhkghj1xyj8cgPaavlr9rq8h7+s6plUJ4QJYw2gCZodqmGw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <6.0.0' - - '@typescript-eslint/utils@8.50.0': - resolution: {integrity: sha512-87KgUXET09CRjGCi2Ejxy3PULXna63/bMYv72tCAlDJC3Yqwln0HiFJ3VJMst2+mEtNtZu5oFvX4qJGjKsnAgg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' '@typescript-eslint/utils@8.50.1': @@ -3830,18 +3791,21 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/visitor-keys@8.49.0': - resolution: {integrity: sha512-LlKaciDe3GmZFphXIc79THF/YYBugZ7FS1pO581E/edlVVNbZKDy93evqmrfQ9/Y4uN0vVhX4iuchq26mK/iiA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - '@typescript-eslint/visitor-keys@8.50.0': - resolution: {integrity: sha512-Xzmnb58+Db78gT/CCj/PVCvK+zxbnsw6F+O1oheYszJbBSdEjVhQi3C/Xttzxgi/GLmpvOggRs1RFpiJ8+c34Q==} + '@typescript-eslint/utils@8.53.0': + resolution: {integrity: sha512-XDY4mXTez3Z1iRDI5mbRhH4DFSt46oaIFsLg+Zn97+sYrXACziXSQcSelMybnVZ5pa1P6xYkPr5cMJyunM1ZDA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' '@typescript-eslint/visitor-keys@8.50.1': resolution: {integrity: sha512-IrDKrw7pCRUR94zeuCSUWQ+w8JEf5ZX5jl/e6AHGSLi1/zIr0lgutfn/7JpfCey+urpgQEdrZVYzCaVVKiTwhQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/visitor-keys@8.53.0': + resolution: {integrity: sha512-LZ2NqIHFhvFwxG0qZeLL9DvdNAHPGCY5dIRwBhyYeU+LfLhcStE1ImjsuTG/WaVh3XysGaeLW8Rqq7cGkPCFvw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript/native-preview-darwin-arm64@7.0.0-dev.20251209.1': resolution: {integrity: sha512-F1cnYi+ZeinYQnaTQKKIsbuoq8vip5iepBkSZXlB8PjbG62LW1edUdktd/nVEc+Q+SEysSQ3jRdk9eU766s5iw==} cpu: [arm64] @@ -3899,8 +3863,8 @@ packages: '@vitest/browser': optional: true - '@vitest/eslint-plugin@1.6.1': - resolution: {integrity: sha512-q4ZCihsURDxhJm6bEUtJjciXtT5k3ijWR4U+0f9XdCRAzAfML5NUUSwulsFoK1AFohBieh52akKWJEIFFMLn/g==} + '@vitest/eslint-plugin@1.6.6': + resolution: {integrity: sha512-bwgQxQWRtnTVzsUHK824tBmHzjV0iTx3tZaiQIYDjX3SA7TsQS8CuDVqxXrRY3FaOUMgbGavesCxI9MOfFLm7Q==} engines: {node: '>=18'} peerDependencies: eslint: '>=8.57.0' @@ -5119,8 +5083,8 @@ packages: peerDependencies: eslint: '*' - eslint-plugin-antfu@3.1.1: - resolution: {integrity: sha512-7Q+NhwLfHJFvopI2HBZbSxWXngTwBLKxW1AGXLr2lEGxcEIK/AsDs8pn8fvIizl5aZjBbVbVK5ujmMpBe4Tvdg==} + eslint-plugin-antfu@3.1.3: + resolution: {integrity: sha512-Az1QuqQJ/c2efWCxVxF249u3D4AcAu1Y3VCGAlJm+x4cgnn1ybUAnCT5DWVcogeaWduQKeVw07YFydVTOF4xDw==} peerDependencies: eslint: '*' @@ -5135,19 +5099,15 @@ packages: peerDependencies: eslint: '>=8' - eslint-plugin-import-lite@0.4.0: - resolution: {integrity: sha512-My0ReAg8WbHXYECIHVJkWB8UxrinZn3m72yonOYH6MFj40ZN1vHYQj16iq2Fd8Wrt/vRZJwDX2xm/BzDk1FzTg==} + eslint-plugin-import-lite@0.5.0: + resolution: {integrity: sha512-7uBvxuQj+VlYmZSYSHcm33QgmZnvMLP2nQiWaLtjhJ5x1zKcskOqjolL+dJC13XY+ktQqBgidAnnQMELfRaXQg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: '>=9.0.0' - typescript: '>=4.5' - peerDependenciesMeta: - typescript: - optional: true - eslint-plugin-jsdoc@61.5.0: - resolution: {integrity: sha512-PR81eOGq4S7diVnV9xzFSBE4CDENRQGP0Lckkek8AdHtbj+6Bm0cItwlFnxsLFriJHspiE3mpu8U20eODyToIg==} - engines: {node: '>=20.11.0'} + eslint-plugin-jsdoc@62.0.0: + resolution: {integrity: sha512-sNdIGLAvjFK3pB0SYFW74iXODZ4ifF8Ax13Wgq8jKepKnrCFzGo7+jRZfLf70h81SD7lPYnTE7MR2nhYSvaLTA==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} peerDependencies: eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 @@ -5157,8 +5117,8 @@ packages: peerDependencies: eslint: '>=6.0.0' - eslint-plugin-n@17.23.1: - resolution: {integrity: sha512-68PealUpYoHOBh332JLLD9Sj7OQUDkFpmcfqt8R9sySfFSeuGJjMTJQvCRRB96zO3A/PELRLkPrzsHmzEFQQ5A==} + eslint-plugin-n@17.23.2: + resolution: {integrity: sha512-RhWBeb7YVPmNa2eggvJooiuehdL76/bbfj/OJewyoGT80qn5PXdz8zMOTO6YHOsI7byPt7+Ighh/i/4a5/v7hw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: '>=8.23.0' @@ -5167,9 +5127,9 @@ packages: resolution: {integrity: sha512-brcKcxGnISN2CcVhXJ/kEQlNa0MEfGRtwKtWA16SkqXHKitaKIMrfemJKLKX1YqDU5C/5JY3PvZXd5jEW04e0Q==} engines: {node: '>=5.0.0'} - eslint-plugin-perfectionist@4.15.1: - resolution: {integrity: sha512-MHF0cBoOG0XyBf7G0EAFCuJJu4I18wy0zAoT1OHfx2o6EOx1EFTIzr2HGeuZa1kDcusoX0xJ9V7oZmaeFd773Q==} - engines: {node: ^18.0.0 || >=20.0.0} + eslint-plugin-perfectionist@5.3.1: + resolution: {integrity: sha512-v8kAP8TarQYqDC4kxr343ZNi++/oOlBnmWovsUZpbJ7A/pq1VHGlgsf/fDh4CdEvEstzkrc8NLvoVKtfpsC4oA==} + engines: {node: ^20.0.0 || >=22.0.0} peerDependencies: eslint: '>=8.45.0' @@ -5178,16 +5138,16 @@ packages: peerDependencies: eslint: ^9.0.0 - eslint-plugin-react-dom@2.3.13: - resolution: {integrity: sha512-O9jglTOnnuyfJcSxjeVc8lqIp5kuS9/0MLLCHlOTH8ZjIifHHxUr6GZ2fd4la9y0FsoEYXEO7DBIMjWx2vCwjg==} + eslint-plugin-react-dom@2.7.0: + resolution: {integrity: sha512-9dvpfaAG3dC14jkDx5c9yXK9mQkYvxAUphQYfzorCntumQi5iOPsWNhITO+M1P+uIEpoc4HwuWkX42E/395AGQ==} engines: {node: '>=20.19.0'} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - eslint-plugin-react-hooks-extra@2.3.13: - resolution: {integrity: sha512-NSnY8yvtrvu2FAALLuvc2xesIAkMqGyJgilpy8wEi1w/Nw6v0IwBEffoNKLq9OHW4v3nikud3aBTqWfWKOx67Q==} - engines: {node: '>=20.0.0'} + eslint-plugin-react-hooks-extra@2.7.0: + resolution: {integrity: sha512-pvjuFvUJkmmHLRjWgJcuRKI+UUq8DddyVU5PrMJY2G3LTYewr4kMHRGaFQ6qg+mbVZWovfxy+VjZjJ8PTfJTDg==} + engines: {node: '>=20.19.0'} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' @@ -5198,8 +5158,8 @@ packages: peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 - eslint-plugin-react-naming-convention@2.3.13: - resolution: {integrity: sha512-2iler1ldFpB/PaNpN8WAVk6dKYKwKcoGm1j0JAAjdCrsfOTJ007ol2xTAyoHKAbMOvkZSi7qq90q+Q//RuhWwA==} + eslint-plugin-react-naming-convention@2.7.0: + resolution: {integrity: sha512-BENL2tUVW/PSpFjLyfS0WloG5Buh76rvBM1hG/dCEyWDpHA6s4oJpF2Th9J92eKfim48/uprIPkKCB520Ev2nQ==} engines: {node: '>=20.19.0'} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -5210,15 +5170,15 @@ packages: peerDependencies: eslint: '>=8.40' - eslint-plugin-react-web-api@2.3.13: - resolution: {integrity: sha512-+UypRPHP9GFMulIENpsC/J+TygWywiyz2mb4qyUP6y/IwdcSilk1MyF9WquNYKB/4/FN4Rl1oRm6WMbfkbpMnQ==} + eslint-plugin-react-web-api@2.7.0: + resolution: {integrity: sha512-vIuYyHbn2H337YZR8tKqUbzSNAiH6+9jk3atQBEgISJT0NTuwd80nhEPm3oPHfbgB3Sc4+rEhchVTnG+4BsFfg==} engines: {node: '>=20.19.0'} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - eslint-plugin-react-x@2.3.13: - resolution: {integrity: sha512-+m+V/5VLMxgx0VsFUUyflMNLQG0WFYspsfv0XJFqx7me3A2b3P20QatNDHQCYswz0PRbRFqinTPukPRhZh68ag==} + eslint-plugin-react-x@2.7.0: + resolution: {integrity: sha512-/za228LsbKt1OlZ2XxP3R4xouG0rXeeuLyEnpHfKsAcY0mKPklempmQ5s0E9+SqcpQ/Jd+O4Jg9/30RU+vCqfw==} engines: {node: '>=20.19.0'} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -5235,11 +5195,11 @@ packages: peerDependencies: eslint: ^8.0.0 || ^9.0.0 - eslint-plugin-storybook@10.1.10: - resolution: {integrity: sha512-ITr6Aq3buR/DuDATkq1BafUVJLybyo676fY+tj9Zjd1Ak+UXBAMQcQ++tiBVVHm1RqADwM3b1o6bnWHK2fPPKw==} + eslint-plugin-storybook@10.1.11: + resolution: {integrity: sha512-mbq2r2kK5+AcLl0XDJ3to91JOgzCbHOqj+J3n+FRw6drk+M1boRqMShSoMMm0HdzXPLmlr7iur+qJ5ZuhH6ayQ==} peerDependencies: eslint: '>=8' - storybook: ^10.1.10 + storybook: ^10.1.11 eslint-plugin-tailwindcss@3.18.2: resolution: {integrity: sha512-QbkMLDC/OkkjFQ1iz/5jkMdHfiMu/uwujUHLAJK5iwNHD8RTxVTlsUezE0toTZ6VhybNBsk+gYGPDq2agfeRNA==} @@ -5247,11 +5207,11 @@ packages: peerDependencies: tailwindcss: ^3.4.0 - eslint-plugin-toml@0.12.0: - resolution: {integrity: sha512-+/wVObA9DVhwZB1nG83D2OAQRrcQZXy+drqUnFJKymqnmbnbfg/UPmEMCKrJNcEboUGxUjYrJlgy+/Y930mURQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + eslint-plugin-toml@1.0.0: + resolution: {integrity: sha512-ACotflJMZ9CKCZlc0nznBxRNbiOYcBqWmXUSoKsGf6cyDV7EN1kGoD/WKnMo/lEsIF0WnzaYXcOU1HBOoyxRrg==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} peerDependencies: - eslint: '>=6.0.0' + eslint: '>=9.38.0' eslint-plugin-unicorn@62.0.0: resolution: {integrity: sha512-HIlIkGLkvf29YEiS/ImuDZQbP12gWyx5i3C6XrRxMvVdqMroCI9qoVYCoIl17ChN+U89pn9sVwLxhIWj5nEc7g==} @@ -5310,6 +5270,10 @@ packages: resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + eslint-visitor-keys@5.0.0: + resolution: {integrity: sha512-A0XeIi7CXU7nPlfHS9loMYEKxUaONu/hTEzHTGba9Huu94Cq1hPivf+DE5erJozZOky0LfvXAyrV/tcswpLI0Q==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + eslint@9.39.2: resolution: {integrity: sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -5324,6 +5288,10 @@ packages: resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + espree@11.0.0: + resolution: {integrity: sha512-+gMeWRrIh/NsG+3NaLeWHuyeyk70p2tbvZIWBYcqQ4/7Xvars6GYTZNhF1sIeLcc6Wb11He5ffz3hsHyXFrw5A==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} + espree@9.6.1: resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -5337,6 +5305,10 @@ packages: resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} engines: {node: '>=0.10'} + esquery@1.7.0: + resolution: {integrity: sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==} + engines: {node: '>=0.10'} + esrecurse@4.3.0: resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} engines: {node: '>=4.0'} @@ -5619,6 +5591,10 @@ packages: resolution: {integrity: sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==} engines: {node: '>=18'} + globals@17.0.0: + resolution: {integrity: sha512-gv5BeD2EssA793rlFWVPMMCqefTlpusw6/2TbAVMy0FzcG8wKJn4O+NqJ4+XWmmwrayJgw5TzrmWjFgmz1XPqw==} + engines: {node: '>=18'} + globrex@0.1.2: resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} @@ -6057,10 +6033,6 @@ packages: resolution: {integrity: sha512-iZ8Bdb84lWRuGHamRXFyML07r21pcwBrLkHEuHgEY5UbCouBwv7ECknDRKzsQIXMiqpPymqtIf8TC/shYKB5rw==} engines: {node: '>=12.0.0'} - jsdoc-type-pratt-parser@6.10.0: - resolution: {integrity: sha512-+LexoTRyYui5iOhJGn13N9ZazL23nAHGkXsa1p/C8yeq79WRfLBag6ZZ0FQG2aRoc9yfo59JT9EYCQonOkHKkQ==} - engines: {node: '>=20.0.0'} - jsdoc-type-pratt-parser@7.0.0: resolution: {integrity: sha512-c7YbokssPOSHmqTbSAmTtnVgAVa/7lumWNYqomgd5KOMyPrRve2anx6lonfOsXEQacqF9FKVUj7bLg4vRSvdYA==} engines: {node: '>=20.0.0'} @@ -7983,9 +7955,9 @@ packages: toggle-selection@1.0.6: resolution: {integrity: sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==} - toml-eslint-parser@0.10.1: - resolution: {integrity: sha512-9mjy3frhioGIVGcwamlVlUyJ9x+WHw/TXiz9R4YOlmsIuBN43r9Dp8HZ35SF9EKjHrn3BUZj04CF+YqZ2oJ+7w==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + toml-eslint-parser@1.0.2: + resolution: {integrity: sha512-ZI3t5mJiCt+1jQei8iNvKacpoPg9Qc9LumWZBJpWpHKbezA2df0nIXl16HjgwCr44qxpVm7azTYpJ5rylcbsNg==} + engines: {node: ^20.19.0 || ^22.13.0 || >=24} totalist@3.0.1: resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} @@ -8014,6 +7986,12 @@ packages: peerDependencies: typescript: '>=4.8.4' + ts-api-utils@2.4.0: + resolution: {integrity: sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA==} + engines: {node: '>=18.12'} + peerDependencies: + typescript: '>=4.8.4' + ts-debounce@4.0.0: resolution: {integrity: sha512-+1iDGY6NmOGidq7i7xZGA4cm8DAa6fqdYcvO5Z6yBevH++Bdo9Qt/mN0TzHUgcCcKv1gmh9+W5dHqz8pMWbCbg==} @@ -8811,47 +8789,47 @@ snapshots: idb: 8.0.0 tslib: 2.8.1 - '@antfu/eslint-config@6.7.3(@eslint-react/eslint-plugin@2.3.13(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(@next/eslint-plugin-next@15.5.9)(@vue/compiler-sfc@3.5.25)(eslint-plugin-react-hooks@7.0.1(eslint@9.39.2(jiti@1.21.7)))(eslint-plugin-react-refresh@0.4.26(eslint@9.39.2(jiti@1.21.7)))(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3)(vitest@4.0.16(@types/node@18.15.0)(happy-dom@20.0.11)(jiti@1.21.7)(jsdom@27.3.0(canvas@3.2.0))(sass@1.95.0)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))': + '@antfu/eslint-config@7.0.1(@eslint-react/eslint-plugin@2.7.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(@next/eslint-plugin-next@15.5.9)(@vue/compiler-sfc@3.5.25)(eslint-plugin-react-hooks@7.0.1(eslint@9.39.2(jiti@1.21.7)))(eslint-plugin-react-refresh@0.4.26(eslint@9.39.2(jiti@1.21.7)))(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3)(vitest@4.0.16(@types/node@18.15.0)(happy-dom@20.0.11)(jiti@1.21.7)(jsdom@27.3.0(canvas@3.2.0))(sass@1.95.0)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))': dependencies: '@antfu/install-pkg': 1.1.0 '@clack/prompts': 0.11.0 - '@eslint-community/eslint-plugin-eslint-comments': 4.5.0(eslint@9.39.2(jiti@1.21.7)) + '@eslint-community/eslint-plugin-eslint-comments': 4.6.0(eslint@9.39.2(jiti@1.21.7)) '@eslint/markdown': 7.5.1 - '@stylistic/eslint-plugin': 5.6.1(eslint@9.39.2(jiti@1.21.7)) - '@typescript-eslint/eslint-plugin': 8.50.0(@typescript-eslint/parser@8.50.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) - '@typescript-eslint/parser': 8.50.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) - '@vitest/eslint-plugin': 1.6.1(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3)(vitest@4.0.16(@types/node@18.15.0)(happy-dom@20.0.11)(jiti@1.21.7)(jsdom@27.3.0(canvas@3.2.0))(sass@1.95.0)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) + '@stylistic/eslint-plugin': 5.7.0(eslint@9.39.2(jiti@1.21.7)) + '@typescript-eslint/eslint-plugin': 8.53.0(@typescript-eslint/parser@8.53.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + '@typescript-eslint/parser': 8.53.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + '@vitest/eslint-plugin': 1.6.6(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3)(vitest@4.0.16(@types/node@18.15.0)(happy-dom@20.0.11)(jiti@1.21.7)(jsdom@27.3.0(canvas@3.2.0))(sass@1.95.0)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) ansis: 4.2.0 cac: 6.7.14 eslint: 9.39.2(jiti@1.21.7) eslint-config-flat-gitignore: 2.1.0(eslint@9.39.2(jiti@1.21.7)) eslint-flat-config-utils: 2.1.4 eslint-merge-processors: 2.0.0(eslint@9.39.2(jiti@1.21.7)) - eslint-plugin-antfu: 3.1.1(eslint@9.39.2(jiti@1.21.7)) + eslint-plugin-antfu: 3.1.3(eslint@9.39.2(jiti@1.21.7)) eslint-plugin-command: 3.4.0(eslint@9.39.2(jiti@1.21.7)) - eslint-plugin-import-lite: 0.4.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) - eslint-plugin-jsdoc: 61.5.0(eslint@9.39.2(jiti@1.21.7)) + eslint-plugin-import-lite: 0.5.0(eslint@9.39.2(jiti@1.21.7)) + eslint-plugin-jsdoc: 62.0.0(eslint@9.39.2(jiti@1.21.7)) eslint-plugin-jsonc: 2.21.0(eslint@9.39.2(jiti@1.21.7)) - eslint-plugin-n: 17.23.1(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + eslint-plugin-n: 17.23.2(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) eslint-plugin-no-only-tests: 3.3.0 - eslint-plugin-perfectionist: 4.15.1(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + eslint-plugin-perfectionist: 5.3.1(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) eslint-plugin-pnpm: 1.4.3(eslint@9.39.2(jiti@1.21.7)) eslint-plugin-regexp: 2.10.0(eslint@9.39.2(jiti@1.21.7)) - eslint-plugin-toml: 0.12.0(eslint@9.39.2(jiti@1.21.7)) + eslint-plugin-toml: 1.0.0(eslint@9.39.2(jiti@1.21.7)) eslint-plugin-unicorn: 62.0.0(eslint@9.39.2(jiti@1.21.7)) - eslint-plugin-unused-imports: 4.3.0(@typescript-eslint/eslint-plugin@8.50.0(@typescript-eslint/parser@8.50.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.2(jiti@1.21.7)) - eslint-plugin-vue: 10.6.2(@stylistic/eslint-plugin@5.6.1(eslint@9.39.2(jiti@1.21.7)))(@typescript-eslint/parser@8.50.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.2(jiti@1.21.7))(vue-eslint-parser@10.2.0(eslint@9.39.2(jiti@1.21.7))) + eslint-plugin-unused-imports: 4.3.0(@typescript-eslint/eslint-plugin@8.53.0(@typescript-eslint/parser@8.53.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.2(jiti@1.21.7)) + eslint-plugin-vue: 10.6.2(@stylistic/eslint-plugin@5.7.0(eslint@9.39.2(jiti@1.21.7)))(@typescript-eslint/parser@8.53.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.2(jiti@1.21.7))(vue-eslint-parser@10.2.0(eslint@9.39.2(jiti@1.21.7))) eslint-plugin-yml: 1.19.1(eslint@9.39.2(jiti@1.21.7)) eslint-processor-vue-blocks: 2.0.0(@vue/compiler-sfc@3.5.25)(eslint@9.39.2(jiti@1.21.7)) - globals: 16.5.0 + globals: 17.0.0 jsonc-eslint-parser: 2.4.2 local-pkg: 1.1.2 parse-gitignore: 2.0.0 - toml-eslint-parser: 0.10.1 + toml-eslint-parser: 1.0.2 vue-eslint-parser: 10.2.0(eslint@9.39.2(jiti@1.21.7)) yaml-eslint-parser: 1.3.2 optionalDependencies: - '@eslint-react/eslint-plugin': 2.3.13(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + '@eslint-react/eslint-plugin': 2.7.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) '@next/eslint-plugin-next': 15.5.9 eslint-plugin-react-hooks: 7.0.1(eslint@9.39.2(jiti@1.21.7)) eslint-plugin-react-refresh: 0.4.26(eslint@9.39.2(jiti@1.21.7)) @@ -9785,14 +9763,6 @@ snapshots: '@epic-web/invariant@1.0.0': {} - '@es-joy/jsdoccomment@0.76.0': - dependencies: - '@types/estree': 1.0.8 - '@typescript-eslint/types': 8.50.1 - comment-parser: 1.4.1 - esquery: 1.6.0 - jsdoc-type-pratt-parser: 6.10.0 - '@es-joy/jsdoccomment@0.78.0': dependencies: '@types/estree': 1.0.8 @@ -9801,6 +9771,14 @@ snapshots: esquery: 1.6.0 jsdoc-type-pratt-parser: 7.0.0 + '@es-joy/jsdoccomment@0.79.0': + dependencies: + '@types/estree': 1.0.8 + '@typescript-eslint/types': 8.53.0 + comment-parser: 1.4.1 + esquery: 1.7.0 + jsdoc-type-pratt-parser: 7.0.0 + '@es-joy/resolve.exports@1.2.0': {} '@esbuild/aix-ppc64@0.27.2': @@ -9881,42 +9859,47 @@ snapshots: '@esbuild/win32-x64@0.27.2': optional: true - '@eslint-community/eslint-plugin-eslint-comments@4.5.0(eslint@9.39.2(jiti@1.21.7))': + '@eslint-community/eslint-plugin-eslint-comments@4.6.0(eslint@9.39.2(jiti@1.21.7))': dependencies: escape-string-regexp: 4.0.0 eslint: 9.39.2(jiti@1.21.7) - ignore: 5.3.2 + ignore: 7.0.5 '@eslint-community/eslint-utils@4.9.0(eslint@9.39.2(jiti@1.21.7))': dependencies: eslint: 9.39.2(jiti@1.21.7) eslint-visitor-keys: 3.4.3 + '@eslint-community/eslint-utils@4.9.1(eslint@9.39.2(jiti@1.21.7))': + dependencies: + eslint: 9.39.2(jiti@1.21.7) + eslint-visitor-keys: 3.4.3 + '@eslint-community/regexpp@4.12.1': {} '@eslint-community/regexpp@4.12.2': {} - '@eslint-react/ast@2.3.13(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3)': + '@eslint-react/ast@2.7.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3)': dependencies: - '@eslint-react/eff': 2.3.13 - '@typescript-eslint/types': 8.50.0 - '@typescript-eslint/typescript-estree': 8.50.0(typescript@5.9.3) - '@typescript-eslint/utils': 8.50.1(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + '@eslint-react/eff': 2.7.0 + '@typescript-eslint/types': 8.53.0 + '@typescript-eslint/typescript-estree': 8.53.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.53.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) eslint: 9.39.2(jiti@1.21.7) string-ts: 2.3.1 typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@eslint-react/core@2.3.13(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3)': + '@eslint-react/core@2.7.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3)': dependencies: - '@eslint-react/ast': 2.3.13(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) - '@eslint-react/eff': 2.3.13 - '@eslint-react/shared': 2.3.13(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) - '@eslint-react/var': 2.3.13(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.50.0 - '@typescript-eslint/types': 8.50.0 - '@typescript-eslint/utils': 8.50.1(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + '@eslint-react/ast': 2.7.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + '@eslint-react/eff': 2.7.0 + '@eslint-react/shared': 2.7.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + '@eslint-react/var': 2.7.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.53.0 + '@typescript-eslint/types': 8.53.0 + '@typescript-eslint/utils': 8.53.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) birecord: 0.1.1 eslint: 9.39.2(jiti@1.21.7) ts-pattern: 5.9.0 @@ -9924,45 +9907,45 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint-react/eff@2.3.13': {} + '@eslint-react/eff@2.7.0': {} - '@eslint-react/eslint-plugin@2.3.13(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3)': + '@eslint-react/eslint-plugin@2.7.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3)': dependencies: - '@eslint-react/eff': 2.3.13 - '@eslint-react/shared': 2.3.13(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.49.0 - '@typescript-eslint/type-utils': 8.49.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) - '@typescript-eslint/types': 8.49.0 - '@typescript-eslint/utils': 8.50.1(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + '@eslint-react/eff': 2.7.0 + '@eslint-react/shared': 2.7.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.53.0 + '@typescript-eslint/type-utils': 8.53.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + '@typescript-eslint/types': 8.53.0 + '@typescript-eslint/utils': 8.53.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) eslint: 9.39.2(jiti@1.21.7) - eslint-plugin-react-dom: 2.3.13(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) - eslint-plugin-react-hooks-extra: 2.3.13(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) - eslint-plugin-react-naming-convention: 2.3.13(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) - eslint-plugin-react-web-api: 2.3.13(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) - eslint-plugin-react-x: 2.3.13(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) - ts-api-utils: 2.1.0(typescript@5.9.3) + eslint-plugin-react-dom: 2.7.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + eslint-plugin-react-hooks-extra: 2.7.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + eslint-plugin-react-naming-convention: 2.7.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + eslint-plugin-react-web-api: 2.7.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + eslint-plugin-react-x: 2.7.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + ts-api-utils: 2.4.0(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@eslint-react/shared@2.3.13(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3)': + '@eslint-react/shared@2.7.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3)': dependencies: - '@eslint-react/eff': 2.3.13 - '@typescript-eslint/utils': 8.50.1(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + '@eslint-react/eff': 2.7.0 + '@typescript-eslint/utils': 8.53.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) eslint: 9.39.2(jiti@1.21.7) ts-pattern: 5.9.0 typescript: 5.9.3 - zod: 4.1.13 + zod: 3.25.76 transitivePeerDependencies: - supports-color - '@eslint-react/var@2.3.13(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3)': + '@eslint-react/var@2.7.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3)': dependencies: - '@eslint-react/ast': 2.3.13(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) - '@eslint-react/eff': 2.3.13 - '@typescript-eslint/scope-manager': 8.50.0 - '@typescript-eslint/types': 8.50.0 - '@typescript-eslint/utils': 8.50.1(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + '@eslint-react/ast': 2.7.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + '@eslint-react/eff': 2.7.0 + '@typescript-eslint/scope-manager': 8.53.0 + '@typescript-eslint/types': 8.53.0 + '@typescript-eslint/utils': 8.53.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) eslint: 9.39.2(jiti@1.21.7) ts-pattern: 5.9.0 typescript: 5.9.3 @@ -9987,11 +9970,11 @@ snapshots: dependencies: '@eslint/core': 0.17.0 - '@eslint/core@0.15.2': + '@eslint/core@0.17.0': dependencies: '@types/json-schema': 7.0.15 - '@eslint/core@0.17.0': + '@eslint/core@1.0.1': dependencies: '@types/json-schema': 7.0.15 @@ -10014,7 +9997,7 @@ snapshots: '@eslint/markdown@7.5.1': dependencies: '@eslint/core': 0.17.0 - '@eslint/plugin-kit': 0.3.5 + '@eslint/plugin-kit': 0.4.1 github-slugger: 2.0.0 mdast-util-from-markdown: 2.0.2 mdast-util-frontmatter: 2.0.1 @@ -10027,9 +10010,14 @@ snapshots: '@eslint/object-schema@2.1.7': {} - '@eslint/plugin-kit@0.3.5': + '@eslint/plugin-kit@0.4.1': dependencies: - '@eslint/core': 0.15.2 + '@eslint/core': 0.17.0 + levn: 0.4.1 + + '@eslint/plugin-kit@0.5.1': + dependencies: + '@eslint/core': 1.0.1 levn: 0.4.1 '@floating-ui/core@1.7.3': @@ -11610,13 +11598,13 @@ snapshots: optionalDependencies: typescript: 5.9.3 - '@stylistic/eslint-plugin@5.6.1(eslint@9.39.2(jiti@1.21.7))': + '@stylistic/eslint-plugin@5.7.0(eslint@9.39.2(jiti@1.21.7))': dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.2(jiti@1.21.7)) - '@typescript-eslint/types': 8.50.1 + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2(jiti@1.21.7)) + '@typescript-eslint/types': 8.53.0 eslint: 9.39.2(jiti@1.21.7) - eslint-visitor-keys: 4.2.1 - espree: 10.4.0 + eslint-visitor-keys: 5.0.0 + espree: 11.0.0 estraverse: 5.3.0 picomatch: 4.0.3 @@ -12147,52 +12135,34 @@ snapshots: '@types/zen-observable@0.8.3': {} - '@typescript-eslint/eslint-plugin@8.50.0(@typescript-eslint/parser@8.50.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3)': + '@typescript-eslint/eslint-plugin@8.53.0(@typescript-eslint/parser@8.53.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.50.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.50.0 - '@typescript-eslint/type-utils': 8.50.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) - '@typescript-eslint/utils': 8.50.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.50.0 + '@typescript-eslint/parser': 8.53.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.53.0 + '@typescript-eslint/type-utils': 8.53.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + '@typescript-eslint/utils': 8.53.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.53.0 eslint: 9.39.2(jiti@1.21.7) ignore: 7.0.5 natural-compare: 1.4.0 - ts-api-utils: 2.1.0(typescript@5.9.3) + ts-api-utils: 2.4.0(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.50.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3)': + '@typescript-eslint/parser@8.53.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3)': dependencies: - '@typescript-eslint/scope-manager': 8.50.0 - '@typescript-eslint/types': 8.50.0 - '@typescript-eslint/typescript-estree': 8.50.0(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.50.0 + '@typescript-eslint/scope-manager': 8.53.0 + '@typescript-eslint/types': 8.53.0 + '@typescript-eslint/typescript-estree': 8.53.0(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.53.0 debug: 4.4.3 eslint: 9.39.2(jiti@1.21.7) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.49.0(typescript@5.9.3)': - dependencies: - '@typescript-eslint/tsconfig-utils': 8.49.0(typescript@5.9.3) - '@typescript-eslint/types': 8.50.0 - debug: 4.4.3 - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/project-service@8.50.0(typescript@5.9.3)': - dependencies: - '@typescript-eslint/tsconfig-utils': 8.50.1(typescript@5.9.3) - '@typescript-eslint/types': 8.50.1 - debug: 4.4.3 - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - '@typescript-eslint/project-service@8.50.1(typescript@5.9.3)': dependencies: '@typescript-eslint/tsconfig-utils': 8.50.1(typescript@5.9.3) @@ -12202,92 +12172,48 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.49.0': + '@typescript-eslint/project-service@8.53.0(typescript@5.9.3)': dependencies: - '@typescript-eslint/types': 8.49.0 - '@typescript-eslint/visitor-keys': 8.49.0 - - '@typescript-eslint/scope-manager@8.50.0': - dependencies: - '@typescript-eslint/types': 8.50.0 - '@typescript-eslint/visitor-keys': 8.50.0 + '@typescript-eslint/tsconfig-utils': 8.53.0(typescript@5.9.3) + '@typescript-eslint/types': 8.53.0 + debug: 4.4.3 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color '@typescript-eslint/scope-manager@8.50.1': dependencies: '@typescript-eslint/types': 8.50.1 '@typescript-eslint/visitor-keys': 8.50.1 - '@typescript-eslint/tsconfig-utils@8.49.0(typescript@5.9.3)': + '@typescript-eslint/scope-manager@8.53.0': dependencies: - typescript: 5.9.3 - - '@typescript-eslint/tsconfig-utils@8.50.0(typescript@5.9.3)': - dependencies: - typescript: 5.9.3 + '@typescript-eslint/types': 8.53.0 + '@typescript-eslint/visitor-keys': 8.53.0 '@typescript-eslint/tsconfig-utils@8.50.1(typescript@5.9.3)': dependencies: typescript: 5.9.3 - '@typescript-eslint/type-utils@8.49.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3)': + '@typescript-eslint/tsconfig-utils@8.53.0(typescript@5.9.3)': dependencies: - '@typescript-eslint/types': 8.49.0 - '@typescript-eslint/typescript-estree': 8.49.0(typescript@5.9.3) - '@typescript-eslint/utils': 8.49.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + typescript: 5.9.3 + + '@typescript-eslint/type-utils@8.53.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3)': + dependencies: + '@typescript-eslint/types': 8.53.0 + '@typescript-eslint/typescript-estree': 8.53.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.53.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) debug: 4.4.3 eslint: 9.39.2(jiti@1.21.7) - ts-api-utils: 2.1.0(typescript@5.9.3) + ts-api-utils: 2.4.0(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/type-utils@8.50.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3)': - dependencies: - '@typescript-eslint/types': 8.50.0 - '@typescript-eslint/typescript-estree': 8.50.0(typescript@5.9.3) - '@typescript-eslint/utils': 8.50.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) - debug: 4.4.3 - eslint: 9.39.2(jiti@1.21.7) - ts-api-utils: 2.1.0(typescript@5.9.3) - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/types@8.49.0': {} - - '@typescript-eslint/types@8.50.0': {} - '@typescript-eslint/types@8.50.1': {} - '@typescript-eslint/typescript-estree@8.49.0(typescript@5.9.3)': - dependencies: - '@typescript-eslint/project-service': 8.49.0(typescript@5.9.3) - '@typescript-eslint/tsconfig-utils': 8.49.0(typescript@5.9.3) - '@typescript-eslint/types': 8.49.0 - '@typescript-eslint/visitor-keys': 8.49.0 - debug: 4.4.3 - minimatch: 9.0.5 - semver: 7.7.3 - tinyglobby: 0.2.15 - ts-api-utils: 2.1.0(typescript@5.9.3) - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/typescript-estree@8.50.0(typescript@5.9.3)': - dependencies: - '@typescript-eslint/project-service': 8.50.0(typescript@5.9.3) - '@typescript-eslint/tsconfig-utils': 8.50.0(typescript@5.9.3) - '@typescript-eslint/types': 8.50.0 - '@typescript-eslint/visitor-keys': 8.50.0 - debug: 4.4.3 - minimatch: 9.0.5 - semver: 7.7.3 - tinyglobby: 0.2.15 - ts-api-utils: 2.1.0(typescript@5.9.3) - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color + '@typescript-eslint/types@8.53.0': {} '@typescript-eslint/typescript-estree@8.50.1(typescript@5.9.3)': dependencies: @@ -12304,24 +12230,17 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.49.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3)': + '@typescript-eslint/typescript-estree@8.53.0(typescript@5.9.3)': dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.2(jiti@1.21.7)) - '@typescript-eslint/scope-manager': 8.49.0 - '@typescript-eslint/types': 8.49.0 - '@typescript-eslint/typescript-estree': 8.49.0(typescript@5.9.3) - eslint: 9.39.2(jiti@1.21.7) - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/utils@8.50.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3)': - dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.2(jiti@1.21.7)) - '@typescript-eslint/scope-manager': 8.50.0 - '@typescript-eslint/types': 8.50.0 - '@typescript-eslint/typescript-estree': 8.50.0(typescript@5.9.3) - eslint: 9.39.2(jiti@1.21.7) + '@typescript-eslint/project-service': 8.53.0(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.53.0(typescript@5.9.3) + '@typescript-eslint/types': 8.53.0 + '@typescript-eslint/visitor-keys': 8.53.0 + debug: 4.4.3 + minimatch: 9.0.5 + semver: 7.7.3 + tinyglobby: 0.2.15 + ts-api-utils: 2.4.0(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -12337,21 +12256,27 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.49.0': + '@typescript-eslint/utils@8.53.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3)': dependencies: - '@typescript-eslint/types': 8.49.0 - eslint-visitor-keys: 4.2.1 - - '@typescript-eslint/visitor-keys@8.50.0': - dependencies: - '@typescript-eslint/types': 8.50.0 - eslint-visitor-keys: 4.2.1 + '@eslint-community/eslint-utils': 4.9.1(eslint@9.39.2(jiti@1.21.7)) + '@typescript-eslint/scope-manager': 8.53.0 + '@typescript-eslint/types': 8.53.0 + '@typescript-eslint/typescript-estree': 8.53.0(typescript@5.9.3) + eslint: 9.39.2(jiti@1.21.7) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color '@typescript-eslint/visitor-keys@8.50.1': dependencies: '@typescript-eslint/types': 8.50.1 eslint-visitor-keys: 4.2.1 + '@typescript-eslint/visitor-keys@8.53.0': + dependencies: + '@typescript-eslint/types': 8.53.0 + eslint-visitor-keys: 4.2.1 + '@typescript/native-preview-darwin-arm64@7.0.0-dev.20251209.1': optional: true @@ -12414,10 +12339,10 @@ snapshots: transitivePeerDependencies: - supports-color - '@vitest/eslint-plugin@1.6.1(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3)(vitest@4.0.16(@types/node@18.15.0)(happy-dom@20.0.11)(jiti@1.21.7)(jsdom@27.3.0(canvas@3.2.0))(sass@1.95.0)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))': + '@vitest/eslint-plugin@1.6.6(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3)(vitest@4.0.16(@types/node@18.15.0)(happy-dom@20.0.11)(jiti@1.21.7)(jsdom@27.3.0(canvas@3.2.0))(sass@1.95.0)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))': dependencies: - '@typescript-eslint/scope-manager': 8.50.1 - '@typescript-eslint/utils': 8.50.1(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.53.0 + '@typescript-eslint/utils': 8.53.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) eslint: 9.39.2(jiti@1.21.7) optionalDependencies: typescript: 5.9.3 @@ -13742,7 +13667,7 @@ snapshots: dependencies: eslint: 9.39.2(jiti@1.21.7) - eslint-plugin-antfu@3.1.1(eslint@9.39.2(jiti@1.21.7)): + eslint-plugin-antfu@3.1.3(eslint@9.39.2(jiti@1.21.7)): dependencies: eslint: 9.39.2(jiti@1.21.7) @@ -13758,23 +13683,21 @@ snapshots: eslint: 9.39.2(jiti@1.21.7) eslint-compat-utils: 0.5.1(eslint@9.39.2(jiti@1.21.7)) - eslint-plugin-import-lite@0.4.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3): + eslint-plugin-import-lite@0.5.0(eslint@9.39.2(jiti@1.21.7)): dependencies: eslint: 9.39.2(jiti@1.21.7) - optionalDependencies: - typescript: 5.9.3 - eslint-plugin-jsdoc@61.5.0(eslint@9.39.2(jiti@1.21.7)): + eslint-plugin-jsdoc@62.0.0(eslint@9.39.2(jiti@1.21.7)): dependencies: - '@es-joy/jsdoccomment': 0.76.0 + '@es-joy/jsdoccomment': 0.79.0 '@es-joy/resolve.exports': 1.2.0 are-docs-informative: 0.0.2 comment-parser: 1.4.1 debug: 4.4.3 escape-string-regexp: 4.0.0 eslint: 9.39.2(jiti@1.21.7) - espree: 10.4.0 - esquery: 1.6.0 + espree: 11.0.0 + esquery: 1.7.0 html-entities: 2.6.0 object-deep-merge: 2.0.0 parse-imports-exports: 0.2.4 @@ -13799,7 +13722,7 @@ snapshots: transitivePeerDependencies: - '@eslint/json' - eslint-plugin-n@17.23.1(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3): + eslint-plugin-n@17.23.2(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3): dependencies: '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.2(jiti@1.21.7)) enhanced-resolve: 5.18.3 @@ -13816,10 +13739,9 @@ snapshots: eslint-plugin-no-only-tests@3.3.0: {} - eslint-plugin-perfectionist@4.15.1(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3): + eslint-plugin-perfectionist@5.3.1(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3): dependencies: - '@typescript-eslint/types': 8.50.1 - '@typescript-eslint/utils': 8.50.1(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + '@typescript-eslint/utils': 8.53.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) eslint: 9.39.2(jiti@1.21.7) natural-orderby: 5.0.0 transitivePeerDependencies: @@ -13837,16 +13759,16 @@ snapshots: yaml: 2.8.2 yaml-eslint-parser: 1.3.2 - eslint-plugin-react-dom@2.3.13(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3): + eslint-plugin-react-dom@2.7.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3): dependencies: - '@eslint-react/ast': 2.3.13(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) - '@eslint-react/core': 2.3.13(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) - '@eslint-react/eff': 2.3.13 - '@eslint-react/shared': 2.3.13(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) - '@eslint-react/var': 2.3.13(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.49.0 - '@typescript-eslint/types': 8.49.0 - '@typescript-eslint/utils': 8.50.1(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + '@eslint-react/ast': 2.7.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + '@eslint-react/core': 2.7.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + '@eslint-react/eff': 2.7.0 + '@eslint-react/shared': 2.7.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + '@eslint-react/var': 2.7.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.53.0 + '@typescript-eslint/types': 8.53.0 + '@typescript-eslint/utils': 8.53.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) compare-versions: 6.1.1 eslint: 9.39.2(jiti@1.21.7) string-ts: 2.3.1 @@ -13855,17 +13777,17 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-plugin-react-hooks-extra@2.3.13(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3): + eslint-plugin-react-hooks-extra@2.7.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3): dependencies: - '@eslint-react/ast': 2.3.13(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) - '@eslint-react/core': 2.3.13(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) - '@eslint-react/eff': 2.3.13 - '@eslint-react/shared': 2.3.13(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) - '@eslint-react/var': 2.3.13(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.49.0 - '@typescript-eslint/type-utils': 8.49.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) - '@typescript-eslint/types': 8.49.0 - '@typescript-eslint/utils': 8.50.1(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + '@eslint-react/ast': 2.7.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + '@eslint-react/core': 2.7.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + '@eslint-react/eff': 2.7.0 + '@eslint-react/shared': 2.7.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + '@eslint-react/var': 2.7.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.53.0 + '@typescript-eslint/type-utils': 8.53.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + '@typescript-eslint/types': 8.53.0 + '@typescript-eslint/utils': 8.53.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) eslint: 9.39.2(jiti@1.21.7) string-ts: 2.3.1 ts-pattern: 5.9.0 @@ -13884,17 +13806,18 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-plugin-react-naming-convention@2.3.13(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3): + eslint-plugin-react-naming-convention@2.7.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3): dependencies: - '@eslint-react/ast': 2.3.13(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) - '@eslint-react/core': 2.3.13(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) - '@eslint-react/eff': 2.3.13 - '@eslint-react/shared': 2.3.13(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) - '@eslint-react/var': 2.3.13(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.49.0 - '@typescript-eslint/type-utils': 8.49.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) - '@typescript-eslint/types': 8.49.0 - '@typescript-eslint/utils': 8.50.1(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + '@eslint-react/ast': 2.7.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + '@eslint-react/core': 2.7.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + '@eslint-react/eff': 2.7.0 + '@eslint-react/shared': 2.7.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + '@eslint-react/var': 2.7.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.53.0 + '@typescript-eslint/type-utils': 8.53.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + '@typescript-eslint/types': 8.53.0 + '@typescript-eslint/utils': 8.53.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + compare-versions: 6.1.1 eslint: 9.39.2(jiti@1.21.7) string-ts: 2.3.1 ts-pattern: 5.9.0 @@ -13906,16 +13829,16 @@ snapshots: dependencies: eslint: 9.39.2(jiti@1.21.7) - eslint-plugin-react-web-api@2.3.13(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3): + eslint-plugin-react-web-api@2.7.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3): dependencies: - '@eslint-react/ast': 2.3.13(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) - '@eslint-react/core': 2.3.13(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) - '@eslint-react/eff': 2.3.13 - '@eslint-react/shared': 2.3.13(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) - '@eslint-react/var': 2.3.13(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.49.0 - '@typescript-eslint/types': 8.49.0 - '@typescript-eslint/utils': 8.50.1(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + '@eslint-react/ast': 2.7.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + '@eslint-react/core': 2.7.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + '@eslint-react/eff': 2.7.0 + '@eslint-react/shared': 2.7.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + '@eslint-react/var': 2.7.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.53.0 + '@typescript-eslint/types': 8.53.0 + '@typescript-eslint/utils': 8.53.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) eslint: 9.39.2(jiti@1.21.7) string-ts: 2.3.1 ts-pattern: 5.9.0 @@ -13923,22 +13846,22 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-plugin-react-x@2.3.13(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3): + eslint-plugin-react-x@2.7.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3): dependencies: - '@eslint-react/ast': 2.3.13(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) - '@eslint-react/core': 2.3.13(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) - '@eslint-react/eff': 2.3.13 - '@eslint-react/shared': 2.3.13(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) - '@eslint-react/var': 2.3.13(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.49.0 - '@typescript-eslint/type-utils': 8.49.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) - '@typescript-eslint/types': 8.49.0 - '@typescript-eslint/utils': 8.50.1(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + '@eslint-react/ast': 2.7.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + '@eslint-react/core': 2.7.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + '@eslint-react/eff': 2.7.0 + '@eslint-react/shared': 2.7.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + '@eslint-react/var': 2.7.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.53.0 + '@typescript-eslint/type-utils': 8.53.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + '@typescript-eslint/types': 8.53.0 + '@typescript-eslint/utils': 8.53.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) compare-versions: 6.1.1 eslint: 9.39.2(jiti@1.21.7) is-immutable-type: 5.0.1(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) string-ts: 2.3.1 - ts-api-utils: 2.1.0(typescript@5.9.3) + ts-api-utils: 2.4.0(typescript@5.9.3) ts-pattern: 5.9.0 typescript: 5.9.3 transitivePeerDependencies: @@ -13969,7 +13892,7 @@ snapshots: semver: 7.7.2 typescript: 5.9.3 - eslint-plugin-storybook@10.1.10(eslint@9.39.2(jiti@1.21.7))(storybook@9.1.17(@testing-library/dom@10.4.1)(vite@7.3.0(@types/node@18.15.0)(jiti@1.21.7)(sass@1.95.0)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)))(typescript@5.9.3): + eslint-plugin-storybook@10.1.11(eslint@9.39.2(jiti@1.21.7))(storybook@9.1.17(@testing-library/dom@10.4.1)(vite@7.3.0(@types/node@18.15.0)(jiti@1.21.7)(sass@1.95.0)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)))(typescript@5.9.3): dependencies: '@typescript-eslint/utils': 8.50.1(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) eslint: 9.39.2(jiti@1.21.7) @@ -13984,13 +13907,13 @@ snapshots: postcss: 8.5.6 tailwindcss: 3.4.18(tsx@4.21.0)(yaml@2.8.2) - eslint-plugin-toml@0.12.0(eslint@9.39.2(jiti@1.21.7)): + eslint-plugin-toml@1.0.0(eslint@9.39.2(jiti@1.21.7)): dependencies: + '@eslint/core': 1.0.1 + '@eslint/plugin-kit': 0.5.1 debug: 4.4.3 eslint: 9.39.2(jiti@1.21.7) - eslint-compat-utils: 0.6.5(eslint@9.39.2(jiti@1.21.7)) - lodash: 4.17.21 - toml-eslint-parser: 0.10.1 + toml-eslint-parser: 1.0.2 transitivePeerDependencies: - supports-color @@ -13998,7 +13921,7 @@ snapshots: dependencies: '@babel/helper-validator-identifier': 7.28.5 '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.2(jiti@1.21.7)) - '@eslint/plugin-kit': 0.3.5 + '@eslint/plugin-kit': 0.4.1 change-case: 5.4.4 ci-info: 4.3.1 clean-regexp: 1.0.0 @@ -14016,13 +13939,13 @@ snapshots: semver: 7.7.3 strip-indent: 4.1.1 - eslint-plugin-unused-imports@4.3.0(@typescript-eslint/eslint-plugin@8.50.0(@typescript-eslint/parser@8.50.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.2(jiti@1.21.7)): + eslint-plugin-unused-imports@4.3.0(@typescript-eslint/eslint-plugin@8.53.0(@typescript-eslint/parser@8.53.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.2(jiti@1.21.7)): dependencies: eslint: 9.39.2(jiti@1.21.7) optionalDependencies: - '@typescript-eslint/eslint-plugin': 8.50.0(@typescript-eslint/parser@8.50.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + '@typescript-eslint/eslint-plugin': 8.53.0(@typescript-eslint/parser@8.53.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) - eslint-plugin-vue@10.6.2(@stylistic/eslint-plugin@5.6.1(eslint@9.39.2(jiti@1.21.7)))(@typescript-eslint/parser@8.50.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.2(jiti@1.21.7))(vue-eslint-parser@10.2.0(eslint@9.39.2(jiti@1.21.7))): + eslint-plugin-vue@10.6.2(@stylistic/eslint-plugin@5.7.0(eslint@9.39.2(jiti@1.21.7)))(@typescript-eslint/parser@8.53.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3))(eslint@9.39.2(jiti@1.21.7))(vue-eslint-parser@10.2.0(eslint@9.39.2(jiti@1.21.7))): dependencies: '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.2(jiti@1.21.7)) eslint: 9.39.2(jiti@1.21.7) @@ -14033,8 +13956,8 @@ snapshots: vue-eslint-parser: 10.2.0(eslint@9.39.2(jiti@1.21.7)) xml-name-validator: 4.0.0 optionalDependencies: - '@stylistic/eslint-plugin': 5.6.1(eslint@9.39.2(jiti@1.21.7)) - '@typescript-eslint/parser': 8.50.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + '@stylistic/eslint-plugin': 5.7.0(eslint@9.39.2(jiti@1.21.7)) + '@typescript-eslint/parser': 8.53.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) eslint-plugin-yml@1.19.1(eslint@9.39.2(jiti@1.21.7)): dependencies: @@ -14067,6 +13990,8 @@ snapshots: eslint-visitor-keys@4.2.1: {} + eslint-visitor-keys@5.0.0: {} + eslint@9.39.2(jiti@1.21.7): dependencies: '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.2(jiti@1.21.7)) @@ -14076,7 +14001,7 @@ snapshots: '@eslint/core': 0.17.0 '@eslint/eslintrc': 3.3.3 '@eslint/js': 9.39.2 - '@eslint/plugin-kit': 0.3.5 + '@eslint/plugin-kit': 0.4.1 '@humanfs/node': 0.16.7 '@humanwhocodes/module-importer': 1.0.1 '@humanwhocodes/retry': 0.4.3 @@ -14114,6 +14039,12 @@ snapshots: acorn-jsx: 5.3.2(acorn@8.15.0) eslint-visitor-keys: 4.2.1 + espree@11.0.0: + dependencies: + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) + eslint-visitor-keys: 5.0.0 + espree@9.6.1: dependencies: acorn: 8.15.0 @@ -14126,6 +14057,10 @@ snapshots: dependencies: estraverse: 5.3.0 + esquery@1.7.0: + dependencies: + estraverse: 5.3.0 + esrecurse@4.3.0: dependencies: estraverse: 5.3.0 @@ -14414,6 +14349,8 @@ snapshots: globals@16.5.0: {} + globals@17.0.0: {} + globrex@0.1.2: {} goober@2.1.18(csstype@3.2.3): @@ -14801,9 +14738,9 @@ snapshots: is-immutable-type@5.0.1(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3): dependencies: - '@typescript-eslint/type-utils': 8.49.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) + '@typescript-eslint/type-utils': 8.53.0(eslint@9.39.2(jiti@1.21.7))(typescript@5.9.3) eslint: 9.39.2(jiti@1.21.7) - ts-api-utils: 2.1.0(typescript@5.9.3) + ts-api-utils: 2.4.0(typescript@5.9.3) ts-declaration-location: 1.0.7(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: @@ -14889,8 +14826,6 @@ snapshots: jsdoc-type-pratt-parser@4.8.0: {} - jsdoc-type-pratt-parser@6.10.0: {} - jsdoc-type-pratt-parser@7.0.0: {} jsdom-testing-mocks@1.16.0: @@ -17345,9 +17280,9 @@ snapshots: toggle-selection@1.0.6: {} - toml-eslint-parser@0.10.1: + toml-eslint-parser@1.0.2: dependencies: - eslint-visitor-keys: 3.4.3 + eslint-visitor-keys: 5.0.0 totalist@3.0.1: {} @@ -17371,6 +17306,10 @@ snapshots: dependencies: typescript: 5.9.3 + ts-api-utils@2.4.0(typescript@5.9.3): + dependencies: + typescript: 5.9.3 + ts-debounce@4.0.0: {} ts-declaration-location@1.0.7(typescript@5.9.3): diff --git a/web/service/fetch.ts b/web/service/fetch.ts index d6f1af3b3f..04dfe74cc2 100644 --- a/web/service/fetch.ts +++ b/web/service/fetch.ts @@ -24,8 +24,12 @@ export type FetchOptionType = Omit & { } const afterResponse204: AfterResponseHook = async (_request, _options, response) => { - if (response.status === 204) - return Response.json({ result: 'success' }) + if (response.status === 204) { + return new Response(JSON.stringify({ result: 'success' }), { + status: 200, + headers: { 'Content-Type': ContentType.json }, + }) + } } export type ResponseError = { diff --git a/web/tsconfig.json b/web/tsconfig.json index 78c5930aa2..c7aa998644 100644 --- a/web/tsconfig.json +++ b/web/tsconfig.json @@ -1,7 +1,7 @@ { "compilerOptions": { "incremental": true, - "target": "es2015", + "target": "es2022", "jsx": "preserve", "lib": [ "dom", diff --git a/web/vitest.setup.ts b/web/vitest.setup.ts index 26dc25bbcf..597ded9559 100644 --- a/web/vitest.setup.ts +++ b/web/vitest.setup.ts @@ -85,6 +85,10 @@ afterEach(() => { // mock next/image to avoid width/height requirements for data URLs vi.mock('next/image') +// mock zustand - auto-resets all stores after each test +// Based on official Zustand testing guide: https://zustand.docs.pmnd.rs/guides/testing +vi.mock('zustand') + // mock react-i18next vi.mock('react-i18next', async () => { const actual = await vi.importActual('react-i18next')