@cryptotaxi247 / CoPilot / commits / 9b040b5f

Incident reports docx (#325)

* `refactor: Update endpoint in provision.py` * `refactor: Update endpoint in provision.py` * chore: update dependencies in frontend * refactor: update case export service * add case report templates db table * `chore: Add copilot-case-report-templates bucket creation during initialization` * `refactor: Update route for generating incident report CSV` * refactor: Update route for generating incident case report CSV * upload case report template to datastore and db * delete case report template functions and route * download report template function and route * testing downloading case and applying jinja template * loading alert with context * `refactor: Remove commented out code for creating case context` * build for wazuh group template creation fix * `chore: Update branch name in Docker workflow` * add docxtpl to requirements * `chore: Update branch name in Docker workflow` * bump lxml down * `chore: Update branch name in Docker workflow` * comment docx out for now * `chore: Update branch name in Docker workflow` * `chore: Update branch name in Docker workflow` * `chore: Update branch name in Docker workflow` * reimplment docx * `chore: Bump typing_extensions to version 4.9.0` * CaseDownloadDocxRequest model * chore: Update branch name in Docker workflow * `chore: Add endpoint to list case report template files` * `feat: Add endpoint to create default case report template` * `chore: Add file type validation for uploaded case report template` * chore: update dependencies in frontend * feat: add case report api/types * refactor: case list page * feat: add new utility type * feat: add case report template store * feat: add case report feature * `feat: Add endpoint to check if any of the default case report template files exist` * fix: case report component link * feat: add default template check * some route docs * precommit fixes --------- Co-authored-by: Davide Di Modica <webmaster.ddm@gmail.com>

taylor_socfortress committed Oct 16, 2024 at 11:03 UTC 9b040b5ffd131b3292e76d4c64f39106b1a0c7f0
31 files changed +2821 -852
.github/workflows/docker.yml
+2 -2
@@ -27,7 +27,7 @@ jobs:
27 with:
28 context: ./backend
29 push: true
30 - tags: ghcr.io/socfortress/copilot-backend:latest
30 + tags: ghcr.io/socfortress/copilot-backend:lab
31 build-args: |
32 COPILOT_API_KEY=${{ secrets.COPILOT_API_KEY }}
33
@@ -60,7 +60,7 @@ jobs:
60 with:
61 context: ./frontend
62 push: true
63 - tags: ghcr.io/socfortress/copilot-frontend:latest
63 + tags: ghcr.io/socfortress/copilot-frontend:lab
64
65 - name: Notify Discord
66 uses: appleboy/discord-action@v1.0.0
backend/alembic/alembic.ini
+1 -1
@@ -60,7 +60,7 @@ version_path_separator = os # Use os.pathsep. Default configuration used for ne
60 # are written from script.py.mako
61 # output_encoding = utf-8
62
63 -sqlalchemy.url = mysql+pymysql://copilot:H7U3AHsXWSGvE5L123B7$GQdLQz@10.255.254.2/copilot
63 +sqlalchemy.url = mysql+pymysql://copilot:REPLACE_ME@copilot-mysql/copilot
64
65
66 [post_write_hooks]
backend/alembic/env.py
+1
@@ -32,6 +32,7 @@ from app.incidents.models import AssetFieldName
32 from app.incidents.models import Case
33 from app.incidents.models import CaseAlertLink
34 from app.incidents.models import CaseDataStore
35 +from app.incidents.models import CaseReportTemplateDataStore
36 from app.incidents.models import Comment
37 from app.incidents.models import CustomerCodeFieldName
38 from app.incidents.models import FieldName
backend/alembic/versions/a1e4beb87498_add_table_for_case_report_templates.py new
+43
@@ -0,0 +1,43 @@
1 +"""Add table for case report templates
2 +
3 +Revision ID: a1e4beb87498
4 +Revises: ba64d98dbdc5
5 +Create Date: 2024-10-03 10:14:31.289126
6 +
7 +"""
8 +from typing import Sequence
9 +from typing import Union
10 +
11 +import sqlalchemy as sa
12 +
13 +from alembic import op
14 +
15 +# revision identifiers, used by Alembic.
16 +revision: str = "a1e4beb87498"
17 +down_revision: Union[str, None] = "ba64d98dbdc5"
18 +branch_labels: Union[str, Sequence[str], None] = None
19 +depends_on: Union[str, Sequence[str], None] = None
20 +
21 +
22 +def upgrade() -> None:
23 + # ### commands auto generated by Alembic - please adjust! ###
24 + op.create_table(
25 + "incident_management_case_report_template_datastore",
26 + sa.Column("id", sa.Integer(), nullable=False),
27 + sa.Column("report_template_name", sa.String(length=255), nullable=False),
28 + sa.Column("bucket_name", sa.String(length=255), nullable=False),
29 + sa.Column("object_key", sa.String(length=1024), nullable=False),
30 + sa.Column("file_name", sa.String(length=255), nullable=False),
31 + sa.Column("content_type", sa.String(length=100), nullable=True),
32 + sa.Column("file_size", sa.Integer(), nullable=True),
33 + sa.Column("upload_time", sa.DateTime(), nullable=False),
34 + sa.Column("file_hash", sa.String(length=128), nullable=False),
35 + sa.PrimaryKeyConstraint("id"),
36 + )
37 + # ### end Alembic commands ###
38 +
39 +
40 +def downgrade() -> None:
41 + # ### commands auto generated by Alembic - please adjust! ###
42 + op.drop_table("incident_management_case_report_template_datastore")
43 + # ### end Alembic commands ###
backend/app/customer_provisioning/services/wazuh_manager.py
+1 -1
@@ -125,7 +125,7 @@ async def configure_wazuh_group(group_code, template_path, request: ProvisionNew
125
126 # Make the API request to update the group configuration
127 return await send_wazuh_put_request(
128 - endpoint=f"groups/{group_code}/configuration",
128 + endpoint=f"/groups/{group_code}/configuration",
129 data=group_config,
130 xml_data=True,
131 )
backend/app/data_store/data_store_operations.py
+38 -1
@@ -1,4 +1,5 @@
1 import os
2 +from typing import Optional
3
4 import aiofiles
5 import aiohttp
@@ -7,6 +8,7 @@ from fastapi import UploadFile
8 from loguru import logger
9
10 from app.data_store.data_store_schema import CaseDataStoreCreation
11 +from app.data_store.data_store_schema import CaseReportTemplateDataStoreCreation
12 from app.data_store.data_store_session import create_session
13
14
@@ -43,7 +45,31 @@ async def upload_case_data_store(data: CaseDataStoreCreation, file: UploadFile)
45 os.remove(temp_file_path)
46
47
46 -async def download_case_data_store(bucket_name: str, object_name: str) -> bytes:
48 +async def upload_case_report_template_data_store(data: CaseReportTemplateDataStoreCreation, file: UploadFile) -> None:
49 + client = await create_session()
50 + logger.info(f"Uploading file {file.filename} to bucket {data.bucket_name}")
51 +
52 + # Define the temporary file path
53 + temp_file_path = os.path.join(os.getcwd(), file.filename)
54 +
55 + # Save the file to the temporary location
56 + async with aiofiles.open(temp_file_path, "wb") as out_file:
57 + content = await file.read()
58 + await out_file.write(content)
59 +
60 + # Upload the file to Minio
61 + await client.fput_object(
62 + bucket_name=data.bucket_name,
63 + object_name=f"{file.filename}",
64 + file_path=temp_file_path,
65 + content_type=data.content_type,
66 + )
67 +
68 + # Optionally, remove the temporary file after upload
69 + os.remove(temp_file_path)
70 +
71 +
72 +async def download_data_store(bucket_name: str, object_name: str) -> bytes:
73 client = await create_session()
74 logger.info(f"Downloading file {object_name} from bucket {bucket_name}")
75 try:
@@ -77,6 +103,17 @@ async def list_case_data_store_files(bucket_name: str, case_id: int) -> list:
103 return objects
104
105
106 +async def list_case_report_template_data_store_files(bucket_name: Optional[str] = "copilot-case-report-templates") -> list:
107 + client = await create_session()
108 + objects_list = []
109 + logger.info(f"Listing objects in bucket {bucket_name}")
110 + objects = await client.list_objects(bucket_name)
111 + for obj in objects:
112 + logger.info(f"Object: {obj.object_name}")
113 + objects_list.append(obj.object_name)
114 + return objects_list
115 +
116 +
117 async def create_buckets() -> None:
118 await create_bucket_if_not_exists("copilot-cases")
119
backend/app/data_store/data_store_schema.py
+10
@@ -14,3 +14,13 @@ class CaseDataStoreCreation(BaseModel):
14 file_size: Optional[int] = None
15 upload_time: datetime = Field(default_factory=datetime.utcnow)
16 file_hash: str = Field(max_length=128)
17 +
18 +
19 +class CaseReportTemplateDataStoreCreation(BaseModel):
20 + report_template_name: str = Field(max_length=255)
21 + bucket_name: str = Field(max_length=255)
22 + object_key: str = Field(max_length=1024)
23 + file_name: str = Field(max_length=255)
24 + content_type: Optional[str] = Field(max_length=100, default=None)
25 + upload_time: datetime = Field(default_factory=datetime.utcnow)
26 + file_hash: str = Field(max_length=128)
backend/app/data_store/data_store_setup.py
+1
@@ -14,3 +14,4 @@ async def create_bucket_if_not_exists(bucket_name: str) -> None:
14
15 async def create_buckets() -> None:
16 await create_bucket_if_not_exists("copilot-cases")
17 + await create_bucket_if_not_exists("copilot-case-report-templates")
backend/app/incidents/models.py
+14
@@ -165,3 +165,17 @@ class CaseDataStore(SQLModel, table=True):
165 file_hash: str = Field(max_length=128, nullable=False) # Hash of the file (e.g., SHA-256)
166
167 case: "Case" = Relationship(back_populates="data_store")
168 +
169 +
170 +class CaseReportTemplateDataStore(SQLModel, table=True):
171 + __tablename__ = "incident_management_case_report_template_datastore"
172 + id: Optional[int] = Field(default=None, primary_key=True)
173 +
174 + report_template_name: str = Field(max_length=255, nullable=False)
175 + bucket_name: str = Field(max_length=255, nullable=False) # Name of the MinIO bucket
176 + object_key: str = Field(max_length=1024, nullable=False) # Path/key of the file in MinIO
177 + file_name: str = Field(max_length=255, nullable=False) # Original file name uploaded by the user
178 + content_type: Optional[str] = Field(max_length=100, nullable=True) # MIME type of the file
179 + file_size: Optional[int] = Field(nullable=True) # File size in bytes
180 + upload_time: datetime = Field(default_factory=datetime.utcnow) # Time of upload
181 + file_hash: str = Field(max_length=128, nullable=False) # Hash of the file (e.g., SHA-256)
backend/app/incidents/routes/db_operations.py
+95
@@ -1,4 +1,5 @@
1 import io
2 +import mimetypes
3 from typing import List
4 from typing import Optional
5
@@ -20,6 +21,9 @@ from app.connectors.wazuh_indexer.utils.universal import (
21 from app.connectors.wazuh_indexer.utils.universal import get_index_mappings_key_names
22 from app.connectors.wazuh_indexer.utils.universal import get_index_source
23 from app.customer_provisioning.routes.provision import check_customer_exists
24 +from app.data_store.data_store_operations import (
25 + list_case_report_template_data_store_files,
26 +)
27 from app.db.db_session import get_db
28 from app.db.universal_models import Customers
29 from app.incidents.models import Alert
@@ -46,10 +50,13 @@ from app.incidents.schema.db_operations import CaseCreate
50 from app.incidents.schema.db_operations import CaseCreateFromAlert
51 from app.incidents.schema.db_operations import CaseDataStoreResponse
52 from app.incidents.schema.db_operations import CaseOutResponse
53 +from app.incidents.schema.db_operations import CaseReportTemplateDataStoreListResponse
54 +from app.incidents.schema.db_operations import CaseReportTemplateDataStoreResponse
55 from app.incidents.schema.db_operations import CaseResponse
56 from app.incidents.schema.db_operations import CommentCreate
57 from app.incidents.schema.db_operations import CommentResponse
58 from app.incidents.schema.db_operations import ConfiguredSourcesResponse
59 +from app.incidents.schema.db_operations import DefaultReportTemplateFileNames
60 from app.incidents.schema.db_operations import FieldAndAssetNames
61 from app.incidents.schema.db_operations import FieldAndAssetNamesResponse
62 from app.incidents.schema.db_operations import ListCaseDataStoreResponse
@@ -114,8 +121,10 @@ from app.incidents.services.db_operations import delete_asset_name
121 from app.incidents.services.db_operations import delete_case
122 from app.incidents.services.db_operations import delete_field_name
123 from app.incidents.services.db_operations import delete_file_from_case
124 +from app.incidents.services.db_operations import delete_report_template
125 from app.incidents.services.db_operations import delete_timefield_name
126 from app.incidents.services.db_operations import download_file_from_case
127 +from app.incidents.services.db_operations import download_report_template
128 from app.incidents.services.db_operations import file_exists
129 from app.incidents.services.db_operations import get_alert_by_id
130 from app.incidents.services.db_operations import get_alert_context_by_id
@@ -147,12 +156,15 @@ from app.incidents.services.db_operations import replace_alert_title_name
156 from app.incidents.services.db_operations import replace_asset_name
157 from app.incidents.services.db_operations import replace_field_name
158 from app.incidents.services.db_operations import replace_timefield_name
159 +from app.incidents.services.db_operations import report_template_exists
160 from app.incidents.services.db_operations import update_alert_assigned_to
161 from app.incidents.services.db_operations import update_alert_status
162 from app.incidents.services.db_operations import update_case_assigned_to
163 from app.incidents.services.db_operations import update_case_customer_code
164 from app.incidents.services.db_operations import update_case_status
165 from app.incidents.services.db_operations import upload_file_to_case
166 +from app.incidents.services.db_operations import upload_report_template
167 +from app.incidents.services.db_operations import upload_report_template_to_data_store
168 from app.incidents.services.db_operations import validate_source_exists
169
170 incidents_db_operations_router = APIRouter()
@@ -807,3 +819,86 @@ async def delete_case_data_store_file_endpoint(case_id: int, file_name: str, db:
819 @incidents_db_operations_router.get("/case/{case_id}", response_model=CaseOutResponse)
820 async def get_case_by_id_endpoint(case_id: int, db: AsyncSession = Depends(get_db)):
821 return CaseOutResponse(cases=[await get_case_by_id(case_id, db)], success=True, message="Case retrieved successfully")
822 +
823 +
824 +@incidents_db_operations_router.get("/case-report-template", response_model=CaseReportTemplateDataStoreListResponse)
825 +async def list_case_report_template_data_store_files_endpoint(db: AsyncSession = Depends(get_db)):
826 + logger.info("Listing all files in the data store")
827 + return CaseReportTemplateDataStoreListResponse(
828 + case_report_template_data_store=await list_case_report_template_data_store_files(),
829 + success=True,
830 + message="Files retrieved successfully",
831 + )
832 +
833 +
834 +@incidents_db_operations_router.get("/case-report-template/do-default-template-exists")
835 +async def check_default_case_report_template_exists_endpoint(db: AsyncSession = Depends(get_db)):
836 + """
837 + Endpoint to check if any of the default case report template files exist in the data store.
838 +
839 + If any of them do, return True, else return False.
840 +
841 + Returns:
842 + - success (bool): Indicates if the operation was successful.
843 + - message (str): Success message.
844 + - default_template_exists (bool): Indicates if any of the default case report template files exist in the data store.
845 + """
846 + for template in DefaultReportTemplateFileNames:
847 + if await report_template_exists(template.value, db):
848 + return {"success": True, "message": "Default case report template exists", "default_template_exists": True}
849 +
850 + return {"success": True, "message": "No default case report templates exist", "default_template_exists": False}
851 +
852 +
853 +@incidents_db_operations_router.post("/case-report-template/default-template", response_model=CaseReportTemplateDataStoreListResponse)
854 +async def create_default_case_report_template_endpoint(db: AsyncSession = Depends(get_db)):
855 + """
856 + Create a default case report template in the data store.
857 +
858 + Returns:
859 + CaseReportTemplateDataStoreListResponse: The response containing the created case report template data store.
860 +
861 + Raises:
862 + None
863 + """
864 + logger.info("Creating default file in the data store")
865 + return CaseReportTemplateDataStoreListResponse(
866 + case_report_template_data_store=await upload_report_template_to_data_store(db),
867 + success=True,
868 + message="Default file created successfully",
869 + )
870 +
871 +
872 +@incidents_db_operations_router.get("/case-report-template/download/{file_name}")
873 +async def download_case_report_template_endpoint(file_name: str, db: AsyncSession = Depends(get_db)) -> StreamingResponse:
874 + file_bytes, file_content_type = await download_report_template(file_name, db)
875 + logger.info(f"Streaming file {file_name}")
876 + output = io.BytesIO(file_bytes)
877 + output.seek(0)
878 +
879 + return StreamingResponse(output, media_type=file_content_type, headers={"Content-Disposition": f"attachment; filename={file_name}"})
880 +
881 +
882 +@incidents_db_operations_router.post("/case-report-template/upload", response_model=CaseReportTemplateDataStoreResponse)
883 +async def upload_case_report_template_endpoint(
884 + file: UploadFile = File(...),
885 + db: AsyncSession = Depends(get_db),
886 +):
887 + # Check if the file type is a .docx
888 + mime_type, _ = mimetypes.guess_type(file.filename)
889 + if mime_type != "application/vnd.openxmlformats-officedocument.wordprocessingml.document":
890 + raise HTTPException(status_code=400, detail="Invalid file type. Only .docx files are allowed.")
891 +
892 + if await report_template_exists(file.filename, db):
893 + raise HTTPException(status_code=400, detail="File name already exists for this template")
894 + return CaseReportTemplateDataStoreResponse(
895 + case_report_template_data_store=await upload_report_template(file, db),
896 + success=True,
897 + message="File uploaded successfully",
898 + )
899 +
900 +
901 +@incidents_db_operations_router.delete("/case-report-template/{file_name}")
902 +async def delete_case_report_template_endpoint(file_name: str, db: AsyncSession = Depends(get_db)):
903 + await delete_report_template(file_name, db)
904 + return {"message": "File deleted successfully", "success": True}
backend/app/incidents/routes/incident_report.py
+57 -2
@@ -7,6 +7,8 @@ from typing import List
7
8 from fastapi import APIRouter
9 from fastapi import Depends
10 +from fastapi import HTTPException
11 +from fastapi.responses import FileResponse
12 from fastapi.responses import StreamingResponse
13 from sqlalchemy.ext.asyncio import AsyncSession
14 from sqlalchemy.orm import selectinload
@@ -16,8 +18,16 @@ from app.customers.routes.customers import get_customer
18 from app.db.db_session import get_db
19 from app.incidents.models import Alert
20 from app.incidents.models import AlertToTag
21 +from app.incidents.models import Asset
22 from app.incidents.models import Case
23 from app.incidents.models import CaseAlertLink
24 +from app.incidents.schema.db_operations import CaseDownloadDocxRequest
25 +from app.incidents.services.reports import cleanup_temp_files
26 +from app.incidents.services.reports import create_case_context
27 +from app.incidents.services.reports import create_file_response
28 +from app.incidents.services.reports import download_template
29 +from app.incidents.services.reports import render_document_with_context
30 +from app.incidents.services.reports import save_template_to_tempfile
31
32 incidents_report_router = APIRouter()
33
@@ -72,6 +82,24 @@ async def fetch_cases_by_customer(session: AsyncSession, customer_code: str) ->
82 return result.scalars().all()
83
84
85 +async def fetch_case_by_id(session: AsyncSession, case_id: int) -> Case:
86 + """Fetch a case by its ID."""
87 + result = await session.execute(
88 + select(Case)
89 + .where(Case.id == case_id)
90 + .options(
91 + selectinload(Case.alerts)
92 + .selectinload(CaseAlertLink.alert)
93 + .options(
94 + selectinload(Alert.assets).selectinload(Asset.alert_context), # Load alert_context
95 + selectinload(Alert.tags).selectinload(AlertToTag.tag),
96 + selectinload(Alert.comments),
97 + ),
98 + ),
99 + )
100 + return result.scalars().first()
101 +
102 +
103 def serialize_case_alert_to_row(case: Case, alert: Alert) -> Dict[str, Any]:
104 """Serialize a case and its alert into a CSV row."""
105 assets = ";".join(asset.asset_name for asset in alert.assets or [])
@@ -113,7 +141,7 @@ def generate_csv_content(rows: List[Dict[str, Any]]) -> StringIO:
141
142 # Route Handler
143 @incidents_report_router.post(
116 - "/generate-report",
144 + "/generate-report-csv",
145 description="Generate a report for all cases.",
146 )
147 async def get_cases_export_all_route(
@@ -129,7 +157,7 @@ async def get_cases_export_all_route(
157
158
159 @incidents_report_router.post(
132 - "/generate-report/{customer_code}",
160 + "/generate-report-csv/{customer_code}",
161 description="Generate a report for a customer",
162 )
163 async def get_cases_export_customer_route(
@@ -144,3 +172,30 @@ async def get_cases_export_customer_route(
172 response = StreamingResponse(csv_stream, media_type="text/csv")
173 response.headers["Content-Disposition"] = f"attachment; filename={filename}"
174 return response
175 +
176 +
177 +@incidents_report_router.post(
178 + "/generate-report-docx",
179 + description="Generate a docx report for a case.",
180 +)
181 +async def get_cases_export_docx_route(
182 + request: CaseDownloadDocxRequest,
183 + session: AsyncSession = Depends(get_db),
184 +) -> FileResponse:
185 + case = await fetch_case_by_id(session, request.case_id)
186 + if not case:
187 + raise HTTPException(status_code=404, detail="No cases found")
188 +
189 + context = create_case_context(case)
190 +
191 + template_file_content = await download_template(request.template_name)
192 + tmp_template_name = save_template_to_tempfile(template_file_content)
193 +
194 + rendered_file_name = render_document_with_context(tmp_template_name, context)
195 +
196 + response = create_file_response(file_path=rendered_file_name, file_name=request.file_name)
197 +
198 + # Clean up temporary files
199 + cleanup_temp_files([tmp_template_name])
200 +
201 + return response
backend/app/incidents/schema/db_operations.py
+30
@@ -5,6 +5,7 @@ from typing import List
5 from typing import Optional
6
7 from pydantic import BaseModel
8 +from pydantic import validator
9
10 from app.incidents.models import Alert
11 from app.incidents.models import AlertContext
@@ -13,6 +14,7 @@ from app.incidents.models import Asset
14 from app.incidents.models import Case
15 from app.incidents.models import CaseAlertLink
16 from app.incidents.models import CaseDataStore
17 +from app.incidents.models import CaseReportTemplateDataStore
18 from app.incidents.models import Comment
19
20
@@ -348,3 +350,31 @@ class ListCaseDataStoreResponse(BaseModel):
350 case_data_store: List[CaseDataStore]
351 success: bool
352 message: str
353 +
354 +
355 +class CaseReportTemplateDataStoreResponse(BaseModel):
356 + case_report_template_data_store: CaseReportTemplateDataStore
357 + success: bool
358 + message: str
359 +
360 +
361 +class CaseDownloadDocxRequest(BaseModel):
362 + case_id: int
363 + template_name: str
364 + file_name: Optional[str] = "case_report.docx"
365 +
366 + @validator("file_name", pre=True, always=True)
367 + def ensure_docx_extension(cls, v):
368 + if v and not v.endswith(".docx"):
369 + return f"{v}.docx"
370 + return v
371 +
372 +
373 +class CaseReportTemplateDataStoreListResponse(BaseModel):
374 + case_report_template_data_store: List[str]
375 + success: bool
376 + message: str
377 +
378 +
379 +class DefaultReportTemplateFileNames(Enum):
380 + CASE_REPORT_JINJA_TEMPLATE = "case_report_jinja_template.docx"
backend/app/incidents/services/db_operations.py
+114 -2
@@ -1,4 +1,8 @@
1 import hashlib
2 +import io
3 +import mimetypes
4 +import os
5 +from pathlib import Path
6 from typing import List
7 from typing import Optional
8 from typing import Tuple
@@ -17,9 +21,11 @@ from sqlalchemy.future import select
21 from sqlalchemy.orm import selectinload
22
23 from app.data_store.data_store_operations import delete_file
20 -from app.data_store.data_store_operations import download_case_data_store
24 +from app.data_store.data_store_operations import download_data_store
25 from app.data_store.data_store_operations import upload_case_data_store
26 +from app.data_store.data_store_operations import upload_case_report_template_data_store
27 from app.data_store.data_store_schema import CaseDataStoreCreation
28 +from app.data_store.data_store_schema import CaseReportTemplateDataStoreCreation
29 from app.incidents.models import Alert
30 from app.incidents.models import AlertContext
31 from app.incidents.models import AlertTag
@@ -30,6 +36,7 @@ from app.incidents.models import AssetFieldName
36 from app.incidents.models import Case
37 from app.incidents.models import CaseAlertLink
38 from app.incidents.models import CaseDataStore
39 +from app.incidents.models import CaseReportTemplateDataStore
40 from app.incidents.models import Comment
41 from app.incidents.models import CustomerCodeFieldName
42 from app.incidents.models import FieldName
@@ -45,6 +52,7 @@ from app.incidents.schema.db_operations import AssetCreate
52 from app.incidents.schema.db_operations import CaseAlertLinkCreate
53 from app.incidents.schema.db_operations import CaseCreate
54 from app.incidents.schema.db_operations import CaseOut
55 +from app.incidents.schema.db_operations import CaseReportTemplateDataStoreListResponse
56 from app.incidents.schema.db_operations import CommentBase
57 from app.incidents.schema.db_operations import CommentCreate
58 from app.incidents.schema.db_operations import LinkedCaseCreate
@@ -1733,6 +1741,12 @@ async def file_exists(case_id: int, file_name: str, db: AsyncSession) -> bool:
1741 return result.scalars().first() is not None
1742
1743
1744 +async def report_template_exists(file_name: str, db: AsyncSession) -> bool:
1745 + query = select(CaseReportTemplateDataStore).where(CaseReportTemplateDataStore.report_template_name == file_name)
1746 + result = await db.execute(query)
1747 + return result.scalars().first() is not None
1748 +
1749 +
1750 async def sha256_hash_file(file: UploadFile) -> str:
1751 await file.seek(0)
1752 file_content = await file.read()
@@ -1761,6 +1775,21 @@ async def add_file_to_db(case_id: int, file: UploadFile, file_size: int, file_ha
1775 return db_file
1776
1777
1778 +async def add_report_template_to_db(file: UploadFile, file_size: int, file_hash: str, db: AsyncSession) -> None:
1779 + db_file = CaseReportTemplateDataStore(
1780 + report_template_name=file.filename,
1781 + bucket_name="copilot-case-report-templates",
1782 + object_key=file.filename,
1783 + content_type=file.content_type,
1784 + file_name=file.filename,
1785 + file_size=file_size,
1786 + file_hash=file_hash,
1787 + )
1788 + db.add(db_file)
1789 + await db.commit()
1790 + return db_file
1791 +
1792 +
1793 async def upload_file_to_case(case_id: int, file: UploadFile, db: AsyncSession) -> CaseDataStore:
1794 file_size = await get_file_size(file)
1795 file_hash = await sha256_hash_file(file)
@@ -1782,6 +1811,27 @@ async def upload_file_to_case(case_id: int, file: UploadFile, db: AsyncSession)
1811 return await add_file_to_db(case_id, file, file_size, file_hash, db)
1812
1813
1814 +async def upload_report_template(file: UploadFile, db: AsyncSession) -> CaseReportTemplateDataStore:
1815 + file_size = await get_file_size(file)
1816 + file_hash = await sha256_hash_file(file)
1817 + await file.seek(0)
1818 + # Upload the file to Minio
1819 + await upload_case_report_template_data_store(
1820 + data=CaseReportTemplateDataStoreCreation(
1821 + report_template_name=file.filename,
1822 + bucket_name="copilot-case-report-templates",
1823 + object_key=file.filename,
1824 + file_name=file.filename,
1825 + content_type=file.content_type,
1826 + file_hash=file_hash,
1827 + ),
1828 + file=file,
1829 + )
1830 +
1831 + # Add the file to the database
1832 + return await add_report_template_to_db(file, file_size, file_hash, db)
1833 +
1834 +
1835 async def get_file_by_case_id_and_name(case_id: int, file_name: str, db: AsyncSession) -> CaseDataStore:
1836 logger.info(f"Getting file {file_name} from case {case_id}")
1837 query = select(CaseDataStore).where(CaseDataStore.case_id == case_id, CaseDataStore.file_name == file_name)
@@ -1789,11 +1839,23 @@ async def get_file_by_case_id_and_name(case_id: int, file_name: str, db: AsyncSe
1839 return result.scalars().first()
1840
1841
1842 +async def get_report_template_by_name(file_name: str, db: AsyncSession) -> CaseReportTemplateDataStore:
1843 + logger.info(f"Getting file {file_name}")
1844 + query = select(CaseReportTemplateDataStore).where(CaseReportTemplateDataStore.report_template_name == file_name)
1845 + result = await db.execute(query)
1846 + return result.scalars().first()
1847 +
1848 +
1849 async def remove_file_from_db(file_id: int, db: AsyncSession) -> None:
1850 await db.execute(delete(CaseDataStore).where(CaseDataStore.id == file_id))
1851 await db.commit()
1852
1853
1854 +async def remove_report_template_from_db(file_id: int, db: AsyncSession) -> None:
1855 + await db.execute(delete(CaseReportTemplateDataStore).where(CaseReportTemplateDataStore.id == file_id))
1856 + await db.commit()
1857 +
1858 +
1859 async def delete_file_from_case(case_id: int, file_name: str, db: AsyncSession) -> None:
1860 file = await get_file_by_case_id_and_name(case_id, file_name, db)
1861 if not file:
@@ -1808,5 +1870,55 @@ async def download_file_from_case(case_id: int, file_name: str, db: AsyncSession
1870 if not file:
1871 raise HTTPException(status_code=404, detail="File not found")
1872
1811 - file_content = await download_case_data_store(file.bucket_name, file.object_key)
1873 + file_content = await download_data_store(file.bucket_name, file.object_key)
1874 return file_content, file.content_type
1875 +
1876 +
1877 +async def delete_report_template(file_name: str, db: AsyncSession) -> None:
1878 + file = await get_report_template_by_name(file_name, db)
1879 + if not file:
1880 + raise HTTPException(status_code=404, detail="File not found")
1881 +
1882 + await delete_file(file.bucket_name, file.object_key)
1883 + await remove_report_template_from_db(file.id, db)
1884 +
1885 +
1886 +async def download_report_template(file_name: str, db: AsyncSession) -> Tuple[bytes, str]:
1887 + file = await get_report_template_by_name(file_name, db)
1888 + if not file:
1889 + raise HTTPException(status_code=404, detail="File not found")
1890 +
1891 + file_content = await download_data_store(file.bucket_name, file.object_key)
1892 + return file_content, file.content_type
1893 +
1894 +
1895 +async def upload_report_template_to_data_store(db: AsyncSession) -> CaseReportTemplateDataStoreListResponse:
1896 + current_dir = Path(os.getcwd())
1897 + templates_dir = current_dir.parent / "backend" / "app" / "incidents" / "templates"
1898 +
1899 + templates_list = []
1900 +
1901 + for file in templates_dir.iterdir():
1902 + logger.info(f"Uploading report template {file.name} to Minio")
1903 + if file.is_file():
1904 + if await report_template_exists(file.name, db):
1905 + raise HTTPException(status_code=400, detail="File name already exists for this template")
1906 + with open(file, "rb") as f:
1907 + content = f.read()
1908 + content_type = mimetypes.guess_type(file)[0]
1909 + upload_file = UploadFile(filename=file.name, file=io.BytesIO(content))
1910 + await upload_case_report_template_data_store(
1911 + data=CaseReportTemplateDataStoreCreation(
1912 + report_template_name=file.name,
1913 + bucket_name="copilot-case-report-templates",
1914 + object_key=file.name,
1915 + file_name=file.name,
1916 + content_type=content_type,
1917 + file_hash=hashlib.sha256(content).hexdigest(),
1918 + ),
1919 + file=upload_file,
1920 + )
1921 + templates_list.append(file.name)
1922 + await add_report_template_to_db(upload_file, len(content), hashlib.sha256(content).hexdigest(), db)
1923 +
1924 + return templates_list
backend/app/incidents/services/reports.py new
+93
@@ -0,0 +1,93 @@
1 +import os
2 +from tempfile import NamedTemporaryFile
3 +from typing import Dict
4 +from typing import Optional
5 +
6 +from docxtpl import DocxTemplate
7 +from fastapi.responses import FileResponse
8 +
9 +from app.data_store.data_store_operations import download_data_store
10 +
11 +
12 +async def download_template(template_name: str) -> bytes:
13 + """Retrieve the template file content from the data store."""
14 + return await download_data_store(bucket_name="copilot-case-report-templates", object_name=template_name)
15 +
16 +
17 +def create_case_context(case) -> Dict[str, Dict[str, str]]:
18 + """Prepare the context for the Jinja template."""
19 + return {
20 + "case": {
21 + "name": case.case_name,
22 + "description": case.case_description,
23 + "assigned_to": case.assigned_to,
24 + "case_creation_time": case.case_creation_time,
25 + "id": case.id,
26 + "alerts": [
27 + {
28 + "alert_name": alert.alert.alert_name,
29 + "alert_description": alert.alert.alert_description,
30 + "status": alert.alert.status,
31 + "tags": [tag.tag.tag for tag in alert.alert.tags],
32 + "assets": [
33 + {
34 + "asset_name": asset.asset_name,
35 + "agent_id": asset.agent_id,
36 + }
37 + for asset in alert.alert.assets
38 + ],
39 + "comments": [
40 + {
41 + "comment": comment.comment,
42 + "user_name": comment.user_name,
43 + "created_at": comment.created_at,
44 + }
45 + for comment in alert.alert.comments
46 + ],
47 + "context": {
48 + "source": alert.alert.assets[0].alert_context.source
49 + if alert.alert.assets and alert.alert.assets[0].alert_context
50 + else None,
51 + "context": alert.alert.assets[0].alert_context.context
52 + if alert.alert.assets and alert.alert.assets[0].alert_context
53 + else None,
54 + }
55 + if alert.alert.assets
56 + else None,
57 + }
58 + for alert in case.alerts
59 + ],
60 + },
61 + }
62 +
63 +
64 +def save_template_to_tempfile(template_file_content: bytes) -> str:
65 + """Save the template content to a temporary file."""
66 + with NamedTemporaryFile(delete=False, suffix=".docx") as tmp_template:
67 + tmp_template.write(template_file_content)
68 + return tmp_template.name
69 +
70 +
71 +def render_document_with_context(template_path: str, context: Dict[str, Dict[str, str]]) -> str:
72 + """Load and render the document template with the given context."""
73 + doc = DocxTemplate(template_path)
74 + doc.render(context)
75 + with NamedTemporaryFile(delete=False, suffix=".docx") as tmp:
76 + doc.save(tmp.name)
77 + return tmp.name
78 +
79 +
80 +def create_file_response(file_path: str, file_name: Optional[str] = "case_report.docx") -> FileResponse:
81 + """Create a FileResponse object for the rendered document."""
82 + return FileResponse(
83 + file_path,
84 + filename=file_name,
85 + media_type="application/vnd.openxmlformats-officedocument.wordprocessingml.document",
86 + )
87 +
88 +
89 +def cleanup_temp_files(file_paths: list):
90 + """Clean up the temporary files."""
91 + for file_path in file_paths:
92 + if os.path.exists(file_path):
93 + os.remove(file_path)
backend/app/incidents/templates/case_report_jinja_template.docx
Binary files /dev/null and b/backend/app/incidents/templates/case_report_jinja_template.docx differ
backend/requirements.txt
+5 -2
@@ -40,6 +40,7 @@ Deprecated==1.2.14
40 dfir-iris-client==2.0.4
41 dnspython==2.4.2
42 dnstwist==20230918
43 +docxtpl==0.18.0
44 drawsvg==2.3.0
45 ecdsa==0.18.0
46 elasticsearch7==7.10.1
@@ -72,7 +73,8 @@ kombu==5.3.2
73 libmagic==1.0
74 licensing==0.43
75 loguru==0.7.2
75 -lxml==4.9.3
76 +#lxml==4.9.3 Bump down for python-docx
77 +lxml==4.9.2
78 maec==4.1.0.17
79 Markdown==3.4.4
80 markdown-it-py==3.0.0
@@ -162,7 +164,8 @@ tqdm==4.66.1
164 typer==0.9.0
165 types-python-dateutil==2.8.19.14
166 typing==3.7.4.3
165 -typing_extensions==4.8.0
167 +#typing_extensions==4.8.0 Bump to 4.9.0
168 +typing_extensions==4.9.0
169 tzdata==2023.3
170 tzlocal==5.2
171 ujson==5.8.0
frontend/package-lock.json
+1564 -787
@@ -10,41 +10,38 @@
10 "dependencies": {
11 "@ajoelp/json-to-formdata": "^1.5.0",
12 "@f3ve/vue-markdown-it": "^0.2.2",
13 - "@fontsource/jetbrains-mono": "^5.1.0",
14 - "@fontsource/lexend": "^5.1.0",
15 - "@fontsource/public-sans": "^5.1.0",
16 - "@popperjs/core": "^2.11.8",
17 - "@shikijs/markdown-it": "^1.21.0",
18 - "@vueuse/components": "^11.1.0",
13 + "@fontsource/jetbrains-mono": "^5.1.1",
14 + "@fontsource/lexend": "^5.1.1",
15 + "@fontsource/public-sans": "^5.1.1",
16 + "@shikijs/markdown-it": "^1.22.0",
17 "@vueuse/core": "^11.1.0",
20 - "apexcharts": "^3.54.0",
18 "axios": "^1.7.7",
19 "bytes": "^3.1.2",
20 "colord": "^2.9.3",
24 - "crypto-js": "^4.2.0",
21 "dayjs": "^1.11.13",
22 "detect-touch-device": "^1.1.6",
23 "echarts": "^5.5.1",
24 "file-saver": "^2.0.5",
25 "html-entities": "^2.5.2",
30 - "jose": "^5.9.3",
26 + "jose": "^5.9.4",
27 "js-md5": "^0.8.3",
28 "lodash": "^4.17.21",
29 "mitt": "^3.0.1",
30 "naive-ui": "^2.40.1",
31 + "nanoid": "^5.0.7",
32 "password-validator": "^5.3.0",
33 "pinia": "^2.2.4",
37 - "pinia-plugin-persistedstate": "^4.0.2",
34 + "pinia-plugin-persistedstate": "^4.1.1",
35 "secure-ls": "^2.0.0",
39 - "shiki": "^1.21.0",
36 + "shiki": "^1.22.0",
37 "validator": "^13.12.0",
41 - "vue": "^3.5.10",
38 + "vue": "^3.5.12",
39 "vue-advanced-cropper": "^2.8.9",
40 "vue-highlight-words": "^3.0.1",
44 - "vue-i18n": "^10.0.3",
41 + "vue-i18n": "^10.0.4",
42 "vue-router": "^4.4.5",
43 "vue-sjv": "^0.0.6",
47 - "vue3-apexcharts": "^1.6.0",
44 + "vue3-apexcharts": "^1.7.0",
45 "vue3-marquee": "^4.2.2",
46 "vuedraggable": "^4.1.0"
47 },
@@ -56,10 +53,9 @@
53 "@types/bytes": "^3.1.4",
54 "@types/file-saver": "^2.0.7",
55 "@types/fs-extra": "^11.0.4",
59 - "@types/inquirer": "^9.0.7",
56 "@types/jsdom": "^21.1.7",
61 - "@types/lodash": "^4.17.9",
62 - "@types/node": "^22.7.4",
57 + "@types/lodash": "^4.17.10",
58 + "@types/node": "^22.7.5",
59 "@types/validator": "^13.12.2",
60 "@vitejs/plugin-vue": "^5.1.4",
61 "@vitejs/plugin-vue-jsx": "^4.0.1",
@@ -67,17 +63,15 @@
63 "@vue/tsconfig": "^0.5.1",
64 "autoprefixer": "^10.4.20",
65 "cypress": "^13.15.0",
70 - "eslint": "^9.11.1",
66 + "depcheck": "^1.4.7",
67 + "eslint": "^9.12.0",
68 "flourite": "^1.3.0",
69 "fs-extra": "^11.2.0",
73 - "globals": "^15.9.0",
70 "jsdom": "^25.0.1",
75 - "json5": "^2.2.3",
71 "npm-run-all2": "^6.2.3",
77 - "picocolors": "^1.1.0",
72 "postcss": "^8.4.47",
73 "prettier": "^3.3.3",
80 - "sass": "^1.79.4",
74 + "sass": "^1.79.5",
75 "start-server-and-test": "^2.0.8",
76 "tailwind-config-viewer": "^2.0.4",
77 "tailwindcss": "^3.4.13",
@@ -85,19 +79,18 @@
79 "type-fest": "^4.26.1",
80 "typescript": "~5.5.4",
81 "unplugin-vue-components": "^0.27.4",
88 - "vite": "^5.4.8",
89 - "vite-bundle-analyzer": "^0.12.1",
82 + "vite": "^5.4.9",
83 "vite-bundle-visualizer": "^1.2.1",
84 "vite-plugin-vue-devtools": "^7.4.6",
85 "vite-svg-loader": "^5.1.0",
93 - "vitest": "^2.1.1",
86 + "vitest": "^2.1.3",
87 "vue-tsc": "^2.1.6"
88 },
89 "engines": {
90 "node": ">=18.0.0"
91 },
92 "optionalDependencies": {
100 - "@rollup/rollup-linux-x64-gnu": "^4.23.0"
93 + "@rollup/rollup-linux-x64-gnu": "^4.24.0"
94 }
95 },
96 "node_modules/@ajoelp/json-to-formdata": {
@@ -275,11 +268,11 @@
268 }
269 },
270 "node_modules/@babel/code-frame": {
278 - "version": "7.24.7",
279 - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz",
280 - "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==",
271 + "version": "7.25.7",
272 + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.25.7.tgz",
273 + "integrity": "sha512-0xZJFNE5XMpENsgfHYTw8FbX4kv53mFLn2i3XPoq69LyhYSCBJtitaHx9QnsVTrsogI4Z3+HtEfZ2/GFPOtf5g==",
274 "dependencies": {
282 - "@babel/highlight": "^7.24.7",
275 + "@babel/highlight": "^7.25.7",
276 "picocolors": "^1.0.0"
277 },
278 "engines": {
@@ -287,28 +280,28 @@
280 }
281 },
282 "node_modules/@babel/compat-data": {
290 - "version": "7.25.4",
291 - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.4.tgz",
292 - "integrity": "sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ==",
283 + "version": "7.25.8",
284 + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.8.tgz",
285 + "integrity": "sha512-ZsysZyXY4Tlx+Q53XdnOFmqwfB9QDTHYxaZYajWRoBLuLEAwI2UIbtxOjWh/cFaa9IKUlcB+DDuoskLuKu56JA==",
286 "engines": {
287 "node": ">=6.9.0"
288 }
289 },
290 "node_modules/@babel/core": {
298 - "version": "7.25.2",
299 - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.2.tgz",
300 - "integrity": "sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==",
291 + "version": "7.25.8",
292 + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.8.tgz",
293 + "integrity": "sha512-Oixnb+DzmRT30qu9d3tJSQkxuygWm32DFykT4bRoORPa9hZ/L4KhVB/XiRm6KG+roIEM7DBQlmg27kw2HZkdZg==",
294 "dependencies": {
295 "@ampproject/remapping": "^2.2.0",
303 - "@babel/code-frame": "^7.24.7",
304 - "@babel/generator": "^7.25.0",
305 - "@babel/helper-compilation-targets": "^7.25.2",
306 - "@babel/helper-module-transforms": "^7.25.2",
307 - "@babel/helpers": "^7.25.0",
308 - "@babel/parser": "^7.25.0",
309 - "@babel/template": "^7.25.0",
310 - "@babel/traverse": "^7.25.2",
311 - "@babel/types": "^7.25.2",
296 + "@babel/code-frame": "^7.25.7",
297 + "@babel/generator": "^7.25.7",
298 + "@babel/helper-compilation-targets": "^7.25.7",
299 + "@babel/helper-module-transforms": "^7.25.7",
300 + "@babel/helpers": "^7.25.7",
301 + "@babel/parser": "^7.25.8",
302 + "@babel/template": "^7.25.7",
303 + "@babel/traverse": "^7.25.7",
304 + "@babel/types": "^7.25.8",
305 "convert-source-map": "^2.0.0",
306 "debug": "^4.1.0",
307 "gensync": "^1.0.0-beta.2",
@@ -332,39 +325,39 @@
325 }
326 },
327 "node_modules/@babel/generator": {
335 - "version": "7.25.6",
336 - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.6.tgz",
337 - "integrity": "sha512-VPC82gr1seXOpkjAAKoLhP50vx4vGNlF4msF64dSFq1P8RfB+QAuJWGHPXXPc8QyfVWwwB/TNNU4+ayZmHNbZw==",
328 + "version": "7.25.7",
329 + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.7.tgz",
330 + "integrity": "sha512-5Dqpl5fyV9pIAD62yK9P7fcA768uVPUyrQmqpqstHWgMma4feF1x/oFysBCVZLY5wJ2GkMUCdsNDnGZrPoR6rA==",
331 "dependencies": {
339 - "@babel/types": "^7.25.6",
332 + "@babel/types": "^7.25.7",
333 "@jridgewell/gen-mapping": "^0.3.5",
334 "@jridgewell/trace-mapping": "^0.3.25",
342 - "jsesc": "^2.5.1"
335 + "jsesc": "^3.0.2"
336 },
337 "engines": {
338 "node": ">=6.9.0"
339 }
340 },
341 "node_modules/@babel/helper-annotate-as-pure": {
349 - "version": "7.24.7",
350 - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz",
351 - "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==",
342 + "version": "7.25.7",
343 + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.7.tgz",
344 + "integrity": "sha512-4xwU8StnqnlIhhioZf1tqnVWeQ9pvH/ujS8hRfw/WOza+/a+1qv69BWNy+oY231maTCWgKWhfBU7kDpsds6zAA==",
345 "dev": true,
346 "dependencies": {
354 - "@babel/types": "^7.24.7"
347 + "@babel/types": "^7.25.7"
348 },
349 "engines": {
350 "node": ">=6.9.0"
351 }
352 },
353 "node_modules/@babel/helper-compilation-targets": {
361 - "version": "7.25.2",
362 - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz",
363 - "integrity": "sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==",
354 + "version": "7.25.7",
355 + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.7.tgz",
356 + "integrity": "sha512-DniTEax0sv6isaw6qSQSfV4gVRNtw2rte8HHM45t9ZR0xILaufBRNkpMifCRiAPyvL4ACD6v0gfCwCmtOQaV4A==",
357 "dependencies": {
365 - "@babel/compat-data": "^7.25.2",
366 - "@babel/helper-validator-option": "^7.24.8",
367 - "browserslist": "^4.23.1",
358 + "@babel/compat-data": "^7.25.7",
359 + "@babel/helper-validator-option": "^7.25.7",
360 + "browserslist": "^4.24.0",
361 "lru-cache": "^5.1.1",
362 "semver": "^6.3.1"
363 },
@@ -381,17 +374,17 @@
374 }
375 },
376 "node_modules/@babel/helper-create-class-features-plugin": {
384 - "version": "7.25.4",
385 - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.4.tgz",
386 - "integrity": "sha512-ro/bFs3/84MDgDmMwbcHgDa8/E6J3QKNTk4xJJnVeFtGE+tL0K26E3pNxhYz2b67fJpt7Aphw5XcploKXuCvCQ==",
377 + "version": "7.25.7",
378 + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.7.tgz",
379 + "integrity": "sha512-bD4WQhbkx80mAyj/WCm4ZHcF4rDxkoLFO6ph8/5/mQ3z4vAzltQXAmbc7GvVJx5H+lk5Mi5EmbTeox5nMGCsbw==",
380 "dev": true,
381 "dependencies": {
389 - "@babel/helper-annotate-as-pure": "^7.24.7",
390 - "@babel/helper-member-expression-to-functions": "^7.24.8",
391 - "@babel/helper-optimise-call-expression": "^7.24.7",
392 - "@babel/helper-replace-supers": "^7.25.0",
393 - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7",
394 - "@babel/traverse": "^7.25.4",
382 + "@babel/helper-annotate-as-pure": "^7.25.7",
383 + "@babel/helper-member-expression-to-functions": "^7.25.7",
384 + "@babel/helper-optimise-call-expression": "^7.25.7",
385 + "@babel/helper-replace-supers": "^7.25.7",
386 + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.7",
387 + "@babel/traverse": "^7.25.7",
388 "semver": "^6.3.1"
389 },
390 "engines": {
@@ -411,39 +404,39 @@
404 }
405 },
406 "node_modules/@babel/helper-member-expression-to-functions": {
414 - "version": "7.24.8",
415 - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.8.tgz",
416 - "integrity": "sha512-LABppdt+Lp/RlBxqrh4qgf1oEH/WxdzQNDJIu5gC/W1GyvPVrOBiItmmM8wan2fm4oYqFuFfkXmlGpLQhPY8CA==",
407 + "version": "7.25.7",
408 + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.7.tgz",
409 + "integrity": "sha512-O31Ssjd5K6lPbTX9AAYpSKrZmLeagt9uwschJd+Ixo6QiRyfpvgtVQp8qrDR9UNFjZ8+DO34ZkdrN+BnPXemeA==",
410 "dev": true,
411 "dependencies": {
419 - "@babel/traverse": "^7.24.8",
420 - "@babel/types": "^7.24.8"
412 + "@babel/traverse": "^7.25.7",
413 + "@babel/types": "^7.25.7"
414 },
415 "engines": {
416 "node": ">=6.9.0"
417 }
418 },
419 "node_modules/@babel/helper-module-imports": {
427 - "version": "7.24.7",
428 - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz",
429 - "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==",
420 + "version": "7.25.7",
421 + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.7.tgz",
422 + "integrity": "sha512-o0xCgpNmRohmnoWKQ0Ij8IdddjyBFE4T2kagL/x6M3+4zUgc+4qTOUBoNe4XxDskt1HPKO007ZPiMgLDq2s7Kw==",
423 "dependencies": {
431 - "@babel/traverse": "^7.24.7",
432 - "@babel/types": "^7.24.7"
424 + "@babel/traverse": "^7.25.7",
425 + "@babel/types": "^7.25.7"
426 },
427 "engines": {
428 "node": ">=6.9.0"
429 }
430 },
431 "node_modules/@babel/helper-module-transforms": {
439 - "version": "7.25.2",
440 - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz",
441 - "integrity": "sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==",
432 + "version": "7.25.7",
433 + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.7.tgz",
434 + "integrity": "sha512-k/6f8dKG3yDz/qCwSM+RKovjMix563SLxQFo0UhRNo239SP6n9u5/eLtKD6EAjwta2JHJ49CsD8pms2HdNiMMQ==",
435 "dependencies": {
443 - "@babel/helper-module-imports": "^7.24.7",
444 - "@babel/helper-simple-access": "^7.24.7",
445 - "@babel/helper-validator-identifier": "^7.24.7",
446 - "@babel/traverse": "^7.25.2"
436 + "@babel/helper-module-imports": "^7.25.7",
437 + "@babel/helper-simple-access": "^7.25.7",
438 + "@babel/helper-validator-identifier": "^7.25.7",
439 + "@babel/traverse": "^7.25.7"
440 },
441 "engines": {
442 "node": ">=6.9.0"
@@ -453,35 +446,35 @@
446 }
447 },
448 "node_modules/@babel/helper-optimise-call-expression": {
456 - "version": "7.24.7",
457 - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.24.7.tgz",
458 - "integrity": "sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A==",
449 + "version": "7.25.7",
450 + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.7.tgz",
451 + "integrity": "sha512-VAwcwuYhv/AT+Vfr28c9y6SHzTan1ryqrydSTFGjU0uDJHw3uZ+PduI8plCLkRsDnqK2DMEDmwrOQRsK/Ykjng==",
452 "dev": true,
453 "dependencies": {
461 - "@babel/types": "^7.24.7"
454 + "@babel/types": "^7.25.7"
455 },
456 "engines": {
457 "node": ">=6.9.0"
458 }
459 },
460 "node_modules/@babel/helper-plugin-utils": {
468 - "version": "7.24.8",
469 - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz",
470 - "integrity": "sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==",
461 + "version": "7.25.7",
462 + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.7.tgz",
463 + "integrity": "sha512-eaPZai0PiqCi09pPs3pAFfl/zYgGaE6IdXtYvmf0qlcDTd3WCtO7JWCcRd64e0EQrcYgiHibEZnOGsSY4QSgaw==",
464 "dev": true,
465 "engines": {
466 "node": ">=6.9.0"
467 }
468 },
469 "node_modules/@babel/helper-replace-supers": {
477 - "version": "7.25.0",
478 - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.0.tgz",
479 - "integrity": "sha512-q688zIvQVYtZu+i2PsdIu/uWGRpfxzr5WESsfpShfZECkO+d2o+WROWezCi/Q6kJ0tfPa5+pUGUlfx2HhrA3Bg==",
470 + "version": "7.25.7",
471 + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.7.tgz",
472 + "integrity": "sha512-iy8JhqlUW9PtZkd4pHM96v6BdJ66Ba9yWSE4z0W4TvSZwLBPkyDsiIU3ENe4SmrzRBs76F7rQXTy1lYC49n6Lw==",
473 "dev": true,
474 "dependencies": {
482 - "@babel/helper-member-expression-to-functions": "^7.24.8",
483 - "@babel/helper-optimise-call-expression": "^7.24.7",
484 - "@babel/traverse": "^7.25.0"
475 + "@babel/helper-member-expression-to-functions": "^7.25.7",
476 + "@babel/helper-optimise-call-expression": "^7.25.7",
477 + "@babel/traverse": "^7.25.7"
478 },
479 "engines": {
480 "node": ">=6.9.0"
@@ -491,72 +484,72 @@
484 }
485 },
486 "node_modules/@babel/helper-simple-access": {
494 - "version": "7.24.7",
495 - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz",
496 - "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==",
487 + "version": "7.25.7",
488 + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.25.7.tgz",
489 + "integrity": "sha512-FPGAkJmyoChQeM+ruBGIDyrT2tKfZJO8NcxdC+CWNJi7N8/rZpSxK7yvBJ5O/nF1gfu5KzN7VKG3YVSLFfRSxQ==",
490 "dependencies": {
498 - "@babel/traverse": "^7.24.7",
499 - "@babel/types": "^7.24.7"
491 + "@babel/traverse": "^7.25.7",
492 + "@babel/types": "^7.25.7"
493 },
494 "engines": {
495 "node": ">=6.9.0"
496 }
497 },
498 "node_modules/@babel/helper-skip-transparent-expression-wrappers": {
506 - "version": "7.24.7",
507 - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.24.7.tgz",
508 - "integrity": "sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ==",
499 + "version": "7.25.7",
500 + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.7.tgz",
501 + "integrity": "sha512-pPbNbchZBkPMD50K0p3JGcFMNLVUCuU/ABybm/PGNj4JiHrpmNyqqCphBk4i19xXtNV0JhldQJJtbSW5aUvbyA==",
502 "dev": true,
503 "dependencies": {
511 - "@babel/traverse": "^7.24.7",
512 - "@babel/types": "^7.24.7"
504 + "@babel/traverse": "^7.25.7",
505 + "@babel/types": "^7.25.7"
506 },
507 "engines": {
508 "node": ">=6.9.0"
509 }
510 },
511 "node_modules/@babel/helper-string-parser": {
519 - "version": "7.24.8",
520 - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz",
521 - "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==",
512 + "version": "7.25.7",
513 + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.7.tgz",
514 + "integrity": "sha512-CbkjYdsJNHFk8uqpEkpCvRs3YRp9tY6FmFY7wLMSYuGYkrdUi7r2lc4/wqsvlHoMznX3WJ9IP8giGPq68T/Y6g==",
515 "engines": {
516 "node": ">=6.9.0"
517 }
518 },
519 "node_modules/@babel/helper-validator-identifier": {
527 - "version": "7.24.7",
528 - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz",
529 - "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==",
520 + "version": "7.25.7",
521 + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.7.tgz",
522 + "integrity": "sha512-AM6TzwYqGChO45oiuPqwL2t20/HdMC1rTPAesnBCgPCSF1x3oN9MVUwQV2iyz4xqWrctwK5RNC8LV22kaQCNYg==",
523 "engines": {
524 "node": ">=6.9.0"
525 }
526 },
527 "node_modules/@babel/helper-validator-option": {
535 - "version": "7.24.8",
536 - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz",
537 - "integrity": "sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==",
528 + "version": "7.25.7",
529 + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.7.tgz",
530 + "integrity": "sha512-ytbPLsm+GjArDYXJ8Ydr1c/KJuutjF2besPNbIZnZ6MKUxi/uTA22t2ymmA4WFjZFpjiAMO0xuuJPqK2nvDVfQ==",
531 "engines": {
532 "node": ">=6.9.0"
533 }
534 },
535 "node_modules/@babel/helpers": {
543 - "version": "7.25.6",
544 - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.6.tgz",
545 - "integrity": "sha512-Xg0tn4HcfTijTwfDwYlvVCl43V6h4KyVVX2aEm4qdO/PC6L2YvzLHFdmxhoeSA3eslcE6+ZVXHgWwopXYLNq4Q==",
536 + "version": "7.25.7",
537 + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.7.tgz",
538 + "integrity": "sha512-Sv6pASx7Esm38KQpF/U/OXLwPPrdGHNKoeblRxgZRLXnAtnkEe4ptJPDtAZM7fBLadbc1Q07kQpSiGQ0Jg6tRA==",
539 "dependencies": {
547 - "@babel/template": "^7.25.0",
548 - "@babel/types": "^7.25.6"
540 + "@babel/template": "^7.25.7",
541 + "@babel/types": "^7.25.7"
542 },
543 "engines": {
544 "node": ">=6.9.0"
545 }
546 },
547 "node_modules/@babel/highlight": {
555 - "version": "7.24.7",
556 - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz",
557 - "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==",
548 + "version": "7.25.7",
549 + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.25.7.tgz",
550 + "integrity": "sha512-iYyACpW3iW8Fw+ZybQK+drQre+ns/tKpXbNESfrhNnPLIklLbXr7MYJ6gPEd0iETGLOK+SxMjVvKb/ffmk+FEw==",
551 "dependencies": {
559 - "@babel/helper-validator-identifier": "^7.24.7",
552 + "@babel/helper-validator-identifier": "^7.25.7",
553 "chalk": "^2.4.2",
554 "js-tokens": "^4.0.0",
555 "picocolors": "^1.0.0"
@@ -566,11 +559,11 @@
559 }
560 },
561 "node_modules/@babel/parser": {
569 - "version": "7.25.6",
570 - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.6.tgz",
571 - "integrity": "sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==",
562 + "version": "7.25.8",
563 + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.8.tgz",
564 + "integrity": "sha512-HcttkxzdPucv3nNFmfOOMfFf64KgdJVqm1KaCm25dPGMLElo9nsLvXeJECQg8UzPuBGLyTSA0ZzqCtDSzKTEoQ==",
565 "dependencies": {
573 - "@babel/types": "^7.25.6"
566 + "@babel/types": "^7.25.8"
567 },
568 "bin": {
569 "parser": "bin/babel-parser.js"
@@ -580,14 +573,14 @@
573 }
574 },
575 "node_modules/@babel/plugin-proposal-decorators": {
583 - "version": "7.24.7",
584 - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.24.7.tgz",
585 - "integrity": "sha512-RL9GR0pUG5Kc8BUWLNDm2T5OpYwSX15r98I0IkgmRQTXuELq/OynH8xtMTMvTJFjXbMWFVTKtYkTaYQsuAwQlQ==",
576 + "version": "7.25.7",
577 + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.25.7.tgz",
578 + "integrity": "sha512-q1mqqqH0e1lhmsEQHV5U8OmdueBC2y0RFr2oUzZoFRtN3MvPmt2fsFRcNQAoGLTSNdHBFUYGnlgcRFhkBbKjPw==",
579 "dev": true,
580 "dependencies": {
588 - "@babel/helper-create-class-features-plugin": "^7.24.7",
589 - "@babel/helper-plugin-utils": "^7.24.7",
590 - "@babel/plugin-syntax-decorators": "^7.24.7"
581 + "@babel/helper-create-class-features-plugin": "^7.25.7",
582 + "@babel/helper-plugin-utils": "^7.25.7",
583 + "@babel/plugin-syntax-decorators": "^7.25.7"
584 },
585 "engines": {
586 "node": ">=6.9.0"
@@ -597,12 +590,12 @@
590 }
591 },
592 "node_modules/@babel/plugin-syntax-decorators": {
600 - "version": "7.24.7",
601 - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.24.7.tgz",
602 - "integrity": "sha512-Ui4uLJJrRV1lb38zg1yYTmRKmiZLiftDEvZN2iq3kd9kUFU+PttmzTbAFC2ucRk/XJmtek6G23gPsuZbhrT8fQ==",
593 + "version": "7.25.7",
594 + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.25.7.tgz",
595 + "integrity": "sha512-oXduHo642ZhstLVYTe2z2GSJIruU0c/W3/Ghr6A5yGMsVrvdnxO1z+3pbTcT7f3/Clnt+1z8D/w1r1f1SHaCHw==",
596 "dev": true,
597 "dependencies": {
605 - "@babel/helper-plugin-utils": "^7.24.7"
598 + "@babel/helper-plugin-utils": "^7.25.7"
599 },
600 "engines": {
601 "node": ">=6.9.0"
@@ -612,12 +605,12 @@
605 }
606 },
607 "node_modules/@babel/plugin-syntax-import-attributes": {
615 - "version": "7.25.6",
616 - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.25.6.tgz",
617 - "integrity": "sha512-sXaDXaJN9SNLymBdlWFA+bjzBhFD617ZaFiY13dGt7TVslVvVgA6fkZOP7Ki3IGElC45lwHdOTrCtKZGVAWeLQ==",
608 + "version": "7.25.7",
609 + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.25.7.tgz",
610 + "integrity": "sha512-AqVo+dguCgmpi/3mYBdu9lkngOBlQ2w2vnNpa6gfiCxQZLzV4ZbhsXitJ2Yblkoe1VQwtHSaNmIaGll/26YWRw==",
611 "dev": true,
612 "dependencies": {
620 - "@babel/helper-plugin-utils": "^7.24.8"
613 + "@babel/helper-plugin-utils": "^7.25.7"
614 },
615 "engines": {
616 "node": ">=6.9.0"
@@ -639,12 +632,12 @@
632 }
633 },
634 "node_modules/@babel/plugin-syntax-jsx": {
642 - "version": "7.24.7",
643 - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.7.tgz",
644 - "integrity": "sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==",
635 + "version": "7.25.7",
636 + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.7.tgz",
637 + "integrity": "sha512-ruZOnKO+ajVL/MVx+PwNBPOkrnXTXoWMtte1MBpegfCArhqOe3Bj52avVj1huLLxNKYKXYaSxZ2F+woK1ekXfw==",
638 "dev": true,
639 "dependencies": {
647 - "@babel/helper-plugin-utils": "^7.24.7"
640 + "@babel/helper-plugin-utils": "^7.25.7"
641 },
642 "engines": {
643 "node": ">=6.9.0"
@@ -654,12 +647,12 @@
647 }
648 },
649 "node_modules/@babel/plugin-syntax-typescript": {
657 - "version": "7.25.4",
658 - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.4.tgz",
659 - "integrity": "sha512-uMOCoHVU52BsSWxPOMVv5qKRdeSlPuImUCB2dlPuBSU+W2/ROE7/Zg8F2Kepbk+8yBa68LlRKxO+xgEVWorsDg==",
650 + "version": "7.25.7",
651 + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.7.tgz",
652 + "integrity": "sha512-rR+5FDjpCHqqZN2bzZm18bVYGaejGq5ZkpVCJLXor/+zlSrSoc4KWcHI0URVWjl/68Dyr1uwZUz/1njycEAv9g==",
653 "dev": true,
654 "dependencies": {
662 - "@babel/helper-plugin-utils": "^7.24.8"
655 + "@babel/helper-plugin-utils": "^7.25.7"
656 },
657 "engines": {
658 "node": ">=6.9.0"
@@ -669,16 +662,16 @@
662 }
663 },
664 "node_modules/@babel/plugin-transform-typescript": {
672 - "version": "7.25.2",
673 - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.25.2.tgz",
674 - "integrity": "sha512-lBwRvjSmqiMYe/pS0+1gggjJleUJi7NzjvQ1Fkqtt69hBa/0t1YuW/MLQMAPixfwaQOHUXsd6jeU3Z+vdGv3+A==",
665 + "version": "7.25.7",
666 + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.25.7.tgz",
667 + "integrity": "sha512-VKlgy2vBzj8AmEzunocMun2fF06bsSWV+FvVXohtL6FGve/+L217qhHxRTVGHEDO/YR8IANcjzgJsd04J8ge5Q==",
668 "dev": true,
669 "dependencies": {
677 - "@babel/helper-annotate-as-pure": "^7.24.7",
678 - "@babel/helper-create-class-features-plugin": "^7.25.0",
679 - "@babel/helper-plugin-utils": "^7.24.8",
680 - "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7",
681 - "@babel/plugin-syntax-typescript": "^7.24.7"
670 + "@babel/helper-annotate-as-pure": "^7.25.7",
671 + "@babel/helper-create-class-features-plugin": "^7.25.7",
672 + "@babel/helper-plugin-utils": "^7.25.7",
673 + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.7",
674 + "@babel/plugin-syntax-typescript": "^7.25.7"
675 },
676 "engines": {
677 "node": ">=6.9.0"
@@ -688,36 +681,36 @@
681 }
682 },
683 "node_modules/@babel/standalone": {
691 - "version": "7.25.6",
692 - "resolved": "https://registry.npmjs.org/@babel/standalone/-/standalone-7.25.6.tgz",
693 - "integrity": "sha512-Kf2ZcZVqsKbtYhlA7sP0z5A3q5hmCVYMKMWRWNK/5OVwHIve3JY1djVRmIVAx8FMueLIfZGKQDIILK2w8zO4mg==",
684 + "version": "7.25.8",
685 + "resolved": "https://registry.npmjs.org/@babel/standalone/-/standalone-7.25.8.tgz",
686 + "integrity": "sha512-UvRanvLCGPRscJ5Rw9o6vUBS5P+E+gkhl6eaokrIN+WM1kUkmj254VZhyihFdDZVDlI3cPcZoakbJJw24QPISw==",
687 "engines": {
688 "node": ">=6.9.0"
689 }
690 },
691 "node_modules/@babel/template": {
699 - "version": "7.25.0",
700 - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz",
701 - "integrity": "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==",
692 + "version": "7.25.7",
693 + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.7.tgz",
694 + "integrity": "sha512-wRwtAgI3bAS+JGU2upWNL9lSlDcRCqD05BZ1n3X2ONLH1WilFP6O1otQjeMK/1g0pvYcXC7b/qVUB1keofjtZA==",
695 "dependencies": {
703 - "@babel/code-frame": "^7.24.7",
704 - "@babel/parser": "^7.25.0",
705 - "@babel/types": "^7.25.0"
696 + "@babel/code-frame": "^7.25.7",
697 + "@babel/parser": "^7.25.7",
698 + "@babel/types": "^7.25.7"
699 },
700 "engines": {
701 "node": ">=6.9.0"
702 }
703 },
704 "node_modules/@babel/traverse": {
712 - "version": "7.25.6",
713 - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.6.tgz",
714 - "integrity": "sha512-9Vrcx5ZW6UwK5tvqsj0nGpp/XzqthkT0dqIc9g1AdtygFToNtTF67XzYS//dm+SAK9cp3B9R4ZO/46p63SCjlQ==",
715 - "dependencies": {
716 - "@babel/code-frame": "^7.24.7",
717 - "@babel/generator": "^7.25.6",
718 - "@babel/parser": "^7.25.6",
719 - "@babel/template": "^7.25.0",
720 - "@babel/types": "^7.25.6",
705 + "version": "7.25.7",
706 + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.7.tgz",
707 + "integrity": "sha512-jatJPT1Zjqvh/1FyJs6qAHL+Dzb7sTb+xr7Q+gM1b+1oBsMsQQ4FkVKb6dFlJvLlVssqkRzV05Jzervt9yhnzg==",
708 + "dependencies": {
709 + "@babel/code-frame": "^7.25.7",
710 + "@babel/generator": "^7.25.7",
711 + "@babel/parser": "^7.25.7",
712 + "@babel/template": "^7.25.7",
713 + "@babel/types": "^7.25.7",
714 "debug": "^4.3.1",
715 "globals": "^11.1.0"
716 },
@@ -734,12 +727,12 @@
727 }
728 },
729 "node_modules/@babel/types": {
737 - "version": "7.25.6",
738 - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.6.tgz",
739 - "integrity": "sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==",
730 + "version": "7.25.8",
731 + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.8.tgz",
732 + "integrity": "sha512-JWtuCu8VQsMladxVz/P4HzHUGCAwpuqacmowgXFs5XjxIgKuNjnLokQzuVjlTvIzODaDmpjT3oxcC48vyk9EWg==",
733 "dependencies": {
741 - "@babel/helper-string-parser": "^7.24.8",
742 - "@babel/helper-validator-identifier": "^7.24.7",
734 + "@babel/helper-string-parser": "^7.25.7",
735 + "@babel/helper-validator-identifier": "^7.25.7",
736 "to-fast-properties": "^2.0.0"
737 },
738 "engines": {
@@ -773,6 +766,7 @@
766 },
767 "node_modules/@clack/prompts/node_modules/is-unicode-supported": {
768 "version": "1.3.0",
769 + "dev": true,
770 "inBundle": true,
771 "license": "MIT",
772 "engines": {
@@ -1312,12 +1306,20 @@
1306 }
1307 },
1308 "node_modules/@eslint/compat": {
1315 - "version": "1.1.1",
1316 - "resolved": "https://registry.npmjs.org/@eslint/compat/-/compat-1.1.1.tgz",
1317 - "integrity": "sha512-lpHyRyplhGPL5mGEh6M9O5nnKk0Gz4bFI+Zu6tKlPpDUN7XshWvH9C/px4UVm87IAANE0W81CEsNGbS1KlzXpA==",
1309 + "version": "1.2.0",
1310 + "resolved": "https://registry.npmjs.org/@eslint/compat/-/compat-1.2.0.tgz",
1311 + "integrity": "sha512-CkPWddN7J9JPrQedEr2X7AjK9y1jaMJtxZ4A/+jTMFA2+n5BWhcKHW/EbJyARqg2zzQfgtWUtVmG3hrG6+nGpg==",
1312 "dev": true,
1313 "engines": {
1314 "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
1315 + },
1316 + "peerDependencies": {
1317 + "eslint": "^9.10.0"
1318 + },
1319 + "peerDependenciesMeta": {
1320 + "eslint": {
1321 + "optional": true
1322 + }
1323 }
1324 },
1325 "node_modules/@eslint/config-array": {
@@ -1383,6 +1385,11 @@
1385 "url": "https://opencollective.com/eslint"
1386 }
1387 },
1388 + "node_modules/@eslint/eslintrc/node_modules/argparse": {
1389 + "version": "2.0.1",
1390 + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
1391 + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="
1392 + },
1393 "node_modules/@eslint/eslintrc/node_modules/brace-expansion": {
1394 "version": "1.1.11",
1395 "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
@@ -1403,6 +1410,17 @@
1410 "url": "https://github.com/sponsors/sindresorhus"
1411 }
1412 },
1413 + "node_modules/@eslint/eslintrc/node_modules/js-yaml": {
1414 + "version": "4.1.0",
1415 + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
1416 + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
1417 + "dependencies": {
1418 + "argparse": "^2.0.1"
1419 + },
1420 + "bin": {
1421 + "js-yaml": "bin/js-yaml.js"
1422 + }
1423 + },
1424 "node_modules/@eslint/eslintrc/node_modules/minimatch": {
1425 "version": "3.1.2",
1426 "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
@@ -1423,9 +1441,9 @@
1441 }
1442 },
1443 "node_modules/@eslint/markdown": {
1426 - "version": "6.1.1",
1427 - "resolved": "https://registry.npmjs.org/@eslint/markdown/-/markdown-6.1.1.tgz",
1428 - "integrity": "sha512-Z+1js5AeqidwhNBbnIPM6Fn4eY9D5i1NleamS0UBW6BG0J4lpvhIVOKVIi22kmH5gvxDmHUp5MHkkkjda0TehA==",
1444 + "version": "6.2.0",
1445 + "resolved": "https://registry.npmjs.org/@eslint/markdown/-/markdown-6.2.0.tgz",
1446 + "integrity": "sha512-ZLWZ6RNy5flf1Nk2DBt0V77MQpQEo8snkjVT75P5J0SJkE/QNoqgy7+dBvNjlyZuj664pU43uDXWg3J8AfF0IQ==",
1447 "dev": true,
1448 "dependencies": {
1449 "@eslint/plugin-kit": "^0.2.0",
@@ -1758,19 +1776,19 @@
1776 }
1777 },
1778 "node_modules/@fontsource/jetbrains-mono": {
1761 - "version": "5.1.0",
1762 - "resolved": "https://registry.npmjs.org/@fontsource/jetbrains-mono/-/jetbrains-mono-5.1.0.tgz",
1763 - "integrity": "sha512-YzWpGYY3PoqvmvwW2Hb4NwkN5C7LO0FmZugEGcFe6cNNE/cMgH9JhW5LI6hjG+1+nwgSHyJtKmblHNrUqlyhWg=="
1779 + "version": "5.1.1",
1780 + "resolved": "https://registry.npmjs.org/@fontsource/jetbrains-mono/-/jetbrains-mono-5.1.1.tgz",
1781 + "integrity": "sha512-5rwvmdQQpXev4LlBX1P+7h2dguu6iwW/9Npjde4+DEq+HgpVJI/7QY8DI1NVVFdvLtXZNP+vO2L/5BQED6FUhA=="
1782 },
1783 "node_modules/@fontsource/lexend": {
1766 - "version": "5.1.0",
1767 - "resolved": "https://registry.npmjs.org/@fontsource/lexend/-/lexend-5.1.0.tgz",
1768 - "integrity": "sha512-mqwRfsRobLoj4iHqkvMGMMiTYU7n0hbgGftGBKFGKGyedseQOQ3k7iCBVTAU9wIyfq02Rypd9BrLXChHwFvg0Q=="
1784 + "version": "5.1.1",
1785 + "resolved": "https://registry.npmjs.org/@fontsource/lexend/-/lexend-5.1.1.tgz",
1786 + "integrity": "sha512-92A96vmx5xk1NgNphB62w5PKhW53Ruo74ki3UsUrV1q7/tbhJ73k2podhCNmldUlpUeO6rrCUWpRM20WloiNXA=="
1787 },
1788 "node_modules/@fontsource/public-sans": {
1771 - "version": "5.1.0",
1772 - "resolved": "https://registry.npmjs.org/@fontsource/public-sans/-/public-sans-5.1.0.tgz",
1773 - "integrity": "sha512-94+468XL9dUxsZ5edw/AtBHLdIwkvqr3WBUMBD30LUQzJpHw/Fxd7VrgkXSIKRIwYi3pTuQ1Q2Vj3COGIwi58Q=="
1789 + "version": "5.1.1",
1790 + "resolved": "https://registry.npmjs.org/@fontsource/public-sans/-/public-sans-5.1.1.tgz",
1791 + "integrity": "sha512-BEJEc9kpLBowHLqeOlex1lMJPZ/6mzKn3ArhbvWY9dvMcjSqH7jzJyTN44j0H78FTOrVjIW1g4A8nDdbx8VV5Q=="
1792 },
1793 "node_modules/@hapi/hoek": {
1794 "version": "9.3.0",
@@ -1787,6 +1805,26 @@
1805 "@hapi/hoek": "^9.0.0"
1806 }
1807 },
1808 + "node_modules/@humanfs/core": {
1809 + "version": "0.19.0",
1810 + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.0.tgz",
1811 + "integrity": "sha512-2cbWIHbZVEweE853g8jymffCA+NCMiuqeECeBBLm8dg2oFdjuGJhgN4UAbI+6v0CKbbhvtXA4qV8YR5Ji86nmw==",
1812 + "engines": {
1813 + "node": ">=18.18.0"
1814 + }
1815 + },
1816 + "node_modules/@humanfs/node": {
1817 + "version": "0.16.5",
1818 + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.5.tgz",
1819 + "integrity": "sha512-KSPA4umqSG4LHYRodq31VDwKAvaTF4xmVlzM8Aeh4PlU1JQ3IG0wiA8C25d3RQ9nJyM3mBHyI53K06VVL/oFFg==",
1820 + "dependencies": {
1821 + "@humanfs/core": "^0.19.0",
1822 + "@humanwhocodes/retry": "^0.3.0"
1823 + },
1824 + "engines": {
1825 + "node": ">=18.18.0"
1826 + }
1827 + },
1828 "node_modules/@humanwhocodes/config-array": {
1829 "version": "0.13.0",
1830 "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz",
@@ -1844,9 +1882,9 @@
1882 "peer": true
1883 },
1884 "node_modules/@humanwhocodes/retry": {
1847 - "version": "0.3.0",
1848 - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.0.tgz",
1849 - "integrity": "sha512-d2CGZR2o7fS6sWB7DG/3a95bGKQyHMACZ5aW8qGkkqQpUoZV6C0X7Pc7l4ZNMZkfNBf4VWNe9E1jRsf0G146Ew==",
1885 + "version": "0.3.1",
1886 + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz",
1887 + "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==",
1888 "engines": {
1889 "node": ">=18.18"
1890 },
@@ -1877,12 +1915,12 @@
1915 }
1916 },
1917 "node_modules/@intlify/core-base": {
1880 - "version": "10.0.3",
1881 - "resolved": "https://registry.npmjs.org/@intlify/core-base/-/core-base-10.0.3.tgz",
1882 - "integrity": "sha512-ysJnTGDtuXPa6R2Ii4JIvfMVvDahUUny3aY8+P4r6/0TYHkblgzIMjV6cAn60em67AB0M7OWNAdcAVfWWeN8Qg==",
1918 + "version": "10.0.4",
1919 + "resolved": "https://registry.npmjs.org/@intlify/core-base/-/core-base-10.0.4.tgz",
1920 + "integrity": "sha512-GG428DkrrWCMhxRMRQZjuS7zmSUzarYcaHJqG9VB8dXAxw4iQDoKVQ7ChJRB6ZtsCsX3Jse1PEUlHrJiyQrOTg==",
1921 "dependencies": {
1884 - "@intlify/message-compiler": "10.0.3",
1885 - "@intlify/shared": "10.0.3"
1922 + "@intlify/message-compiler": "10.0.4",
1923 + "@intlify/shared": "10.0.4"
1924 },
1925 "engines": {
1926 "node": ">= 16"
@@ -1892,11 +1930,11 @@
1930 }
1931 },
1932 "node_modules/@intlify/message-compiler": {
1895 - "version": "10.0.3",
1896 - "resolved": "https://registry.npmjs.org/@intlify/message-compiler/-/message-compiler-10.0.3.tgz",
1897 - "integrity": "sha512-KC2fG8nCzSYmXjHptEt6i/xM3k6S2szsPaHDCRgWKEYAbeHe6JFm6X4KRw3Csy112A8CxpavMi1dh3h7khwV5w==",
1933 + "version": "10.0.4",
1934 + "resolved": "https://registry.npmjs.org/@intlify/message-compiler/-/message-compiler-10.0.4.tgz",
1935 + "integrity": "sha512-AFbhEo10DP095/45EauinQJ5hJ3rJUmuuqltGguvc3WsvezZN+g8qNHLGWKu60FHQVizMrQY7VJ+zVlBXlQQkQ==",
1936 "dependencies": {
1899 - "@intlify/shared": "10.0.3",
1937 + "@intlify/shared": "10.0.4",
1938 "source-map-js": "^1.0.2"
1939 },
1940 "engines": {
@@ -1907,9 +1945,9 @@
1945 }
1946 },
1947 "node_modules/@intlify/shared": {
1910 - "version": "10.0.3",
1911 - "resolved": "https://registry.npmjs.org/@intlify/shared/-/shared-10.0.3.tgz",
1912 - "integrity": "sha512-PWxrCb6fDlnoGLnXLlWu6d7o/HdWACB9TjRnpLro+9uyfqgWA9hvqg5vekcPRyraTieV5srCbTk/ldYw9V3LHw==",
1948 + "version": "10.0.4",
1949 + "resolved": "https://registry.npmjs.org/@intlify/shared/-/shared-10.0.4.tgz",
1950 + "integrity": "sha512-ukFn0I01HsSgr3VYhYcvkTCLS7rGa0gw4A4AMpcy/A9xx/zRJy7PS2BElMXLwUazVFMAr5zuiTk3MQeoeGXaJg==",
1951 "engines": {
1952 "node": ">= 16"
1953 },
@@ -2138,6 +2176,279 @@
2176 "integrity": "sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==",
2177 "dev": true
2178 },
2179 + "node_modules/@parcel/watcher": {
2180 + "version": "2.4.1",
2181 + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.4.1.tgz",
2182 + "integrity": "sha512-HNjmfLQEVRZmHRET336f20H/8kOozUGwk7yajvsonjNxbj2wBTK1WsQuHkD5yYh9RxFGL2EyDHryOihOwUoKDA==",
2183 + "dev": true,
2184 + "dependencies": {
2185 + "detect-libc": "^1.0.3",
2186 + "is-glob": "^4.0.3",
2187 + "micromatch": "^4.0.5",
2188 + "node-addon-api": "^7.0.0"
2189 + },
2190 + "engines": {
2191 + "node": ">= 10.0.0"
2192 + },
2193 + "funding": {
2194 + "type": "opencollective",
2195 + "url": "https://opencollective.com/parcel"
2196 + },
2197 + "optionalDependencies": {
2198 + "@parcel/watcher-android-arm64": "2.4.1",
2199 + "@parcel/watcher-darwin-arm64": "2.4.1",
2200 + "@parcel/watcher-darwin-x64": "2.4.1",
2201 + "@parcel/watcher-freebsd-x64": "2.4.1",
2202 + "@parcel/watcher-linux-arm-glibc": "2.4.1",
2203 + "@parcel/watcher-linux-arm64-glibc": "2.4.1",
2204 + "@parcel/watcher-linux-arm64-musl": "2.4.1",
2205 + "@parcel/watcher-linux-x64-glibc": "2.4.1",
2206 + "@parcel/watcher-linux-x64-musl": "2.4.1",
2207 + "@parcel/watcher-win32-arm64": "2.4.1",
2208 + "@parcel/watcher-win32-ia32": "2.4.1",
2209 + "@parcel/watcher-win32-x64": "2.4.1"
2210 + }
2211 + },
2212 + "node_modules/@parcel/watcher-android-arm64": {
2213 + "version": "2.4.1",
2214 + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.4.1.tgz",
2215 + "integrity": "sha512-LOi/WTbbh3aTn2RYddrO8pnapixAziFl6SMxHM69r3tvdSm94JtCenaKgk1GRg5FJ5wpMCpHeW+7yqPlvZv7kg==",
2216 + "cpu": [
2217 + "arm64"
2218 + ],
2219 + "dev": true,
2220 + "optional": true,
2221 + "os": [
2222 + "android"
2223 + ],
2224 + "engines": {
2225 + "node": ">= 10.0.0"
2226 + },
2227 + "funding": {
2228 + "type": "opencollective",
2229 + "url": "https://opencollective.com/parcel"
2230 + }
2231 + },
2232 + "node_modules/@parcel/watcher-darwin-arm64": {
2233 + "version": "2.4.1",
2234 + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.4.1.tgz",
2235 + "integrity": "sha512-ln41eihm5YXIY043vBrrHfn94SIBlqOWmoROhsMVTSXGh0QahKGy77tfEywQ7v3NywyxBBkGIfrWRHm0hsKtzA==",
2236 + "cpu": [
2237 + "arm64"
2238 + ],
2239 + "dev": true,
2240 + "optional": true,
2241 + "os": [
2242 + "darwin"
2243 + ],
2244 + "engines": {
2245 + "node": ">= 10.0.0"
2246 + },
2247 + "funding": {
2248 + "type": "opencollective",
2249 + "url": "https://opencollective.com/parcel"
2250 + }
2251 + },
2252 + "node_modules/@parcel/watcher-darwin-x64": {
2253 + "version": "2.4.1",
2254 + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.4.1.tgz",
2255 + "integrity": "sha512-yrw81BRLjjtHyDu7J61oPuSoeYWR3lDElcPGJyOvIXmor6DEo7/G2u1o7I38cwlcoBHQFULqF6nesIX3tsEXMg==",
2256 + "cpu": [
2257 + "x64"
2258 + ],
2259 + "dev": true,
2260 + "optional": true,
2261 + "os": [
2262 + "darwin"
2263 + ],
2264 + "engines": {
2265 + "node": ">= 10.0.0"
2266 + },
2267 + "funding": {
2268 + "type": "opencollective",
2269 + "url": "https://opencollective.com/parcel"
2270 + }
2271 + },
2272 + "node_modules/@parcel/watcher-freebsd-x64": {
2273 + "version": "2.4.1",
2274 + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.4.1.tgz",
2275 + "integrity": "sha512-TJa3Pex/gX3CWIx/Co8k+ykNdDCLx+TuZj3f3h7eOjgpdKM+Mnix37RYsYU4LHhiYJz3DK5nFCCra81p6g050w==",
2276 + "cpu": [
2277 + "x64"
2278 + ],
2279 + "dev": true,
2280 + "optional": true,
2281 + "os": [
2282 + "freebsd"
2283 + ],
2284 + "engines": {
2285 + "node": ">= 10.0.0"
2286 + },
2287 + "funding": {
2288 + "type": "opencollective",
2289 + "url": "https://opencollective.com/parcel"
2290 + }
2291 + },
2292 + "node_modules/@parcel/watcher-linux-arm-glibc": {
2293 + "version": "2.4.1",
2294 + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.4.1.tgz",
2295 + "integrity": "sha512-4rVYDlsMEYfa537BRXxJ5UF4ddNwnr2/1O4MHM5PjI9cvV2qymvhwZSFgXqbS8YoTk5i/JR0L0JDs69BUn45YA==",
2296 + "cpu": [
2297 + "arm"
2298 + ],
2299 + "dev": true,
2300 + "optional": true,
2301 + "os": [
2302 + "linux"
2303 + ],
2304 + "engines": {
2305 + "node": ">= 10.0.0"
2306 + },
2307 + "funding": {
2308 + "type": "opencollective",
2309 + "url": "https://opencollective.com/parcel"
2310 + }
2311 + },
2312 + "node_modules/@parcel/watcher-linux-arm64-glibc": {
2313 + "version": "2.4.1",
2314 + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.4.1.tgz",
2315 + "integrity": "sha512-BJ7mH985OADVLpbrzCLgrJ3TOpiZggE9FMblfO65PlOCdG++xJpKUJ0Aol74ZUIYfb8WsRlUdgrZxKkz3zXWYA==",
2316 + "cpu": [
2317 + "arm64"
2318 + ],
2319 + "dev": true,
2320 + "optional": true,
2321 + "os": [
2322 + "linux"
2323 + ],
2324 + "engines": {
2325 + "node": ">= 10.0.0"
2326 + },
2327 + "funding": {
2328 + "type": "opencollective",
2329 + "url": "https://opencollective.com/parcel"
2330 + }
2331 + },
2332 + "node_modules/@parcel/watcher-linux-arm64-musl": {
2333 + "version": "2.4.1",
2334 + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.4.1.tgz",
2335 + "integrity": "sha512-p4Xb7JGq3MLgAfYhslU2SjoV9G0kI0Xry0kuxeG/41UfpjHGOhv7UoUDAz/jb1u2elbhazy4rRBL8PegPJFBhA==",
2336 + "cpu": [
2337 + "arm64"
2338 + ],
2339 + "dev": true,
2340 + "optional": true,
2341 + "os": [
2342 + "linux"
2343 + ],
2344 + "engines": {
2345 + "node": ">= 10.0.0"
2346 + },
2347 + "funding": {
2348 + "type": "opencollective",
2349 + "url": "https://opencollective.com/parcel"
2350 + }
2351 + },
2352 + "node_modules/@parcel/watcher-linux-x64-glibc": {
2353 + "version": "2.4.1",
2354 + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.4.1.tgz",
2355 + "integrity": "sha512-s9O3fByZ/2pyYDPoLM6zt92yu6P4E39a03zvO0qCHOTjxmt3GHRMLuRZEWhWLASTMSrrnVNWdVI/+pUElJBBBg==",
2356 + "cpu": [
2357 + "x64"
2358 + ],
2359 + "dev": true,
2360 + "optional": true,
2361 + "os": [
2362 + "linux"
2363 + ],
2364 + "engines": {
2365 + "node": ">= 10.0.0"
2366 + },
2367 + "funding": {
2368 + "type": "opencollective",
2369 + "url": "https://opencollective.com/parcel"
2370 + }
2371 + },
2372 + "node_modules/@parcel/watcher-linux-x64-musl": {
2373 + "version": "2.4.1",
2374 + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.4.1.tgz",
2375 + "integrity": "sha512-L2nZTYR1myLNST0O632g0Dx9LyMNHrn6TOt76sYxWLdff3cB22/GZX2UPtJnaqQPdCRoszoY5rcOj4oMTtp5fQ==",
2376 + "cpu": [
2377 + "x64"
2378 + ],
2379 + "dev": true,
2380 + "optional": true,
2381 + "os": [
2382 + "linux"
2383 + ],
2384 + "engines": {
2385 + "node": ">= 10.0.0"
2386 + },
2387 + "funding": {
2388 + "type": "opencollective",
2389 + "url": "https://opencollective.com/parcel"
2390 + }
2391 + },
2392 + "node_modules/@parcel/watcher-win32-arm64": {
2393 + "version": "2.4.1",
2394 + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.4.1.tgz",
2395 + "integrity": "sha512-Uq2BPp5GWhrq/lcuItCHoqxjULU1QYEcyjSO5jqqOK8RNFDBQnenMMx4gAl3v8GiWa59E9+uDM7yZ6LxwUIfRg==",
2396 + "cpu": [
2397 + "arm64"
2398 + ],
2399 + "dev": true,
2400 + "optional": true,
2401 + "os": [
2402 + "win32"
2403 + ],
2404 + "engines": {
2405 + "node": ">= 10.0.0"
2406 + },
2407 + "funding": {
2408 + "type": "opencollective",
2409 + "url": "https://opencollective.com/parcel"
2410 + }
2411 + },
2412 + "node_modules/@parcel/watcher-win32-ia32": {
2413 + "version": "2.4.1",
2414 + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.4.1.tgz",
2415 + "integrity": "sha512-maNRit5QQV2kgHFSYwftmPBxiuK5u4DXjbXx7q6eKjq5dsLXZ4FJiVvlcw35QXzk0KrUecJmuVFbj4uV9oYrcw==",
2416 + "cpu": [
2417 + "ia32"
2418 + ],
2419 + "dev": true,
2420 + "optional": true,
2421 + "os": [
2422 + "win32"
2423 + ],
2424 + "engines": {
2425 + "node": ">= 10.0.0"
2426 + },
2427 + "funding": {
2428 + "type": "opencollective",
2429 + "url": "https://opencollective.com/parcel"
2430 + }
2431 + },
2432 + "node_modules/@parcel/watcher-win32-x64": {
2433 + "version": "2.4.1",
2434 + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.4.1.tgz",
2435 + "integrity": "sha512-+DvS92F9ezicfswqrvIRM2njcYJbd5mb9CUgtrHCHmvn7pPPa+nMDRu1o1bYYz/l5IB2NVGNJWiH7h1E58IF2A==",
2436 + "cpu": [
2437 + "x64"
2438 + ],
2439 + "dev": true,
2440 + "optional": true,
2441 + "os": [
2442 + "win32"
2443 + ],
2444 + "engines": {
2445 + "node": ">= 10.0.0"
2446 + },
2447 + "funding": {
2448 + "type": "opencollective",
2449 + "url": "https://opencollective.com/parcel"
2450 + }
2451 + },
2452 "node_modules/@pkgjs/parseargs": {
2453 "version": "0.11.0",
2454 "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
@@ -2165,15 +2476,6 @@
2476 "integrity": "sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==",
2477 "dev": true
2478 },
2168 - "node_modules/@popperjs/core": {
2169 - "version": "2.11.8",
2170 - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz",
2171 - "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==",
2172 - "funding": {
2173 - "type": "opencollective",
2174 - "url": "https://opencollective.com/popperjs"
2175 - }
2176 - },
2479 "node_modules/@rollup/pluginutils": {
2480 "version": "5.1.2",
2481 "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.2.tgz",
@@ -2207,9 +2509,9 @@
2509 }
2510 },
2511 "node_modules/@rollup/rollup-android-arm-eabi": {
2210 - "version": "4.22.5",
2211 - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.22.5.tgz",
2212 - "integrity": "sha512-SU5cvamg0Eyu/F+kLeMXS7GoahL+OoizlclVFX3l5Ql6yNlywJJ0OuqTzUx0v+aHhPHEB/56CT06GQrRrGNYww==",
2512 + "version": "4.24.0",
2513 + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.24.0.tgz",
2514 + "integrity": "sha512-Q6HJd7Y6xdB48x8ZNVDOqsbh2uByBhgK8PiQgPhwkIw/HC/YX5Ghq2mQY5sRMZWHb3VsFkWooUVOZHKr7DmDIA==",
2515 "cpu": [
2516 "arm"
2517 ],
@@ -2220,9 +2522,9 @@
2522 ]
2523 },
2524 "node_modules/@rollup/rollup-android-arm64": {
2223 - "version": "4.22.5",
2224 - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.22.5.tgz",
2225 - "integrity": "sha512-S4pit5BP6E5R5C8S6tgU/drvgjtYW76FBuG6+ibG3tMvlD1h9LHVF9KmlmaUBQ8Obou7hEyS+0w+IR/VtxwNMQ==",
2525 + "version": "4.24.0",
2526 + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.24.0.tgz",
2527 + "integrity": "sha512-ijLnS1qFId8xhKjT81uBHuuJp2lU4x2yxa4ctFPtG+MqEE6+C5f/+X/bStmxapgmwLwiL3ih122xv8kVARNAZA==",
2528 "cpu": [
2529 "arm64"
2530 ],
@@ -2233,9 +2535,9 @@
2535 ]
2536 },
2537 "node_modules/@rollup/rollup-darwin-arm64": {
2236 - "version": "4.22.5",
2237 - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.22.5.tgz",
2238 - "integrity": "sha512-250ZGg4ipTL0TGvLlfACkIxS9+KLtIbn7BCZjsZj88zSg2Lvu3Xdw6dhAhfe/FjjXPVNCtcSp+WZjVsD3a/Zlw==",
2538 + "version": "4.24.0",
2539 + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.24.0.tgz",
2540 + "integrity": "sha512-bIv+X9xeSs1XCk6DVvkO+S/z8/2AMt/2lMqdQbMrmVpgFvXlmde9mLcbQpztXm1tajC3raFDqegsH18HQPMYtA==",
2541 "cpu": [
2542 "arm64"
2543 ],
@@ -2246,9 +2548,9 @@
2548 ]
2549 },
2550 "node_modules/@rollup/rollup-darwin-x64": {
2249 - "version": "4.22.5",
2250 - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.22.5.tgz",
2251 - "integrity": "sha512-D8brJEFg5D+QxFcW6jYANu+Rr9SlKtTenmsX5hOSzNYVrK5oLAEMTUgKWYJP+wdKyCdeSwnapLsn+OVRFycuQg==",
2551 + "version": "4.24.0",
2552 + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.24.0.tgz",
2553 + "integrity": "sha512-X6/nOwoFN7RT2svEQWUsW/5C/fYMBe4fnLK9DQk4SX4mgVBiTA9h64kjUYPvGQ0F/9xwJ5U5UfTbl6BEjaQdBQ==",
2554 "cpu": [
2555 "x64"
2556 ],
@@ -2259,9 +2561,9 @@
2561 ]
2562 },
2563 "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
2262 - "version": "4.22.5",
2263 - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.22.5.tgz",
2264 - "integrity": "sha512-PNqXYmdNFyWNg0ma5LdY8wP+eQfdvyaBAojAXgO7/gs0Q/6TQJVXAXe8gwW9URjbS0YAammur0fynYGiWsKlXw==",
2564 + "version": "4.24.0",
2565 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.24.0.tgz",
2566 + "integrity": "sha512-0KXvIJQMOImLCVCz9uvvdPgfyWo93aHHp8ui3FrtOP57svqrF/roSSR5pjqL2hcMp0ljeGlU4q9o/rQaAQ3AYA==",
2567 "cpu": [
2568 "arm"
2569 ],
@@ -2272,9 +2574,9 @@
2574 ]
2575 },
2576 "node_modules/@rollup/rollup-linux-arm-musleabihf": {
2275 - "version": "4.22.5",
2276 - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.22.5.tgz",
2277 - "integrity": "sha512-kSSCZOKz3HqlrEuwKd9TYv7vxPYD77vHSUvM2y0YaTGnFc8AdI5TTQRrM1yIp3tXCKrSL9A7JLoILjtad5t8pQ==",
2577 + "version": "4.24.0",
2578 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.24.0.tgz",
2579 + "integrity": "sha512-it2BW6kKFVh8xk/BnHfakEeoLPv8STIISekpoF+nBgWM4d55CZKc7T4Dx1pEbTnYm/xEKMgy1MNtYuoA8RFIWw==",
2580 "cpu": [
2581 "arm"
2582 ],
@@ -2285,9 +2587,9 @@
2587 ]
2588 },
2589 "node_modules/@rollup/rollup-linux-arm64-gnu": {
2288 - "version": "4.22.5",
2289 - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.22.5.tgz",
2290 - "integrity": "sha512-oTXQeJHRbOnwRnRffb6bmqmUugz0glXaPyspp4gbQOPVApdpRrY/j7KP3lr7M8kTfQTyrBUzFjj5EuHAhqH4/w==",
2590 + "version": "4.24.0",
2591 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.24.0.tgz",
2592 + "integrity": "sha512-i0xTLXjqap2eRfulFVlSnM5dEbTVque/3Pi4g2y7cxrs7+a9De42z4XxKLYJ7+OhE3IgxvfQM7vQc43bwTgPwA==",
2593 "cpu": [
2594 "arm64"
2595 ],
@@ -2298,9 +2600,9 @@
2600 ]
2601 },
2602 "node_modules/@rollup/rollup-linux-arm64-musl": {
2301 - "version": "4.22.5",
2302 - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.22.5.tgz",
2303 - "integrity": "sha512-qnOTIIs6tIGFKCHdhYitgC2XQ2X25InIbZFor5wh+mALH84qnFHvc+vmWUpyX97B0hNvwNUL4B+MB8vJvH65Fw==",
2603 + "version": "4.24.0",
2604 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.24.0.tgz",
2605 + "integrity": "sha512-9E6MKUJhDuDh604Qco5yP/3qn3y7SLXYuiC0Rpr89aMScS2UAmK1wHP2b7KAa1nSjWJc/f/Lc0Wl1L47qjiyQw==",
2606 "cpu": [
2607 "arm64"
2608 ],
@@ -2311,9 +2613,9 @@
2613 ]
2614 },
2615 "node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
2314 - "version": "4.22.5",
2315 - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.22.5.tgz",
2316 - "integrity": "sha512-TMYu+DUdNlgBXING13rHSfUc3Ky5nLPbWs4bFnT+R6Vu3OvXkTkixvvBKk8uO4MT5Ab6lC3U7x8S8El2q5o56w==",
2616 + "version": "4.24.0",
2617 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.24.0.tgz",
2618 + "integrity": "sha512-2XFFPJ2XMEiF5Zi2EBf4h73oR1V/lycirxZxHZNc93SqDN/IWhYYSYj8I9381ikUFXZrz2v7r2tOVk2NBwxrWw==",
2619 "cpu": [
2620 "ppc64"
2621 ],
@@ -2324,9 +2626,9 @@
2626 ]
2627 },
2628 "node_modules/@rollup/rollup-linux-riscv64-gnu": {
2327 - "version": "4.22.5",
2328 - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.22.5.tgz",
2329 - "integrity": "sha512-PTQq1Kz22ZRvuhr3uURH+U/Q/a0pbxJoICGSprNLAoBEkyD3Sh9qP5I0Asn0y0wejXQBbsVMRZRxlbGFD9OK4A==",
2629 + "version": "4.24.0",
2630 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.24.0.tgz",
2631 + "integrity": "sha512-M3Dg4hlwuntUCdzU7KjYqbbd+BLq3JMAOhCKdBE3TcMGMZbKkDdJ5ivNdehOssMCIokNHFOsv7DO4rlEOfyKpg==",
2632 "cpu": [
2633 "riscv64"
2634 ],
@@ -2337,9 +2639,9 @@
2639 ]
2640 },
2641 "node_modules/@rollup/rollup-linux-s390x-gnu": {
2340 - "version": "4.22.5",
2341 - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.22.5.tgz",
2342 - "integrity": "sha512-bR5nCojtpuMss6TDEmf/jnBnzlo+6n1UhgwqUvRoe4VIotC7FG1IKkyJbwsT7JDsF2jxR+NTnuOwiGv0hLyDoQ==",
2642 + "version": "4.24.0",
2643 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.24.0.tgz",
2644 + "integrity": "sha512-mjBaoo4ocxJppTorZVKWFpy1bfFj9FeCMJqzlMQGjpNPY9JwQi7OuS1axzNIk0nMX6jSgy6ZURDZ2w0QW6D56g==",
2645 "cpu": [
2646 "s390x"
2647 ],
@@ -2350,9 +2652,9 @@
2652 ]
2653 },
2654 "node_modules/@rollup/rollup-linux-x64-gnu": {
2353 - "version": "4.23.0",
2354 - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.23.0.tgz",
2355 - "integrity": "sha512-I/eXsdVoCKtSgK9OwyQKPAfricWKUMNCwJKtatRYMmDo5N859tbO3UsBw5kT3dU1n6ZcM1JDzPRSGhAUkxfLxw==",
2655 + "version": "4.24.0",
2656 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.24.0.tgz",
2657 + "integrity": "sha512-ZXFk7M72R0YYFN5q13niV0B7G8/5dcQ9JDp8keJSfr3GoZeXEoMHP/HlvqROA3OMbMdfr19IjCeNAnPUG93b6A==",
2658 "cpu": [
2659 "x64"
2660 ],
@@ -2362,9 +2664,9 @@
2664 ]
2665 },
2666 "node_modules/@rollup/rollup-linux-x64-musl": {
2365 - "version": "4.22.5",
2366 - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.22.5.tgz",
2367 - "integrity": "sha512-uBa2e28ohzNNwjr6Uxm4XyaA1M/8aTgfF2T7UIlElLaeXkgpmIJ2EitVNQxjO9xLLLy60YqAgKn/AqSpCUkE9g==",
2667 + "version": "4.24.0",
2668 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.24.0.tgz",
2669 + "integrity": "sha512-w1i+L7kAXZNdYl+vFvzSZy8Y1arS7vMgIy8wusXJzRrPyof5LAb02KGr1PD2EkRcl73kHulIID0M501lN+vobQ==",
2670 "cpu": [
2671 "x64"
2672 ],
@@ -2375,9 +2677,9 @@
2677 ]
2678 },
2679 "node_modules/@rollup/rollup-win32-arm64-msvc": {
2378 - "version": "4.22.5",
2379 - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.22.5.tgz",
2380 - "integrity": "sha512-RXT8S1HP8AFN/Kr3tg4fuYrNxZ/pZf1HemC5Tsddc6HzgGnJm0+Lh5rAHJkDuW3StI0ynNXukidROMXYl6ew8w==",
2680 + "version": "4.24.0",
2681 + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.24.0.tgz",
2682 + "integrity": "sha512-VXBrnPWgBpVDCVY6XF3LEW0pOU51KbaHhccHw6AS6vBWIC60eqsH19DAeeObl+g8nKAz04QFdl/Cefta0xQtUQ==",
2683 "cpu": [
2684 "arm64"
2685 ],
@@ -2388,9 +2690,9 @@
2690 ]
2691 },
2692 "node_modules/@rollup/rollup-win32-ia32-msvc": {
2391 - "version": "4.22.5",
2392 - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.22.5.tgz",
2393 - "integrity": "sha512-ElTYOh50InL8kzyUD6XsnPit7jYCKrphmddKAe1/Ytt74apOxDq5YEcbsiKs0fR3vff3jEneMM+3I7jbqaMyBg==",
2693 + "version": "4.24.0",
2694 + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.24.0.tgz",
2695 + "integrity": "sha512-xrNcGDU0OxVcPTH/8n/ShH4UevZxKIO6HJFK0e15XItZP2UcaiLFd5kiX7hJnqCbSztUF8Qot+JWBC/QXRPYWQ==",
2696 "cpu": [
2697 "ia32"
2698 ],
@@ -2401,9 +2703,9 @@
2703 ]
2704 },
2705 "node_modules/@rollup/rollup-win32-x64-msvc": {
2404 - "version": "4.22.5",
2405 - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.22.5.tgz",
2406 - "integrity": "sha512-+lvL/4mQxSV8MukpkKyyvfwhH266COcWlXE/1qxwN08ajovta3459zrjLghYMgDerlzNwLAcFpvU+WWE5y6nAQ==",
2706 + "version": "4.24.0",
2707 + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.24.0.tgz",
2708 + "integrity": "sha512-fbMkAF7fufku0N2dE5TBXcNlg0pt0cJue4xBRE2Qc5Vqikxr4VCgKj/ht6SMdFcOacVA9rqF70APJ8RN/4vMJw==",
2709 "cpu": [
2710 "x64"
2711 ],
@@ -2414,59 +2716,59 @@
2716 ]
2717 },
2718 "node_modules/@shikijs/core": {
2417 - "version": "1.21.0",
2418 - "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-1.21.0.tgz",
2419 - "integrity": "sha512-zAPMJdiGuqXpZQ+pWNezQAk5xhzRXBNiECFPcJLtUdsFM3f//G95Z15EHTnHchYycU8kIIysqGgxp8OVSj1SPQ==",
2420 - "dependencies": {
2421 - "@shikijs/engine-javascript": "1.21.0",
2422 - "@shikijs/engine-oniguruma": "1.21.0",
2423 - "@shikijs/types": "1.21.0",
2424 - "@shikijs/vscode-textmate": "^9.2.2",
2719 + "version": "1.22.0",
2720 + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-1.22.0.tgz",
2721 + "integrity": "sha512-S8sMe4q71TJAW+qG93s5VaiihujRK6rqDFqBnxqvga/3LvqHEnxqBIOPkt//IdXVtHkQWKu4nOQNk0uBGicU7Q==",
2722 + "dependencies": {
2723 + "@shikijs/engine-javascript": "1.22.0",
2724 + "@shikijs/engine-oniguruma": "1.22.0",
2725 + "@shikijs/types": "1.22.0",
2726 + "@shikijs/vscode-textmate": "^9.3.0",
2727 "@types/hast": "^3.0.4",
2728 "hast-util-to-html": "^9.0.3"
2729 }
2730 },
2731 "node_modules/@shikijs/engine-javascript": {
2430 - "version": "1.21.0",
2431 - "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-1.21.0.tgz",
2432 - "integrity": "sha512-jxQHNtVP17edFW4/0vICqAVLDAxmyV31MQJL4U/Kg+heQALeKYVOWo0sMmEZ18FqBt+9UCdyqGKYE7bLRtk9mg==",
2732 + "version": "1.22.0",
2733 + "resolved": "https://registry.npmjs.org/@shikijs/engine-javascript/-/engine-javascript-1.22.0.tgz",
2734 + "integrity": "sha512-AeEtF4Gcck2dwBqCFUKYfsCq0s+eEbCEbkUuFou53NZ0sTGnJnJ/05KHQFZxpii5HMXbocV9URYVowOP2wH5kw==",
2735 "dependencies": {
2434 - "@shikijs/types": "1.21.0",
2435 - "@shikijs/vscode-textmate": "^9.2.2",
2736 + "@shikijs/types": "1.22.0",
2737 + "@shikijs/vscode-textmate": "^9.3.0",
2738 "oniguruma-to-js": "0.4.3"
2739 }
2740 },
2741 "node_modules/@shikijs/engine-oniguruma": {
2440 - "version": "1.21.0",
2441 - "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-1.21.0.tgz",
2442 - "integrity": "sha512-AIZ76XocENCrtYzVU7S4GY/HL+tgHGbVU+qhiDyNw1qgCA5OSi4B4+HY4BtAoJSMGuD/L5hfTzoRVbzEm2WTvg==",
2742 + "version": "1.22.0",
2743 + "resolved": "https://registry.npmjs.org/@shikijs/engine-oniguruma/-/engine-oniguruma-1.22.0.tgz",
2744 + "integrity": "sha512-5iBVjhu/DYs1HB0BKsRRFipRrD7rqjxlWTj4F2Pf+nQSPqc3kcyqFFeZXnBMzDf0HdqaFVvhDRAGiYNvyLP+Mw==",
2745 "dependencies": {
2444 - "@shikijs/types": "1.21.0",
2445 - "@shikijs/vscode-textmate": "^9.2.2"
2746 + "@shikijs/types": "1.22.0",
2747 + "@shikijs/vscode-textmate": "^9.3.0"
2748 }
2749 },
2750 "node_modules/@shikijs/markdown-it": {
2449 - "version": "1.21.0",
2450 - "resolved": "https://registry.npmjs.org/@shikijs/markdown-it/-/markdown-it-1.21.0.tgz",
2451 - "integrity": "sha512-wNvze11LNnhNc3NpGG7Y2Jxlecta85bd1QRltB+oqtug4w63BtjzTQubpB3NWwXTWXf91iVlmbo8Sp9mrmZVGQ==",
2751 + "version": "1.22.0",
2752 + "resolved": "https://registry.npmjs.org/@shikijs/markdown-it/-/markdown-it-1.22.0.tgz",
2753 + "integrity": "sha512-IAWi2pbzYndiuXOWnV5Ll4ULQJeWl45WUACl1Xc2KSiBl0JtQmqKvPOGKN7YSZbyIzkB6bWUItRrv5ucO35U+g==",
2754 "dependencies": {
2755 "markdown-it": "^14.1.0",
2454 - "shiki": "1.21.0"
2756 + "shiki": "1.22.0"
2757 }
2758 },
2759 "node_modules/@shikijs/types": {
2458 - "version": "1.21.0",
2459 - "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-1.21.0.tgz",
2460 - "integrity": "sha512-tzndANDhi5DUndBtpojEq/42+dpUF2wS7wdCDQaFtIXm3Rd1QkrcVgSSRLOvEwexekihOXfbYJINW37g96tJRw==",
2760 + "version": "1.22.0",
2761 + "resolved": "https://registry.npmjs.org/@shikijs/types/-/types-1.22.0.tgz",
2762 + "integrity": "sha512-Fw/Nr7FGFhlQqHfxzZY8Cwtwk5E9nKDUgeLjZgt3UuhcM3yJR9xj3ZGNravZZok8XmEZMiYkSMTPlPkULB8nww==",
2763 "dependencies": {
2462 - "@shikijs/vscode-textmate": "^9.2.2",
2764 + "@shikijs/vscode-textmate": "^9.3.0",
2765 "@types/hast": "^3.0.4"
2766 }
2767 },
2768 "node_modules/@shikijs/vscode-textmate": {
2467 - "version": "9.2.2",
2468 - "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-9.2.2.tgz",
2469 - "integrity": "sha512-TMp15K+GGYrWlZM8+Lnj9EaHEFmOen0WJBrfa17hF7taDOYthuPPV0GWzfd/9iMij0akS/8Yw2ikquH7uVi/fg=="
2769 + "version": "9.3.0",
2770 + "resolved": "https://registry.npmjs.org/@shikijs/vscode-textmate/-/vscode-textmate-9.3.0.tgz",
2771 + "integrity": "sha512-jn7/7ky30idSkd/O5yDBfAnVt+JJpepofP/POZ1iMOxK59cOfqIgg/Dj0eFsjOTMw+4ycJN0uhZH/Eb0bs/EUA=="
2772 },
2773 "node_modules/@sideway/address": {
2774 "version": "4.1.5",
@@ -2501,14 +2803,14 @@
2803 }
2804 },
2805 "node_modules/@stylistic/eslint-plugin": {
2504 - "version": "2.8.0",
2505 - "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-2.8.0.tgz",
2506 - "integrity": "sha512-Ufvk7hP+bf+pD35R/QfunF793XlSRIC7USr3/EdgduK9j13i2JjmsM0LUz3/foS+jDYp2fzyWZA9N44CPur0Ow==",
2806 + "version": "2.9.0",
2807 + "resolved": "https://registry.npmjs.org/@stylistic/eslint-plugin/-/eslint-plugin-2.9.0.tgz",
2808 + "integrity": "sha512-OrDyFAYjBT61122MIY1a3SfEgy3YCMgt2vL4eoPmvTwDBwyQhAXurxNQznlRD/jESNfYWfID8Ej+31LljvF7Xg==",
2809 "dev": true,
2810 "dependencies": {
2509 - "@typescript-eslint/utils": "^8.4.0",
2510 - "eslint-visitor-keys": "^4.0.0",
2511 - "espree": "^10.1.0",
2811 + "@typescript-eslint/utils": "^8.8.0",
2812 + "eslint-visitor-keys": "^4.1.0",
2813 + "espree": "^10.2.0",
2814 "estraverse": "^5.3.0",
2815 "picomatch": "^4.0.2"
2816 },
@@ -2578,16 +2880,6 @@
2880 "@types/unist": "*"
2881 }
2882 },
2581 - "node_modules/@types/inquirer": {
2582 - "version": "9.0.7",
2583 - "resolved": "https://registry.npmjs.org/@types/inquirer/-/inquirer-9.0.7.tgz",
2584 - "integrity": "sha512-Q0zyBupO6NxGRZut/JdmqYKOnN95Eg5V8Csg3PGKkP+FnvsUZx1jAyK7fztIszxxMuoBA6E3KXWvdZVXIpx60g==",
2585 - "dev": true,
2586 - "dependencies": {
2587 - "@types/through": "*",
2588 - "rxjs": "^7.2.0"
2589 - }
2590 - },
2883 "node_modules/@types/jsdom": {
2884 "version": "21.1.7",
2885 "resolved": "https://registry.npmjs.org/@types/jsdom/-/jsdom-21.1.7.tgz",
@@ -2619,9 +2911,9 @@
2911 "integrity": "sha512-HMwFiRujE5PjrgwHQ25+bsLJgowjGjm5Z8FVSf0N6PwgJrwxH0QxzHYDcKsTfV3wva0vzrpqMTJS2jXPr5BMEQ=="
2912 },
2913 "node_modules/@types/lodash": {
2622 - "version": "4.17.9",
2623 - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.9.tgz",
2624 - "integrity": "sha512-w9iWudx1XWOHW5lQRS9iKpK/XuRhnN+0T7HvdCCd802FYkT1AMTnxndJHGrNJwRoRHkslGr4S29tjm1cT7x/7w=="
2914 + "version": "4.17.10",
2915 + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.10.tgz",
2916 + "integrity": "sha512-YpS0zzoduEhuOWjAotS6A5AVCva7X4lVlYLF0FYHAY9sdraBfnatttHItlWeZdGhuEkf+OzMNg2ZYAx8t+52uQ=="
2917 },
2918 "node_modules/@types/lodash-es": {
2919 "version": "4.17.12",
@@ -2639,6 +2931,12 @@
2931 "@types/unist": "*"
2932 }
2933 },
2934 + "node_modules/@types/minimatch": {
2935 + "version": "3.0.5",
2936 + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz",
2937 + "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==",
2938 + "dev": true
2939 + },
2940 "node_modules/@types/ms": {
2941 "version": "0.7.34",
2942 "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz",
@@ -2646,9 +2944,9 @@
2944 "dev": true
2945 },
2946 "node_modules/@types/node": {
2649 - "version": "22.7.4",
2650 - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.4.tgz",
2651 - "integrity": "sha512-y+NPi1rFzDs1NdQHHToqeiX2TIS79SWEAw9GYhkkx8bD0ChpfqC+n2j5OXOCpzfojBEBt6DnEnnG9MY0zk1XLg==",
2947 + "version": "22.7.5",
2948 + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.5.tgz",
2949 + "integrity": "sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==",
2950 "dev": true,
2951 "dependencies": {
2952 "undici-types": "~6.19.2"
@@ -2660,6 +2958,12 @@
2958 "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==",
2959 "dev": true
2960 },
2961 + "node_modules/@types/parse-json": {
2962 + "version": "4.0.2",
2963 + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz",
2964 + "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==",
2965 + "dev": true
2966 + },
2967 "node_modules/@types/semver": {
2968 "version": "7.5.8",
2969 "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz",
@@ -2677,15 +2981,6 @@
2981 "integrity": "sha512-0vWLNK2D5MT9dg0iOo8GlKguPAU02QjmZitPEsXRuJXU/OGIOt9vT9Fc26wtYuavLxtO45v9PGleoL9Z0k1LHg==",
2982 "dev": true
2983 },
2680 - "node_modules/@types/through": {
2681 - "version": "0.0.33",
2682 - "resolved": "https://registry.npmjs.org/@types/through/-/through-0.0.33.tgz",
2683 - "integrity": "sha512-HsJ+z3QuETzP3cswwtzt2vEIiHBk/dCcHGhbmG5X3ecnwFD/lPrMpliGXxSCg03L9AhrdwA4Oz/qfspkDW+xGQ==",
2684 - "dev": true,
2685 - "dependencies": {
2686 - "@types/node": "*"
2687 - }
2688 - },
2984 "node_modules/@types/tough-cookie": {
2985 "version": "4.0.5",
2986 "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz",
@@ -2719,16 +3014,16 @@
3014 }
3015 },
3016 "node_modules/@typescript-eslint/eslint-plugin": {
2722 - "version": "8.7.0",
2723 - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.7.0.tgz",
2724 - "integrity": "sha512-RIHOoznhA3CCfSTFiB6kBGLQtB/sox+pJ6jeFu6FxJvqL8qRxq/FfGO/UhsGgQM9oGdXkV4xUgli+dt26biB6A==",
3017 + "version": "8.9.0",
3018 + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.9.0.tgz",
3019 + "integrity": "sha512-Y1n621OCy4m7/vTXNlCbMVp87zSd7NH0L9cXD8aIpOaNlzeWxIK4+Q19A68gSmTNRZn92UjocVUWDthGxtqHFg==",
3020 "dev": true,
3021 "dependencies": {
3022 "@eslint-community/regexpp": "^4.10.0",
2728 - "@typescript-eslint/scope-manager": "8.7.0",
2729 - "@typescript-eslint/type-utils": "8.7.0",
2730 - "@typescript-eslint/utils": "8.7.0",
2731 - "@typescript-eslint/visitor-keys": "8.7.0",
3023 + "@typescript-eslint/scope-manager": "8.9.0",
3024 + "@typescript-eslint/type-utils": "8.9.0",
3025 + "@typescript-eslint/utils": "8.9.0",
3026 + "@typescript-eslint/visitor-keys": "8.9.0",
3027 "graphemer": "^1.4.0",
3028 "ignore": "^5.3.1",
3029 "natural-compare": "^1.4.0",
@@ -2752,15 +3047,15 @@
3047 }
3048 },
3049 "node_modules/@typescript-eslint/parser": {
2755 - "version": "8.7.0",
2756 - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.7.0.tgz",
2757 - "integrity": "sha512-lN0btVpj2unxHlNYLI//BQ7nzbMJYBVQX5+pbNXvGYazdlgYonMn4AhhHifQ+J4fGRYA/m1DjaQjx+fDetqBOQ==",
3050 + "version": "8.9.0",
3051 + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.9.0.tgz",
3052 + "integrity": "sha512-U+BLn2rqTTHnc4FL3FJjxaXptTxmf9sNftJK62XLz4+GxG3hLHm/SUNaaXP5Y4uTiuYoL5YLy4JBCJe3+t8awQ==",
3053 "dev": true,
3054 "dependencies": {
2760 - "@typescript-eslint/scope-manager": "8.7.0",
2761 - "@typescript-eslint/types": "8.7.0",
2762 - "@typescript-eslint/typescript-estree": "8.7.0",
2763 - "@typescript-eslint/visitor-keys": "8.7.0",
3055 + "@typescript-eslint/scope-manager": "8.9.0",
3056 + "@typescript-eslint/types": "8.9.0",
3057 + "@typescript-eslint/typescript-estree": "8.9.0",
3058 + "@typescript-eslint/visitor-keys": "8.9.0",
3059 "debug": "^4.3.4"
3060 },
3061 "engines": {
@@ -2780,13 +3075,13 @@
3075 }
3076 },
3077 "node_modules/@typescript-eslint/scope-manager": {
2783 - "version": "8.7.0",
2784 - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.7.0.tgz",
2785 - "integrity": "sha512-87rC0k3ZlDOuz82zzXRtQ7Akv3GKhHs0ti4YcbAJtaomllXoSO8hi7Ix3ccEvCd824dy9aIX+j3d2UMAfCtVpg==",
3078 + "version": "8.9.0",
3079 + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.9.0.tgz",
3080 + "integrity": "sha512-bZu9bUud9ym1cabmOYH9S6TnbWRzpklVmwqICeOulTCZ9ue2/pczWzQvt/cGj2r2o1RdKoZbuEMalJJSYw3pHQ==",
3081 "dev": true,
3082 "dependencies": {
2788 - "@typescript-eslint/types": "8.7.0",
2789 - "@typescript-eslint/visitor-keys": "8.7.0"
3083 + "@typescript-eslint/types": "8.9.0",
3084 + "@typescript-eslint/visitor-keys": "8.9.0"
3085 },
3086 "engines": {
3087 "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -2797,13 +3092,13 @@
3092 }
3093 },
3094 "node_modules/@typescript-eslint/type-utils": {
2800 - "version": "8.7.0",
2801 - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.7.0.tgz",
2802 - "integrity": "sha512-tl0N0Mj3hMSkEYhLkjREp54OSb/FI6qyCzfiiclvJvOqre6hsZTGSnHtmFLDU8TIM62G7ygEa1bI08lcuRwEnQ==",
3095 + "version": "8.9.0",
3096 + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.9.0.tgz",
3097 + "integrity": "sha512-JD+/pCqlKqAk5961vxCluK+clkppHY07IbV3vett97KOV+8C6l+CPEPwpUuiMwgbOz/qrN3Ke4zzjqbT+ls+1Q==",
3098 "dev": true,
3099 "dependencies": {
2805 - "@typescript-eslint/typescript-estree": "8.7.0",
2806 - "@typescript-eslint/utils": "8.7.0",
3100 + "@typescript-eslint/typescript-estree": "8.9.0",
3101 + "@typescript-eslint/utils": "8.9.0",
3102 "debug": "^4.3.4",
3103 "ts-api-utils": "^1.3.0"
3104 },
@@ -2821,9 +3116,9 @@
3116 }
3117 },
3118 "node_modules/@typescript-eslint/types": {
2824 - "version": "8.7.0",
2825 - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.7.0.tgz",
2826 - "integrity": "sha512-LLt4BLHFwSfASHSF2K29SZ+ZCsbQOM+LuarPjRUuHm+Qd09hSe3GCeaQbcCr+Mik+0QFRmep/FyZBO6fJ64U3w==",
3119 + "version": "8.9.0",
3120 + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.9.0.tgz",
3121 + "integrity": "sha512-SjgkvdYyt1FAPhU9c6FiYCXrldwYYlIQLkuc+LfAhCna6ggp96ACncdtlbn8FmnG72tUkXclrDExOpEYf1nfJQ==",
3122 "dev": true,
3123 "engines": {
3124 "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -2834,13 +3129,13 @@
3129 }
3130 },
3131 "node_modules/@typescript-eslint/typescript-estree": {
2837 - "version": "8.7.0",
2838 - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.7.0.tgz",
2839 - "integrity": "sha512-MC8nmcGHsmfAKxwnluTQpNqceniT8SteVwd2voYlmiSWGOtjvGXdPl17dYu2797GVscK30Z04WRM28CrKS9WOg==",
3132 + "version": "8.9.0",
3133 + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.9.0.tgz",
3134 + "integrity": "sha512-9iJYTgKLDG6+iqegehc5+EqE6sqaee7kb8vWpmHZ86EqwDjmlqNNHeqDVqb9duh+BY6WCNHfIGvuVU3Tf9Db0g==",
3135 "dev": true,
3136 "dependencies": {
2842 - "@typescript-eslint/types": "8.7.0",
2843 - "@typescript-eslint/visitor-keys": "8.7.0",
3137 + "@typescript-eslint/types": "8.9.0",
3138 + "@typescript-eslint/visitor-keys": "8.9.0",
3139 "debug": "^4.3.4",
3140 "fast-glob": "^3.3.2",
3141 "is-glob": "^4.0.3",
@@ -2862,15 +3157,15 @@
3157 }
3158 },
3159 "node_modules/@typescript-eslint/utils": {
2865 - "version": "8.7.0",
2866 - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.7.0.tgz",
2867 - "integrity": "sha512-ZbdUdwsl2X/s3CiyAu3gOlfQzpbuG3nTWKPoIvAu1pu5r8viiJvv2NPN2AqArL35NCYtw/lrPPfM4gxrMLNLPw==",
3160 + "version": "8.9.0",
3161 + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.9.0.tgz",
3162 + "integrity": "sha512-PKgMmaSo/Yg/F7kIZvrgrWa1+Vwn036CdNUvYFEkYbPwOH4i8xvkaRlu148W3vtheWK9ckKRIz7PBP5oUlkrvQ==",
3163 "dev": true,
3164 "dependencies": {
3165 "@eslint-community/eslint-utils": "^4.4.0",
2871 - "@typescript-eslint/scope-manager": "8.7.0",
2872 - "@typescript-eslint/types": "8.7.0",
2873 - "@typescript-eslint/typescript-estree": "8.7.0"
3166 + "@typescript-eslint/scope-manager": "8.9.0",
3167 + "@typescript-eslint/types": "8.9.0",
3168 + "@typescript-eslint/typescript-estree": "8.9.0"
3169 },
3170 "engines": {
3171 "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@@ -2884,12 +3179,12 @@
3179 }
3180 },
3181 "node_modules/@typescript-eslint/visitor-keys": {
2887 - "version": "8.7.0",
2888 - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.7.0.tgz",
2889 - "integrity": "sha512-b1tx0orFCCh/THWPQa2ZwWzvOeyzzp36vkJYOpVg0u8UVOIsfVrnuC9FqAw9gRKn+rG2VmWQ/zDJZzkxUnj/XQ==",
3182 + "version": "8.9.0",
3183 + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.9.0.tgz",
3184 + "integrity": "sha512-Ht4y38ubk4L5/U8xKUBfKNYGmvKvA1CANoxiTRMM+tOLk3lbF3DvzZCxJCRSE+2GdCMSh6zq9VZJc3asc1XuAA==",
3185 "dev": true,
3186 "dependencies": {
2892 - "@typescript-eslint/types": "8.7.0",
3187 + "@typescript-eslint/types": "8.9.0",
3188 "eslint-visitor-keys": "^3.4.3"
3189 },
3190 "engines": {
@@ -3127,6 +3422,12 @@
3422 "url": "https://github.com/chalk/ansi-styles?sponsor=1"
3423 }
3424 },
3425 + "node_modules/@unocss/eslint-plugin/node_modules/argparse": {
3426 + "version": "2.0.1",
3427 + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
3428 + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
3429 + "peer": true
3430 + },
3431 "node_modules/@unocss/eslint-plugin/node_modules/chalk": {
3432 "version": "4.1.2",
3433 "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
@@ -3165,6 +3466,7 @@
3466 "version": "8.57.1",
3467 "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz",
3468 "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==",
3469 + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.",
3470 "peer": true,
3471 "dependencies": {
3472 "@eslint-community/eslint-utils": "^4.2.0",
@@ -3351,6 +3653,18 @@
3653 "node": ">=8"
3654 }
3655 },
3656 + "node_modules/@unocss/eslint-plugin/node_modules/js-yaml": {
3657 + "version": "4.1.0",
3658 + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
3659 + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
3660 + "peer": true,
3661 + "dependencies": {
3662 + "argparse": "^2.0.1"
3663 + },
3664 + "bin": {
3665 + "js-yaml": "bin/js-yaml.js"
3666 + }
3667 + },
3668 "node_modules/@unocss/eslint-plugin/node_modules/minimatch": {
3669 "version": "9.0.3",
3670 "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz",
@@ -3429,9 +3743,9 @@
3743 }
3744 },
3745 "node_modules/@vitest/eslint-plugin": {
3432 - "version": "1.1.4",
3433 - "resolved": "https://registry.npmjs.org/@vitest/eslint-plugin/-/eslint-plugin-1.1.4.tgz",
3434 - "integrity": "sha512-kudjgefmJJ7xQ2WfbUU6pZbm7Ou4gLYRaao/8Ynide3G0QhVKHd978sDyWX4KOH0CCMH9cyrGAkFd55eGzJ48Q==",
3746 + "version": "1.1.7",
3747 + "resolved": "https://registry.npmjs.org/@vitest/eslint-plugin/-/eslint-plugin-1.1.7.tgz",
3748 + "integrity": "sha512-pTWGW3y6lH2ukCuuffpan6kFxG6nIuoesbhMiQxskyQMRcCN5t9SXsKrNHvEw3p8wcCsgJoRqFZVkOTn6TjclA==",
3749 "dev": true,
3750 "peerDependencies": {
3751 "@typescript-eslint/utils": ">= 8.0",
@@ -3440,9 +3754,6 @@
3754 "vitest": "*"
3755 },
3756 "peerDependenciesMeta": {
3443 - "@typescript-eslint/utils": {
3444 - "optional": true
3445 - },
3757 "typescript": {
3758 "optional": true
3759 },
@@ -3452,13 +3763,13 @@
3763 }
3764 },
3765 "node_modules/@vitest/expect": {
3455 - "version": "2.1.1",
3456 - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.1.1.tgz",
3457 - "integrity": "sha512-YeueunS0HiHiQxk+KEOnq/QMzlUuOzbU1Go+PgAsHvvv3tUkJPm9xWt+6ITNTlzsMXUjmgm5T+U7KBPK2qQV6w==",
3766 + "version": "2.1.3",
3767 + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.1.3.tgz",
3768 + "integrity": "sha512-SNBoPubeCJhZ48agjXruCI57DvxcsivVDdWz+SSsmjTT4QN/DfHk3zB/xKsJqMs26bLZ/pNRLnCf0j679i0uWQ==",
3769 "dev": true,
3770 "dependencies": {
3460 - "@vitest/spy": "2.1.1",
3461 - "@vitest/utils": "2.1.1",
3771 + "@vitest/spy": "2.1.3",
3772 + "@vitest/utils": "2.1.3",
3773 "chai": "^5.1.1",
3774 "tinyrainbow": "^1.2.0"
3775 },
@@ -3467,12 +3778,12 @@
3778 }
3779 },
3780 "node_modules/@vitest/mocker": {
3470 - "version": "2.1.1",
3471 - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-2.1.1.tgz",
3472 - "integrity": "sha512-LNN5VwOEdJqCmJ/2XJBywB11DLlkbY0ooDJW3uRX5cZyYCrc4PI/ePX0iQhE3BiEGiQmK4GE7Q/PqCkkaiPnrA==",
3781 + "version": "2.1.3",
3782 + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-2.1.3.tgz",
3783 + "integrity": "sha512-eSpdY/eJDuOvuTA3ASzCjdithHa+GIF1L4PqtEELl6Qa3XafdMLBpBlZCIUCX2J+Q6sNmjmxtosAG62fK4BlqQ==",
3784 "dev": true,
3785 "dependencies": {
3475 - "@vitest/spy": "^2.1.0-beta.1",
3786 + "@vitest/spy": "2.1.3",
3787 "estree-walker": "^3.0.3",
3788 "magic-string": "^0.30.11"
3789 },
@@ -3480,7 +3791,7 @@
3791 "url": "https://opencollective.com/vitest"
3792 },
3793 "peerDependencies": {
3483 - "@vitest/spy": "2.1.1",
3794 + "@vitest/spy": "2.1.3",
3795 "msw": "^2.3.5",
3796 "vite": "^5.0.0"
3797 },
@@ -3503,9 +3814,9 @@
3814 }
3815 },
3816 "node_modules/@vitest/pretty-format": {
3506 - "version": "2.1.1",
3507 - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.1.1.tgz",
3508 - "integrity": "sha512-SjxPFOtuINDUW8/UkElJYQSFtnWX7tMksSGW0vfjxMneFqxVr8YJ979QpMbDW7g+BIiq88RAGDjf7en6rvLPPQ==",
3817 + "version": "2.1.3",
3818 + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.1.3.tgz",
3819 + "integrity": "sha512-XH1XdtoLZCpqV59KRbPrIhFCOO0hErxrQCMcvnQete3Vibb9UeIOX02uFPfVn3Z9ZXsq78etlfyhnkmIZSzIwQ==",
3820 "dev": true,
3821 "dependencies": {
3822 "tinyrainbow": "^1.2.0"
@@ -3515,12 +3826,12 @@
3826 }
3827 },
3828 "node_modules/@vitest/runner": {
3518 - "version": "2.1.1",
3519 - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-2.1.1.tgz",
3520 - "integrity": "sha512-uTPuY6PWOYitIkLPidaY5L3t0JJITdGTSwBtwMjKzo5O6RCOEncz9PUN+0pDidX8kTHYjO0EwUIvhlGpnGpxmA==",
3829 + "version": "2.1.3",
3830 + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-2.1.3.tgz",
3831 + "integrity": "sha512-JGzpWqmFJ4fq5ZKHtVO3Xuy1iF2rHGV4d/pdzgkYHm1+gOzNZtqjvyiaDGJytRyMU54qkxpNzCx+PErzJ1/JqQ==",
3832 "dev": true,
3833 "dependencies": {
3523 - "@vitest/utils": "2.1.1",
3834 + "@vitest/utils": "2.1.3",
3835 "pathe": "^1.1.2"
3836 },
3837 "funding": {
@@ -3528,12 +3839,12 @@
3839 }
3840 },
3841 "node_modules/@vitest/snapshot": {
3531 - "version": "2.1.1",
3532 - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.1.1.tgz",
3533 - "integrity": "sha512-BnSku1WFy7r4mm96ha2FzN99AZJgpZOWrAhtQfoxjUU5YMRpq1zmHRq7a5K9/NjqonebO7iVDla+VvZS8BOWMw==",
3842 + "version": "2.1.3",
3843 + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.1.3.tgz",
3844 + "integrity": "sha512-qWC2mWc7VAXmjAkEKxrScWHWFyCQx/cmiZtuGqMi+WwqQJ2iURsVY4ZfAK6dVo6K2smKRU6l3BPwqEBvhnpQGg==",
3845 "dev": true,
3846 "dependencies": {
3536 - "@vitest/pretty-format": "2.1.1",
3847 + "@vitest/pretty-format": "2.1.3",
3848 "magic-string": "^0.30.11",
3849 "pathe": "^1.1.2"
3850 },
@@ -3542,9 +3853,9 @@
3853 }
3854 },
3855 "node_modules/@vitest/spy": {
3545 - "version": "2.1.1",
3546 - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.1.1.tgz",
3547 - "integrity": "sha512-ZM39BnZ9t/xZ/nF4UwRH5il0Sw93QnZXd9NAZGRpIgj0yvVwPpLd702s/Cx955rGaMlyBQkZJ2Ir7qyY48VZ+g==",
3856 + "version": "2.1.3",
3857 + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.1.3.tgz",
3858 + "integrity": "sha512-Nb2UzbcUswzeSP7JksMDaqsI43Sj5+Kry6ry6jQJT4b5gAK+NS9NED6mDb8FlMRCX8m5guaHCDZmqYMMWRy5nQ==",
3859 "dev": true,
3860 "dependencies": {
3861 "tinyspy": "^3.0.0"
@@ -3554,12 +3865,12 @@
3865 }
3866 },
3867 "node_modules/@vitest/utils": {
3557 - "version": "2.1.1",
3558 - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.1.1.tgz",
3559 - "integrity": "sha512-Y6Q9TsI+qJ2CC0ZKj6VBb+T8UPz593N113nnUykqwANqhgf3QkZeHFlusgKLTqrnVHbj/XDKZcDHol+dxVT+rQ==",
3868 + "version": "2.1.3",
3869 + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.1.3.tgz",
3870 + "integrity": "sha512-xpiVfDSg1RrYT0tX6czgerkpcKFmFOF/gCr30+Mve5V2kewCy4Prn1/NDMSRwaSmT7PRaOF83wu+bEtsY1wrvA==",
3871 "dev": true,
3872 "dependencies": {
3562 - "@vitest/pretty-format": "2.1.1",
3873 + "@vitest/pretty-format": "2.1.3",
3874 "loupe": "^3.1.1",
3875 "tinyrainbow": "^1.2.0"
3876 },
@@ -3568,27 +3879,27 @@
3879 }
3880 },
3881 "node_modules/@volar/language-core": {
3571 - "version": "2.4.5",
3572 - "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.5.tgz",
3573 - "integrity": "sha512-F4tA0DCO5Q1F5mScHmca0umsi2ufKULAnMOVBfMsZdT4myhVl4WdKRwCaKcfOkIEuyrAVvtq1ESBdZ+rSyLVww==",
3882 + "version": "2.4.6",
3883 + "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.6.tgz",
3884 + "integrity": "sha512-FxUfxaB8sCqvY46YjyAAV6c3mMIq/NWQMVvJ+uS4yxr1KzOvyg61gAuOnNvgCvO4TZ7HcLExBEsWcDu4+K4E8A==",
3885 "dev": true,
3886 "dependencies": {
3576 - "@volar/source-map": "2.4.5"
3887 + "@volar/source-map": "2.4.6"
3888 }
3889 },
3890 "node_modules/@volar/source-map": {
3580 - "version": "2.4.5",
3581 - "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.5.tgz",
3582 - "integrity": "sha512-varwD7RaKE2J/Z+Zu6j3mNNJbNT394qIxXwdvz/4ao/vxOfyClZpSDtLKkwWmecinkOVos5+PWkWraelfMLfpw==",
3891 + "version": "2.4.6",
3892 + "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.6.tgz",
3893 + "integrity": "sha512-Nsh7UW2ruK+uURIPzjJgF0YRGP5CX9nQHypA2OMqdM2FKy7rh+uv3XgPnWPw30JADbKvZ5HuBzG4gSbVDYVtiw==",
3894 "dev": true
3895 },
3896 "node_modules/@volar/typescript": {
3586 - "version": "2.4.5",
3587 - "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.5.tgz",
3588 - "integrity": "sha512-mcT1mHvLljAEtHviVcBuOyAwwMKz1ibXTi5uYtP/pf4XxoAzpdkQ+Br2IC0NPCvLCbjPZmbf3I0udndkfB1CDg==",
3897 + "version": "2.4.6",
3898 + "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.6.tgz",
3899 + "integrity": "sha512-NMIrA7y5OOqddL9VtngPWYmdQU03htNKFtAYidbYfWA0TOhyGVd9tfcP4TsLWQ+RBWDZCbBqsr8xzU0ZOxYTCQ==",
3900 "dev": true,
3901 "dependencies": {
3591 - "@volar/language-core": "2.4.5",
3902 + "@volar/language-core": "2.4.6",
3903 "path-browserify": "^1.0.1",
3904 "vscode-uri": "^3.0.8"
3905 }
@@ -3642,36 +3953,36 @@
3953 }
3954 },
3955 "node_modules/@vue/compiler-core": {
3645 - "version": "3.5.10",
3646 - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.10.tgz",
3647 - "integrity": "sha512-iXWlk+Cg/ag7gLvY0SfVucU8Kh2CjysYZjhhP70w9qI4MvSox4frrP+vDGvtQuzIcgD8+sxM6lZvCtdxGunTAA==",
3956 + "version": "3.5.12",
3957 + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.12.tgz",
3958 + "integrity": "sha512-ISyBTRMmMYagUxhcpyEH0hpXRd/KqDU4ymofPgl2XAkY9ZhQ+h0ovEZJIiPop13UmR/54oA2cgMDjgroRelaEw==",
3959 "dependencies": {
3960 "@babel/parser": "^7.25.3",
3650 - "@vue/shared": "3.5.10",
3961 + "@vue/shared": "3.5.12",
3962 "entities": "^4.5.0",
3963 "estree-walker": "^2.0.2",
3964 "source-map-js": "^1.2.0"
3965 }
3966 },
3967 "node_modules/@vue/compiler-dom": {
3657 - "version": "3.5.10",
3658 - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.10.tgz",
3659 - "integrity": "sha512-DyxHC6qPcktwYGKOIy3XqnHRrrXyWR2u91AjP+nLkADko380srsC2DC3s7Y1Rk6YfOlxOlvEQKa9XXmLI+W4ZA==",
3968 + "version": "3.5.12",
3969 + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.12.tgz",
3970 + "integrity": "sha512-9G6PbJ03uwxLHKQ3P42cMTi85lDRvGLB2rSGOiQqtXELat6uI4n8cNz9yjfVHRPIu+MsK6TE418Giruvgptckg==",
3971 "dependencies": {
3661 - "@vue/compiler-core": "3.5.10",
3662 - "@vue/shared": "3.5.10"
3972 + "@vue/compiler-core": "3.5.12",
3973 + "@vue/shared": "3.5.12"
3974 }
3975 },
3976 "node_modules/@vue/compiler-sfc": {
3666 - "version": "3.5.10",
3667 - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.10.tgz",
3668 - "integrity": "sha512-to8E1BgpakV7224ZCm8gz1ZRSyjNCAWEplwFMWKlzCdP9DkMKhRRwt0WkCjY7jkzi/Vz3xgbpeig5Pnbly4Tow==",
3977 + "version": "3.5.12",
3978 + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.12.tgz",
3979 + "integrity": "sha512-2k973OGo2JuAa5+ZlekuQJtitI5CgLMOwgl94BzMCsKZCX/xiqzJYzapl4opFogKHqwJk34vfsaKpfEhd1k5nw==",
3980 "dependencies": {
3981 "@babel/parser": "^7.25.3",
3671 - "@vue/compiler-core": "3.5.10",
3672 - "@vue/compiler-dom": "3.5.10",
3673 - "@vue/compiler-ssr": "3.5.10",
3674 - "@vue/shared": "3.5.10",
3982 + "@vue/compiler-core": "3.5.12",
3983 + "@vue/compiler-dom": "3.5.12",
3984 + "@vue/compiler-ssr": "3.5.12",
3985 + "@vue/shared": "3.5.12",
3986 "estree-walker": "^2.0.2",
3987 "magic-string": "^0.30.11",
3988 "postcss": "^8.4.47",
@@ -3679,12 +3990,12 @@
3990 }
3991 },
3992 "node_modules/@vue/compiler-ssr": {
3682 - "version": "3.5.10",
3683 - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.10.tgz",
3684 - "integrity": "sha512-hxP4Y3KImqdtyUKXDRSxKSRkSm1H9fCvhojEYrnaoWhE4w/y8vwWhnosJoPPe2AXm5sU7CSbYYAgkt2ZPhDz+A==",
3993 + "version": "3.5.12",
3994 + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.12.tgz",
3995 + "integrity": "sha512-eLwc7v6bfGBSM7wZOGPmRavSWzNFF6+PdRhE+VFJhNCgHiF8AM7ccoqcv5kBXA2eWUfigD7byekvf/JsOfKvPA==",
3996 "dependencies": {
3686 - "@vue/compiler-dom": "3.5.10",
3687 - "@vue/shared": "3.5.10"
3997 + "@vue/compiler-dom": "3.5.12",
3998 + "@vue/shared": "3.5.12"
3999 }
4000 },
4001 "node_modules/@vue/compiler-vue2": {
@@ -3719,6 +4030,24 @@
4030 "vue": "^3.0.0"
4031 }
4032 },
4033 + "node_modules/@vue/devtools-core/node_modules/nanoid": {
4034 + "version": "3.3.7",
4035 + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz",
4036 + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==",
4037 + "dev": true,
4038 + "funding": [
4039 + {
4040 + "type": "github",
4041 + "url": "https://github.com/sponsors/ai"
4042 + }
4043 + ],
4044 + "bin": {
4045 + "nanoid": "bin/nanoid.cjs"
4046 + },
4047 + "engines": {
4048 + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
4049 + }
4050 + },
4051 "node_modules/@vue/devtools-kit": {
4052 "version": "7.4.6",
4053 "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-7.4.6.tgz",
@@ -3768,49 +4097,49 @@
4097 }
4098 },
4099 "node_modules/@vue/reactivity": {
3771 - "version": "3.5.10",
3772 - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.10.tgz",
3773 - "integrity": "sha512-kW08v06F6xPSHhid9DJ9YjOGmwNDOsJJQk0ax21wKaUYzzuJGEuoKNU2Ujux8FLMrP7CFJJKsHhXN9l2WOVi2g==",
4100 + "version": "3.5.12",
4101 + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.12.tgz",
4102 + "integrity": "sha512-UzaN3Da7xnJXdz4Okb/BGbAaomRHc3RdoWqTzlvd9+WBR5m3J39J1fGcHes7U3za0ruYn/iYy/a1euhMEHvTAg==",
4103 "dependencies": {
3775 - "@vue/shared": "3.5.10"
4104 + "@vue/shared": "3.5.12"
4105 }
4106 },
4107 "node_modules/@vue/runtime-core": {
3779 - "version": "3.5.10",
3780 - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.10.tgz",
3781 - "integrity": "sha512-9Q86I5Qq3swSkFfzrZ+iqEy7Vla325M7S7xc1NwKnRm/qoi1Dauz0rT6mTMmscqx4qz0EDJ1wjB+A36k7rl8mA==",
4108 + "version": "3.5.12",
4109 + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.12.tgz",
4110 + "integrity": "sha512-hrMUYV6tpocr3TL3Ad8DqxOdpDe4zuQY4HPY3X/VRh+L2myQO8MFXPAMarIOSGNu0bFAjh1yBkMPXZBqCk62Uw==",
4111 "dependencies": {
3783 - "@vue/reactivity": "3.5.10",
3784 - "@vue/shared": "3.5.10"
4112 + "@vue/reactivity": "3.5.12",
4113 + "@vue/shared": "3.5.12"
4114 }
4115 },
4116 "node_modules/@vue/runtime-dom": {
3788 - "version": "3.5.10",
3789 - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.10.tgz",
3790 - "integrity": "sha512-t3x7ht5qF8ZRi1H4fZqFzyY2j+GTMTDxRheT+i8M9Ph0oepUxoadmbwlFwMoW7RYCpNQLpP2Yx3feKs+fyBdpA==",
4117 + "version": "3.5.12",
4118 + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.12.tgz",
4119 + "integrity": "sha512-q8VFxR9A2MRfBr6/55Q3umyoN7ya836FzRXajPB6/Vvuv0zOPL+qltd9rIMzG/DbRLAIlREmnLsplEF/kotXKA==",
4120 "dependencies": {
3792 - "@vue/reactivity": "3.5.10",
3793 - "@vue/runtime-core": "3.5.10",
3794 - "@vue/shared": "3.5.10",
4121 + "@vue/reactivity": "3.5.12",
4122 + "@vue/runtime-core": "3.5.12",
4123 + "@vue/shared": "3.5.12",
4124 "csstype": "^3.1.3"
4125 }
4126 },
4127 "node_modules/@vue/server-renderer": {
3799 - "version": "3.5.10",
3800 - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.10.tgz",
3801 - "integrity": "sha512-IVE97tt2kGKwHNq9yVO0xdh1IvYfZCShvDSy46JIh5OQxP1/EXSpoDqetVmyIzL7CYOWnnmMkVqd7YK2QSWkdw==",
4128 + "version": "3.5.12",
4129 + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.12.tgz",
4130 + "integrity": "sha512-I3QoeDDeEPZm8yR28JtY+rk880Oqmj43hreIBVTicisFTx/Dl7JpG72g/X7YF8hnQD3IFhkky5i2bPonwrTVPg==",
4131 "dependencies": {
3803 - "@vue/compiler-ssr": "3.5.10",
3804 - "@vue/shared": "3.5.10"
4132 + "@vue/compiler-ssr": "3.5.12",
4133 + "@vue/shared": "3.5.12"
4134 },
4135 "peerDependencies": {
3807 - "vue": "3.5.10"
4136 + "vue": "3.5.12"
4137 }
4138 },
4139 "node_modules/@vue/shared": {
3811 - "version": "3.5.10",
3812 - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.10.tgz",
3813 - "integrity": "sha512-VkkBhU97Ki+XJ0xvl4C9YJsIZ2uIlQ7HqPpZOS3m9VCvmROPaChZU6DexdMJqvz9tbgG+4EtFVrSuailUq5KGQ=="
4140 + "version": "3.5.12",
4141 + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.12.tgz",
4142 + "integrity": "sha512-L2RPSAwUFbgZH20etwrXyVyCBu9OxRSi8T/38QsvnkJyvq2LufW2lDCOzm7t/U9C1mkhJGWYfCuFBCmIuNivrg=="
4143 },
4144 "node_modules/@vue/test-utils": {
4145 "version": "2.4.6",
@@ -3828,41 +4157,6 @@
4157 "integrity": "sha512-VcZK7MvpjuTPx2w6blwnwZAu5/LgBUtejFOi3pPGQFXQN5Ela03FUtd2Qtg4yWGGissVL0dr6Ro1LfOFh+PCuQ==",
4158 "dev": true
4159 },
3831 - "node_modules/@vueuse/components": {
3832 - "version": "11.1.0",
3833 - "resolved": "https://registry.npmjs.org/@vueuse/components/-/components-11.1.0.tgz",
3834 - "integrity": "sha512-8CTbvH1rHfAlqsMdMg6G2OiIvHiHn8HRx0yyJ+Ri/C8J6cLylXAd7VESawoCAkRdAXT4ucPnj/uYHZqEb0JbBQ==",
3835 - "dependencies": {
3836 - "@vueuse/core": "11.1.0",
3837 - "@vueuse/shared": "11.1.0",
3838 - "vue-demi": ">=0.14.10"
3839 - }
3840 - },
3841 - "node_modules/@vueuse/components/node_modules/vue-demi": {
3842 - "version": "0.14.10",
3843 - "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.10.tgz",
3844 - "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==",
3845 - "hasInstallScript": true,
3846 - "bin": {
3847 - "vue-demi-fix": "bin/vue-demi-fix.js",
3848 - "vue-demi-switch": "bin/vue-demi-switch.js"
3849 - },
3850 - "engines": {
3851 - "node": ">=12"
3852 - },
3853 - "funding": {
3854 - "url": "https://github.com/sponsors/antfu"
3855 - },
3856 - "peerDependencies": {
3857 - "@vue/composition-api": "^1.0.0-rc.1",
3858 - "vue": "^3.0.0-0 || ^2.6.0"
3859 - },
3860 - "peerDependenciesMeta": {
3861 - "@vue/composition-api": {
3862 - "optional": true
3863 - }
3864 - }
3865 - },
4160 "node_modules/@vueuse/core": {
4161 "version": "11.1.0",
4162 "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-11.1.0.tgz",
@@ -3949,7 +4243,8 @@
4243 "node_modules/@yr/monotone-cubic-spline": {
4244 "version": "1.0.3",
4245 "resolved": "https://registry.npmjs.org/@yr/monotone-cubic-spline/-/monotone-cubic-spline-1.0.3.tgz",
3952 - "integrity": "sha512-FQXkOta0XBSUPHndIKON2Y9JeQz5ZeMqLYZVVK93FliNBFm7LNMIZmY6FrMEB9XPcDbE2bekMbZD6kzDkxwYjA=="
4246 + "integrity": "sha512-FQXkOta0XBSUPHndIKON2Y9JeQz5ZeMqLYZVVK93FliNBFm7LNMIZmY6FrMEB9XPcDbE2bekMbZD6kzDkxwYjA==",
4247 + "peer": true
4248 },
4249 "node_modules/abbrev": {
4250 "version": "2.0.0",
@@ -4117,9 +4412,10 @@
4412 }
4413 },
4414 "node_modules/apexcharts": {
4120 - "version": "3.54.0",
4121 - "resolved": "https://registry.npmjs.org/apexcharts/-/apexcharts-3.54.0.tgz",
4122 - "integrity": "sha512-ZgI/seScffjLpwNRX/gAhIkAhpCNWiTNsdICv7qxnF0xisI23XSsaENUKIcMlyP1rbe8ECgvybDnp7plZld89A==",
4415 + "version": "3.54.1",
4416 + "resolved": "https://registry.npmjs.org/apexcharts/-/apexcharts-3.54.1.tgz",
4417 + "integrity": "sha512-E4et0h/J1U3r3EwS/WlqJCQIbepKbp6wGUmaAwJOMjHUP4Ci0gxanLa7FR3okx6p9coi4st6J853/Cb1NP0vpA==",
4418 + "peer": true,
4419 "dependencies": {
4420 "@yr/monotone-cubic-spline": "^1.0.3",
4421 "svg.draggable.js": "^2.2.2",
@@ -4166,9 +4462,22 @@
4462 "dev": true
4463 },
4464 "node_modules/argparse": {
4169 - "version": "2.0.1",
4170 - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
4171 - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="
4465 + "version": "1.0.10",
4466 + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
4467 + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
4468 + "dev": true,
4469 + "dependencies": {
4470 + "sprintf-js": "~1.0.2"
4471 + }
4472 + },
4473 + "node_modules/array-differ": {
4474 + "version": "3.0.0",
4475 + "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-3.0.0.tgz",
4476 + "integrity": "sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==",
4477 + "dev": true,
4478 + "engines": {
4479 + "node": ">=8"
4480 + }
4481 },
4482 "node_modules/array-union": {
4483 "version": "2.1.0",
@@ -4178,6 +4487,15 @@
4487 "node": ">=8"
4488 }
4489 },
4490 + "node_modules/arrify": {
4491 + "version": "2.0.1",
4492 + "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz",
4493 + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==",
4494 + "dev": true,
4495 + "engines": {
4496 + "node": ">=8"
4497 + }
4498 + },
4499 "node_modules/asn1": {
4500 "version": "0.2.6",
4501 "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz",
@@ -4347,9 +4665,9 @@
4665 }
4666 },
4667 "node_modules/birpc": {
4350 - "version": "0.2.17",
4351 - "resolved": "https://registry.npmjs.org/birpc/-/birpc-0.2.17.tgz",
4352 - "integrity": "sha512-+hkTxhot+dWsLpp3gia5AkVHIsKlZybNT5gIYiDlNzJrmYPcTM9k5/w2uaj3IPpd7LlEYpmCj4Jj1nC41VhDFg==",
4668 + "version": "0.2.19",
4669 + "resolved": "https://registry.npmjs.org/birpc/-/birpc-0.2.19.tgz",
4670 + "integrity": "sha512-5WeXXAvTmitV1RqJFppT5QtUiz2p1mRSYU000Jkft5ZUCLJIk4uQriYNO50HknxKwM6jd8utNc66K1qGIwwWBQ==",
4671 "dev": true,
4672 "funding": {
4673 "url": "https://github.com/sponsors/antfu"
@@ -4582,6 +4900,15 @@
4900 "url": "https://github.com/sponsors/ljharb"
4901 }
4902 },
4903 + "node_modules/callsite": {
4904 + "version": "1.0.0",
4905 + "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz",
4906 + "integrity": "sha512-0vdNRFXn5q+dtOqjfFtmtlI9N2eVZ7LMyEV2iKC5mEEFvSg/69Ml6b/WU2qF8W1nLRa0wiSrDT3Y5jOHZCwKPQ==",
4907 + "dev": true,
4908 + "engines": {
4909 + "node": "*"
4910 + }
4911 + },
4912 "node_modules/callsites": {
4913 "version": "3.1.0",
4914 "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
@@ -4590,6 +4917,18 @@
4917 "node": ">=6"
4918 }
4919 },
4920 + "node_modules/camelcase": {
4921 + "version": "6.3.0",
4922 + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
4923 + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
4924 + "dev": true,
4925 + "engines": {
4926 + "node": ">=10"
4927 + },
4928 + "funding": {
4929 + "url": "https://github.com/sponsors/sindresorhus"
4930 + }
4931 + },
4932 "node_modules/camelcase-css": {
4933 "version": "2.0.1",
4934 "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz",
@@ -4600,9 +4939,9 @@
4939 }
4940 },
4941 "node_modules/caniuse-lite": {
4603 - "version": "1.0.30001664",
4604 - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001664.tgz",
4605 - "integrity": "sha512-AmE7k4dXiNKQipgn7a2xg558IRqPN3jMQY/rOsbxDhrd0tyChwbITBfiwtnqz8bi2M5mIWbxAYBvk7W7QBUS2g==",
4942 + "version": "1.0.30001668",
4943 + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001668.tgz",
4944 + "integrity": "sha512-nWLrdxqCdblixUO+27JtGJJE/txpJlyUy5YN1u53wLZkP0emYCo5zgS6QYft7VUYR42LGgi/S5hdLZTrnyIddw==",
4945 "funding": [
4946 {
4947 "type": "opencollective",
@@ -5021,9 +5360,9 @@
5360 "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="
5361 },
5362 "node_modules/confbox": {
5024 - "version": "0.1.7",
5025 - "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.7.tgz",
5026 - "integrity": "sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA=="
5363 + "version": "0.1.8",
5364 + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz",
5365 + "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w=="
5366 },
5367 "node_modules/config-chain": {
5368 "version": "1.1.13",
@@ -5122,6 +5461,22 @@
5461 "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==",
5462 "dev": true
5463 },
5464 + "node_modules/cosmiconfig": {
5465 + "version": "7.1.0",
5466 + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz",
5467 + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==",
5468 + "dev": true,
5469 + "dependencies": {
5470 + "@types/parse-json": "^4.0.0",
5471 + "import-fresh": "^3.2.1",
5472 + "parse-json": "^5.0.0",
5473 + "path-type": "^4.0.0",
5474 + "yaml": "^1.10.0"
5475 + },
5476 + "engines": {
5477 + "node": ">=10"
5478 + }
5479 + },
5480 "node_modules/cross-spawn": {
5481 "version": "7.0.3",
5482 "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
@@ -5533,9 +5888,9 @@
5888 "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ=="
5889 },
5890 "node_modules/deep-pick-omit": {
5536 - "version": "1.2.0",
5537 - "resolved": "https://registry.npmjs.org/deep-pick-omit/-/deep-pick-omit-1.2.0.tgz",
5538 - "integrity": "sha512-2CGvfTM2c+IP/MhdRZMpaHhTc6zIlgz3tQXJ/VGAkc7mjMrjqSU28qiI63yEcy+fcYfd/K+NNJcGRzap4M4bqw=="
5891 + "version": "1.2.1",
5892 + "resolved": "https://registry.npmjs.org/deep-pick-omit/-/deep-pick-omit-1.2.1.tgz",
5893 + "integrity": "sha512-2J6Kc/m3irCeqVG42T+SaUMesaK7oGWaedGnQQK/+O0gYc+2SP5bKh/KKTE7d7SJ+GCA9UUE1GRzh6oDe0EnGw=="
5894 },
5895 "node_modules/default-browser": {
5896 "version": "5.2.1",
@@ -5610,6 +5965,146 @@
5965 "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==",
5966 "dev": true
5967 },
5968 + "node_modules/depcheck": {
5969 + "version": "1.4.7",
5970 + "resolved": "https://registry.npmjs.org/depcheck/-/depcheck-1.4.7.tgz",
5971 + "integrity": "sha512-1lklS/bV5chOxwNKA/2XUUk/hPORp8zihZsXflr8x0kLwmcZ9Y9BsS6Hs3ssvA+2wUVbG0U2Ciqvm1SokNjPkA==",
5972 + "dev": true,
5973 + "dependencies": {
5974 + "@babel/parser": "^7.23.0",
5975 + "@babel/traverse": "^7.23.2",
5976 + "@vue/compiler-sfc": "^3.3.4",
5977 + "callsite": "^1.0.0",
5978 + "camelcase": "^6.3.0",
5979 + "cosmiconfig": "^7.1.0",
5980 + "debug": "^4.3.4",
5981 + "deps-regex": "^0.2.0",
5982 + "findup-sync": "^5.0.0",
5983 + "ignore": "^5.2.4",
5984 + "is-core-module": "^2.12.0",
5985 + "js-yaml": "^3.14.1",
5986 + "json5": "^2.2.3",
5987 + "lodash": "^4.17.21",
5988 + "minimatch": "^7.4.6",
5989 + "multimatch": "^5.0.0",
5990 + "please-upgrade-node": "^3.2.0",
5991 + "readdirp": "^3.6.0",
5992 + "require-package-name": "^2.0.1",
5993 + "resolve": "^1.22.3",
5994 + "resolve-from": "^5.0.0",
5995 + "semver": "^7.5.4",
5996 + "yargs": "^16.2.0"
5997 + },
5998 + "bin": {
5999 + "depcheck": "bin/depcheck.js"
6000 + },
6001 + "engines": {
6002 + "node": ">=10"
6003 + }
6004 + },
6005 + "node_modules/depcheck/node_modules/ansi-styles": {
6006 + "version": "4.3.0",
6007 + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
6008 + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
6009 + "dev": true,
6010 + "dependencies": {
6011 + "color-convert": "^2.0.1"
6012 + },
6013 + "engines": {
6014 + "node": ">=8"
6015 + },
6016 + "funding": {
6017 + "url": "https://github.com/chalk/ansi-styles?sponsor=1"
6018 + }
6019 + },
6020 + "node_modules/depcheck/node_modules/cliui": {
6021 + "version": "7.0.4",
6022 + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
6023 + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==",
6024 + "dev": true,
6025 + "dependencies": {
6026 + "string-width": "^4.2.0",
6027 + "strip-ansi": "^6.0.0",
6028 + "wrap-ansi": "^7.0.0"
6029 + }
6030 + },
6031 + "node_modules/depcheck/node_modules/color-convert": {
6032 + "version": "2.0.1",
6033 + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
6034 + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
6035 + "dev": true,
6036 + "dependencies": {
6037 + "color-name": "~1.1.4"
6038 + },
6039 + "engines": {
6040 + "node": ">=7.0.0"
6041 + }
6042 + },
6043 + "node_modules/depcheck/node_modules/color-name": {
6044 + "version": "1.1.4",
6045 + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
6046 + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
6047 + "dev": true
6048 + },
6049 + "node_modules/depcheck/node_modules/minimatch": {
6050 + "version": "7.4.6",
6051 + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-7.4.6.tgz",
6052 + "integrity": "sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==",
6053 + "dev": true,
6054 + "dependencies": {
6055 + "brace-expansion": "^2.0.1"
6056 + },
6057 + "engines": {
6058 + "node": ">=10"
6059 + },
6060 + "funding": {
6061 + "url": "https://github.com/sponsors/isaacs"
6062 + }
6063 + },
6064 + "node_modules/depcheck/node_modules/wrap-ansi": {
6065 + "version": "7.0.0",
6066 + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
6067 + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
6068 + "dev": true,
6069 + "dependencies": {
6070 + "ansi-styles": "^4.0.0",
6071 + "string-width": "^4.1.0",
6072 + "strip-ansi": "^6.0.0"
6073 + },
6074 + "engines": {
6075 + "node": ">=10"
6076 + },
6077 + "funding": {
6078 + "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
6079 + }
6080 + },
6081 + "node_modules/depcheck/node_modules/yargs": {
6082 + "version": "16.2.0",
6083 + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
6084 + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
6085 + "dev": true,
6086 + "dependencies": {
6087 + "cliui": "^7.0.2",
6088 + "escalade": "^3.1.1",
6089 + "get-caller-file": "^2.0.5",
6090 + "require-directory": "^2.1.1",
6091 + "string-width": "^4.2.0",
6092 + "y18n": "^5.0.5",
6093 + "yargs-parser": "^20.2.2"
6094 + },
6095 + "engines": {
6096 + "node": ">=10"
6097 + }
6098 + },
6099 + "node_modules/depcheck/node_modules/yargs-parser": {
6100 + "version": "20.2.9",
6101 + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
6102 + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
6103 + "dev": true,
6104 + "engines": {
6105 + "node": ">=10"
6106 + }
6107 + },
6108 "node_modules/depd": {
6109 "version": "2.0.0",
6110 "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
@@ -5619,6 +6114,12 @@
6114 "node": ">= 0.8"
6115 }
6116 },
6117 + "node_modules/deps-regex": {
6118 + "version": "0.2.0",
6119 + "resolved": "https://registry.npmjs.org/deps-regex/-/deps-regex-0.2.0.tgz",
6120 + "integrity": "sha512-PwuBojGMQAYbWkMXOY9Pd/NWCDNHVH12pnS7WHqZkTSeMESe4hwnKKRp0yR87g37113x4JPbo/oIvXY+s/f56Q==",
6121 + "dev": true
6122 + },
6123 "node_modules/dequal": {
6124 "version": "2.0.3",
6125 "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz",
@@ -5642,6 +6143,27 @@
6143 "npm": "1.2.8000 || >= 1.4.16"
6144 }
6145 },
6146 + "node_modules/detect-file": {
6147 + "version": "1.0.0",
6148 + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz",
6149 + "integrity": "sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==",
6150 + "dev": true,
6151 + "engines": {
6152 + "node": ">=0.10.0"
6153 + }
6154 + },
6155 + "node_modules/detect-libc": {
6156 + "version": "1.0.3",
6157 + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz",
6158 + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==",
6159 + "dev": true,
6160 + "bin": {
6161 + "detect-libc": "bin/detect-libc.js"
6162 + },
6163 + "engines": {
6164 + "node": ">=0.10"
6165 + }
6166 + },
6167 "node_modules/detect-touch-device": {
6168 "version": "1.1.6",
6169 "resolved": "https://registry.npmjs.org/detect-touch-device/-/detect-touch-device-1.1.6.tgz",
@@ -5676,14 +6198,6 @@
6198 "node": ">=8"
6199 }
6200 },
5679 - "node_modules/dir-glob/node_modules/path-type": {
5680 - "version": "4.0.0",
5681 - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
5682 - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
5683 - "engines": {
5684 - "node": ">=8"
5685 - }
5686 - },
6201 "node_modules/dlv": {
6202 "version": "1.1.3",
6203 "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz",
@@ -5852,9 +6366,9 @@
6366 "dev": true
6367 },
6368 "node_modules/electron-to-chromium": {
5855 - "version": "1.5.29",
5856 - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.29.tgz",
5857 - "integrity": "sha512-PF8n2AlIhCKXQ+gTpiJi0VhcHDb69kYX4MtCiivctc2QD3XuNZ/XIOlbGzt7WAjjEev0TtaH6Cu3arZExm5DOw=="
6369 + "version": "1.5.38",
6370 + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.38.tgz",
6371 + "integrity": "sha512-VbeVexmZ1IFh+5EfrYz1I0HTzHVIlJa112UEWhciPyeOcKJGeTv6N8WnG4wsQB81DGCaVEGhpSb6o6a8WYFXXg=="
6372 },
6373 "node_modules/emoji-regex": {
6374 "version": "8.0.0",
@@ -6026,20 +6540,20 @@
6540 }
6541 },
6542 "node_modules/eslint": {
6029 - "version": "9.11.1",
6030 - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.11.1.tgz",
6031 - "integrity": "sha512-MobhYKIoAO1s1e4VUrgx1l1Sk2JBR/Gqjjgw8+mfgoLE2xwsHur4gdfTxyTgShrhvdVFTaJSgMiQBl1jv/AWxg==",
6543 + "version": "9.12.0",
6544 + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.12.0.tgz",
6545 + "integrity": "sha512-UVIOlTEWxwIopRL1wgSQYdnVDcEvs2wyaO6DGo5mXqe3r16IoCNWkR29iHhyaP4cICWjbgbmFUGAhh0GJRuGZw==",
6546 "dependencies": {
6547 "@eslint-community/eslint-utils": "^4.2.0",
6548 "@eslint-community/regexpp": "^4.11.0",
6549 "@eslint/config-array": "^0.18.0",
6550 "@eslint/core": "^0.6.0",
6551 "@eslint/eslintrc": "^3.1.0",
6038 - "@eslint/js": "9.11.1",
6552 + "@eslint/js": "9.12.0",
6553 "@eslint/plugin-kit": "^0.2.0",
6554 + "@humanfs/node": "^0.16.5",
6555 "@humanwhocodes/module-importer": "^1.0.1",
6041 - "@humanwhocodes/retry": "^0.3.0",
6042 - "@nodelib/fs.walk": "^1.2.8",
6556 + "@humanwhocodes/retry": "^0.3.1",
6557 "@types/estree": "^1.0.6",
6558 "@types/json-schema": "^7.0.15",
6559 "ajv": "^6.12.4",
@@ -6047,9 +6561,9 @@
6561 "cross-spawn": "^7.0.2",
6562 "debug": "^4.3.2",
6563 "escape-string-regexp": "^4.0.0",
6050 - "eslint-scope": "^8.0.2",
6051 - "eslint-visitor-keys": "^4.0.0",
6052 - "espree": "^10.1.0",
6564 + "eslint-scope": "^8.1.0",
6565 + "eslint-visitor-keys": "^4.1.0",
6566 + "espree": "^10.2.0",
6567 "esquery": "^1.5.0",
6568 "esutils": "^2.0.2",
6569 "fast-deep-equal": "^3.1.3",
@@ -6059,13 +6573,11 @@
6573 "ignore": "^5.2.0",
6574 "imurmurhash": "^0.1.4",
6575 "is-glob": "^4.0.0",
6062 - "is-path-inside": "^3.0.3",
6576 "json-stable-stringify-without-jsonify": "^1.0.1",
6577 "lodash.merge": "^4.6.2",
6578 "minimatch": "^3.1.2",
6579 "natural-compare": "^1.4.0",
6580 "optionator": "^0.9.3",
6068 - "strip-ansi": "^6.0.1",
6581 "text-table": "^0.2.0"
6582 },
6583 "bin": {
@@ -6274,12 +6786,12 @@
6786 "dev": true
6787 },
6788 "node_modules/eslint-plugin-jsdoc": {
6277 - "version": "50.3.0",
6278 - "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-50.3.0.tgz",
6279 - "integrity": "sha512-P7qDB/RckdKETpBM4CtjHRQ5qXByPmFhRi86sN3E+J+tySchq+RSOGGhI2hDIefmmKFuTi/1ACjqsnDJDDDfzg==",
6789 + "version": "50.4.1",
6790 + "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-50.4.1.tgz",
6791 + "integrity": "sha512-OXIq+JJQPCLAKL473/esioFOwbXyRE5MAQ4HbZjcp3e+K3zdxt2uDpGs3FR+WezUXNStzEtTfgx15T+JFrVwBA==",
6792 "dev": true,
6793 "dependencies": {
6282 - "@es-joy/jsdoccomment": "~0.48.0",
6794 + "@es-joy/jsdoccomment": "~0.49.0",
6795 "are-docs-informative": "^0.0.2",
6796 "comment-parser": "1.4.1",
6797 "debug": "^4.3.6",
@@ -6298,10 +6810,24 @@
6810 "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0"
6811 }
6812 },
6813 + "node_modules/eslint-plugin-jsdoc/node_modules/@es-joy/jsdoccomment": {
6814 + "version": "0.49.0",
6815 + "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.49.0.tgz",
6816 + "integrity": "sha512-xjZTSFgECpb9Ohuk5yMX5RhUEbfeQcuOp8IF60e+wyzWEF0M5xeSgqsfLtvPEX8BIyOX9saZqzuGPmZ8oWc+5Q==",
6817 + "dev": true,
6818 + "dependencies": {
6819 + "comment-parser": "1.4.1",
6820 + "esquery": "^1.6.0",
6821 + "jsdoc-type-pratt-parser": "~4.1.0"
6822 + },
6823 + "engines": {
6824 + "node": ">=16"
6825 + }
6826 + },
6827 "node_modules/eslint-plugin-jsdoc/node_modules/synckit": {
6302 - "version": "0.9.1",
6303 - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.1.tgz",
6304 - "integrity": "sha512-7gr8p9TQP6RAHusBOSLs46F4564ZrjV8xFmw5zCmgmhGUcw2hxsShhJ6CEiHQMgPDwAQ1fWHPM0ypc4RMAig4A==",
6828 + "version": "0.9.2",
6829 + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.2.tgz",
6830 + "integrity": "sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==",
6831 "dev": true,
6832 "dependencies": {
6833 "@pkgr/core": "^0.1.0",
@@ -6392,9 +6918,9 @@
6918 "dev": true
6919 },
6920 "node_modules/eslint-plugin-n": {
6395 - "version": "17.10.3",
6396 - "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-17.10.3.tgz",
6397 - "integrity": "sha512-ySZBfKe49nQZWR1yFaA0v/GsH6Fgp8ah6XV0WDz6CN8WO0ek4McMzb7A2xnf4DCYV43frjCygvb9f/wx7UUxRw==",
6921 + "version": "17.11.1",
6922 + "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-17.11.1.tgz",
6923 + "integrity": "sha512-93IUD82N6tIEgjztVI/l3ElHtC2wTa9boJHrD8iN+NyDxjxz/daZUZKfkedjBZNdg6EqDk4irybUsiPwDqXAEA==",
6924 "dev": true,
6925 "dependencies": {
6926 "@eslint-community/eslint-utils": "^4.4.0",
@@ -6426,13 +6952,13 @@
6952 }
6953 },
6954 "node_modules/eslint-plugin-perfectionist": {
6429 - "version": "3.7.0",
6430 - "resolved": "https://registry.npmjs.org/eslint-plugin-perfectionist/-/eslint-plugin-perfectionist-3.7.0.tgz",
6431 - "integrity": "sha512-pemhfcR3LDbYVWeveHok9u048yR7GpsnfyPvn6RsDkp/UV7iqBV0y5K0aGb9ZJMsemOyWok7akxGzPLsz+mHKQ==",
6955 + "version": "3.8.0",
6956 + "resolved": "https://registry.npmjs.org/eslint-plugin-perfectionist/-/eslint-plugin-perfectionist-3.8.0.tgz",
6957 + "integrity": "sha512-BYJWbQVOjvIGK9V1xUfn790HuvkePjxti8epOi1H6sdzo0N4RehBmQ8coHPbgA/f12BUG1NIoDtQhI9mUm+o2A==",
6958 "dev": true,
6959 "dependencies": {
6434 - "@typescript-eslint/types": "^8.7.0",
6435 - "@typescript-eslint/utils": "^8.7.0",
6960 + "@typescript-eslint/types": "^8.8.0",
6961 + "@typescript-eslint/utils": "^8.8.0",
6962 "minimatch": "^9.0.5",
6963 "natural-compare-lite": "^1.4.0"
6964 },
@@ -6491,9 +7017,9 @@
7017 }
7018 },
7019 "node_modules/eslint-plugin-prettier/node_modules/synckit": {
6494 - "version": "0.9.1",
6495 - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.1.tgz",
6496 - "integrity": "sha512-7gr8p9TQP6RAHusBOSLs46F4564ZrjV8xFmw5zCmgmhGUcw2hxsShhJ6CEiHQMgPDwAQ1fWHPM0ypc4RMAig4A==",
7020 + "version": "0.9.2",
7021 + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.2.tgz",
7022 + "integrity": "sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==",
7023 "dependencies": {
7024 "@pkgr/core": "^0.1.0",
7025 "tslib": "^2.6.2"
@@ -6585,18 +7111,6 @@
7111 "eslint": ">=8.56.0"
7112 }
7113 },
6588 - "node_modules/eslint-plugin-unicorn/node_modules/jsesc": {
6589 - "version": "3.0.2",
6590 - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz",
6591 - "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==",
6592 - "dev": true,
6593 - "bin": {
6594 - "jsesc": "bin/jsesc"
6595 - },
6596 - "engines": {
6597 - "node": ">=6"
6598 - }
6599 - },
7114 "node_modules/eslint-plugin-unused-imports": {
7115 "version": "4.1.4",
7116 "resolved": "https://registry.npmjs.org/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-4.1.4.tgz",
@@ -6613,9 +7127,9 @@
7127 }
7128 },
7129 "node_modules/eslint-plugin-vue": {
6616 - "version": "9.28.0",
6617 - "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.28.0.tgz",
6618 - "integrity": "sha512-ShrihdjIhOTxs+MfWun6oJWuk+g/LAhN+CiuOl/jjkG3l0F2AuK5NMTaWqyvBgkFtpYmyks6P4603mLmhNJW8g==",
7130 + "version": "9.29.0",
7131 + "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.29.0.tgz",
7132 + "integrity": "sha512-hamyjrBhNH6Li6R1h1VF9KHfshJlKgKEg3ARbGTn72CMNDSMhWbgC7NdkRDEh25AFW+4SDATzyNM+3gWuZii8g==",
7133 "dependencies": {
7134 "@eslint-community/eslint-utils": "^4.4.0",
7135 "globals": "^13.24.0",
@@ -6720,9 +7234,9 @@
7234 }
7235 },
7236 "node_modules/eslint/node_modules/@eslint/js": {
6723 - "version": "9.11.1",
6724 - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.11.1.tgz",
6725 - "integrity": "sha512-/qu+TWz8WwPWc7/HcIJKi+c+MOm46GdVaSlTTQcaqaL53+GsoA6MxWp5PtTx48qbSP7ylM1Kn7nhvkugfJvRSA==",
7237 + "version": "9.12.0",
7238 + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.12.0.tgz",
7239 + "integrity": "sha512-eohesHH8WFRUprDNyEREgqP6beG6htMeUYeCpkEgBCieCMme5r9zFWjzAJp//9S+Kub4rqE+jXe9Cp1a7IYIIA==",
7240 "engines": {
7241 "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
7242 }
@@ -6827,6 +7341,19 @@
7341 "url": "https://opencollective.com/eslint"
7342 }
7343 },
7344 + "node_modules/esprima": {
7345 + "version": "4.0.1",
7346 + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
7347 + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
7348 + "dev": true,
7349 + "bin": {
7350 + "esparse": "bin/esparse.js",
7351 + "esvalidate": "bin/esvalidate.js"
7352 + },
7353 + "engines": {
7354 + "node": ">=4"
7355 + }
7356 + },
7357 "node_modules/esquery": {
7358 "version": "1.6.0",
7359 "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz",
@@ -6931,6 +7458,18 @@
7458 "node": ">=4"
7459 }
7460 },
7461 + "node_modules/expand-tilde": {
7462 + "version": "2.0.2",
7463 + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz",
7464 + "integrity": "sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==",
7465 + "dev": true,
7466 + "dependencies": {
7467 + "homedir-polyfill": "^1.0.1"
7468 + },
7469 + "engines": {
7470 + "node": ">=0.10.0"
7471 + }
7472 + },
7473 "node_modules/extend": {
7474 "version": "3.0.2",
7475 "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
@@ -7107,6 +7646,21 @@
7646 "url": "https://github.com/sponsors/sindresorhus"
7647 }
7648 },
7649 + "node_modules/findup-sync": {
7650 + "version": "5.0.0",
7651 + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-5.0.0.tgz",
7652 + "integrity": "sha512-MzwXju70AuyflbgeOhzvQWAvvQdo1XL0A9bVvlXsYcFEBM87WR4OakL4OfZq+QRmr+duJubio+UtNQCPsVESzQ==",
7653 + "dev": true,
7654 + "dependencies": {
7655 + "detect-file": "^1.0.0",
7656 + "is-glob": "^4.0.3",
7657 + "micromatch": "^4.0.4",
7658 + "resolve-dir": "^1.0.1"
7659 + },
7660 + "engines": {
7661 + "node": ">= 10.13.0"
7662 + }
7663 + },
7664 "node_modules/flat-cache": {
7665 "version": "4.0.1",
7666 "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz",
@@ -7200,9 +7754,9 @@
7754 }
7755 },
7756 "node_modules/form-data": {
7203 - "version": "4.0.0",
7204 - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
7205 - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
7757 + "version": "4.0.1",
7758 + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz",
7759 + "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==",
7760 "dependencies": {
7761 "asynckit": "^0.4.0",
7762 "combined-stream": "^1.0.8",
@@ -7325,15 +7879,6 @@
7879 "node": "6.* || 8.* || >= 10.*"
7880 }
7881 },
7328 - "node_modules/get-func-name": {
7329 - "version": "2.0.2",
7330 - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz",
7331 - "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==",
7332 - "dev": true,
7333 - "engines": {
7334 - "node": "*"
7335 - }
7336 - },
7882 "node_modules/get-intrinsic": {
7883 "version": "1.2.4",
7884 "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz",
@@ -7462,10 +8007,58 @@
8007 "url": "https://github.com/sponsors/sindresorhus"
8008 }
8009 },
8010 + "node_modules/global-modules": {
8011 + "version": "1.0.0",
8012 + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz",
8013 + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==",
8014 + "dev": true,
8015 + "dependencies": {
8016 + "global-prefix": "^1.0.1",
8017 + "is-windows": "^1.0.1",
8018 + "resolve-dir": "^1.0.0"
8019 + },
8020 + "engines": {
8021 + "node": ">=0.10.0"
8022 + }
8023 + },
8024 + "node_modules/global-prefix": {
8025 + "version": "1.0.2",
8026 + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz",
8027 + "integrity": "sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==",
8028 + "dev": true,
8029 + "dependencies": {
8030 + "expand-tilde": "^2.0.2",
8031 + "homedir-polyfill": "^1.0.1",
8032 + "ini": "^1.3.4",
8033 + "is-windows": "^1.0.1",
8034 + "which": "^1.2.14"
8035 + },
8036 + "engines": {
8037 + "node": ">=0.10.0"
8038 + }
8039 + },
8040 + "node_modules/global-prefix/node_modules/ini": {
8041 + "version": "1.3.8",
8042 + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
8043 + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
8044 + "dev": true
8045 + },
8046 + "node_modules/global-prefix/node_modules/which": {
8047 + "version": "1.3.1",
8048 + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
8049 + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
8050 + "dev": true,
8051 + "dependencies": {
8052 + "isexe": "^2.0.0"
8053 + },
8054 + "bin": {
8055 + "which": "bin/which"
8056 + }
8057 + },
8058 "node_modules/globals": {
7466 - "version": "15.9.0",
7467 - "resolved": "https://registry.npmjs.org/globals/-/globals-15.9.0.tgz",
7468 - "integrity": "sha512-SmSKyLLKFbSr6rptvP8izbyxJL4ILwqO9Jg23UA0sDlGlu58V59D1//I3vlc0KJphVdUR7vMjHIplYnzBxorQA==",
8059 + "version": "15.11.0",
8060 + "resolved": "https://registry.npmjs.org/globals/-/globals-15.11.0.tgz",
8061 + "integrity": "sha512-yeyNSjdbyVaWurlwCpcA6XNBrHTMIeDdj0/hnvX/OLJ9ekOXYbLsLinH/MucQyGvNnXhidTdNhTtJaffL2sMfw==",
8062 "dev": true,
8063 "engines": {
8064 "node": ">=18"
@@ -7493,6 +8086,17 @@
8086 "url": "https://github.com/sponsors/sindresorhus"
8087 }
8088 },
8089 + "node_modules/globby/node_modules/path-type": {
8090 + "version": "5.0.0",
8091 + "resolved": "https://registry.npmjs.org/path-type/-/path-type-5.0.0.tgz",
8092 + "integrity": "sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==",
8093 + "engines": {
8094 + "node": ">=12"
8095 + },
8096 + "funding": {
8097 + "url": "https://github.com/sponsors/sindresorhus"
8098 + }
8099 + },
8100 "node_modules/gopd": {
8101 "version": "1.0.1",
8102 "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
@@ -7645,7 +8249,19 @@
8249 "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.10.0.tgz",
8250 "integrity": "sha512-SYVnVFswQER+zu1laSya563s+F8VDGt7o35d4utbamowvUNLLMovFqwCLSocpZTz3MgaSRA1IbqRWZv97dtErQ==",
8251 "engines": {
7648 - "node": ">=12.0.0"
8252 + "node": ">=12.0.0"
8253 + }
8254 + },
8255 + "node_modules/homedir-polyfill": {
8256 + "version": "1.0.3",
8257 + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz",
8258 + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==",
8259 + "dev": true,
8260 + "dependencies": {
8261 + "parse-passwd": "^1.0.0"
8262 + },
8263 + "engines": {
8264 + "node": ">=0.10.0"
8265 }
8266 },
8267 "node_modules/hookable": {
@@ -7880,6 +8496,14 @@
8496 "url": "https://github.com/sponsors/sindresorhus"
8497 }
8498 },
8499 + "node_modules/import-fresh/node_modules/resolve-from": {
8500 + "version": "4.0.0",
8501 + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
8502 + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
8503 + "engines": {
8504 + "node": ">=4"
8505 + }
8506 + },
8507 "node_modules/import-from-esm": {
8508 "version": "1.3.4",
8509 "resolved": "https://registry.npmjs.org/import-from-esm/-/import-from-esm-1.3.4.tgz",
@@ -7921,9 +8545,9 @@
8545 }
8546 },
8547 "node_modules/importx/node_modules/jiti": {
7924 - "version": "2.0.0",
7925 - "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.0.0.tgz",
7926 - "integrity": "sha512-CJ7e7Abb779OTRv3lomfp7Mns/Sy1+U4pcAx5VbjxCZD5ZM/VJaXPpPjNKjtSvWQy/H86E49REXR34dl1JEz9w==",
8548 + "version": "2.3.3",
8549 + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.3.3.tgz",
8550 + "integrity": "sha512-EX4oNDwcXSivPrw2qKH2LB5PoFxEvgtv2JgwW0bU858HoLQ+kutSvjLMUqBd0PeJYEinLWhoI9Ol0eYMqj/wNQ==",
8551 "dev": true,
8552 "bin": {
8553 "jiti": "lib/jiti-cli.mjs"
@@ -8215,6 +8839,15 @@
8839 "url": "https://github.com/sponsors/mesqueeb"
8840 }
8841 },
8842 + "node_modules/is-windows": {
8843 + "version": "1.0.2",
8844 + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
8845 + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
8846 + "dev": true,
8847 + "engines": {
8848 + "node": ">=0.10.0"
8849 + }
8850 + },
8851 "node_modules/is-wsl": {
8852 "version": "2.2.0",
8853 "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
@@ -8275,9 +8908,9 @@
8908 }
8909 },
8910 "node_modules/jose": {
8278 - "version": "5.9.3",
8279 - "resolved": "https://registry.npmjs.org/jose/-/jose-5.9.3.tgz",
8280 - "integrity": "sha512-egLIoYSpcd+QUF+UHgobt5YzI2Pkw/H39ou9suW687MY6PmCwPmkNV/4TNjn1p2tX5xO3j0d0sq5hiYE24bSlg==",
8911 + "version": "5.9.4",
8912 + "resolved": "https://registry.npmjs.org/jose/-/jose-5.9.4.tgz",
8913 + "integrity": "sha512-WBBl6au1qg6OHj67yCffCgFR3BADJBXN8MdRvCgJDuMv3driV2nHr7jdGvaKX9IolosAsn+M0XRArqLXUhyJHQ==",
8914 "funding": {
8915 "url": "https://github.com/sponsors/panva"
8916 }
@@ -8323,11 +8956,13 @@
8956 "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
8957 },
8958 "node_modules/js-yaml": {
8326 - "version": "4.1.0",
8327 - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
8328 - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
8959 + "version": "3.14.1",
8960 + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
8961 + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
8962 + "dev": true,
8963 "dependencies": {
8330 - "argparse": "^2.0.1"
8964 + "argparse": "^1.0.7",
8965 + "esprima": "^4.0.0"
8966 },
8967 "bin": {
8968 "js-yaml": "bin/js-yaml.js"
@@ -8410,14 +9045,14 @@
9045 }
9046 },
9047 "node_modules/jsesc": {
8413 - "version": "2.5.2",
8414 - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
8415 - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
9048 + "version": "3.0.2",
9049 + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz",
9050 + "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==",
9051 "bin": {
9052 "jsesc": "bin/jsesc"
9053 },
9054 "engines": {
8420 - "node": ">=4"
9055 + "node": ">=6"
9056 }
9057 },
9058 "node_modules/json-buffer": {
@@ -8426,13 +9061,10 @@
9061 "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="
9062 },
9063 "node_modules/json-parse-even-better-errors": {
8429 - "version": "3.0.2",
8430 - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.2.tgz",
8431 - "integrity": "sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==",
8432 - "dev": true,
8433 - "engines": {
8434 - "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
8435 - }
9064 + "version": "2.3.1",
9065 + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
9066 + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
9067 + "dev": true
9068 },
9069 "node_modules/json-schema": {
9070 "version": "0.4.0",
@@ -9096,13 +9728,10 @@
9728 }
9729 },
9730 "node_modules/loupe": {
9099 - "version": "3.1.1",
9100 - "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.1.tgz",
9101 - "integrity": "sha512-edNu/8D5MKVfGVFRhFf8aAxiTM6Wumfz5XsaatSxlD3w4R1d/WEKUTydCdPGbl9K7QG/Ca3GnDV2sIKIpXRQcw==",
9102 - "dev": true,
9103 - "dependencies": {
9104 - "get-func-name": "^2.0.1"
9105 - }
9731 + "version": "3.1.2",
9732 + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.2.tgz",
9733 + "integrity": "sha512-23I4pFZHmAemUnz8WZXbYRSKYj801VDaNv9ETuMh7IrMc7VuVVSo+Z9iLE3ni30+U48iDWfi30d3twAXBYmnCg==",
9734 + "dev": true
9735 },
9736 "node_modules/lru-cache": {
9737 "version": "5.1.1",
@@ -9121,9 +9750,9 @@
9750 }
9751 },
9752 "node_modules/magic-string": {
9124 - "version": "0.30.11",
9125 - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.11.tgz",
9126 - "integrity": "sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==",
9753 + "version": "0.30.12",
9754 + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.12.tgz",
9755 + "integrity": "sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==",
9756 "dependencies": {
9757 "@jridgewell/sourcemap-codec": "^1.5.0"
9758 }
@@ -9150,6 +9779,11 @@
9779 "markdown-it": "bin/markdown-it.mjs"
9780 }
9781 },
9782 + "node_modules/markdown-it/node_modules/argparse": {
9783 + "version": "2.0.1",
9784 + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
9785 + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="
9786 + },
9787 "node_modules/markdown-table": {
9788 "version": "3.0.3",
9789 "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.3.tgz",
@@ -10128,14 +10762,14 @@
10762 }
10763 },
10764 "node_modules/mlly": {
10131 - "version": "1.7.1",
10132 - "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.7.1.tgz",
10133 - "integrity": "sha512-rrVRZRELyQzrIUAVMHxP97kv+G786pHmOKzuFII8zDYahFBS7qnHh2AlYSl1GAHhaMPCz6/oHjVMcfFYgFYHgA==",
10765 + "version": "1.7.2",
10766 + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.7.2.tgz",
10767 + "integrity": "sha512-tN3dvVHYVz4DhSXinXIk7u9syPYaJvio118uomkovAtWBT+RdbP6Lfh/5Lvo519YMmwBafwlh20IPTXIStscpA==",
10768 "dependencies": {
10135 - "acorn": "^8.11.3",
10769 + "acorn": "^8.12.1",
10770 "pathe": "^1.1.2",
10137 - "pkg-types": "^1.1.1",
10138 - "ufo": "^1.5.3"
10771 + "pkg-types": "^1.2.0",
10772 + "ufo": "^1.5.4"
10773 }
10774 },
10775 "node_modules/mri": {
@@ -10166,6 +10800,47 @@
10800 "integrity": "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==",
10801 "dev": true
10802 },
10803 + "node_modules/multimatch": {
10804 + "version": "5.0.0",
10805 + "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-5.0.0.tgz",
10806 + "integrity": "sha512-ypMKuglUrZUD99Tk2bUQ+xNQj43lPEfAeX2o9cTteAmShXy2VHDJpuwu1o0xqoKCt9jLVAvwyFKdLTPXKAfJyA==",
10807 + "dev": true,
10808 + "dependencies": {
10809 + "@types/minimatch": "^3.0.3",
10810 + "array-differ": "^3.0.0",
10811 + "array-union": "^2.1.0",
10812 + "arrify": "^2.0.1",
10813 + "minimatch": "^3.0.4"
10814 + },
10815 + "engines": {
10816 + "node": ">=10"
10817 + },
10818 + "funding": {
10819 + "url": "https://github.com/sponsors/sindresorhus"
10820 + }
10821 + },
10822 + "node_modules/multimatch/node_modules/brace-expansion": {
10823 + "version": "1.1.11",
10824 + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
10825 + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
10826 + "dev": true,
10827 + "dependencies": {
10828 + "balanced-match": "^1.0.0",
10829 + "concat-map": "0.0.1"
10830 + }
10831 + },
10832 + "node_modules/multimatch/node_modules/minimatch": {
10833 + "version": "3.1.2",
10834 + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
10835 + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
10836 + "dev": true,
10837 + "dependencies": {
10838 + "brace-expansion": "^1.1.7"
10839 + },
10840 + "engines": {
10841 + "node": "*"
10842 + }
10843 + },
10844 "node_modules/mz": {
10845 "version": "2.7.0",
10846 "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",
@@ -10207,9 +10882,9 @@
10882 }
10883 },
10884 "node_modules/nanoid": {
10210 - "version": "3.3.7",
10211 - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz",
10212 - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==",
10885 + "version": "5.0.7",
10886 + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.0.7.tgz",
10887 + "integrity": "sha512-oLxFY2gd2IqnjcYyOXD8XGCftpGtZP2AbHbOkthDkvRywH5ayNtPVy9YlOPcHckXzbLTCHpkb7FB+yuxKV13pQ==",
10888 "funding": [
10889 {
10890 "type": "github",
@@ -10217,10 +10892,10 @@
10892 }
10893 ],
10894 "bin": {
10220 - "nanoid": "bin/nanoid.cjs"
10895 + "nanoid": "bin/nanoid.js"
10896 },
10897 "engines": {
10223 - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
10898 + "node": "^18 || >=20"
10899 }
10900 },
10901 "node_modules/natural-compare": {
@@ -10243,6 +10918,12 @@
10918 "node": ">= 0.6"
10919 }
10920 },
10921 + "node_modules/node-addon-api": {
10922 + "version": "7.1.1",
10923 + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz",
10924 + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==",
10925 + "dev": true
10926 + },
10927 "node_modules/node-fetch-native": {
10928 "version": "1.6.4",
10929 "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.4.tgz",
@@ -10555,9 +11236,9 @@
11236 }
11237 },
11238 "node_modules/ofetch": {
10558 - "version": "1.4.0",
10559 - "resolved": "https://registry.npmjs.org/ofetch/-/ofetch-1.4.0.tgz",
10560 - "integrity": "sha512-MuHgsEhU6zGeX+EMh+8mSMrYTnsqJQQrpM00Q6QHMKNqQ0bKy0B43tk8tL1wg+CnsSTy1kg4Ir2T5Ig6rD+dfQ==",
11239 + "version": "1.4.1",
11240 + "resolved": "https://registry.npmjs.org/ofetch/-/ofetch-1.4.1.tgz",
11241 + "integrity": "sha512-QZj2DfGplQAr2oj9KzceK9Hwz6Whxazmn85yYeVuS3u9XTMOGMRx0kO95MQ+vLsj/S/NwBDMMLU5hpxvI6Tklw==",
11242 "dev": true,
11243 "dependencies": {
11244 "destr": "^2.0.3",
@@ -10719,9 +11400,9 @@
11400 "dev": true
11401 },
11402 "node_modules/package-manager-detector": {
10722 - "version": "0.2.0",
10723 - "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-0.2.0.tgz",
10724 - "integrity": "sha512-E385OSk9qDcXhcM9LNSe4sdhx8a9mAPrZ4sMLW+tmxl5ZuGtPUcdFu+MPP2jbgiWAZ6Pfe5soGFMd+0Db5Vrog==",
11403 + "version": "0.2.2",
11404 + "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-0.2.2.tgz",
11405 + "integrity": "sha512-VgXbyrSNsml4eHWIvxxG/nTL4wgybMTXCV2Un/+yEc3aDKKU6nQBZjbeP3Pl3qm9Qg92X/1ng4ffvCeD/zwHgg==",
11406 "dev": true
11407 },
11408 "node_modules/parent-module": {
@@ -10775,19 +11456,22 @@
11456 "url": "https://github.com/sponsors/sindresorhus"
11457 }
11458 },
10778 - "node_modules/parse-json/node_modules/json-parse-even-better-errors": {
10779 - "version": "2.3.1",
10780 - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
10781 - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
10782 - "dev": true
11459 + "node_modules/parse-passwd": {
11460 + "version": "1.0.0",
11461 + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz",
11462 + "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==",
11463 + "dev": true,
11464 + "engines": {
11465 + "node": ">=0.10.0"
11466 + }
11467 },
11468 "node_modules/parse5": {
10785 - "version": "7.1.2",
10786 - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz",
10787 - "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==",
11469 + "version": "7.2.0",
11470 + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.2.0.tgz",
11471 + "integrity": "sha512-ZkDsAOcxsUMZ4Lz5fVciOehNcJ+Gb8gTzcA4yl3wnc273BAybYWrQ+Ks/OjCjSEpjvQkDSeZbybK9qj2VHHdGA==",
11472 "dev": true,
11473 "dependencies": {
10790 - "entities": "^4.4.0"
11474 + "entities": "^4.5.0"
11475 },
11476 "funding": {
11477 "url": "https://github.com/inikulin/parse5?sponsor=1"
@@ -10875,14 +11559,11 @@
11559 "dev": true
11560 },
11561 "node_modules/path-type": {
10878 - "version": "5.0.0",
10879 - "resolved": "https://registry.npmjs.org/path-type/-/path-type-5.0.0.tgz",
10880 - "integrity": "sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==",
11562 + "version": "4.0.0",
11563 + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
11564 + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
11565 "engines": {
10882 - "node": ">=12"
10883 - },
10884 - "funding": {
10885 - "url": "https://github.com/sponsors/sindresorhus"
11566 + "node": ">=8"
11567 }
11568 },
11569 "node_modules/pathe": {
@@ -10989,12 +11670,12 @@
11670 }
11671 },
11672 "node_modules/pinia-plugin-persistedstate": {
10992 - "version": "4.0.2",
10993 - "resolved": "https://registry.npmjs.org/pinia-plugin-persistedstate/-/pinia-plugin-persistedstate-4.0.2.tgz",
10994 - "integrity": "sha512-KSApXsnGTrWKnAeHgEpYqtzeO84y4NH7uVM0/KMog+/oR2Py8p25tKjHQUmkcNNluzc0rJjFzlv2i5ZTdLeTXA==",
11673 + "version": "4.1.1",
11674 + "resolved": "https://registry.npmjs.org/pinia-plugin-persistedstate/-/pinia-plugin-persistedstate-4.1.1.tgz",
11675 + "integrity": "sha512-fUiUsbfBetGUZzX28z+ImAZw7FDXzwRrk+fN+ljF5OhQMhsSYfYeUzI9FLLtpjekYbfFHWvJiECkLI60RIuiPA==",
11676 "dependencies": {
11677 "@nuxt/kit": "^3.13.2",
10997 - "deep-pick-omit": "^1.2.0",
11678 + "deep-pick-omit": "^1.2.1",
11679 "defu": "^6.1.4",
11680 "destr": "^2.0.3"
11681 },
@@ -11046,15 +11727,24 @@
11727 }
11728 },
11729 "node_modules/pkg-types": {
11049 - "version": "1.2.0",
11050 - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.2.0.tgz",
11051 - "integrity": "sha512-+ifYuSSqOQ8CqP4MbZA5hDpb97n3E8SVWdJe+Wms9kj745lmd3b7EZJiqvmLwAlmRfjrI7Hi5z3kdBJ93lFNPA==",
11730 + "version": "1.2.1",
11731 + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.2.1.tgz",
11732 + "integrity": "sha512-sQoqa8alT3nHjGuTjuKgOnvjo4cljkufdtLMnO2LBP/wRwuDlo1tkaEdMxCRhyGRPacv/ztlZgDPm2b7FAmEvw==",
11733 "dependencies": {
11053 - "confbox": "^0.1.7",
11054 - "mlly": "^1.7.1",
11734 + "confbox": "^0.1.8",
11735 + "mlly": "^1.7.2",
11736 "pathe": "^1.1.2"
11737 }
11738 },
11739 + "node_modules/please-upgrade-node": {
11740 + "version": "3.2.0",
11741 + "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz",
11742 + "integrity": "sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==",
11743 + "dev": true,
11744 + "dependencies": {
11745 + "semver-compare": "^1.0.0"
11746 + }
11747 + },
11748 "node_modules/pluralize": {
11749 "version": "8.0.0",
11750 "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz",
@@ -11206,6 +11896,18 @@
11896 "url": "https://github.com/sponsors/antonk52"
11897 }
11898 },
11899 + "node_modules/postcss-load-config/node_modules/yaml": {
11900 + "version": "2.6.0",
11901 + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.6.0.tgz",
11902 + "integrity": "sha512-a6ae//JvKDEra2kdi1qzCyrJW/WZCgFi8ydDV+eXExl95t+5R+ijnqHJbz9tmMh8FUjx3iv2fCQ4dclAQlO2UQ==",
11903 + "dev": true,
11904 + "bin": {
11905 + "yaml": "bin.mjs"
11906 + },
11907 + "engines": {
11908 + "node": ">= 14"
11909 + }
11910 + },
11911 "node_modules/postcss-nested": {
11912 "version": "6.2.0",
11913 "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz",
@@ -11249,6 +11951,23 @@
11951 "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
11952 "dev": true
11953 },
11954 + "node_modules/postcss/node_modules/nanoid": {
11955 + "version": "3.3.7",
11956 + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz",
11957 + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==",
11958 + "funding": [
11959 + {
11960 + "type": "github",
11961 + "url": "https://github.com/sponsors/ai"
11962 + }
11963 + ],
11964 + "bin": {
11965 + "nanoid": "bin/nanoid.cjs"
11966 + },
11967 + "engines": {
11968 + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
11969 + }
11970 + },
11971 "node_modules/prelude-ls": {
11972 "version": "1.2.1",
11973 "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
@@ -11441,6 +12160,15 @@
12160 "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
12161 }
12162 },
12163 + "node_modules/read-package-json-fast/node_modules/json-parse-even-better-errors": {
12164 + "version": "3.0.2",
12165 + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.2.tgz",
12166 + "integrity": "sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==",
12167 + "dev": true,
12168 + "engines": {
12169 + "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
12170 + }
12171 + },
12172 "node_modules/read-pkg": {
12173 "version": "5.2.0",
12174 "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz",
@@ -11578,9 +12306,9 @@
12306 }
12307 },
12308 "node_modules/regex": {
11581 - "version": "4.3.2",
11582 - "resolved": "https://registry.npmjs.org/regex/-/regex-4.3.2.tgz",
11583 - "integrity": "sha512-kK/AA3A9K6q2js89+VMymcboLOlF5lZRCYJv3gzszXFHBr6kO6qLGzbm+UIugBEV8SMMKCTR59txoY6ctRHYVw=="
12309 + "version": "4.3.3",
12310 + "resolved": "https://registry.npmjs.org/regex/-/regex-4.3.3.tgz",
12311 + "integrity": "sha512-r/AadFO7owAq1QJVeZ/nq9jNS1vyZt+6t1p/E59B56Rn2GCya+gr1KSyOzNL/er+r+B7phv5jG2xU2Nz1YkmJg=="
12312 },
12313 "node_modules/regexp-ast-analysis": {
12314 "version": "0.7.1",
@@ -11773,6 +12501,12 @@
12501 "node": ">=0.10.0"
12502 }
12503 },
12504 + "node_modules/require-package-name": {
12505 + "version": "2.0.1",
12506 + "resolved": "https://registry.npmjs.org/require-package-name/-/require-package-name-2.0.1.tgz",
12507 + "integrity": "sha512-uuoJ1hU/k6M0779t3VMVIYpb2VMJk05cehCaABFhXaibcbvfgR8wKiozLjVFSzJPmQMRqIcO0HMyTFqfV09V6Q==",
12508 + "dev": true
12509 + },
12510 "node_modules/requires-port": {
12511 "version": "1.0.0",
12512 "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
@@ -11796,12 +12530,26 @@
12530 "url": "https://github.com/sponsors/ljharb"
12531 }
12532 },
12533 + "node_modules/resolve-dir": {
12534 + "version": "1.0.1",
12535 + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz",
12536 + "integrity": "sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==",
12537 + "dev": true,
12538 + "dependencies": {
12539 + "expand-tilde": "^2.0.0",
12540 + "global-modules": "^1.0.0"
12541 + },
12542 + "engines": {
12543 + "node": ">=0.10.0"
12544 + }
12545 + },
12546 "node_modules/resolve-from": {
11800 - "version": "4.0.0",
11801 - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
11802 - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
12547 + "version": "5.0.0",
12548 + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
12549 + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
12550 + "dev": true,
12551 "engines": {
11804 - "node": ">=4"
12552 + "node": ">=8"
12553 }
12554 },
12555 "node_modules/resolve-path": {
@@ -11959,9 +12707,9 @@
12707 }
12708 },
12709 "node_modules/rollup": {
11962 - "version": "4.22.5",
11963 - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.22.5.tgz",
11964 - "integrity": "sha512-WoinX7GeQOFMGznEcWA1WrTQCd/tpEbMkc3nuMs9BT0CPjMdSjPMTVClwWd4pgSQwJdP65SK9mTCNvItlr5o7w==",
12710 + "version": "4.24.0",
12711 + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.24.0.tgz",
12712 + "integrity": "sha512-DOmrlGSXNk1DM0ljiQA+i+o0rSLhtii1je5wgk60j49d1jHT5YYttBv1iWOnYSTG+fZZESUOSNiAl89SIet+Cg==",
12713 "devOptional": true,
12714 "dependencies": {
12715 "@types/estree": "1.0.6"
@@ -11974,22 +12722,22 @@
12722 "npm": ">=8.0.0"
12723 },
12724 "optionalDependencies": {
11977 - "@rollup/rollup-android-arm-eabi": "4.22.5",
11978 - "@rollup/rollup-android-arm64": "4.22.5",
11979 - "@rollup/rollup-darwin-arm64": "4.22.5",
11980 - "@rollup/rollup-darwin-x64": "4.22.5",
11981 - "@rollup/rollup-linux-arm-gnueabihf": "4.22.5",
11982 - "@rollup/rollup-linux-arm-musleabihf": "4.22.5",
11983 - "@rollup/rollup-linux-arm64-gnu": "4.22.5",
11984 - "@rollup/rollup-linux-arm64-musl": "4.22.5",
11985 - "@rollup/rollup-linux-powerpc64le-gnu": "4.22.5",
11986 - "@rollup/rollup-linux-riscv64-gnu": "4.22.5",
11987 - "@rollup/rollup-linux-s390x-gnu": "4.22.5",
11988 - "@rollup/rollup-linux-x64-gnu": "4.22.5",
11989 - "@rollup/rollup-linux-x64-musl": "4.22.5",
11990 - "@rollup/rollup-win32-arm64-msvc": "4.22.5",
11991 - "@rollup/rollup-win32-ia32-msvc": "4.22.5",
11992 - "@rollup/rollup-win32-x64-msvc": "4.22.5",
12725 + "@rollup/rollup-android-arm-eabi": "4.24.0",
12726 + "@rollup/rollup-android-arm64": "4.24.0",
12727 + "@rollup/rollup-darwin-arm64": "4.24.0",
12728 + "@rollup/rollup-darwin-x64": "4.24.0",
12729 + "@rollup/rollup-linux-arm-gnueabihf": "4.24.0",
12730 + "@rollup/rollup-linux-arm-musleabihf": "4.24.0",
12731 + "@rollup/rollup-linux-arm64-gnu": "4.24.0",
12732 + "@rollup/rollup-linux-arm64-musl": "4.24.0",
12733 + "@rollup/rollup-linux-powerpc64le-gnu": "4.24.0",
12734 + "@rollup/rollup-linux-riscv64-gnu": "4.24.0",
12735 + "@rollup/rollup-linux-s390x-gnu": "4.24.0",
12736 + "@rollup/rollup-linux-x64-gnu": "4.24.0",
12737 + "@rollup/rollup-linux-x64-musl": "4.24.0",
12738 + "@rollup/rollup-win32-arm64-msvc": "4.24.0",
12739 + "@rollup/rollup-win32-ia32-msvc": "4.24.0",
12740 + "@rollup/rollup-win32-x64-msvc": "4.24.0",
12741 "fsevents": "~2.3.2"
12742 }
12743 },
@@ -12048,19 +12796,6 @@
12796 "url": "https://github.com/sponsors/jonschlinkert"
12797 }
12798 },
12051 - "node_modules/rollup/node_modules/@rollup/rollup-linux-x64-gnu": {
12052 - "version": "4.22.5",
12053 - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.22.5.tgz",
12054 - "integrity": "sha512-N0jPPhHjGShcB9/XXZQWuWBKZQnC1F36Ce3sDqWpujsGjDz/CQtOL9LgTrJ+rJC8MJeesMWrMWVLKKNR/tMOCA==",
12055 - "cpu": [
12056 - "x64"
12057 - ],
12058 - "dev": true,
12059 - "optional": true,
12060 - "os": [
12061 - "linux"
12062 - ]
12063 - },
12799 "node_modules/rrweb-cssom": {
12800 "version": "0.7.1",
12801 "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.7.1.tgz",
@@ -12137,11 +12872,12 @@
12872 "dev": true
12873 },
12874 "node_modules/sass": {
12140 - "version": "1.79.4",
12141 - "resolved": "https://registry.npmjs.org/sass/-/sass-1.79.4.tgz",
12142 - "integrity": "sha512-K0QDSNPXgyqO4GZq2HO5Q70TLxTH6cIT59RdoCHMivrC8rqzaTw5ab9prjz9KUN1El4FLXrBXJhik61JR4HcGg==",
12875 + "version": "1.79.5",
12876 + "resolved": "https://registry.npmjs.org/sass/-/sass-1.79.5.tgz",
12877 + "integrity": "sha512-W1h5kp6bdhqFh2tk3DsI771MoEJjvrSY/2ihJRJS4pjIyfJCw0nTsxqhnrUzaLMOJjFchj8rOvraI/YUVjtx5g==",
12878 "dev": true,
12879 "dependencies": {
12880 + "@parcel/watcher": "^2.4.1",
12881 "chokidar": "^4.0.0",
12882 "immutable": "^4.0.0",
12883 "source-map-js": ">=0.6.2 <2.0.0"
@@ -12169,9 +12905,9 @@
12905 }
12906 },
12907 "node_modules/sass/node_modules/readdirp": {
12172 - "version": "4.0.1",
12173 - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.0.1.tgz",
12174 - "integrity": "sha512-GkMg9uOTpIWWKbSsgwb5fA4EavTR+SG/PMPoAY8hkhHfEEY0/vqljY+XHqtDf2cr2IJtoNRDbrrEpZUiZCkYRw==",
12908 + "version": "4.0.2",
12909 + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.0.2.tgz",
12910 + "integrity": "sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==",
12911 "dev": true,
12912 "engines": {
12913 "node": ">= 14.16.0"
@@ -12225,9 +12961,9 @@
12961 }
12962 },
12963 "node_modules/seemly": {
12228 - "version": "0.3.8",
12229 - "resolved": "https://registry.npmjs.org/seemly/-/seemly-0.3.8.tgz",
12230 - "integrity": "sha512-MW8Qs6vbzo0pHmDpFSYPna+lwpZ6Zk1ancbajw/7E8TKtHdV+1DfZZD+kKJEhG/cAoB/i+LiT+5msZOqj0DwRA=="
12964 + "version": "0.3.9",
12965 + "resolved": "https://registry.npmjs.org/seemly/-/seemly-0.3.9.tgz",
12966 + "integrity": "sha512-bMLcaEqhIViiPbaumjLN8t1y+JpD/N8SiyYOyp0i0W6RgdyLWboIsUWAbZojF//JyerxPZR5Tgda+x3Pdne75A=="
12967 },
12968 "node_modules/semver": {
12969 "version": "7.6.3",
@@ -12240,6 +12976,12 @@
12976 "node": ">=10"
12977 }
12978 },
12979 + "node_modules/semver-compare": {
12980 + "version": "1.0.0",
12981 + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz",
12982 + "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==",
12983 + "dev": true
12984 + },
12985 "node_modules/set-function-length": {
12986 "version": "1.2.2",
12987 "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz",
@@ -12292,15 +13034,15 @@
13034 }
13035 },
13036 "node_modules/shiki": {
12295 - "version": "1.21.0",
12296 - "resolved": "https://registry.npmjs.org/shiki/-/shiki-1.21.0.tgz",
12297 - "integrity": "sha512-apCH5BoWTrmHDPGgg3RF8+HAAbEL/CdbYr8rMw7eIrdhCkZHdVGat5mMNlRtd1erNG01VPMIKHNQ0Pj2HMAiog==",
12298 - "dependencies": {
12299 - "@shikijs/core": "1.21.0",
12300 - "@shikijs/engine-javascript": "1.21.0",
12301 - "@shikijs/engine-oniguruma": "1.21.0",
12302 - "@shikijs/types": "1.21.0",
12303 - "@shikijs/vscode-textmate": "^9.2.2",
13037 + "version": "1.22.0",
13038 + "resolved": "https://registry.npmjs.org/shiki/-/shiki-1.22.0.tgz",
13039 + "integrity": "sha512-/t5LlhNs+UOKQCYBtl5ZsH/Vclz73GIqT2yQsCBygr8L/ppTdmpL4w3kPLoZJbMKVWtoG77Ue1feOjZfDxvMkw==",
13040 + "dependencies": {
13041 + "@shikijs/core": "1.22.0",
13042 + "@shikijs/engine-javascript": "1.22.0",
13043 + "@shikijs/engine-oniguruma": "1.22.0",
13044 + "@shikijs/types": "1.22.0",
13045 + "@shikijs/vscode-textmate": "^9.3.0",
13046 "@types/hast": "^3.0.4"
13047 }
13048 },
@@ -12512,6 +13254,12 @@
13254 "node": "*"
13255 }
13256 },
13257 + "node_modules/sprintf-js": {
13258 + "version": "1.0.3",
13259 + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
13260 + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==",
13261 + "dev": true
13262 + },
13263 "node_modules/sshpk": {
13264 "version": "1.18.0",
13265 "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz",
@@ -12830,6 +13578,7 @@
13578 "version": "2.2.2",
13579 "resolved": "https://registry.npmjs.org/svg.draggable.js/-/svg.draggable.js-2.2.2.tgz",
13580 "integrity": "sha512-JzNHBc2fLQMzYCZ90KZHN2ohXL0BQJGQimK1kGk6AvSeibuKcIdDX9Kr0dT9+UJ5O8nYA0RB839Lhvk4CY4MZw==",
13581 + "peer": true,
13582 "dependencies": {
13583 "svg.js": "^2.0.1"
13584 },
@@ -12841,6 +13590,7 @@
13590 "version": "2.0.0",
13591 "resolved": "https://registry.npmjs.org/svg.easing.js/-/svg.easing.js-2.0.0.tgz",
13592 "integrity": "sha512-//ctPdJMGy22YoYGV+3HEfHbm6/69LJUTAqI2/5qBvaNHZ9uUFVC82B0Pl299HzgH13rKrBgi4+XyXXyVWWthA==",
13593 + "peer": true,
13594 "dependencies": {
13595 "svg.js": ">=2.3.x"
13596 },
@@ -12852,6 +13602,7 @@
13602 "version": "2.0.2",
13603 "resolved": "https://registry.npmjs.org/svg.filter.js/-/svg.filter.js-2.0.2.tgz",
13604 "integrity": "sha512-xkGBwU+dKBzqg5PtilaTb0EYPqPfJ9Q6saVldX+5vCRy31P6TlRCP3U9NxH3HEufkKkpNgdTLBJnmhDHeTqAkw==",
13605 + "peer": true,
13606 "dependencies": {
13607 "svg.js": "^2.2.5"
13608 },
@@ -12862,12 +13613,14 @@
13613 "node_modules/svg.js": {
13614 "version": "2.7.1",
13615 "resolved": "https://registry.npmjs.org/svg.js/-/svg.js-2.7.1.tgz",
12865 - "integrity": "sha512-ycbxpizEQktk3FYvn/8BH+6/EuWXg7ZpQREJvgacqn46gIddG24tNNe4Son6omdXCnSOaApnpZw6MPCBA1dODA=="
13616 + "integrity": "sha512-ycbxpizEQktk3FYvn/8BH+6/EuWXg7ZpQREJvgacqn46gIddG24tNNe4Son6omdXCnSOaApnpZw6MPCBA1dODA==",
13617 + "peer": true
13618 },
13619 "node_modules/svg.pathmorphing.js": {
13620 "version": "0.1.3",
13621 "resolved": "https://registry.npmjs.org/svg.pathmorphing.js/-/svg.pathmorphing.js-0.1.3.tgz",
13622 "integrity": "sha512-49HWI9X4XQR/JG1qXkSDV8xViuTLIWm/B/7YuQELV5KMOPtXjiwH4XPJvr/ghEDibmLQ9Oc22dpWpG0vUDDNww==",
13623 + "peer": true,
13624 "dependencies": {
13625 "svg.js": "^2.4.0"
13626 },
@@ -12879,6 +13632,7 @@
13632 "version": "1.4.3",
13633 "resolved": "https://registry.npmjs.org/svg.resize.js/-/svg.resize.js-1.4.3.tgz",
13634 "integrity": "sha512-9k5sXJuPKp+mVzXNvxz7U0uC9oVMQrrf7cFsETznzUDDm0x8+77dtZkWdMfRlmbkEEYvUn9btKuZ3n41oNA+uw==",
13635 + "peer": true,
13636 "dependencies": {
13637 "svg.js": "^2.6.5",
13638 "svg.select.js": "^2.1.2"
@@ -12891,6 +13645,7 @@
13645 "version": "2.1.2",
13646 "resolved": "https://registry.npmjs.org/svg.select.js/-/svg.select.js-2.1.2.tgz",
13647 "integrity": "sha512-tH6ABEyJsAOVAhwcCjF8mw4crjXSI1aa7j2VQR8ZuJ37H2MBUbyeqYr5nEO7sSN3cy9AR9DUwNg0t/962HlDbQ==",
13648 + "peer": true,
13649 "dependencies": {
13650 "svg.js": "^2.2.5"
13651 },
@@ -12902,6 +13657,7 @@
13657 "version": "3.0.1",
13658 "resolved": "https://registry.npmjs.org/svg.select.js/-/svg.select.js-3.0.1.tgz",
13659 "integrity": "sha512-h5IS/hKkuVCbKSieR9uQCj9w+zLHoPh+ce19bBYyqF53g6mnPB8sAtIbe1s9dh2S2fCmYX2xel1Ln3PJBbK4kw==",
13660 + "peer": true,
13661 "dependencies": {
13662 "svg.js": "^2.6.5"
13663 },
@@ -13117,6 +13873,24 @@
13873 "url": "https://github.com/sponsors/antfu"
13874 }
13875 },
13876 + "node_modules/taze/node_modules/argparse": {
13877 + "version": "2.0.1",
13878 + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
13879 + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
13880 + "dev": true
13881 + },
13882 + "node_modules/taze/node_modules/js-yaml": {
13883 + "version": "4.1.0",
13884 + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
13885 + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
13886 + "dev": true,
13887 + "dependencies": {
13888 + "argparse": "^2.0.1"
13889 + },
13890 + "bin": {
13891 + "js-yaml": "bin/js-yaml.js"
13892 + }
13893 + },
13894 "node_modules/taze/node_modules/unconfig": {
13895 "version": "0.6.0",
13896 "resolved": "https://registry.npmjs.org/unconfig/-/unconfig-0.6.0.tgz",
@@ -13212,21 +13986,21 @@
13986 }
13987 },
13988 "node_modules/tldts": {
13215 - "version": "6.1.48",
13216 - "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.48.tgz",
13217 - "integrity": "sha512-SPbnh1zaSzi/OsmHb1vrPNnYuwJbdWjwo5TbBYYMlTtH3/1DSb41t8bcSxkwDmmbG2q6VLPVvQc7Yf23T+1EEw==",
13989 + "version": "6.1.51",
13990 + "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.51.tgz",
13991 + "integrity": "sha512-33lfQoL0JsDogIbZ8fgRyvv77GnRtwkNE/MOKocwUgPO1WrSfsq7+vQRKxRQZai5zd+zg97Iv9fpFQSzHyWdLA==",
13992 "dev": true,
13993 "dependencies": {
13220 - "tldts-core": "^6.1.48"
13994 + "tldts-core": "^6.1.51"
13995 },
13996 "bin": {
13997 "tldts": "bin/cli.js"
13998 }
13999 },
14000 "node_modules/tldts-core": {
13227 - "version": "6.1.48",
13228 - "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.48.tgz",
13229 - "integrity": "sha512-3gD9iKn/n2UuFH1uilBviK9gvTNT6iYwdqrj1Vr5mh8FuelvpRNaYVH4pNYqUgOGU4aAdL9X35eLuuj0gRsx+A==",
14001 + "version": "6.1.51",
14002 + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.51.tgz",
14003 + "integrity": "sha512-bu9oCYYWC1iRjx+3UnAjqCsfrWNZV1ghNQf49b3w5xE8J/tNShHTzp5syWJfwGH+pxUgTTLUnzHnfuydW7wmbg==",
14004 "dev": true
14005 },
14006 "node_modules/tmp": {
@@ -14117,15 +14891,15 @@
14891 }
14892 },
14893 "node_modules/untyped": {
14120 - "version": "1.5.0",
14121 - "resolved": "https://registry.npmjs.org/untyped/-/untyped-1.5.0.tgz",
14122 - "integrity": "sha512-o2Vjmn2dal08BzCcINxSmWuAteReUUiXseii5VRhmxyLF0b21K0iKZQ9fMYK7RWspVkY+0saqaVQNq4roe3Efg==",
14894 + "version": "1.5.1",
14895 + "resolved": "https://registry.npmjs.org/untyped/-/untyped-1.5.1.tgz",
14896 + "integrity": "sha512-reBOnkJBFfBZ8pCKaeHgfZLcehXtM6UTxc+vqs1JvCps0c4amLNp3fhdGBZwYp+VLyoY9n3X5KOP7lCyWBUX9A==",
14897 "dependencies": {
14124 - "@babel/core": "^7.25.2",
14125 - "@babel/standalone": "^7.25.6",
14126 - "@babel/types": "^7.25.6",
14898 + "@babel/core": "^7.25.7",
14899 + "@babel/standalone": "^7.25.7",
14900 + "@babel/types": "^7.25.7",
14901 "defu": "^6.1.4",
14128 - "jiti": "^2.0.0",
14902 + "jiti": "^2.3.1",
14903 "mri": "^1.2.0",
14904 "scule": "^1.3.0"
14905 },
@@ -14134,9 +14908,9 @@
14908 }
14909 },
14910 "node_modules/untyped/node_modules/jiti": {
14137 - "version": "2.0.0",
14138 - "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.0.0.tgz",
14139 - "integrity": "sha512-CJ7e7Abb779OTRv3lomfp7Mns/Sy1+U4pcAx5VbjxCZD5ZM/VJaXPpPjNKjtSvWQy/H86E49REXR34dl1JEz9w==",
14911 + "version": "2.3.3",
14912 + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.3.3.tgz",
14913 + "integrity": "sha512-EX4oNDwcXSivPrw2qKH2LB5PoFxEvgtv2JgwW0bU858HoLQ+kutSvjLMUqBd0PeJYEinLWhoI9Ol0eYMqj/wNQ==",
14914 "bin": {
14915 "jiti": "lib/jiti-cli.mjs"
14916 }
@@ -14291,9 +15065,9 @@
15065 }
15066 },
15067 "node_modules/vite": {
14294 - "version": "5.4.8",
14295 - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.8.tgz",
14296 - "integrity": "sha512-FqrItQ4DT1NC4zCUqMB4c4AZORMKIa0m8/URVCZ77OZ/QSNeJ54bU1vrFADbDsuwfIPcgknRkmqakQcgnL4GiQ==",
15068 + "version": "5.4.9",
15069 + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.9.tgz",
15070 + "integrity": "sha512-20OVpJHh0PAM0oSOELa5GaZNWeDjcAvQjGXy2Uyr+Tp+/D2/Hdz6NLgpJLsarPTA2QJ6v8mX2P1ZfbsSKvdMkg==",
15071 "dev": true,
15072 "dependencies": {
15073 "esbuild": "^0.21.3",
@@ -14349,12 +15123,6 @@
15123 }
15124 }
15125 },
14352 - "node_modules/vite-bundle-analyzer": {
14353 - "version": "0.12.1",
14354 - "resolved": "https://registry.npmjs.org/vite-bundle-analyzer/-/vite-bundle-analyzer-0.12.1.tgz",
14355 - "integrity": "sha512-mIYwsDvTYCqXAUtOZIL3f7NdwWUeL/MlNFhOJzlTdcZE4pye6h06IEnOvWhnc/e+HM4oVVNxuRHZt0Rz6VO7EA==",
14356 - "dev": true
14357 - },
15126 "node_modules/vite-bundle-visualizer": {
15127 "version": "1.2.1",
15128 "resolved": "https://registry.npmjs.org/vite-bundle-visualizer/-/vite-bundle-visualizer-1.2.1.tgz",
@@ -14386,9 +15154,9 @@
15154 }
15155 },
15156 "node_modules/vite-node": {
14389 - "version": "2.1.1",
14390 - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-2.1.1.tgz",
14391 - "integrity": "sha512-N/mGckI1suG/5wQI35XeR9rsMsPqKXzq1CdUndzVstBj/HvyxxGctwnK6WX43NGt5L3Z5tcRf83g4TITKJhPrA==",
15157 + "version": "2.1.3",
15158 + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-2.1.3.tgz",
15159 + "integrity": "sha512-I1JadzO+xYX887S39Do+paRePCKoiDrWRRjp9kkG5he0t7RXNvPAJPCQSJqbGN4uCrFFeS3Kj3sLqY8NMYBEdA==",
15160 "dev": true,
15161 "dependencies": {
15162 "cac": "^6.7.14",
@@ -14670,18 +15438,18 @@
15438 }
15439 },
15440 "node_modules/vitest": {
14673 - "version": "2.1.1",
14674 - "resolved": "https://registry.npmjs.org/vitest/-/vitest-2.1.1.tgz",
14675 - "integrity": "sha512-97We7/VC0e9X5zBVkvt7SGQMGrRtn3KtySFQG5fpaMlS+l62eeXRQO633AYhSTC3z7IMebnPPNjGXVGNRFlxBA==",
15441 + "version": "2.1.3",
15442 + "resolved": "https://registry.npmjs.org/vitest/-/vitest-2.1.3.tgz",
15443 + "integrity": "sha512-Zrxbg/WiIvUP2uEzelDNTXmEMJXuzJ1kCpbDvaKByFA9MNeO95V+7r/3ti0qzJzrxdyuUw5VduN7k+D3VmVOSA==",
15444 "dev": true,
15445 "dependencies": {
14678 - "@vitest/expect": "2.1.1",
14679 - "@vitest/mocker": "2.1.1",
14680 - "@vitest/pretty-format": "^2.1.1",
14681 - "@vitest/runner": "2.1.1",
14682 - "@vitest/snapshot": "2.1.1",
14683 - "@vitest/spy": "2.1.1",
14684 - "@vitest/utils": "2.1.1",
15446 + "@vitest/expect": "2.1.3",
15447 + "@vitest/mocker": "2.1.3",
15448 + "@vitest/pretty-format": "^2.1.3",
15449 + "@vitest/runner": "2.1.3",
15450 + "@vitest/snapshot": "2.1.3",
15451 + "@vitest/spy": "2.1.3",
15452 + "@vitest/utils": "2.1.3",
15453 "chai": "^5.1.1",
15454 "debug": "^4.3.6",
15455 "magic-string": "^0.30.11",
@@ -14692,7 +15460,7 @@
15460 "tinypool": "^1.0.0",
15461 "tinyrainbow": "^1.2.0",
15462 "vite": "^5.0.0",
14695 - "vite-node": "2.1.1",
15463 + "vite-node": "2.1.3",
15464 "why-is-node-running": "^2.3.0"
15465 },
15466 "bin": {
@@ -14707,8 +15475,8 @@
15475 "peerDependencies": {
15476 "@edge-runtime/vm": "*",
15477 "@types/node": "^18.0.0 || >=20.0.0",
14710 - "@vitest/browser": "2.1.1",
14711 - "@vitest/ui": "2.1.1",
15478 + "@vitest/browser": "2.1.3",
15479 + "@vitest/ui": "2.1.3",
15480 "happy-dom": "*",
15481 "jsdom": "*"
15482 },
@@ -14751,15 +15519,15 @@
15519 "dev": true
15520 },
15521 "node_modules/vue": {
14754 - "version": "3.5.10",
14755 - "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.10.tgz",
14756 - "integrity": "sha512-Vy2kmJwHPlouC/tSnIgXVg03SG+9wSqT1xu1Vehc+ChsXsRd7jLkKgMltVEFOzUdBr3uFwBCG+41LJtfAcBRng==",
15522 + "version": "3.5.12",
15523 + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.12.tgz",
15524 + "integrity": "sha512-CLVZtXtn2ItBIi/zHZ0Sg1Xkb7+PU32bJJ8Bmy7ts3jxXTcbfsEfBivFYYWz1Hur+lalqGAh65Coin0r+HRUfg==",
15525 "dependencies": {
14758 - "@vue/compiler-dom": "3.5.10",
14759 - "@vue/compiler-sfc": "3.5.10",
14760 - "@vue/runtime-dom": "3.5.10",
14761 - "@vue/server-renderer": "3.5.10",
14762 - "@vue/shared": "3.5.10"
15526 + "@vue/compiler-dom": "3.5.12",
15527 + "@vue/compiler-sfc": "3.5.12",
15528 + "@vue/runtime-dom": "3.5.12",
15529 + "@vue/server-renderer": "3.5.12",
15530 + "@vue/shared": "3.5.12"
15531 },
15532 "peerDependencies": {
15533 "typescript": "*"
@@ -14870,12 +15638,12 @@
15638 }
15639 },
15640 "node_modules/vue-i18n": {
14873 - "version": "10.0.3",
14874 - "resolved": "https://registry.npmjs.org/vue-i18n/-/vue-i18n-10.0.3.tgz",
14875 - "integrity": "sha512-8ul2S4Hy9orKs7eOlkw/zqnVu98GttUdyIMRyjoMpv6hFPxnybgBLdep/UCmdan5kUHyxqMnr2cGHTBuPBYJaw==",
15641 + "version": "10.0.4",
15642 + "resolved": "https://registry.npmjs.org/vue-i18n/-/vue-i18n-10.0.4.tgz",
15643 + "integrity": "sha512-1xkzVxqBLk2ZFOmeI+B5r1J7aD/WtNJ4j9k2mcFcQo5BnOmHBmD7z4/oZohh96AAaRZ4Q7mNQvxc9h+aT+Md3w==",
15644 "dependencies": {
14877 - "@intlify/core-base": "10.0.3",
14878 - "@intlify/shared": "10.0.3",
15645 + "@intlify/core-base": "10.0.4",
15646 + "@intlify/shared": "10.0.4",
15647 "@vue/devtools-api": "^6.5.0"
15648 },
15649 "engines": {
@@ -14928,9 +15696,9 @@
15696 }
15697 },
15698 "node_modules/vue3-apexcharts": {
14931 - "version": "1.6.0",
14932 - "resolved": "https://registry.npmjs.org/vue3-apexcharts/-/vue3-apexcharts-1.6.0.tgz",
14933 - "integrity": "sha512-gemKFXpw4TuVcllwyKJGYjTwiJQxxCUwbXsiiEEZjs0zc9jvOHvreN8frXz7QbnYqMqOHF9D1TBqwENvoPNjLw==",
15699 + "version": "1.7.0",
15700 + "resolved": "https://registry.npmjs.org/vue3-apexcharts/-/vue3-apexcharts-1.7.0.tgz",
15701 + "integrity": "sha512-BmWoS8+x5XLCtk2ml7rLVO+QU+fjgQUUCjUXSFW9cNQpCMa5Z0eRPvZjvYLt5aDKNREtuZoidlG9WRjZ/Af7lA==",
15702 "peerDependencies": {
15703 "apexcharts": "> 3.0.0",
15704 "vue": "> 3.0.0"
@@ -15286,15 +16054,12 @@
16054 "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="
16055 },
16056 "node_modules/yaml": {
15289 - "version": "2.5.1",
15290 - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.5.1.tgz",
15291 - "integrity": "sha512-bLQOjaX/ADgQ20isPJRvF0iRUHIxVhYvr53Of7wGcWlO2jvtUlH5m87DsmulFVxRpNLOnI4tB6p/oh8D7kpn9Q==",
16057 + "version": "1.10.2",
16058 + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz",
16059 + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==",
16060 "dev": true,
15293 - "bin": {
15294 - "yaml": "bin.mjs"
15295 - },
16061 "engines": {
15297 - "node": ">= 14"
16062 + "node": ">= 6"
16063 }
16064 },
16065 "node_modules/yaml-eslint-parser": {
@@ -15326,6 +16091,18 @@
16091 "url": "https://opencollective.com/eslint"
16092 }
16093 },
16094 + "node_modules/yaml-eslint-parser/node_modules/yaml": {
16095 + "version": "2.6.0",
16096 + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.6.0.tgz",
16097 + "integrity": "sha512-a6ae//JvKDEra2kdi1qzCyrJW/WZCgFi8ydDV+eXExl95t+5R+ijnqHJbz9tmMh8FUjx3iv2fCQ4dclAQlO2UQ==",
16098 + "dev": true,
16099 + "bin": {
16100 + "yaml": "bin.mjs"
16101 + },
16102 + "engines": {
16103 + "node": ">= 14"
16104 + }
16105 + },
16106 "node_modules/yargs": {
16107 "version": "17.7.2",
16108 "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
frontend/package.json
+24 -31
@@ -28,7 +28,7 @@
28 "start-server": "cd ../backend && /opt/venv/bin/python copilot.py",
29 "start-vue": "vite --host 0.0.0.0",
30 "start": "concurrently \"npm run start-server\" \"npm run start-vue\"",
31 - "libs-check": "taze",
31 + "libs-check": "taze && depcheck",
32 "libs-reload": "rm -rf node_modules package-lock.json && npm install",
33 "open:swagger": "open http://127.0.0.1:5000/docs#/",
34 "open:redoc": "open http://127.0.0.1:5000/redoc",
@@ -37,46 +37,43 @@
37 "dependencies": {
38 "@ajoelp/json-to-formdata": "^1.5.0",
39 "@f3ve/vue-markdown-it": "^0.2.2",
40 - "@fontsource/jetbrains-mono": "^5.1.0",
41 - "@fontsource/lexend": "^5.1.0",
42 - "@fontsource/public-sans": "^5.1.0",
43 - "@popperjs/core": "^2.11.8",
44 - "@shikijs/markdown-it": "^1.21.0",
45 - "@vueuse/components": "^11.1.0",
40 + "@fontsource/jetbrains-mono": "^5.1.1",
41 + "@fontsource/lexend": "^5.1.1",
42 + "@fontsource/public-sans": "^5.1.1",
43 + "@shikijs/markdown-it": "^1.22.0",
44 "@vueuse/core": "^11.1.0",
47 - "apexcharts": "^3.54.0",
45 "axios": "^1.7.7",
46 "bytes": "^3.1.2",
47 "colord": "^2.9.3",
51 - "crypto-js": "^4.2.0",
48 "dayjs": "^1.11.13",
49 "detect-touch-device": "^1.1.6",
50 "echarts": "^5.5.1",
51 "file-saver": "^2.0.5",
52 "html-entities": "^2.5.2",
57 - "jose": "^5.9.3",
53 + "jose": "^5.9.4",
54 "js-md5": "^0.8.3",
55 "lodash": "^4.17.21",
56 "mitt": "^3.0.1",
57 "naive-ui": "^2.40.1",
58 + "nanoid": "^5.0.7",
59 "password-validator": "^5.3.0",
60 "pinia": "^2.2.4",
64 - "pinia-plugin-persistedstate": "^4.0.2",
61 + "pinia-plugin-persistedstate": "^4.1.1",
62 "secure-ls": "^2.0.0",
66 - "shiki": "^1.21.0",
63 + "shiki": "^1.22.0",
64 "validator": "^13.12.0",
68 - "vue": "^3.5.10",
65 + "vue": "^3.5.12",
66 "vue-advanced-cropper": "^2.8.9",
67 "vue-highlight-words": "^3.0.1",
71 - "vue-i18n": "^10.0.3",
68 + "vue-i18n": "^10.0.4",
69 "vue-router": "^4.4.5",
70 "vue-sjv": "^0.0.6",
74 - "vue3-apexcharts": "^1.6.0",
71 + "vue3-apexcharts": "^1.7.0",
72 "vue3-marquee": "^4.2.2",
73 "vuedraggable": "^4.1.0"
74 },
75 "optionalDependencies": {
79 - "@rollup/rollup-linux-x64-gnu": "^4.23.0"
76 + "@rollup/rollup-linux-x64-gnu": "^4.24.0"
77 },
78 "devDependencies": {
79 "@antfu/eslint-config": "^3.7.3",
@@ -86,10 +83,9 @@
83 "@types/bytes": "^3.1.4",
84 "@types/file-saver": "^2.0.7",
85 "@types/fs-extra": "^11.0.4",
89 - "@types/inquirer": "^9.0.7",
86 "@types/jsdom": "^21.1.7",
91 - "@types/lodash": "^4.17.9",
92 - "@types/node": "^22.7.4",
87 + "@types/lodash": "^4.17.10",
88 + "@types/node": "^22.7.5",
89 "@types/validator": "^13.12.2",
90 "@vitejs/plugin-vue": "^5.1.4",
91 "@vitejs/plugin-vue-jsx": "^4.0.1",
@@ -97,17 +93,15 @@
93 "@vue/tsconfig": "^0.5.1",
94 "autoprefixer": "^10.4.20",
95 "cypress": "^13.15.0",
100 - "eslint": "^9.11.1",
96 + "depcheck": "^1.4.7",
97 + "eslint": "^9.12.0",
98 "flourite": "^1.3.0",
99 "fs-extra": "^11.2.0",
103 - "globals": "^15.9.0",
100 "jsdom": "^25.0.1",
105 - "json5": "^2.2.3",
101 "npm-run-all2": "^6.2.3",
107 - "picocolors": "^1.1.0",
102 "postcss": "^8.4.47",
103 "prettier": "^3.3.3",
110 - "sass": "^1.79.4",
104 + "sass": "^1.79.5",
105 "start-server-and-test": "^2.0.8",
106 "tailwind-config-viewer": "^2.0.4",
107 "tailwindcss": "^3.4.13",
@@ -115,29 +109,28 @@
109 "type-fest": "^4.26.1",
110 "typescript": "~5.5.4",
111 "unplugin-vue-components": "^0.27.4",
118 - "vite": "^5.4.8",
119 - "vite-bundle-analyzer": "^0.12.1",
112 + "vite": "^5.4.9",
113 "vite-bundle-visualizer": "^1.2.1",
114 "vite-plugin-vue-devtools": "^7.4.6",
115 "vite-svg-loader": "^5.1.0",
123 - "vitest": "^2.1.1",
116 + "vitest": "^2.1.3",
117 "vue-tsc": "^2.1.6"
118 },
119 "pnpm": {
120 "overrides": {
128 - "@typescript-eslint/eslint-plugin": "^8.8.0",
121 + "@typescript-eslint/eslint-plugin": "^8.9.0",
122 "@typescript-eslint/eslint-plugin>eslint": "$eslint",
130 - "@typescript-eslint/parser": "^8.8.0",
123 + "@typescript-eslint/parser": "^8.9.0",
124 "@typescript-eslint/parser>eslint": "$eslint",
125 "eslint": "$eslint"
126 }
127 },
128 "overrides": {
129 "@typescript-eslint/eslint-plugin": {
137 - "eslint": "9.11.1"
130 + "eslint": "^9.12.0"
131 },
132 "@typescript-eslint/parser": {
140 - "eslint": "9.11.1"
133 + "eslint": "^9.12.0"
134 }
135 }
136 }
frontend/src/api/endpoints/incidentManagement.ts
+52 -3
@@ -9,7 +9,13 @@ import type {
9 AlertTag,
10 AlertTimeline
11 } from "@/types/incidentManagement/alerts.d"
12 -import type { Case, CaseDataStore, CasePayload, CaseStatus } from "@/types/incidentManagement/cases.d"
12 +import type {
13 + Case,
14 + CaseDataStore,
15 + CasePayload,
16 + CaseReportTemplateDataStore,
17 + CaseStatus
18 +} from "@/types/incidentManagement/cases.d"
19 import type { IncidentNotification, IncidentNotificationPayload } from "@/types/incidentManagement/notifications.d"
20 import type { SourceConfiguration, SourceName } from "@/types/incidentManagement/sources.d"
21 import type { KeysOfUnion, UnionToIntersection } from "type-fest"
@@ -40,6 +46,12 @@ export type CasesFilterTypes = KeysOfUnion<CasesFilter>
46
47 export type AlertCommentPayload = Omit<AlertComment, "id">
48
49 +export interface CaseReportPayload {
50 + case_id: number
51 + file_name: string
52 + template_name: string
53 +}
54 +
55 export default {
56 // #region Sources
57 getConfiguredSources() {
@@ -286,10 +298,10 @@ export default {
298 return HttpClient.delete<FlaskBaseResponse>(`/incidents/db_operations/case/${caseId}`)
299 },
300 exportCases(customerCode?: string) {
289 - let url = `/incidents/report/generate-report`
301 + let url = `/incidents/report/generate-report-csv`
302
303 if (customerCode) {
292 - url = `/incidents/report/generate-report/${customerCode}`
304 + url = `/incidents/report/generate-report-csv/${customerCode}`
305 }
306
307 return HttpClient.post<Blob>(url, {
@@ -323,6 +335,43 @@ export default {
335 deleteCaseDataStoreFile(caseId: number, fileName: string) {
336 return HttpClient.delete<FlaskBaseResponse>(`/incidents/db_operations/case/data-store/${caseId}/${fileName}`)
337 },
338 + getCaseReportTemplate() {
339 + return HttpClient.get<FlaskBaseResponse & { case_report_template_data_store: string[] }>(
340 + `/incidents/db_operations/case-report-template`
341 + )
342 + },
343 + uploadDefaultCaseReportTemplate() {
344 + return HttpClient.post<FlaskBaseResponse & { case_report_template_data_store: string[] }>(
345 + `/incidents/db_operations/case-report-template/default-template`
346 + )
347 + },
348 + uploadCustomCaseReportTemplate(file: File) {
349 + const form = new FormData()
350 + form.append("file", new Blob([file], { type: file.type }), file.name)
351 +
352 + return HttpClient.post<FlaskBaseResponse & { case_report_template_data_store: CaseReportTemplateDataStore }>(
353 + `/incidents/db_operations/case-report-template/upload`,
354 + form
355 + )
356 + },
357 + downloadCaseReportTemplate(fileName: string) {
358 + return HttpClient.get<Blob>(`/incidents/db_operations/case-report-template/download/${fileName}`, {
359 + responseType: "blob"
360 + })
361 + },
362 + deleteCaseReportTemplate(fileName: string) {
363 + return HttpClient.delete<FlaskBaseResponse>(`/incidents/db_operations/case-report-template/${fileName}`)
364 + },
365 + checkDefaultCaseReportTemplateExists() {
366 + return HttpClient.get<FlaskBaseResponse & { default_template_exists: boolean }>(
367 + `/incidents/db_operations/case-report-template/do-default-template-exists`
368 + )
369 + },
370 + generateCaseReport(payload: CaseReportPayload) {
371 + return HttpClient.post<Blob>(`/incidents/report/generate-report-docx`, payload, {
372 + responseType: "blob"
373 + })
374 + },
375 // #endregion
376
377 // #region Notification
frontend/src/components/incidentManagement/cases/CaseCreationButton.vue
+4 -6
@@ -1,9 +1,9 @@
1 <template>
2 <n-button :size type="primary" :loading="loading" @click="showForm = true">
3 - <template #icon>
3 + <template v-if="showIcon" #icon>
4 <Icon :name="NewCaseIcon" :size="14"></Icon>
5 </template>
6 - <span v-if="!onlyIcon">Create Case</span>
6 + <span>Create Case</span>
7 </n-button>
8
9 <n-modal
@@ -28,17 +28,15 @@ import type { Case } from "@/types/incidentManagement/cases"
28 import type { Size } from "naive-ui/es/button/src/interface"
29 import Icon from "@/components/common/Icon.vue"
30 import { NButton, NModal } from "naive-ui"
31 -import { ref, toRefs, watch } from "vue"
31 +import { ref, watch } from "vue"
32 import CaseCreationForm from "./CaseCreationForm.vue"
33
34 -const props = defineProps<{ onlyIcon?: boolean; size?: Size }>()
34 +const { showIcon, size } = defineProps<{ showIcon?: boolean; size?: Size }>()
35
36 const emit = defineEmits<{
37 (e: "submitted", value: Case): void
38 }>()
39
40 -const { onlyIcon, size } = toRefs(props)
41 -
40 const NewCaseIcon = "carbon:fetch-upload-cloud"
41 const formCTX = ref<{ load: () => void } | null>(null)
42 const showForm = ref(false)
frontend/src/components/incidentManagement/cases/CaseDataStore.vue
+1 -4
@@ -105,10 +105,7 @@ const dataStore = ref<CaseDataStore[]>([])
105 const fileList = ref<UploadFileInfo[]>([])
106 const newFile = computed<File | null>(() => fileList.value?.[0]?.file || null)
107
108 -const isValid = computed(() => {
109 - if (!newFile.value) return false
110 - return true
111 -})
108 +const isValid = computed(() => !!newFile.value)
109
110 function deleteDataStoreFile(dataStoreFile: CaseDataStore) {
111 dataStore.value = dataStore.value.filter(o => o.id !== dataStoreFile.id)
frontend/src/components/incidentManagement/cases/CaseItem.vue
+6 -2
@@ -160,8 +160,11 @@
160 <code class="ml-2">{{ caseEntity.alerts.length }}</code>
161 </template>
162 <template #header-extra>
163 - <div class="actions-box">
164 - <n-button quaternary size="tiny" @click="handleDelete()">Delete Case</n-button>
163 + <div class="actions-box flex gap-2 items-center ml-2">
164 + <n-button quaternary size="tiny" class="!hidden xs:!flex" @click="handleDelete()">
165 + Delete Case
166 + </n-button>
167 + <CaseReportButton :case-id="caseEntity.id" size="tiny" />
168 </div>
169 </template>
170 <div class="flex flex-col gap-2">
@@ -230,6 +233,7 @@ import AssigneeIcon from "../common/AssigneeIcon.vue"
233 import StatusIcon from "../common/StatusIcon.vue"
234 import CaseAssignUser from "./CaseAssignUser.vue"
235 import CaseDetails from "./CaseDetails.vue"
236 +import CaseReportButton from "./CaseReportButton.vue"
237 import CaseStatusSwitch from "./CaseStatusSwitch.vue"
238 import { handleDeleteCase } from "./utils"
239
frontend/src/components/incidentManagement/cases/CaseOverview.vue
+3 -1
@@ -131,13 +131,14 @@
131 </div>
132 </div>
133
134 - <div class="footer-box px-7 py-4 flex justify-end">
134 + <div class="footer-box px-7 py-4 gap-3 flex justify-end">
135 <n-button type="error" secondary @click="handleDelete()">
136 <template #icon>
137 <Icon :name="TrashIcon" />
138 </template>
139 Delete
140 </n-button>
141 + <CaseReportButton :case-id="caseData.id" />
142 </div>
143 </div>
144 </n-spin>
@@ -155,6 +156,7 @@ import { ref, toRefs } from "vue"
156 import AssigneeIcon from "../common/AssigneeIcon.vue"
157 import StatusIcon from "../common/StatusIcon.vue"
158 import CaseAssignUser from "./CaseAssignUser.vue"
159 +import CaseReportButton from "./CaseReportButton.vue"
160 import CaseStatusSwitch from "./CaseStatusSwitch.vue"
161 import { handleDeleteCase } from "./utils"
162
frontend/src/components/incidentManagement/cases/CaseReportButton.vue new
+179
@@ -0,0 +1,179 @@
1 +<template>
2 + <n-button :size type="primary" :loading="exporting" secondary @click="showForm = true">
3 + <template #icon>
4 + <Icon :name="ReportIcon" />
5 + </template>
6 + Generate Report
7 + </n-button>
8 +
9 + <n-modal
10 + v-model:show="showForm"
11 + display-directive="show"
12 + preset="card"
13 + :style="{ maxWidth: 'min(600px, 90vw)', minHeight: 'min(270px, 90vh)', overflow: 'hidden' }"
14 + title="Generate Report"
15 + :bordered="false"
16 + segmented
17 + >
18 + <n-spin :show="exporting" class="creation-report-form">
19 + <n-form ref="formRef" :model="form" :rules="rules">
20 + <div class="flex flex-col gap-2">
21 + <n-form-item label="Template" path="template_name">
22 + <CaseReportTemplateSelect v-model:value="form.template_name" />
23 + </n-form-item>
24 + <n-form-item label="Filename" path="file_name">
25 + <n-input-group>
26 + <n-input
27 + v-model:value.trim="form.file_name"
28 + placeholder="Please insert File Name"
29 + clearable
30 + />
31 + <n-input-group-label>.docx</n-input-group-label>
32 + </n-input-group>
33 + </n-form-item>
34 +
35 + <div class="flex justify-between gap-4 mt-8">
36 + <n-button :disabled="exporting" @click="reset()">Reset</n-button>
37 + <n-button
38 + type="primary"
39 + :disabled="!isValid"
40 + :loading="exporting"
41 + @click="validate(() => exportCases())"
42 + >
43 + Generate
44 + </n-button>
45 + </div>
46 + </div>
47 + </n-form>
48 + </n-spin>
49 + </n-modal>
50 +</template>
51 +
52 +<script setup lang="ts">
53 +import type { CaseReportPayload } from "@/api/endpoints/incidentManagement"
54 +import type { DeepNullable } from "@/types/common"
55 +import type { Size } from "naive-ui/es/button/src/interface"
56 +import Api from "@/api"
57 +import Icon from "@/components/common/Icon.vue"
58 +import { useSettingsStore } from "@/stores/settings"
59 +import { formatDate } from "@/utils"
60 +import { saveAs } from "file-saver"
61 +import {
62 + type FormInst,
63 + type FormRules,
64 + type FormValidationError,
65 + NButton,
66 + NForm,
67 + NFormItem,
68 + NInput,
69 + NInputGroup,
70 + NInputGroupLabel,
71 + NModal,
72 + NSpin,
73 + useMessage
74 +} from "naive-ui"
75 +import { computed, ref } from "vue"
76 +import CaseReportTemplateSelect from "./CaseReportTemplateSelect.vue"
77 +
78 +const { size, caseId } = defineProps<{ size?: Size; caseId: number }>()
79 +
80 +const ReportIcon = "carbon:report-data"
81 +const dFormats = useSettingsStore().dateFormat
82 +const exporting = ref(false)
83 +const showForm = ref(false)
84 +const message = useMessage()
85 +const form = ref<DeepNullable<CaseReportPayload>>(getClearForm())
86 +const formRef = ref<FormInst | null>(null)
87 +
88 +const rules: FormRules = {
89 + template_name: {
90 + required: true,
91 + message: "Please input the Report Template",
92 + trigger: ["input", "blur"]
93 + },
94 + file_name: {
95 + required: true,
96 + message: "Please input the Report Filename",
97 + trigger: ["input", "blur"]
98 + }
99 +}
100 +
101 +const isValid = computed(() => {
102 + if (!form.value.template_name) {
103 + return false
104 + }
105 + if (!form.value.file_name) {
106 + return false
107 + }
108 +
109 + return true
110 +})
111 +
112 +function validate(cb?: () => void) {
113 + if (!formRef.value) return
114 +
115 + formRef.value.validate((errors?: Array<FormValidationError>) => {
116 + if (!errors) {
117 + if (cb) cb()
118 + } else {
119 + message.warning("You must fill in the required fields correctly.")
120 + return false
121 + }
122 + })
123 +}
124 +
125 +function getClearForm(): DeepNullable<CaseReportPayload> {
126 + return {
127 + case_id: caseId,
128 + file_name: null,
129 + template_name: null
130 + }
131 +}
132 +
133 +function reset(force?: boolean) {
134 + if (!exporting.value || force) {
135 + resetForm()
136 + formRef.value?.restoreValidation()
137 + }
138 +}
139 +
140 +function resetForm() {
141 + form.value = getClearForm()
142 +}
143 +
144 +function exportCases() {
145 + if (!form.value.file_name || !form.value.template_name) return
146 +
147 + exporting.value = true
148 +
149 + const fileName = form.value.file_name
150 + ? `${form.value.file_name}.docx`
151 + : `case:${caseId}_report_${formatDate(new Date(), dFormats.datetimesec)}.docx`
152 +
153 + Api.incidentManagement
154 + .generateCaseReport({
155 + case_id: caseId,
156 + file_name: form.value.file_name,
157 + template_name: form.value.template_name
158 + })
159 + .then(res => {
160 + if (res.data) {
161 + saveAs(
162 + new Blob([res.data], {
163 + type: "application/vnd.openxmlformats-officedocument.wordprocessingml.document"
164 + }),
165 + fileName
166 + )
167 + reset(true)
168 + } else {
169 + message.warning("An error occurred. Please try again later.")
170 + }
171 + })
172 + .catch(err => {
173 + message.error(err.response?.data?.message || "An error occurred. Please try again later.")
174 + })
175 + .finally(() => {
176 + exporting.value = false
177 + })
178 +}
179 +</script>
frontend/src/components/incidentManagement/cases/CaseReportTemplateManager.vue new
+292
@@ -0,0 +1,292 @@
1 +<template>
2 + <n-spin :show="loading" class="flex flex-col grow min-h-48" content-class="flex flex-col grow gap-4">
3 + <div>
4 + <n-collapse-transition :show="!showUploadForm">
5 + <div class="flex items-center gap-3 flex-wrap">
6 + <n-button v-if="templateNameList.length" type="primary" @click="openUploadForm()">
7 + <template #icon>
8 + <Icon :name="UploadIcon" />
9 + </template>
10 + Upload Report Template file
11 + </n-button>
12 +
13 + <n-button
14 + v-if="!isDefaultTemplatePresent && templateNameList.length"
15 + :loading="checkingDefaultTemplate"
16 + @click="uploadDefaultTemplate()"
17 + >
18 + <template #icon>
19 + <Icon :name="DefaultTemplateIcon" />
20 + </template>
21 + Load the SOCFortress Template
22 + </n-button>
23 + </div>
24 + </n-collapse-transition>
25 +
26 + <n-collapse-transition :show="showUploadForm">
27 + <div class="flex flex-col gap-2">
28 + <n-upload
29 + v-model:file-list="fileList"
30 + :max="1"
31 + :disabled="uploading"
32 + accept="application/vnd.openxmlformats-officedocument.wordprocessingml.document, .docx, .DOCX"
33 + >
34 + <n-upload-dragger>
35 + <div>
36 + <Icon :name="UploadIcon" :size="28" :depth="3"></Icon>
37 + </div>
38 + <div class="font-semibold">Click or drag a file to this area to upload</div>
39 + <p class="mt-2">Only .docx files are accepted</p>
40 + </n-upload-dragger>
41 + </n-upload>
42 +
43 + <div class="flex items-center justify-end gap-3">
44 + <n-button quaternary :disabled="uploading" @click="closeUploadForm()">Close</n-button>
45 +
46 + <n-button
47 + :disabled="!isValid"
48 + :loading="uploading"
49 + type="primary"
50 + @click="uploadCustomTemplate()"
51 + >
52 + <template #icon>
53 + <Icon :name="UploadIcon" />
54 + </template>
55 +
56 + Upload
57 + </n-button>
58 + </div>
59 + </div>
60 + </n-collapse-transition>
61 + </div>
62 +
63 + <div class="flex flex-col gap-2">
64 + <template v-if="templateNameList.length">
65 + <n-card
66 + v-for="templateName of templateNameList"
67 + :key="templateName"
68 + size="small"
69 + class="overflow-hidden"
70 + content-class="flex justify-between items-center bg-secondary-color flex-wrap gap-4"
71 + >
72 + <div class="flex gap-3">
73 + <n-tooltip to="body">
74 + <template #trigger>
75 + <n-button
76 + size="tiny"
77 + type="primary"
78 + text
79 + :loading="downloading === templateName"
80 + @click="downloadTemplate(templateName)"
81 + >
82 + <template #icon>
83 + <Icon :name="DownloadIcon" />
84 + </template>
85 + </n-button>
86 + </template>
87 + Download
88 + </n-tooltip>
89 + <span>
90 + {{ templateName }}
91 + </span>
92 + </div>
93 +
94 + <n-popconfirm to="body" @positive-click="deleteTemplate(templateName)">
95 + <template #trigger>
96 + <n-button quaternary size="tiny">Delete</n-button>
97 + </template>
98 + Are you sure you want to delete this template?
99 + </n-popconfirm>
100 + </n-card>
101 + </template>
102 + <template v-else>
103 + <n-collapse-transition :show="!showUploadForm">
104 + <n-empty v-if="!loading" class="min-h-48">
105 + <div class="flex flex-col items-center gap-4">
106 + <p>No templates found</p>
107 + <div class="flex items-center gap-3 flex-wrap">
108 + <n-button type="primary" :loading="uploading" @click="openUploadForm()">
109 + <template #icon>
110 + <Icon :name="UploadIcon" />
111 + </template>
112 + Upload a Report Template file
113 + </n-button>
114 + <n-button :loading="uploading" @click="uploadDefaultTemplate()">
115 + <template #icon>
116 + <Icon :name="DefaultTemplateIcon" />
117 + </template>
118 + Load the SOCFortress Template
119 + </n-button>
120 + </div>
121 + </div>
122 + </n-empty>
123 + </n-collapse-transition>
124 + </template>
125 + </div>
126 + </n-spin>
127 +</template>
128 +
129 +<script setup lang="ts">
130 +import Api from "@/api"
131 +import Icon from "@/components/common/Icon.vue"
132 +import { useCaseReportTemplateStore } from "@/stores/caseReportTemplate"
133 +import saveAs from "file-saver"
134 +import {
135 + NButton,
136 + NCard,
137 + NCollapseTransition,
138 + NEmpty,
139 + NPopconfirm,
140 + NSpin,
141 + NTooltip,
142 + NUpload,
143 + NUploadDragger,
144 + type UploadFileInfo,
145 + useMessage
146 +} from "naive-ui"
147 +import { computed, onBeforeMount, ref, watch } from "vue"
148 +
149 +const UploadIcon = "carbon:cloud-upload"
150 +const DownloadIcon = "carbon:document-download"
151 +const DefaultTemplateIcon = "carbon:document-sketch"
152 +const caseReportTemplateStore = useCaseReportTemplateStore()
153 +const message = useMessage()
154 +const loadingList = computed(() => caseReportTemplateStore.loading)
155 +const uploading = ref(false)
156 +const canceling = ref(false)
157 +const checkingDefaultTemplate = ref(false)
158 +const downloading = ref<false | string>(false)
159 +const loading = computed(() => loadingList.value || uploading.value || canceling.value)
160 +const showUploadForm = ref(false)
161 +const templateNameList = computed(() => caseReportTemplateStore.templatesList)
162 +const fileList = ref<UploadFileInfo[]>([])
163 +const newFile = computed<File | null>(() => fileList.value?.[0]?.file || null)
164 +const isValid = computed(() => !!newFile.value)
165 +const isDefaultTemplatePresent = ref(true)
166 +
167 +function openUploadForm() {
168 + showUploadForm.value = true
169 +}
170 +
171 +function closeUploadForm() {
172 + showUploadForm.value = false
173 +}
174 +
175 +function uploadCustomTemplate() {
176 + if (!newFile.value) return
177 +
178 + uploading.value = true
179 +
180 + caseReportTemplateStore
181 + .uploadCustomTemplate(newFile.value)
182 + .then(res => {
183 + if (res.data.success) {
184 + message.success(res.data?.message || "Case Report Template uploaded successfully")
185 + fileList.value = []
186 + } else {
187 + message.warning(res.data?.message || "An error occurred. Please try again later.")
188 + }
189 + })
190 + .catch(err => {
191 + message.error(err.response?.data?.message || "An error occurred. Please try again later.")
192 + })
193 + .finally(() => {
194 + uploading.value = false
195 + })
196 +}
197 +
198 +function uploadDefaultTemplate() {
199 + uploading.value = true
200 +
201 + Api.incidentManagement
202 + .uploadDefaultCaseReportTemplate()
203 + .then(res => {
204 + if (res.data.success) {
205 + message.success(res.data?.message || "Case Report Template uploaded successfully")
206 + refreshTemplates()
207 + } else {
208 + message.warning(res.data?.message || "An error occurred. Please try again later.")
209 + }
210 + })
211 + .catch(err => {
212 + message.error(err.response?.data?.message || "An error occurred. Please try again later.")
213 + })
214 + .finally(() => {
215 + uploading.value = false
216 + })
217 +}
218 +
219 +function checkDefaultCaseReportTemplateExists() {
220 + checkingDefaultTemplate.value = true
221 +
222 + Api.incidentManagement
223 + .checkDefaultCaseReportTemplateExists()
224 + .then(res => {
225 + if (res.data.success) {
226 + isDefaultTemplatePresent.value = res.data.default_template_exists
227 + } else {
228 + message.warning(res.data?.message || "An error occurred. Please try again later.")
229 + }
230 + })
231 + .catch(err => {
232 + message.error(err.response?.data?.message || "An error occurred. Please try again later.")
233 + })
234 + .finally(() => {
235 + checkingDefaultTemplate.value = false
236 + })
237 +}
238 +
239 +function downloadTemplate(templateName: string) {
240 + downloading.value = templateName
241 +
242 + Api.incidentManagement
243 + .downloadCaseReportTemplate(templateName)
244 + .then(res => {
245 + if (res.data) {
246 + saveAs(res.data, templateName)
247 + } else {
248 + message.warning("An error occurred. Please try again later.")
249 + }
250 + })
251 + .catch(err => {
252 + message.error(err.response?.data?.message || "An error occurred. Please try again later.")
253 + })
254 + .finally(() => {
255 + downloading.value = false
256 + })
257 +}
258 +
259 +function deleteTemplate(templateName: string) {
260 + canceling.value = true
261 +
262 + caseReportTemplateStore
263 + .deleteTemplate(templateName)
264 + .then(res => {
265 + if (res.data.success) {
266 + message.success(res.data?.message || "Case Report Template deleted successfully")
267 + } else {
268 + message.warning(res.data?.message || "An error occurred. Please try again later.")
269 + }
270 + })
271 + .catch(err => {
272 + message.error(err.response?.data?.message || "An error occurred. Please try again later.")
273 + })
274 + .finally(() => {
275 + canceling.value = false
276 + })
277 +}
278 +
279 +function refreshTemplates() {
280 + caseReportTemplateStore.refreshTemplates().catch(err => {
281 + message.error(err.response?.data?.message || "An error occurred. Please try again later.")
282 + })
283 +}
284 +
285 +watch(templateNameList, () => {
286 + checkDefaultCaseReportTemplateExists()
287 +})
288 +
289 +onBeforeMount(() => {
290 + refreshTemplates()
291 +})
292 +</script>
frontend/src/components/incidentManagement/cases/CaseReportTemplateSelect.vue new
+50
@@ -0,0 +1,50 @@
1 +<template>
2 + <n-input-group>
3 + <n-select
4 + v-model:value="templateName"
5 + :options="templateNameOptions"
6 + placeholder="Select..."
7 + clearable
8 + :loading="loadingOptions"
9 + class="overflow-hidden"
10 + />
11 + <n-button secondary @click="showManagerDialog = true">
12 + <template #icon>
13 + <Icon :name="SettingsIcon" />
14 + </template>
15 + </n-button>
16 + </n-input-group>
17 +
18 + <n-modal
19 + v-model:show="showManagerDialog"
20 + display-directive="show"
21 + preset="card"
22 + :style="{ maxWidth: 'min(600px, 90vw)', minHeight: 'min(270px, 90vh)', overflow: 'hidden' }"
23 + title="Report templates manager"
24 + :bordered="false"
25 + segmented
26 + >
27 + <CaseReportTemplateManager />
28 + </n-modal>
29 +</template>
30 +
31 +<script setup lang="ts">
32 +import Icon from "@/components/common/Icon.vue"
33 +import { useCaseReportTemplateStore } from "@/stores/caseReportTemplate"
34 +import { NButton, NInputGroup, NModal, NSelect } from "naive-ui"
35 +import { computed, onBeforeMount, ref } from "vue"
36 +import CaseReportTemplateManager from "./CaseReportTemplateManager.vue"
37 +
38 +const templateName = defineModel<string | null>("value", { default: null })
39 +
40 +const SettingsIcon = "carbon:settings"
41 +const showManagerDialog = ref(false)
42 +const caseReportTemplateStore = useCaseReportTemplateStore()
43 +const loadingOptions = computed(() => caseReportTemplateStore.loading)
44 +const templateNameList = computed(() => caseReportTemplateStore.templatesList)
45 +const templateNameOptions = computed(() => templateNameList.value.map(item => ({ label: item, value: item })))
46 +
47 +onBeforeMount(() => {
48 + caseReportTemplateStore.init()
49 +})
50 +</script>
frontend/src/components/incidentManagement/cases/CasesExport.vue
+2 -2
@@ -1,7 +1,7 @@
1 <template>
2 <n-dropdown placement="bottom-start" trigger="click" :options="customersOptions" @select="exportCases">
3 <n-button :size :loading="exporting" secondary @click="load()">
4 - <template #icon>
4 + <template v-if="showIcon" #icon>
5 <Icon :name="DownloadIcon" :size="14" />
6 </template>
7 Export
@@ -20,7 +20,7 @@ import { saveAs } from "file-saver"
20 import { NButton, NDropdown, useMessage } from "naive-ui"
21 import { computed, inject, ref, type Ref } from "vue"
22
23 -const { size } = defineProps<{ size?: Size }>()
23 +const { size, showIcon } = defineProps<{ size?: Size; showIcon?: boolean }>()
24
25 const DownloadIcon = "carbon:cloud-download"
26 const loadingCustomersList = ref(false)
frontend/src/components/incidentManagement/cases/CasesList.vue
+30 -5
@@ -36,9 +36,30 @@
36 </div>
37 </n-popover>
38
39 - <CasesExport size="small" />
39 + <n-popover v-if="showMobileMenu" overlap placement="left" display-directive="show">
40 + <template #trigger>
41 + <div class="bg-color border-radius">
42 + <n-button size="small" class="!cursor-pointer">
43 + <template #icon>
44 + <Icon :name="MenuIcon"></Icon>
45 + </template>
46 + </n-button>
47 + </div>
48 + </template>
49 + <div class="flex flex-col gap-2 py-1">
50 + <CasesExport show-icon size="small" />
51 + <CaseCreationButton show-icon size="small" @submitted="getData()" />
52 + </div>
53 + </n-popover>
54
41 - <CaseCreationButton :only-icon="caseCreationButtonOnlyIcon" size="small" @submitted="getData()" />
55 + <CasesExport v-if="!showMobileMenu" :show-icon="caseExportButtonShowIcon" size="small" />
56 +
57 + <CaseCreationButton
58 + v-if="!showMobileMenu"
59 + :show-icon="caseCreationButtonShowIcon"
60 + size="small"
61 + @submitted="getData()"
62 + />
63 </div>
64 <n-pagination
65 v-model:page="currentPage"
@@ -201,7 +222,9 @@ const customersList = ref<Customer[]>([])
222 const pageSize = ref(25)
223 const currentPage = ref(1)
224 const simpleMode = ref(false)
204 -const caseCreationButtonOnlyIcon = ref(false)
225 +const caseCreationButtonShowIcon = ref(false)
226 +const caseExportButtonShowIcon = ref(false)
227 +const showMobileMenu = ref(false)
228 const showSizePicker = ref(true)
229 const pageSizes = [10, 25, 50, 100]
230 const header = ref()
@@ -217,6 +240,7 @@ const itemsPaginated = computed(() => {
240 })
241
242 const FilterIcon = "carbon:filter-edit"
243 +const MenuIcon = "carbon:overflow-menu-horizontal"
244 const InfoIcon = "carbon:information"
245
246 const total = computed<number>(() => {
@@ -390,8 +414,9 @@ useResizeObserver(header, entries => {
414
415 pageSlot.value = width < 700 ? 5 : 8
416 simpleMode.value = width < 550
393 -
394 - caseCreationButtonOnlyIcon.value = (width < 580 && width > 549) || width < 390
417 + caseCreationButtonShowIcon.value = width >= 580
418 + caseExportButtonShowIcon.value = width >= 580
419 + showMobileMenu.value = width <= 420
420 })
421
422 onBeforeMount(() => {
frontend/src/stores/caseReportTemplate.ts new
+94
@@ -0,0 +1,94 @@
1 +import type { FlaskBaseResponse } from "@/types/flask"
2 +import type { AxiosResponse } from "axios"
3 +import Api from "@/api"
4 +import { acceptHMRUpdate, defineStore } from "pinia"
5 +
6 +export const useCaseReportTemplateStore = defineStore("caseReportTemplate", {
7 + state: () => ({
8 + templatesList: [] as string[],
9 + checkedAt: 0,
10 + loading: false
11 + }),
12 + actions: {
13 + init() {
14 + if (!this.checkedAt && !this.loading) {
15 + this.refreshTemplates()
16 + }
17 + },
18 + setTemplatesList(templatesList: string[]) {
19 + this.templatesList = templatesList
20 + this.checkedAt = new Date().getTime()
21 + },
22 + addTemplate(templateName: string) {
23 + this.templatesList.push(templateName)
24 + this.checkedAt = new Date().getTime()
25 + },
26 + removeTemplate(templateName: string) {
27 + this.templatesList = this.templatesList.filter(o => o !== templateName)
28 + this.checkedAt = new Date().getTime()
29 + },
30 + setLoading(value: boolean) {
31 + this.loading = value
32 + },
33 + refreshTemplates(): Promise<AxiosResponse<FlaskBaseResponse>> {
34 + return new Promise((resolve, reject) => {
35 + this.setLoading(true)
36 +
37 + Api.incidentManagement
38 + .getCaseReportTemplate()
39 + .then(res => {
40 + if (res.data.success) {
41 + this.setTemplatesList(res.data.case_report_template_data_store)
42 + resolve(res)
43 + } else {
44 + reject(res)
45 + }
46 + })
47 + .catch(err => {
48 + reject(err)
49 + })
50 + .finally(() => {
51 + this.setLoading(false)
52 + })
53 + })
54 + },
55 + uploadCustomTemplate(file: File): Promise<AxiosResponse<FlaskBaseResponse>> {
56 + return new Promise((resolve, reject) => {
57 + Api.incidentManagement
58 + .uploadCustomCaseReportTemplate(file)
59 + .then(res => {
60 + if (res.data.success) {
61 + this.addTemplate(res.data.case_report_template_data_store.file_name)
62 + resolve(res)
63 + } else {
64 + reject(res)
65 + }
66 + })
67 + .catch(err => {
68 + reject(err)
69 + })
70 + })
71 + },
72 + deleteTemplate(templateName: string): Promise<AxiosResponse<FlaskBaseResponse>> {
73 + return new Promise((resolve, reject) => {
74 + Api.incidentManagement
75 + .deleteCaseReportTemplate(templateName)
76 + .then(res => {
77 + if (res.data.success) {
78 + this.removeTemplate(templateName)
79 + resolve(res)
80 + } else {
81 + reject(res)
82 + }
83 + })
84 + .catch(err => {
85 + reject(err)
86 + })
87 + })
88 + }
89 + }
90 +})
91 +
92 +if (import.meta.hot) {
93 + import.meta.hot.accept(acceptHMRUpdate(useCaseReportTemplateStore, import.meta.hot))
94 +}
frontend/src/types/common.d.ts
+3
@@ -6,3 +6,6 @@ export type OsTypesLower = "linux" | "windows" | "macos"
6 export type SafeAny = string | number | object
7 export type ApiError = AxiosError<FlaskBaseResponse>
8 export type ApiCommonResponse<T = unknown> = AxiosResponse<FlaskBaseResponse & T>
9 +export type DeepNullable<T> = {
10 + [K in keyof T]: DeepNullable<T[K]> | null
11 +}
frontend/src/types/incidentManagement/cases.d.ts
+12
@@ -26,3 +26,15 @@ export interface CaseDataStore {
26 upload_time: Date
27 file_hash: string
28 }
29 +
30 +export interface CaseReportTemplateDataStore {
31 + id: number
32 + report_template_name: string
33 + bucket_name: string
34 + object_key: string
35 + file_name: string
36 + content_type: string
37 + file_size: number
38 + upload_time: Date
39 + file_hash: string
40 +}