diff --git a/backend/app/routers/threat_intel.py b/backend/app/routers/threat_intel.py index 61633ce7..3d0d117f 100644 --- a/backend/app/routers/threat_intel.py +++ b/backend/app/routers/threat_intel.py @@ -1,5 +1,6 @@ from fastapi import APIRouter +from app.threat_intel.routes.epss import threat_intel_epss_router from app.threat_intel.routes.socfortress import threat_intel_socfortress_router # Instantiate the APIRouter @@ -11,3 +12,9 @@ prefix="/threat_intel", tags=["Threat Intel"], ) + +router.include_router( + threat_intel_epss_router, + prefix="/threat_intel", + tags=["Threat Intel"], +) diff --git a/backend/app/threat_intel/routes/epss.py b/backend/app/threat_intel/routes/epss.py new file mode 100644 index 00000000..98cc999b --- /dev/null +++ b/backend/app/threat_intel/routes/epss.py @@ -0,0 +1,38 @@ +from fastapi import APIRouter +from fastapi import Security +from loguru import logger + +from app.auth.utils import AuthHandler +from app.threat_intel.schema.epss import EpssThreatIntelRequest +from app.threat_intel.schema.epss import EpssThreatIntelResponse +from app.threat_intel.services.epss import collect_epss_score + +# App specific imports + +threat_intel_epss_router = APIRouter() + + +@threat_intel_epss_router.post( + "/epss", + response_model=EpssThreatIntelResponse, + description="Threat Intel EPSS Score", + dependencies=[Security(AuthHandler().require_any_scope("admin", "analyst"))], +) +async def threat_intel_epss( + request: EpssThreatIntelRequest, +): + """ + Endpoint for SocFortress Threat Intel. + + This endpoint allows authorized users with 'admin' or 'analyst' scope to perform SocFortress threat intelligence lookup. + + Parameters: + - request: SocfortressThreatIntelRequest - The request payload containing the necessary information for the lookup. + - session: AsyncSession (optional) - The database session to use for the lookup. + - _key_exists: bool (optional) - A dependency to ensure the API key exists. + + Returns: + - IoCResponse: The response model containing the results of the SocFortress threat intelligence lookup. + """ + logger.info(f"Received request for EPSS score: {request}") + return await collect_epss_score(request) diff --git a/backend/app/threat_intel/schema/epss.py b/backend/app/threat_intel/schema/epss.py new file mode 100644 index 00000000..88b12dd4 --- /dev/null +++ b/backend/app/threat_intel/schema/epss.py @@ -0,0 +1,44 @@ +from typing import List +from typing import Optional + +from pydantic import BaseModel +from pydantic import Field + + +class EpssThreatIntelRequest(BaseModel): + cve: str = Field( + ..., + description="The CVE to evaluate.", + ) + + +class EpssData(BaseModel): + cve: str + epss: str + percentile: str + date: str + + +class EpssApiResponse(BaseModel): + status: str + status_code: int + version: str + access_control_allow_headers: Optional[str] + access: str + total: int + offset: int + limit: int + data: List[EpssData] + + def to_dict(self): + return self.dict() + + +class EpssThreatIntelResponse(BaseModel): + data: Optional[List[EpssData]] = Field(None, description="The data for the IoC") + success: bool = Field(..., description="Indicates if it was successful") + message: str = Field(None, description="Message about the IoC") + the_epss_model: str = Field( + "https://www.first.org/epss/model", + description="The EPSS model description", + ) diff --git a/backend/app/threat_intel/services/epss.py b/backend/app/threat_intel/services/epss.py new file mode 100644 index 00000000..23996623 --- /dev/null +++ b/backend/app/threat_intel/services/epss.py @@ -0,0 +1,62 @@ +import httpx +from fastapi import HTTPException +from loguru import logger + +from app.threat_intel.schema.epss import EpssData +from app.threat_intel.schema.epss import EpssThreatIntelRequest +from app.threat_intel.schema.epss import EpssThreatIntelResponse + + +async def invoke_epss_api( + url: str, + request: EpssThreatIntelRequest, +) -> dict: + """ + Invokes the Socfortress Process Analysis API with the provided API key, URL, and request parameters. + + Args: + api_key (str): The API key for authentication. + url (str): The URL of the Socfortress Intel URL + request (SocfortressProcessNameAnalysisRequest): The request object containing the Process Name + + Returns: + dict: The JSON response from the Process Name Analysis API. + + Raises: + httpx.HTTPStatusError: If the API request fails with a non-successful status code. + """ + headers = {"content-type": "application/json"} + params = {"cve": f"{request.cve}"} + logger.info(f"Invoking EPSS with params: {params} and headers: {headers} and url: {url}") + async with httpx.AsyncClient() as client: + response = await client.get(url, headers=headers, params=params) + return response.json() + + +async def collect_epss_score( + request: EpssThreatIntelRequest, +) -> EpssThreatIntelResponse: + """ + Retrieves IoC response from Socfortress Threat Intel API. + + Args: + request (SocfortressProcessNameAnalysisRequest): The request object containing the IoC data. + session (AsyncSession): The async session object for making HTTP requests. + + Returns: + SocfortressProcessNameAnalysisResponse: The response object containing the IoC data and success status. + """ + url = "https://api.first.org/data/v1/epss" + response_data = await invoke_epss_api(url, request) + + # If status-code is not 200, raise an HTTPException + if response_data.get("status-code") != 200: + raise HTTPException( + status_code=500, + detail="Failed to retrieve EPSS score", + ) + + # Using .get() with default values + data = [EpssData(**item) for item in response_data.get("data", [])] + + return EpssThreatIntelResponse(data=data, success=True, message="EPSS score retrieved successfully") diff --git a/backend/app/threat_intel/services/socfortress.py b/backend/app/threat_intel/services/socfortress.py index b000db12..dd6cf085 100644 --- a/backend/app/threat_intel/services/socfortress.py +++ b/backend/app/threat_intel/services/socfortress.py @@ -227,7 +227,6 @@ async def get_process_analysis_response( # Using .get() with default values data = response_data.get("data", {}) - logger.info(f"Data {data}") success = response_data.get("success", False) message = response_data.get("message", "No message provided") diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 10c8191d..4268a079 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -14,19 +14,19 @@ "@fontsource/lexend": "^5.0.20", "@fontsource/public-sans": "^5.0.18", "@popperjs/core": "^2.11.8", - "@shikijs/markdown-it": "^1.9.0", + "@shikijs/markdown-it": "^1.9.1", "@vueuse/components": "^10.11.0", "@vueuse/core": "^10.11.0", - "apexcharts": "^3.49.1", + "apexcharts": "^3.49.2", "bytes": "^3.1.2", "colord": "^2.9.3", "crypto-js": "^4.2.0", "dayjs": "^1.11.11", "detect-touch-device": "^1.1.6", - "echarts": "^5.5.0", + "echarts": "^5.5.1", "file-saver": "^2.0.5", "html-entities": "^2.5.2", - "jose": "^5.4.1", + "jose": "^5.6.2", "js-md5": "^0.8.3", "lodash": "^4.17.21", "mitt": "^3.0.1", @@ -35,9 +35,9 @@ "pinia": "^2.1.7", "pinia-plugin-persistedstate": "^3.2.1", "secure-ls": "^2.0.0", - "shiki": "^1.9.0", + "shiki": "^1.9.1", "validator": "^13.12.0", - "vue": "^3.4.30", + "vue": "^3.4.31", "vue-advanced-cropper": "^2.8.9", "vue-highlight-words": "^3.0.1", "vue-i18n": "^9.13.1", @@ -56,8 +56,8 @@ "@types/fs-extra": "^11.0.4", "@types/inquirer": "^9.0.7", "@types/jsdom": "^21.1.7", - "@types/lodash": "^4.17.5", - "@types/node": "^20.14.8", + "@types/lodash": "^4.17.6", + "@types/node": "^20.14.9", "@types/validator": "^13.12.0", "@vitejs/plugin-vue": "^5.0.5", "@vitejs/plugin-vue-jsx": "^4.0.0", @@ -83,10 +83,10 @@ "start-server-and-test": "^2.0.4", "tailwind-config-viewer": "^2.0.4", "tailwindcss": "^3.4.4", - "taze": "^0.13.8", + "taze": "^0.13.9", "type-fest": "^4.20.1", - "unplugin-vue-components": "^0.27.0", - "vite": "^5.3.1", + "unplugin-vue-components": "^0.27.2", + "vite": "^5.3.2", "vite-bundle-analyzer": "^0.10.3", "vite-bundle-visualizer": "^1.2.1", "vite-plugin-vue-devtools": "^7.3.4", @@ -150,9 +150,9 @@ } }, "node_modules/@antfu/utils": { - "version": "0.7.8", - "resolved": "https://registry.npmjs.org/@antfu/utils/-/utils-0.7.8.tgz", - "integrity": "sha512-rWQkqXRESdjXtc+7NRfK9lASQjpXJu1ayp7qi1d23zZorY+wBHVLHHoVcMsEnkqEBWTFqbztO7/QdJFzyEcLTg==", + "version": "0.7.10", + "resolved": "https://registry.npmjs.org/@antfu/utils/-/utils-0.7.10.tgz", + "integrity": "sha512-+562v9k4aI80m1+VuMHehNJWLOFjBnXn3tdOitzD0il5b7smkSBal4+a3oKiQTbrwMmN/TBUMDvbdoWDehgOww==", "funding": { "url": "https://github.com/sponsors/antfu" } @@ -729,6 +729,7 @@ }, "node_modules/@clack/prompts/node_modules/is-unicode-supported": { "version": "1.3.0", + "dev": true, "inBundle": true, "license": "MIT", "engines": { @@ -1200,9 +1201,9 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.1.tgz", - "integrity": "sha512-Zm2NGpWELsQAD1xsJzGQpYfvICSsFkEpU0jxBjfdC6uNEWXcHnfs9hScFWtXVDVl+rBQJGrl4g1vcKIejpH9dA==", + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.0.tgz", + "integrity": "sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==", "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } @@ -2045,26 +2046,26 @@ ] }, "node_modules/@shikijs/core": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-1.9.0.tgz", - "integrity": "sha512-cbSoY8P/jgGByG8UOl3jnP/CWg/Qk+1q+eAKWtcrU3pNoILF8wTsLB0jT44qUBV8Ce1SvA9uqcM9Xf+u3fJFBw==" + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@shikijs/core/-/core-1.9.1.tgz", + "integrity": "sha512-EmUful2MQtY8KgCF1OkBtOuMcvaZEvmdubhW0UHCGXi21O9dRLeADVCj+k6ZS+de7Mz9d2qixOXJ+GLhcK3pXg==" }, "node_modules/@shikijs/markdown-it": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@shikijs/markdown-it/-/markdown-it-1.9.0.tgz", - "integrity": "sha512-y1DUEL0wf0UZ30dW1NBx4L9uQs2RN4x5gEZpM7t2/LmMGbJ7d2Hr8mzBlSU9+RWxqSirWX7e6av0tJLhcmd/Hw==", + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@shikijs/markdown-it/-/markdown-it-1.9.1.tgz", + "integrity": "sha512-0f5Lfwx+e6t6lQPZAX2BZxlhzN6aBhB83FfgmC2yegx4Id7YGCsi3/aaipDZT2nityqiNEY+Mmdg2Fr4++EJWg==", "dependencies": { - "@shikijs/transformers": "1.9.0", + "@shikijs/transformers": "1.9.1", "markdown-it": "^14.1.0", - "shiki": "1.9.0" + "shiki": "1.9.1" } }, "node_modules/@shikijs/transformers": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@shikijs/transformers/-/transformers-1.9.0.tgz", - "integrity": "sha512-wo8dNbZtFtVhKtw8BnXIT/FDTGMwEdWcQSIRa78ou14JGkMYxSCBN942W5+IRUifP5BwVUWgkXBYX/M3FUFkeg==", + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@shikijs/transformers/-/transformers-1.9.1.tgz", + "integrity": "sha512-wPrGTpBURQ95IKPIhPQE3bGsANpPPtea1+aVHZp0aYtgxfL5UM3QbJ5rNdCuhcyjz/JNp5ZvSItOr+ayJxebJQ==", "dependencies": { - "shiki": "1.9.0" + "shiki": "1.9.1" } }, "node_modules/@sideway/address": { @@ -2178,9 +2179,9 @@ "integrity": "sha512-HMwFiRujE5PjrgwHQ25+bsLJgowjGjm5Z8FVSf0N6PwgJrwxH0QxzHYDcKsTfV3wva0vzrpqMTJS2jXPr5BMEQ==" }, "node_modules/@types/lodash": { - "version": "4.17.5", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.5.tgz", - "integrity": "sha512-MBIOHVZqVqgfro1euRDWX7OO0fBVUUMrN6Pwm8LQsz8cWhEpihlvR70ENj3f40j58TNxZaWv2ndSkInykNBBJw==" + "version": "4.17.6", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.6.tgz", + "integrity": "sha512-OpXEVoCKSS3lQqjx9GGGOapBeuW5eUboYHRlHP9urXPX25IKZ6AnP5ZRxtVf63iieUbsHxLn8NQ5Nlftc6yzAA==" }, "node_modules/@types/lodash-es": { "version": "4.17.12", @@ -2191,9 +2192,9 @@ } }, "node_modules/@types/node": { - "version": "20.14.8", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.8.tgz", - "integrity": "sha512-DO+2/jZinXfROG7j7WKFn/3C6nFwxy2lLpgLjEXJz+0XKphZlTLJ14mo8Vfg8X5BWN6XjyESXq+LcYdT7tR3bA==", + "version": "20.14.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.9.tgz", + "integrity": "sha512-06OCtnTXtWOZBJlRApleWndH4JsRVs1pDCc8dLSQp+7PpUpX3ePdHyeNSFTeSe7FtKyQkrlPvHwJOW3SLd8Oyg==", "dev": true, "dependencies": { "undici-types": "~5.26.4" @@ -2253,16 +2254,16 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.13.0.tgz", - "integrity": "sha512-FX1X6AF0w8MdVFLSdqwqN/me2hyhuQg4ykN6ZpVhh1ij/80pTvDKclX1sZB9iqex8SjQfVhwMKs3JtnnMLzG9w==", + "version": "7.14.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.14.1.tgz", + "integrity": "sha512-aAJd6bIf2vvQRjUG3ZkNXkmBpN+J7Wd0mfQiiVCJMu9Z5GcZZdcc0j8XwN/BM97Fl7e3SkTXODSk4VehUv7CGw==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "7.13.0", - "@typescript-eslint/type-utils": "7.13.0", - "@typescript-eslint/utils": "7.13.0", - "@typescript-eslint/visitor-keys": "7.13.0", + "@typescript-eslint/scope-manager": "7.14.1", + "@typescript-eslint/type-utils": "7.14.1", + "@typescript-eslint/utils": "7.14.1", + "@typescript-eslint/visitor-keys": "7.14.1", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", @@ -2286,13 +2287,13 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.13.0.tgz", - "integrity": "sha512-ZrMCe1R6a01T94ilV13egvcnvVJ1pxShkE0+NDjDzH4nvG1wXpwsVI5bZCvE7AEDH1mXEx5tJSVR68bLgG7Dng==", + "version": "7.14.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.14.1.tgz", + "integrity": "sha512-gPrFSsoYcsffYXTOZ+hT7fyJr95rdVe4kGVX1ps/dJ+DfmlnjFN/GcMxXcVkeHDKqsq6uAcVaQaIi3cFffmAbA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.13.0", - "@typescript-eslint/visitor-keys": "7.13.0" + "@typescript-eslint/types": "7.14.1", + "@typescript-eslint/visitor-keys": "7.14.1" }, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -2303,9 +2304,9 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.13.0.tgz", - "integrity": "sha512-QWuwm9wcGMAuTsxP+qz6LBBd3Uq8I5Nv8xb0mk54jmNoCyDspnMvVsOxI6IsMmway5d1S9Su2+sCKv1st2l6eA==", + "version": "7.14.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.14.1.tgz", + "integrity": "sha512-mL7zNEOQybo5R3AavY+Am7KLv8BorIv7HCYS5rKoNZKQD9tsfGUpO4KdAn3sSUvTiS4PQkr2+K0KJbxj8H9NDg==", "dev": true, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -2316,13 +2317,13 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/typescript-estree": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.13.0.tgz", - "integrity": "sha512-cAvBvUoobaoIcoqox1YatXOnSl3gx92rCZoMRPzMNisDiM12siGilSM4+dJAekuuHTibI2hVC2fYK79iSFvWjw==", + "version": "7.14.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.14.1.tgz", + "integrity": "sha512-k5d0VuxViE2ulIO6FbxxSZaxqDVUyMbXcidC8rHvii0I56XZPv8cq+EhMns+d/EVIL41sMXqRbK3D10Oza1bbA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.13.0", - "@typescript-eslint/visitor-keys": "7.13.0", + "@typescript-eslint/types": "7.14.1", + "@typescript-eslint/visitor-keys": "7.14.1", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -2344,15 +2345,15 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.13.0.tgz", - "integrity": "sha512-jceD8RgdKORVnB4Y6BqasfIkFhl4pajB1wVxrF4akxD2QPM8GNYjgGwEzYS+437ewlqqrg7Dw+6dhdpjMpeBFQ==", + "version": "7.14.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.14.1.tgz", + "integrity": "sha512-CMmVVELns3nak3cpJhZosDkm63n+DwBlDX8g0k4QUa9BMnF+lH2lr3d130M1Zt1xxmB3LLk3NV7KQCq86ZBBhQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "7.13.0", - "@typescript-eslint/types": "7.13.0", - "@typescript-eslint/typescript-estree": "7.13.0" + "@typescript-eslint/scope-manager": "7.14.1", + "@typescript-eslint/types": "7.14.1", + "@typescript-eslint/typescript-estree": "7.14.1" }, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -2366,12 +2367,12 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.13.0.tgz", - "integrity": "sha512-nxn+dozQx+MK61nn/JP+M4eCkHDSxSLDpgE3WcQo0+fkjEolnaB5jswvIKC4K56By8MMgIho7f1PVxERHEo8rw==", + "version": "7.14.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.14.1.tgz", + "integrity": "sha512-Crb+F75U1JAEtBeQGxSKwI60hZmmzaqA3z9sYsVm8X7W5cwLEm5bRe0/uXS6+MR/y8CVpKSR/ontIAIEPFcEkA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.13.0", + "@typescript-eslint/types": "7.14.1", "eslint-visitor-keys": "^3.4.3" }, "engines": { @@ -2383,9 +2384,9 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/minimatch": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", - "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, "dependencies": { "brace-expansion": "^2.0.1" @@ -2398,15 +2399,15 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.13.0.tgz", - "integrity": "sha512-EjMfl69KOS9awXXe83iRN7oIEXy9yYdqWfqdrFAYAAr6syP8eLEFI7ZE4939antx2mNgPRW/o1ybm2SFYkbTVA==", + "version": "7.14.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.14.1.tgz", + "integrity": "sha512-8lKUOebNLcR0D7RvlcloOacTOWzOqemWEWkKSVpMZVF/XVcwjPR+3MD08QzbW9TCGJ+DwIc6zUSGZ9vd8cO1IA==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "7.13.0", - "@typescript-eslint/types": "7.13.0", - "@typescript-eslint/typescript-estree": "7.13.0", - "@typescript-eslint/visitor-keys": "7.13.0", + "@typescript-eslint/scope-manager": "7.14.1", + "@typescript-eslint/types": "7.14.1", + "@typescript-eslint/typescript-estree": "7.14.1", + "@typescript-eslint/visitor-keys": "7.14.1", "debug": "^4.3.4" }, "engines": { @@ -2426,13 +2427,13 @@ } }, "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/scope-manager": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.13.0.tgz", - "integrity": "sha512-ZrMCe1R6a01T94ilV13egvcnvVJ1pxShkE0+NDjDzH4nvG1wXpwsVI5bZCvE7AEDH1mXEx5tJSVR68bLgG7Dng==", + "version": "7.14.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.14.1.tgz", + "integrity": "sha512-gPrFSsoYcsffYXTOZ+hT7fyJr95rdVe4kGVX1ps/dJ+DfmlnjFN/GcMxXcVkeHDKqsq6uAcVaQaIi3cFffmAbA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.13.0", - "@typescript-eslint/visitor-keys": "7.13.0" + "@typescript-eslint/types": "7.14.1", + "@typescript-eslint/visitor-keys": "7.14.1" }, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -2443,9 +2444,9 @@ } }, "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.13.0.tgz", - "integrity": "sha512-QWuwm9wcGMAuTsxP+qz6LBBd3Uq8I5Nv8xb0mk54jmNoCyDspnMvVsOxI6IsMmway5d1S9Su2+sCKv1st2l6eA==", + "version": "7.14.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.14.1.tgz", + "integrity": "sha512-mL7zNEOQybo5R3AavY+Am7KLv8BorIv7HCYS5rKoNZKQD9tsfGUpO4KdAn3sSUvTiS4PQkr2+K0KJbxj8H9NDg==", "dev": true, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -2456,13 +2457,13 @@ } }, "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.13.0.tgz", - "integrity": "sha512-cAvBvUoobaoIcoqox1YatXOnSl3gx92rCZoMRPzMNisDiM12siGilSM4+dJAekuuHTibI2hVC2fYK79iSFvWjw==", + "version": "7.14.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.14.1.tgz", + "integrity": "sha512-k5d0VuxViE2ulIO6FbxxSZaxqDVUyMbXcidC8rHvii0I56XZPv8cq+EhMns+d/EVIL41sMXqRbK3D10Oza1bbA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.13.0", - "@typescript-eslint/visitor-keys": "7.13.0", + "@typescript-eslint/types": "7.14.1", + "@typescript-eslint/visitor-keys": "7.14.1", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -2484,12 +2485,12 @@ } }, "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/visitor-keys": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.13.0.tgz", - "integrity": "sha512-nxn+dozQx+MK61nn/JP+M4eCkHDSxSLDpgE3WcQo0+fkjEolnaB5jswvIKC4K56By8MMgIho7f1PVxERHEo8rw==", + "version": "7.14.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.14.1.tgz", + "integrity": "sha512-Crb+F75U1JAEtBeQGxSKwI60hZmmzaqA3z9sYsVm8X7W5cwLEm5bRe0/uXS6+MR/y8CVpKSR/ontIAIEPFcEkA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.13.0", + "@typescript-eslint/types": "7.14.1", "eslint-visitor-keys": "^3.4.3" }, "engines": { @@ -2501,9 +2502,9 @@ } }, "node_modules/@typescript-eslint/parser/node_modules/minimatch": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", - "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, "dependencies": { "brace-expansion": "^2.0.1" @@ -2532,13 +2533,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.13.0.tgz", - "integrity": "sha512-xMEtMzxq9eRkZy48XuxlBFzpVMDurUAfDu5Rz16GouAtXm0TaAoTFzqWUFPPuQYXI/CDaH/Bgx/fk/84t/Bc9A==", + "version": "7.14.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.14.1.tgz", + "integrity": "sha512-/MzmgNd3nnbDbOi3LfasXWWe292+iuo+umJ0bCCMCPc1jLO/z2BQmWUUUXvXLbrQey/JgzdF/OV+I5bzEGwJkQ==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "7.13.0", - "@typescript-eslint/utils": "7.13.0", + "@typescript-eslint/typescript-estree": "7.14.1", + "@typescript-eslint/utils": "7.14.1", "debug": "^4.3.4", "ts-api-utils": "^1.3.0" }, @@ -2559,13 +2560,13 @@ } }, "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/scope-manager": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.13.0.tgz", - "integrity": "sha512-ZrMCe1R6a01T94ilV13egvcnvVJ1pxShkE0+NDjDzH4nvG1wXpwsVI5bZCvE7AEDH1mXEx5tJSVR68bLgG7Dng==", + "version": "7.14.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.14.1.tgz", + "integrity": "sha512-gPrFSsoYcsffYXTOZ+hT7fyJr95rdVe4kGVX1ps/dJ+DfmlnjFN/GcMxXcVkeHDKqsq6uAcVaQaIi3cFffmAbA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.13.0", - "@typescript-eslint/visitor-keys": "7.13.0" + "@typescript-eslint/types": "7.14.1", + "@typescript-eslint/visitor-keys": "7.14.1" }, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -2576,9 +2577,9 @@ } }, "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.13.0.tgz", - "integrity": "sha512-QWuwm9wcGMAuTsxP+qz6LBBd3Uq8I5Nv8xb0mk54jmNoCyDspnMvVsOxI6IsMmway5d1S9Su2+sCKv1st2l6eA==", + "version": "7.14.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.14.1.tgz", + "integrity": "sha512-mL7zNEOQybo5R3AavY+Am7KLv8BorIv7HCYS5rKoNZKQD9tsfGUpO4KdAn3sSUvTiS4PQkr2+K0KJbxj8H9NDg==", "dev": true, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -2589,13 +2590,13 @@ } }, "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.13.0.tgz", - "integrity": "sha512-cAvBvUoobaoIcoqox1YatXOnSl3gx92rCZoMRPzMNisDiM12siGilSM4+dJAekuuHTibI2hVC2fYK79iSFvWjw==", + "version": "7.14.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.14.1.tgz", + "integrity": "sha512-k5d0VuxViE2ulIO6FbxxSZaxqDVUyMbXcidC8rHvii0I56XZPv8cq+EhMns+d/EVIL41sMXqRbK3D10Oza1bbA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.13.0", - "@typescript-eslint/visitor-keys": "7.13.0", + "@typescript-eslint/types": "7.14.1", + "@typescript-eslint/visitor-keys": "7.14.1", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -2617,15 +2618,15 @@ } }, "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/utils": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.13.0.tgz", - "integrity": "sha512-jceD8RgdKORVnB4Y6BqasfIkFhl4pajB1wVxrF4akxD2QPM8GNYjgGwEzYS+437ewlqqrg7Dw+6dhdpjMpeBFQ==", + "version": "7.14.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.14.1.tgz", + "integrity": "sha512-CMmVVELns3nak3cpJhZosDkm63n+DwBlDX8g0k4QUa9BMnF+lH2lr3d130M1Zt1xxmB3LLk3NV7KQCq86ZBBhQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "7.13.0", - "@typescript-eslint/types": "7.13.0", - "@typescript-eslint/typescript-estree": "7.13.0" + "@typescript-eslint/scope-manager": "7.14.1", + "@typescript-eslint/types": "7.14.1", + "@typescript-eslint/typescript-estree": "7.14.1" }, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -2639,12 +2640,12 @@ } }, "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.13.0.tgz", - "integrity": "sha512-nxn+dozQx+MK61nn/JP+M4eCkHDSxSLDpgE3WcQo0+fkjEolnaB5jswvIKC4K56By8MMgIho7f1PVxERHEo8rw==", + "version": "7.14.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.14.1.tgz", + "integrity": "sha512-Crb+F75U1JAEtBeQGxSKwI60hZmmzaqA3z9sYsVm8X7W5cwLEm5bRe0/uXS6+MR/y8CVpKSR/ontIAIEPFcEkA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.13.0", + "@typescript-eslint/types": "7.14.1", "eslint-visitor-keys": "^3.4.3" }, "engines": { @@ -2656,9 +2657,9 @@ } }, "node_modules/@typescript-eslint/type-utils/node_modules/minimatch": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", - "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, "dependencies": { "brace-expansion": "^2.0.1" @@ -2941,27 +2942,27 @@ } }, "node_modules/@volar/language-core": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.3.3.tgz", - "integrity": "sha512-Blu4NQaRszEsgK/QvWFRSQPRAhPDbYef+peFV9Gb86swxRCs01q7h673/HYstaPsTbjh/F5mXjozoOFxQ8tLYw==", + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.3.4.tgz", + "integrity": "sha512-wXBhY11qG6pCDAqDnbBRFIDSIwbqkWI7no+lj5+L7IlA7HRIjRP7YQLGzT0LF4lS6eHkMSsclXqy9DwYJasZTQ==", "dev": true, "dependencies": { - "@volar/source-map": "2.3.3" + "@volar/source-map": "2.3.4" } }, "node_modules/@volar/source-map": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.3.3.tgz", - "integrity": "sha512-eFRHA13hxiGPt+Xa0EX3yNd50ozctnW5KzQj/IllKmSK/KuBEkSAsIhBdOxCpv1YhV4GmI3iKG9peOs6k9LtnA==", + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.3.4.tgz", + "integrity": "sha512-C+t63nwcblqLIVTYXaVi/+gC8NukDaDIQI72J3R7aXGvtgaVB16c+J8Iz7/VfOy7kjYv7lf5GhBny6ACw9fTGQ==", "dev": true }, "node_modules/@volar/typescript": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.3.3.tgz", - "integrity": "sha512-cwGMSwqIR54Hngu5dYmUJPHFpo6KGj7BlpwT2G9WTKwEjFlH4g/0IPeq064428DAi/VMP42vqAQSBiEHi5Gc4A==", + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.3.4.tgz", + "integrity": "sha512-acCvt7dZECyKcvO5geNybmrqOsu9u8n5XP1rfiYsOLYGPxvHRav9BVmEdRyZ3vvY6mNyQ1wLL5Hday4IShe17w==", "dev": true, "dependencies": { - "@volar/language-core": "2.3.3", + "@volar/language-core": "2.3.4", "path-browserify": "^1.0.1", "vscode-uri": "^3.0.8" } @@ -3040,36 +3041,36 @@ } }, "node_modules/@vue/compiler-core": { - "version": "3.4.30", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.30.tgz", - "integrity": "sha512-ZL8y4Xxdh8O6PSwfdZ1IpQ24PjTAieOz3jXb/MDTfDtANcKBMxg1KLm6OX2jofsaQGYfIVzd3BAG22i56/cF1w==", + "version": "3.4.31", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.4.31.tgz", + "integrity": "sha512-skOiodXWTV3DxfDhB4rOf3OGalpITLlgCeOwb+Y9GJpfQ8ErigdBUHomBzvG78JoVE8MJoQsb+qhZiHfKeNeEg==", "dependencies": { "@babel/parser": "^7.24.7", - "@vue/shared": "3.4.30", + "@vue/shared": "3.4.31", "entities": "^4.5.0", "estree-walker": "^2.0.2", "source-map-js": "^1.2.0" } }, "node_modules/@vue/compiler-dom": { - "version": "3.4.30", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.30.tgz", - "integrity": "sha512-+16Sd8lYr5j/owCbr9dowcNfrHd+pz+w2/b5Lt26Oz/kB90C9yNbxQ3bYOvt7rI2bxk0nqda39hVcwDFw85c2Q==", + "version": "3.4.31", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.4.31.tgz", + "integrity": "sha512-wK424WMXsG1IGMyDGyLqB+TbmEBFM78hIsOJ9QwUVLGrcSk0ak6zYty7Pj8ftm7nEtdU/DGQxAXp0/lM/2cEpQ==", "dependencies": { - "@vue/compiler-core": "3.4.30", - "@vue/shared": "3.4.30" + "@vue/compiler-core": "3.4.31", + "@vue/shared": "3.4.31" } }, "node_modules/@vue/compiler-sfc": { - "version": "3.4.30", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.30.tgz", - "integrity": "sha512-8vElKklHn/UY8+FgUFlQrYAPbtiSB2zcgeRKW7HkpSRn/JjMRmZvuOtwDx036D1aqKNSTtXkWRfqx53Qb+HmMg==", + "version": "3.4.31", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.4.31.tgz", + "integrity": "sha512-einJxqEw8IIJxzmnxmJBuK2usI+lJonl53foq+9etB2HAzlPjAS/wa7r0uUpXw5ByX3/0uswVSrjNb17vJm1kQ==", "dependencies": { "@babel/parser": "^7.24.7", - "@vue/compiler-core": "3.4.30", - "@vue/compiler-dom": "3.4.30", - "@vue/compiler-ssr": "3.4.30", - "@vue/shared": "3.4.30", + "@vue/compiler-core": "3.4.31", + "@vue/compiler-dom": "3.4.31", + "@vue/compiler-ssr": "3.4.31", + "@vue/shared": "3.4.31", "estree-walker": "^2.0.2", "magic-string": "^0.30.10", "postcss": "^8.4.38", @@ -3077,12 +3078,12 @@ } }, "node_modules/@vue/compiler-ssr": { - "version": "3.4.30", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.30.tgz", - "integrity": "sha512-ZJ56YZGXJDd6jky4mmM0rNaNP6kIbQu9LTKZDhcpddGe/3QIalB1WHHmZ6iZfFNyj5mSypTa4+qDJa5VIuxMSg==", + "version": "3.4.31", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.4.31.tgz", + "integrity": "sha512-RtefmITAje3fJ8FSg1gwgDhdKhZVntIVbwupdyZDSifZTRMiWxWehAOTCc8/KZDnBOcYQ4/9VWxsTbd3wT0hAA==", "dependencies": { - "@vue/compiler-dom": "3.4.30", - "@vue/shared": "3.4.30" + "@vue/compiler-dom": "3.4.31", + "@vue/shared": "3.4.31" } }, "node_modules/@vue/devtools-api": { @@ -3194,49 +3195,49 @@ } }, "node_modules/@vue/reactivity": { - "version": "3.4.30", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.4.30.tgz", - "integrity": "sha512-bVJurnCe3LS0JII8PPoAA63Zd2MBzcKrEzwdQl92eHCcxtIbxD2fhNwJpa+KkM3Y/A4T5FUnmdhgKwOf6BfbcA==", + "version": "3.4.31", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.4.31.tgz", + "integrity": "sha512-VGkTani8SOoVkZNds1PfJ/T1SlAIOf8E58PGAhIOUDYPC4GAmFA2u/E14TDAFcf3vVDKunc4QqCe/SHr8xC65Q==", "dependencies": { - "@vue/shared": "3.4.30" + "@vue/shared": "3.4.31" } }, "node_modules/@vue/runtime-core": { - "version": "3.4.30", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.4.30.tgz", - "integrity": "sha512-qaFEbnNpGz+tlnkaualomogzN8vBLkgzK55uuWjYXbYn039eOBZrWxyXWq/7qh9Bz2FPifZqGjVDl/FXiq9L2g==", + "version": "3.4.31", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.4.31.tgz", + "integrity": "sha512-LDkztxeUPazxG/p8c5JDDKPfkCDBkkiNLVNf7XZIUnJ+66GVGkP+TIh34+8LtPisZ+HMWl2zqhIw0xN5MwU1cw==", "dependencies": { - "@vue/reactivity": "3.4.30", - "@vue/shared": "3.4.30" + "@vue/reactivity": "3.4.31", + "@vue/shared": "3.4.31" } }, "node_modules/@vue/runtime-dom": { - "version": "3.4.30", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.4.30.tgz", - "integrity": "sha512-tV6B4YiZRj5QsaJgw2THCy5C1H+2UeywO9tqgWEc21tn85qHEERndHN/CxlyXvSBFrpmlexCIdnqPuR9RM9thw==", + "version": "3.4.31", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.4.31.tgz", + "integrity": "sha512-2Auws3mB7+lHhTFCg8E9ZWopA6Q6L455EcU7bzcQ4x6Dn4cCPuqj6S2oBZgN2a8vJRS/LSYYxwFFq2Hlx3Fsaw==", "dependencies": { - "@vue/reactivity": "3.4.30", - "@vue/runtime-core": "3.4.30", - "@vue/shared": "3.4.30", + "@vue/reactivity": "3.4.31", + "@vue/runtime-core": "3.4.31", + "@vue/shared": "3.4.31", "csstype": "^3.1.3" } }, "node_modules/@vue/server-renderer": { - "version": "3.4.30", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.4.30.tgz", - "integrity": "sha512-TBD3eqR1DeDc0cMrXS/vEs/PWzq1uXxnvjoqQuDGFIEHFIwuDTX/KWAQKIBjyMWLFHEeTDGYVsYci85z2UbTDg==", + "version": "3.4.31", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.4.31.tgz", + "integrity": "sha512-D5BLbdvrlR9PE3by9GaUp1gQXlCNadIZytMIb8H2h3FMWJd4oUfkUTEH2wAr3qxoRz25uxbTcbqd3WKlm9EHQA==", "dependencies": { - "@vue/compiler-ssr": "3.4.30", - "@vue/shared": "3.4.30" + "@vue/compiler-ssr": "3.4.31", + "@vue/shared": "3.4.31" }, "peerDependencies": { - "vue": "3.4.30" + "vue": "3.4.31" } }, "node_modules/@vue/shared": { - "version": "3.4.30", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.30.tgz", - "integrity": "sha512-CLg+f8RQCHQnKvuHY9adMsMaQOcqclh6Z5V9TaoMgy0ut0tz848joZ7/CYFFyF/yZ5i2yaw7Fn498C+CNZVHIg==" + "version": "3.4.31", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.4.31.tgz", + "integrity": "sha512-Yp3wtJk//8cO4NItOPpi3QkLExAr/aLBGZMmTtW9WpdwBCJpRM6zj9WgWktXAl8IDIozwNMByT45JP3tO3ACWA==" }, "node_modules/@vue/test-utils": { "version": "2.4.6", @@ -3546,9 +3547,9 @@ } }, "node_modules/apexcharts": { - "version": "3.49.1", - "resolved": "https://registry.npmjs.org/apexcharts/-/apexcharts-3.49.1.tgz", - "integrity": "sha512-MqGtlq/KQuO8j0BBsUJYlRG8VBctKwYdwuBtajHgHTmSgUU3Oai+8oYN/rKCXwXzrUlYA+GiMgotAIbXY2BCGw==", + "version": "3.49.2", + "resolved": "https://registry.npmjs.org/apexcharts/-/apexcharts-3.49.2.tgz", + "integrity": "sha512-vBB8KgwfD9rSObA7s4kY2rU6DeaN67gTR3JN7r32ztgKVf8lKkdFQ6iUhk6oIHrV7W8PoHhr5EwKymn0z5Fz6A==", "dependencies": { "@yr/monotone-cubic-spline": "^1.0.3", "svg.draggable.js": "^2.2.2", @@ -3914,6 +3915,21 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/bundle-require": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/bundle-require/-/bundle-require-5.0.0.tgz", + "integrity": "sha512-GuziW3fSSmopcx4KRymQEJVbZUfqlCqcq7dvs6TYwKRZiegK/2buMxQTPs6MGlNv50wms1699qYO54R8XfRX4w==", + "dev": true, + "dependencies": { + "load-tsconfig": "^0.2.3" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "peerDependencies": { + "esbuild": ">=0.18" + } + }, "node_modules/bytes": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", @@ -4008,9 +4024,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001634", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001634.tgz", - "integrity": "sha512-fbBYXQ9q3+yp1q1gBk86tOFs4pyn/yxFm5ZNP18OXJDfA3txImOY9PhfxVggZ4vRHDqoU8NrKU81eN0OtzOgRA==", + "version": "1.0.30001638", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001638.tgz", + "integrity": "sha512-5SuJUJ7cZnhPpeLHaH0c/HPAnAHZvS6ElWyHK9GSIbVOQABLzowiI2pjmpvZ1WEbkyz46iFd4UXlOHR5SqgfMQ==", "dev": true, "funding": [ { @@ -5067,12 +5083,12 @@ } }, "node_modules/echarts": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/echarts/-/echarts-5.5.0.tgz", - "integrity": "sha512-rNYnNCzqDAPCr4m/fqyUFv7fD9qIsd50S6GDFgO1DxZhncCsNsG7IfUlAlvZe5oSEQxtsjnHiUuppzccry93Xw==", + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/echarts/-/echarts-5.5.1.tgz", + "integrity": "sha512-Fce8upazaAXUVUVsjgV6mBnGuqgO+JNDlcgF79Dksy4+wgGpQB2lmYoO4TSweFg/mZITdpGHomw/cNBJZj1icA==", "dependencies": { "tslib": "2.3.0", - "zrender": "5.5.0" + "zrender": "5.6.0" } }, "node_modules/editorconfig": { @@ -5124,9 +5140,9 @@ "dev": true }, "node_modules/electron-to-chromium": { - "version": "1.4.802", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.802.tgz", - "integrity": "sha512-TnTMUATbgNdPXVSHsxvNVSG0uEd6cSZsANjm8c9HbvflZVVn1yTRcmVXYT1Ma95/ssB/Dcd30AHweH2TE+dNpA==", + "version": "1.4.814", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.814.tgz", + "integrity": "sha512-GVulpHjFu1Y9ZvikvbArHmAhZXtm3wHlpjTMcXNGKl4IQ4jMQjlnz8yMQYYqdLHKi/jEL2+CBC2akWVCoIGUdw==", "dev": true }, "node_modules/emoji-regex": { @@ -5605,11 +5621,11 @@ } }, "node_modules/espree": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.0.1.tgz", - "integrity": "sha512-MWkrWZbJsL2UwnjxTX3gG8FneachS/Mwg7tdGXce011sJd5b0JG54vat5KHnfSBODZ3Wvzd2WnjxyzsRoVv+ww==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.1.0.tgz", + "integrity": "sha512-M1M6CpiE6ffoigIOWYO9UDP8TMUw9kqb21tf+08IgDYjCsOvCuDt4jQcZmoYxx+w7zlKw9/N0KXfto+I8/FrXA==", "dependencies": { - "acorn": "^8.11.3", + "acorn": "^8.12.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^4.0.0" }, @@ -5947,9 +5963,9 @@ } }, "node_modules/foreground-child": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.2.0.tgz", - "integrity": "sha512-CrWQNaEl1/6WeZoarcM9LHupTo3RpZO2Pdk1vktwzPiQTsJnAKJmm3TACKeG5UZbWDfaH2AbvYxzP96y0MT7fA==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.2.1.tgz", + "integrity": "sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==", "dev": true, "dependencies": { "cross-spawn": "^7.0.0", @@ -6129,6 +6145,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/get-tsconfig": { + "version": "4.7.5", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.5.tgz", + "integrity": "sha512-ZCuZCnlqNzjb4QprAzXKdpp/gh6KTxSJuw3IBsPnV/7fV4NxC9ckB+vPTt8w7fJA0TaSD7c55BR47JD6MEDyDw==", + "dev": true, + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, "node_modules/getos": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/getos/-/getos-3.2.1.tgz", @@ -6148,15 +6176,16 @@ } }, "node_modules/glob": { - "version": "10.4.1", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.1.tgz", - "integrity": "sha512-2jelhlq3E4ho74ZyVLN03oKdAZVUa6UDZzFLVH1H7dnoax+y9qyaq8zBkfDIggjniU19z0wU18y16jMB2eyVIw==", + "version": "10.4.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.2.tgz", + "integrity": "sha512-GwMlUF6PkPo3Gk21UxkCohOv0PLcIXVtKyLlpEI28R/cO/4eNOdmLk3CMW1wROV/WR/EsZOWAfBbBOqYvs88/w==", "dev": true, "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { @@ -6181,9 +6210,9 @@ } }, "node_modules/glob/node_modules/minimatch": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", - "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, "dependencies": { "brace-expansion": "^2.0.1" @@ -6494,9 +6523,9 @@ } }, "node_modules/https-proxy-agent": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz", - "integrity": "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==", + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", + "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", "dev": true, "dependencies": { "agent-base": "^7.0.2", @@ -6599,6 +6628,430 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/importx": { + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/importx/-/importx-0.3.7.tgz", + "integrity": "sha512-K2+4GWH3ftMEbwLUK4IVC1qmk5POIofYb+2dHua1Szl5hQexSKv/QfwruTMzROqFWXnPUDJml5CnRiyk1YAesg==", + "dev": true, + "dependencies": { + "bundle-require": "^5.0.0", + "debug": "^4.3.5", + "esbuild": "^0.20.2", + "jiti": "^1.21.6", + "pathe": "^1.1.2", + "pkg-types": "^1.1.1", + "tsx": "^4.15.6" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/importx/node_modules/@esbuild/aix-ppc64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz", + "integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/importx/node_modules/@esbuild/android-arm": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz", + "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/importx/node_modules/@esbuild/android-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz", + "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/importx/node_modules/@esbuild/android-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz", + "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/importx/node_modules/@esbuild/darwin-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz", + "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/importx/node_modules/@esbuild/darwin-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz", + "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/importx/node_modules/@esbuild/freebsd-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz", + "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/importx/node_modules/@esbuild/freebsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz", + "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/importx/node_modules/@esbuild/linux-arm": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz", + "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/importx/node_modules/@esbuild/linux-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz", + "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/importx/node_modules/@esbuild/linux-ia32": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz", + "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/importx/node_modules/@esbuild/linux-loong64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz", + "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/importx/node_modules/@esbuild/linux-mips64el": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz", + "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/importx/node_modules/@esbuild/linux-ppc64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz", + "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/importx/node_modules/@esbuild/linux-riscv64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz", + "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/importx/node_modules/@esbuild/linux-s390x": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz", + "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/importx/node_modules/@esbuild/linux-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz", + "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/importx/node_modules/@esbuild/netbsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz", + "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/importx/node_modules/@esbuild/openbsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz", + "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/importx/node_modules/@esbuild/sunos-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz", + "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/importx/node_modules/@esbuild/win32-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz", + "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/importx/node_modules/@esbuild/win32-ia32": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz", + "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/importx/node_modules/@esbuild/win32-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz", + "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/importx/node_modules/esbuild": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz", + "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.20.2", + "@esbuild/android-arm": "0.20.2", + "@esbuild/android-arm64": "0.20.2", + "@esbuild/android-x64": "0.20.2", + "@esbuild/darwin-arm64": "0.20.2", + "@esbuild/darwin-x64": "0.20.2", + "@esbuild/freebsd-arm64": "0.20.2", + "@esbuild/freebsd-x64": "0.20.2", + "@esbuild/linux-arm": "0.20.2", + "@esbuild/linux-arm64": "0.20.2", + "@esbuild/linux-ia32": "0.20.2", + "@esbuild/linux-loong64": "0.20.2", + "@esbuild/linux-mips64el": "0.20.2", + "@esbuild/linux-ppc64": "0.20.2", + "@esbuild/linux-riscv64": "0.20.2", + "@esbuild/linux-s390x": "0.20.2", + "@esbuild/linux-x64": "0.20.2", + "@esbuild/netbsd-x64": "0.20.2", + "@esbuild/openbsd-x64": "0.20.2", + "@esbuild/sunos-x64": "0.20.2", + "@esbuild/win32-arm64": "0.20.2", + "@esbuild/win32-ia32": "0.20.2", + "@esbuild/win32-x64": "0.20.2" + } + }, "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", @@ -6667,12 +7120,15 @@ } }, "node_modules/is-core-module": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.14.0.tgz", + "integrity": "sha512-a5dFJih5ZLYlRtDc0dZWP7RiKr6xIKzmn/oAYCDvdLThadVgyJwlaoQPmRtMSpz+rk0OGAgIu+TcM9HUF0fk1A==", "dev": true, "dependencies": { - "hasown": "^2.0.0" + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -6899,9 +7355,9 @@ } }, "node_modules/joi": { - "version": "17.13.1", - "resolved": "https://registry.npmjs.org/joi/-/joi-17.13.1.tgz", - "integrity": "sha512-vaBlIKCyo4FCUtCm7Eu4QZd/q02bWcxfUO6YSXAZOWF6gzcLBeba8kwotUdYJjDLW8Cz8RywsSOqiNJZW0mNvg==", + "version": "17.13.3", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.13.3.tgz", + "integrity": "sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==", "dev": true, "dependencies": { "@hapi/hoek": "^9.3.0", @@ -6912,9 +7368,9 @@ } }, "node_modules/jose": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/jose/-/jose-5.4.1.tgz", - "integrity": "sha512-U6QajmpV/nhL9SyfAewo000fkiRQ+Yd2H0lBxJJ9apjpOgkOcBQJWOrMo917lxLptdS/n/o/xPzMkXhF46K8hQ==", + "version": "5.6.2", + "resolved": "https://registry.npmjs.org/jose/-/jose-5.6.2.tgz", + "integrity": "sha512-F1t1/WZJ4JdmCE/XoMYw1dPOW5g8JF0xGm6Ox2fwaCAPlCzt+4Bh0EWP59iQuZNHHauDkCdjx+kCZSh5z/PGow==", "funding": { "url": "https://github.com/sponsors/panva" } @@ -7440,6 +7896,15 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/load-tsconfig": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/load-tsconfig/-/load-tsconfig-0.2.5.tgz", + "integrity": "sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, "node_modules/local-pkg": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.5.0.tgz", @@ -8094,10 +8559,13 @@ } }, "node_modules/object-inspect": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", - "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", + "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", "dev": true, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -8225,6 +8693,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/package-json-from-dist": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", + "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==", + "dev": true + }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -8319,9 +8793,9 @@ } }, "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.2.2", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz", - "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==", + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.3.0.tgz", + "integrity": "sha512-CQl19J/g+Hbjbv4Y3mFNNXFEL/5t/KCg8POCuUqd4rMKjGG+j1ybER83hxV58zL+dFI1PTkt3GNFSHRt+d8qEQ==", "dev": true, "engines": { "node": "14 || >=16.14" @@ -9151,6 +9625,15 @@ "node": ">= 0.6" } }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, "node_modules/restore-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", @@ -9441,11 +9924,11 @@ } }, "node_modules/shiki": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/shiki/-/shiki-1.9.0.tgz", - "integrity": "sha512-i6//Lqgn7+7nZA0qVjoYH0085YdNk4MC+tJV4bo+HgjgRMJ0JmkLZzFAuvVioJqLkcGDK5GAMpghZEZkCnwxpQ==", + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/shiki/-/shiki-1.9.1.tgz", + "integrity": "sha512-8PDkgb5ja3nfujTjvC4VytL6wGOGCtFAClUb2r3QROevYXxcq+/shVJK5s6gy0HZnjaJgFxd6BpPqpRfqne5rA==", "dependencies": { - "@shikijs/core": "1.9.0" + "@shikijs/core": "1.9.1" } }, "node_modules/side-channel": { @@ -10114,9 +10597,9 @@ } }, "node_modules/taze": { - "version": "0.13.8", - "resolved": "https://registry.npmjs.org/taze/-/taze-0.13.8.tgz", - "integrity": "sha512-FaHz2S04VTaAuqfhkA9XXj+GQH4Qq7lhpie0xqE4q8tJTPwHkZki41eKKOpbe2dtHwoIlLLG3MDtoOQwhOnD9A==", + "version": "0.13.9", + "resolved": "https://registry.npmjs.org/taze/-/taze-0.13.9.tgz", + "integrity": "sha512-qBKfViatIEkw7GNlHU8wV28MtRbdrpwxjcZbcqtCi6gHv2X0JAZ9+K8cp4O5UfVjEvFiafw5iSosBlKM7Fb4XA==", "dev": true, "dependencies": { "@antfu/ni": "^0.21.12", @@ -10124,10 +10607,10 @@ "cli-progress": "^3.12.0", "deepmerge": "^4.3.1", "detect-indent": "^7.0.1", - "picocolors": "^1.0.0", + "picocolors": "^1.0.1", "prompts": "^2.4.2", "ufo": "^1.5.3", - "unconfig": "^0.3.13", + "unconfig": "^0.4.4", "yargs": "^17.7.2" }, "bin": { @@ -10137,6 +10620,20 @@ "url": "https://github.com/sponsors/antfu" } }, + "node_modules/taze/node_modules/unconfig": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/unconfig/-/unconfig-0.4.4.tgz", + "integrity": "sha512-Dmz2VZAnx5yxANZ5koy5u6bLd/GJ8dgr0y6/78+40obWIsnvZdTIxLMIx6qBqsabzGTB4yUiMRIOV4hwwVM2pQ==", + "dev": true, + "dependencies": { + "@antfu/utils": "^0.7.8", + "defu": "^6.1.4", + "importx": "^0.3.6" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", @@ -10321,6 +10818,25 @@ "node": ">=0.6.x" } }, + "node_modules/tsx": { + "version": "4.15.7", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.15.7.tgz", + "integrity": "sha512-u3H0iSFDZM3za+VxkZ1kywdCeHCn+8/qHQS1MNoO2sONDgD95HlWtt8aB23OzeTmFP9IU4/8bZUdg58Uu5J4cg==", + "dev": true, + "dependencies": { + "esbuild": "~0.21.4", + "get-tsconfig": "^4.7.5" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, "node_modules/tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", @@ -10385,9 +10901,9 @@ } }, "node_modules/typescript": { - "version": "5.4.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", - "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.2.tgz", + "integrity": "sha512-NcRtPEOsPFFWjobJEtfihkLCZCXZt/os3zf8nTxjVH3RvTSxjrCamJpbExGvYOF+tFHc3pA65qpdwPbzjohhew==", "peer": true, "bin": { "tsc": "bin/tsc", @@ -10452,20 +10968,20 @@ } }, "node_modules/unplugin-vue-components": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/unplugin-vue-components/-/unplugin-vue-components-0.27.0.tgz", - "integrity": "sha512-77eTEy23sQ0UpzGWnZ9I2mY3cnmXwklz4ITcn3JfxjCoX643ghImkiZ4nFm58sxbdVcc4Fo/o4LIoFnlqEqsSg==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/unplugin-vue-components/-/unplugin-vue-components-0.27.2.tgz", + "integrity": "sha512-YifnsmslMRNt+JRQiCG4ZX1+xUQuubUZm76K7Qtg8dmchZJkHIDxZSyfZb5/jqrLWMTm/TUjGJ3ZDlzO6SFnSQ==", "dev": true, "dependencies": { - "@antfu/utils": "^0.7.7", + "@antfu/utils": "^0.7.10", "@rollup/pluginutils": "^5.1.0", "chokidar": "^3.6.0", - "debug": "^4.3.4", + "debug": "^4.3.5", "fast-glob": "^3.3.2", "local-pkg": "^0.5.0", "magic-string": "^0.30.10", - "minimatch": "^9.0.4", - "resolve": "^1.22.8", + "minimatch": "^9.0.5", + "mlly": "^1.7.1", "unplugin": "^1.10.1" }, "engines": { @@ -10489,9 +11005,9 @@ } }, "node_modules/unplugin-vue-components/node_modules/minimatch": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", - "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, "dependencies": { "brace-expansion": "^2.0.1" @@ -10617,9 +11133,9 @@ } }, "node_modules/vite": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.3.1.tgz", - "integrity": "sha512-XBmSKRLXLxiaPYamLv3/hnP/KXDai1NDexN0FpkTaZXTfycHvkRHoenpgl/fvuK/kPbB6xAgoyiryAhQNxYmAQ==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.3.2.tgz", + "integrity": "sha512-6lA7OBHBlXUxiJxbO5aAY2fsHHzDr1q7DvXYnyZycRs2Dz+dXBWuhpWHvmljTRTpQC2uvGmUFFkSHF2vGo90MA==", "dev": true, "dependencies": { "esbuild": "^0.21.3", @@ -11212,15 +11728,15 @@ "dev": true }, "node_modules/vue": { - "version": "3.4.30", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.4.30.tgz", - "integrity": "sha512-NcxtKCwkdf1zPsr7Y8+QlDBCGqxvjLXF2EX+yi76rV5rrz90Y6gK1cq0olIhdWGgrlhs9ElHuhi9t3+W5sG5Xw==", + "version": "3.4.31", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.4.31.tgz", + "integrity": "sha512-njqRrOy7W3YLAlVqSKpBebtZpDVg21FPoaq1I7f/+qqBThK9ChAIjkRWgeP6Eat+8C+iia4P3OYqpATP21BCoQ==", "dependencies": { - "@vue/compiler-dom": "3.4.30", - "@vue/compiler-sfc": "3.4.30", - "@vue/runtime-dom": "3.4.30", - "@vue/server-renderer": "3.4.30", - "@vue/shared": "3.4.30" + "@vue/compiler-dom": "3.4.31", + "@vue/compiler-sfc": "3.4.31", + "@vue/runtime-dom": "3.4.31", + "@vue/server-renderer": "3.4.31", + "@vue/shared": "3.4.31" }, "peerDependencies": { "typescript": "*" @@ -11249,9 +11765,9 @@ } }, "node_modules/vue-component-type-helpers": { - "version": "2.0.21", - "resolved": "https://registry.npmjs.org/vue-component-type-helpers/-/vue-component-type-helpers-2.0.21.tgz", - "integrity": "sha512-3NaicyZ7N4B6cft4bfb7dOnPbE9CjLcx+6wZWAg5zwszfO4qXRh+U52dN5r5ZZfc6iMaxKCEcoH9CmxxoFZHLg==", + "version": "2.0.22", + "resolved": "https://registry.npmjs.org/vue-component-type-helpers/-/vue-component-type-helpers-2.0.22.tgz", + "integrity": "sha512-gPr2Ba7efUwy/Vfbuf735bHSVdN4ycoZUCHfypkI33M9DUH+ieRblLLVM2eImccFYaWNWwEzURx02EgoXDBmaQ==", "dev": true }, "node_modules/vue-eslint-parser": { @@ -11827,9 +12343,9 @@ } }, "node_modules/zrender": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/zrender/-/zrender-5.5.0.tgz", - "integrity": "sha512-O3MilSi/9mwoovx77m6ROZM7sXShR/O/JIanvzTwjN3FORfLSr81PsUGd7jlaYOeds9d8tw82oP44+3YucVo+w==", + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/zrender/-/zrender-5.6.0.tgz", + "integrity": "sha512-uzgraf4njmmHAbEUxMJ8Oxg+P3fT04O+9p7gY+wJRVxo8Ge+KmYv0WJev945EH4wFuc4OY2NLXz46FZrWS9xJg==", "dependencies": { "tslib": "2.3.0" } diff --git a/frontend/package.json b/frontend/package.json index 1b0dc46f..824c06b2 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -36,19 +36,19 @@ "@fontsource/lexend": "^5.0.20", "@fontsource/public-sans": "^5.0.18", "@popperjs/core": "^2.11.8", - "@shikijs/markdown-it": "^1.9.0", + "@shikijs/markdown-it": "^1.9.1", "@vueuse/components": "^10.11.0", "@vueuse/core": "^10.11.0", - "apexcharts": "^3.49.1", + "apexcharts": "^3.49.2", "bytes": "^3.1.2", "colord": "^2.9.3", "crypto-js": "^4.2.0", "dayjs": "^1.11.11", "detect-touch-device": "^1.1.6", - "echarts": "^5.5.0", + "echarts": "^5.5.1", "file-saver": "^2.0.5", "html-entities": "^2.5.2", - "jose": "^5.4.1", + "jose": "^5.6.2", "js-md5": "^0.8.3", "lodash": "^4.17.21", "mitt": "^3.0.1", @@ -57,9 +57,9 @@ "pinia": "^2.1.7", "pinia-plugin-persistedstate": "^3.2.1", "secure-ls": "^2.0.0", - "shiki": "^1.9.0", + "shiki": "^1.9.1", "validator": "^13.12.0", - "vue": "^3.4.30", + "vue": "^3.4.31", "vue-advanced-cropper": "^2.8.9", "vue-highlight-words": "^3.0.1", "vue-i18n": "^9.13.1", @@ -78,8 +78,8 @@ "@types/fs-extra": "^11.0.4", "@types/inquirer": "^9.0.7", "@types/jsdom": "^21.1.7", - "@types/lodash": "^4.17.5", - "@types/node": "^20.14.8", + "@types/lodash": "^4.17.6", + "@types/node": "^20.14.9", "@types/validator": "^13.12.0", "@vitejs/plugin-vue": "^5.0.5", "@vitejs/plugin-vue-jsx": "^4.0.0", @@ -105,10 +105,10 @@ "start-server-and-test": "^2.0.4", "tailwind-config-viewer": "^2.0.4", "tailwindcss": "^3.4.4", - "taze": "^0.13.8", + "taze": "^0.13.9", "type-fest": "^4.20.1", - "unplugin-vue-components": "^0.27.0", - "vite": "^5.3.1", + "unplugin-vue-components": "^0.27.2", + "vite": "^5.3.2", "vite-bundle-analyzer": "^0.10.3", "vite-bundle-visualizer": "^1.2.1", "vite-plugin-vue-devtools": "^7.3.4", diff --git a/frontend/src/api/threatIntel.ts b/frontend/src/api/threatIntel.ts index 062c40fe..3521201a 100644 --- a/frontend/src/api/threatIntel.ts +++ b/frontend/src/api/threatIntel.ts @@ -1,6 +1,6 @@ import { HttpClient } from "./httpClient" import type { FlaskBaseResponse } from "@/types/flask.d" -import type { EvaluationData, ThreatIntelResponse } from "@/types/threatIntel.d" +import type { EpssScore, EvaluationData, ThreatIntelResponse } from "@/types/threatIntel.d" export default { create(iocValue: string) { @@ -14,5 +14,14 @@ export default { process_name: processName } return HttpClient.post(`/threat_intel/process_name`, body) + }, + epssScore(cve: string) { + const body = { + cve + } + return HttpClient.post( + `/threat_intel/epss`, + body + ) } } diff --git a/frontend/src/components/agents/vulnerabilities/VulnerabilityCard.vue b/frontend/src/components/agents/vulnerabilities/VulnerabilityCard.vue index b4466579..99076a43 100644 --- a/frontend/src/components/agents/vulnerabilities/VulnerabilityCard.vue +++ b/frontend/src/components/agents/vulnerabilities/VulnerabilityCard.vue @@ -86,6 +86,11 @@ + +
+ +
+
@@ -101,6 +106,7 @@ import Icon from "@/components/common/Icon.vue" import KVCard from "@/components/common/KVCard.vue" import { useSettingsStore } from "@/stores/settings" import _truncate from "lodash/truncate" +import VulnerabilityEpss from "./VulnerabilityEpss.vue" const props = defineProps<{ vulnerability: AgentVulnerabilities diff --git a/frontend/src/components/agents/vulnerabilities/VulnerabilityEpss.vue b/frontend/src/components/agents/vulnerabilities/VulnerabilityEpss.vue new file mode 100644 index 00000000..b5edf980 --- /dev/null +++ b/frontend/src/components/agents/vulnerabilities/VulnerabilityEpss.vue @@ -0,0 +1,103 @@ + + + + + diff --git a/frontend/src/components/common/CardStatsIcon.vue b/frontend/src/components/common/CardStatsIcon.vue index bc12e0dd..48be4da6 100644 --- a/frontend/src/components/common/CardStatsIcon.vue +++ b/frontend/src/components/common/CardStatsIcon.vue @@ -27,7 +27,7 @@ const { boxed, boxSize, iconSize, iconName, color } = toRefs(props) const style = computed(() => useThemeStore().style) -const iconColor = computed(() => color?.value || style.value["--primary-color"]) +const iconColor = computed(() => color?.value || style.value["primary-color"]) const iconBoxedSize = computed(() => (boxSize.value / 100) * 45) const iconFinalSize = computed(() => (boxed?.value ? iconBoxedSize.value : iconSize.value)) diff --git a/frontend/src/components/common/ListPercentage.vue b/frontend/src/components/common/ListPercentage.vue index f5edf49f..73c385dd 100644 --- a/frontend/src/components/common/ListPercentage.vue +++ b/frontend/src/components/common/ListPercentage.vue @@ -17,9 +17,9 @@ type="line" :percentage="parseInt(item[percentageKey as keyof typeof item], 10)" :indicator-placement="'inside'" - :indicator-text-color="style['--bg-color']" - :color="style['--fg-color']" - :rail-color="style['--divider-020-color']" + :indicator-text-color="style['bg-color']" + :color="style['fg-color']" + :rail-color="style['divider-020-color']" class="font-mono font-bold" /> diff --git a/frontend/src/components/graylog/Metrics/UncommittedEntries.vue b/frontend/src/components/graylog/Metrics/UncommittedEntries.vue index 739b7fa5..9a1e9253 100644 --- a/frontend/src/components/graylog/Metrics/UncommittedEntries.vue +++ b/frontend/src/components/graylog/Metrics/UncommittedEntries.vue @@ -94,7 +94,7 @@ function getOptions() { xaxis: { type: "datetime" }, - colors: [style.value["--primary-color"]], + colors: [style.value["primary-color"]], tooltip: { x: { formatter: (time: number) => { @@ -107,7 +107,7 @@ function getOptions() { } }, style: { - fontFamily: style.value["--font-family-mono"] + fontFamily: style.value["font-family-mono"] }, theme: isThemeDark.value ? "dark" : "light" } diff --git a/frontend/src/components/indices/Marquee.vue b/frontend/src/components/indices/Marquee.vue index 8fe1af3a..bd39b2a2 100644 --- a/frontend/src/components/indices/Marquee.vue +++ b/frontend/src/components/indices/Marquee.vue @@ -58,7 +58,7 @@ watch(indices, val => { const message = useMessage() const style = computed(() => useThemeStore().style) -const gradientColor = computed(() => style.value["--bg-color-rgb"].split(", ")) +const gradientColor = computed(() => style.value["bg-color-rgb"].split(", ")) const loading = computed(() => !list?.value || list.value === null) function getIndices() { diff --git a/frontend/src/components/indices/TopIndices.vue b/frontend/src/components/indices/TopIndices.vue index c1c2eef9..13baece1 100644 --- a/frontend/src/components/indices/TopIndices.vue +++ b/frontend/src/components/indices/TopIndices.vue @@ -63,10 +63,10 @@ function getOptions() { left: "left", type: "scroll", textStyle: { - color: style.value["--fg-color"] + color: style.value["fg-color"] }, pageTextStyle: { - color: style.value["--fg-color"] + color: style.value["fg-color"] } }, grid: { @@ -86,13 +86,13 @@ function getOptions() { show: false }, itemStyle: { - borderColor: style.value["--bg-color"], + borderColor: style.value["bg-color"], borderWidth: 2 }, data: [ - { value: green, name: "Green", itemStyle: { color: style.value["--success-color"] } }, - { value: yellow, name: "Yellow", itemStyle: { color: style.value["--warning-color"] } }, - { value: red, name: "Red", itemStyle: { color: style.value["--error-color"] } } + { value: green, name: "Green", itemStyle: { color: style.value["success-color"] } }, + { value: yellow, name: "Yellow", itemStyle: { color: style.value["warning-color"] } }, + { value: red, name: "Red", itemStyle: { color: style.value["error-color"] } } ] }, { @@ -139,13 +139,13 @@ function getOptions() { //alignTo: "edge", rich: { name: { - color: style.value["--fg-color"], + color: style.value["fg-color"], fontSize: window.innerWidth > 1000 ? 13 : 11 }, per: { fontSize: window.innerWidth > 1000 ? 13 : 11, fontWeight: "bold", - color: style.value["--fg-color"] + color: style.value["fg-color"] } } }, @@ -165,7 +165,7 @@ function getOptions() { } }, itemStyle: { - borderColor: style.value["--bg-color"], + borderColor: style.value["bg-color"], borderWidth: 1 }, data: sizeData diff --git a/frontend/src/components/overview/HealthcheckCard.vue b/frontend/src/components/overview/HealthcheckCard.vue index 8557ed7a..8c413077 100644 --- a/frontend/src/components/overview/HealthcheckCard.vue +++ b/frontend/src/components/overview/HealthcheckCard.vue @@ -16,7 +16,7 @@ :iconName="HealthcheckIcon" boxed :boxSize="30" - :color="criticalTotal ? style['--warning-color'] : undefined" + :color="criticalTotal ? style['warning-color'] : undefined" > diff --git a/frontend/src/layouts/common/FooterEL.vue b/frontend/src/layouts/common/FooterEL.vue index 84dae0bd..131558f9 100644 --- a/frontend/src/layouts/common/FooterEL.vue +++ b/frontend/src/layouts/common/FooterEL.vue @@ -3,7 +3,7 @@
Made with - + By diff --git a/frontend/src/layouts/common/Provider.vue b/frontend/src/layouts/common/Provider.vue index 5039206e..8b644c22 100644 --- a/frontend/src/layouts/common/Provider.vue +++ b/frontend/src/layouts/common/Provider.vue @@ -66,7 +66,7 @@ function setGlobalVars() { const html = document.children[0] as HTMLElement const { style: htmlStyle } = html for (const key in style.value) { - htmlStyle.setProperty(key, style.value[key]) + htmlStyle.setProperty("--" + key, style.value[key]) } } diff --git a/frontend/src/layouts/common/Toolbar/PinnedPages.vue b/frontend/src/layouts/common/Toolbar/PinnedPages.vue index 27b550a5..b8eeef93 100644 --- a/frontend/src/layouts/common/Toolbar/PinnedPages.vue +++ b/frontend/src/layouts/common/Toolbar/PinnedPages.vue @@ -20,28 +20,36 @@ - +
- + -
-
- - - - - {{ page.title }} - -
+
+ + + {{ page.title }} +
@@ -126,6 +134,9 @@ router.afterEach(route => { position: relative; overflow: hidden; padding: 8px 0; + container-type: inline-size; + justify-content: flex-end; + width: 100%; :deep() { .n-tag { @@ -207,5 +218,17 @@ router.afterEach(route => { .anim-leave-active { position: absolute; } + + @container (max-width: 460px) { + .latest-list { + display: none; + } + } + + @container (max-width: 140px) { + .shortcuts-container { + display: none; + } + } } diff --git a/frontend/src/stores/theme.ts b/frontend/src/stores/theme.ts index c2402bb6..81e1efe3 100644 --- a/frontend/src/stores/theme.ts +++ b/frontend/src/stores/theme.ts @@ -362,96 +362,96 @@ export const useThemeStore = defineStore("theme", { const secondary4RGB = hex2rgb(secondary4).join(", ") return { - "--bg-sidebar": `${bgSidebar}`, - "--bg-body": `${bgBody}`, - "--bg-body-rgb": `${bgBodyRGB}`, - - "--fg-color": `${fgColor}`, - "--fg-secondary-color": `${fgSecondaryColor}`, - "--bg-color": `${bgColor}`, - "--bg-secondary-color": `${bgSecondaryColor}`, - "--bg-color-rgb": `${bgColorRGB}`, - - "--border-color": `${borderColor}`, - "--bezier-ease": `${bezierEase}`, - "--router-transition-duration": `${routerTransitionDuration}s`, - "--sidebar-anim-ease": `${sidebarAnimEase}`, - "--sidebar-anim-duration": `${sidebarAnimDuration}s`, - "--sidebar-open-width": `${sidebarOpenWidth}px`, - "--sidebar-close-width": `${sidebarCloseWidth}px`, - "--boxed-width": `${boxedWidth}px`, - "--toolbar-height": `${toolbarHeight}px`, - "--header-bar-height": `${headerBarHeight}px`, - "--view-padding": `${viewPadding}px`, - "--border-radius": `${borderRadius}`, - "--border-radius-small": `${borderRadiusSmall}`, - "--font-family": `${fontFamily}`, - "--font-family-display": `${fontFamilyDisplay}`, - "--font-family-mono": `${fontFamilyMono}`, - "--code-color": `${codeColor}`, - "--primary-color": `${primaryColor}`, - "--tab-color": `${tabColor}`, - "--tab-color-active": `${tabColorActive}`, - "--tab-fg-color-active": `${tabFgColorActive}`, - "--modal-color": `${modalColor}`, - "--modal-color-rgb": `${modalColorRGB}`, - - "--button-color-secondary": `${buttonColorSecondary}`, - "--button-color-secondary-hover": `${buttonColorSecondaryHover}`, - "--button-color-secondary-pressed": `${buttonColorSecondaryPressed}`, - - "--primary-005-color": `${primary005}`, - "--primary-010-color": `${primary010}`, - "--primary-015-color": `${primary015}`, - "--primary-020-color": `${primary020}`, - "--primary-030-color": `${primary030}`, - "--primary-040-color": `${primary040}`, - "--primary-050-color": `${primary050}`, - "--primary-060-color": `${primary060}`, - - "--hover-005-color": `${hover005}`, - "--hover-010-color": `${hover010}`, - "--hover-050-color": `${hover050}`, - - "--divider-005-color": `${divider005}`, - "--divider-010-color": `${divider010}`, - "--divider-020-color": `${divider020}`, - "--divider-030-color": `${divider030}`, - - "--success-color": `${successColor}`, - "--error-color": `${errorColor}`, - "--warning-color": `${warningColor}`, - "--info-color": `${infoColor}`, - "--success-005-color": `${success005}`, - "--error-005-color": `${error005}`, - "--warning-005-color": `${warning005}`, - "--info-005-color": `${info005}`, - - "--secondary1-color": `${secondary1}`, - "--secondary1-color-rgb": `${secondary1RGB}`, - "--secondary2-color": `${secondary2}`, - "--secondary2-color-rgb": `${secondary2RGB}`, - "--secondary3-color": `${secondary3}`, - "--secondary3-color-rgb": `${secondary3RGB}`, - "--secondary4-color": `${secondary4}`, - "--secondary4-color-rgb": `${secondary4RGB}`, - - "--secondary1-opacity-005-color": `${secondary1Opacity005}`, - "--secondary1-opacity-010-color": `${secondary1Opacity010}`, - "--secondary1-opacity-020-color": `${secondary1Opacity020}`, - "--secondary1-opacity-030-color": `${secondary1Opacity030}`, - "--secondary2-opacity-005-color": `${secondary2Opacity005}`, - "--secondary2-opacity-010-color": `${secondary2Opacity010}`, - "--secondary2-opacity-020-color": `${secondary2Opacity020}`, - "--secondary2-opacity-030-color": `${secondary2Opacity030}`, - "--secondary3-opacity-005-color": `${secondary3Opacity005}`, - "--secondary3-opacity-010-color": `${secondary3Opacity010}`, - "--secondary3-opacity-020-color": `${secondary3Opacity020}`, - "--secondary3-opacity-030-color": `${secondary3Opacity030}`, - "--secondary4-opacity-005-color": `${secondary4Opacity005}`, - "--secondary4-opacity-010-color": `${secondary4Opacity010}`, - "--secondary4-opacity-020-color": `${secondary4Opacity020}`, - "--secondary4-opacity-030-color": `${secondary4Opacity030}` + "bg-sidebar": `${bgSidebar}`, + "bg-body": `${bgBody}`, + "bg-body-rgb": `${bgBodyRGB}`, + + "fg-color": `${fgColor}`, + "fg-secondary-color": `${fgSecondaryColor}`, + "bg-color": `${bgColor}`, + "bg-secondary-color": `${bgSecondaryColor}`, + "bg-color-rgb": `${bgColorRGB}`, + + "border-color": `${borderColor}`, + "bezier-ease": `${bezierEase}`, + "router-transition-duration": `${routerTransitionDuration}s`, + "sidebar-anim-ease": `${sidebarAnimEase}`, + "sidebar-anim-duration": `${sidebarAnimDuration}s`, + "sidebar-open-width": `${sidebarOpenWidth}px`, + "sidebar-close-width": `${sidebarCloseWidth}px`, + "boxed-width": `${boxedWidth}px`, + "toolbar-height": `${toolbarHeight}px`, + "header-bar-height": `${headerBarHeight}px`, + "view-padding": `${viewPadding}px`, + "border-radius": `${borderRadius}`, + "border-radius-small": `${borderRadiusSmall}`, + "font-family": `${fontFamily}`, + "font-family-display": `${fontFamilyDisplay}`, + "font-family-mono": `${fontFamilyMono}`, + "code-color": `${codeColor}`, + "primary-color": `${primaryColor}`, + "tab-color": `${tabColor}`, + "tab-color-active": `${tabColorActive}`, + "tab-fg-color-active": `${tabFgColorActive}`, + "modal-color": `${modalColor}`, + "modal-color-rgb": `${modalColorRGB}`, + + "button-color-secondary": `${buttonColorSecondary}`, + "button-color-secondary-hover": `${buttonColorSecondaryHover}`, + "button-color-secondary-pressed": `${buttonColorSecondaryPressed}`, + + "primary-005-color": `${primary005}`, + "primary-010-color": `${primary010}`, + "primary-015-color": `${primary015}`, + "primary-020-color": `${primary020}`, + "primary-030-color": `${primary030}`, + "primary-040-color": `${primary040}`, + "primary-050-color": `${primary050}`, + "primary-060-color": `${primary060}`, + + "hover-005-color": `${hover005}`, + "hover-010-color": `${hover010}`, + "hover-050-color": `${hover050}`, + + "divider-005-color": `${divider005}`, + "divider-010-color": `${divider010}`, + "divider-020-color": `${divider020}`, + "divider-030-color": `${divider030}`, + + "success-color": `${successColor}`, + "error-color": `${errorColor}`, + "warning-color": `${warningColor}`, + "info-color": `${infoColor}`, + "success-005-color": `${success005}`, + "error-005-color": `${error005}`, + "warning-005-color": `${warning005}`, + "info-005-color": `${info005}`, + + "secondary1-color": `${secondary1}`, + "secondary1-color-rgb": `${secondary1RGB}`, + "secondary2-color": `${secondary2}`, + "secondary2-color-rgb": `${secondary2RGB}`, + "secondary3-color": `${secondary3}`, + "secondary3-color-rgb": `${secondary3RGB}`, + "secondary4-color": `${secondary4}`, + "secondary4-color-rgb": `${secondary4RGB}`, + + "secondary1-opacity-005-color": `${secondary1Opacity005}`, + "secondary1-opacity-010-color": `${secondary1Opacity010}`, + "secondary1-opacity-020-color": `${secondary1Opacity020}`, + "secondary1-opacity-030-color": `${secondary1Opacity030}`, + "secondary2-opacity-005-color": `${secondary2Opacity005}`, + "secondary2-opacity-010-color": `${secondary2Opacity010}`, + "secondary2-opacity-020-color": `${secondary2Opacity020}`, + "secondary2-opacity-030-color": `${secondary2Opacity030}`, + "secondary3-opacity-005-color": `${secondary3Opacity005}`, + "secondary3-opacity-010-color": `${secondary3Opacity010}`, + "secondary3-opacity-020-color": `${secondary3Opacity020}`, + "secondary3-opacity-030-color": `${secondary3Opacity030}`, + "secondary4-opacity-005-color": `${secondary4Opacity005}`, + "secondary4-opacity-010-color": `${secondary4Opacity010}`, + "secondary4-opacity-020-color": `${secondary4Opacity020}`, + "secondary4-opacity-030-color": `${secondary4Opacity030}` } }, isThemeDark(state): boolean { diff --git a/frontend/src/types/threatIntel.d.ts b/frontend/src/types/threatIntel.d.ts index 2bfc9c66..91f994e0 100644 --- a/frontend/src/types/threatIntel.d.ts +++ b/frontend/src/types/threatIntel.d.ts @@ -9,6 +9,16 @@ export interface ThreatIntelResponse { virustotal_url: string | null } +export interface EpssScore { + cve: string + /** a float (0.000680000) */ + epss: string + /** a float (0.299330000) */ + percentile: string + /** a date (2024-06-27) */ + date: string | Date +} + export interface EvaluationData { rank: number host_prev: string