@cryptotaxi247 / CoPilot / commits / 49d3716b

Web app scan (#244)

* add nuclei integration logic for backend * feat: Add wazuh-states-vulnerabilities index to skip list * chore: Remove 'custom' field from data_dict in invoke_active_response_route * chore: Update error message for failed pipeline ID retrieval * modified grafana verification to create and delete test user * add tool verification checks prior to customer wazuh provision * chore: Update default value for dfir_iris_username in ProvisionNewCustomer schema * updated FE configuration * refactor types * updated dependencies * added web-vulnerability-assessment api/types * added web-vulnerability-assessment page * updated overview page * update: web-vulnerability-assessment page * chore: Update CrowdStrike API settings in markdown file * update: markdown component * update: vulnerability item modal * chore: Add delete_report endpoint to Nuclei integration * chore: Update delete_report endpoint URL in Nuclei integration * update: dependencies * update: report item component added delete feature * improve: PinnedPage component * update: url match * chore: Update Nuclei integration endpoints to use copilot-nuclei-module URL * precommit fixes * update: precommit * update: precommit eslint version * Auto stash before merge of "main" and "origin/main" --------- Co-authored-by: Davide Di Modica <webmaster.ddm@gmail.com>

taylor_socfortress committed Jun 18, 2024 at 09:23 UTC 49d3716be01fe6e0508eeb764a4f5f38b663a252
75 files changed +2764 -1266
.gitignore
+1
@@ -60,6 +60,7 @@ backend/app/integrations/office365/services/wazuh_config.xml
60
61 frontend/src/unplugin.components.d.ts
62 frontend/cypress/screenshots/
63 +frontend/cypress/downloads/
64 frontend/tsconfig.app.tsbuildinfo
65 frontend/tsconfig.node.tsbuildinfo
66 frontend/tsconfig.vitest.tsbuildinfo
.pre-commit-config.yaml
+2 -8
@@ -51,14 +51,8 @@ repos:
51 - id: prettier
52
53 - repo: https://github.com/pre-commit/mirrors-eslint
54 - rev: v8.41.0
54 + rev: v9.5.0
55 hooks:
56 - id: eslint
57 files: \.([cjt]sx?|[cm]ts|[cm]js|cvue)$ # *.js, *.jsx, *.ts, *.tsx and *.vue
58 - additional_dependencies:
59 - - "@rushstack/eslint-patch@1.2.0"
60 - - eslint@8.41.0
61 - - "@vue/eslint-config-prettier@7.1.0"
62 - - "@vue/eslint-config-typescript@11.0.2"
63 - - eslint-plugin-cypress@2.13.3
64 - - eslint-plugin-vue@9.11.1
58 + args: ["--config", "frontend/eslint.config.js"]
.vscode/settings.json
+5
@@ -3,16 +3,19 @@
3 "ajoelp",
4 "apexchart",
5 "arcticons",
6 + "artifactstring",
7 "CARBONBLACK",
8 "clickoutside",
9 "cmdline",
10 "colord",
11 "commonmark",
12 + "creationdate",
13 "datejs",
14 "datetimesec",
15 "DFIR",
16 "echarts",
17 "epss",
18 + "ESTAB",
19 "eventchannel",
20 "Eventdata",
21 "falsepositives",
@@ -24,6 +27,7 @@
27 "hoverable",
28 "iconoir",
29 "Indicies",
30 + "lastupdate",
31 "Logsource",
32 "majesticons",
33 "mimecast",
@@ -50,6 +54,7 @@
54 "timerange",
55 "timesec",
56 "tsbuildinfo",
57 + "unocss",
58 "uvicorn",
59 "venv",
60 "virustotal",
backend/app/active_response/routes/active_response.py
+1 -1
@@ -156,7 +156,7 @@ async def invoke_active_response_route(
156 # Append '0' to the command - This is required for Wazuh Active Response
157 request.command = f"{request.command.value}0"
158 # Create a dictionary with the request data
159 - data_dict = {"command": request.command, "custom": request.custom, "arguments": request.arguments, "alert": request.alert}
159 + data_dict = {"command": request.command, "arguments": request.arguments, "alert": request.alert}
160 await send_put_request(
161 endpoint=request.endpoint,
162 data=json.dumps(data_dict),
backend/app/connectors/dfir_iris/utils/universal.py
+10
@@ -40,6 +40,16 @@ async def verify_dfir_iris_credentials(attributes: Dict[str, Any]) -> Dict[str,
40 headers=headers,
41 verify=False,
42 )
43 + # See if 401 is returned
44 + if dfir_iris.status_code == 401:
45 + logger.info(
46 + f"Connection to {attributes['connector_url']} unauthorized",
47 + )
48 + logger.debug("DFIR-IRIS connection unauthorized")
49 + return {
50 + "connectionSuccessful": False,
51 + "message": "DFIR-IRIS connection unauthorized",
52 + }
53 # See if 200 is returned
54 if dfir_iris.status_code == 200:
55 logger.info(
backend/app/connectors/grafana/utils/universal.py
+11 -10
@@ -5,7 +5,6 @@ from fastapi import HTTPException
5 from grafana_client import GrafanaApi
6 from loguru import logger
7
8 -from app.connectors.grafana.schema.organization import GrafanaCreateOrganizationResponse
8 from app.connectors.utils import get_connector_info_from_db
9 from app.db.db_session import get_db_session
10
@@ -52,19 +51,21 @@ async def verify_grafana_credentials(attributes: Dict[str, Any]) -> Dict[str, An
51
52 grafana_client = GrafanaApi.from_url(grafana_url)
53 try:
55 - create_org = grafana_client.organization.create_organization(
56 - organization={
57 - "name": "CoPilot Auth Test",
54 + create_user = grafana_client.admin.create_user(
55 + user={
56 + "name": "test",
57 + "email": "test@socfortress.co",
58 + "login": "test",
59 + "password": "this_is_a_test_user",
60 + "OrgID": 1,
61 },
62 )
60 - logger.info(f"Create organization: {create_org}")
63 + if create_user["message"] != "User created":
64 + raise Exception(f"Failed to create user: {create_user['message']}")
65
62 - create_org = GrafanaCreateOrganizationResponse(**create_org)
63 -
64 - remove_org = grafana_client.organizations.delete_organization(
65 - organization_id=create_org.orgId,
66 + grafana_client.admin.delete_user(
67 + user_id=create_user["id"],
68 )
67 - logger.info(f"Remove organization: {remove_org}")
69
70 logger.info(f"Connection to {grafana_url} successful")
71 return {
backend/app/connectors/wazuh_indexer/schema/indices.py
+2
@@ -22,6 +22,8 @@ class IndexConfigModel(BaseModel):
22 "filebeat": True,
23 ".tasks": True,
24 ".task": True,
25 + "wazuh-states-vulnerabilities": True,
26 + ".plugins": True,
27 },
28 description="A dictionary containing index names to be skipped and their skip status.",
29 )
backend/app/customer_provisioning/schema/provision.py
+1 -1
@@ -87,7 +87,7 @@ class ProvisionNewCustomer(BaseModel):
87 description="ID of the DFIR Iris customer",
88 )
89 dfir_iris_username: Optional[str] = Field(
90 - None,
90 + "administrator",
91 description="Username of the DFIR Iris customer",
92 )
93 graylog_index_id: Optional[str] = Field(
backend/app/customer_provisioning/services/graylog.py
+5 -1
@@ -206,7 +206,11 @@ async def get_pipeline_id(subscription: str) -> str:
206 logger.error(f"Failed to get pipeline ID for subscription {subscription}")
207 raise HTTPException(
208 status_code=500,
209 - detail=f"Failed to get pipeline ID for subscription {subscription}",
209 + detail=(
210 + f"Failed to get pipeline ID for subscription {subscription}. "
211 + "Please ensure you have installed the SOCFortress Wazuh Content Pack. "
212 + "See more at: https://youtu.be/euFrHP0VkD8?si=ajqjNobHvBjrTzAH"
213 + ),
214 )
215 else:
216 logger.error(f"Failed to get pipelines: {pipelines_response.message}")
backend/app/customer_provisioning/services/provision.py
+28 -1
@@ -1,11 +1,17 @@
1 +from typing import Callable
2 +
3 import requests
4 from fastapi import HTTPException
5 from loguru import logger
6 from sqlalchemy.ext.asyncio import AsyncSession
7
8 +from app.connectors.dfir_iris.utils.universal import verify_dfir_iris_connection
9 from app.connectors.grafana.schema.dashboards import DashboardProvisionRequest
10 from app.connectors.grafana.services.dashboards import provision_dashboards
11 +from app.connectors.grafana.utils.universal import verify_grafana_connection
12 from app.connectors.graylog.services.management import start_stream
13 +from app.connectors.graylog.utils.universal import verify_graylog_connection
14 +from app.connectors.wazuh_manager.utils.universal import verify_wazuh_manager_connection
15 from app.customer_provisioning.schema.graylog import StreamConnectionToPipelineRequest
16 from app.customer_provisioning.schema.provision import CustomerProvisionMeta
17 from app.customer_provisioning.schema.provision import CustomerProvisionResponse
@@ -31,6 +37,26 @@ from app.integrations.alert_creation_settings.models.alert_creation_settings imp
37 from app.utils import get_connector_attribute
38
39
40 +async def verify_connection(service_name: str, verify_connection_func: Callable) -> None:
41 + connection = await verify_connection_func(service_name)
42 + if connection["connectionSuccessful"] is False:
43 + raise HTTPException(
44 + status_code=500,
45 + detail=f"Failed to connect to {service_name}. {service_name} connection must be established to proceed.",
46 + )
47 +
48 +
49 +async def verify_required_tools() -> None:
50 + """
51 + Verify the required tools for customer provisioning.
52 + """
53 + logger.info("Verifying required tools")
54 + await verify_connection("Graylog", verify_graylog_connection)
55 + await verify_connection("Wazuh-Manager", verify_wazuh_manager_connection)
56 + await verify_connection("Grafana", verify_grafana_connection)
57 + await verify_connection("DFIR-IRIS", verify_dfir_iris_connection)
58 +
59 +
60 # ! MAIN FUNCTION ! #
61 async def provision_wazuh_customer(
62 request: ProvisionNewCustomer,
@@ -50,12 +76,13 @@ async def provision_wazuh_customer(
76 Returns:
77 CustomerProvisionResponse: The response object containing the provisioned customer's information
78 """
79 + await verify_required_tools()
80 logger.info(f"Provisioning new customer {request}")
81 # Initialize an empty dictionary to store the meta data
82 provision_meta_data = {}
83 + provision_meta_data["pipeline_ids"] = await get_pipeline_id(subscription="Wazuh")
84 provision_meta_data["index_set_id"] = (await create_index_set(request)).data.id
85 provision_meta_data["stream_id"] = (await create_event_stream(request, provision_meta_data["index_set_id"])).data.stream_id
58 - provision_meta_data["pipeline_ids"] = await get_pipeline_id(subscription="Wazuh")
86 stream_and_pipeline = StreamConnectionToPipelineRequest(
87 stream_id=provision_meta_data["stream_id"],
88 pipeline_ids=provision_meta_data["pipeline_ids"],
backend/app/integrations/markdown/crowdstrike.md
-2
@@ -8,8 +8,6 @@ Before using the Falcon SIEM Connector, you’ll want to first define the API cl
8
9 ![Crowdstrike API Settings](/images/crowdstrike/crowdstrike_api_settings.png)
10
11 -<!-- Running the Crowdstrike-Connector Container -->
12 -
11 ## Configuration
12
13 The configuration for our API creds and syslog forwarder settings are stored within `/opt/crowdstrike/etc/cs.falconhoseclient.cfg`. Adjust to make your changes. **NOTE that the `api_url` , `cliend_id` , `client_secret` , and `syslog_host` will need to be updated.** Below is an example, CoPilot will take care of this for you.
backend/app/integrations/nuclei/routes/nuclei.py new
+40
@@ -0,0 +1,40 @@
1 +from fastapi import APIRouter
2 +from loguru import logger
3 +
4 +from app.integrations.nuclei.schema.nuclei import DeleteNucleiReportResponse
5 +from app.integrations.nuclei.schema.nuclei import NucleiReportCollectionResponse
6 +from app.integrations.nuclei.schema.nuclei import NucleiReportsAvailableResponse
7 +from app.integrations.nuclei.schema.nuclei import NucleiScanRequest
8 +from app.integrations.nuclei.schema.nuclei import NucleiScanResponse
9 +from app.integrations.nuclei.services.nuclei import delete_nuclei_report
10 +from app.integrations.nuclei.services.nuclei import get_nuclei_report
11 +from app.integrations.nuclei.services.nuclei import get_nuclei_reports_available
12 +from app.integrations.nuclei.services.nuclei import post_to_copilot_nuclei_module
13 +
14 +integration_nuclei_router = APIRouter()
15 +
16 +
17 +@integration_nuclei_router.get("/all_reports", response_model=NucleiReportsAvailableResponse)
18 +async def get_all_reports():
19 + logger.info("Collecting Nuclei Reports")
20 + return await get_nuclei_reports_available()
21 +
22 +
23 +@integration_nuclei_router.get("/report/{host}/{report}", response_model=NucleiReportCollectionResponse)
24 +async def get_report(host: str, report: str = "index.md"):
25 + logger.info(f"Getting Nuclei Report for {host} and {report}")
26 + return await get_nuclei_report(host, report)
27 +
28 +
29 +@integration_nuclei_router.post("/scan", response_model=NucleiScanResponse)
30 +async def post_test(
31 + request: NucleiScanRequest,
32 +):
33 + logger.info(f"Running Nuclei Scan for {request.host}")
34 + return await post_to_copilot_nuclei_module(request)
35 +
36 +
37 +@integration_nuclei_router.delete("/delete_report/{host}", response_model=DeleteNucleiReportResponse)
38 +async def delete_report(host: str):
39 + logger.info(f"Deleting Nuclei Report for {host}")
40 + return await delete_nuclei_report(host)
backend/app/integrations/nuclei/schema/nuclei.py new
+30
@@ -0,0 +1,30 @@
1 +from typing import List
2 +
3 +from pydantic import BaseModel
4 +from pydantic import Field
5 +
6 +
7 +class NucleiScanRequest(BaseModel):
8 + host: str = Field(..., title="Host", description="Host to scan")
9 +
10 +
11 +class NucleiScanResponse(BaseModel):
12 + message: str
13 + success: bool
14 +
15 +
16 +class NucleiReportsAvailableResponse(BaseModel):
17 + reports: List[str] = Field(..., title="Reports", description="Reports available")
18 + success: bool
19 + message: str
20 +
21 +
22 +class NucleiReportCollectionResponse(BaseModel):
23 + markdown: str
24 + success: bool
25 + message: str
26 +
27 +
28 +class DeleteNucleiReportResponse(BaseModel):
29 + success: bool
30 + message: str
backend/app/integrations/nuclei/services/nuclei.py new
+84
@@ -0,0 +1,84 @@
1 +import httpx
2 +from fastapi import HTTPException
3 +from loguru import logger
4 +
5 +from app.integrations.nuclei.schema.nuclei import DeleteNucleiReportResponse
6 +from app.integrations.nuclei.schema.nuclei import NucleiReportCollectionResponse
7 +from app.integrations.nuclei.schema.nuclei import NucleiReportsAvailableResponse
8 +from app.integrations.nuclei.schema.nuclei import NucleiScanRequest
9 +from app.integrations.nuclei.schema.nuclei import NucleiScanResponse
10 +
11 +
12 +async def get_nuclei_reports_available() -> NucleiReportsAvailableResponse:
13 + """
14 + Retrieve the list of available Nuclei reports.
15 +
16 + Returns:
17 + NucleiReportsAvailableResponse: The response containing the list of available Nuclei reports.
18 + """
19 + logger.info("Sending GET request to http://copilot-nuclei-module/all_reports")
20 + async with httpx.AsyncClient() as client:
21 + response = await client.get("http://copilot-nuclei-module/all_reports")
22 + if response.status_code == 404:
23 + raise HTTPException(status_code=404, detail="Nuclei reports not found")
24 + response.raise_for_status() # Raise an exception if the request was unsuccessful
25 + return NucleiReportsAvailableResponse(**response.json())
26 +
27 +
28 +async def get_nuclei_report(host: str, report: str = "index.md") -> NucleiReportCollectionResponse:
29 + """
30 + Retrieve a specific Nuclei report.
31 +
32 + Args:
33 + host (str): The host to retrieve the report for.
34 + report (str): The report to retrieve. Defaults to "index.md".
35 +
36 + Returns:
37 + NucleiReportCollectionResponse: The response containing the Nuclei report.
38 + """
39 + logger.info(f"Sending GET request to http://copilot-nuclei-module/report/{host}/{report}")
40 + async with httpx.AsyncClient() as client:
41 + response = await client.get(f"http://copilot-nuclei-module/report/{host}/{report}")
42 +
43 + if response.status_code == 404:
44 + raise HTTPException(status_code=404, detail="Nuclei report not found")
45 +
46 + response.raise_for_status() # Raise an exception if the request was unsuccessful
47 + return NucleiReportCollectionResponse(**response.json())
48 +
49 +
50 +async def delete_nuclei_report(host: str) -> DeleteNucleiReportResponse:
51 + """
52 + Delete a specific Nuclei report.
53 +
54 + Args:
55 + host (str): The host to delete the report for.
56 +
57 + Returns:
58 + DeleteNucleiReportResponse: The response containing the result of the deletion.
59 + """
60 + logger.info(f"Sending DELETE request to http://copilot-nuclei-module/report/{host}")
61 + async with httpx.AsyncClient() as client:
62 + response = await client.delete(f"http://copilot-nuclei-module/report/{host}")
63 +
64 + if response.status_code == 404:
65 + raise HTTPException(status_code=404, detail="Nuclei report not found")
66 + return DeleteNucleiReportResponse(**response.json())
67 +
68 +
69 +async def post_to_copilot_nuclei_module(data: NucleiScanRequest) -> NucleiScanResponse:
70 + """
71 + Send a POST request to the copilot-nuclei-module Docker container.
72 +
73 + Args:
74 + data (NucleiScanRequest): The data to send to the copilot-nuclei-module Docker container.
75 + """
76 + logger.info(f"Sending POST request to http://copilot-nuclei-module/scan with data: {data.dict()}")
77 + # raise HTTPException(status_code=501, detail="Not Implemented Yet")
78 + async with httpx.AsyncClient() as client:
79 + data = await client.post(
80 + "http://copilot-nuclei-module/scan",
81 + json=data.dict(),
82 + timeout=120,
83 + )
84 + return NucleiScanResponse(**data.json())
backend/app/routers/nuclei.py new
+13
@@ -0,0 +1,13 @@
1 +from fastapi import APIRouter
2 +
3 +from app.integrations.nuclei.routes.nuclei import integration_nuclei_router
4 +
5 +# Instantiate the APIRouter
6 +router = APIRouter()
7 +
8 +# Include the Nuclei related routes
9 +router.include_router(
10 + integration_nuclei_router,
11 + prefix="/nuclei",
12 + tags=["Nuclei"],
13 +)
backend/copilot.py
+2
@@ -53,6 +53,7 @@ from app.routers import mimecast
53 from app.routers import modules
54 from app.routers import monitoring_alert
55 from app.routers import network_connectors
56 +from app.routers import nuclei
57 from app.routers import office365
58 from app.routers import sap_siem
59 from app.routers import scheduler
@@ -144,6 +145,7 @@ api_router.include_router(carbonblack.router)
145 api_router.include_router(network_connectors.router)
146 api_router.include_router(crowdstrike.router)
147 api_router.include_router(scoutsuite.router)
148 +api_router.include_router(nuclei.router)
149
150 # Include the APIRouter in the FastAPI app
151 app.include_router(api_router)
frontend/.eslintrc.cjs deleted
-28
@@ -1,28 +0,0 @@
1 -/* eslint-env node */
2 -require("@rushstack/eslint-patch/modern-module-resolution")
3 -
4 -module.exports = {
5 - root: true,
6 - env: {
7 - browser: true,
8 - amd: true,
9 - node: true
10 - },
11 - globals: {
12 - NodeJS: true
13 - },
14 - extends: ["plugin:vue/vue3-essential", "eslint:recommended", "@vue/eslint-config-typescript"],
15 - overrides: [
16 - {
17 - files: ["cypress/e2e/**.{cy,spec}.{js,ts,jsx,tsx}", "cypress/support/**/*.{js,ts,jsx,tsx}"],
18 - extends: ["plugin:cypress/recommended"]
19 - }
20 - ],
21 - parserOptions: {
22 - ecmaVersion: "latest"
23 - },
24 - rules: {
25 - "vue/multi-word-component-names": "off",
26 - "vue/no-setup-props-destructure": "off"
27 - }
28 -}
frontend/eslint.config.js new
+48
@@ -0,0 +1,48 @@
1 +import path from "node:path"
2 +import { fileURLToPath } from "node:url"
3 +import globals from "globals"
4 +
5 +import { FlatCompat } from "@eslint/eslintrc"
6 +import js from "@eslint/js"
7 +import pluginVue from "eslint-plugin-vue"
8 +
9 +const __filename = fileURLToPath(import.meta.url)
10 +const __dirname = path.dirname(__filename)
11 +const compat = new FlatCompat({
12 + baseDirectory: __dirname
13 +})
14 +
15 +export default [
16 + {
17 + ignores: ["**/dist/*", "**/tests/*", "**/.gitignore", "**/vite-env.d.ts"]
18 + },
19 + ...pluginVue.configs["flat/essential"],
20 + js.configs.recommended,
21 + ...compat.extends("@vue/eslint-config-typescript/recommended"),
22 + ...compat.extends("@vue/eslint-config-prettier/skip-formatting"),
23 + {
24 + files: [
25 + "**/*.vue",
26 + "**/*.js",
27 + "**/*.jsx",
28 + "**/*.cjs",
29 + "**/*.mjs",
30 + "**/*.ts",
31 + "**/*.tsx",
32 + "**/*.cts",
33 + "**/*.mts"
34 + ],
35 + languageOptions: {
36 + ecmaVersion: "latest",
37 + globals: {
38 + ...globals.browser,
39 + ...globals.node,
40 + ...globals.amd
41 + }
42 + },
43 + rules: {
44 + "vue/multi-word-component-names": "off",
45 + "vue/no-setup-props-destructure": "off"
46 + }
47 + }
48 +]
frontend/package-lock.json
+1746 -1031
@@ -14,9 +14,9 @@
14 "@fontsource/lexend": "^5.0.20",
15 "@fontsource/public-sans": "^5.0.18",
16 "@popperjs/core": "^2.11.8",
17 - "@shikijs/markdown-it": "^1.6.2",
18 - "@vueuse/components": "^10.10.0",
19 - "@vueuse/core": "^10.10.0",
17 + "@shikijs/markdown-it": "^1.7.0",
18 + "@vueuse/components": "^10.11.0",
19 + "@vueuse/core": "^10.11.0",
20 "apexcharts": "^3.49.1",
21 "bytes": "^3.1.2",
22 "colord": "^2.9.3",
@@ -35,13 +35,13 @@
35 "pinia": "^2.1.7",
36 "pinia-plugin-persistedstate": "^3.2.1",
37 "secure-ls": "^1.2.6",
38 - "shiki": "^1.6.2",
38 + "shiki": "^1.7.0",
39 "validator": "^13.12.0",
40 - "vue": "^3.4.27",
41 - "vue-advanced-cropper": "^2.8.8",
40 + "vue": "^3.4.29",
41 + "vue-advanced-cropper": "^2.8.9",
42 "vue-highlight-words": "^3.0.1",
43 "vue-i18n": "^9.13.1",
44 - "vue-router": "^4.3.2",
44 + "vue-router": "^4.3.3",
45 "vue-sjv": "^0.0.6",
46 "vue3-apexcharts": "^1.5.3",
47 "vue3-marquee": "^4.2.0",
@@ -57,9 +57,9 @@
57 "@types/fs-extra": "^11.0.4",
58 "@types/inquirer": "^9.0.7",
59 "@types/jsdom": "^21.1.7",
60 - "@types/lodash": "^4.17.4",
61 - "@types/node": "^20.14.2",
62 - "@types/validator": "^13.11.10",
60 + "@types/lodash": "^4.17.5",
61 + "@types/node": "^20.14.5",
62 + "@types/validator": "^13.12.0",
63 "@vitejs/plugin-vue": "^5.0.5",
64 "@vitejs/plugin-vue-jsx": "^4.0.0",
65 "@vue/eslint-config-prettier": "^9.0.0",
@@ -68,30 +68,32 @@
68 "@vue/tsconfig": "^0.5.1",
69 "autoprefixer": "^10.4.19",
70 "cypress": "^13.11.0",
71 - "eslint": "8.57.0",
71 + "eslint": "^9.5.0",
72 "eslint-plugin-cypress": "^3.3.0",
73 "eslint-plugin-vue": "^9.26.0",
74 "flourite": "^1.3.0",
75 "fs-extra": "^11.2.0",
76 + "globals": "^15.6.0",
77 "jsdom": "^24.1.0",
78 "json5": "^2.2.3",
79 "npm-run-all2": "^6.2.0",
80 "picocolors": "^1.0.1",
81 "postcss": "^8.4.38",
81 - "prettier": "^3.3.1",
82 - "sass": "^1.77.4",
82 + "prettier": "^3.3.2",
83 + "sass": "^1.77.6",
84 "start-server-and-test": "^2.0.4",
84 - "tailwind-config-viewer": "^2.0.2",
85 + "tailwind-config-viewer": "^2.0.3",
86 "tailwindcss": "^3.4.4",
87 "taze": "^0.13.8",
88 + "type-fest": "^4.20.1",
89 "unplugin-vue-components": "^0.27.0",
88 - "vite": "^5.2.12",
89 - "vite-bundle-analyzer": "^0.9.4",
90 + "vite": "^5.3.1",
91 + "vite-bundle-analyzer": "^0.10.2",
92 "vite-bundle-visualizer": "^1.2.1",
91 - "vite-plugin-vue-devtools": "^7.2.1",
93 + "vite-plugin-vue-devtools": "^7.3.1",
94 "vite-svg-loader": "^5.1.0",
95 "vitest": "^1.6.0",
94 - "vue-tsc": "^2.0.19"
96 + "vue-tsc": "^2.0.21"
97 },
98 "engines": {
99 "node": ">=18.0.0"
@@ -585,12 +587,12 @@
587 }
588 },
589 "node_modules/@babel/plugin-syntax-jsx": {
588 - "version": "7.24.1",
589 - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.1.tgz",
590 - "integrity": "sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA==",
590 + "version": "7.24.7",
591 + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.7.tgz",
592 + "integrity": "sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==",
593 "dev": true,
594 "dependencies": {
593 - "@babel/helper-plugin-utils": "^7.24.0"
595 + "@babel/helper-plugin-utils": "^7.24.7"
596 },
597 "engines": {
598 "node": ">=6.9.0"
@@ -633,9 +635,9 @@
635 }
636 },
637 "node_modules/@babel/runtime": {
636 - "version": "7.24.5",
637 - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.5.tgz",
638 - "integrity": "sha512-Nms86NXrsaeU9vbBJKni6gXiEXZ4CVpYVzEjDH9Sb8vmZ3UljyA1GSOJl/6LGPO8EHLuSF9H+IxNXHPX8QHJ4g==",
638 + "version": "7.24.7",
639 + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.7.tgz",
640 + "integrity": "sha512-UwgBRMjJP+xv857DCngvqXI3Iq6J4v0wXmwc6sapg+zyhbwmQX67LUEFrkK5tbyJ30jGuG3ZvWpBiB9LCy1kWw==",
641 "dependencies": {
642 "regenerator-runtime": "^0.14.0"
643 },
@@ -728,7 +730,7 @@
730 },
731 "node_modules/@clack/prompts/node_modules/is-unicode-supported": {
732 "version": "1.3.0",
731 - "dev": true,
733 + "extraneous": true,
734 "inBundle": true,
735 "license": "MIT",
736 "engines": {
@@ -817,215 +819,705 @@
819 "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz",
820 "integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow=="
821 },
820 - "node_modules/@esbuild/win32-x64": {
821 - "version": "0.20.2",
822 - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz",
823 - "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==",
822 + "node_modules/@esbuild/aix-ppc64": {
823 + "version": "0.21.5",
824 + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz",
825 + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==",
826 "cpu": [
825 - "x64"
827 + "ppc64"
828 ],
829 "dev": true,
830 "optional": true,
831 "os": [
830 - "win32"
832 + "aix"
833 ],
834 "engines": {
835 "node": ">=12"
836 }
837 },
836 - "node_modules/@eslint-community/eslint-utils": {
837 - "version": "4.4.0",
838 - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz",
839 - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==",
840 - "dependencies": {
841 - "eslint-visitor-keys": "^3.3.0"
842 - },
838 + "node_modules/@esbuild/android-arm": {
839 + "version": "0.21.5",
840 + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz",
841 + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==",
842 + "cpu": [
843 + "arm"
844 + ],
845 + "dev": true,
846 + "optional": true,
847 + "os": [
848 + "android"
849 + ],
850 "engines": {
844 - "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
845 - },
846 - "peerDependencies": {
847 - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
851 + "node": ">=12"
852 }
853 },
850 - "node_modules/@eslint-community/regexpp": {
851 - "version": "4.10.0",
852 - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz",
853 - "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==",
854 + "node_modules/@esbuild/android-arm64": {
855 + "version": "0.21.5",
856 + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz",
857 + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==",
858 + "cpu": [
859 + "arm64"
860 + ],
861 + "dev": true,
862 + "optional": true,
863 + "os": [
864 + "android"
865 + ],
866 "engines": {
855 - "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
867 + "node": ">=12"
868 }
869 },
858 - "node_modules/@eslint/eslintrc": {
859 - "version": "2.1.4",
860 - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz",
861 - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==",
862 - "dependencies": {
863 - "ajv": "^6.12.4",
864 - "debug": "^4.3.2",
865 - "espree": "^9.6.0",
866 - "globals": "^13.19.0",
867 - "ignore": "^5.2.0",
868 - "import-fresh": "^3.2.1",
869 - "js-yaml": "^4.1.0",
870 - "minimatch": "^3.1.2",
871 - "strip-json-comments": "^3.1.1"
872 - },
870 + "node_modules/@esbuild/android-x64": {
871 + "version": "0.21.5",
872 + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz",
873 + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==",
874 + "cpu": [
875 + "x64"
876 + ],
877 + "dev": true,
878 + "optional": true,
879 + "os": [
880 + "android"
881 + ],
882 "engines": {
874 - "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
875 - },
876 - "funding": {
877 - "url": "https://opencollective.com/eslint"
878 - }
879 - },
880 - "node_modules/@eslint/eslintrc/node_modules/brace-expansion": {
881 - "version": "1.1.11",
882 - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
883 - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
884 - "dependencies": {
885 - "balanced-match": "^1.0.0",
886 - "concat-map": "0.0.1"
883 + "node": ">=12"
884 }
885 },
889 - "node_modules/@eslint/eslintrc/node_modules/minimatch": {
890 - "version": "3.1.2",
891 - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
892 - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
893 - "dependencies": {
894 - "brace-expansion": "^1.1.7"
895 - },
886 + "node_modules/@esbuild/darwin-arm64": {
887 + "version": "0.21.5",
888 + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz",
889 + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==",
890 + "cpu": [
891 + "arm64"
892 + ],
893 + "dev": true,
894 + "optional": true,
895 + "os": [
896 + "darwin"
897 + ],
898 "engines": {
897 - "node": "*"
899 + "node": ">=12"
900 }
901 },
900 - "node_modules/@eslint/js": {
901 - "version": "8.57.0",
902 - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz",
903 - "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==",
902 + "node_modules/@esbuild/darwin-x64": {
903 + "version": "0.21.5",
904 + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz",
905 + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==",
906 + "cpu": [
907 + "x64"
908 + ],
909 + "dev": true,
910 + "optional": true,
911 + "os": [
912 + "darwin"
913 + ],
914 "engines": {
905 - "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
915 + "node": ">=12"
916 }
917 },
908 - "node_modules/@f3ve/eslint-config": {
909 - "version": "1.0.6",
910 - "resolved": "https://registry.npmjs.org/@f3ve/eslint-config/-/eslint-config-1.0.6.tgz",
911 - "integrity": "sha512-DVLPAVZskaOUY6Gu/1VFaL0gGyY3VhjZBVExZVde2siwwgdwt+8XDSupLll0arKqVv4bqO2fRK21QomN3jy2yg==",
912 - "funding": [
913 - {
914 - "type": "GitHub Sponsors",
915 - "url": "https://github.com/sponsors/f3ve"
916 - },
917 - {
918 - "type": "Buy me a Coffee",
919 - "url": "https://www.buymeacoffee.com/f3ve"
920 - }
918 + "node_modules/@esbuild/freebsd-arm64": {
919 + "version": "0.21.5",
920 + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz",
921 + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==",
922 + "cpu": [
923 + "arm64"
924 ],
922 - "dependencies": {
923 - "@eslint/js": "^8.50.0",
924 - "@typescript-eslint/eslint-plugin": "^6.7.3",
925 - "@typescript-eslint/parser": "^6.7.3",
926 - "@unocss/eslint-config": "^0.56.4",
927 - "eslint-config-prettier": "^9.0.0",
928 - "eslint-define-config": "^1.23.0",
929 - "eslint-plugin-prettier": "^5.0.0",
930 - "eslint-plugin-vue": "^9.17.0",
931 - "globals": "^13.22.0",
932 - "vue-eslint-parser": "^9.3.1"
933 - },
934 - "peerDependencies": {
935 - "eslint": ">=8.0.0"
925 + "dev": true,
926 + "optional": true,
927 + "os": [
928 + "freebsd"
929 + ],
930 + "engines": {
931 + "node": ">=12"
932 }
933 },
938 - "node_modules/@f3ve/vue-markdown-it": {
939 - "version": "0.2.2",
940 - "resolved": "https://registry.npmjs.org/@f3ve/vue-markdown-it/-/vue-markdown-it-0.2.2.tgz",
941 - "integrity": "sha512-0LVoa7bCI+pKuMRp8iap7DNNSVgXH51xkAxFmBWjdY6gd9yXBwD64P0p7o1NSYFUXaQCGR+cfOpsudJY7zjeBg==",
942 - "dependencies": {
943 - "@f3ve/eslint-config": "^1.0.6",
944 - "markdown-it": "^14.1.0"
945 - },
946 - "peerDependencies": {
947 - "vue": "^3.3.4"
934 + "node_modules/@esbuild/freebsd-x64": {
935 + "version": "0.21.5",
936 + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz",
937 + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==",
938 + "cpu": [
939 + "x64"
940 + ],
941 + "dev": true,
942 + "optional": true,
943 + "os": [
944 + "freebsd"
945 + ],
946 + "engines": {
947 + "node": ">=12"
948 }
949 },
950 - "node_modules/@fontsource/jetbrains-mono": {
951 - "version": "5.0.20",
952 - "resolved": "https://registry.npmjs.org/@fontsource/jetbrains-mono/-/jetbrains-mono-5.0.20.tgz",
953 - "integrity": "sha512-QkrihYWqftzs+04TinulIhnFqNwO6990HR07iCUae/6daOZAMy7urUPzytrRT9M8KLTTHBeHOY0CKqOs1+o2OQ=="
954 - },
955 - "node_modules/@fontsource/lexend": {
956 - "version": "5.0.20",
957 - "resolved": "https://registry.npmjs.org/@fontsource/lexend/-/lexend-5.0.20.tgz",
958 - "integrity": "sha512-up8jVBRNP7AMRb7MuRBU/Nh1qHqI1ZWIVfqO1fa4gzOwNEnXyPMfvNy4LV2zYqrS19MfTe5ic7kUKpohsVVsZg=="
959 - },
960 - "node_modules/@fontsource/public-sans": {
961 - "version": "5.0.18",
962 - "resolved": "https://registry.npmjs.org/@fontsource/public-sans/-/public-sans-5.0.18.tgz",
963 - "integrity": "sha512-dYx/ULF7pRkjBO1ncCwIRXWWmI2oCsMsWxheHgjtNANm4+prtfq3gdGy3KOsuNcAhEKn6BQeIyg0hFqeoTpAaQ=="
964 - },
965 - "node_modules/@hapi/hoek": {
966 - "version": "9.3.0",
967 - "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz",
968 - "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==",
969 - "dev": true
970 - },
971 - "node_modules/@hapi/topo": {
972 - "version": "5.1.0",
973 - "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz",
974 - "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==",
950 + "node_modules/@esbuild/linux-arm": {
951 + "version": "0.21.5",
952 + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz",
953 + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==",
954 + "cpu": [
955 + "arm"
956 + ],
957 "dev": true,
976 - "dependencies": {
977 - "@hapi/hoek": "^9.0.0"
958 + "optional": true,
959 + "os": [
960 + "linux"
961 + ],
962 + "engines": {
963 + "node": ">=12"
964 }
965 },
980 - "node_modules/@humanwhocodes/config-array": {
981 - "version": "0.11.14",
982 - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz",
983 - "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==",
984 - "dependencies": {
985 - "@humanwhocodes/object-schema": "^2.0.2",
986 - "debug": "^4.3.1",
987 - "minimatch": "^3.0.5"
988 - },
966 + "node_modules/@esbuild/linux-arm64": {
967 + "version": "0.21.5",
968 + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz",
969 + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==",
970 + "cpu": [
971 + "arm64"
972 + ],
973 + "dev": true,
974 + "optional": true,
975 + "os": [
976 + "linux"
977 + ],
978 "engines": {
990 - "node": ">=10.10.0"
979 + "node": ">=12"
980 }
981 },
993 - "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": {
994 - "version": "1.1.11",
995 - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
996 - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
997 - "dependencies": {
998 - "balanced-match": "^1.0.0",
999 - "concat-map": "0.0.1"
982 + "node_modules/@esbuild/linux-ia32": {
983 + "version": "0.21.5",
984 + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz",
985 + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==",
986 + "cpu": [
987 + "ia32"
988 + ],
989 + "dev": true,
990 + "optional": true,
991 + "os": [
992 + "linux"
993 + ],
994 + "engines": {
995 + "node": ">=12"
996 }
997 },
1002 - "node_modules/@humanwhocodes/config-array/node_modules/minimatch": {
1003 - "version": "3.1.2",
1004 - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
1005 - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
1006 - "dependencies": {
1007 - "brace-expansion": "^1.1.7"
1008 - },
998 + "node_modules/@esbuild/linux-loong64": {
999 + "version": "0.21.5",
1000 + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz",
1001 + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==",
1002 + "cpu": [
1003 + "loong64"
1004 + ],
1005 + "dev": true,
1006 + "optional": true,
1007 + "os": [
1008 + "linux"
1009 + ],
1010 "engines": {
1010 - "node": "*"
1011 + "node": ">=12"
1012 }
1013 },
1013 - "node_modules/@humanwhocodes/module-importer": {
1014 - "version": "1.0.1",
1015 - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
1016 - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
1014 + "node_modules/@esbuild/linux-mips64el": {
1015 + "version": "0.21.5",
1016 + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz",
1017 + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==",
1018 + "cpu": [
1019 + "mips64el"
1020 + ],
1021 + "dev": true,
1022 + "optional": true,
1023 + "os": [
1024 + "linux"
1025 + ],
1026 "engines": {
1018 - "node": ">=12.22"
1019 - },
1020 - "funding": {
1021 - "type": "github",
1022 - "url": "https://github.com/sponsors/nzakas"
1027 + "node": ">=12"
1028 }
1029 },
1025 - "node_modules/@humanwhocodes/object-schema": {
1026 - "version": "2.0.3",
1027 - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz",
1028 - "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA=="
1030 + "node_modules/@esbuild/linux-ppc64": {
1031 + "version": "0.21.5",
1032 + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz",
1033 + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==",
1034 + "cpu": [
1035 + "ppc64"
1036 + ],
1037 + "dev": true,
1038 + "optional": true,
1039 + "os": [
1040 + "linux"
1041 + ],
1042 + "engines": {
1043 + "node": ">=12"
1044 + }
1045 + },
1046 + "node_modules/@esbuild/linux-riscv64": {
1047 + "version": "0.21.5",
1048 + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz",
1049 + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==",
1050 + "cpu": [
1051 + "riscv64"
1052 + ],
1053 + "dev": true,
1054 + "optional": true,
1055 + "os": [
1056 + "linux"
1057 + ],
1058 + "engines": {
1059 + "node": ">=12"
1060 + }
1061 + },
1062 + "node_modules/@esbuild/linux-s390x": {
1063 + "version": "0.21.5",
1064 + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz",
1065 + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==",
1066 + "cpu": [
1067 + "s390x"
1068 + ],
1069 + "dev": true,
1070 + "optional": true,
1071 + "os": [
1072 + "linux"
1073 + ],
1074 + "engines": {
1075 + "node": ">=12"
1076 + }
1077 + },
1078 + "node_modules/@esbuild/linux-x64": {
1079 + "version": "0.21.5",
1080 + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz",
1081 + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==",
1082 + "cpu": [
1083 + "x64"
1084 + ],
1085 + "dev": true,
1086 + "optional": true,
1087 + "os": [
1088 + "linux"
1089 + ],
1090 + "engines": {
1091 + "node": ">=12"
1092 + }
1093 + },
1094 + "node_modules/@esbuild/netbsd-x64": {
1095 + "version": "0.21.5",
1096 + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz",
1097 + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==",
1098 + "cpu": [
1099 + "x64"
1100 + ],
1101 + "dev": true,
1102 + "optional": true,
1103 + "os": [
1104 + "netbsd"
1105 + ],
1106 + "engines": {
1107 + "node": ">=12"
1108 + }
1109 + },
1110 + "node_modules/@esbuild/openbsd-x64": {
1111 + "version": "0.21.5",
1112 + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz",
1113 + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==",
1114 + "cpu": [
1115 + "x64"
1116 + ],
1117 + "dev": true,
1118 + "optional": true,
1119 + "os": [
1120 + "openbsd"
1121 + ],
1122 + "engines": {
1123 + "node": ">=12"
1124 + }
1125 + },
1126 + "node_modules/@esbuild/sunos-x64": {
1127 + "version": "0.21.5",
1128 + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz",
1129 + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==",
1130 + "cpu": [
1131 + "x64"
1132 + ],
1133 + "dev": true,
1134 + "optional": true,
1135 + "os": [
1136 + "sunos"
1137 + ],
1138 + "engines": {
1139 + "node": ">=12"
1140 + }
1141 + },
1142 + "node_modules/@esbuild/win32-arm64": {
1143 + "version": "0.21.5",
1144 + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz",
1145 + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==",
1146 + "cpu": [
1147 + "arm64"
1148 + ],
1149 + "dev": true,
1150 + "optional": true,
1151 + "os": [
1152 + "win32"
1153 + ],
1154 + "engines": {
1155 + "node": ">=12"
1156 + }
1157 + },
1158 + "node_modules/@esbuild/win32-ia32": {
1159 + "version": "0.21.5",
1160 + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz",
1161 + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==",
1162 + "cpu": [
1163 + "ia32"
1164 + ],
1165 + "dev": true,
1166 + "optional": true,
1167 + "os": [
1168 + "win32"
1169 + ],
1170 + "engines": {
1171 + "node": ">=12"
1172 + }
1173 + },
1174 + "node_modules/@esbuild/win32-x64": {
1175 + "version": "0.21.5",
1176 + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz",
1177 + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==",
1178 + "cpu": [
1179 + "x64"
1180 + ],
1181 + "dev": true,
1182 + "optional": true,
1183 + "os": [
1184 + "win32"
1185 + ],
1186 + "engines": {
1187 + "node": ">=12"
1188 + }
1189 + },
1190 + "node_modules/@eslint-community/eslint-utils": {
1191 + "version": "4.4.0",
1192 + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz",
1193 + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==",
1194 + "dependencies": {
1195 + "eslint-visitor-keys": "^3.3.0"
1196 + },
1197 + "engines": {
1198 + "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
1199 + },
1200 + "peerDependencies": {
1201 + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
1202 + }
1203 + },
1204 + "node_modules/@eslint-community/regexpp": {
1205 + "version": "4.10.1",
1206 + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.1.tgz",
1207 + "integrity": "sha512-Zm2NGpWELsQAD1xsJzGQpYfvICSsFkEpU0jxBjfdC6uNEWXcHnfs9hScFWtXVDVl+rBQJGrl4g1vcKIejpH9dA==",
1208 + "engines": {
1209 + "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
1210 + }
1211 + },
1212 + "node_modules/@eslint/config-array": {
1213 + "version": "0.16.0",
1214 + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.16.0.tgz",
1215 + "integrity": "sha512-/jmuSd74i4Czf1XXn7wGRWZCuyaUZ330NH1Bek0Pplatt4Sy1S5haN21SCLLdbeKslQ+S0wEJ+++v5YibSi+Lg==",
1216 + "dependencies": {
1217 + "@eslint/object-schema": "^2.1.4",
1218 + "debug": "^4.3.1",
1219 + "minimatch": "^3.0.5"
1220 + },
1221 + "engines": {
1222 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
1223 + }
1224 + },
1225 + "node_modules/@eslint/config-array/node_modules/brace-expansion": {
1226 + "version": "1.1.11",
1227 + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
1228 + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
1229 + "dependencies": {
1230 + "balanced-match": "^1.0.0",
1231 + "concat-map": "0.0.1"
1232 + }
1233 + },
1234 + "node_modules/@eslint/config-array/node_modules/minimatch": {
1235 + "version": "3.1.2",
1236 + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
1237 + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
1238 + "dependencies": {
1239 + "brace-expansion": "^1.1.7"
1240 + },
1241 + "engines": {
1242 + "node": "*"
1243 + }
1244 + },
1245 + "node_modules/@eslint/eslintrc": {
1246 + "version": "3.1.0",
1247 + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.1.0.tgz",
1248 + "integrity": "sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==",
1249 + "dependencies": {
1250 + "ajv": "^6.12.4",
1251 + "debug": "^4.3.2",
1252 + "espree": "^10.0.1",
1253 + "globals": "^14.0.0",
1254 + "ignore": "^5.2.0",
1255 + "import-fresh": "^3.2.1",
1256 + "js-yaml": "^4.1.0",
1257 + "minimatch": "^3.1.2",
1258 + "strip-json-comments": "^3.1.1"
1259 + },
1260 + "engines": {
1261 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
1262 + },
1263 + "funding": {
1264 + "url": "https://opencollective.com/eslint"
1265 + }
1266 + },
1267 + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": {
1268 + "version": "1.1.11",
1269 + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
1270 + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
1271 + "dependencies": {
1272 + "balanced-match": "^1.0.0",
1273 + "concat-map": "0.0.1"
1274 + }
1275 + },
1276 + "node_modules/@eslint/eslintrc/node_modules/globals": {
1277 + "version": "14.0.0",
1278 + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz",
1279 + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==",
1280 + "engines": {
1281 + "node": ">=18"
1282 + },
1283 + "funding": {
1284 + "url": "https://github.com/sponsors/sindresorhus"
1285 + }
1286 + },
1287 + "node_modules/@eslint/eslintrc/node_modules/minimatch": {
1288 + "version": "3.1.2",
1289 + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
1290 + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
1291 + "dependencies": {
1292 + "brace-expansion": "^1.1.7"
1293 + },
1294 + "engines": {
1295 + "node": "*"
1296 + }
1297 + },
1298 + "node_modules/@eslint/js": {
1299 + "version": "8.57.0",
1300 + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz",
1301 + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==",
1302 + "engines": {
1303 + "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
1304 + }
1305 + },
1306 + "node_modules/@eslint/object-schema": {
1307 + "version": "2.1.4",
1308 + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.4.tgz",
1309 + "integrity": "sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==",
1310 + "engines": {
1311 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
1312 + }
1313 + },
1314 + "node_modules/@f3ve/eslint-config": {
1315 + "version": "1.0.6",
1316 + "resolved": "https://registry.npmjs.org/@f3ve/eslint-config/-/eslint-config-1.0.6.tgz",
1317 + "integrity": "sha512-DVLPAVZskaOUY6Gu/1VFaL0gGyY3VhjZBVExZVde2siwwgdwt+8XDSupLll0arKqVv4bqO2fRK21QomN3jy2yg==",
1318 + "funding": [
1319 + {
1320 + "type": "GitHub Sponsors",
1321 + "url": "https://github.com/sponsors/f3ve"
1322 + },
1323 + {
1324 + "type": "Buy me a Coffee",
1325 + "url": "https://www.buymeacoffee.com/f3ve"
1326 + }
1327 + ],
1328 + "dependencies": {
1329 + "@eslint/js": "^8.50.0",
1330 + "@typescript-eslint/eslint-plugin": "^6.7.3",
1331 + "@typescript-eslint/parser": "^6.7.3",
1332 + "@unocss/eslint-config": "^0.56.4",
1333 + "eslint-config-prettier": "^9.0.0",
1334 + "eslint-define-config": "^1.23.0",
1335 + "eslint-plugin-prettier": "^5.0.0",
1336 + "eslint-plugin-vue": "^9.17.0",
1337 + "globals": "^13.22.0",
1338 + "vue-eslint-parser": "^9.3.1"
1339 + },
1340 + "peerDependencies": {
1341 + "eslint": ">=8.0.0"
1342 + }
1343 + },
1344 + "node_modules/@f3ve/eslint-config/node_modules/@typescript-eslint/eslint-plugin": {
1345 + "version": "6.21.0",
1346 + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz",
1347 + "integrity": "sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==",
1348 + "dependencies": {
1349 + "@eslint-community/regexpp": "^4.5.1",
1350 + "@typescript-eslint/scope-manager": "6.21.0",
1351 + "@typescript-eslint/type-utils": "6.21.0",
1352 + "@typescript-eslint/utils": "6.21.0",
1353 + "@typescript-eslint/visitor-keys": "6.21.0",
1354 + "debug": "^4.3.4",
1355 + "graphemer": "^1.4.0",
1356 + "ignore": "^5.2.4",
1357 + "natural-compare": "^1.4.0",
1358 + "semver": "^7.5.4",
1359 + "ts-api-utils": "^1.0.1"
1360 + },
1361 + "engines": {
1362 + "node": "^16.0.0 || >=18.0.0"
1363 + },
1364 + "funding": {
1365 + "type": "opencollective",
1366 + "url": "https://opencollective.com/typescript-eslint"
1367 + },
1368 + "peerDependencies": {
1369 + "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha",
1370 + "eslint": "^7.0.0 || ^8.0.0"
1371 + },
1372 + "peerDependenciesMeta": {
1373 + "typescript": {
1374 + "optional": true
1375 + }
1376 + }
1377 + },
1378 + "node_modules/@f3ve/eslint-config/node_modules/@typescript-eslint/parser": {
1379 + "version": "6.21.0",
1380 + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz",
1381 + "integrity": "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==",
1382 + "dependencies": {
1383 + "@typescript-eslint/scope-manager": "6.21.0",
1384 + "@typescript-eslint/types": "6.21.0",
1385 + "@typescript-eslint/typescript-estree": "6.21.0",
1386 + "@typescript-eslint/visitor-keys": "6.21.0",
1387 + "debug": "^4.3.4"
1388 + },
1389 + "engines": {
1390 + "node": "^16.0.0 || >=18.0.0"
1391 + },
1392 + "funding": {
1393 + "type": "opencollective",
1394 + "url": "https://opencollective.com/typescript-eslint"
1395 + },
1396 + "peerDependencies": {
1397 + "eslint": "^7.0.0 || ^8.0.0"
1398 + },
1399 + "peerDependenciesMeta": {
1400 + "typescript": {
1401 + "optional": true
1402 + }
1403 + }
1404 + },
1405 + "node_modules/@f3ve/eslint-config/node_modules/@typescript-eslint/type-utils": {
1406 + "version": "6.21.0",
1407 + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.21.0.tgz",
1408 + "integrity": "sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==",
1409 + "dependencies": {
1410 + "@typescript-eslint/typescript-estree": "6.21.0",
1411 + "@typescript-eslint/utils": "6.21.0",
1412 + "debug": "^4.3.4",
1413 + "ts-api-utils": "^1.0.1"
1414 + },
1415 + "engines": {
1416 + "node": "^16.0.0 || >=18.0.0"
1417 + },
1418 + "funding": {
1419 + "type": "opencollective",
1420 + "url": "https://opencollective.com/typescript-eslint"
1421 + },
1422 + "peerDependencies": {
1423 + "eslint": "^7.0.0 || ^8.0.0"
1424 + },
1425 + "peerDependenciesMeta": {
1426 + "typescript": {
1427 + "optional": true
1428 + }
1429 + }
1430 + },
1431 + "node_modules/@f3ve/eslint-config/node_modules/globals": {
1432 + "version": "13.24.0",
1433 + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz",
1434 + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==",
1435 + "dependencies": {
1436 + "type-fest": "^0.20.2"
1437 + },
1438 + "engines": {
1439 + "node": ">=8"
1440 + },
1441 + "funding": {
1442 + "url": "https://github.com/sponsors/sindresorhus"
1443 + }
1444 + },
1445 + "node_modules/@f3ve/eslint-config/node_modules/type-fest": {
1446 + "version": "0.20.2",
1447 + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
1448 + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
1449 + "engines": {
1450 + "node": ">=10"
1451 + },
1452 + "funding": {
1453 + "url": "https://github.com/sponsors/sindresorhus"
1454 + }
1455 + },
1456 + "node_modules/@f3ve/vue-markdown-it": {
1457 + "version": "0.2.2",
1458 + "resolved": "https://registry.npmjs.org/@f3ve/vue-markdown-it/-/vue-markdown-it-0.2.2.tgz",
1459 + "integrity": "sha512-0LVoa7bCI+pKuMRp8iap7DNNSVgXH51xkAxFmBWjdY6gd9yXBwD64P0p7o1NSYFUXaQCGR+cfOpsudJY7zjeBg==",
1460 + "dependencies": {
1461 + "@f3ve/eslint-config": "^1.0.6",
1462 + "markdown-it": "^14.1.0"
1463 + },
1464 + "peerDependencies": {
1465 + "vue": "^3.3.4"
1466 + }
1467 + },
1468 + "node_modules/@fontsource/jetbrains-mono": {
1469 + "version": "5.0.20",
1470 + "resolved": "https://registry.npmjs.org/@fontsource/jetbrains-mono/-/jetbrains-mono-5.0.20.tgz",
1471 + "integrity": "sha512-QkrihYWqftzs+04TinulIhnFqNwO6990HR07iCUae/6daOZAMy7urUPzytrRT9M8KLTTHBeHOY0CKqOs1+o2OQ=="
1472 + },
1473 + "node_modules/@fontsource/lexend": {
1474 + "version": "5.0.20",
1475 + "resolved": "https://registry.npmjs.org/@fontsource/lexend/-/lexend-5.0.20.tgz",
1476 + "integrity": "sha512-up8jVBRNP7AMRb7MuRBU/Nh1qHqI1ZWIVfqO1fa4gzOwNEnXyPMfvNy4LV2zYqrS19MfTe5ic7kUKpohsVVsZg=="
1477 + },
1478 + "node_modules/@fontsource/public-sans": {
1479 + "version": "5.0.18",
1480 + "resolved": "https://registry.npmjs.org/@fontsource/public-sans/-/public-sans-5.0.18.tgz",
1481 + "integrity": "sha512-dYx/ULF7pRkjBO1ncCwIRXWWmI2oCsMsWxheHgjtNANm4+prtfq3gdGy3KOsuNcAhEKn6BQeIyg0hFqeoTpAaQ=="
1482 + },
1483 + "node_modules/@hapi/hoek": {
1484 + "version": "9.3.0",
1485 + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz",
1486 + "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==",
1487 + "dev": true
1488 + },
1489 + "node_modules/@hapi/topo": {
1490 + "version": "5.1.0",
1491 + "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz",
1492 + "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==",
1493 + "dev": true,
1494 + "dependencies": {
1495 + "@hapi/hoek": "^9.0.0"
1496 + }
1497 + },
1498 + "node_modules/@humanwhocodes/module-importer": {
1499 + "version": "1.0.1",
1500 + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
1501 + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
1502 + "engines": {
1503 + "node": ">=12.22"
1504 + },
1505 + "funding": {
1506 + "type": "github",
1507 + "url": "https://github.com/sponsors/nzakas"
1508 + }
1509 + },
1510 + "node_modules/@humanwhocodes/retry": {
1511 + "version": "0.3.0",
1512 + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.0.tgz",
1513 + "integrity": "sha512-d2CGZR2o7fS6sWB7DG/3a95bGKQyHMACZ5aW8qGkkqQpUoZV6C0X7Pc7l4ZNMZkfNBf4VWNe9E1jRsf0G146Ew==",
1514 + "engines": {
1515 + "node": ">=18.18"
1516 + },
1517 + "funding": {
1518 + "type": "github",
1519 + "url": "https://github.com/sponsors/nzakas"
1520 + }
1521 },
1522 "node_modules/@iconify/types": {
1523 "version": "2.0.0",
@@ -1348,9 +1840,9 @@
1840 }
1841 },
1842 "node_modules/@rollup/rollup-android-arm-eabi": {
1351 - "version": "4.17.2",
1352 - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.17.2.tgz",
1353 - "integrity": "sha512-NM0jFxY8bB8QLkoKxIQeObCaDlJKewVlIEkuyYKm5An1tdVZ966w2+MPQ2l8LBZLjR+SgyV+nRkTIunzOYBMLQ==",
1843 + "version": "4.18.0",
1844 + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.18.0.tgz",
1845 + "integrity": "sha512-Tya6xypR10giZV1XzxmH5wr25VcZSncG0pZIjfePT0OVBvqNEurzValetGNarVrGiq66EBVAFn15iYX4w6FKgQ==",
1846 "cpu": [
1847 "arm"
1848 ],
@@ -1361,9 +1853,9 @@
1853 ]
1854 },
1855 "node_modules/@rollup/rollup-android-arm64": {
1364 - "version": "4.17.2",
1365 - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.17.2.tgz",
1366 - "integrity": "sha512-yeX/Usk7daNIVwkq2uGoq2BYJKZY1JfyLTaHO/jaiSwi/lsf8fTFoQW/n6IdAsx5tx+iotu2zCJwz8MxI6D/Bw==",
1856 + "version": "4.18.0",
1857 + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.18.0.tgz",
1858 + "integrity": "sha512-avCea0RAP03lTsDhEyfy+hpfr85KfyTctMADqHVhLAF3MlIkq83CP8UfAHUssgXTYd+6er6PaAhx/QGv4L1EiA==",
1859 "cpu": [
1860 "arm64"
1861 ],
@@ -1374,9 +1866,9 @@
1866 ]
1867 },
1868 "node_modules/@rollup/rollup-darwin-arm64": {
1377 - "version": "4.17.2",
1378 - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.17.2.tgz",
1379 - "integrity": "sha512-kcMLpE6uCwls023+kknm71ug7MZOrtXo+y5p/tsg6jltpDtgQY1Eq5sGfHcQfb+lfuKwhBmEURDga9N0ol4YPw==",
1869 + "version": "4.18.0",
1870 + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.18.0.tgz",
1871 + "integrity": "sha512-IWfdwU7KDSm07Ty0PuA/W2JYoZ4iTj3TUQjkVsO/6U+4I1jN5lcR71ZEvRh52sDOERdnNhhHU57UITXz5jC1/w==",
1872 "cpu": [
1873 "arm64"
1874 ],
@@ -1387,9 +1879,9 @@
1879 ]
1880 },
1881 "node_modules/@rollup/rollup-darwin-x64": {
1390 - "version": "4.17.2",
1391 - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.17.2.tgz",
1392 - "integrity": "sha512-AtKwD0VEx0zWkL0ZjixEkp5tbNLzX+FCqGG1SvOu993HnSz4qDI6S4kGzubrEJAljpVkhRSlg5bzpV//E6ysTQ==",
1882 + "version": "4.18.0",
1883 + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.18.0.tgz",
1884 + "integrity": "sha512-n2LMsUz7Ynu7DoQrSQkBf8iNrjOGyPLrdSg802vk6XT3FtsgX6JbE8IHRvposskFm9SNxzkLYGSq9QdpLYpRNA==",
1885 "cpu": [
1886 "x64"
1887 ],
@@ -1400,9 +1892,9 @@
1892 ]
1893 },
1894 "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
1403 - "version": "4.17.2",
1404 - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.17.2.tgz",
1405 - "integrity": "sha512-3reX2fUHqN7sffBNqmEyMQVj/CKhIHZd4y631duy0hZqI8Qoqf6lTtmAKvJFYa6bhU95B1D0WgzHkmTg33In0A==",
1895 + "version": "4.18.0",
1896 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.18.0.tgz",
1897 + "integrity": "sha512-C/zbRYRXFjWvz9Z4haRxcTdnkPt1BtCkz+7RtBSuNmKzMzp3ZxdM28Mpccn6pt28/UWUCTXa+b0Mx1k3g6NOMA==",
1898 "cpu": [
1899 "arm"
1900 ],
@@ -1413,9 +1905,9 @@
1905 ]
1906 },
1907 "node_modules/@rollup/rollup-linux-arm-musleabihf": {
1416 - "version": "4.17.2",
1417 - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.17.2.tgz",
1418 - "integrity": "sha512-uSqpsp91mheRgw96xtyAGP9FW5ChctTFEoXP0r5FAzj/3ZRv3Uxjtc7taRQSaQM/q85KEKjKsZuiZM3GyUivRg==",
1908 + "version": "4.18.0",
1909 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.18.0.tgz",
1910 + "integrity": "sha512-l3m9ewPgjQSXrUMHg93vt0hYCGnrMOcUpTz6FLtbwljo2HluS4zTXFy2571YQbisTnfTKPZ01u/ukJdQTLGh9A==",
1911 "cpu": [
1912 "arm"
1913 ],
@@ -1426,9 +1918,9 @@
1918 ]
1919 },
1920 "node_modules/@rollup/rollup-linux-arm64-gnu": {
1429 - "version": "4.17.2",
1430 - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.17.2.tgz",
1431 - "integrity": "sha512-EMMPHkiCRtE8Wdk3Qhtciq6BndLtstqZIroHiiGzB3C5LDJmIZcSzVtLRbwuXuUft1Cnv+9fxuDtDxz3k3EW2A==",
1921 + "version": "4.18.0",
1922 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.18.0.tgz",
1923 + "integrity": "sha512-rJ5D47d8WD7J+7STKdCUAgmQk49xuFrRi9pZkWoRD1UeSMakbcepWXPF8ycChBoAqs1pb2wzvbY6Q33WmN2ftw==",
1924 "cpu": [
1925 "arm64"
1926 ],
@@ -1439,9 +1931,9 @@
1931 ]
1932 },
1933 "node_modules/@rollup/rollup-linux-arm64-musl": {
1442 - "version": "4.17.2",
1443 - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.17.2.tgz",
1444 - "integrity": "sha512-NMPylUUZ1i0z/xJUIx6VUhISZDRT+uTWpBcjdv0/zkp7b/bQDF+NfnfdzuTiB1G6HTodgoFa93hp0O1xl+/UbA==",
1934 + "version": "4.18.0",
1935 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.18.0.tgz",
1936 + "integrity": "sha512-be6Yx37b24ZwxQ+wOQXXLZqpq4jTckJhtGlWGZs68TgdKXJgw54lUUoFYrg6Zs/kjzAQwEwYbp8JxZVzZLRepQ==",
1937 "cpu": [
1938 "arm64"
1939 ],
@@ -1452,9 +1944,9 @@
1944 ]
1945 },
1946 "node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
1455 - "version": "4.17.2",
1456 - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.17.2.tgz",
1457 - "integrity": "sha512-T19My13y8uYXPw/L/k0JYaX1fJKFT/PWdXiHr8mTbXWxjVF1t+8Xl31DgBBvEKclw+1b00Chg0hxE2O7bTG7GQ==",
1947 + "version": "4.18.0",
1948 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.18.0.tgz",
1949 + "integrity": "sha512-hNVMQK+qrA9Todu9+wqrXOHxFiD5YmdEi3paj6vP02Kx1hjd2LLYR2eaN7DsEshg09+9uzWi2W18MJDlG0cxJA==",
1950 "cpu": [
1951 "ppc64"
1952 ],
@@ -1465,9 +1957,9 @@
1957 ]
1958 },
1959 "node_modules/@rollup/rollup-linux-riscv64-gnu": {
1468 - "version": "4.17.2",
1469 - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.17.2.tgz",
1470 - "integrity": "sha512-BOaNfthf3X3fOWAB+IJ9kxTgPmMqPPH5f5k2DcCsRrBIbWnaJCgX2ll77dV1TdSy9SaXTR5iDXRL8n7AnoP5cg==",
1960 + "version": "4.18.0",
1961 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.18.0.tgz",
1962 + "integrity": "sha512-ROCM7i+m1NfdrsmvwSzoxp9HFtmKGHEqu5NNDiZWQtXLA8S5HBCkVvKAxJ8U+CVctHwV2Gb5VUaK7UAkzhDjlg==",
1963 "cpu": [
1964 "riscv64"
1965 ],
@@ -1478,9 +1970,9 @@
1970 ]
1971 },
1972 "node_modules/@rollup/rollup-linux-s390x-gnu": {
1481 - "version": "4.17.2",
1482 - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.17.2.tgz",
1483 - "integrity": "sha512-W0UP/x7bnn3xN2eYMql2T/+wpASLE5SjObXILTMPUBDB/Fg/FxC+gX4nvCfPBCbNhz51C+HcqQp2qQ4u25ok6g==",
1973 + "version": "4.18.0",
1974 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.18.0.tgz",
1975 + "integrity": "sha512-0UyyRHyDN42QL+NbqevXIIUnKA47A+45WyasO+y2bGJ1mhQrfrtXUpTxCOrfxCR4esV3/RLYyucGVPiUsO8xjg==",
1976 "cpu": [
1977 "s390x"
1978 ],
@@ -1503,9 +1995,9 @@
1995 ]
1996 },
1997 "node_modules/@rollup/rollup-linux-x64-musl": {
1506 - "version": "4.17.2",
1507 - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.17.2.tgz",
1508 - "integrity": "sha512-h1+yTWeYbRdAyJ/jMiVw0l6fOOm/0D1vNLui9iPuqgRGnXA0u21gAqOyB5iHjlM9MMfNOm9RHCQ7zLIzT0x11Q==",
1998 + "version": "4.18.0",
1999 + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.18.0.tgz",
2000 + "integrity": "sha512-LKaqQL9osY/ir2geuLVvRRs+utWUNilzdE90TpyoX0eNqPzWjRm14oMEE+YLve4k/NAqCdPkGYDaDF5Sw+xBfg==",
2001 "cpu": [
2002 "x64"
2003 ],
@@ -1516,9 +2008,9 @@
2008 ]
2009 },
2010 "node_modules/@rollup/rollup-win32-arm64-msvc": {
1519 - "version": "4.17.2",
1520 - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.17.2.tgz",
1521 - "integrity": "sha512-tmdtXMfKAjy5+IQsVtDiCfqbynAQE/TQRpWdVataHmhMb9DCoJxp9vLcCBjEQWMiUYxO1QprH/HbY9ragCEFLA==",
2011 + "version": "4.18.0",
2012 + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.18.0.tgz",
2013 + "integrity": "sha512-7J6TkZQFGo9qBKH0pk2cEVSRhJbL6MtfWxth7Y5YmZs57Pi+4x6c2dStAUvaQkHQLnEQv1jzBUW43GvZW8OFqA==",
2014 "cpu": [
2015 "arm64"
2016 ],
@@ -1529,9 +2021,9 @@
2021 ]
2022 },
2023 "node_modules/@rollup/rollup-win32-ia32-msvc": {
1532 - "version": "4.17.2",
1533 - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.17.2.tgz",
1534 - "integrity": "sha512-7II/QCSTAHuE5vdZaQEwJq2ZACkBpQDOmQsE6D6XUbnBHW8IAhm4eTufL6msLJorzrHDFv3CF8oCA/hSIRuZeQ==",
2024 + "version": "4.18.0",
2025 + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.18.0.tgz",
2026 + "integrity": "sha512-Txjh+IxBPbkUB9+SXZMpv+b/vnTEtFyfWZgJ6iyCmt2tdx0OF5WhFowLmnh8ENGNpfUlUZkdI//4IEmhwPieNg==",
2027 "cpu": [
2028 "ia32"
2029 ],
@@ -1542,9 +2034,9 @@
2034 ]
2035 },
2036 "node_modules/@rollup/rollup-win32-x64-msvc": {
1545 - "version": "4.17.2",
1546 - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.17.2.tgz",
1547 - "integrity": "sha512-TGGO7v7qOq4CYmSBVEYpI1Y5xDuCEnbVC5Vth8mOsW0gDSzxNrVERPc790IGHsrT2dQSimgMr9Ub3Y1Jci5/8w==",
2037 + "version": "4.18.0",
2038 + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.18.0.tgz",
2039 + "integrity": "sha512-UOo5FdvOL0+eIVTgS4tIdbW+TtnBLWg1YBCcU2KWM7nuNwRz9bksDX1bekJJCpu25N1DVWaCwnT39dVQxzqS8g==",
2040 "cpu": [
2041 "x64"
2042 ],
@@ -1561,26 +2053,26 @@
2053 "dev": true
2054 },
2055 "node_modules/@shikijs/core": {
1564 - "version": "1.6.2",
1565 - "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-1.6.2.tgz",
1566 - "integrity": "sha512-guW5JeDzZ7uwOjTfCOFZ2VtVXk5tmkMzBYbKGfXsmAH1qYOej49L5jQDcGmwd6/OgvpmWhzO2GNJkQIFnbwLPQ=="
2056 + "version": "1.7.0",
2057 + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-1.7.0.tgz",
2058 + "integrity": "sha512-O6j27b7dGmJbR3mjwh/aHH8Ld+GQvA0OQsNO43wKWnqbAae3AYXrhFyScHGX8hXZD6vX2ngjzDFkZY5srtIJbQ=="
2059 },
2060 "node_modules/@shikijs/markdown-it": {
1569 - "version": "1.6.2",
1570 - "resolved": "https://registry.npmjs.org/@shikijs/markdown-it/-/markdown-it-1.6.2.tgz",
1571 - "integrity": "sha512-VhY7XJepbcb7ORS7uOyK0E3cgt7Ov8yMxyhZLbTm09SjfGlWUyLULHXzzyutCEOLWW4LWnemK521xJiG7dC1HQ==",
2061 + "version": "1.7.0",
2062 + "resolved": "https://registry.npmjs.org/@shikijs/markdown-it/-/markdown-it-1.7.0.tgz",
2063 + "integrity": "sha512-R/FdTmvynOjkiGDCIypmBIEunUVpMegk4x+C/weFQnfK5vQekBQfRZu/7sMBzhBZTncBcafhAQDK7QiNkOvwjQ==",
2064 "dependencies": {
1573 - "@shikijs/transformers": "1.6.2",
2065 + "@shikijs/transformers": "1.7.0",
2066 "markdown-it": "^14.1.0",
1575 - "shiki": "1.6.2"
2067 + "shiki": "1.7.0"
2068 }
2069 },
2070 "node_modules/@shikijs/transformers": {
1579 - "version": "1.6.2",
1580 - "resolved": "https://registry.npmjs.org/@shikijs/transformers/-/transformers-1.6.2.tgz",
1581 - "integrity": "sha512-ndqTWyHnxmsLkowhKWTam26opw8hg5a34y6FAUG/Xf6E49n3MM//nenKxXiWpPYkNPl1KZnYXB1k+Ia46wjOZg==",
2071 + "version": "1.7.0",
2072 + "resolved": "https://registry.npmjs.org/@shikijs/transformers/-/transformers-1.7.0.tgz",
2073 + "integrity": "sha512-QX3TP+CS4yYLt4X4Dk7wT0MsC7yweTYHMAAKY+ay+uuR9yRdFae/h+hivny2O+YixJHfZl57xtiZfWSrHdyVhQ==",
2074 "dependencies": {
1583 - "shiki": "1.6.2"
2075 + "shiki": "1.7.0"
2076 }
2077 },
2078 "node_modules/@sideway/address": {
@@ -1653,148 +2145,420 @@
2145 "@types/node": "*"
2146 }
2147 },
1656 - "node_modules/@types/inquirer": {
1657 - "version": "9.0.7",
1658 - "resolved": "https://registry.npmjs.org/@types/inquirer/-/inquirer-9.0.7.tgz",
1659 - "integrity": "sha512-Q0zyBupO6NxGRZut/JdmqYKOnN95Eg5V8Csg3PGKkP+FnvsUZx1jAyK7fztIszxxMuoBA6E3KXWvdZVXIpx60g==",
2148 + "node_modules/@types/inquirer": {
2149 + "version": "9.0.7",
2150 + "resolved": "https://registry.npmjs.org/@types/inquirer/-/inquirer-9.0.7.tgz",
2151 + "integrity": "sha512-Q0zyBupO6NxGRZut/JdmqYKOnN95Eg5V8Csg3PGKkP+FnvsUZx1jAyK7fztIszxxMuoBA6E3KXWvdZVXIpx60g==",
2152 + "dev": true,
2153 + "dependencies": {
2154 + "@types/through": "*",
2155 + "rxjs": "^7.2.0"
2156 + }
2157 + },
2158 + "node_modules/@types/jsdom": {
2159 + "version": "21.1.7",
2160 + "resolved": "https://registry.npmjs.org/@types/jsdom/-/jsdom-21.1.7.tgz",
2161 + "integrity": "sha512-yOriVnggzrnQ3a9OKOCxaVuSug3w3/SbOj5i7VwXWZEyUNl3bLF9V3MfxGbZKuwqJOQyRfqXyROBB1CoZLFWzA==",
2162 + "dev": true,
2163 + "dependencies": {
2164 + "@types/node": "*",
2165 + "@types/tough-cookie": "*",
2166 + "parse5": "^7.0.0"
2167 + }
2168 + },
2169 + "node_modules/@types/json-schema": {
2170 + "version": "7.0.15",
2171 + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
2172 + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="
2173 + },
2174 + "node_modules/@types/jsonfile": {
2175 + "version": "6.1.4",
2176 + "resolved": "https://registry.npmjs.org/@types/jsonfile/-/jsonfile-6.1.4.tgz",
2177 + "integrity": "sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==",
2178 + "dev": true,
2179 + "dependencies": {
2180 + "@types/node": "*"
2181 + }
2182 + },
2183 + "node_modules/@types/katex": {
2184 + "version": "0.16.7",
2185 + "resolved": "https://registry.npmjs.org/@types/katex/-/katex-0.16.7.tgz",
2186 + "integrity": "sha512-HMwFiRujE5PjrgwHQ25+bsLJgowjGjm5Z8FVSf0N6PwgJrwxH0QxzHYDcKsTfV3wva0vzrpqMTJS2jXPr5BMEQ=="
2187 + },
2188 + "node_modules/@types/lodash": {
2189 + "version": "4.17.5",
2190 + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.5.tgz",
2191 + "integrity": "sha512-MBIOHVZqVqgfro1euRDWX7OO0fBVUUMrN6Pwm8LQsz8cWhEpihlvR70ENj3f40j58TNxZaWv2ndSkInykNBBJw=="
2192 + },
2193 + "node_modules/@types/lodash-es": {
2194 + "version": "4.17.12",
2195 + "resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.12.tgz",
2196 + "integrity": "sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==",
2197 + "dependencies": {
2198 + "@types/lodash": "*"
2199 + }
2200 + },
2201 + "node_modules/@types/node": {
2202 + "version": "20.14.5",
2203 + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.5.tgz",
2204 + "integrity": "sha512-aoRR+fJkZT2l0aGOJhuA8frnCSoNX6W7U2mpNq63+BxBIj5BQFt8rHy627kijCmm63ijdSdwvGgpUsU6MBsZZA==",
2205 + "dev": true,
2206 + "dependencies": {
2207 + "undici-types": "~5.26.4"
2208 + }
2209 + },
2210 + "node_modules/@types/semver": {
2211 + "version": "7.5.8",
2212 + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz",
2213 + "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ=="
2214 + },
2215 + "node_modules/@types/sinonjs__fake-timers": {
2216 + "version": "8.1.1",
2217 + "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.1.tgz",
2218 + "integrity": "sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g==",
2219 + "dev": true
2220 + },
2221 + "node_modules/@types/sizzle": {
2222 + "version": "2.3.8",
2223 + "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.8.tgz",
2224 + "integrity": "sha512-0vWLNK2D5MT9dg0iOo8GlKguPAU02QjmZitPEsXRuJXU/OGIOt9vT9Fc26wtYuavLxtO45v9PGleoL9Z0k1LHg==",
2225 + "dev": true
2226 + },
2227 + "node_modules/@types/through": {
2228 + "version": "0.0.33",
2229 + "resolved": "https://registry.npmjs.org/@types/through/-/through-0.0.33.tgz",
2230 + "integrity": "sha512-HsJ+z3QuETzP3cswwtzt2vEIiHBk/dCcHGhbmG5X3ecnwFD/lPrMpliGXxSCg03L9AhrdwA4Oz/qfspkDW+xGQ==",
2231 + "dev": true,
2232 + "dependencies": {
2233 + "@types/node": "*"
2234 + }
2235 + },
2236 + "node_modules/@types/tough-cookie": {
2237 + "version": "4.0.5",
2238 + "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz",
2239 + "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==",
2240 + "dev": true
2241 + },
2242 + "node_modules/@types/validator": {
2243 + "version": "13.12.0",
2244 + "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.12.0.tgz",
2245 + "integrity": "sha512-nH45Lk7oPIJ1RVOF6JgFI6Dy0QpHEzq4QecZhvguxYPDwT8c93prCMqAtiIttm39voZ+DDR+qkNnMpJmMBRqag==",
2246 + "dev": true
2247 + },
2248 + "node_modules/@types/web-bluetooth": {
2249 + "version": "0.0.20",
2250 + "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.20.tgz",
2251 + "integrity": "sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow=="
2252 + },
2253 + "node_modules/@types/yauzl": {
2254 + "version": "2.10.3",
2255 + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz",
2256 + "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==",
2257 + "dev": true,
2258 + "optional": true,
2259 + "dependencies": {
2260 + "@types/node": "*"
2261 + }
2262 + },
2263 + "node_modules/@typescript-eslint/eslint-plugin": {
2264 + "version": "7.13.0",
2265 + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.13.0.tgz",
2266 + "integrity": "sha512-FX1X6AF0w8MdVFLSdqwqN/me2hyhuQg4ykN6ZpVhh1ij/80pTvDKclX1sZB9iqex8SjQfVhwMKs3JtnnMLzG9w==",
2267 + "dev": true,
2268 + "dependencies": {
2269 + "@eslint-community/regexpp": "^4.10.0",
2270 + "@typescript-eslint/scope-manager": "7.13.0",
2271 + "@typescript-eslint/type-utils": "7.13.0",
2272 + "@typescript-eslint/utils": "7.13.0",
2273 + "@typescript-eslint/visitor-keys": "7.13.0",
2274 + "graphemer": "^1.4.0",
2275 + "ignore": "^5.3.1",
2276 + "natural-compare": "^1.4.0",
2277 + "ts-api-utils": "^1.3.0"
2278 + },
2279 + "engines": {
2280 + "node": "^18.18.0 || >=20.0.0"
2281 + },
2282 + "funding": {
2283 + "type": "opencollective",
2284 + "url": "https://opencollective.com/typescript-eslint"
2285 + },
2286 + "peerDependencies": {
2287 + "@typescript-eslint/parser": "^7.0.0",
2288 + "eslint": "^8.56.0"
2289 + },
2290 + "peerDependenciesMeta": {
2291 + "typescript": {
2292 + "optional": true
2293 + }
2294 + }
2295 + },
2296 + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager": {
2297 + "version": "7.13.0",
2298 + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.13.0.tgz",
2299 + "integrity": "sha512-ZrMCe1R6a01T94ilV13egvcnvVJ1pxShkE0+NDjDzH4nvG1wXpwsVI5bZCvE7AEDH1mXEx5tJSVR68bLgG7Dng==",
2300 + "dev": true,
2301 + "dependencies": {
2302 + "@typescript-eslint/types": "7.13.0",
2303 + "@typescript-eslint/visitor-keys": "7.13.0"
2304 + },
2305 + "engines": {
2306 + "node": "^18.18.0 || >=20.0.0"
2307 + },
2308 + "funding": {
2309 + "type": "opencollective",
2310 + "url": "https://opencollective.com/typescript-eslint"
2311 + }
2312 + },
2313 + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": {
2314 + "version": "7.13.0",
2315 + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.13.0.tgz",
2316 + "integrity": "sha512-QWuwm9wcGMAuTsxP+qz6LBBd3Uq8I5Nv8xb0mk54jmNoCyDspnMvVsOxI6IsMmway5d1S9Su2+sCKv1st2l6eA==",
2317 + "dev": true,
2318 + "engines": {
2319 + "node": "^18.18.0 || >=20.0.0"
2320 + },
2321 + "funding": {
2322 + "type": "opencollective",
2323 + "url": "https://opencollective.com/typescript-eslint"
2324 + }
2325 + },
2326 + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/typescript-estree": {
2327 + "version": "7.13.0",
2328 + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.13.0.tgz",
2329 + "integrity": "sha512-cAvBvUoobaoIcoqox1YatXOnSl3gx92rCZoMRPzMNisDiM12siGilSM4+dJAekuuHTibI2hVC2fYK79iSFvWjw==",
2330 + "dev": true,
2331 + "dependencies": {
2332 + "@typescript-eslint/types": "7.13.0",
2333 + "@typescript-eslint/visitor-keys": "7.13.0",
2334 + "debug": "^4.3.4",
2335 + "globby": "^11.1.0",
2336 + "is-glob": "^4.0.3",
2337 + "minimatch": "^9.0.4",
2338 + "semver": "^7.6.0",
2339 + "ts-api-utils": "^1.3.0"
2340 + },
2341 + "engines": {
2342 + "node": "^18.18.0 || >=20.0.0"
2343 + },
2344 + "funding": {
2345 + "type": "opencollective",
2346 + "url": "https://opencollective.com/typescript-eslint"
2347 + },
2348 + "peerDependenciesMeta": {
2349 + "typescript": {
2350 + "optional": true
2351 + }
2352 + }
2353 + },
2354 + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils": {
2355 + "version": "7.13.0",
2356 + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.13.0.tgz",
2357 + "integrity": "sha512-jceD8RgdKORVnB4Y6BqasfIkFhl4pajB1wVxrF4akxD2QPM8GNYjgGwEzYS+437ewlqqrg7Dw+6dhdpjMpeBFQ==",
2358 + "dev": true,
2359 + "dependencies": {
2360 + "@eslint-community/eslint-utils": "^4.4.0",
2361 + "@typescript-eslint/scope-manager": "7.13.0",
2362 + "@typescript-eslint/types": "7.13.0",
2363 + "@typescript-eslint/typescript-estree": "7.13.0"
2364 + },
2365 + "engines": {
2366 + "node": "^18.18.0 || >=20.0.0"
2367 + },
2368 + "funding": {
2369 + "type": "opencollective",
2370 + "url": "https://opencollective.com/typescript-eslint"
2371 + },
2372 + "peerDependencies": {
2373 + "eslint": "^8.56.0"
2374 + }
2375 + },
2376 + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": {
2377 + "version": "7.13.0",
2378 + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.13.0.tgz",
2379 + "integrity": "sha512-nxn+dozQx+MK61nn/JP+M4eCkHDSxSLDpgE3WcQo0+fkjEolnaB5jswvIKC4K56By8MMgIho7f1PVxERHEo8rw==",
2380 + "dev": true,
2381 + "dependencies": {
2382 + "@typescript-eslint/types": "7.13.0",
2383 + "eslint-visitor-keys": "^3.4.3"
2384 + },
2385 + "engines": {
2386 + "node": "^18.18.0 || >=20.0.0"
2387 + },
2388 + "funding": {
2389 + "type": "opencollective",
2390 + "url": "https://opencollective.com/typescript-eslint"
2391 + }
2392 + },
2393 + "node_modules/@typescript-eslint/eslint-plugin/node_modules/minimatch": {
2394 + "version": "9.0.4",
2395 + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz",
2396 + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==",
2397 "dev": true,
2398 "dependencies": {
1662 - "@types/through": "*",
1663 - "rxjs": "^7.2.0"
2399 + "brace-expansion": "^2.0.1"
2400 + },
2401 + "engines": {
2402 + "node": ">=16 || 14 >=14.17"
2403 + },
2404 + "funding": {
2405 + "url": "https://github.com/sponsors/isaacs"
2406 }
2407 },
1666 - "node_modules/@types/jsdom": {
1667 - "version": "21.1.7",
1668 - "resolved": "https://registry.npmjs.org/@types/jsdom/-/jsdom-21.1.7.tgz",
1669 - "integrity": "sha512-yOriVnggzrnQ3a9OKOCxaVuSug3w3/SbOj5i7VwXWZEyUNl3bLF9V3MfxGbZKuwqJOQyRfqXyROBB1CoZLFWzA==",
2408 + "node_modules/@typescript-eslint/parser": {
2409 + "version": "7.13.0",
2410 + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.13.0.tgz",
2411 + "integrity": "sha512-EjMfl69KOS9awXXe83iRN7oIEXy9yYdqWfqdrFAYAAr6syP8eLEFI7ZE4939antx2mNgPRW/o1ybm2SFYkbTVA==",
2412 "dev": true,
2413 "dependencies": {
1672 - "@types/node": "*",
1673 - "@types/tough-cookie": "*",
1674 - "parse5": "^7.0.0"
2414 + "@typescript-eslint/scope-manager": "7.13.0",
2415 + "@typescript-eslint/types": "7.13.0",
2416 + "@typescript-eslint/typescript-estree": "7.13.0",
2417 + "@typescript-eslint/visitor-keys": "7.13.0",
2418 + "debug": "^4.3.4"
2419 + },
2420 + "engines": {
2421 + "node": "^18.18.0 || >=20.0.0"
2422 + },
2423 + "funding": {
2424 + "type": "opencollective",
2425 + "url": "https://opencollective.com/typescript-eslint"
2426 + },
2427 + "peerDependencies": {
2428 + "eslint": "^8.56.0"
2429 + },
2430 + "peerDependenciesMeta": {
2431 + "typescript": {
2432 + "optional": true
2433 + }
2434 }
2435 },
1677 - "node_modules/@types/json-schema": {
1678 - "version": "7.0.15",
1679 - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
1680 - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA=="
1681 - },
1682 - "node_modules/@types/jsonfile": {
1683 - "version": "6.1.4",
1684 - "resolved": "https://registry.npmjs.org/@types/jsonfile/-/jsonfile-6.1.4.tgz",
1685 - "integrity": "sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==",
2436 + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/scope-manager": {
2437 + "version": "7.13.0",
2438 + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.13.0.tgz",
2439 + "integrity": "sha512-ZrMCe1R6a01T94ilV13egvcnvVJ1pxShkE0+NDjDzH4nvG1wXpwsVI5bZCvE7AEDH1mXEx5tJSVR68bLgG7Dng==",
2440 "dev": true,
2441 "dependencies": {
1688 - "@types/node": "*"
2442 + "@typescript-eslint/types": "7.13.0",
2443 + "@typescript-eslint/visitor-keys": "7.13.0"
2444 + },
2445 + "engines": {
2446 + "node": "^18.18.0 || >=20.0.0"
2447 + },
2448 + "funding": {
2449 + "type": "opencollective",
2450 + "url": "https://opencollective.com/typescript-eslint"
2451 }
2452 },
1691 - "node_modules/@types/katex": {
1692 - "version": "0.16.7",
1693 - "resolved": "https://registry.npmjs.org/@types/katex/-/katex-0.16.7.tgz",
1694 - "integrity": "sha512-HMwFiRujE5PjrgwHQ25+bsLJgowjGjm5Z8FVSf0N6PwgJrwxH0QxzHYDcKsTfV3wva0vzrpqMTJS2jXPr5BMEQ=="
1695 - },
1696 - "node_modules/@types/lodash": {
1697 - "version": "4.17.4",
1698 - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.4.tgz",
1699 - "integrity": "sha512-wYCP26ZLxaT3R39kiN2+HcJ4kTd3U1waI/cY7ivWYqFP6pW3ZNpvi6Wd6PHZx7T/t8z0vlkXMg3QYLa7DZ/IJQ=="
1700 - },
1701 - "node_modules/@types/lodash-es": {
1702 - "version": "4.17.12",
1703 - "resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.12.tgz",
1704 - "integrity": "sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==",
1705 - "dependencies": {
1706 - "@types/lodash": "*"
2453 + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": {
2454 + "version": "7.13.0",
2455 + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.13.0.tgz",
2456 + "integrity": "sha512-QWuwm9wcGMAuTsxP+qz6LBBd3Uq8I5Nv8xb0mk54jmNoCyDspnMvVsOxI6IsMmway5d1S9Su2+sCKv1st2l6eA==",
2457 + "dev": true,
2458 + "engines": {
2459 + "node": "^18.18.0 || >=20.0.0"
2460 + },
2461 + "funding": {
2462 + "type": "opencollective",
2463 + "url": "https://opencollective.com/typescript-eslint"
2464 }
2465 },
1709 - "node_modules/@types/node": {
1710 - "version": "20.14.2",
1711 - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.2.tgz",
1712 - "integrity": "sha512-xyu6WAMVwv6AKFLB+e/7ySZVr/0zLCzOa7rSpq6jNwpqOrUbcACDWC+53d4n2QHOnDou0fbIsg8wZu/sxrnI4Q==",
2466 + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree": {
2467 + "version": "7.13.0",
2468 + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.13.0.tgz",
2469 + "integrity": "sha512-cAvBvUoobaoIcoqox1YatXOnSl3gx92rCZoMRPzMNisDiM12siGilSM4+dJAekuuHTibI2hVC2fYK79iSFvWjw==",
2470 "dev": true,
2471 "dependencies": {
1715 - "undici-types": "~5.26.4"
2472 + "@typescript-eslint/types": "7.13.0",
2473 + "@typescript-eslint/visitor-keys": "7.13.0",
2474 + "debug": "^4.3.4",
2475 + "globby": "^11.1.0",
2476 + "is-glob": "^4.0.3",
2477 + "minimatch": "^9.0.4",
2478 + "semver": "^7.6.0",
2479 + "ts-api-utils": "^1.3.0"
2480 + },
2481 + "engines": {
2482 + "node": "^18.18.0 || >=20.0.0"
2483 + },
2484 + "funding": {
2485 + "type": "opencollective",
2486 + "url": "https://opencollective.com/typescript-eslint"
2487 + },
2488 + "peerDependenciesMeta": {
2489 + "typescript": {
2490 + "optional": true
2491 + }
2492 }
2493 },
1718 - "node_modules/@types/semver": {
1719 - "version": "7.5.8",
1720 - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz",
1721 - "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ=="
1722 - },
1723 - "node_modules/@types/sinonjs__fake-timers": {
1724 - "version": "8.1.1",
1725 - "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.1.tgz",
1726 - "integrity": "sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g==",
1727 - "dev": true
1728 - },
1729 - "node_modules/@types/sizzle": {
1730 - "version": "2.3.8",
1731 - "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.8.tgz",
1732 - "integrity": "sha512-0vWLNK2D5MT9dg0iOo8GlKguPAU02QjmZitPEsXRuJXU/OGIOt9vT9Fc26wtYuavLxtO45v9PGleoL9Z0k1LHg==",
1733 - "dev": true
1734 - },
1735 - "node_modules/@types/through": {
1736 - "version": "0.0.33",
1737 - "resolved": "https://registry.npmjs.org/@types/through/-/through-0.0.33.tgz",
1738 - "integrity": "sha512-HsJ+z3QuETzP3cswwtzt2vEIiHBk/dCcHGhbmG5X3ecnwFD/lPrMpliGXxSCg03L9AhrdwA4Oz/qfspkDW+xGQ==",
2494 + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/visitor-keys": {
2495 + "version": "7.13.0",
2496 + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.13.0.tgz",
2497 + "integrity": "sha512-nxn+dozQx+MK61nn/JP+M4eCkHDSxSLDpgE3WcQo0+fkjEolnaB5jswvIKC4K56By8MMgIho7f1PVxERHEo8rw==",
2498 "dev": true,
2499 "dependencies": {
1741 - "@types/node": "*"
2500 + "@typescript-eslint/types": "7.13.0",
2501 + "eslint-visitor-keys": "^3.4.3"
2502 + },
2503 + "engines": {
2504 + "node": "^18.18.0 || >=20.0.0"
2505 + },
2506 + "funding": {
2507 + "type": "opencollective",
2508 + "url": "https://opencollective.com/typescript-eslint"
2509 }
2510 },
1744 - "node_modules/@types/tough-cookie": {
1745 - "version": "4.0.5",
1746 - "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz",
1747 - "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==",
1748 - "dev": true
1749 - },
1750 - "node_modules/@types/validator": {
1751 - "version": "13.11.10",
1752 - "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.11.10.tgz",
1753 - "integrity": "sha512-e2PNXoXLr6Z+dbfx5zSh9TRlXJrELycxiaXznp4S5+D2M3b9bqJEitNHA5923jhnB2zzFiZHa2f0SI1HoIahpg==",
1754 - "dev": true
1755 - },
1756 - "node_modules/@types/web-bluetooth": {
1757 - "version": "0.0.20",
1758 - "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.20.tgz",
1759 - "integrity": "sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow=="
1760 - },
1761 - "node_modules/@types/yauzl": {
1762 - "version": "2.10.3",
1763 - "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz",
1764 - "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==",
2511 + "node_modules/@typescript-eslint/parser/node_modules/minimatch": {
2512 + "version": "9.0.4",
2513 + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz",
2514 + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==",
2515 "dev": true,
1766 - "optional": true,
2516 "dependencies": {
1768 - "@types/node": "*"
2517 + "brace-expansion": "^2.0.1"
2518 + },
2519 + "engines": {
2520 + "node": ">=16 || 14 >=14.17"
2521 + },
2522 + "funding": {
2523 + "url": "https://github.com/sponsors/isaacs"
2524 }
2525 },
1771 - "node_modules/@typescript-eslint/eslint-plugin": {
2526 + "node_modules/@typescript-eslint/scope-manager": {
2527 "version": "6.21.0",
1773 - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz",
1774 - "integrity": "sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==",
2528 + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz",
2529 + "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==",
2530 "dependencies": {
1776 - "@eslint-community/regexpp": "^4.5.1",
1777 - "@typescript-eslint/scope-manager": "6.21.0",
1778 - "@typescript-eslint/type-utils": "6.21.0",
1779 - "@typescript-eslint/utils": "6.21.0",
1780 - "@typescript-eslint/visitor-keys": "6.21.0",
1781 - "debug": "^4.3.4",
1782 - "graphemer": "^1.4.0",
1783 - "ignore": "^5.2.4",
1784 - "natural-compare": "^1.4.0",
1785 - "semver": "^7.5.4",
1786 - "ts-api-utils": "^1.0.1"
2531 + "@typescript-eslint/types": "6.21.0",
2532 + "@typescript-eslint/visitor-keys": "6.21.0"
2533 },
2534 "engines": {
2535 "node": "^16.0.0 || >=18.0.0"
2536 },
2537 + "funding": {
2538 + "type": "opencollective",
2539 + "url": "https://opencollective.com/typescript-eslint"
2540 + }
2541 + },
2542 + "node_modules/@typescript-eslint/type-utils": {
2543 + "version": "7.13.0",
2544 + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.13.0.tgz",
2545 + "integrity": "sha512-xMEtMzxq9eRkZy48XuxlBFzpVMDurUAfDu5Rz16GouAtXm0TaAoTFzqWUFPPuQYXI/CDaH/Bgx/fk/84t/Bc9A==",
2546 + "dev": true,
2547 + "dependencies": {
2548 + "@typescript-eslint/typescript-estree": "7.13.0",
2549 + "@typescript-eslint/utils": "7.13.0",
2550 + "debug": "^4.3.4",
2551 + "ts-api-utils": "^1.3.0"
2552 + },
2553 + "engines": {
2554 + "node": "^18.18.0 || >=20.0.0"
2555 + },
2556 "funding": {
2557 "type": "opencollective",
2558 "url": "https://opencollective.com/typescript-eslint"
2559 },
2560 "peerDependencies": {
1796 - "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha",
1797 - "eslint": "^7.0.0 || ^8.0.0"
2561 + "eslint": "^8.56.0"
2562 },
2563 "peerDependenciesMeta": {
2564 "typescript": {
@@ -1802,26 +2566,57 @@
2566 }
2567 }
2568 },
1805 - "node_modules/@typescript-eslint/parser": {
1806 - "version": "6.21.0",
1807 - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz",
1808 - "integrity": "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==",
2569 + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/scope-manager": {
2570 + "version": "7.13.0",
2571 + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.13.0.tgz",
2572 + "integrity": "sha512-ZrMCe1R6a01T94ilV13egvcnvVJ1pxShkE0+NDjDzH4nvG1wXpwsVI5bZCvE7AEDH1mXEx5tJSVR68bLgG7Dng==",
2573 + "dev": true,
2574 "dependencies": {
1810 - "@typescript-eslint/scope-manager": "6.21.0",
1811 - "@typescript-eslint/types": "6.21.0",
1812 - "@typescript-eslint/typescript-estree": "6.21.0",
1813 - "@typescript-eslint/visitor-keys": "6.21.0",
1814 - "debug": "^4.3.4"
2575 + "@typescript-eslint/types": "7.13.0",
2576 + "@typescript-eslint/visitor-keys": "7.13.0"
2577 },
2578 "engines": {
1817 - "node": "^16.0.0 || >=18.0.0"
2579 + "node": "^18.18.0 || >=20.0.0"
2580 },
2581 "funding": {
2582 "type": "opencollective",
2583 "url": "https://opencollective.com/typescript-eslint"
2584 + }
2585 + },
2586 + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": {
2587 + "version": "7.13.0",
2588 + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.13.0.tgz",
2589 + "integrity": "sha512-QWuwm9wcGMAuTsxP+qz6LBBd3Uq8I5Nv8xb0mk54jmNoCyDspnMvVsOxI6IsMmway5d1S9Su2+sCKv1st2l6eA==",
2590 + "dev": true,
2591 + "engines": {
2592 + "node": "^18.18.0 || >=20.0.0"
2593 },
1823 - "peerDependencies": {
1824 - "eslint": "^7.0.0 || ^8.0.0"
2594 + "funding": {
2595 + "type": "opencollective",
2596 + "url": "https://opencollective.com/typescript-eslint"
2597 + }
2598 + },
2599 + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": {
2600 + "version": "7.13.0",
2601 + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.13.0.tgz",
2602 + "integrity": "sha512-cAvBvUoobaoIcoqox1YatXOnSl3gx92rCZoMRPzMNisDiM12siGilSM4+dJAekuuHTibI2hVC2fYK79iSFvWjw==",
2603 + "dev": true,
2604 + "dependencies": {
2605 + "@typescript-eslint/types": "7.13.0",
2606 + "@typescript-eslint/visitor-keys": "7.13.0",
2607 + "debug": "^4.3.4",
2608 + "globby": "^11.1.0",
2609 + "is-glob": "^4.0.3",
2610 + "minimatch": "^9.0.4",
2611 + "semver": "^7.6.0",
2612 + "ts-api-utils": "^1.3.0"
2613 + },
2614 + "engines": {
2615 + "node": "^18.18.0 || >=20.0.0"
2616 + },
2617 + "funding": {
2618 + "type": "opencollective",
2619 + "url": "https://opencollective.com/typescript-eslint"
2620 },
2621 "peerDependenciesMeta": {
2622 "typescript": {
@@ -1829,46 +2624,58 @@
2624 }
2625 }
2626 },
1832 - "node_modules/@typescript-eslint/scope-manager": {
1833 - "version": "6.21.0",
1834 - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz",
1835 - "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==",
2627 + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/utils": {
2628 + "version": "7.13.0",
2629 + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.13.0.tgz",
2630 + "integrity": "sha512-jceD8RgdKORVnB4Y6BqasfIkFhl4pajB1wVxrF4akxD2QPM8GNYjgGwEzYS+437ewlqqrg7Dw+6dhdpjMpeBFQ==",
2631 + "dev": true,
2632 "dependencies": {
1837 - "@typescript-eslint/types": "6.21.0",
1838 - "@typescript-eslint/visitor-keys": "6.21.0"
2633 + "@eslint-community/eslint-utils": "^4.4.0",
2634 + "@typescript-eslint/scope-manager": "7.13.0",
2635 + "@typescript-eslint/types": "7.13.0",
2636 + "@typescript-eslint/typescript-estree": "7.13.0"
2637 },
2638 "engines": {
1841 - "node": "^16.0.0 || >=18.0.0"
2639 + "node": "^18.18.0 || >=20.0.0"
2640 + },
2641 + "funding": {
2642 + "type": "opencollective",
2643 + "url": "https://opencollective.com/typescript-eslint"
2644 + },
2645 + "peerDependencies": {
2646 + "eslint": "^8.56.0"
2647 + }
2648 + },
2649 + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": {
2650 + "version": "7.13.0",
2651 + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.13.0.tgz",
2652 + "integrity": "sha512-nxn+dozQx+MK61nn/JP+M4eCkHDSxSLDpgE3WcQo0+fkjEolnaB5jswvIKC4K56By8MMgIho7f1PVxERHEo8rw==",
2653 + "dev": true,
2654 + "dependencies": {
2655 + "@typescript-eslint/types": "7.13.0",
2656 + "eslint-visitor-keys": "^3.4.3"
2657 + },
2658 + "engines": {
2659 + "node": "^18.18.0 || >=20.0.0"
2660 },
2661 "funding": {
2662 "type": "opencollective",
2663 "url": "https://opencollective.com/typescript-eslint"
2664 }
2665 },
1848 - "node_modules/@typescript-eslint/type-utils": {
1849 - "version": "6.21.0",
1850 - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.21.0.tgz",
1851 - "integrity": "sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==",
2666 + "node_modules/@typescript-eslint/type-utils/node_modules/minimatch": {
2667 + "version": "9.0.4",
2668 + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz",
2669 + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==",
2670 + "dev": true,
2671 "dependencies": {
1853 - "@typescript-eslint/typescript-estree": "6.21.0",
1854 - "@typescript-eslint/utils": "6.21.0",
1855 - "debug": "^4.3.4",
1856 - "ts-api-utils": "^1.0.1"
2672 + "brace-expansion": "^2.0.1"
2673 },
2674 "engines": {
1859 - "node": "^16.0.0 || >=18.0.0"
2675 + "node": ">=16 || 14 >=14.17"
2676 },
2677 "funding": {
1862 - "type": "opencollective",
1863 - "url": "https://opencollective.com/typescript-eslint"
1864 - },
1865 - "peerDependencies": {
1866 - "eslint": "^7.0.0 || ^8.0.0"
1867 - },
1868 - "peerDependenciesMeta": {
1869 - "typescript": {
1870 - "optional": true
1871 - }
2678 + "url": "https://github.com/sponsors/isaacs"
2679 }
2680 },
2681 "node_modules/@typescript-eslint/types": {
@@ -1950,11 +2757,6 @@
2757 "url": "https://opencollective.com/typescript-eslint"
2758 }
2759 },
1953 - "node_modules/@ungap/structured-clone": {
1954 - "version": "1.2.0",
1955 - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz",
1956 - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ=="
1957 - },
2760 "node_modules/@unocss/config": {
2761 "version": "0.56.5",
2762 "resolved": "https://registry.npmjs.org/@unocss/config/-/config-0.56.5.tgz",
@@ -2147,31 +2949,32 @@
2949 }
2950 },
2951 "node_modules/@volar/language-core": {
2150 - "version": "2.2.4",
2151 - "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.2.4.tgz",
2152 - "integrity": "sha512-7As47GndxGxsqqYnbreLrfB5NDUeQioPM2LJKUuB4/34c0NpEJ2byVl3c9KYdjIdiEstWZ9JLtLKNTaPWb5jtA==",
2952 + "version": "2.3.0",
2953 + "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.3.0.tgz",
2954 + "integrity": "sha512-pvhL24WUh3VDnv7Yw5N1sjhPtdx7q9g+Wl3tggmnkMcyK8GcCNElF2zHiKznryn0DiUGk+eez/p2qQhz+puuHw==",
2955 "dev": true,
2956 "dependencies": {
2155 - "@volar/source-map": "2.2.4"
2957 + "@volar/source-map": "2.3.0"
2958 }
2959 },
2960 "node_modules/@volar/source-map": {
2159 - "version": "2.2.4",
2160 - "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.2.4.tgz",
2161 - "integrity": "sha512-m92FLpR9vB1YEZfiZ+bfgpLrToL/DNkOrorWVep3pffHrwwI4Tx2oIQN+sqHJfKkiT5N3J1owC+8crhAEinfjg==",
2961 + "version": "2.3.0",
2962 + "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.3.0.tgz",
2963 + "integrity": "sha512-G/228aZjAOGhDjhlyZ++nDbKrS9uk+5DMaEstjvzglaAw7nqtDyhnQAsYzUg6BMP9BtwZ59RIw5HGePrutn00Q==",
2964 "dev": true,
2965 "dependencies": {
2966 "muggle-string": "^0.4.0"
2967 }
2968 },
2969 "node_modules/@volar/typescript": {
2168 - "version": "2.2.4",
2169 - "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.2.4.tgz",
2170 - "integrity": "sha512-uAQC53tgEbHO62G8NXMfmBrJAlP2QJ9WxVEEQqqK3I6VSy8frL5LbH3hAWODxiwMWixv74wJLWlKbWXOgdIoRQ==",
2970 + "version": "2.3.0",
2971 + "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.3.0.tgz",
2972 + "integrity": "sha512-PtUwMM87WsKVeLJN33GSTUjBexlKfKgouWlOUIv7pjrOnTwhXHZNSmpc312xgXdTjQPpToK6KXSIcKu9sBQ5LQ==",
2973 "dev": true,
2974 "dependencies": {
2173 - "@volar/language-core": "2.2.4",
2174 - "path-browserify": "^1.0.1"
2975 + "@volar/language-core": "2.3.0",
2976 + "path-browserify": "^1.0.1",
2977 + "vscode-uri": "^3.0.8"
2978 }
2979 },
2980 "node_modules/@vue/babel-helper-vue-transform-on": {
@@ -2248,36 +3051,36 @@
3051 }
3052 },
3053 "node_modules/@vue/compiler-core": {
2251 - "version": "3.4.27",
2252 - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.27.tgz",
2253 - "integrity": "sha512-E+RyqY24KnyDXsCuQrI+mlcdW3ALND6U7Gqa/+bVwbcpcR3BRRIckFoz7Qyd4TTlnugtwuI7YgjbvsLmxb+yvg==",
3054 + "version": "3.4.29",
3055 + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.29.tgz",
3056 + "integrity": "sha512-TFKiRkKKsRCKvg/jTSSKK7mYLJEQdUiUfykbG49rubC9SfDyvT2JrzTReopWlz2MxqeLyxh9UZhvxEIBgAhtrg==",
3057 "dependencies": {
2255 - "@babel/parser": "^7.24.4",
2256 - "@vue/shared": "3.4.27",
3058 + "@babel/parser": "^7.24.7",
3059 + "@vue/shared": "3.4.29",
3060 "entities": "^4.5.0",
3061 "estree-walker": "^2.0.2",
3062 "source-map-js": "^1.2.0"
3063 }
3064 },
3065 "node_modules/@vue/compiler-dom": {
2263 - "version": "3.4.27",
2264 - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.27.tgz",
2265 - "integrity": "sha512-kUTvochG/oVgE1w5ViSr3KUBh9X7CWirebA3bezTbB5ZKBQZwR2Mwj9uoSKRMFcz4gSMzzLXBPD6KpCLb9nvWw==",
3066 + "version": "3.4.29",
3067 + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.29.tgz",
3068 + "integrity": "sha512-A6+iZ2fKIEGnfPJejdB7b1FlJzgiD+Y/sxxKwJWg1EbJu6ZPgzaPQQ51ESGNv0CP6jm6Z7/pO6Ia8Ze6IKrX7w==",
3069 "dependencies": {
2267 - "@vue/compiler-core": "3.4.27",
2268 - "@vue/shared": "3.4.27"
3070 + "@vue/compiler-core": "3.4.29",
3071 + "@vue/shared": "3.4.29"
3072 }
3073 },
3074 "node_modules/@vue/compiler-sfc": {
2272 - "version": "3.4.27",
2273 - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.27.tgz",
2274 - "integrity": "sha512-nDwntUEADssW8e0rrmE0+OrONwmRlegDA1pD6QhVeXxjIytV03yDqTey9SBDiALsvAd5U4ZrEKbMyVXhX6mCGA==",
2275 - "dependencies": {
2276 - "@babel/parser": "^7.24.4",
2277 - "@vue/compiler-core": "3.4.27",
2278 - "@vue/compiler-dom": "3.4.27",
2279 - "@vue/compiler-ssr": "3.4.27",
2280 - "@vue/shared": "3.4.27",
3075 + "version": "3.4.29",
3076 + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.29.tgz",
3077 + "integrity": "sha512-zygDcEtn8ZimDlrEQyLUovoWgKQic6aEQqRXce2WXBvSeHbEbcAsXyCk9oG33ZkyWH4sl9D3tkYc1idoOkdqZQ==",
3078 + "dependencies": {
3079 + "@babel/parser": "^7.24.7",
3080 + "@vue/compiler-core": "3.4.29",
3081 + "@vue/compiler-dom": "3.4.29",
3082 + "@vue/compiler-ssr": "3.4.29",
3083 + "@vue/shared": "3.4.29",
3084 "estree-walker": "^2.0.2",
3085 "magic-string": "^0.30.10",
3086 "postcss": "^8.4.38",
@@ -2285,27 +3088,27 @@
3088 }
3089 },
3090 "node_modules/@vue/compiler-ssr": {
2288 - "version": "3.4.27",
2289 - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.27.tgz",
2290 - "integrity": "sha512-CVRzSJIltzMG5FcidsW0jKNQnNRYC8bT21VegyMMtHmhW3UOI7knmUehzswXLrExDLE6lQCZdrhD4ogI7c+vuw==",
3091 + "version": "3.4.29",
3092 + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.29.tgz",
3093 + "integrity": "sha512-rFbwCmxJ16tDp3N8XCx5xSQzjhidYjXllvEcqX/lopkoznlNPz3jyy0WGJCyhAaVQK677WWFt3YO/WUEkMMUFQ==",
3094 "dependencies": {
2292 - "@vue/compiler-dom": "3.4.27",
2293 - "@vue/shared": "3.4.27"
3095 + "@vue/compiler-dom": "3.4.29",
3096 + "@vue/shared": "3.4.29"
3097 }
3098 },
3099 "node_modules/@vue/devtools-api": {
2297 - "version": "6.6.1",
2298 - "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.1.tgz",
2299 - "integrity": "sha512-LgPscpE3Vs0x96PzSSB4IGVSZXZBZHpfxs+ZA1d+VEPwHdOXowy/Y2CsvCAIFrf+ssVU1pD1jidj505EpUnfbA=="
3100 + "version": "6.6.3",
3101 + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.3.tgz",
3102 + "integrity": "sha512-0MiMsFma/HqA6g3KLKn+AGpL1kgKhFWszC9U29NfpWK5LE7bjeXxySWJrOJ77hBz+TBrBQ7o4QJqbPbqbs8rJw=="
3103 },
3104 "node_modules/@vue/devtools-core": {
2302 - "version": "7.2.1",
2303 - "resolved": "https://registry.npmjs.org/@vue/devtools-core/-/devtools-core-7.2.1.tgz",
2304 - "integrity": "sha512-OyWl455UnJIVgZ6lo5WQ79WbDMoXtSRwyNKp9WzCZ0HhuQywIk4qv59KtLRe75uVmtGBde4hXNaSyRm+x9bY6g==",
3105 + "version": "7.3.1",
3106 + "resolved": "https://registry.npmjs.org/@vue/devtools-core/-/devtools-core-7.3.1.tgz",
3107 + "integrity": "sha512-5q+q4s3vop3HqSM0+sOVGhT4zEPlI9Cbo2u8sjjizWarBWM4r1FK+SRC2I2Yeg61xxcNViQ1+tOVF3QLNY7WuQ==",
3108 "dev": true,
3109 "dependencies": {
2307 - "@vue/devtools-kit": "^7.2.1",
2308 - "@vue/devtools-shared": "^7.2.1",
3110 + "@vue/devtools-kit": "^7.3.1",
3111 + "@vue/devtools-shared": "^7.3.1",
3112 "mitt": "^3.0.1",
3113 "nanoid": "^3.3.4",
3114 "pathe": "^1.1.2",
@@ -2313,25 +3116,27 @@
3116 }
3117 },
3118 "node_modules/@vue/devtools-kit": {
2316 - "version": "7.2.1",
2317 - "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-7.2.1.tgz",
2318 - "integrity": "sha512-Wak/fin1X0Q8LLIfCAHBrdaaB+R6IdpSXsDByPHbQ3BmkCP0/cIo/oEGp9i0U2+gEqD4L3V9RDjNf1S34DTzQQ==",
3119 + "version": "7.3.1",
3120 + "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-7.3.1.tgz",
3121 + "integrity": "sha512-O9LXPo0kC/PGFBRBMvT5PHiSXr6ZdJTshVuGQ1L2mnIZlIBdTjdtCRYQg/OMcEA5JDJPeJT8bnDYBBUbssGjoA==",
3122 "dev": true,
3123 "dependencies": {
2321 - "@vue/devtools-shared": "^7.2.1",
3124 + "@vue/devtools-shared": "^7.3.1",
3125 + "birpc": "^0.2.17",
3126 "hookable": "^5.5.3",
3127 "mitt": "^3.0.1",
3128 "perfect-debounce": "^1.0.0",
2325 - "speakingurl": "^14.0.1"
3129 + "speakingurl": "^14.0.1",
3130 + "superjson": "^2.2.1"
3131 },
3132 "peerDependencies": {
3133 "vue": "^3.0.0"
3134 }
3135 },
3136 "node_modules/@vue/devtools-shared": {
2332 - "version": "7.2.1",
2333 - "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-7.2.1.tgz",
2334 - "integrity": "sha512-PCJF4UknJmOal68+X9XHyVeQ+idv0LFujkTOIW30+GaMJqwFVN9LkQKX4gLqn61KkGMdJTzQ1bt7EJag3TI6AA==",
3137 + "version": "7.3.1",
3138 + "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-7.3.1.tgz",
3139 + "integrity": "sha512-TYbJLZwBy5+SliE095T+V0IMwRu+oP7I2KAsDuNtSsjHKITZvrhz2fNEvik9NsTLcEQBBoX81NvdgpoB29JAog==",
3140 "dev": true,
3141 "dependencies": {
3142 "rfdc": "^1.3.1"
@@ -2375,213 +3180,13 @@
3180 }
3181 }
3182 },
2378 - "node_modules/@vue/eslint-config-typescript/node_modules/@typescript-eslint/eslint-plugin": {
2379 - "version": "7.9.0",
2380 - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.9.0.tgz",
2381 - "integrity": "sha512-6e+X0X3sFe/G/54aC3jt0txuMTURqLyekmEHViqyA2VnxhLMpvA6nqmcjIy+Cr9tLDHPssA74BP5Mx9HQIxBEA==",
2382 - "dev": true,
2383 - "dependencies": {
2384 - "@eslint-community/regexpp": "^4.10.0",
2385 - "@typescript-eslint/scope-manager": "7.9.0",
2386 - "@typescript-eslint/type-utils": "7.9.0",
2387 - "@typescript-eslint/utils": "7.9.0",
2388 - "@typescript-eslint/visitor-keys": "7.9.0",
2389 - "graphemer": "^1.4.0",
2390 - "ignore": "^5.3.1",
2391 - "natural-compare": "^1.4.0",
2392 - "ts-api-utils": "^1.3.0"
2393 - },
2394 - "engines": {
2395 - "node": "^18.18.0 || >=20.0.0"
2396 - },
2397 - "funding": {
2398 - "type": "opencollective",
2399 - "url": "https://opencollective.com/typescript-eslint"
2400 - },
2401 - "peerDependencies": {
2402 - "@typescript-eslint/parser": "^7.0.0",
2403 - "eslint": "^8.56.0"
2404 - },
2405 - "peerDependenciesMeta": {
2406 - "typescript": {
2407 - "optional": true
2408 - }
2409 - }
2410 - },
2411 - "node_modules/@vue/eslint-config-typescript/node_modules/@typescript-eslint/parser": {
2412 - "version": "7.9.0",
2413 - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.9.0.tgz",
2414 - "integrity": "sha512-qHMJfkL5qvgQB2aLvhUSXxbK7OLnDkwPzFalg458pxQgfxKDfT1ZDbHQM/I6mDIf/svlMkj21kzKuQ2ixJlatQ==",
2415 - "dev": true,
2416 - "dependencies": {
2417 - "@typescript-eslint/scope-manager": "7.9.0",
2418 - "@typescript-eslint/types": "7.9.0",
2419 - "@typescript-eslint/typescript-estree": "7.9.0",
2420 - "@typescript-eslint/visitor-keys": "7.9.0",
2421 - "debug": "^4.3.4"
2422 - },
2423 - "engines": {
2424 - "node": "^18.18.0 || >=20.0.0"
2425 - },
2426 - "funding": {
2427 - "type": "opencollective",
2428 - "url": "https://opencollective.com/typescript-eslint"
2429 - },
2430 - "peerDependencies": {
2431 - "eslint": "^8.56.0"
2432 - },
2433 - "peerDependenciesMeta": {
2434 - "typescript": {
2435 - "optional": true
2436 - }
2437 - }
2438 - },
2439 - "node_modules/@vue/eslint-config-typescript/node_modules/@typescript-eslint/scope-manager": {
2440 - "version": "7.9.0",
2441 - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.9.0.tgz",
2442 - "integrity": "sha512-ZwPK4DeCDxr3GJltRz5iZejPFAAr4Wk3+2WIBaj1L5PYK5RgxExu/Y68FFVclN0y6GGwH8q+KgKRCvaTmFBbgQ==",
2443 - "dev": true,
2444 - "dependencies": {
2445 - "@typescript-eslint/types": "7.9.0",
2446 - "@typescript-eslint/visitor-keys": "7.9.0"
2447 - },
2448 - "engines": {
2449 - "node": "^18.18.0 || >=20.0.0"
2450 - },
2451 - "funding": {
2452 - "type": "opencollective",
2453 - "url": "https://opencollective.com/typescript-eslint"
2454 - }
2455 - },
2456 - "node_modules/@vue/eslint-config-typescript/node_modules/@typescript-eslint/type-utils": {
2457 - "version": "7.9.0",
2458 - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.9.0.tgz",
2459 - "integrity": "sha512-6Qy8dfut0PFrFRAZsGzuLoM4hre4gjzWJB6sUvdunCYZsYemTkzZNwF1rnGea326PHPT3zn5Lmg32M/xfJfByA==",
2460 - "dev": true,
2461 - "dependencies": {
2462 - "@typescript-eslint/typescript-estree": "7.9.0",
2463 - "@typescript-eslint/utils": "7.9.0",
2464 - "debug": "^4.3.4",
2465 - "ts-api-utils": "^1.3.0"
2466 - },
2467 - "engines": {
2468 - "node": "^18.18.0 || >=20.0.0"
2469 - },
2470 - "funding": {
2471 - "type": "opencollective",
2472 - "url": "https://opencollective.com/typescript-eslint"
2473 - },
2474 - "peerDependencies": {
2475 - "eslint": "^8.56.0"
2476 - },
2477 - "peerDependenciesMeta": {
2478 - "typescript": {
2479 - "optional": true
2480 - }
2481 - }
2482 - },
2483 - "node_modules/@vue/eslint-config-typescript/node_modules/@typescript-eslint/types": {
2484 - "version": "7.9.0",
2485 - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.9.0.tgz",
2486 - "integrity": "sha512-oZQD9HEWQanl9UfsbGVcZ2cGaR0YT5476xfWE0oE5kQa2sNK2frxOlkeacLOTh9po4AlUT5rtkGyYM5kew0z5w==",
2487 - "dev": true,
2488 - "engines": {
2489 - "node": "^18.18.0 || >=20.0.0"
2490 - },
2491 - "funding": {
2492 - "type": "opencollective",
2493 - "url": "https://opencollective.com/typescript-eslint"
2494 - }
2495 - },
2496 - "node_modules/@vue/eslint-config-typescript/node_modules/@typescript-eslint/typescript-estree": {
2497 - "version": "7.9.0",
2498 - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.9.0.tgz",
2499 - "integrity": "sha512-zBCMCkrb2YjpKV3LA0ZJubtKCDxLttxfdGmwZvTqqWevUPN0FZvSI26FalGFFUZU/9YQK/A4xcQF9o/VVaCKAg==",
2500 - "dev": true,
2501 - "dependencies": {
2502 - "@typescript-eslint/types": "7.9.0",
2503 - "@typescript-eslint/visitor-keys": "7.9.0",
2504 - "debug": "^4.3.4",
2505 - "globby": "^11.1.0",
2506 - "is-glob": "^4.0.3",
2507 - "minimatch": "^9.0.4",
2508 - "semver": "^7.6.0",
2509 - "ts-api-utils": "^1.3.0"
2510 - },
2511 - "engines": {
2512 - "node": "^18.18.0 || >=20.0.0"
2513 - },
2514 - "funding": {
2515 - "type": "opencollective",
2516 - "url": "https://opencollective.com/typescript-eslint"
2517 - },
2518 - "peerDependenciesMeta": {
2519 - "typescript": {
2520 - "optional": true
2521 - }
2522 - }
2523 - },
2524 - "node_modules/@vue/eslint-config-typescript/node_modules/@typescript-eslint/utils": {
2525 - "version": "7.9.0",
2526 - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.9.0.tgz",
2527 - "integrity": "sha512-5KVRQCzZajmT4Ep+NEgjXCvjuypVvYHUW7RHlXzNPuak2oWpVoD1jf5xCP0dPAuNIchjC7uQyvbdaSTFaLqSdA==",
2528 - "dev": true,
2529 - "dependencies": {
2530 - "@eslint-community/eslint-utils": "^4.4.0",
2531 - "@typescript-eslint/scope-manager": "7.9.0",
2532 - "@typescript-eslint/types": "7.9.0",
2533 - "@typescript-eslint/typescript-estree": "7.9.0"
2534 - },
2535 - "engines": {
2536 - "node": "^18.18.0 || >=20.0.0"
2537 - },
2538 - "funding": {
2539 - "type": "opencollective",
2540 - "url": "https://opencollective.com/typescript-eslint"
2541 - },
2542 - "peerDependencies": {
2543 - "eslint": "^8.56.0"
2544 - }
2545 - },
2546 - "node_modules/@vue/eslint-config-typescript/node_modules/@typescript-eslint/visitor-keys": {
2547 - "version": "7.9.0",
2548 - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.9.0.tgz",
2549 - "integrity": "sha512-iESPx2TNLDNGQLyjKhUvIKprlP49XNEK+MvIf9nIO7ZZaZdbnfWKHnXAgufpxqfA0YryH8XToi4+CjBgVnFTSQ==",
2550 - "dev": true,
2551 - "dependencies": {
2552 - "@typescript-eslint/types": "7.9.0",
2553 - "eslint-visitor-keys": "^3.4.3"
2554 - },
2555 - "engines": {
2556 - "node": "^18.18.0 || >=20.0.0"
2557 - },
2558 - "funding": {
2559 - "type": "opencollective",
2560 - "url": "https://opencollective.com/typescript-eslint"
2561 - }
2562 - },
2563 - "node_modules/@vue/eslint-config-typescript/node_modules/minimatch": {
2564 - "version": "9.0.4",
2565 - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz",
2566 - "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==",
2567 - "dev": true,
2568 - "dependencies": {
2569 - "brace-expansion": "^2.0.1"
2570 - },
2571 - "engines": {
2572 - "node": ">=16 || 14 >=14.17"
2573 - },
2574 - "funding": {
2575 - "url": "https://github.com/sponsors/isaacs"
2576 - }
2577 - },
3183 "node_modules/@vue/language-core": {
2579 - "version": "2.0.19",
2580 - "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-2.0.19.tgz",
2581 - "integrity": "sha512-A9EGOnvb51jOvnCYoRLnMP+CcoPlbZVxI9gZXE/y2GksRWM6j/PrLEIC++pnosWTN08tFpJgxhSS//E9v/Sg+Q==",
3184 + "version": "2.0.21",
3185 + "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-2.0.21.tgz",
3186 + "integrity": "sha512-vjs6KwnCK++kIXT+eI63BGpJHfHNVJcUCr3RnvJsccT3vbJnZV5IhHR2puEkoOkIbDdp0Gqi1wEnv3hEd3WsxQ==",
3187 "dev": true,
3188 "dependencies": {
2584 - "@volar/language-core": "~2.2.4",
3189 + "@volar/language-core": "~2.3.0-alpha.15",
3190 "@vue/compiler-dom": "^3.4.0",
3191 "@vue/shared": "^3.4.0",
3192 "computeds": "^0.0.1",
@@ -2599,48 +3204,49 @@
3204 }
3205 },
3206 "node_modules/@vue/reactivity": {
2602 - "version": "3.4.27",
2603 - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.4.27.tgz",
2604 - "integrity": "sha512-kK0g4NknW6JX2yySLpsm2jlunZJl2/RJGZ0H9ddHdfBVHcNzxmQ0sS0b09ipmBoQpY8JM2KmUw+a6sO8Zo+zIA==",
3207 + "version": "3.4.29",
3208 + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.4.29.tgz",
3209 + "integrity": "sha512-w8+KV+mb1a8ornnGQitnMdLfE0kXmteaxLdccm2XwdFxXst4q/Z7SEboCV5SqJNpZbKFeaRBBJBhW24aJyGINg==",
3210 "dependencies": {
2606 - "@vue/shared": "3.4.27"
3211 + "@vue/shared": "3.4.29"
3212 }
3213 },
3214 "node_modules/@vue/runtime-core": {
2610 - "version": "3.4.27",
2611 - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.4.27.tgz",
2612 - "integrity": "sha512-7aYA9GEbOOdviqVvcuweTLe5Za4qBZkUY7SvET6vE8kyypxVgaT1ixHLg4urtOlrApdgcdgHoTZCUuTGap/5WA==",
3215 + "version": "3.4.29",
3216 + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.4.29.tgz",
3217 + "integrity": "sha512-s8fmX3YVR/Rk5ig0ic0NuzTNjK2M7iLuVSZyMmCzN/+Mjuqqif1JasCtEtmtoJWF32pAtUjyuT2ljNKNLeOmnQ==",
3218 "dependencies": {
2614 - "@vue/reactivity": "3.4.27",
2615 - "@vue/shared": "3.4.27"
3219 + "@vue/reactivity": "3.4.29",
3220 + "@vue/shared": "3.4.29"
3221 }
3222 },
3223 "node_modules/@vue/runtime-dom": {
2619 - "version": "3.4.27",
2620 - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.4.27.tgz",
2621 - "integrity": "sha512-ScOmP70/3NPM+TW9hvVAz6VWWtZJqkbdf7w6ySsws+EsqtHvkhxaWLecrTorFxsawelM5Ys9FnDEMt6BPBDS0Q==",
3224 + "version": "3.4.29",
3225 + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.4.29.tgz",
3226 + "integrity": "sha512-gI10atCrtOLf/2MPPMM+dpz3NGulo9ZZR9d1dWo4fYvm+xkfvRrw1ZmJ7mkWtiJVXSsdmPbcK1p5dZzOCKDN0g==",
3227 "dependencies": {
2623 - "@vue/runtime-core": "3.4.27",
2624 - "@vue/shared": "3.4.27",
3228 + "@vue/reactivity": "3.4.29",
3229 + "@vue/runtime-core": "3.4.29",
3230 + "@vue/shared": "3.4.29",
3231 "csstype": "^3.1.3"
3232 }
3233 },
3234 "node_modules/@vue/server-renderer": {
2629 - "version": "3.4.27",
2630 - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.4.27.tgz",
2631 - "integrity": "sha512-dlAMEuvmeA3rJsOMJ2J1kXU7o7pOxgsNHVr9K8hB3ImIkSuBrIdy0vF66h8gf8Tuinf1TK3mPAz2+2sqyf3KzA==",
3235 + "version": "3.4.29",
3236 + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.4.29.tgz",
3237 + "integrity": "sha512-HMLCmPI2j/k8PVkSBysrA2RxcxC5DgBiCdj7n7H2QtR8bQQPqKAe8qoaxLcInzouBmzwJ+J0x20ygN/B5mYBng==",
3238 "dependencies": {
2633 - "@vue/compiler-ssr": "3.4.27",
2634 - "@vue/shared": "3.4.27"
3239 + "@vue/compiler-ssr": "3.4.29",
3240 + "@vue/shared": "3.4.29"
3241 },
3242 "peerDependencies": {
2637 - "vue": "3.4.27"
3243 + "vue": "3.4.29"
3244 }
3245 },
3246 "node_modules/@vue/shared": {
2641 - "version": "3.4.27",
2642 - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.27.tgz",
2643 - "integrity": "sha512-DL3NmY2OFlqmYYrzp39yi3LDkKxa5vZVwxWdQ3rG0ekuWscHraeIbnI8t+aZK7qhYqEqWKTUdijadunb9pnrgA=="
3247 + "version": "3.4.29",
3248 + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.29.tgz",
3249 + "integrity": "sha512-hQ2gAQcBO/CDpC82DCrinJNgOHI2v+FA7BDW4lMSPeBpQ7sRe2OLHWe5cph1s7D8DUQAwRt18dBDfJJ220APEA=="
3250 },
3251 "node_modules/@vue/test-utils": {
3252 "version": "2.4.6",
@@ -2659,19 +3265,19 @@
3265 "dev": true
3266 },
3267 "node_modules/@vueuse/components": {
2662 - "version": "10.10.0",
2663 - "resolved": "https://registry.npmjs.org/@vueuse/components/-/components-10.10.0.tgz",
2664 - "integrity": "sha512-HiA10NQ9HJAGnju+8ZK4TyA8LIc0a6BnJmVWDa/k+TRhaYCVacSDU04k0BQ2otV+gghUDdwu98upf6TDRXpoeg==",
3268 + "version": "10.11.0",
3269 + "resolved": "https://registry.npmjs.org/@vueuse/components/-/components-10.11.0.tgz",
3270 + "integrity": "sha512-ZvLZI23d5ZAtva5fGyYh/jQtZO8l+zJ5tAXyYNqHJZkq1o5yWyqZhENvSv5mfDmN5IuAOp4tq02mRmX/ipFGcg==",
3271 "dependencies": {
2666 - "@vueuse/core": "10.10.0",
2667 - "@vueuse/shared": "10.10.0",
2668 - "vue-demi": ">=0.14.7"
3272 + "@vueuse/core": "10.11.0",
3273 + "@vueuse/shared": "10.11.0",
3274 + "vue-demi": ">=0.14.8"
3275 }
3276 },
3277 "node_modules/@vueuse/components/node_modules/vue-demi": {
2672 - "version": "0.14.7",
2673 - "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.7.tgz",
2674 - "integrity": "sha512-EOG8KXDQNwkJILkx/gPcoL/7vH+hORoBaKgGe+6W7VFMvCYJfmF2dGbvgDroVnI8LU7/kTu8mbjRZGBU1z9NTA==",
3278 + "version": "0.14.8",
3279 + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.8.tgz",
3280 + "integrity": "sha512-Uuqnk9YE9SsWeReYqK2alDI5YzciATE0r2SkA6iMAtuXvNTMNACJLJEXNXaEy94ECuBe4Sk6RzRU80kjdbIo1Q==",
3281 "hasInstallScript": true,
3282 "bin": {
3283 "vue-demi-fix": "bin/vue-demi-fix.js",
@@ -2694,14 +3300,14 @@
3300 }
3301 },
3302 "node_modules/@vueuse/core": {
2697 - "version": "10.10.0",
2698 - "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-10.10.0.tgz",
2699 - "integrity": "sha512-vexJ/YXYs2S42B783rI95lMt3GzEwkxzC8Hb0Ndpd8rD+p+Lk/Za4bd797Ym7yq4jXqdSyj3JLChunF/vyYjUw==",
3303 + "version": "10.11.0",
3304 + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-10.11.0.tgz",
3305 + "integrity": "sha512-x3sD4Mkm7PJ+pcq3HX8PLPBadXCAlSDR/waK87dz0gQE+qJnaaFhc/dZVfJz+IUYzTMVGum2QlR7ImiJQN4s6g==",
3306 "dependencies": {
3307 "@types/web-bluetooth": "^0.0.20",
2702 - "@vueuse/metadata": "10.10.0",
2703 - "@vueuse/shared": "10.10.0",
2704 - "vue-demi": ">=0.14.7"
3308 + "@vueuse/metadata": "10.11.0",
3309 + "@vueuse/shared": "10.11.0",
3310 + "vue-demi": ">=0.14.8"
3311 },
3312 "funding": {
3313 "url": "https://github.com/sponsors/antfu"
@@ -2733,19 +3339,19 @@
3339 }
3340 },
3341 "node_modules/@vueuse/metadata": {
2736 - "version": "10.10.0",
2737 - "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-10.10.0.tgz",
2738 - "integrity": "sha512-UNAo2sTCAW5ge6OErPEHb5z7NEAg3XcO9Cj7OK45aZXfLLH1QkexDcZD77HBi5zvEiLOm1An+p/4b5K3Worpug==",
3342 + "version": "10.11.0",
3343 + "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-10.11.0.tgz",
3344 + "integrity": "sha512-kQX7l6l8dVWNqlqyN3ePW3KmjCQO3ZMgXuBMddIu83CmucrsBfXlH+JoviYyRBws/yLTQO8g3Pbw+bdIoVm4oQ==",
3345 "funding": {
3346 "url": "https://github.com/sponsors/antfu"
3347 }
3348 },
3349 "node_modules/@vueuse/shared": {
2744 - "version": "10.10.0",
2745 - "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-10.10.0.tgz",
2746 - "integrity": "sha512-2aW33Ac0Uk0U+9yo3Ypg9s5KcR42cuehRWl7vnUHadQyFvCktseyxxEPBi1Eiq4D2yBGACOnqLZpx1eMc7g5Og==",
3350 + "version": "10.11.0",
3351 + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-10.11.0.tgz",
3352 + "integrity": "sha512-fyNoIXEq3PfX1L3NkNhtVQUSRtqYwJtJg+Bp9rIzculIZWHTkKSysujrOk2J+NrRulLTQH9+3gGSfYLWSEWU1A==",
3353 "dependencies": {
2748 - "vue-demi": ">=0.14.7"
3354 + "vue-demi": ">=0.14.8"
3355 },
3356 "funding": {
3357 "url": "https://github.com/sponsors/antfu"
@@ -2804,9 +3410,9 @@
3410 }
3411 },
3412 "node_modules/acorn": {
2807 - "version": "8.11.3",
2808 - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz",
2809 - "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==",
3413 + "version": "8.12.0",
3414 + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.0.tgz",
3415 + "integrity": "sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw==",
3416 "bin": {
3417 "acorn": "bin/acorn"
3418 },
@@ -2823,10 +3429,13 @@
3429 }
3430 },
3431 "node_modules/acorn-walk": {
2826 - "version": "8.3.2",
2827 - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz",
2828 - "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==",
3432 + "version": "8.3.3",
3433 + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.3.tgz",
3434 + "integrity": "sha512-MxXdReSRhGO7VlFe1bRG/oI7/mdLV9B9JJT0N8vZOhF7gFRR5l3M8W9G8JxmKV+JC5mGqJ0QvqfSOLsCPa4nUw==",
3435 "dev": true,
3436 + "dependencies": {
3437 + "acorn": "^8.11.0"
3438 + },
3439 "engines": {
3440 "node": ">=0.4.0"
3441 }
@@ -3108,15 +3717,15 @@
3717 }
3718 },
3719 "node_modules/aws4": {
3111 - "version": "1.12.0",
3112 - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz",
3113 - "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==",
3720 + "version": "1.13.0",
3721 + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.13.0.tgz",
3722 + "integrity": "sha512-3AungXC4I8kKsS9PuS4JH2nc+0bVY/mjgrephHTIi8fpEeGsTHBUJeosp0Wc1myYMElmD0B3Oc4XL/HVJ4PV2g==",
3723 "dev": true
3724 },
3725 "node_modules/axios": {
3117 - "version": "1.7.1",
3118 - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.1.tgz",
3119 - "integrity": "sha512-+LV37nQcd1EpFalkXksWNBiA17NZ5m5/WspmHGmZmdx1qBOg/VNq/c4eRJiA9VQQHBOs+N0ZhhdU10h2TyNK7Q==",
3726 + "version": "1.7.2",
3727 + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.2.tgz",
3728 + "integrity": "sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw==",
3729 "dev": true,
3730 "dependencies": {
3731 "follow-redirects": "^1.15.6",
@@ -3190,6 +3799,15 @@
3799 "url": "https://github.com/sponsors/sindresorhus"
3800 }
3801 },
3802 + "node_modules/birpc": {
3803 + "version": "0.2.17",
3804 + "resolved": "https://registry.npmjs.org/birpc/-/birpc-0.2.17.tgz",
3805 + "integrity": "sha512-+hkTxhot+dWsLpp3gia5AkVHIsKlZybNT5gIYiDlNzJrmYPcTM9k5/w2uaj3IPpd7LlEYpmCj4Jj1nC41VhDFg==",
3806 + "dev": true,
3807 + "funding": {
3808 + "url": "https://github.com/sponsors/antfu"
3809 + }
3810 + },
3811 "node_modules/blob-util": {
3812 "version": "2.0.2",
3813 "resolved": "https://registry.npmjs.org/blob-util/-/blob-util-2.0.2.tgz",
@@ -3216,20 +3834,20 @@
3834 }
3835 },
3836 "node_modules/braces": {
3219 - "version": "3.0.2",
3220 - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
3221 - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
3837 + "version": "3.0.3",
3838 + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
3839 + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
3840 "dependencies": {
3223 - "fill-range": "^7.0.1"
3841 + "fill-range": "^7.1.1"
3842 },
3843 "engines": {
3844 "node": ">=8"
3845 }
3846 },
3847 "node_modules/browserslist": {
3230 - "version": "4.23.0",
3231 - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz",
3232 - "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==",
3848 + "version": "4.23.1",
3849 + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.1.tgz",
3850 + "integrity": "sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw==",
3851 "dev": true,
3852 "funding": [
3853 {
@@ -3246,10 +3864,10 @@
3864 }
3865 ],
3866 "dependencies": {
3249 - "caniuse-lite": "^1.0.30001587",
3250 - "electron-to-chromium": "^1.4.668",
3867 + "caniuse-lite": "^1.0.30001629",
3868 + "electron-to-chromium": "^1.4.796",
3869 "node-releases": "^2.0.14",
3252 - "update-browserslist-db": "^1.0.13"
3870 + "update-browserslist-db": "^1.0.16"
3871 },
3872 "bin": {
3873 "browserslist": "cli.js"
@@ -3400,9 +4018,9 @@
4018 }
4019 },
4020 "node_modules/caniuse-lite": {
3403 - "version": "1.0.30001620",
3404 - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001620.tgz",
3405 - "integrity": "sha512-WJvYsOjd1/BYUY6SNGUosK9DUidBPDTnOARHp3fSmFO1ekdxaY6nKRttEVrfMmYi80ctS0kz1wiWmm14fVc3ew==",
4021 + "version": "1.0.30001634",
4022 + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001634.tgz",
4023 + "integrity": "sha512-fbBYXQ9q3+yp1q1gBk86tOFs4pyn/yxFm5ZNP18OXJDfA3txImOY9PhfxVggZ4vRHDqoU8NrKU81eN0OtzOgRA==",
4024 "dev": true,
4025 "funding": [
4026 {
@@ -3801,6 +4419,21 @@
4419 "node": ">= 0.8"
4420 }
4421 },
4422 + "node_modules/copy-anything": {
4423 + "version": "3.0.5",
4424 + "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-3.0.5.tgz",
4425 + "integrity": "sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==",
4426 + "dev": true,
4427 + "dependencies": {
4428 + "is-what": "^4.1.8"
4429 + },
4430 + "engines": {
4431 + "node": ">=12.13"
4432 + },
4433 + "funding": {
4434 + "url": "https://github.com/sponsors/mesqueeb"
4435 + }
4436 + },
4437 "node_modules/core-util-is": {
4438 "version": "1.0.2",
4439 "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
@@ -3936,6 +4569,12 @@
4569 "node": ">=18"
4570 }
4571 },
4572 + "node_modules/cssstyle/node_modules/rrweb-cssom": {
4573 + "version": "0.6.0",
4574 + "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.6.0.tgz",
4575 + "integrity": "sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==",
4576 + "dev": true
4577 + },
4578 "node_modules/csstype": {
4579 "version": "3.1.3",
4580 "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
@@ -4185,9 +4824,9 @@
4824 "dev": true
4825 },
4826 "node_modules/deep-eql": {
4188 - "version": "4.1.3",
4189 - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz",
4190 - "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==",
4827 + "version": "4.1.4",
4828 + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.4.tgz",
4829 + "integrity": "sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==",
4830 "dev": true,
4831 "dependencies": {
4832 "type-detect": "^4.0.0"
@@ -4355,17 +4994,6 @@
4994 "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==",
4995 "dev": true
4996 },
4358 - "node_modules/doctrine": {
4359 - "version": "3.0.0",
4360 - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
4361 - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
4362 - "dependencies": {
4363 - "esutils": "^2.0.2"
4364 - },
4365 - "engines": {
4366 - "node": ">=6.0.0"
4367 - }
4368 - },
4997 "node_modules/dom-serializer": {
4998 "version": "2.0.0",
4999 "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz",
@@ -4506,9 +5134,9 @@
5134 "dev": true
5135 },
5136 "node_modules/electron-to-chromium": {
4509 - "version": "1.4.774",
4510 - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.774.tgz",
4511 - "integrity": "sha512-132O1XCd7zcTkzS3FgkAzKmnBuNJjK8WjcTtNuoylj7MYbqw5eXehjQ5OK91g0zm7OTKIPeaAG4CPoRfD9M1Mg==",
5137 + "version": "1.4.802",
5138 + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.802.tgz",
5139 + "integrity": "sha512-TnTMUATbgNdPXVSHsxvNVSG0uEd6cSZsANjm8c9HbvflZVVn1yTRcmVXYT1Ma95/ssB/Dcd30AHweH2TE+dNpA==",
5140 "dev": true
5141 },
5142 "node_modules/emoji-regex": {
@@ -4590,9 +5218,9 @@
5218 }
5219 },
5220 "node_modules/esbuild": {
4593 - "version": "0.20.2",
4594 - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz",
4595 - "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==",
5221 + "version": "0.21.5",
5222 + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz",
5223 + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==",
5224 "dev": true,
5225 "hasInstallScript": true,
5226 "bin": {
@@ -4602,29 +5230,29 @@
5230 "node": ">=12"
5231 },
5232 "optionalDependencies": {
4605 - "@esbuild/aix-ppc64": "0.20.2",
4606 - "@esbuild/android-arm": "0.20.2",
4607 - "@esbuild/android-arm64": "0.20.2",
4608 - "@esbuild/android-x64": "0.20.2",
4609 - "@esbuild/darwin-arm64": "0.20.2",
4610 - "@esbuild/darwin-x64": "0.20.2",
4611 - "@esbuild/freebsd-arm64": "0.20.2",
4612 - "@esbuild/freebsd-x64": "0.20.2",
4613 - "@esbuild/linux-arm": "0.20.2",
4614 - "@esbuild/linux-arm64": "0.20.2",
4615 - "@esbuild/linux-ia32": "0.20.2",
4616 - "@esbuild/linux-loong64": "0.20.2",
4617 - "@esbuild/linux-mips64el": "0.20.2",
4618 - "@esbuild/linux-ppc64": "0.20.2",
4619 - "@esbuild/linux-riscv64": "0.20.2",
4620 - "@esbuild/linux-s390x": "0.20.2",
4621 - "@esbuild/linux-x64": "0.20.2",
4622 - "@esbuild/netbsd-x64": "0.20.2",
4623 - "@esbuild/openbsd-x64": "0.20.2",
4624 - "@esbuild/sunos-x64": "0.20.2",
4625 - "@esbuild/win32-arm64": "0.20.2",
4626 - "@esbuild/win32-ia32": "0.20.2",
4627 - "@esbuild/win32-x64": "0.20.2"
5233 + "@esbuild/aix-ppc64": "0.21.5",
5234 + "@esbuild/android-arm": "0.21.5",
5235 + "@esbuild/android-arm64": "0.21.5",
5236 + "@esbuild/android-x64": "0.21.5",
5237 + "@esbuild/darwin-arm64": "0.21.5",
5238 + "@esbuild/darwin-x64": "0.21.5",
5239 + "@esbuild/freebsd-arm64": "0.21.5",
5240 + "@esbuild/freebsd-x64": "0.21.5",
5241 + "@esbuild/linux-arm": "0.21.5",
5242 + "@esbuild/linux-arm64": "0.21.5",
5243 + "@esbuild/linux-ia32": "0.21.5",
5244 + "@esbuild/linux-loong64": "0.21.5",
5245 + "@esbuild/linux-mips64el": "0.21.5",
5246 + "@esbuild/linux-ppc64": "0.21.5",
5247 + "@esbuild/linux-riscv64": "0.21.5",
5248 + "@esbuild/linux-s390x": "0.21.5",
5249 + "@esbuild/linux-x64": "0.21.5",
5250 + "@esbuild/netbsd-x64": "0.21.5",
5251 + "@esbuild/openbsd-x64": "0.21.5",
5252 + "@esbuild/sunos-x64": "0.21.5",
5253 + "@esbuild/win32-arm64": "0.21.5",
5254 + "@esbuild/win32-ia32": "0.21.5",
5255 + "@esbuild/win32-x64": "0.21.5"
5256 }
5257 },
5258 "node_modules/escalade": {
@@ -4652,40 +5280,36 @@
5280 }
5281 },
5282 "node_modules/eslint": {
4655 - "version": "8.57.0",
4656 - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz",
4657 - "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==",
5283 + "version": "9.5.0",
5284 + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.5.0.tgz",
5285 + "integrity": "sha512-+NAOZFrW/jFTS3dASCGBxX1pkFD0/fsO+hfAkJ4TyYKwgsXZbqzrw+seCYFCcPCYXvnD67tAnglU7GQTz6kcVw==",
5286 "dependencies": {
5287 "@eslint-community/eslint-utils": "^4.2.0",
5288 "@eslint-community/regexpp": "^4.6.1",
4661 - "@eslint/eslintrc": "^2.1.4",
4662 - "@eslint/js": "8.57.0",
4663 - "@humanwhocodes/config-array": "^0.11.14",
5289 + "@eslint/config-array": "^0.16.0",
5290 + "@eslint/eslintrc": "^3.1.0",
5291 + "@eslint/js": "9.5.0",
5292 "@humanwhocodes/module-importer": "^1.0.1",
5293 + "@humanwhocodes/retry": "^0.3.0",
5294 "@nodelib/fs.walk": "^1.2.8",
4666 - "@ungap/structured-clone": "^1.2.0",
5295 "ajv": "^6.12.4",
5296 "chalk": "^4.0.0",
5297 "cross-spawn": "^7.0.2",
5298 "debug": "^4.3.2",
4671 - "doctrine": "^3.0.0",
5299 "escape-string-regexp": "^4.0.0",
4673 - "eslint-scope": "^7.2.2",
4674 - "eslint-visitor-keys": "^3.4.3",
4675 - "espree": "^9.6.1",
4676 - "esquery": "^1.4.2",
5300 + "eslint-scope": "^8.0.1",
5301 + "eslint-visitor-keys": "^4.0.0",
5302 + "espree": "^10.0.1",
5303 + "esquery": "^1.5.0",
5304 "esutils": "^2.0.2",
5305 "fast-deep-equal": "^3.1.3",
4679 - "file-entry-cache": "^6.0.1",
5306 + "file-entry-cache": "^8.0.0",
5307 "find-up": "^5.0.0",
5308 "glob-parent": "^6.0.2",
4682 - "globals": "^13.19.0",
4683 - "graphemer": "^1.4.0",
5309 "ignore": "^5.2.0",
5310 "imurmurhash": "^0.1.4",
5311 "is-glob": "^4.0.0",
5312 "is-path-inside": "^3.0.3",
4688 - "js-yaml": "^4.1.0",
5313 "json-stable-stringify-without-jsonify": "^1.0.1",
5314 "levn": "^0.4.1",
5315 "lodash.merge": "^4.6.2",
@@ -4699,10 +5323,10 @@
5323 "eslint": "bin/eslint.js"
5324 },
5325 "engines": {
4702 - "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
5326 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
5327 },
5328 "funding": {
4705 - "url": "https://opencollective.com/eslint"
5329 + "url": "https://eslint.org/donate"
5330 }
5331 },
5332 "node_modules/eslint-config-prettier": {
@@ -4744,8 +5368,35 @@
5368 "dependencies": {
5369 "globals": "^13.20.0"
5370 },
4747 - "peerDependencies": {
4748 - "eslint": ">=7"
5371 + "peerDependencies": {
5372 + "eslint": ">=7"
5373 + }
5374 + },
5375 + "node_modules/eslint-plugin-cypress/node_modules/globals": {
5376 + "version": "13.24.0",
5377 + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz",
5378 + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==",
5379 + "dev": true,
5380 + "dependencies": {
5381 + "type-fest": "^0.20.2"
5382 + },
5383 + "engines": {
5384 + "node": ">=8"
5385 + },
5386 + "funding": {
5387 + "url": "https://github.com/sponsors/sindresorhus"
5388 + }
5389 + },
5390 + "node_modules/eslint-plugin-cypress/node_modules/type-fest": {
5391 + "version": "0.20.2",
5392 + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
5393 + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
5394 + "dev": true,
5395 + "engines": {
5396 + "node": ">=10"
5397 + },
5398 + "funding": {
5399 + "url": "https://github.com/sponsors/sindresorhus"
5400 }
5401 },
5402 "node_modules/eslint-plugin-prettier": {
@@ -4798,16 +5449,41 @@
5449 "eslint": "^6.2.0 || ^7.0.0 || ^8.0.0 || ^9.0.0"
5450 }
5451 },
5452 + "node_modules/eslint-plugin-vue/node_modules/globals": {
5453 + "version": "13.24.0",
5454 + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz",
5455 + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==",
5456 + "dependencies": {
5457 + "type-fest": "^0.20.2"
5458 + },
5459 + "engines": {
5460 + "node": ">=8"
5461 + },
5462 + "funding": {
5463 + "url": "https://github.com/sponsors/sindresorhus"
5464 + }
5465 + },
5466 + "node_modules/eslint-plugin-vue/node_modules/type-fest": {
5467 + "version": "0.20.2",
5468 + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
5469 + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
5470 + "engines": {
5471 + "node": ">=10"
5472 + },
5473 + "funding": {
5474 + "url": "https://github.com/sponsors/sindresorhus"
5475 + }
5476 + },
5477 "node_modules/eslint-scope": {
4802 - "version": "7.2.2",
4803 - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz",
4804 - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==",
5478 + "version": "8.0.1",
5479 + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.0.1.tgz",
5480 + "integrity": "sha512-pL8XjgP4ZOmmwfFE8mEhSxA7ZY4C+LWyqjQ3o4yWkkmD0qcMT9kkW3zWHOczhWcjTSgqycYAgwSlXvZltv65og==",
5481 "dependencies": {
5482 "esrecurse": "^4.3.0",
5483 "estraverse": "^5.2.0"
5484 },
5485 "engines": {
4810 - "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
5486 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
5487 },
5488 "funding": {
5489 "url": "https://opencollective.com/eslint"
@@ -4824,6 +5500,14 @@
5500 "url": "https://opencollective.com/eslint"
5501 }
5502 },
5503 + "node_modules/eslint/node_modules/@eslint/js": {
5504 + "version": "9.5.0",
5505 + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.5.0.tgz",
5506 + "integrity": "sha512-A7+AOT2ICkodvtsWnxZP4Xxk3NbZ3VMHd8oihydLRGrJgqqdEz1qSeEgXYyT/Cu8h1TWWsQRejIx48mtjZ5y1w==",
5507 + "engines": {
5508 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
5509 + }
5510 + },
5511 "node_modules/eslint/node_modules/ansi-styles": {
5512 "version": "4.3.0",
5513 "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
@@ -4889,6 +5573,17 @@
5573 "url": "https://github.com/sponsors/sindresorhus"
5574 }
5575 },
5576 + "node_modules/eslint/node_modules/eslint-visitor-keys": {
5577 + "version": "4.0.0",
5578 + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz",
5579 + "integrity": "sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==",
5580 + "engines": {
5581 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
5582 + },
5583 + "funding": {
5584 + "url": "https://opencollective.com/eslint"
5585 + }
5586 + },
5587 "node_modules/eslint/node_modules/has-flag": {
5588 "version": "4.0.0",
5589 "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
@@ -4920,16 +5615,27 @@
5615 }
5616 },
5617 "node_modules/espree": {
4923 - "version": "9.6.1",
4924 - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz",
4925 - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==",
5618 + "version": "10.0.1",
5619 + "resolved": "https://registry.npmjs.org/espree/-/espree-10.0.1.tgz",
5620 + "integrity": "sha512-MWkrWZbJsL2UwnjxTX3gG8FneachS/Mwg7tdGXce011sJd5b0JG54vat5KHnfSBODZ3Wvzd2WnjxyzsRoVv+ww==",
5621 "dependencies": {
4927 - "acorn": "^8.9.0",
5622 + "acorn": "^8.11.3",
5623 "acorn-jsx": "^5.3.2",
4929 - "eslint-visitor-keys": "^3.4.1"
5624 + "eslint-visitor-keys": "^4.0.0"
5625 },
5626 "engines": {
4932 - "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
5627 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
5628 + },
5629 + "funding": {
5630 + "url": "https://opencollective.com/eslint"
5631 + }
5632 + },
5633 + "node_modules/espree/node_modules/eslint-visitor-keys": {
5634 + "version": "4.0.0",
5635 + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.0.0.tgz",
5636 + "integrity": "sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==",
5637 + "engines": {
5638 + "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
5639 },
5640 "funding": {
5641 "url": "https://opencollective.com/eslint"
@@ -5153,14 +5859,14 @@
5859 }
5860 },
5861 "node_modules/file-entry-cache": {
5156 - "version": "6.0.1",
5157 - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
5158 - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
5862 + "version": "8.0.0",
5863 + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz",
5864 + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==",
5865 "dependencies": {
5160 - "flat-cache": "^3.0.4"
5866 + "flat-cache": "^4.0.0"
5867 },
5868 "engines": {
5163 - "node": "^10.12.0 || >=12.0.0"
5869 + "node": ">=16.0.0"
5870 }
5871 },
5872 "node_modules/file-saver": {
@@ -5169,9 +5875,9 @@
5875 "integrity": "sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA=="
5876 },
5877 "node_modules/fill-range": {
5172 - "version": "7.0.1",
5173 - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
5174 - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
5878 + "version": "7.1.1",
5879 + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
5880 + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
5881 "dependencies": {
5882 "to-regex-range": "^5.0.1"
5883 },
@@ -5195,16 +5901,15 @@
5901 }
5902 },
5903 "node_modules/flat-cache": {
5198 - "version": "3.2.0",
5199 - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz",
5200 - "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==",
5904 + "version": "4.0.1",
5905 + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz",
5906 + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==",
5907 "dependencies": {
5908 "flatted": "^3.2.9",
5203 - "keyv": "^4.5.3",
5204 - "rimraf": "^3.0.2"
5909 + "keyv": "^4.5.4"
5910 },
5911 "engines": {
5207 - "node": "^10.12.0 || >=12.0.0"
5912 + "node": ">=16"
5913 }
5914 },
5915 "node_modules/flatted": {
@@ -5252,9 +5957,9 @@
5957 }
5958 },
5959 "node_modules/foreground-child": {
5255 - "version": "3.1.1",
5256 - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz",
5257 - "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==",
5960 + "version": "3.2.0",
5961 + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.2.0.tgz",
5962 + "integrity": "sha512-CrWQNaEl1/6WeZoarcM9LHupTo3RpZO2Pdk1vktwzPiQTsJnAKJmm3TACKeG5UZbWDfaH2AbvYxzP96y0MT7fA==",
5963 "dev": true,
5964 "dependencies": {
5965 "cross-spawn": "^7.0.0",
@@ -5347,7 +6052,8 @@
6052 "node_modules/fs.realpath": {
6053 "version": "1.0.0",
6054 "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
5350 - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="
6055 + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
6056 + "dev": true
6057 },
6058 "node_modules/fsevents": {
6059 "version": "2.3.3",
@@ -5452,16 +6158,16 @@
6158 }
6159 },
6160 "node_modules/glob": {
5455 - "version": "10.3.15",
5456 - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.15.tgz",
5457 - "integrity": "sha512-0c6RlJt1TICLyvJYIApxb8GsXoai0KUP7AxKKAtsYXdgJR1mGEUa7DgwShbdk1nly0PYoZj01xd4hzbq3fsjpw==",
6161 + "version": "10.4.1",
6162 + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.1.tgz",
6163 + "integrity": "sha512-2jelhlq3E4ho74ZyVLN03oKdAZVUa6UDZzFLVH1H7dnoax+y9qyaq8zBkfDIggjniU19z0wU18y16jMB2eyVIw==",
6164 "dev": true,
6165 "dependencies": {
6166 "foreground-child": "^3.1.0",
5461 - "jackspeak": "^2.3.6",
5462 - "minimatch": "^9.0.1",
5463 - "minipass": "^7.0.4",
5464 - "path-scurry": "^1.11.0"
6167 + "jackspeak": "^3.1.2",
6168 + "minimatch": "^9.0.4",
6169 + "minipass": "^7.1.2",
6170 + "path-scurry": "^1.11.1"
6171 },
6172 "bin": {
6173 "glob": "dist/esm/bin.mjs"
@@ -5484,6 +6190,21 @@
6190 "node": ">=10.13.0"
6191 }
6192 },
6193 + "node_modules/glob/node_modules/minimatch": {
6194 + "version": "9.0.4",
6195 + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz",
6196 + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==",
6197 + "dev": true,
6198 + "dependencies": {
6199 + "brace-expansion": "^2.0.1"
6200 + },
6201 + "engines": {
6202 + "node": ">=16 || 14 >=14.17"
6203 + },
6204 + "funding": {
6205 + "url": "https://github.com/sponsors/isaacs"
6206 + }
6207 + },
6208 "node_modules/global-dirs": {
6209 "version": "3.0.1",
6210 "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.1.tgz",
@@ -5500,14 +6221,12 @@
6221 }
6222 },
6223 "node_modules/globals": {
5503 - "version": "13.24.0",
5504 - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz",
5505 - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==",
5506 - "dependencies": {
5507 - "type-fest": "^0.20.2"
5508 - },
6224 + "version": "15.6.0",
6225 + "resolved": "https://registry.npmjs.org/globals/-/globals-15.6.0.tgz",
6226 + "integrity": "sha512-UzcJi88Hw//CurUIRa9Jxb0vgOCcuD/MNjwmXp633cyaRKkCWACkoqHCtfZv43b1kqXGg/fpOa8bwgacCeXsVg==",
6227 + "dev": true,
6228 "engines": {
5510 - "node": ">=8"
6229 + "node": ">=18"
6230 },
6231 "funding": {
6232 "url": "https://github.com/sponsors/sindresorhus"
@@ -5911,6 +6630,8 @@
6630 "version": "1.0.6",
6631 "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
6632 "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
6633 + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.",
6634 + "dev": true,
6635 "dependencies": {
6636 "once": "^1.3.0",
6637 "wrappy": "1"
@@ -5919,7 +6640,8 @@
6640 "node_modules/inherits": {
6641 "version": "2.0.4",
6642 "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
5922 - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
6643 + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
6644 + "dev": true
6645 },
6646 "node_modules/ini": {
6647 "version": "2.0.0",
@@ -6125,6 +6847,18 @@
6847 "url": "https://github.com/sponsors/sindresorhus"
6848 }
6849 },
6850 + "node_modules/is-what": {
6851 + "version": "4.1.16",
6852 + "resolved": "https://registry.npmjs.org/is-what/-/is-what-4.1.16.tgz",
6853 + "integrity": "sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==",
6854 + "dev": true,
6855 + "engines": {
6856 + "node": ">=12.13"
6857 + },
6858 + "funding": {
6859 + "url": "https://github.com/sponsors/mesqueeb"
6860 + }
6861 + },
6862 "node_modules/is-wsl": {
6863 "version": "2.2.0",
6864 "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
@@ -6149,9 +6883,9 @@
6883 "dev": true
6884 },
6885 "node_modules/jackspeak": {
6152 - "version": "2.3.6",
6153 - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz",
6154 - "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==",
6886 + "version": "3.4.0",
6887 + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.0.tgz",
6888 + "integrity": "sha512-JVYhQnN59LVPFCEcVa2C3CrEKYacvjRfqIQl+h8oi91aLYQVWRYbxjPcv1bUiUy/kLmQaANrYfNMCO3kuEDHfw==",
6889 "dev": true,
6890 "dependencies": {
6891 "@isaacs/cliui": "^8.0.2"
@@ -6167,9 +6901,9 @@
6901 }
6902 },
6903 "node_modules/jiti": {
6170 - "version": "1.21.0",
6171 - "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz",
6172 - "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==",
6904 + "version": "1.21.6",
6905 + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz",
6906 + "integrity": "sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==",
6907 "bin": {
6908 "jiti": "bin/jiti.js"
6909 }
@@ -6307,12 +7041,6 @@
7041 "node": ">= 6"
7042 }
7043 },
6310 - "node_modules/jsdom/node_modules/rrweb-cssom": {
6311 - "version": "0.7.0",
6312 - "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.7.0.tgz",
6313 - "integrity": "sha512-KlSv0pm9kgQSRxXEMgtivPJ4h826YHsuob8pSHcfSZsSXGtvpEAie8S0AnXuObEJ7nhikOb4ahwxDm0H2yW17g==",
6314 - "dev": true
6315 - },
7044 "node_modules/jsdom/node_modules/xml-name-validator": {
7045 "version": "5.0.0",
7046 "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz",
@@ -7050,11 +7778,11 @@
7778 }
7779 },
7780 "node_modules/micromatch": {
7053 - "version": "4.0.5",
7054 - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
7055 - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
7781 + "version": "4.0.7",
7782 + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz",
7783 + "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==",
7784 "dependencies": {
7057 - "braces": "^3.0.2",
7785 + "braces": "^3.0.3",
7786 "picomatch": "^2.3.1"
7787 },
7788 "engines": {
@@ -7115,9 +7843,9 @@
7843 }
7844 },
7845 "node_modules/minipass": {
7118 - "version": "7.1.1",
7119 - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.1.tgz",
7120 - "integrity": "sha512-UZ7eQ+h8ywIRAW1hIEl2AqdwzJucU/Kp59+8kkZeSvafXhZjul247BvIJjEVFVeON6d7lM46XX1HXCduKAS8VA==",
7846 + "version": "7.1.2",
7847 + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
7848 + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
7849 "dev": true,
7850 "engines": {
7851 "node": ">=16 || 14 >=14.17"
@@ -7141,14 +7869,14 @@
7869 }
7870 },
7871 "node_modules/mlly": {
7144 - "version": "1.7.0",
7145 - "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.7.0.tgz",
7146 - "integrity": "sha512-U9SDaXGEREBYQgfejV97coK0UL1r+qnF2SyO9A3qcI8MzKnsIFKHNVEkrDyNncQTKQQumsasmeq84eNMdBfsNQ==",
7872 + "version": "1.7.1",
7873 + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.7.1.tgz",
7874 + "integrity": "sha512-rrVRZRELyQzrIUAVMHxP97kv+G786pHmOKzuFII8zDYahFBS7qnHh2AlYSl1GAHhaMPCz6/oHjVMcfFYgFYHgA==",
7875 "dev": true,
7876 "dependencies": {
7877 "acorn": "^8.11.3",
7878 "pathe": "^1.1.2",
7151 - "pkg-types": "^1.1.0",
7879 + "pkg-types": "^1.1.1",
7880 "ufo": "^1.5.3"
7881 }
7882 },
@@ -7328,18 +8056,6 @@
8056 "url": "https://github.com/chalk/ansi-styles?sponsor=1"
8057 }
8058 },
7331 - "node_modules/npm-run-all2/node_modules/pidtree": {
7332 - "version": "0.6.0",
7333 - "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz",
7334 - "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==",
7335 - "dev": true,
7336 - "bin": {
7337 - "pidtree": "bin/pidtree.js"
7338 - },
7339 - "engines": {
7340 - "node": ">=0.10"
7341 - }
7342 - },
8059 "node_modules/npm-run-path": {
8060 "version": "4.0.1",
8061 "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
@@ -7412,6 +8128,7 @@
8128 "version": "1.4.0",
8129 "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
8130 "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
8131 + "dev": true,
8132 "dependencies": {
8133 "wrappy": "1"
8134 }
@@ -7576,6 +8293,7 @@
8293 "version": "1.0.1",
8294 "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
8295 "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
8296 + "dev": true,
8297 "engines": {
8298 "node": ">=0.10.0"
8299 }
@@ -7691,6 +8409,18 @@
8409 "url": "https://github.com/sponsors/jonschlinkert"
8410 }
8411 },
8412 + "node_modules/pidtree": {
8413 + "version": "0.6.0",
8414 + "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz",
8415 + "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==",
8416 + "dev": true,
8417 + "bin": {
8418 + "pidtree": "bin/pidtree.js"
8419 + },
8420 + "engines": {
8421 + "node": ">=0.10"
8422 + }
8423 + },
8424 "node_modules/pify": {
8425 "version": "2.3.0",
8426 "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
@@ -7734,9 +8464,9 @@
8464 }
8465 },
8466 "node_modules/pinia/node_modules/vue-demi": {
7737 - "version": "0.14.7",
7738 - "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.7.tgz",
7739 - "integrity": "sha512-EOG8KXDQNwkJILkx/gPcoL/7vH+hORoBaKgGe+6W7VFMvCYJfmF2dGbvgDroVnI8LU7/kTu8mbjRZGBU1z9NTA==",
8467 + "version": "0.14.8",
8468 + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.8.tgz",
8469 + "integrity": "sha512-Uuqnk9YE9SsWeReYqK2alDI5YzciATE0r2SkA6iMAtuXvNTMNACJLJEXNXaEy94ECuBe4Sk6RzRU80kjdbIo1Q==",
8470 "hasInstallScript": true,
8471 "bin": {
8472 "vue-demi-fix": "bin/vue-demi-fix.js",
@@ -7909,9 +8639,9 @@
8639 }
8640 },
8641 "node_modules/postcss-load-config/node_modules/lilconfig": {
7912 - "version": "3.1.1",
7913 - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.1.tgz",
7914 - "integrity": "sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==",
8642 + "version": "3.1.2",
8643 + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz",
8644 + "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==",
8645 "dev": true,
8646 "engines": {
8647 "node": ">=14"
@@ -7940,9 +8670,9 @@
8670 }
8671 },
8672 "node_modules/postcss-selector-parser": {
7943 - "version": "6.0.16",
7944 - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz",
7945 - "integrity": "sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==",
8673 + "version": "6.1.0",
8674 + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.0.tgz",
8675 + "integrity": "sha512-UMz42UD0UY0EApS0ZL9o1XnLhSTtvvvLe5Dc2H2O56fvRZi+KulDyf5ctDhhtYJBGKStV2FL1fy6253cmLgqVQ==",
8676 "dependencies": {
8677 "cssesc": "^3.0.0",
8678 "util-deprecate": "^1.0.2"
@@ -7966,9 +8696,9 @@
8696 }
8697 },
8698 "node_modules/prettier": {
7969 - "version": "3.3.1",
7970 - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.1.tgz",
7971 - "integrity": "sha512-7CAwy5dRsxs8PHXT3twixW9/OEll8MLE0VRPCJyl7CkS6VHGPSlsVaWTiASPTyGyYRyApxlaWTzwUxVNrhcwDg==",
8699 + "version": "3.3.2",
8700 + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.2.tgz",
8701 + "integrity": "sha512-rAVeHYMcv8ATV5d508CFdn+8/pHPpXeIid1DdrPwXnaAdH7cqjVbpJaT5eq4yRAFU/lsbwYwSF/n5iNrdJHPQA==",
8702 "bin": {
8703 "prettier": "bin/prettier.cjs"
8704 },
@@ -8274,6 +9004,7 @@
9004 "version": "7.2.3",
9005 "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
9006 "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
9007 + "deprecated": "Glob versions prior to v9 are no longer supported",
9008 "dev": true,
9009 "dependencies": {
9010 "fs.realpath": "^1.0.0",
@@ -8453,68 +9184,15 @@
9184 }
9185 },
9186 "node_modules/rfdc": {
8456 - "version": "1.3.1",
8457 - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.1.tgz",
8458 - "integrity": "sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==",
9187 + "version": "1.4.1",
9188 + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz",
9189 + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==",
9190 "dev": true
9191 },
8461 - "node_modules/rimraf": {
8462 - "version": "3.0.2",
8463 - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
8464 - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
8465 - "dependencies": {
8466 - "glob": "^7.1.3"
8467 - },
8468 - "bin": {
8469 - "rimraf": "bin.js"
8470 - },
8471 - "funding": {
8472 - "url": "https://github.com/sponsors/isaacs"
8473 - }
8474 - },
8475 - "node_modules/rimraf/node_modules/brace-expansion": {
8476 - "version": "1.1.11",
8477 - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
8478 - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
8479 - "dependencies": {
8480 - "balanced-match": "^1.0.0",
8481 - "concat-map": "0.0.1"
8482 - }
8483 - },
8484 - "node_modules/rimraf/node_modules/glob": {
8485 - "version": "7.2.3",
8486 - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
8487 - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
8488 - "dependencies": {
8489 - "fs.realpath": "^1.0.0",
8490 - "inflight": "^1.0.4",
8491 - "inherits": "2",
8492 - "minimatch": "^3.1.1",
8493 - "once": "^1.3.0",
8494 - "path-is-absolute": "^1.0.0"
8495 - },
8496 - "engines": {
8497 - "node": "*"
8498 - },
8499 - "funding": {
8500 - "url": "https://github.com/sponsors/isaacs"
8501 - }
8502 - },
8503 - "node_modules/rimraf/node_modules/minimatch": {
8504 - "version": "3.1.2",
8505 - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
8506 - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
8507 - "dependencies": {
8508 - "brace-expansion": "^1.1.7"
8509 - },
8510 - "engines": {
8511 - "node": "*"
8512 - }
8513 - },
9192 "node_modules/rollup": {
8515 - "version": "4.17.2",
8516 - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.17.2.tgz",
8517 - "integrity": "sha512-/9ClTJPByC0U4zNLowV1tMBe8yMEAxewtR3cUNX5BoEpGH3dQEWpJLr6CLp0fPdYRF/fzVOgvDb1zXuakwF5kQ==",
9193 + "version": "4.18.0",
9194 + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.18.0.tgz",
9195 + "integrity": "sha512-QmJz14PX3rzbJCN1SG4Xe/bAAX2a6NpCP8ab2vfu2GiUr8AQcr2nCV/oEO3yneFarB67zk8ShlIyWb2LGTb3Sg==",
9196 "dev": true,
9197 "dependencies": {
9198 "@types/estree": "1.0.5"
@@ -8527,22 +9205,22 @@
9205 "npm": ">=8.0.0"
9206 },
9207 "optionalDependencies": {
8530 - "@rollup/rollup-android-arm-eabi": "4.17.2",
8531 - "@rollup/rollup-android-arm64": "4.17.2",
8532 - "@rollup/rollup-darwin-arm64": "4.17.2",
8533 - "@rollup/rollup-darwin-x64": "4.17.2",
8534 - "@rollup/rollup-linux-arm-gnueabihf": "4.17.2",
8535 - "@rollup/rollup-linux-arm-musleabihf": "4.17.2",
8536 - "@rollup/rollup-linux-arm64-gnu": "4.17.2",
8537 - "@rollup/rollup-linux-arm64-musl": "4.17.2",
8538 - "@rollup/rollup-linux-powerpc64le-gnu": "4.17.2",
8539 - "@rollup/rollup-linux-riscv64-gnu": "4.17.2",
8540 - "@rollup/rollup-linux-s390x-gnu": "4.17.2",
8541 - "@rollup/rollup-linux-x64-gnu": "4.17.2",
8542 - "@rollup/rollup-linux-x64-musl": "4.17.2",
8543 - "@rollup/rollup-win32-arm64-msvc": "4.17.2",
8544 - "@rollup/rollup-win32-ia32-msvc": "4.17.2",
8545 - "@rollup/rollup-win32-x64-msvc": "4.17.2",
9208 + "@rollup/rollup-android-arm-eabi": "4.18.0",
9209 + "@rollup/rollup-android-arm64": "4.18.0",
9210 + "@rollup/rollup-darwin-arm64": "4.18.0",
9211 + "@rollup/rollup-darwin-x64": "4.18.0",
9212 + "@rollup/rollup-linux-arm-gnueabihf": "4.18.0",
9213 + "@rollup/rollup-linux-arm-musleabihf": "4.18.0",
9214 + "@rollup/rollup-linux-arm64-gnu": "4.18.0",
9215 + "@rollup/rollup-linux-arm64-musl": "4.18.0",
9216 + "@rollup/rollup-linux-powerpc64le-gnu": "4.18.0",
9217 + "@rollup/rollup-linux-riscv64-gnu": "4.18.0",
9218 + "@rollup/rollup-linux-s390x-gnu": "4.18.0",
9219 + "@rollup/rollup-linux-x64-gnu": "4.18.0",
9220 + "@rollup/rollup-linux-x64-musl": "4.18.0",
9221 + "@rollup/rollup-win32-arm64-msvc": "4.18.0",
9222 + "@rollup/rollup-win32-ia32-msvc": "4.18.0",
9223 + "@rollup/rollup-win32-x64-msvc": "4.18.0",
9224 "fsevents": "~2.3.2"
9225 }
9226 },
@@ -8589,23 +9267,10 @@
9267 "url": "https://github.com/sponsors/sindresorhus"
9268 }
9269 },
8592 - "node_modules/rollup/node_modules/@rollup/rollup-linux-x64-gnu": {
8593 - "version": "4.17.2",
8594 - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.17.2.tgz",
8595 - "integrity": "sha512-Hy7pLwByUOuyaFC6mAr7m+oMC+V7qyifzs/nW2OJfC8H4hbCzOX07Ov0VFk/zP3kBsELWNFi7rJtgbKYsav9QQ==",
8596 - "cpu": [
8597 - "x64"
8598 - ],
8599 - "dev": true,
8600 - "optional": true,
8601 - "os": [
8602 - "linux"
8603 - ]
8604 - },
9270 "node_modules/rrweb-cssom": {
8606 - "version": "0.6.0",
8607 - "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.6.0.tgz",
8608 - "integrity": "sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==",
9271 + "version": "0.7.1",
9272 + "resolved": "https://registry.npmjs.org/rrweb-cssom/-/rrweb-cssom-0.7.1.tgz",
9273 + "integrity": "sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg==",
9274 "dev": true
9275 },
9276 "node_modules/run-applescript": {
@@ -8678,9 +9343,9 @@
9343 "dev": true
9344 },
9345 "node_modules/sass": {
8681 - "version": "1.77.4",
8682 - "resolved": "https://registry.npmjs.org/sass/-/sass-1.77.4.tgz",
8683 - "integrity": "sha512-vcF3Ckow6g939GMA4PeU7b2K/9FALXk2KF9J87txdHzXbUF9XRQRwSxcAs/fGaTnJeBFd7UoV22j3lzMLdM0Pw==",
9346 + "version": "1.77.6",
9347 + "resolved": "https://registry.npmjs.org/sass/-/sass-1.77.6.tgz",
9348 + "integrity": "sha512-ByXE1oLD79GVq9Ht1PeHWCPMPB8XHpBuz1r85oByKHjZY6qV6rWnQovQzXJXuQ/XyE1Oj3iPk3lo28uzaRA2/Q==",
9349 "dev": true,
9350 "dependencies": {
9351 "chokidar": ">=3.0.0 <4.0.0",
@@ -8783,11 +9448,11 @@
9448 }
9449 },
9450 "node_modules/shiki": {
8786 - "version": "1.6.2",
8787 - "resolved": "https://registry.npmjs.org/shiki/-/shiki-1.6.2.tgz",
8788 - "integrity": "sha512-X3hSm5GzzBd/BmPmGfkueOUADLyBoZo1ojYQXhd+NU2VJn458yt4duaS0rVzC+WtqftSV7mTVvDw+OB9AHi3Eg==",
9451 + "version": "1.7.0",
9452 + "resolved": "https://registry.npmjs.org/shiki/-/shiki-1.7.0.tgz",
9453 + "integrity": "sha512-H5pMn4JA7ayx8H0qOz1k2qANq6mZVCMl1gKLK6kWIrv1s2Ial4EmD4s4jE8QB5Dw03d/oCQUxc24sotuyR5byA==",
9454 "dependencies": {
8790 - "@shikijs/core": "1.6.2"
9455 + "@shikijs/core": "1.7.0"
9456 }
9457 },
9458 "node_modules/side-channel": {
@@ -9192,6 +9857,18 @@
9857 "node": ">= 6"
9858 }
9859 },
9860 + "node_modules/superjson": {
9861 + "version": "2.2.1",
9862 + "resolved": "https://registry.npmjs.org/superjson/-/superjson-2.2.1.tgz",
9863 + "integrity": "sha512-8iGv75BYOa0xRJHK5vRLEjE2H/i4lulTjzpUXic3Eg8akftYjkmQDa8JARQ42rlczXyFR3IeRoeFCc7RxHsYZA==",
9864 + "dev": true,
9865 + "dependencies": {
9866 + "copy-anything": "^3.0.2"
9867 + },
9868 + "engines": {
9869 + "node": ">=16"
9870 + }
9871 + },
9872 "node_modules/supports-color": {
9873 "version": "5.5.0",
9874 "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
@@ -9361,14 +10038,14 @@
10038 }
10039 },
10040 "node_modules/synckit/node_modules/tslib": {
9364 - "version": "2.6.2",
9365 - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz",
9366 - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q=="
10041 + "version": "2.6.3",
10042 + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz",
10043 + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ=="
10044 },
10045 "node_modules/tailwind-config-viewer": {
9369 - "version": "2.0.2",
9370 - "resolved": "https://registry.npmjs.org/tailwind-config-viewer/-/tailwind-config-viewer-2.0.2.tgz",
9371 - "integrity": "sha512-YkMEbWgvTyEp7J5S7qY9KGLHml6SLO8kQg4Q5xNM4tWJ+cFtSO/Rv2UKfYHYnE7UsY4Lb1LkHmNs3YSbU2mT2Q==",
10046 + "version": "2.0.3",
10047 + "resolved": "https://registry.npmjs.org/tailwind-config-viewer/-/tailwind-config-viewer-2.0.3.tgz",
10048 + "integrity": "sha512-UxeBz6Q0XLCmVcJ2IiYqM1vuxjIkGTf0idxpwb7LkCb/FEebEmUGqwE7XSGPrD8uL7bmCfWskyPGiwNtzMmrJw==",
10049 "dev": true,
10050 "dependencies": {
10051 "@koa/router": "^12.0.1",
@@ -9690,11 +10367,12 @@
10367 }
10368 },
10369 "node_modules/type-fest": {
9693 - "version": "0.20.2",
9694 - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
9695 - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
10370 + "version": "4.20.1",
10371 + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.20.1.tgz",
10372 + "integrity": "sha512-R6wDsVsoS9xYOpy8vgeBlqpdOyzJ12HNfQhC/aAKWM3YoCV9TtunJzh/QpkMgeDhkoynDcw5f1y+qF9yc/HHyg==",
10373 + "dev": true,
10374 "engines": {
9697 - "node": ">=10"
10375 + "node": ">=16"
10376 },
10377 "funding": {
10378 "url": "https://github.com/sponsors/sindresorhus"
@@ -9946,12 +10624,12 @@
10624 }
10625 },
10626 "node_modules/vite": {
9949 - "version": "5.2.12",
9950 - "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.12.tgz",
9951 - "integrity": "sha512-/gC8GxzxMK5ntBwb48pR32GGhENnjtY30G4A0jemunsBkiEZFw60s8InGpN8gkhHEkjnRK1aSAxeQgwvFhUHAA==",
10627 + "version": "5.3.1",
10628 + "resolved": "https://registry.npmjs.org/vite/-/vite-5.3.1.tgz",
10629 + "integrity": "sha512-XBmSKRLXLxiaPYamLv3/hnP/KXDai1NDexN0FpkTaZXTfycHvkRHoenpgl/fvuK/kPbB6xAgoyiryAhQNxYmAQ==",
10630 "dev": true,
10631 "dependencies": {
9954 - "esbuild": "^0.20.1",
10632 + "esbuild": "^0.21.3",
10633 "postcss": "^8.4.38",
10634 "rollup": "^4.13.0"
10635 },
@@ -10001,16 +10679,15 @@
10679 }
10680 },
10681 "node_modules/vite-bundle-analyzer": {
10004 - "version": "0.9.4",
10005 - "resolved": "https://registry.npmjs.org/vite-bundle-analyzer/-/vite-bundle-analyzer-0.9.4.tgz",
10006 - "integrity": "sha512-a/w4ShKQEbTe7wllLXI+3D8ELgRv7iHDuWEPaXokA+FhWBXJCdtOZYIvLzvnn8vxHf+7pm1c23AeGyW/0Ge0Yw==",
10682 + "version": "0.10.2",
10683 + "resolved": "https://registry.npmjs.org/vite-bundle-analyzer/-/vite-bundle-analyzer-0.10.2.tgz",
10684 + "integrity": "sha512-fvjazb65+nQHyBaNvj2CQlKl+fCsvn87HKNAurB3epV7x24mBL9PoCGx9mbAn9sgqeT0fDTTAKi+yis7oWzoEA==",
10685 "dev": true,
10686 "workspaces": [
10687 "examples/**/*"
10688 ],
10689 "dependencies": {
10012 - "picocolors": "^1.0.0",
10013 - "source-map": "^0.7.4"
10690 + "picocolors": "^1.0.0"
10691 }
10692 },
10693 "node_modules/vite-bundle-visualizer": {
@@ -10142,18 +10819,18 @@
10819 }
10820 },
10821 "node_modules/vite-plugin-vue-devtools": {
10145 - "version": "7.2.1",
10146 - "resolved": "https://registry.npmjs.org/vite-plugin-vue-devtools/-/vite-plugin-vue-devtools-7.2.1.tgz",
10147 - "integrity": "sha512-4k7QNZz0nSojoePQoxnE5fIzi8RU1QJHc0TEg4golv2phZxhBGfjScZD2B8X6bcrRbUQ9CaRKN0dzBs1xtzzNg==",
10822 + "version": "7.3.1",
10823 + "resolved": "https://registry.npmjs.org/vite-plugin-vue-devtools/-/vite-plugin-vue-devtools-7.3.1.tgz",
10824 + "integrity": "sha512-KuksceHlb5QZtb5gRB4wuRiquZRX74//i0X5jzvy5QzY11qwK44goyVrhPupZbsNfqwmZWNi3CQAe0RhLBUylg==",
10825 "dev": true,
10826 "dependencies": {
10150 - "@vue/devtools-core": "^7.2.1",
10151 - "@vue/devtools-kit": "^7.2.1",
10152 - "@vue/devtools-shared": "^7.2.1",
10827 + "@vue/devtools-core": "^7.3.1",
10828 + "@vue/devtools-kit": "^7.3.1",
10829 + "@vue/devtools-shared": "^7.3.1",
10830 "execa": "^8.0.1",
10831 "sirv": "^2.0.4",
10832 "vite-plugin-inspect": "^0.8.4",
10156 - "vite-plugin-vue-inspector": "^5.1.0"
10833 + "vite-plugin-vue-inspector": "^5.1.2"
10834 },
10835 "engines": {
10836 "node": ">=v14.21.3"
@@ -10538,16 +11215,22 @@
11215 "vue": "^3.0.0"
11216 }
11217 },
11218 + "node_modules/vscode-uri": {
11219 + "version": "3.0.8",
11220 + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.8.tgz",
11221 + "integrity": "sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==",
11222 + "dev": true
11223 + },
11224 "node_modules/vue": {
10542 - "version": "3.4.27",
10543 - "resolved": "https://registry.npmjs.org/vue/-/vue-3.4.27.tgz",
10544 - "integrity": "sha512-8s/56uK6r01r1icG/aEOHqyMVxd1bkYcSe9j8HcKtr/xTOFWvnzIVTehNW+5Yt89f+DLBe4A569pnZLS5HzAMA==",
11225 + "version": "3.4.29",
11226 + "resolved": "https://registry.npmjs.org/vue/-/vue-3.4.29.tgz",
11227 + "integrity": "sha512-8QUYfRcYzNlYuzKPfge1UWC6nF9ym0lx7mpGVPJYNhddxEf3DD0+kU07NTL0sXuiT2HuJuKr/iEO8WvXvT0RSQ==",
11228 "dependencies": {
10546 - "@vue/compiler-dom": "3.4.27",
10547 - "@vue/compiler-sfc": "3.4.27",
10548 - "@vue/runtime-dom": "3.4.27",
10549 - "@vue/server-renderer": "3.4.27",
10550 - "@vue/shared": "3.4.27"
11229 + "@vue/compiler-dom": "3.4.29",
11230 + "@vue/compiler-sfc": "3.4.29",
11231 + "@vue/runtime-dom": "3.4.29",
11232 + "@vue/server-renderer": "3.4.29",
11233 + "@vue/shared": "3.4.29"
11234 },
11235 "peerDependencies": {
11236 "typescript": "*"
@@ -10559,9 +11242,9 @@
11242 }
11243 },
11244 "node_modules/vue-advanced-cropper": {
10562 - "version": "2.8.8",
10563 - "resolved": "https://registry.npmjs.org/vue-advanced-cropper/-/vue-advanced-cropper-2.8.8.tgz",
10564 - "integrity": "sha512-yDM7Jb/gnxcs//JdbOogBUoHr1bhCQSto7/ohgETKAe4wvRpmqIkKSppMm1huVQr+GP1YoVlX/fkjKxvYzwwDQ==",
11245 + "version": "2.8.9",
11246 + "resolved": "https://registry.npmjs.org/vue-advanced-cropper/-/vue-advanced-cropper-2.8.9.tgz",
11247 + "integrity": "sha512-1jc5gO674kVGpJKekoaol6ZlwaF5VYDLSBwBOUpViW0IOrrRsyLw6XNszjEqgbavvqinlKNS6Kqlom3B5M72Tw==",
11248 "dependencies": {
11249 "classnames": "^2.2.6",
11250 "debounce": "^1.2.0",
@@ -10576,15 +11259,15 @@
11259 }
11260 },
11261 "node_modules/vue-component-type-helpers": {
10579 - "version": "2.0.19",
10580 - "resolved": "https://registry.npmjs.org/vue-component-type-helpers/-/vue-component-type-helpers-2.0.19.tgz",
10581 - "integrity": "sha512-cN3f1aTxxKo4lzNeQAkVopswuImUrb5Iurll9Gaw5cqpnbTAxtEMM1mgi6ou4X79OCyqYv1U1mzBHJkzmiK82w==",
11262 + "version": "2.0.21",
11263 + "resolved": "https://registry.npmjs.org/vue-component-type-helpers/-/vue-component-type-helpers-2.0.21.tgz",
11264 + "integrity": "sha512-3NaicyZ7N4B6cft4bfb7dOnPbE9CjLcx+6wZWAg5zwszfO4qXRh+U52dN5r5ZZfc6iMaxKCEcoH9CmxxoFZHLg==",
11265 "dev": true
11266 },
11267 "node_modules/vue-eslint-parser": {
10585 - "version": "9.4.2",
10586 - "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.4.2.tgz",
10587 - "integrity": "sha512-Ry9oiGmCAK91HrKMtCrKFWmSFWvYkpGglCeFAIqDdr9zdXmMMpJOmUJS7WWsW7fX81h6mwHmUZCQQ1E0PkSwYQ==",
11268 + "version": "9.4.3",
11269 + "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.4.3.tgz",
11270 + "integrity": "sha512-2rYRLWlIpaiN8xbPiDyXZXRgLGOtWxERV7ND5fFAv5qo1D2N9Fu9MNajBNc6o13lZ+24DAWCkQCvj4klgmcITg==",
11271 "dependencies": {
11272 "debug": "^4.3.4",
11273 "eslint-scope": "^7.1.1",
@@ -10604,6 +11287,37 @@
11287 "eslint": ">=6.0.0"
11288 }
11289 },
11290 + "node_modules/vue-eslint-parser/node_modules/eslint-scope": {
11291 + "version": "7.2.2",
11292 + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz",
11293 + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==",
11294 + "dependencies": {
11295 + "esrecurse": "^4.3.0",
11296 + "estraverse": "^5.2.0"
11297 + },
11298 + "engines": {
11299 + "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
11300 + },
11301 + "funding": {
11302 + "url": "https://opencollective.com/eslint"
11303 + }
11304 + },
11305 + "node_modules/vue-eslint-parser/node_modules/espree": {
11306 + "version": "9.6.1",
11307 + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz",
11308 + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==",
11309 + "dependencies": {
11310 + "acorn": "^8.9.0",
11311 + "acorn-jsx": "^5.3.2",
11312 + "eslint-visitor-keys": "^3.4.1"
11313 + },
11314 + "engines": {
11315 + "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
11316 + },
11317 + "funding": {
11318 + "url": "https://opencollective.com/eslint"
11319 + }
11320 + },
11321 "node_modules/vue-highlight-words": {
11322 "version": "3.0.1",
11323 "resolved": "https://registry.npmjs.org/vue-highlight-words/-/vue-highlight-words-3.0.1.tgz",
@@ -10635,9 +11349,9 @@
11349 }
11350 },
11351 "node_modules/vue-router": {
10638 - "version": "4.3.2",
10639 - "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.3.2.tgz",
10640 - "integrity": "sha512-hKQJ1vDAZ5LVkKEnHhmm1f9pMiWIBNGF5AwU67PdH7TyXCj/a4hTccuUuYCAMgJK6rO/NVYtQIEN3yL8CECa7Q==",
11352 + "version": "4.3.3",
11353 + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.3.3.tgz",
11354 + "integrity": "sha512-8Q+u+WP4N2SXY38FDcF2H1dUEbYVHVPtPCPZj/GTZx8RCbiB8AtJP9+YIxn4Vs0svMTNQcLIzka4GH7Utkx9xQ==",
11355 "dependencies": {
11356 "@vue/devtools-api": "^6.5.1"
11357 },
@@ -10667,13 +11381,13 @@
11381 }
11382 },
11383 "node_modules/vue-tsc": {
10670 - "version": "2.0.19",
10671 - "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-2.0.19.tgz",
10672 - "integrity": "sha512-JWay5Zt2/871iodGF72cELIbcAoPyhJxq56mPPh+M2K7IwI688FMrFKc/+DvB05wDWEuCPexQJ6L10zSwzzapg==",
11384 + "version": "2.0.21",
11385 + "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-2.0.21.tgz",
11386 + "integrity": "sha512-E6x1p1HaHES6Doy8pqtm7kQern79zRtIewkf9fiv7Y43Zo4AFDS5hKi+iHi2RwEhqRmuiwliB1LCEFEGwvxQnw==",
11387 "dev": true,
11388 "dependencies": {
10675 - "@volar/typescript": "~2.2.4",
10676 - "@vue/language-core": "2.0.19",
11389 + "@volar/typescript": "~2.3.0-alpha.15",
11390 + "@vue/language-core": "2.0.21",
11391 "semver": "^7.5.4"
11392 },
11393 "bin": {
@@ -10790,9 +11504,9 @@
11504 }
11505 },
11506 "node_modules/webpack-virtual-modules": {
10793 - "version": "0.6.1",
10794 - "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.1.tgz",
10795 - "integrity": "sha512-poXpCylU7ExuvZK8z+On3kX+S8o/2dQ/SVYueKA0D4WEMXROXgY8Ez50/bQEUmvoSMMrWcrJqCHuhAbsiwg7Dg==",
11507 + "version": "0.6.2",
11508 + "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz",
11509 + "integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==",
11510 "dev": true
11511 },
11512 "node_modules/whatwg-encoding": {
@@ -11000,7 +11714,8 @@
11714 "node_modules/wrappy": {
11715 "version": "1.0.2",
11716 "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
11003 - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
11717 + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
11718 + "dev": true
11719 },
11720 "node_modules/ws": {
11721 "version": "8.17.0",
@@ -11053,9 +11768,9 @@
11768 "dev": true
11769 },
11770 "node_modules/yaml": {
11056 - "version": "2.4.2",
11057 - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.2.tgz",
11058 - "integrity": "sha512-B3VqDZ+JAg1nZpaEmWtTXUlBneoGx6CPM9b0TENK6aoSu5t73dItudwdgmi6tHlIZZId4dZ9skcAQ2UbcyAeVA==",
11771 + "version": "2.4.5",
11772 + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.5.tgz",
11773 + "integrity": "sha512-aBx2bnqDzVOyNKfsysjA2ms5ZlnjSAW2eG3/L5G/CSujfjLJTJsEw1bGw8kCf04KodQWk1pxlGnZ56CRxiawmg==",
11774 "dev": true,
11775 "bin": {
11776 "yaml": "bin.mjs"
frontend/package.json
+31 -20
@@ -15,8 +15,8 @@
15 "test:e2e": "start-server-and-test preview http://localhost:4173 'cypress run --e2e'",
16 "test:e2e:dev": "start-server-and-test 'vite dev --port 4173' http://localhost:4173 'cypress open --e2e'",
17 "type-check": "vue-tsc --build --force",
18 - "lint": "eslint . --ext .vue,.js,.jsx,.cjs,.mjs,.ts,.tsx,.cts,.mts --fix --ignore-path ../.gitignore",
19 - "tailwind-config-viewer": "tailwind-config-viewer --config ./tailwind.config.js -o",
18 + "lint": "eslint . --fix",
19 + "tailwind-config-viewer": "tailwind-config-viewer -o",
20 "design-tokens": "node scripts/tokens-tool.js",
21 "start-server-old": "cd ../backend && uvicorn copilot:app --reload --port=5000",
22 "start-server-venv": "cd ../backend && source .venv/bin/activate && uvicorn copilot:app --port=5000 --log-level debug",
@@ -36,9 +36,9 @@
36 "@fontsource/lexend": "^5.0.20",
37 "@fontsource/public-sans": "^5.0.18",
38 "@popperjs/core": "^2.11.8",
39 - "@shikijs/markdown-it": "^1.6.2",
40 - "@vueuse/components": "^10.10.0",
41 - "@vueuse/core": "^10.10.0",
39 + "@shikijs/markdown-it": "^1.7.0",
40 + "@vueuse/components": "^10.11.0",
41 + "@vueuse/core": "^10.11.0",
42 "apexcharts": "^3.49.1",
43 "bytes": "^3.1.2",
44 "colord": "^2.9.3",
@@ -57,13 +57,13 @@
57 "pinia": "^2.1.7",
58 "pinia-plugin-persistedstate": "^3.2.1",
59 "secure-ls": "^1.2.6",
60 - "shiki": "^1.6.2",
60 + "shiki": "^1.7.0",
61 "validator": "^13.12.0",
62 - "vue": "^3.4.27",
63 - "vue-advanced-cropper": "^2.8.8",
62 + "vue": "^3.4.29",
63 + "vue-advanced-cropper": "^2.8.9",
64 "vue-highlight-words": "^3.0.1",
65 "vue-i18n": "^9.13.1",
66 - "vue-router": "^4.3.2",
66 + "vue-router": "^4.3.3",
67 "vue-sjv": "^0.0.6",
68 "vue3-apexcharts": "^1.5.3",
69 "vue3-marquee": "^4.2.0",
@@ -79,9 +79,9 @@
79 "@types/fs-extra": "^11.0.4",
80 "@types/inquirer": "^9.0.7",
81 "@types/jsdom": "^21.1.7",
82 - "@types/lodash": "^4.17.4",
83 - "@types/node": "^20.14.2",
84 - "@types/validator": "^13.11.10",
82 + "@types/lodash": "^4.17.5",
83 + "@types/node": "^20.14.5",
84 + "@types/validator": "^13.12.0",
85 "@vitejs/plugin-vue": "^5.0.5",
86 "@vitejs/plugin-vue-jsx": "^4.0.0",
87 "@vue/eslint-config-prettier": "^9.0.0",
@@ -90,35 +90,46 @@
90 "@vue/tsconfig": "^0.5.1",
91 "autoprefixer": "^10.4.19",
92 "cypress": "^13.11.0",
93 - "eslint": "8.57.0",
93 + "eslint": "^9.5.0",
94 "eslint-plugin-cypress": "^3.3.0",
95 "eslint-plugin-vue": "^9.26.0",
96 "flourite": "^1.3.0",
97 "fs-extra": "^11.2.0",
98 + "globals": "^15.6.0",
99 "jsdom": "^24.1.0",
100 "json5": "^2.2.3",
101 "npm-run-all2": "^6.2.0",
102 "picocolors": "^1.0.1",
103 "postcss": "^8.4.38",
103 - "prettier": "^3.3.1",
104 - "sass": "^1.77.4",
104 + "prettier": "^3.3.2",
105 + "sass": "^1.77.6",
106 "start-server-and-test": "^2.0.4",
106 - "tailwind-config-viewer": "^2.0.2",
107 + "tailwind-config-viewer": "^2.0.3",
108 "tailwindcss": "^3.4.4",
109 "taze": "^0.13.8",
110 + "type-fest": "^4.20.1",
111 "unplugin-vue-components": "^0.27.0",
110 - "vite": "^5.2.12",
111 - "vite-bundle-analyzer": "^0.9.4",
112 + "vite": "^5.3.1",
113 + "vite-bundle-analyzer": "^0.10.2",
114 "vite-bundle-visualizer": "^1.2.1",
113 - "vite-plugin-vue-devtools": "^7.2.1",
115 + "vite-plugin-vue-devtools": "^7.3.1",
116 "vite-svg-loader": "^5.1.0",
117 "vitest": "^1.6.0",
116 - "vue-tsc": "^2.0.19"
118 + "vue-tsc": "^2.0.21"
119 },
120 "optionalDependencies": {
121 "@rollup/rollup-linux-x64-gnu": "^4.18.0"
122 },
123 "overrides": {
124 + "@vue/eslint-config-typescript": {
125 + "eslint": "^9.5.0"
126 + },
127 + "@typescript-eslint/type-utils": {
128 + "eslint": "^9.5.0"
129 + },
130 + "@typescript-eslint/utils": {
131 + "eslint": "^9.5.0"
132 + },
133 "secure-ls": {
134 "crypto-js": "^4.2.0"
135 }
frontend/src/api/index.ts
+3 -1
@@ -21,6 +21,7 @@ import license from "./license"
21 import scheduler from "./scheduler"
22 import networkConnectors from "./networkConnectors"
23 import cloudSecurityAssessment from "./cloudSecurityAssessment"
24 +import webVulnerabilityAssessment from "./webVulnerabilityAssessment"
25
26 export default {
27 agents,
@@ -45,5 +46,6 @@ export default {
46 license,
47 scheduler,
48 networkConnectors,
48 - cloudSecurityAssessment
49 + cloudSecurityAssessment,
50 + webVulnerabilityAssessment
51 }
frontend/src/api/logs.ts
+3 -2
@@ -1,13 +1,14 @@
1 import { type FlaskBaseResponse } from "@/types/flask.d"
2 import { HttpClient } from "./httpClient"
3 import type { Log, LogEventType } from "@/types/logs.d"
4 +import type { SafeAny } from "@/types/common.d"
5
6 export type LogsQueryTimeRange = `${number}${"h" | "d" | "w"}`
7 export type LogsQueryEventType = `${LogEventType}`
8 export type LogsQuery = { userId: string } | { timeRange: LogsQueryTimeRange } | { eventType: LogsQueryEventType }
9
10 // Extraction of keys from the union type LogsQuery
10 -type KeysOfLogsQuery<T> = T extends { [K in keyof T]: any } ? keyof T : never
11 +type KeysOfLogsQuery<T> = T extends { [K in keyof T]: SafeAny } ? keyof T : never
12
13 // Union of values extracted from keys
14 export type LogsQueryTypes = KeysOfLogsQuery<LogsQuery>
@@ -17,7 +18,7 @@ export default {
18 getLogs(query?: LogsQuery) {
19 let method: "get" | "post" = "get"
20 let url = "logs"
20 - let body: any = undefined
21 + let body: { time_range: LogsQueryTimeRange } | undefined = undefined
22
23 if (query && "userId" in query) {
24 method = "get"
frontend/src/api/monitoringAlerts.ts
+1 -1
@@ -18,7 +18,7 @@ export interface CustomProvisionPayload {
18 alert_description: string
19 alert_priority: CustomProvisionPriority
20 search_query: string
21 - streams: { [key: string]: any }
21 + streams: string[]
22 custom_fields: {
23 name: string
24 value: string
frontend/src/api/webVulnerabilityAssessment.ts new
+18
@@ -0,0 +1,18 @@
1 +import { type FlaskBaseResponse } from "@/types/flask.d"
2 +import { HttpClient } from "./httpClient"
3 +import type { NucleiReport, ScanHostPayload } from "@/types/webVulnerabilityAssessment.d"
4 +
5 +export default {
6 + getAllReports() {
7 + return HttpClient.get<FlaskBaseResponse & { reports: NucleiReport[] }>(`/nuclei/all_reports`)
8 + },
9 + getReport(host: string, reportPage: string) {
10 + return HttpClient.get<FlaskBaseResponse & { markdown: string }>(`/nuclei/report/${host}/${reportPage}`)
11 + },
12 + scan(payload: ScanHostPayload) {
13 + return HttpClient.post<FlaskBaseResponse>(`/nuclei/scan`, payload)
14 + },
15 + deleteReport(host: string) {
16 + return HttpClient.delete<FlaskBaseResponse>(`/nuclei/delete_report/${host}`)
17 + }
18 +}
frontend/src/assets/scss/hljs.scss deleted
-62
@@ -1,62 +0,0 @@
1 -.hljs {
2 - color: var(--fg-color);
3 -}
4 -.hljs-comment,
5 -.hljs-quote {
6 - color: var(--fg-secondary-color);
7 - font-style: italic;
8 -}
9 -.hljs-doctag,
10 -.hljs-keyword,
11 -.hljs-formula {
12 - color: var(--secondary4-color);
13 -}
14 -.hljs-section,
15 -.hljs-name,
16 -.hljs-selector-tag,
17 -.hljs-deletion,
18 -.hljs-subst {
19 - color: var(--secondary2-color);
20 -}
21 -.hljs-literal {
22 - color: var(--secondary1-color);
23 -}
24 -.hljs-string,
25 -.hljs-regexp,
26 -.hljs-addition,
27 -.hljs-attribute,
28 -.hljs-meta .hljs-string {
29 - color: var(--success-color);
30 -}
31 -.hljs-attr,
32 -.hljs-variable,
33 -.hljs-template-variable,
34 -.hljs-type,
35 -.hljs-selector-class,
36 -.hljs-selector-attr,
37 -.hljs-selector-pseudo,
38 -.hljs-number {
39 - color: #c28d06;
40 -}
41 -.hljs-symbol,
42 -.hljs-bullet,
43 -.hljs-link,
44 -.hljs-meta,
45 -.hljs-selector-id,
46 -.hljs-title {
47 - color: var(--secondary1-color);
48 -}
49 -.hljs-built_in,
50 -.hljs-title.class_,
51 -.hljs-class .hljs-title {
52 - color: var(--secondary2-color);
53 -}
54 -.hljs-emphasis {
55 - font-style: italic;
56 -}
57 -.hljs-strong {
58 - font-weight: bold;
59 -}
60 -.hljs-link {
61 - text-decoration: underline;
62 -}
frontend/src/assets/scss/vue-md-it-override.scss new
+48
@@ -0,0 +1,48 @@
1 +.vue-md-it-wrapper {
2 + img {
3 + max-width: 100%;
4 + width: 100%;
5 + border: var(--border-small-100);
6 + border-radius: var(--border-radius);
7 + }
8 +
9 + table {
10 + --cell-padding: 8px 12px;
11 +
12 + width: 100%;
13 + border: var(--border-small-100);
14 + border-radius: var(--border-radius);
15 + text-align: left;
16 + font-variant-numeric: tabular-nums;
17 + border-collapse: separate;
18 + border-spacing: 0;
19 + overflow: hidden;
20 +
21 + thead {
22 + tr {
23 + th {
24 + white-space: nowrap;
25 + text-align: left;
26 + padding: var(--cell-padding);
27 + background-color: var(--bg-secondary-color);
28 + }
29 + }
30 + }
31 +
32 + tbody {
33 + tr {
34 + td {
35 + padding: var(--cell-padding);
36 + background-color: var(--bg-color);
37 + border-bottom: 1px solid var(--border-color);
38 + }
39 +
40 + &:last-child {
41 + td {
42 + border-bottom: 0;
43 + }
44 + }
45 + }
46 + }
47 + }
48 +}
frontend/src/components/agents/agentFlow/AgentFlowCollectList.vue
+1 -5
@@ -33,17 +33,13 @@ import Api from "@/api"
33 import type { CollectResult, FlowResult } from "@/types/flow.d"
34 import { nanoid } from "nanoid"
35
36 -interface CollectResultExt extends CollectResult {
37 - ___id?: string
38 -}
39 -
36 const { flow } = defineProps<{
37 flow: FlowResult
38 }>()
39
40 const message = useMessage()
41 const loading = ref(false)
46 -const collectList = ref<CollectResultExt[]>([])
42 +const collectList = ref<CollectResult[]>([])
43
44 function getData() {
45 loading.value = true
frontend/src/components/agents/vulnerabilities/VulnerabilityCard.vue
+6 -3
@@ -94,11 +94,13 @@ const dFormats = useSettingsStore().dateFormat
94
95 const vulnerabilitySanitized = computed(() => {
96 const newObj = []
97 - const obj: { [key: string]: any } = cloneDeep(vulnerability.value)
97 + const obj = cloneDeep(vulnerability.value)
98 for (const k in obj) {
99 - if (typeof obj[k] === "string") {
100 - const maybeTime = dayjs(obj[k])
99 + const prop = obj[k as keyof typeof obj]
100 + if (typeof prop === "string") {
101 + const maybeTime = dayjs(prop as string | number | Date | null | undefined)
102 if (maybeTime.isValid()) {
103 + // @ts-expect-error k is ok
104 obj[k] = maybeTime.format(dFormats.datetime)
105 }
106 }
@@ -106,6 +108,7 @@ const vulnerabilitySanitized = computed(() => {
108 if (!["external_references", "id"].includes(k))
109 newObj.push({
110 label: k,
111 + // @ts-expect-error k is ok
112 value: obj[k]
113 })
114 }
frontend/src/components/artifacts/ArtifactsCollect.vue
+1 -5
@@ -98,10 +98,6 @@ import type { Artifact, CollectResult } from "@/types/artifacts.d"
98 import { nanoid } from "nanoid"
99 // import { collectResult } from "./mock"
100
101 -interface CollectResultExt extends CollectResult {
102 - ___id?: string
103 -}
104 -
101 const emit = defineEmits<{
102 (e: "loaded-agents", value: Agent[]): void
103 (e: "loaded-artifacts", value: Artifact[]): void
@@ -125,7 +121,7 @@ const loadingArtifacts = ref(false)
121 const loading = ref(false)
122 const agentsList = ref<Agent[]>([])
123 const artifactsList = ref<Artifact[]>([])
128 -const collectList = ref<CollectResultExt[]>([])
124 +const collectList = ref<CollectResult[]>([])
125 const isDirty = ref(false)
126
127 const InfoIcon = "carbon:information"
frontend/src/components/artifacts/CollectItem.vue
+1 -1
@@ -64,7 +64,7 @@ onBeforeMount(() => {
64 }
65
66 if (prop.value && typeof prop.value === "string") {
67 - prop.value = dayjs(value).isValid() ? formatDate(value, dFormats.datetimesec) : value.toString()
67 + prop.value = dayjs(value).isValid() ? formatDate(value, dFormats.datetimesec).toString() : value.toString()
68 }
69
70 if (prop.value && typeof prop.value === "number") {
frontend/src/components/common/CardStatsIcon.vue
+1 -1
@@ -25,7 +25,7 @@ const props = withDefaults(
25 )
26 const { boxed, boxSize, iconSize, iconName, color } = toRefs(props)
27
28 -const style = computed<{ [key: string]: any }>(() => useThemeStore().style)
28 +const style = computed(() => useThemeStore().style)
29
30 const iconColor = computed(() => color?.value || style.value["--primary-color"])
31 const iconBoxedSize = computed(() => (boxSize.value / 100) * 45)
frontend/src/components/common/Icon.vue
+1 -1
@@ -28,7 +28,7 @@ const useWrapper = computed(() => !!(props.bgColor || props.bgSize || props.bord
28 const componentName = computed(() => (useWrapper.value ? NIconWrapper : NIcon))
29
30 const options = computed(() => {
31 - const opt: any = {}
31 + const opt: Partial<{ size: number; color: string; borderRadius: number; iconColor: string; depth: number }> = {}
32 if (useWrapper.value) {
33 if (props.bgSize !== undefined) opt.size = props.bgSize
34 if (props.bgColor !== undefined) opt.color = props.bgColor
frontend/src/components/common/ListPercentage.vue
+10 -5
@@ -6,12 +6,16 @@
6 <div class="basis-2/3 truncate borde">{{ labelKey }}</div>
7 <div class="grow">{{ percentageKey }}</div>
8 </div>
9 - <div class="flex gap-4 justify-between items-center" v-for="item of list" :key="item[labelKey]">
10 - <div class="basis-2/3 truncate font-mono">{{ item[labelKey] }}</div>
9 + <div
10 + class="flex gap-4 justify-between items-center"
11 + v-for="item of list"
12 + :key="item[labelKey as keyof typeof item]"
13 + >
14 + <div class="basis-2/3 truncate font-mono">{{ item[labelKey as keyof typeof item] }}</div>
15 <div class="grow">
16 <n-progress
17 type="line"
14 - :percentage="item[percentageKey]"
18 + :percentage="parseInt(item[percentageKey as keyof typeof item], 10)"
19 :indicator-placement="'inside'"
20 :indicator-text-color="style['--bg-color']"
21 :color="style['--fg-color']"
@@ -25,18 +29,19 @@
29
30 <script setup lang="ts">
31 import { useThemeStore } from "@/stores/theme"
32 +import type { SafeAny } from "@/types/common.d"
33 import { NEmpty, NProgress } from "naive-ui"
34 import { computed } from "vue"
35
36 const { list, labelKey, percentageKey } = defineProps<{
32 - list: any[]
37 + list: SafeAny[]
38 labelKey: string
39 percentageKey: string
40 }>()
41
42 const themeStore = useThemeStore()
43
39 -const style = computed<{ [key: string]: any }>(() => themeStore.style)
44 +const style = computed(() => themeStore.style)
45 </script>
46
47 <style scoped lang="scss">
frontend/src/components/common/Markdown.vue
+10 -2
@@ -2,7 +2,6 @@
2 <Suspense>
3 <vue-markdown-it
4 :source="source"
5 - preset="commonmark"
5 :plugins="[
6 [
7 fromHighlighter(highlighter, {
@@ -12,6 +11,7 @@
11 ]"
12 class="markdown-style scrollbar-styled"
13 :class="{ codeBgTransparent }"
14 + @click="emit('click', $event)"
15 />
16 </Suspense>
17 </template>
@@ -22,8 +22,16 @@ import { VueMarkdownIt } from "@f3ve/vue-markdown-it"
22 import { getHighlighter, codeThemes } from "@/utils/highlighter"
23 import { fromHighlighter } from "@shikijs/markdown-it/core"
24 import type { HighlighterGeneric } from "shiki/core"
25 +import "@/assets/scss/vue-md-it-override.scss"
26
26 -const highlighter: HighlighterGeneric<any, any> = (await getHighlighter()) as unknown as HighlighterGeneric<any, any>
27 +const highlighter: HighlighterGeneric<string, string> = (await getHighlighter()) as unknown as HighlighterGeneric<
28 + string,
29 + string
30 +>
31 +
32 +const emit = defineEmits<{
33 + (e: "click", value: PointerEvent): void
34 +}>()
35
36 const props = defineProps<{
37 source: string
frontend/src/components/common/SearchDialog.vue
+1 -1
@@ -115,7 +115,7 @@ const showSearchBox = ref(false)
115 const search = ref("")
116 const activeItem = ref<null | string | number>(null)
117 const commandIcon = ref("⌘")
118 -const scrollContent = ref<(ScrollbarInst & { $el: any }) | null>(null)
118 +const scrollContent = ref<(ScrollbarInst & { $el: HTMLElement }) | null>(null)
119 const { gotoCustomer, gotoSocAlerts, gotoAlerts, gotoConnectors } = useGoto()
120
121 const groups = ref<Groups>([
frontend/src/components/graylog/Metrics/UncommittedEntries.vue
+2 -2
@@ -45,7 +45,7 @@ const { value } = toRefs(props)
45 const LinkIcon = "carbon:launch"
46 const DangerIcon = "majesticons:exclamation-line"
47
48 -const style = computed<{ [key: string]: any }>(() => useThemeStore().style)
48 +const style = computed(() => useThemeStore().style)
49 const isThemeDark = computed(() => useThemeStore().isThemeDark)
50 const { gotoGraylogManagement } = useGoto()
51
@@ -53,7 +53,7 @@ const isWarning = computed<boolean>(() => {
53 return value.value > UNCOMMITTED_JOURNAL_ENTRIES_THRESHOLD
54 })
55
56 -const series = ref<{ name: string; data: any }[]>([
56 +const series = ref<{ name: string; data: [Date, number][] }[]>([
57 {
58 name: "Entries",
59 data: []
frontend/src/components/graylog/Pipelines/RulesList.vue
+2 -2
@@ -25,12 +25,12 @@ const { highlight } = toRefs(props)
25 const message = useMessage()
26 const loading = ref(false)
27 const rules = ref<PipelineRule[]>([])
28 -const scrollContent = ref<(ScrollbarInst & { $el: any }) | null>(null)
28 +const scrollContent = ref<(ScrollbarInst & { $el: HTMLElement }) | null>(null)
29
30 function scrollToItem(id: string) {
31 const element = document.getElementById(`rule-${id}`)
32 if (element && scrollContent.value) {
33 - const wrap: HTMLElement = scrollContent.value.$el.nextSibling || scrollContent.value.$el.nextElementSibling
33 + const wrap = (scrollContent.value.$el.nextSibling || scrollContent.value.$el.nextElementSibling) as HTMLElement
34 const middle = element.offsetTop - wrap.offsetHeight / 2
35 scrollContent.value?.scrollTo({ top: middle, behavior: "smooth" })
36 }
frontend/src/components/indices/Marquee.vue
+1 -1
@@ -57,7 +57,7 @@ watch(indices, val => {
57 })
58
59 const message = useMessage()
60 -const style = computed<{ [key: string]: any }>(() => useThemeStore().style)
60 +const style = computed(() => useThemeStore().style)
61 const gradientColor = computed(() => style.value["--bg-color-rgb"].split(", "))
62 const loading = computed(() => !list?.value || list.value === null)
63
frontend/src/components/indices/TopIndices.vue
+6 -3
@@ -26,7 +26,7 @@ const props = defineProps<{
26 }>()
27 const { indices } = toRefs(props)
28
29 -const style = computed<{ [key: string]: any }>(() => useThemeStore().style)
29 +const style = computed(() => useThemeStore().style)
30 const loading = computed(() => !indices?.value || indices.value === null)
31 const chartCtx = ref<ECharts | null>(null)
32
@@ -112,7 +112,7 @@ function getOptions() {
112 "#bae6fd"
113 ],
114 tooltip: {
115 - formatter: (params: any) => {
115 + formatter: (params: { seriesName: string; name: string; value: number; percent: number }) => {
116 return `${params.seriesName}<hr/>${params.name}<br/><strong>${bytes(params.value)}</strong> (${
117 params.percent
118 }%)`
@@ -149,7 +149,10 @@ function getOptions() {
149 }
150 }
151 },
152 - labelLayout: function (params: any) {
152 + labelLayout: function (params: {
153 + labelLinePoints: Array<number[]>
154 + labelRect: { x: number; width: number }
155 + }) {
156 const isLeft = chartCtx.value ? params.labelRect.x < chartCtx.value.getWidth() / 2 : false
157 const points = params.labelLinePoints
158 // Update the end point.
frontend/src/components/overview/HealthcheckCard.vue
+1 -1
@@ -39,7 +39,7 @@ const message = useMessage()
39 const loading = ref(false)
40 const healthcheck = ref<InfluxDBAlert[]>([])
41
42 -const style = computed<{ [key: string]: any }>(() => useThemeStore().style)
42 +const style = computed(() => useThemeStore().style)
43
44 const total = computed<number>(() => {
45 return healthcheck.value.length || 0
frontend/src/components/soc/SocAlerts/SocAlertAssets/SocAlertAssetsItem.vue
+3 -3
@@ -171,11 +171,11 @@ const descriptionFull = computed(() => {
171 })
172
173 const properties = computed(() => {
174 - const props = _omit<Record<string, any>>(asset, ["asset_description", "asset_type"])
174 + const props = _omit(asset, ["asset_description", "asset_type"])
175 for (const key in props) {
176 - const prop = props[key]
176 + const prop = props[key as keyof typeof props]
177 if (prop && (key === "date_added" || key === "date_update")) {
178 - props[key] = formatDate(prop, true)
178 + props[key] = formatDate(prop.toString(), true)
179 }
180 }
181 return props
frontend/src/components/soc/SocAlerts/SocAlertItem/SocAlertItem.vue
+1 -1
@@ -179,7 +179,7 @@ const message = useMessage()
179 const alert = ref(alertData.value || null)
180 const alertObject = ref<Alert>({} as Alert)
181 const loading = computed(() => loadingBookmark.value || loadingData.value || loadingDelete.value)
182 -const caseId = computed<number | null>(() => (alert.value?.cases?.length ? alert.value?.cases[0] : null))
182 +const caseId = computed(() => (alert.value?.cases?.length ? alert.value?.cases[0] : null))
183
184 function updateAlert(alertUpdated: SocAlert) {
185 const ownerObject = alertUpdated.owner
frontend/src/components/soc/SocAlerts/SocAlertItem/SocAlertItemDetails.vue
+4 -1
@@ -14,7 +14,10 @@
14 <template #key>{{ key }}</template>
15 <template #value>
16 <template v-if="key === 'customer_code' && value && value !== 'Customer Not Found'">
17 - <code class="cursor-pointer text-primary-color" @click="gotoCustomer({ code: value })">
17 + <code
18 + class="cursor-pointer text-primary-color"
19 + @click="gotoCustomer({ code: value.toString() })"
20 + >
21 #{{ value }}
22 <Icon :name="LinkIcon" :size="13" class="relative top-0.5" />
23 </code>
frontend/src/components/webVulnerabilityAssessment/ReportsItem.vue new
+176
@@ -0,0 +1,176 @@
1 +<template>
2 + <n-spin :show="canceling">
3 + <div class="item flex flex-col gap-2 px-5 py-3" @click="openReport()">
4 + <div class="header-box flex justify-between">
5 + {{ report }}
6 + </div>
7 + <div class="footer-box flex justify-end">
8 + <n-popconfirm
9 + @positive-click="deleteReport()"
10 + v-model:show="showConfirm"
11 + trigger="manual"
12 + @clickoutside="showConfirm = false"
13 + >
14 + <template #trigger>
15 + <div @click.stop="showConfirm = true" class="delete-btn">delete</div>
16 + </template>
17 + Are you sure you want to delete the report?
18 + </n-popconfirm>
19 + </div>
20 +
21 + <n-modal
22 + v-model:show="showDetails"
23 + preset="card"
24 + :style="{ maxWidth: 'min(800px, 90vw)', minHeight: 'min(400px, 90vh)', overflow: 'hidden' }"
25 + :title="report"
26 + :bordered="false"
27 + segmented
28 + >
29 + <n-spin :show="loading" class="min-h-48">
30 + <n-page-header title="index" @back="pageBack" v-if="reportNavigation.length > 1" class="mb-3" />
31 + <Suspense>
32 + <Markdown :source="reportMarkdown || ''" @click="checkEvent($event)" />
33 + </Suspense>
34 + <n-empty
35 + description="Page not found"
36 + class="justify-center h-48"
37 + v-if="!loading && !reportMarkdown"
38 + />
39 + </n-spin>
40 + </n-modal>
41 + </div>
42 + </n-spin>
43 +</template>
44 +
45 +<script setup lang="ts">
46 +import type { NucleiReport } from "@/types/webVulnerabilityAssessment.d"
47 +import Api from "@/api"
48 +import { computed, defineAsyncComponent, ref, watch } from "vue"
49 +import { useMessage, NSpin, NModal, NEmpty, NPageHeader, NPopconfirm } from "naive-ui"
50 +const Markdown = defineAsyncComponent(() => import("@/components/common/Markdown.vue"))
51 +
52 +const emit = defineEmits<{
53 + (e: "deleted"): void
54 +}>()
55 +
56 +const { report } = defineProps<{ report: NucleiReport }>()
57 +
58 +const message = useMessage()
59 +const canceling = ref(false)
60 +const loading = ref(false)
61 +const showConfirm = ref(false)
62 +const showDetails = ref(false)
63 +
64 +const reportNavigation = ref<string[]>([])
65 +const currentReportPage = ref<string | null>(null)
66 +const reportsCache = ref<{ [key: string]: string }>({})
67 +const reportMarkdown = computed(() => Reflect.get(reportsCache.value, currentReportPage.value as string))
68 +
69 +watch(showDetails, val => {
70 + if (!val) {
71 + navigationReset()
72 + }
73 +})
74 +
75 +function openReport(page?: string) {
76 + currentReportPage.value = page || "index.md"
77 + reportNavigation.value.push(currentReportPage.value)
78 +
79 + showDetails.value = true
80 +
81 + if (reportsCache.value[currentReportPage.value]) {
82 + return
83 + }
84 +
85 + loading.value = true
86 +
87 + Api.webVulnerabilityAssessment
88 + .getReport(report, currentReportPage.value)
89 + .then(res => {
90 + if (res.data.success) {
91 + reportsCache.value[currentReportPage.value as string] = res.data.markdown
92 + } else {
93 + message.warning(res.data?.message || "An error occurred. Please try again later.")
94 + }
95 + })
96 + .catch(err => {
97 + message.error(err.response?.data?.message || "An error occurred. Please try again later.")
98 + })
99 + .finally(() => {
100 + loading.value = false
101 + })
102 +}
103 +
104 +function checkEvent(event: PointerEvent) {
105 + const el = event.target as HTMLAnchorElement | null
106 + const href = el?.attributes.getNamedItem("href")
107 + const path = href?.value || ""
108 +
109 + if (path && path.lastIndexOf(".md") !== -1) {
110 + event.preventDefault()
111 + event.stopImmediatePropagation()
112 + openReport(path)
113 + }
114 +}
115 +
116 +function pageBack() {
117 + reportNavigation.value.pop()
118 + currentReportPage.value = reportNavigation.value.at(-1) || "index.md"
119 +}
120 +
121 +function navigationReset() {
122 + reportNavigation.value = []
123 + currentReportPage.value = null
124 +}
125 +
126 +function deleteReport() {
127 + canceling.value = true
128 +
129 + Api.webVulnerabilityAssessment
130 + .deleteReport(report)
131 + .then(res => {
132 + if (res.data.success) {
133 + message.success(res.data?.message || "Report deleted successfully")
134 + emit("deleted")
135 + } else {
136 + message.warning(res.data?.message || "An error occurred. Please try again later.")
137 + }
138 + })
139 + .catch(err => {
140 + message.error(err.response?.data?.message || "An error occurred. Please try again later.")
141 + })
142 + .finally(() => {
143 + canceling.value = false
144 + })
145 +}
146 +</script>
147 +
148 +<style lang="scss" scoped>
149 +.item {
150 + border-radius: var(--border-radius);
151 + background-color: var(--bg-color);
152 + transition: all 0.2s var(--bezier-ease);
153 + border: var(--border-small-050);
154 + cursor: pointer;
155 +
156 + .header-box {
157 + font-family: var(--font-family-mono);
158 + }
159 + .footer-box {
160 + font-family: var(--font-family-mono);
161 + text-align: right;
162 + font-size: 12px;
163 + color: var(--fg-secondary-color);
164 +
165 + .delete-btn {
166 + &:hover {
167 + color: var(--error-color);
168 + }
169 + }
170 + }
171 +
172 + &:hover {
173 + box-shadow: 0px 0px 0px 1px inset var(--primary-color);
174 + }
175 +}
176 +</style>
frontend/src/components/webVulnerabilityAssessment/ReportsList.vue new
+109
@@ -0,0 +1,109 @@
1 +<template>
2 + <div class="available-reports-list">
3 + <div class="header flex items-center justify-end gap-2 mb-3">
4 + <div class="info grow flex gap-5">
5 + <n-popover overlap placement="bottom-start">
6 + <template #trigger>
7 + <div class="bg-color border-radius">
8 + <n-button size="small" class="!cursor-help">
9 + <template #icon>
10 + <Icon :name="InfoIcon"></Icon>
11 + </template>
12 + </n-button>
13 + </div>
14 + </template>
15 + <div class="flex flex-col gap-2">
16 + <div class="box">
17 + Total reports:
18 + <code>{{ totalReports }}</code>
19 + </div>
20 + </div>
21 + </n-popover>
22 + </div>
23 + <div class="actions flex gap-2 items-center">
24 + <n-button size="small" type="primary" @click="showForm = true">
25 + <template #icon>
26 + <Icon :name="NewReportIcon" :size="15"></Icon>
27 + </template>
28 + Scan Host
29 + </n-button>
30 + </div>
31 + </div>
32 + <n-spin :show="loading" class="min-h-32">
33 + <div class="list grid gap-4 grid-auto-flow-250">
34 + <template v-if="reportsList.length">
35 + <ReportsItem
36 + v-for="report of reportsList"
37 + :key="report"
38 + :report
39 + class="item-appear item-appear-bottom item-appear-005"
40 + @deleted="getReports()"
41 + />
42 + </template>
43 + <template v-else>
44 + <n-empty description="No items found" class="justify-center h-48" v-if="!loading" />
45 + </template>
46 + </div>
47 + </n-spin>
48 +
49 + <n-modal
50 + v-model:show="showForm"
51 + display-directive="show"
52 + preset="card"
53 + :style="{ maxWidth: 'min(600px, 90vw)', minHeight: 'min(230px, 90vh)', overflow: 'hidden' }"
54 + title="Scan Host"
55 + :bordered="false"
56 + segmented
57 + >
58 + <ScanHostForm @submitted="getReports()" @mounted="formCTX = $event" />
59 + </n-modal>
60 + </div>
61 +</template>
62 +<script setup lang="ts">
63 +import { computed, onBeforeMount, ref, watch } from "vue"
64 +import { NSpin, NEmpty, NPopover, NButton, NModal, useMessage } from "naive-ui"
65 +import type { NucleiReport } from "@/types/webVulnerabilityAssessment.d"
66 +import Icon from "@/components/common/Icon.vue"
67 +import ReportsItem from "./ReportsItem.vue"
68 +import ScanHostForm from "./ScanHostForm.vue"
69 +import Api from "@/api"
70 +
71 +const InfoIcon = "carbon:information"
72 +const NewReportIcon = "carbon:content-delivery-network"
73 +const message = useMessage()
74 +const showForm = ref(false)
75 +const loading = ref(false)
76 +const reportsList = ref<NucleiReport[]>([])
77 +const totalReports = computed(() => reportsList.value.length)
78 +const formCTX = ref<{ reset: () => void } | null>(null)
79 +
80 +function getReports() {
81 + loading.value = true
82 +
83 + Api.webVulnerabilityAssessment
84 + .getAllReports()
85 + .then(res => {
86 + if (res.data.success) {
87 + reportsList.value = res.data?.reports || []
88 + } else {
89 + message.warning(res.data?.message || "An error occurred. Please try again later.")
90 + }
91 + })
92 + .catch(err => {
93 + message.error(err.response?.data?.message || "An error occurred. Please try again later.")
94 + })
95 + .finally(() => {
96 + loading.value = false
97 + })
98 +}
99 +
100 +watch(showForm, val => {
101 + if (val) {
102 + formCTX.value?.reset()
103 + }
104 +})
105 +
106 +onBeforeMount(() => {
107 + getReports()
108 +})
109 +</script>
frontend/src/components/webVulnerabilityAssessment/ScanHostForm.vue new
+164
@@ -0,0 +1,164 @@
1 +<template>
2 + <n-spin :show="loading" class="creation-report-form">
3 + <n-form :label-width="80" :model="form" :rules="rules" ref="formRef">
4 + <div class="flex flex-col gap-2">
5 + <div class="flex gap-4 items-start">
6 + <n-form-item label="Host" path="host" class="grow">
7 + <n-input v-model:value.trim="form.host" placeholder="Please insert the Host" clearable />
8 + </n-form-item>
9 + </div>
10 +
11 + <div class="flex justify-between gap-4">
12 + <n-button @click="reset()" :disabled="loading">Reset</n-button>
13 + <n-button
14 + type="primary"
15 + :disabled="!isValid"
16 + @click="validate(() => submit())"
17 + :loading="submitting"
18 + >
19 + Submit
20 + </n-button>
21 + </div>
22 + </div>
23 + </n-form>
24 + </n-spin>
25 +</template>
26 +
27 +<script setup lang="ts">
28 +import { computed, onMounted, ref } from "vue"
29 +import Api from "@/api"
30 +import {
31 + useMessage,
32 + NForm,
33 + NFormItem,
34 + NInput,
35 + NButton,
36 + NSpin,
37 + type FormValidationError,
38 + type FormInst,
39 + type FormRules,
40 + type MessageReactive,
41 + type FormItemRule
42 +} from "naive-ui"
43 +import type { ScanHostPayload } from "@/types/webVulnerabilityAssessment.d"
44 +import isURL from "validator/es/lib/isURL"
45 +
46 +type FormPayload = ScanHostPayload
47 +
48 +const emit = defineEmits<{
49 + (e: "submitted"): void
50 + (
51 + e: "mounted",
52 + value: {
53 + reset: () => void
54 + }
55 + ): void
56 +}>()
57 +
58 +const submitting = ref(false)
59 +const loading = computed(() => submitting.value)
60 +const message = useMessage()
61 +const form = ref<FormPayload>(getClearForm())
62 +const formRef = ref<FormInst | null>(null)
63 +
64 +const validateUrl = (rule: FormItemRule, value: string) => {
65 + if (!value) {
66 + return new Error("Please input a valid Host")
67 + }
68 + if (!isURL(value, { require_tld: false })) {
69 + return new Error("Please input a valid Host")
70 + }
71 +
72 + return true
73 +}
74 +
75 +const rules: FormRules = {
76 + host: {
77 + required: true,
78 + validator: validateUrl,
79 + trigger: "blur"
80 + }
81 +}
82 +
83 +let validationMessage: MessageReactive | null = null
84 +
85 +const isValid = computed(() => {
86 + if (!form.value.host) {
87 + return false
88 + }
89 +
90 + return true
91 +})
92 +
93 +function validate(cb?: () => void) {
94 + if (!formRef.value) return
95 +
96 + formRef.value.validate((errors?: Array<FormValidationError>) => {
97 + if (!errors) {
98 + validationMessage?.destroy()
99 + validationMessage = null
100 + if (cb) cb()
101 + } else {
102 + if (!validationMessage) {
103 + validationMessage = message.warning("You must fill in the required fields correctly.")
104 + }
105 + return false
106 + }
107 + })
108 +}
109 +
110 +function getClearForm(): FormPayload {
111 + return {
112 + host: ""
113 + }
114 +}
115 +
116 +function reset() {
117 + if (!loading.value) {
118 + resetForm()
119 + formRef.value?.restoreValidation()
120 + }
121 +}
122 +
123 +function resetForm() {
124 + form.value = getClearForm()
125 +}
126 +
127 +function submit() {
128 + submitting.value = true
129 +
130 + const payload: ScanHostPayload = {
131 + ...form.value
132 + }
133 +
134 + Api.webVulnerabilityAssessment
135 + .scan(payload)
136 + .then(res => {
137 + if (res.data.success) {
138 + message.success(
139 + res.data?.message ||
140 + `Scan started for ${payload.host}. This will take some time to complete, but check back in soon.`,
141 + {
142 + duration: 10 * 1000
143 + }
144 + )
145 + emit("submitted")
146 + resetForm()
147 + } else {
148 + message.warning(res.data?.message || "An error occurred. Please try again later.")
149 + }
150 + })
151 + .catch(err => {
152 + message.error(err.response?.data?.message || "An error occurred. Please try again later.")
153 + })
154 + .finally(() => {
155 + submitting.value = false
156 + })
157 +}
158 +
159 +onMounted(() => {
160 + emit("mounted", {
161 + reset
162 + })
163 +})
164 +</script>
frontend/src/components/webVulnerabilityAssessment/WebVulnerabilityAssessmentButton.vue new
+26
@@ -0,0 +1,26 @@
1 +<template>
2 + <n-button :size="size" :type="type" @click="gotoPage()">
3 + <template #icon><Icon :name="VulnerabilityIcon" :size="16"></Icon></template>
4 + Web Vulnerability Assessment
5 + </n-button>
6 +</template>
7 +
8 +<script setup lang="ts">
9 +import { NButton } from "naive-ui"
10 +import Icon from "@/components/common/Icon.vue"
11 +import type { Size, Type } from "naive-ui/es/button/src/interface"
12 +import { useRouter } from "vue-router"
13 +
14 +const { type, size } = defineProps<{
15 + size?: Size
16 + type?: Type
17 +}>()
18 +
19 +const VulnerabilityIcon = "bi:radioactive"
20 +
21 +const router = useRouter()
22 +
23 +function gotoPage() {
24 + router.push({ name: "WebVulnerabilityAssessment" })
25 +}
26 +</script>
frontend/src/composables/useGlobalActions.ts
+2 -1
@@ -2,8 +2,9 @@ import { type MessageOptions } from "naive-ui"
2 import type { MessageApiInjection, MessageReactive } from "naive-ui/es/message/src/MessageProvider"
3 import type { NotificationApiInjection, NotificationReactive } from "naive-ui/es/notification/src/NotificationProvider"
4 import type { NotificationOptions } from "naive-ui/es/notification/src/NotificationEnvironment"
5 +import type { Writable } from "type-fest"
6
6 -export type NotificationObject = NotificationOptions
7 +export type NotificationObject = Writable<NotificationOptions>
8
9 interface InitPayload {
10 message: MessageApiInjection
frontend/src/composables/useGoto.ts
+1 -1
@@ -3,7 +3,7 @@ import { useRouter } from "vue-router"
3 export function useGoto() {
4 const router = useRouter()
5
6 - function gotoCustomer(params?: { code?: string | number | { [key: string]: any }; action?: "add-customer" }) {
6 + function gotoCustomer(params?: { code?: string | number; action?: "add-customer" }) {
7 if (params?.code) {
8 router.push({ name: "Customers", query: { code: params.code.toString() } })
9 } else if (params?.action) {
frontend/src/composables/useNotifications.ts
-1
@@ -92,7 +92,6 @@ export function useNotifications() {
92 }
93
94 if (newItem.action) {
95 - // @ts-ignore
95 notify.action = () =>
96 h(
97 NButton,
frontend/src/layouts/common/FooterEL.vue
+1 -1
@@ -36,7 +36,7 @@ const props = defineProps<{
36 boxed: boolean
37 }>()
38 const { boxed } = toRefs(props)
39 -const style = computed<{ [key: string]: any }>(() => useThemeStore().style)
39 +const style = computed(() => useThemeStore().style)
40
41 const year = ref(new Date().getFullYear())
42 </script>
frontend/src/layouts/common/Provider.vue
+1 -1
@@ -37,7 +37,7 @@ const themeStore = useThemeStore()
37
38 const theme = computed(() => themeStore.naiveTheme)
39 const themeOverrides = computed<GlobalThemeOverrides>(() => themeStore.themeOverrides)
40 -const style = computed<CSSStyleDeclaration>(() => themeStore.style)
40 +const style = computed(() => themeStore.style)
41 const themeName = computed<ThemeName>(() => themeStore.themeName)
42
43 watch(
frontend/src/layouts/common/Toolbar/PinnedPages.vue
+19 -10
@@ -1,6 +1,6 @@
1 <template>
2 <div class="flex pinned-pages items-end">
3 - <TransitionGroup name="anim" tag="div" class="latest-list flex items-center gap-4">
3 + <TransitionGroup name="anim" tag="div" class="latest-list flex items-center gap-4 overflow-hidden">
4 <n-tag
5 round
6 :bordered="false"
@@ -9,7 +9,7 @@
9 :key="page.name"
10 @close="removeLatestPage(page.name)"
11 >
12 - <span class="page-name" @click="gotoPage(page.name)">
12 + <span class="page-name" @click="gotoPage(page.name)" :title="page.title">
13 {{ page.title }}
14 </span>
15 <template #icon>
@@ -22,7 +22,7 @@
22
23 <div class="divider" v-if="latestSanitized.length && pinned.length"></div>
24
25 - <TransitionGroup name="anim" tag="div" class="pinned-list flex items-center gap-4">
25 + <TransitionGroup name="anim" tag="div" class="pinned-list flex items-center gap-4 overflow-hidden">
26 <n-tag
27 round
28 :bordered="false"
@@ -31,7 +31,7 @@
31 :key="page.name"
32 @close="removePinnedPage(page.name)"
33 >
34 - <div class="page-name" @click="gotoPage(page.name)">
34 + <div class="page-name" @click="gotoPage(page.name)" :title="page.title">
35 {{ page.title }}
36 </div>
37 </n-tag>
@@ -110,10 +110,13 @@ router.afterEach(route => {
110 <style lang="scss" scoped>
111 .pinned-pages {
112 position: relative;
113 + overflow-x: clip;
114
115 :deep() {
116 .n-tag {
117 background-color: transparent;
118 + flex-shrink: 1;
119 + overflow: hidden;
120
121 &.n-tag--round {
122 padding: 0;
@@ -122,6 +125,10 @@ router.afterEach(route => {
125 .n-tag__icon {
126 margin: 0 !important;
127 }
128 + .n-tag__content {
129 + overflow: hidden;
130 + text-overflow: ellipsis;
131 + }
132 .n-tag__close {
133 overflow: hidden;
134 width: 0px;
@@ -145,12 +152,6 @@ router.afterEach(route => {
152 }
153 }
154
148 - .pinned-list {
149 - .page-name {
150 - color: var(--primary-color);
151 - }
152 - }
153 -
155 .bar {
156 background-color: var(--bg-sidebar);
157 position: absolute;
@@ -177,6 +178,8 @@ router.afterEach(route => {
178 .page-name {
179 cursor: pointer;
180 margin-left: 2px;
181 + overflow: hidden;
182 + text-overflow: ellipsis;
183
184 &:hover {
185 text-decoration: underline;
@@ -194,6 +197,12 @@ router.afterEach(route => {
197 }
198 }
199
200 + .pinned-list {
201 + .page-name {
202 + color: var(--primary-color);
203 + }
204 + }
205 +
206 .anim-move,
207 .anim-enter-active,
208 .anim-leave-active {
frontend/src/layouts/common/Toolbar/Search.vue
+2
@@ -47,6 +47,8 @@ onMounted(() => {
47 border: none;
48
49 .search-command {
50 + white-space: nowrap;
51 +
52 span {
53 line-height: 0;
54 position: relative;
frontend/src/layouts/common/Toolbar/index.vue
+1 -1
@@ -102,7 +102,7 @@ onMounted(() => {
102 gap: 14px;
103 }
104
105 - @media (max-width: 1250px) {
105 + @media (max-width: 950px) {
106 .pinned-pages {
107 display: none;
108 }
frontend/src/router/index.ts
+7 -1
@@ -188,7 +188,13 @@ const router = createRouter({
188 path: "/cloud-security-assessment",
189 name: "CloudSecurityAssessment",
190 component: () => import("@/views/CloudSecurityAssessment.vue"),
191 - meta: { title: "Cloud Security Assessment", auth: true, roles: UserRole.All }
191 + meta: { title: "Cloud Sec. Assess.", auth: true, roles: UserRole.All }
192 + },
193 + {
194 + path: "/web-vulnerability-assessment",
195 + name: "WebVulnerabilityAssessment",
196 + component: () => import("@/views/WebVulnerabilityAssessment.vue"),
197 + meta: { title: "Web Vuln. Assess.", auth: true, roles: UserRole.All }
198 },
199 {
200 path: "/license",
frontend/src/stores/theme.ts
+9 -8
@@ -53,7 +53,7 @@ export const useThemeStore = defineStore("theme", {
53 mobile: 70
54 }
55 }
56 - } as { [key: string]: any },
56 + },
57 toolbarHeight: 80,
58 viewPadding: 40,
59 headerBarHeight: 60,
@@ -98,8 +98,9 @@ export const useThemeStore = defineStore("theme", {
98 for (const k in primaryShades) {
99 const name = k as PrimaryShade
100 const shade = primaryShades[name]
101 - // @ts-ignore
102 - this.colors[theme][colorType + name] = shade
101 + const colorsTheme = this.colors[theme]
102 + const colorKey = (colorType + name) as keyof typeof colorsTheme
103 + this.colors[theme][colorKey] = shade
104 }
105 }
106 },
@@ -128,13 +129,13 @@ export const useThemeStore = defineStore("theme", {
129 },
130 updateVars() {
131 for (const key in this.responsive.override) {
131 - if (_get(this, key) && this.responsive.override[key]) {
132 + if (_get(this, key) && key in this.responsive.override) {
133 _set(
134 this,
135 key,
136 window.innerWidth <= this.responsive.breakpoint
136 - ? this.responsive.override[key].mobile
137 - : this.responsive.override[key].desk
137 + ? this.responsive.override[key as keyof typeof this.responsive.override].mobile
138 + : this.responsive.override[key as keyof typeof this.responsive.override].desk
139 )
140 }
141 }
@@ -280,7 +281,7 @@ export const useThemeStore = defineStore("theme", {
281 naiveCommon(): ThemeCommonVars {
282 return { ...this.naiveTheme.common, ...this.themeOverrides.common }
283 },
283 - style(state): CSSStyleDeclaration {
284 + style(state): { [key: string]: string } {
285 const naive = this.naiveCommon
286
287 const bgColor = naive.baseColor
@@ -450,7 +451,7 @@ export const useThemeStore = defineStore("theme", {
451 "--secondary4-opacity-010-color": `${secondary4Opacity010}`,
452 "--secondary4-opacity-020-color": `${secondary4Opacity020}`,
453 "--secondary4-opacity-030-color": `${secondary4Opacity030}`
453 - } as unknown as CSSStyleDeclaration
454 + }
455 },
456 isThemeDark(state): boolean {
457 return state.themeName === ThemeEnum.Dark
frontend/src/types/artifacts.d.ts
+1 -1
@@ -4,7 +4,7 @@ export interface Artifact {
4 }
5
6 export interface CollectResult {
7 - [key: string]: any
7 + [key: string]: string | number
8 }
9
10 export interface CommandResult {
frontend/src/types/common.d.ts
+1
@@ -1,2 +1,3 @@
1 export type OsTypesFull = "Unknown" | "Windows" | "MacOS" | "UNIX" | "Linux"
2 export type OsTypesLower = "linux" | "windows" | "macos"
3 +export type SafeAny = string | number | object
frontend/src/types/connectors.d.ts
+6 -1
@@ -24,7 +24,12 @@ export interface Connector {
24 authToken?: null
25 roles?: null
26 response?: null
27 - history_logs: any[]
27 + history_logs: {
28 + id: number
29 + connector_id: number
30 + change_timestamp: string | Date
31 + change_description: string
32 + }[]
33 }
34
35 export enum ConnectorFormType {
frontend/src/types/flow.d.ts
+1 -1
@@ -75,7 +75,7 @@ export interface FlowRequestSpecs {
75 }
76
77 export interface CollectResult {
78 - [key: string]: any
78 + [key: string]: string | number
79 }
80
81 export enum IPFamily {
frontend/src/types/graylog/alerts.d.ts
+4 -4
@@ -4,7 +4,7 @@ export interface AlertsQuery {
4 per_page: number
5 filter: {
6 alerts: "only"
7 - event_definitions: any[]
7 + event_definitions: AlertsEventDefinition[]
8 }
9 timerange: {
10 range: number // seconds
@@ -43,10 +43,10 @@ export interface AlertsEvent {
43 event_definition_id: string
44 event_definition_type: string
45 fields: { [key: string]: string }
46 - group_by_fields: any
46 + group_by_fields: object
47 id: string
48 key: null
49 - key_tuple: any[]
49 + key_tuple: string[]
50 message: string
51 origin_context: string
52 priority: number
@@ -71,7 +71,7 @@ export interface AlertsParameters {
71
72 export interface AlertsParametersFilter {
73 alerts: string
74 - event_definitions: any[]
74 + event_definitions: AlertsEventDefinition[]
75 }
76
77 export interface AlertsParametersTimerange {
frontend/src/types/graylog/event-definition.d.ts
+10 -4
@@ -4,7 +4,7 @@ export interface EventDefinition {
4 description: string
5 field_spec: { [key: string]: EventDefinitionFieldSpec }
6 id: string
7 - key_spec: any[]
7 + key_spec: string[]
8 notification_settings: {
9 backlog_size: number
10 grace_period_ms: number
@@ -20,11 +20,17 @@ export interface EventDefinitionConfig {
20 expression: string | null
21 }
22 execute_every_ms: number
23 - group_by: any[]
23 + group_by: string[]
24 query: string
25 - query_parameters: any[]
25 + query_parameters: string[]
26 search_within_ms: number
27 - series: any[]
27 + series:
28 + | string
29 + | {
30 + type: string
31 + id: string
32 + field: string
33 + }[]
34 streams: string[]
35 type: string
36 }
frontend/src/types/reporting.d.ts
+3 -3
@@ -25,10 +25,10 @@ export interface Panel {
25 defaults: {
26 color: string
27 custom: string
28 - mappings: any[]
28 + mappings: object[]
29 thresholds: string
30 }
31 - overrides: any[]
31 + overrides: object[]
32 }
33 gridPos: null | {
34 h: number
@@ -37,7 +37,7 @@ export interface Panel {
37 y: number
38 }
39 id: number
40 - options: null | { legend: any; tooltip: any }
40 + options: null | { legend: object; tooltip: object }
41 title: string
42 type: null | string
43 collapsed: null | boolean
frontend/src/types/soc/alert.d.ts
+6 -6
@@ -20,12 +20,12 @@ export interface SocAlert {
20 alert_tags: null | string
21 alert_title: string
22 alert_uuid: string
23 - assets: any[]
24 - cases: any[]
23 + assets: object[]
24 + cases: (string | number)[]
25 classification: string | null
26 - comments: any[]
26 + comments: object[]
27 customer: Customer
28 - iocs: any[]
28 + iocs: object[]
29 modification_history: { [key: string]: ModificationHistory }
30 owner: Owner | null
31 resolution_status: string | null
@@ -59,7 +59,7 @@ export enum AlertSource {
59
60 export interface Customer {
61 customer_description: null | string
62 - custom_attributes: { [key: string]: any } | null
62 + custom_attributes: { [key: string]: string | number } | null
63 creation_date: string
64 customer_sla: null | string
65 customer_name: string
@@ -117,7 +117,7 @@ export interface SocAlertCaseResponse {
117 classification_id: number | null
118 close_date: DayFormatted
119 closing_note: string | null
120 - custom_attributes: { [key: string]: any } | null
120 + custom_attributes: { [key: string]: string | number } | null
121 modification_history: { [key: string]: ModificationHistory }
122 open_date: DayFormatted
123 owner_id: number
frontend/src/types/soc/note.d.ts
+2 -2
@@ -5,7 +5,7 @@ export interface SocNote {
5 }
6
7 export interface NoteDetails {
8 - custom_attributes: { [key: string]: any }
8 + custom_attributes: { [key: string]: string | number }
9 group_id: number
10 group_title: string
11 group_uuid: string
@@ -18,7 +18,7 @@ export interface NoteDetails {
18 }
19
20 export interface SocNewNote {
21 - custom_attributes: { [key: string]: any }
21 + custom_attributes: { [key: string]: string | number }
22 note_content: string
23 note_creationdate: string | Date
24 note_id: number
frontend/src/types/webVulnerabilityAssessment.d.ts new
+5
@@ -0,0 +1,5 @@
1 +export type NucleiReport = string
2 +
3 +export interface ScanHostPayload {
4 + host: string
5 +}
frontend/src/utils/highlighter.ts
+2 -1
@@ -18,7 +18,8 @@ export async function getHighlighter() {
18 import("shiki/langs/html.mjs"),
19 import("shiki/langs/scss.mjs"),
20 import("shiki/langs/css.mjs"),
21 - import("shiki/langs/csharp.mjs")
21 + import("shiki/langs/csharp.mjs"),
22 + import("shiki/langs/http.mjs")
23 ],
24 loadWasm: getWasm
25 })
frontend/src/utils/theme.ts
+1 -1
@@ -52,7 +52,7 @@ export function exportPrimaryShades(color: string): { [key: string]: string } {
52 }
53 }
54
55 -export function getTypeValue(origin: any, val: string) {
55 +export function getTypeValue(origin: object, val: string) {
56 if (val && val.indexOf("{") === 0) {
57 const path = val.replace("{", "").replace("}", "")
58 return _get(origin, path)
frontend/src/views/Overview.vue
+8 -5
@@ -1,15 +1,16 @@
1 <template>
2 <div class="page" ref="page">
3 - <div class="section justify-end md:justify-between flex gap-3">
4 - <div class="left-box hidden md:flex gap-3">
3 + <div class="section justify-end lg:justify-between flex gap-3">
4 + <div class="left-box hidden lg:flex gap-3">
5 <StackProvisioningButton size="small" type="primary" />
6 <CloudSecurityAssessmentButton size="small" type="primary" />
7 + <WebVulnerabilityAssessmentButton size="small" type="primary" />
8 </div>
8 - <div class="right-box hidden md:flex gap-3">
9 + <div class="right-box hidden lg:flex gap-3">
10 <ActiveResponseWizardButton size="small" type="primary" />
11 <ThreatIntelButton size="small" type="primary" />
12 </div>
12 - <div class="mobile-box block md:hidden">
13 + <div class="mobile-box block lg:hidden">
14 <n-button size="small" type="primary" @click="showQuickActions = true">
15 <template #icon><Icon :name="QuickActionsIcon"></Icon></template>
16 Quick Actions
@@ -55,7 +56,7 @@
56
57 <n-drawer
58 v-model:show="showQuickActions"
58 - :width="290"
59 + :width="300"
60 style="max-width: 90vw"
61 :trap-focus="false"
62 display-directive="show"
@@ -64,6 +65,7 @@
65 <div class="flex flex-col gap-3">
66 <StackProvisioningButton size="small" type="primary" />
67 <CloudSecurityAssessmentButton size="small" type="primary" />
68 + <WebVulnerabilityAssessmentButton size="small" type="primary" />
69 <ActiveResponseWizardButton size="small" type="primary" />
70 <ThreatIntelButton size="small" type="primary" />
71 </div>
@@ -82,6 +84,7 @@ import ThreatIntelButton from "@/components/alerts/ThreatIntelButton.vue"
84 import ActiveResponseWizardButton from "@/components/activeResponse/ActiveResponseWizardButton.vue"
85 import StackProvisioningButton from "@/components/stackProvisioning/StackProvisioningButton.vue"
86 import CloudSecurityAssessmentButton from "@/components/cloudSecurityAssessment/CloudSecurityAssessmentButton.vue"
87 +import WebVulnerabilityAssessmentButton from "@/components/webVulnerabilityAssessment/WebVulnerabilityAssessmentButton.vue"
88 import AgentsCard from "@/components/overview/AgentsCard.vue"
89 import HealthcheckCard from "@/components/overview/HealthcheckCard.vue"
90 // import SocAlertsCard from "@/components/overview/SocAlertsCard.vue"
frontend/src/views/WebVulnerabilityAssessment.vue new
+9
@@ -0,0 +1,9 @@
1 +<template>
2 + <div class="page">
3 + <ReportsList />
4 + </div>
5 +</template>
6 +
7 +<script setup lang="ts">
8 +import ReportsList from "@/components/webVulnerabilityAssessment/ReportsList.vue"
9 +</script>
frontend/tsconfig.app.json
-1
@@ -5,7 +5,6 @@
5 "compilerOptions": {
6 "composite": true,
7 "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
8 -
8 "baseUrl": ".",
9 "types": ["node", "naive-ui/volar"],
10 "moduleResolution": "node",
frontend/tsconfig.node.json
-1
@@ -5,7 +5,6 @@
5 "composite": true,
6 "noEmit": true,
7 "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo",
8 -
8 "module": "ESNext",
9 "moduleResolution": "Bundler",
10 "types": ["node"]
frontend/tsconfig.vitest.json
-1
@@ -4,7 +4,6 @@
4 "compilerOptions": {
5 "composite": true,
6 "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.vitest.tsbuildinfo",
7 -
7 "lib": [],
8 "types": ["node", "jsdom"],
9 "allowImportingTsExtensions": true
frontend/vite.config.ts
+2 -2
@@ -18,8 +18,8 @@ export default defineConfig(({ mode }) => {
18 plugins: [
19 vue({
20 script: {
21 - defineModel: true
22 - // propsDestructure: true
21 + defineModel: true,
22 + propsDestructure: false
23 }
24 }),
25 vueJsx(),