From 78674f8dfc7009b24adf91061efb20187912d05b Mon Sep 17 00:00:00 2001 From: Dinesh Kumar Sutihar Date: Fri, 4 Apr 2025 01:57:42 +0530 Subject: [PATCH 1/4] chore: removes unused dependecies --- frontend/package-lock.json | 707 ++----------------------------------- frontend/package.json | 15 +- 2 files changed, 36 insertions(+), 686 deletions(-) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index f4c0800e..faf64000 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -10,34 +10,21 @@ "dependencies": { "@emotion/react": "^11.14.0", "@emotion/styled": "^11.14.0", - "@fortawesome/fontawesome-svg-core": "^6.7.2", - "@fortawesome/free-brands-svg-icons": "^6.7.2", - "@fortawesome/free-regular-svg-icons": "^6.7.2", - "@fortawesome/free-solid-svg-icons": "^6.7.2", - "@fortawesome/react-fontawesome": "^0.2.2", "@mui/icons-material": "^7.0.1", "@mui/material": "^7.0.1", - "@mui/styled-engine-sc": "^6.4.6", "@mui/x-charts": "^7.27.1", - "@mui/x-charts-pro": "^7.27.1", "@mui/x-data-grid": "^7.28.2", "@mui/x-date-pickers": "^7.28.2", "@mui/x-tree-view": "^7.28.1", "@react-spring/web": "^9.7.5", - "d3": "^7.9.0", + "clsx": "^2.1.1", "dayjs": "^1.11.13", - "lucide-react": "^0.485.0", "react": "^18.0.0", "react-dom": "^18.0.0", - "react-heatmap-grid": "^0.9.1", - "react-icons": "^5.5.0", - "react-leaflet": "^4.0.0", "react-markdown": "^10.1.0", "react-router-dom": "^7.4.1", "react-syntax-highlighter": "^15.6.1", - "recharts": "^2.15.1", "recoil": "^0.7.7", - "styled-components": "^6.1.15", "tailwind-scrollbar-hide": "^2.0.0" }, "devDependencies": { @@ -1127,76 +1114,6 @@ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, - "node_modules/@fortawesome/fontawesome-common-types": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.7.2.tgz", - "integrity": "sha512-Zs+YeHUC5fkt7Mg1l6XTniei3k4bwG/yo3iFUtZWd/pMx9g3fdvkSK9E0FOC+++phXOka78uJcYb8JaFkW52Xg==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/@fortawesome/fontawesome-svg-core": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.7.2.tgz", - "integrity": "sha512-yxtOBWDrdi5DD5o1pmVdq3WMCvnobT0LU6R8RyyVXPvFRd2o79/0NCuQoCjNTeZz9EzA9xS3JxNWfv54RIHFEA==", - "license": "MIT", - "dependencies": { - "@fortawesome/fontawesome-common-types": "6.7.2" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@fortawesome/free-brands-svg-icons": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/@fortawesome/free-brands-svg-icons/-/free-brands-svg-icons-6.7.2.tgz", - "integrity": "sha512-zu0evbcRTgjKfrr77/2XX+bU+kuGfjm0LbajJHVIgBWNIDzrhpRxiCPNT8DW5AdmSsq7Mcf9D1bH0aSeSUSM+Q==", - "license": "(CC-BY-4.0 AND MIT)", - "dependencies": { - "@fortawesome/fontawesome-common-types": "6.7.2" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@fortawesome/free-regular-svg-icons": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/@fortawesome/free-regular-svg-icons/-/free-regular-svg-icons-6.7.2.tgz", - "integrity": "sha512-7Z/ur0gvCMW8G93dXIQOkQqHo2M5HLhYrRVC0//fakJXxcF1VmMPsxnG6Ee8qEylA8b8Q3peQXWMNZ62lYF28g==", - "license": "(CC-BY-4.0 AND MIT)", - "dependencies": { - "@fortawesome/fontawesome-common-types": "6.7.2" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@fortawesome/free-solid-svg-icons": { - "version": "6.7.2", - "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.7.2.tgz", - "integrity": "sha512-GsBrnOzU8uj0LECDfD5zomZJIjrPhIlWU82AHwa2s40FKH+kcxQaBvBo3Z4TxyZHIyX8XTDxsyA33/Vx9eFuQA==", - "license": "(CC-BY-4.0 AND MIT)", - "dependencies": { - "@fortawesome/fontawesome-common-types": "6.7.2" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@fortawesome/react-fontawesome": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/@fortawesome/react-fontawesome/-/react-fontawesome-0.2.2.tgz", - "integrity": "sha512-EnkrprPNqI6SXJl//m29hpaNzOp1bruISWaOiRtkMi/xSvHJlzc2j2JAYS7egxt/EbjSNV/k6Xy0AQI6vB2+1g==", - "license": "MIT", - "dependencies": { - "prop-types": "^15.8.1" - }, - "peerDependencies": { - "@fortawesome/fontawesome-svg-core": "~1 || ~6", - "react": ">=16.3" - } - }, "node_modules/@humanfs/core": { "version": "0.19.1", "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", @@ -1457,29 +1374,6 @@ } } }, - "node_modules/@mui/styled-engine-sc": { - "version": "6.4.9", - "resolved": "https://registry.npmjs.org/@mui/styled-engine-sc/-/styled-engine-sc-6.4.9.tgz", - "integrity": "sha512-ua4dCpn023Z1wUJ1GShFvBojmwhGPsOo3q4ywxb0QuUBdOyHX0T1SwwOfXU9uCwahnrvaJGX55zEHwSENPDohg==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.26.0", - "@types/hoist-non-react-statics": "^3.3.6", - "csstype": "^3.1.3", - "hoist-non-react-statics": "^3.3.2", - "prop-types": "^15.8.1" - }, - "engines": { - "node": ">=14.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mui-org" - }, - "peerDependencies": { - "styled-components": "^6.0.0" - } - }, "node_modules/@mui/system": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/@mui/system/-/system-7.0.1.tgz", @@ -1602,43 +1496,6 @@ } } }, - "node_modules/@mui/x-charts-pro": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@mui/x-charts-pro/-/x-charts-pro-7.28.0.tgz", - "integrity": "sha512-1Xe3YKPh0d4k5abH+qrEH1MsHQ9XaztdTzg6dQseouDBJF4iM9qkgSLj9ubtZ0ZmTGh2FfyHckpIG75bViNb2Q==", - "license": "SEE LICENSE IN LICENSE", - "dependencies": { - "@babel/runtime": "^7.25.7", - "@mui/utils": "^5.16.6 || ^6.0.0 || ^7.0.0 || ^7.0.0-beta", - "@mui/x-charts": "7.28.0", - "@mui/x-charts-vendor": "7.20.0", - "@mui/x-internals": "7.28.0", - "@mui/x-license": "7.28.0", - "@react-spring/rafz": "^9.7.5", - "@react-spring/web": "^9.7.5", - "clsx": "^2.1.1", - "prop-types": "^15.8.1" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "@emotion/react": "^11.9.0", - "@emotion/styled": "^11.8.1", - "@mui/material": "^5.15.14 || ^6.0.0 || ^7.0.0 || ^7.0.0-beta", - "@mui/system": "^5.15.14 || ^6.0.0 || ^7.0.0 || ^7.0.0-beta", - "react": "^17.0.0 || ^18.0.0 || ^19.0.0", - "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" - }, - "peerDependenciesMeta": { - "@emotion/react": { - "optional": true - }, - "@emotion/styled": { - "optional": true - } - } - }, "node_modules/@mui/x-charts-vendor": { "version": "7.20.0", "resolved": "https://registry.npmjs.org/@mui/x-charts-vendor/-/x-charts-vendor-7.20.0.tgz", @@ -1786,23 +1643,6 @@ "react": "^17.0.0 || ^18.0.0 || ^19.0.0" } }, - "node_modules/@mui/x-license": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@mui/x-license/-/x-license-7.28.0.tgz", - "integrity": "sha512-z50lVN4KxW+KB3usEnorEarbWtBxpYQrWfkmJqwJZEaeDO870LghBuhXNt4KEE2jqUU64MQCgZRPszIyrAvXfQ==", - "license": "SEE LICENSE IN LICENSE", - "dependencies": { - "@babel/runtime": "^7.25.7", - "@mui/utils": "^5.16.6 || ^6.0.0 || ^7.0.0 || ^7.0.0-beta", - "@mui/x-internals": "7.28.0" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "react": "^17.0.0 || ^18.0.0 || ^19.0.0" - } - }, "node_modules/@mui/x-tree-view": { "version": "7.28.1", "resolved": "https://registry.npmjs.org/@mui/x-tree-view/-/x-tree-view-7.28.1.tgz", @@ -1851,17 +1691,6 @@ "url": "https://opencollective.com/popperjs" } }, - "node_modules/@react-leaflet/core": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@react-leaflet/core/-/core-2.1.0.tgz", - "integrity": "sha512-Qk7Pfu8BSarKGqILj4x7bCSZ1pjuAPZ+qmRwH5S7mDS91VSbVVsJSrW4qA+GPrro8t69gFYVMWb1Zc4yFmPiVg==", - "license": "Hippocratic-2.1", - "peerDependencies": { - "leaflet": "^1.9.0", - "react": "^18.0.0", - "react-dom": "^18.0.0" - } - }, "node_modules/@react-spring/animated": { "version": "9.7.5", "resolved": "https://registry.npmjs.org/@react-spring/animated/-/animated-9.7.5.tgz", @@ -2517,12 +2346,6 @@ "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==", "license": "MIT" }, - "node_modules/@types/d3-array": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.1.tgz", - "integrity": "sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==", - "license": "MIT" - }, "node_modules/@types/d3-color": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", @@ -2535,12 +2358,6 @@ "integrity": "sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==", "license": "MIT" }, - "node_modules/@types/d3-ease": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", - "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==", - "license": "MIT" - }, "node_modules/@types/d3-interpolate": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", @@ -2580,12 +2397,6 @@ "integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==", "license": "MIT" }, - "node_modules/@types/d3-timer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", - "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==", - "license": "MIT" - }, "node_modules/@types/debug": { "version": "4.1.12", "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", @@ -2619,16 +2430,6 @@ "@types/unist": "*" } }, - "node_modules/@types/hoist-non-react-statics": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.6.tgz", - "integrity": "sha512-lPByRJUer/iN/xa4qpyL0qmL11DqNW81iU/IG1S3uvRUq4oKagz8VCxZjiWkumgt66YT3vOdDgZ0o32sGKtCEw==", - "license": "MIT", - "dependencies": { - "@types/react": "*", - "hoist-non-react-statics": "^3.3.0" - } - }, "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", @@ -2695,7 +2496,9 @@ "version": "4.2.5", "resolved": "https://registry.npmjs.org/@types/stylis/-/stylis-4.2.5.tgz", "integrity": "sha512-1Xve+NMN7FWjY14vLoY5tL3BVEQ/n42YLwaqJIPYhotZ9uBHt87VceMwWQpzmdEt2TNXIorIFG+YeCUUW7RInw==", - "license": "MIT" + "dev": true, + "license": "MIT", + "peer": true }, "node_modules/@types/unist": { "version": "3.0.3", @@ -2936,7 +2739,9 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.1.tgz", "integrity": "sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==", + "dev": true, "license": "MIT", + "peer": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -3068,15 +2873,6 @@ "url": "https://github.com/sponsors/wooorm" } }, - "node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "license": "MIT", - "engines": { - "node": ">= 10" - } - }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -3143,7 +2939,9 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz", "integrity": "sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==", + "dev": true, "license": "ISC", + "peer": true, "engines": { "node": ">=4" } @@ -3152,7 +2950,9 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.2.0.tgz", "integrity": "sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==", + "dev": true, "license": "MIT", + "peer": true, "dependencies": { "camelize": "^1.0.0", "css-color-keywords": "^1.0.0", @@ -3165,47 +2965,6 @@ "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", "license": "MIT" }, - "node_modules/d3": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/d3/-/d3-7.9.0.tgz", - "integrity": "sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==", - "license": "ISC", - "dependencies": { - "d3-array": "3", - "d3-axis": "3", - "d3-brush": "3", - "d3-chord": "3", - "d3-color": "3", - "d3-contour": "4", - "d3-delaunay": "6", - "d3-dispatch": "3", - "d3-drag": "3", - "d3-dsv": "3", - "d3-ease": "3", - "d3-fetch": "3", - "d3-force": "3", - "d3-format": "3", - "d3-geo": "3", - "d3-hierarchy": "3", - "d3-interpolate": "3", - "d3-path": "3", - "d3-polygon": "3", - "d3-quadtree": "3", - "d3-random": "3", - "d3-scale": "4", - "d3-scale-chromatic": "3", - "d3-selection": "3", - "d3-shape": "3", - "d3-time": "3", - "d3-time-format": "4", - "d3-timer": "3", - "d3-transition": "3", - "d3-zoom": "3" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/d3-array": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", @@ -3218,43 +2977,6 @@ "node": ">=12" } }, - "node_modules/d3-axis": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-axis/-/d3-axis-3.0.0.tgz", - "integrity": "sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-brush": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-brush/-/d3-brush-3.0.0.tgz", - "integrity": "sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==", - "license": "ISC", - "dependencies": { - "d3-dispatch": "1 - 3", - "d3-drag": "2 - 3", - "d3-interpolate": "1 - 3", - "d3-selection": "3", - "d3-transition": "3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-chord": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-chord/-/d3-chord-3.0.1.tgz", - "integrity": "sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==", - "license": "ISC", - "dependencies": { - "d3-path": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/d3-color": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", @@ -3264,18 +2986,6 @@ "node": ">=12" } }, - "node_modules/d3-contour": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/d3-contour/-/d3-contour-4.0.2.tgz", - "integrity": "sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==", - "license": "ISC", - "dependencies": { - "d3-array": "^3.2.0" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/d3-delaunay": { "version": "6.0.4", "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.4.tgz", @@ -3288,88 +2998,6 @@ "node": ">=12" } }, - "node_modules/d3-dispatch": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", - "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-drag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-drag/-/d3-drag-3.0.0.tgz", - "integrity": "sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==", - "license": "ISC", - "dependencies": { - "d3-dispatch": "1 - 3", - "d3-selection": "3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-dsv": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", - "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", - "license": "ISC", - "dependencies": { - "commander": "7", - "iconv-lite": "0.6", - "rw": "1" - }, - "bin": { - "csv2json": "bin/dsv2json.js", - "csv2tsv": "bin/dsv2dsv.js", - "dsv2dsv": "bin/dsv2dsv.js", - "dsv2json": "bin/dsv2json.js", - "json2csv": "bin/json2dsv.js", - "json2dsv": "bin/json2dsv.js", - "json2tsv": "bin/json2dsv.js", - "tsv2csv": "bin/dsv2dsv.js", - "tsv2json": "bin/dsv2json.js" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-ease": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", - "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-fetch": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-fetch/-/d3-fetch-3.0.1.tgz", - "integrity": "sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==", - "license": "ISC", - "dependencies": { - "d3-dsv": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-force": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", - "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", - "license": "ISC", - "dependencies": { - "d3-dispatch": "1 - 3", - "d3-quadtree": "1 - 3", - "d3-timer": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/d3-format": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", @@ -3379,27 +3007,6 @@ "node": ">=12" } }, - "node_modules/d3-geo": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.1.tgz", - "integrity": "sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==", - "license": "ISC", - "dependencies": { - "d3-array": "2.5.0 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-hierarchy": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", - "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, "node_modules/d3-interpolate": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", @@ -3421,33 +3028,6 @@ "node": ">=12" } }, - "node_modules/d3-polygon": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-polygon/-/d3-polygon-3.0.1.tgz", - "integrity": "sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-quadtree": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", - "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-random": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-random/-/d3-random-3.0.1.tgz", - "integrity": "sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, "node_modules/d3-scale": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", @@ -3464,28 +3044,6 @@ "node": ">=12" } }, - "node_modules/d3-scale-chromatic": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", - "integrity": "sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==", - "license": "ISC", - "dependencies": { - "d3-color": "1 - 3", - "d3-interpolate": "1 - 3" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-selection": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", - "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, "node_modules/d3-shape": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", @@ -3522,50 +3080,6 @@ "node": ">=12" } }, - "node_modules/d3-timer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", - "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/d3-transition": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/d3-transition/-/d3-transition-3.0.1.tgz", - "integrity": "sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==", - "license": "ISC", - "dependencies": { - "d3-color": "1 - 3", - "d3-dispatch": "1 - 3", - "d3-ease": "1 - 3", - "d3-interpolate": "1 - 3", - "d3-timer": "1 - 3" - }, - "engines": { - "node": ">=12" - }, - "peerDependencies": { - "d3-selection": "2 - 3" - } - }, - "node_modules/d3-zoom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/d3-zoom/-/d3-zoom-3.0.0.tgz", - "integrity": "sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==", - "license": "ISC", - "dependencies": { - "d3-dispatch": "1 - 3", - "d3-drag": "2 - 3", - "d3-interpolate": "1 - 3", - "d3-selection": "2 - 3", - "d3-transition": "2 - 3" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/dayjs": { "version": "1.11.13", "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz", @@ -3589,12 +3103,6 @@ } } }, - "node_modules/decimal.js-light": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/decimal.js-light/-/decimal.js-light-2.5.1.tgz", - "integrity": "sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==", - "license": "MIT" - }, "node_modules/decode-named-character-reference": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.1.0.tgz", @@ -3947,12 +3455,6 @@ "node": ">=0.10.0" } }, - "node_modules/eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "license": "MIT" - }, "node_modules/extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", @@ -3966,15 +3468,6 @@ "dev": true, "license": "MIT" }, - "node_modules/fast-equals": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-5.2.2.tgz", - "integrity": "sha512-V7/RktU11J3I36Nwq2JnZEM7tNm17eBJz+u25qdxBZeCKiX6BkVSZQjwWIr+IobgnZy+ag73tTZgZi7tr0LrBw==", - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", @@ -4331,18 +3824,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/ignore": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", @@ -4592,13 +4073,6 @@ "json-buffer": "3.0.1" } }, - "node_modules/leaflet": { - "version": "1.9.4", - "resolved": "https://registry.npmjs.org/leaflet/-/leaflet-1.9.4.tgz", - "integrity": "sha512-nxS1ynzJOmOlHp+iL3FyWqK89GtNL8U8rvlMOsQdTTssxZwCXh8N2NB3GDQOL+YR3XnWyZAxwQixURb+FA74PA==", - "license": "BSD-2-Clause", - "peer": true - }, "node_modules/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -4878,6 +4352,7 @@ "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true, "license": "MIT" }, "node_modules/lodash.merge": { @@ -4933,15 +4408,6 @@ "yallist": "^3.0.2" } }, - "node_modules/lucide-react": { - "version": "0.485.0", - "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.485.0.tgz", - "integrity": "sha512-NvyQJ0LKyyCxL23nPKESlr/jmz8r7fJO1bkuptSNYSy0s8VVj4ojhX0YAgmE1e0ewfxUZjIlZpvH+otfTnla8Q==", - "license": "ISC", - "peerDependencies": { - "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" - } - }, "node_modules/mdast-util-from-markdown": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.2.tgz", @@ -5560,6 +5026,7 @@ "version": "3.3.11", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, "funding": [ { "type": "github", @@ -5799,6 +5266,7 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true, "license": "MIT" }, "node_modules/prelude-ls": { @@ -5882,41 +5350,12 @@ "react": "^18.3.1" } }, - "node_modules/react-heatmap-grid": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/react-heatmap-grid/-/react-heatmap-grid-0.9.1.tgz", - "integrity": "sha512-rsN2IfFh85cBl4y3cPJrabA60uuS96BKbWeX4BV4pTaKy/qqn8o8dDwd436LBg/EJad2S4Di948XaxpxwsapGw==", - "license": "MIT" - }, - "node_modules/react-icons": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-5.5.0.tgz", - "integrity": "sha512-MEFcXdkP3dLo8uumGI5xN3lDFNsRtrjbOEKDLD7yv76v4wpnEq2Lt2qeHaQOr34I/wPN3s3+N08WkQ+CW37Xiw==", - "license": "MIT", - "peerDependencies": { - "react": "*" - } - }, "node_modules/react-is": { "version": "19.1.0", "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.1.0.tgz", "integrity": "sha512-Oe56aUPnkHyyDxxkvqtd7KkdQP5uIUfHxd5XTb3wE9d/kRnZLmKbDB0GWk919tdQ+mxxPtG6EAs6RMT6i1qtHg==", "license": "MIT" }, - "node_modules/react-leaflet": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/react-leaflet/-/react-leaflet-4.2.1.tgz", - "integrity": "sha512-p9chkvhcKrWn/H/1FFeVSqLdReGwn2qmiobOQGO3BifX+/vV/39qhY8dGqbdcPh1e6jxh/QHriLXr7a4eLFK4Q==", - "license": "Hippocratic-2.1", - "dependencies": { - "@react-leaflet/core": "^2.1.0" - }, - "peerDependencies": { - "leaflet": "^1.9.0", - "react": "^18.0.0", - "react-dom": "^18.0.0" - } - }, "node_modules/react-markdown": { "version": "10.1.0", "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-10.1.0.tgz", @@ -5994,21 +5433,6 @@ "react-dom": ">=18" } }, - "node_modules/react-smooth": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/react-smooth/-/react-smooth-4.0.4.tgz", - "integrity": "sha512-gnGKTpYwqL0Iii09gHobNolvX4Kiq4PKx6eWBCYYix+8cdw+cGo3do906l1NBPKkSWx1DghC1dlWG9L2uGd61Q==", - "license": "MIT", - "dependencies": { - "fast-equals": "^5.0.1", - "prop-types": "^15.8.1", - "react-transition-group": "^4.4.5" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - } - }, "node_modules/react-syntax-highlighter": { "version": "15.6.1", "resolved": "https://registry.npmjs.org/react-syntax-highlighter/-/react-syntax-highlighter-15.6.1.tgz", @@ -6042,44 +5466,6 @@ "react-dom": ">=16.6.0" } }, - "node_modules/recharts": { - "version": "2.15.1", - "resolved": "https://registry.npmjs.org/recharts/-/recharts-2.15.1.tgz", - "integrity": "sha512-v8PUTUlyiDe56qUj82w/EDVuzEFXwEHp9/xOowGAZwfLjB9uAy3GllQVIYMWF6nU+qibx85WF75zD7AjqoT54Q==", - "license": "MIT", - "dependencies": { - "clsx": "^2.0.0", - "eventemitter3": "^4.0.1", - "lodash": "^4.17.21", - "react-is": "^18.3.1", - "react-smooth": "^4.0.4", - "recharts-scale": "^0.4.4", - "tiny-invariant": "^1.3.1", - "victory-vendor": "^36.6.8" - }, - "engines": { - "node": ">=14" - }, - "peerDependencies": { - "react": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", - "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" - } - }, - "node_modules/recharts-scale": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/recharts-scale/-/recharts-scale-0.4.5.tgz", - "integrity": "sha512-kivNFO+0OcUNu7jQquLXAxz1FIwZj8nrj+YkOKc5694NbjCvcT6aSZiIzNzd2Kul4o4rTto8QVR9lMNtxD4G1w==", - "license": "MIT", - "dependencies": { - "decimal.js-light": "^2.4.1" - } - }, - "node_modules/recharts/node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "license": "MIT" - }, "node_modules/recoil": { "version": "0.7.7", "resolved": "https://registry.npmjs.org/recoil/-/recoil-0.7.7.tgz", @@ -6336,18 +5722,6 @@ "fsevents": "~2.3.2" } }, - "node_modules/rw": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", - "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==", - "license": "BSD-3-Clause" - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "license": "MIT" - }, "node_modules/scheduler": { "version": "0.23.2", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", @@ -6377,7 +5751,9 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==", - "license": "MIT" + "dev": true, + "license": "MIT", + "peer": true }, "node_modules/shebang-command": { "version": "2.0.0", @@ -6415,6 +5791,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" @@ -6479,7 +5856,9 @@ "version": "6.1.16", "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-6.1.16.tgz", "integrity": "sha512-KpWB6ORAWGmbWM10cDJfEV6sXc/uVkkkQV3SLwTNQ/E/PqWgNHIoMSLh1Lnk2FkB9+JHK7uuMq1i+9ArxDD7iQ==", + "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@emotion/is-prop-valid": "1.2.2", "@emotion/unitless": "0.8.1", @@ -6507,7 +5886,9 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.2.tgz", "integrity": "sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw==", + "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@emotion/memoize": "^0.8.1" } @@ -6516,18 +5897,23 @@ "version": "0.8.1", "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==", - "license": "MIT" + "dev": true, + "license": "MIT", + "peer": true }, "node_modules/styled-components/node_modules/@emotion/unitless": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz", "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==", - "license": "MIT" + "dev": true, + "license": "MIT", + "peer": true }, "node_modules/styled-components/node_modules/postcss": { "version": "8.4.49", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", + "dev": true, "funding": [ { "type": "opencollective", @@ -6543,6 +5929,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "nanoid": "^3.3.7", "picocolors": "^1.1.1", @@ -6556,7 +5943,9 @@ "version": "4.3.2", "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.2.tgz", "integrity": "sha512-bhtUjWd/z6ltJiQwg0dUfxEJ+W+jdqQd8TbWLWyeIJHlnsqmGLRFFd8e5mA0AZi/zx90smXRlN66YMTcaSFifg==", - "license": "MIT" + "dev": true, + "license": "MIT", + "peer": true }, "node_modules/stylis": { "version": "4.2.0", @@ -6614,12 +6003,6 @@ "node": ">=6" } }, - "node_modules/tiny-invariant": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", - "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", - "license": "MIT" - }, "node_modules/trim-lines": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", @@ -6644,7 +6027,9 @@ "version": "2.6.2", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", - "license": "0BSD" + "dev": true, + "license": "0BSD", + "peer": true }, "node_modules/turbo-stream": { "version": "2.4.0", @@ -6830,28 +6215,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/victory-vendor": { - "version": "36.9.2", - "resolved": "https://registry.npmjs.org/victory-vendor/-/victory-vendor-36.9.2.tgz", - "integrity": "sha512-PnpQQMuxlwYdocC8fIJqVXvkeViHYzotI+NJrCuav0ZYFoq912ZHBk3mCeuj+5/VpodOjPe1z0Fk2ihgzlXqjQ==", - "license": "MIT AND ISC", - "dependencies": { - "@types/d3-array": "^3.0.3", - "@types/d3-ease": "^3.0.0", - "@types/d3-interpolate": "^3.0.1", - "@types/d3-scale": "^4.0.2", - "@types/d3-shape": "^3.1.0", - "@types/d3-time": "^3.0.0", - "@types/d3-timer": "^3.0.0", - "d3-array": "^3.1.6", - "d3-ease": "^3.0.1", - "d3-interpolate": "^3.0.1", - "d3-scale": "^4.0.2", - "d3-shape": "^3.1.0", - "d3-time": "^3.0.0", - "d3-timer": "^3.0.1" - } - }, "node_modules/vite": { "version": "6.2.4", "resolved": "https://registry.npmjs.org/vite/-/vite-6.2.4.tgz", diff --git a/frontend/package.json b/frontend/package.json index 0913e91a..fb1cd2a5 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -12,34 +12,21 @@ "dependencies": { "@emotion/react": "^11.14.0", "@emotion/styled": "^11.14.0", - "@fortawesome/fontawesome-svg-core": "^6.7.2", - "@fortawesome/free-brands-svg-icons": "^6.7.2", - "@fortawesome/free-regular-svg-icons": "^6.7.2", - "@fortawesome/free-solid-svg-icons": "^6.7.2", - "@fortawesome/react-fontawesome": "^0.2.2", "@mui/icons-material": "^7.0.1", "@mui/material": "^7.0.1", - "@mui/styled-engine-sc": "^6.4.6", "@mui/x-charts": "^7.27.1", - "@mui/x-charts-pro": "^7.27.1", "@mui/x-data-grid": "^7.28.2", "@mui/x-date-pickers": "^7.28.2", "@mui/x-tree-view": "^7.28.1", "@react-spring/web": "^9.7.5", - "d3": "^7.9.0", + "clsx": "^2.1.1", "dayjs": "^1.11.13", - "lucide-react": "^0.485.0", "react": "^18.0.0", "react-dom": "^18.0.0", - "react-heatmap-grid": "^0.9.1", - "react-icons": "^5.5.0", - "react-leaflet": "^4.0.0", "react-markdown": "^10.1.0", "react-router-dom": "^7.4.1", "react-syntax-highlighter": "^15.6.1", - "recharts": "^2.15.1", "recoil": "^0.7.7", - "styled-components": "^6.1.15", "tailwind-scrollbar-hide": "^2.0.0" }, "devDependencies": { From d3bd7b027dac5ca579271530cb7af4152a15dda3 Mon Sep 17 00:00:00 2001 From: Dinesh Kumar Sutihar Date: Tue, 11 Mar 2025 02:00:42 +0530 Subject: [PATCH 2/4] fix: prompt modification and unrequired packeage removed --- backend/package-lock.json | 183 +------------------------------------ backend/package.json | 6 +- backend/src/routes/chat.ts | 2 +- 3 files changed, 3 insertions(+), 188 deletions(-) diff --git a/backend/package-lock.json b/backend/package-lock.json index 5cc8d6ae..296bddcb 100644 --- a/backend/package-lock.json +++ b/backend/package-lock.json @@ -10,17 +10,13 @@ "license": "ISC", "dependencies": { "@google/generative-ai": "^0.24.0", - "axios": "^1.7.9", "cors": "^2.8.5", "csv-parse": "^5.6.0", "dotenv": "^16.4.7", "express": "^4.21.2", - "fs-extra": "^11.3.0", "grok-js": "^3.3.1", "mongoose": "^8.10.1", - "multer": "^1.4.5-lts.1", - "readline": "^1.3.0", - "ws": "^8.18.0" + "multer": "^1.4.5-lts.1" }, "devDependencies": { "@types/cors": "^2.8.17", @@ -377,23 +373,6 @@ "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", "license": "MIT" }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "license": "MIT" - }, - "node_modules/axios": { - "version": "1.8.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.8.4.tgz", - "integrity": "sha512-eBSYY4Y68NNlHbHBMdeDmKNtDgXWhQsJcGqzO3iLUM0GraQFSS9cVgPX5I9b3lbdFKyYoAEGAZF1DwhTaljNAw==", - "license": "MIT", - "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -624,18 +603,6 @@ "dev": true, "license": "MIT" }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "license": "MIT", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -761,15 +728,6 @@ "ms": "2.0.0" } }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -877,21 +835,6 @@ "node": ">= 0.4" } }, - "node_modules/es-set-tostringtag": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", - "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/escalade": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", @@ -994,41 +937,6 @@ "node": ">= 0.8" } }, - "node_modules/follow-redirects": { - "version": "1.15.9", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", - "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "license": "MIT", - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/form-data": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz", - "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==", - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -1047,20 +955,6 @@ "node": ">= 0.6" } }, - "node_modules/fs-extra": { - "version": "11.3.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.0.tgz", - "integrity": "sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==", - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", @@ -1157,12 +1051,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "license": "ISC" - }, "node_modules/grok-js": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/grok-js/-/grok-js-3.3.1.tgz", @@ -1230,21 +1118,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "license": "MIT", - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/hasown": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", @@ -1369,18 +1242,6 @@ "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", "license": "MIT" }, - "node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "license": "MIT", - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, "node_modules/kareem": { "version": "2.6.3", "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.6.3.tgz", @@ -1856,12 +1717,6 @@ "node": ">= 0.10" } }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "license": "MIT" - }, "node_modules/pstree.remy": { "version": "1.1.8", "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", @@ -1951,12 +1806,6 @@ "node": ">=8.10.0" } }, - "node_modules/readline": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/readline/-/readline-1.3.0.tgz", - "integrity": "sha512-k2d6ACCkiNYz222Fs/iNze30rRJ1iIicW7JuX/7/cozvih6YCkFZH+J6mAFDVgv0dRBaAyr4jDqC95R2y4IADg==", - "license": "BSD" - }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -2417,15 +2266,6 @@ "dev": true, "license": "MIT" }, - "node_modules/universalify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", - "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", - "license": "MIT", - "engines": { - "node": ">= 10.0.0" - } - }, "node_modules/unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", @@ -2512,27 +2352,6 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/ws": { - "version": "8.18.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.1.tgz", - "integrity": "sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==", - "license": "MIT", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, "node_modules/xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", diff --git a/backend/package.json b/backend/package.json index 147e06d8..0333d02b 100644 --- a/backend/package.json +++ b/backend/package.json @@ -14,17 +14,13 @@ "license": "ISC", "dependencies": { "@google/generative-ai": "^0.24.0", - "axios": "^1.7.9", "cors": "^2.8.5", "csv-parse": "^5.6.0", "dotenv": "^16.4.7", "express": "^4.21.2", - "fs-extra": "^11.3.0", "grok-js": "^3.3.1", "mongoose": "^8.10.1", - "multer": "^1.4.5-lts.1", - "readline": "^1.3.0", - "ws": "^8.18.0" + "multer": "^1.4.5-lts.1" }, "devDependencies": { "@types/cors": "^2.8.17", diff --git a/backend/src/routes/chat.ts b/backend/src/routes/chat.ts index 15043dd5..bd83b258 100644 --- a/backend/src/routes/chat.ts +++ b/backend/src/routes/chat.ts @@ -31,7 +31,7 @@ const getSeverityPrompt = (line: string, userText?: string) => { if (userText) { prompt += `\nUser's additional question: "${userText}"`; } - prompt += `\n\nPlease provide a detailed analysis of the log and give answer in step wise. and your answer should not exceed more than 500 words.`; + prompt += `\n\nPlease provide a detailed analysis of the log and fix if required and give answer in step wise.`; return prompt; }; From c4d2abf4f45799e12fcb54f18989bc5628013852 Mon Sep 17 00:00:00 2001 From: Dinesh Kumar Sutihar Date: Fri, 4 Apr 2025 03:51:37 +0530 Subject: [PATCH 3/4] refactor: Unified log for parsing all types of os and all the fetching are changed --- backend/src/models/UnifiedLogModel.ts | 95 ++++++++++++++++++++++ backend/src/routes/getAllLogs.ts | 20 ++--- backend/src/routes/getLogAnalytics.ts | 8 +- backend/src/routes/getStats.ts | 7 +- backend/src/routes/logTypeStatus.ts | 11 +-- backend/src/routes/severityInfo.ts | 17 ++-- backend/src/routes/upload.ts | 7 +- backend/src/utils/authlogParser.ts | 26 +++--- backend/src/utils/genericLinuxLogParser.ts | 38 ++++----- backend/src/utils/kernellogParser.ts | 48 +++++------ backend/src/utils/parse-window.ts | 29 +++++-- 11 files changed, 200 insertions(+), 106 deletions(-) create mode 100644 backend/src/models/UnifiedLogModel.ts diff --git a/backend/src/models/UnifiedLogModel.ts b/backend/src/models/UnifiedLogModel.ts new file mode 100644 index 00000000..425f1e92 --- /dev/null +++ b/backend/src/models/UnifiedLogModel.ts @@ -0,0 +1,95 @@ +import mongoose, { Document, Schema } from "mongoose"; + +type OperatingSystem = "Linux" | "Windows"; + +export interface UnifiedLogModelType { + operatingSystem: OperatingSystem; + + severity: "INFO" | "WARNING" | "ERROR" | "CRITICAL"; + timestamp: Date; + + eventId: string | number; + message: string; + uploadDate: Date; + analyzed: boolean; + rawLine?: string; + + logType: "WINDOWS" | "SYSLOG" | "AUTH" | "KERNEL" | "APPLICATION" | "UNKNOWN" | `UNKNOWN-${string}`; + processId?: number | string; + userId?: string; + users?: string[]; + + source?: string; + taskCategory?: string; +} + +const UnifiedLogSchema = new Schema({ + operatingSystem: { + type: String, + enum: ["Linux", "Windows"], + required: true, + }, + + severity: { + type: String, + enum: ["INFO", "WARNING", "ERROR", "CRITICAL"], + required: true, + }, + timestamp: { + type: Date, + required: true, + }, + eventId: { + type: Schema.Types.Mixed, + required: true, + }, + message: { + type: String, + required: true, + }, + uploadDate: { + type: Date, + required: true, + }, + analyzed: { + type: Boolean, + required: true, + }, + rawLine: { + type: String, + required: true, + }, + logType: { + type: String, + required: true, + validate: { + validator: function (v: string) { + return ["WINDOWS", "SYSLOG", "AUTH", "KERNEL", "APPLICATION", "UNKNOWN"].includes(v) || v.startsWith("UNKNOWN-"); + }, + message: (props: any) => `${props.value} is not a valid logType!`, + }, + }, + processId: { + type: Schema.Types.Mixed, + }, + userId: { + type: String, + }, + users: [ + { + type: [String], + default: [], + }, + ], + source: { + type: String, + }, + taskCategory: { + type: String, + }, +}); + +export default mongoose.model( + "UnifiedLog", + UnifiedLogSchema +); diff --git a/backend/src/routes/getAllLogs.ts b/backend/src/routes/getAllLogs.ts index 23c62634..6e1b5a4b 100644 --- a/backend/src/routes/getAllLogs.ts +++ b/backend/src/routes/getAllLogs.ts @@ -1,37 +1,35 @@ import express from 'express'; -import { WindowsLogModel } from '../models/LogWindowModel'; -import { LinuxLogModel } from '../models/LinuxLogModel'; +import UnifiedLogModel from '../models/UnifiedLogModel'; const app = express.Router(); app.get('/winlogs', async (req, res) => { - const logs = await WindowsLogModel.find().limit(100); + const logs = await UnifiedLogModel.find({ source: 'WINDOWS' }).limit(100); res.json(logs); }); + app.get('/linlogs', async (req, res) => { - const logs = await LinuxLogModel.find().limit(100); + const logs = await UnifiedLogModel.find({ source: 'LINUX' }).limit(100); res.json(logs); }); app.get('/kernellogs', async (req, res) => { - const logs = await LinuxLogModel.find({ logType: 'KERNEL' }).limit(100); + const logs = await UnifiedLogModel.find({ source: 'LINUX', logType: 'KERNEL' }).limit(100); res.json(logs); }); app.get('/syslogs', async (req, res) => { - const logs = await LinuxLogModel.find({ logType: 'SYSLOG' }).limit(100); + const logs = await UnifiedLogModel.find({ source: 'LINUX', logType: 'SYSLOG' }).limit(100); res.json(logs); }); app.get('/authlogs', async (req, res) => { - const logs = await LinuxLogModel.find({ logType: 'AUTH' }).limit(100); + const logs = await UnifiedLogModel.find({ source: 'LINUX', logType: 'AUTH' }).limit(100); res.json(logs); }); app.get('/unknownlogs', async (req, res) => { - const logs = await LinuxLogModel.find({ logType: { $regex: 'UNKNOWN' } }).limit(100); + const logs = await UnifiedLogModel.find({ source: 'LINUX', logType: { $regex: 'UNKNOWN' } }).limit(100); res.json(logs); }); - - -export default app; \ No newline at end of file +export default app; diff --git a/backend/src/routes/getLogAnalytics.ts b/backend/src/routes/getLogAnalytics.ts index 49fcc54e..cef53c8c 100644 --- a/backend/src/routes/getLogAnalytics.ts +++ b/backend/src/routes/getLogAnalytics.ts @@ -1,18 +1,19 @@ import express from 'express'; import { Request, Response } from 'express'; -import { LinuxLogModel } from '../models/LinuxLogModel'; +import UnifiedLogModel from '../models/UnifiedLogModel'; const router = express.Router(); router.get('/getLogAnalytics', async (req: Request, res: Response) => { try { - const logs = await LinuxLogModel.find({}).sort({ timestamp: -1 }).limit(1000); // Fetch the latest 10 logs + + const logs = await UnifiedLogModel.find({}).sort({ timestamp: -1 }).limit(1000); // Fetch the latest 1000 logs const rows = logs.map(log => ({ id: log._id, timeStamp: log.timestamp.toUTCString(), severity: log.severity, - users: log.users ? log.users : "N/A", + users: log.users ? log.users : "guest", rawLine: log.rawLine, message: log.message, uploadDate: log.uploadDate ? log.uploadDate.toISOString() : null, @@ -20,7 +21,6 @@ router.get('/getLogAnalytics', async (req: Request, res: Response) => { EventId: log.eventId, logType: log.logType, })); - res.json(rows); } catch (error) { diff --git a/backend/src/routes/getStats.ts b/backend/src/routes/getStats.ts index 9084ff80..96496eca 100644 --- a/backend/src/routes/getStats.ts +++ b/backend/src/routes/getStats.ts @@ -1,6 +1,7 @@ import express from 'express'; import { Request, Response } from 'express'; import { LinuxLogModel } from '../models/LinuxLogModel'; +import UnifiedLogModel from '../models/UnifiedLogModel'; const router = express.Router(); @@ -9,7 +10,7 @@ router.get('/stats', async (req: Request, res: Response) => { const startDate = new Date(); startDate.setDate(startDate.getDate() - 90); // 90 days ago - const totalLogsAgg = await LinuxLogModel.aggregate([ + const totalLogsAgg = await UnifiedLogModel.aggregate([ { $match: { timestamp: { $gte: startDate } } }, @@ -32,7 +33,7 @@ router.get('/stats', async (req: Request, res: Response) => { } ]); - const errorLogsAgg = await LinuxLogModel.aggregate([ + const errorLogsAgg = await UnifiedLogModel.aggregate([ { $match: { timestamp: { $gte: startDate }, @@ -58,7 +59,7 @@ router.get('/stats', async (req: Request, res: Response) => { } ]); - const warningLogsAgg = await LinuxLogModel.aggregate([ + const warningLogsAgg = await UnifiedLogModel.aggregate([ { $match: { timestamp: { $gte: startDate }, diff --git a/backend/src/routes/logTypeStatus.ts b/backend/src/routes/logTypeStatus.ts index 0531b5ca..37363177 100644 --- a/backend/src/routes/logTypeStatus.ts +++ b/backend/src/routes/logTypeStatus.ts @@ -1,16 +1,17 @@ import express from 'express'; import { Request, Response } from 'express'; import { LinuxLogModel } from '../models/LinuxLogModel'; +import UnifiedLogModel from '../models/UnifiedLogModel'; const router = express.Router(); router.get('/logtypeStatus', async (req: Request, res: Response) => { try { - const syslogCount = await LinuxLogModel.countDocuments({ logType: 'SYSLOG' }); - const windowlogCount = await LinuxLogModel.countDocuments({ logType: 'WINDOWLOG' }); - const authlogCount = await LinuxLogModel.countDocuments({ logType: 'AUTH' }); - const kernelCount = await LinuxLogModel.countDocuments({ logType: 'KERNEL' }); - const unknownCount = await LinuxLogModel.countDocuments({ logType: { $regex: 'UNKNOWN' } }); + const syslogCount = await UnifiedLogModel.countDocuments({ logType: 'SYSLOG' }); + const windowlogCount = await UnifiedLogModel.countDocuments({ logType: 'WINDOWS' }); + const authlogCount = await UnifiedLogModel.countDocuments({ logType: 'AUTH' }); + const kernelCount = await UnifiedLogModel.countDocuments({ logType: 'KERNEL' }); + const unknownCount = await UnifiedLogModel.countDocuments({ logType: { $regex: 'UNKNOWN' } }); const data = [ { label: "SYSLOG", value: syslogCount }, diff --git a/backend/src/routes/severityInfo.ts b/backend/src/routes/severityInfo.ts index bd65113a..d2dd9a8a 100644 --- a/backend/src/routes/severityInfo.ts +++ b/backend/src/routes/severityInfo.ts @@ -1,13 +1,6 @@ -// total no of each severity "INFO" | "WARNING" | "ERROR" | "CRITICAL" and from last 7 months count for each severity in following format const [logData, setLogData] = React.useState({ -// info: [0, 0, 0, 0, 0, 0, 0], -// warning: [0, 0, 0, 0, 0, 0, 0], -// error: [0, 0, 0, 0, 0, 0, 0], -// critical: [0, 0, 0, 0, 0, 0, 0], -// }); - import express from 'express'; import { Request, Response } from 'express'; -import { LinuxLogModel } from '../models/LinuxLogModel'; +import UnifiedLogModel from '../models/UnifiedLogModel'; const router = express.Router(); @@ -31,22 +24,22 @@ router.get('/severityInfo', async (req: Request, res: Response) => { monthEnd.setDate(0); monthEnd.setHours(23, 59, 59, 999); - info[6 - i] = await LinuxLogModel.countDocuments({ + info[6 - i] = await UnifiedLogModel.countDocuments({ severity: 'INFO', timestamp: { $gte: monthStart, $lte: monthEnd } }); - warning[6 - i] = await LinuxLogModel.countDocuments({ + warning[6 - i] = await UnifiedLogModel.countDocuments({ severity: 'WARNING', timestamp: { $gte: monthStart, $lte: monthEnd } }); - error[6 - i] = await LinuxLogModel.countDocuments({ + error[6 - i] = await UnifiedLogModel.countDocuments({ severity: 'ERROR', timestamp: { $gte: monthStart, $lte: monthEnd } }); - critical[6 - i] = await LinuxLogModel.countDocuments({ + critical[6 - i] = await UnifiedLogModel.countDocuments({ severity: 'CRITICAL', timestamp: { $gte: monthStart, $lte: monthEnd } }); diff --git a/backend/src/routes/upload.ts b/backend/src/routes/upload.ts index ce74e55f..e8e6502a 100644 --- a/backend/src/routes/upload.ts +++ b/backend/src/routes/upload.ts @@ -4,6 +4,7 @@ import { parseAllLinuxLog } from "../utils/logParser"; import { parseWindowsEventLogCsv } from "../utils/parse-window"; import { WindowsLogModel } from "../models/LogWindowModel"; import { LinuxLogModel, LinuxLogModelType } from "../models/LinuxLogModel"; +import UnifiedLogModel, { UnifiedLogModelType } from "../models/UnifiedLogModel"; const router = Router(); const upload = multer({ storage: multer.memoryStorage() }); @@ -22,10 +23,10 @@ router.post("/upload", upload.single("logfile"), async (req: Request, res: Respo try { if (fileName.endsWith(".csv")) { let logDocument = await parseWindowsEventLogCsv(fileBuffer); - await WindowsLogModel.insertMany(logDocument); + await UnifiedLogModel.insertMany(logDocument); } else if (fileName.endsWith(".log")) { - const parseResult: LinuxLogModelType[] = await parseAllLinuxLog(fileBuffer.toString(), source); - await LinuxLogModel.insertMany(parseResult); + const parseResult: UnifiedLogModelType[] = await parseAllLinuxLog(fileBuffer.toString(), source); + await UnifiedLogModel.insertMany(parseResult); } else { res.status(400).json({ error: "Unsupported file type" }); return; diff --git a/backend/src/utils/authlogParser.ts b/backend/src/utils/authlogParser.ts index ec878bde..3eca8e92 100644 --- a/backend/src/utils/authlogParser.ts +++ b/backend/src/utils/authlogParser.ts @@ -1,7 +1,7 @@ import { loadDefaultSync, GrokCollection, GrokPattern } from 'grok-js'; import readline from "readline"; import { Readable } from "stream"; -import { type LinuxLogModelType } from "../models/LinuxLogModel"; +import { UnifiedLogModelType } from "../models/UnifiedLogModel"; import { inferSeverity } from './severityInfer'; const grokCollection: GrokCollection = loadDefaultSync(); @@ -10,7 +10,7 @@ const authLogPattern = '%{TIMESTAMP_ISO8601:timestamp} %{USERNAME:userId} %{NOTS const customPatterns = { 'NOTSPACE': '\\S+', 'USERNAME': '[a-zA-Z0-9._-]+', -} +}; for (const [name, pattern] of Object.entries(customPatterns)) { grokCollection.createPattern(`${name} ${pattern}`); @@ -18,30 +18,34 @@ for (const [name, pattern] of Object.entries(customPatterns)) { const grokPatter: GrokPattern = grokCollection.createPattern(authLogPattern); -// Example auth.log format: -// 2025-02-16T11:49:52.376716+00:00 Dinesh login[315]: PAM unable to dlopen(pam_lastlog.so): /usr/lib/security/pam_lastlog.so: cannot open shared object file: No such file or directory -export default async function parseAuthLogFile(data: string): Promise { - - const entries: LinuxLogModelType[] = []; +/** + * Example auth.log format: + * 2025-02-16T11:49:52.376716+00:00 Dinesh login[315]: PAM unable to dlopen(pam_lastlog.so): /usr/lib/security/pam_lastlog.so: cannot open shared object file: No such file or directory + */ +export default async function parseAuthLogFile(data: string): Promise { + const entries: UnifiedLogModelType[] = []; const fileStream = Readable.from(data); const rl = readline.createInterface({ input: fileStream }); for await (const line of rl) { const parsedEntry = grokPatter.parseSync(line); - const entry: LinuxLogModelType = { + const entry: UnifiedLogModelType = { + operatingSystem: "Linux", logType: 'AUTH', timestamp: new Date(parsedEntry.timestamp || ''), eventId: parsedEntry.eventId || 'unknown', - message: parsedEntry.message?.trim() || '', + message: (parsedEntry.message || '').trim(), rawLine: line, userId: parsedEntry.userId, processId: parsedEntry.processId ? parseInt(parsedEntry.processId) : undefined, severity: inferSeverity(parsedEntry.message), + uploadDate: new Date(), + analyzed: false }; - entries.push(entry); + entries.push(entry); } - return entries as LinuxLogModelType[]; + return entries; } diff --git a/backend/src/utils/genericLinuxLogParser.ts b/backend/src/utils/genericLinuxLogParser.ts index eec2e334..16baddf0 100644 --- a/backend/src/utils/genericLinuxLogParser.ts +++ b/backend/src/utils/genericLinuxLogParser.ts @@ -1,47 +1,41 @@ import { loadDefaultSync, GrokCollection, GrokPattern } from 'grok-js'; import readline from "readline"; import { Readable } from "stream"; -import { type LinuxLogModelType } from "../models/LinuxLogModel"; +import UnifiedLogSchema from "../models/UnifiedLogModel"; +import { UnifiedLogModelType } from "../models/UnifiedLogModel"; import { inferSeverity } from './severityInfer'; const grokCollection: GrokCollection = loadDefaultSync(); const authLogPattern = '%{TIMESTAMP_ISO8601:timestamp}|%{DATESTAMP:timestamp}|%{SYSLOGTIMESTAMP:timestamp} (?:%{SYSLOGHOST:userId})? (?:%{DATA:process}:)? %{GREEDYDATA:message}'; -// const customPatterns = { -// 'NOTSPACE': '\\S+', -// 'USERNAME': '[a-zA-Z0-9._-]+', -// } - -// for (const [name, pattern] of Object.entries(customPatterns)) { -// grokCollection.createPattern(`${name} ${pattern}`); -// } - const grokPatter: GrokPattern = grokCollection.createPattern(authLogPattern); -// Default Linux Unknown format example: -// "Jun 14 15:16:01 combo sshd(pam_unix)[19939]: authentication failure; logname= uid=0 euid=0 tty=NODEVssh ruser= rhost=218.188.2.4" -export default async function parseGenericLogs(data: string, source:string): Promise { - - const entries: LinuxLogModelType[] = []; +export default async function parseGenericLogs(data: string, source: string): Promise { + const entries: UnifiedLogModelType[] = []; const fileStream = Readable.from(data); const rl = readline.createInterface({ input: fileStream }); for await (const line of rl) { const parsedEntry = grokPatter.parseSync(line); - const entry: LinuxLogModelType = { - logType: `UNKNOWN-${source}` as "UNKNOWN", + const entry: UnifiedLogModelType = { + operatingSystem: "Linux", + + severity: inferSeverity(parsedEntry.message), timestamp: new Date(parsedEntry.timestamp || ''), eventId: parsedEntry.eventId || 'unknown', - message: parsedEntry.message?.trim() || '', + message: (parsedEntry.message || '').trim(), + uploadDate: new Date(), + analyzed: false, + + logType: `UNKNOWN-${source}` as "UNKNOWN" | `UNKNOWN-${string}`, rawLine: line, - userId: parsedEntry.userId, processId: parsedEntry.process, - severity: inferSeverity(parsedEntry.message), + userId: parsedEntry.userId, }; - entries.push(entry); + entries.push(entry); } - return entries as LinuxLogModelType[]; + return entries; } diff --git a/backend/src/utils/kernellogParser.ts b/backend/src/utils/kernellogParser.ts index acfd0ac9..eb7ad58f 100644 --- a/backend/src/utils/kernellogParser.ts +++ b/backend/src/utils/kernellogParser.ts @@ -1,28 +1,21 @@ import { loadDefaultSync, GrokCollection } from 'grok-js'; import readline from "readline"; import { Readable } from "stream"; -import { type LinuxLogModelType } from "../models/LinuxLogModel"; +import { UnifiedLogModelType } from "../models/UnifiedLogModel"; import { inferSeverity } from './severityInfer'; - - -// Define type for raw parsed fields interface GrokParseResult { timestamp?: string; userId?: string; + eventId?: string; message?: string; + fullMessage?: string; } - -// Add custom patterns safely -const grokCollection = loadDefaultSync(); +const grokCollection: GrokCollection = loadDefaultSync(); const customPatterns = { - // 'NOTSPACE': '\\S+', 'USERNAME': '[a-zA-Z0-9._-]+', 'KERNEL_EVENT': '[A-Za-z0-9_\\[\\]]+', - // 'AUDIT_HEADER': 'audit: type=%{NUMBER:audit_type} audit\\(%{NUMBER:audit_epoch}\\.%{NUMBER:audit_sequence}\\):', - // 'AUDIT_FIELD': '(\\w+="?[^"]*"?|\\w+=\\S+)', - -} +}; for (const [name, pattern] of Object.entries(customPatterns)) { grokCollection.createPattern(`${name} ${pattern}`); @@ -37,15 +30,15 @@ const KERNEL_PATTERN = [ const kernelParser = grokCollection.createPattern(KERNEL_PATTERN); -export default async function parseKernelLogFile(data: string, source: string): Promise { +export default async function parseKernelLogFile(data: string, source: string): Promise { + const logType = source.toLowerCase() === 'kernel.log' ? 'KERNEL' : 'SYSLOG'; - const entries: LinuxLogModelType[] = []; + const entries: UnifiedLogModelType[] = []; const rl = readline.createInterface({ input: Readable.from(data), - crlfDelay: Infinity + crlfDelay: Infinity, }); - for await (const line of rl) { if (!line.trim()) continue; @@ -59,7 +52,7 @@ export default async function parseKernelLogFile(data: string, source: string): return entries; } -function createLogEntry(rawLine: string, parsed: GrokParseResult, logType: string): LinuxLogModelType | null { +function createLogEntry(rawLine: string, parsed: GrokParseResult, logType: string): UnifiedLogModelType | null { if (!parsed.timestamp || !parsed.userId) { console.warn('Invalid log entry - missing timestamp or userId'); return null; @@ -68,39 +61,42 @@ function createLogEntry(rawLine: string, parsed: GrokParseResult, logType: strin const { eventId, message } = processMessageComponents(parsed); return { - logType: `${logType}` as "KERNEL" | "SYSLOG", + operatingSystem: "Linux", + logType: logType as "KERNEL" | "SYSLOG", timestamp: new Date(parsed.timestamp), severity: inferSeverity(message), eventId: eventId || 'NoEvent', message: message || 'No Description', userId: parsed.userId, - rawLine: rawLine + rawLine: rawLine, + uploadDate: new Date(), + analyzed: false, }; } -function processMessageComponents(parsed: any): { eventId: string, message: string } { +function processMessageComponents(parsed: GrokParseResult): { eventId: string, message: string } { // Case 1: Structured message with event ID if (parsed.eventId && parsed.message) { return { eventId: parsed.eventId.trim(), - message: parsed.message.trim() + message: parsed.message.trim(), }; } - // Case 2: Unstructured message - const rawMessage = parsed.fullMessage?.trim() || parsed.message?.trim() || ''; + // Case 2: Unstructured message - attempt to split on the first colon. + const rawMessage = (parsed.fullMessage?.trim() || parsed.message?.trim() || ''); const firstColonIndex = rawMessage.indexOf(':'); if (firstColonIndex > -1) { return { eventId: rawMessage.substring(0, firstColonIndex).trim(), - message: rawMessage.substring(firstColonIndex + 1).trim() + message: rawMessage.substring(firstColonIndex + 1).trim(), }; } - // Case 3: No discernible event ID + // Case 3: No discernible event ID; use raw message. return { eventId: 'NoEvent', - message: rawMessage + message: rawMessage, }; } diff --git a/backend/src/utils/parse-window.ts b/backend/src/utils/parse-window.ts index 5a9d8c10..5af32c0a 100644 --- a/backend/src/utils/parse-window.ts +++ b/backend/src/utils/parse-window.ts @@ -1,5 +1,5 @@ import { parse } from "csv-parse"; -import { WindowsLog } from "../models/LogWindowModel"; +import { UnifiedLogModelType } from "../models/UnifiedLogModel"; function mapSeverity(level: string): "INFO" | "WARNING" | "ERROR" | "CRITICAL" { const levelMap: Record = { @@ -11,7 +11,7 @@ function mapSeverity(level: string): "INFO" | "WARNING" | "ERROR" | "CRITICAL" { return levelMap[level] || "INFO"; } -export async function parseWindowsEventLogCsv(csvBuffer: Buffer): Promise { +export async function parseWindowsEventLogCsv(csvBuffer: Buffer): Promise { return new Promise((resolve, reject) => { const columns = ["Level", "Date and Time", "Source", "Event ID", "Task Category", "Message"]; @@ -27,18 +27,29 @@ export async function parseWindowsEventLogCsv(csvBuffer: Buffer): Promise i !== 0) - .map((row) => ({ + const validRows = rows.filter(row => row["Date and Time"] !== "Date and Time"); + + const entries: UnifiedLogModelType[] = validRows.map(row => { + let ts = new Date(row["Date and Time"]); + if (isNaN(ts.getTime())) { + console.warn(`Invalid date "${row["Date and Time"]}" - defaulting to current date`); + ts = new Date(); + } + + return { + operatingSystem: "Windows", severity: mapSeverity(row["Level"] || "Information"), - timestamp: new Date(row["Date and Time"] || ""), - source: row["Source"] || "", + timestamp: ts, + logType: "WINDOWS", eventId: Number(row["Event ID"]) || 0, + message: row["Message"] && row["Message"].trim() !== "" ? row["Message"].trim() : "No description provided", + rawLine: Object.values(row).join(", "), + source: row["Source"] || "", taskCategory: row["Task Category"] || "", - message: row["Message"] || "", uploadDate: new Date(), analyzed: false, - })); + }; + }); resolve(entries); } From d56f404626fc407a5427cbad371bf5625cad0068 Mon Sep 17 00:00:00 2001 From: Dinesh Kumar Sutihar Date: Fri, 4 Apr 2025 03:52:04 +0530 Subject: [PATCH 4/4] fix: fixes minor bug --- backend/src/routes/chat.ts | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/backend/src/routes/chat.ts b/backend/src/routes/chat.ts index bd83b258..7263ba2f 100644 --- a/backend/src/routes/chat.ts +++ b/backend/src/routes/chat.ts @@ -1,13 +1,14 @@ import express from 'express'; import { Request, Response } from 'express'; -import { LinuxLogModel } from '../models/LinuxLogModel'; import { GoogleGenerativeAI } from '@google/generative-ai'; import dotenv from 'dotenv'; +import UnifiedLogModel from '../models/UnifiedLogModel'; dotenv.config(); const router = express.Router(); router.use(express.json()); +router.use(express.urlencoded({ extended: true })); if (!process.env.GOOGLE_API_KEY) { throw new Error('Missing GOOGLE_API_KEY in environment variables'); @@ -31,31 +32,27 @@ const getSeverityPrompt = (line: string, userText?: string) => { if (userText) { prompt += `\nUser's additional question: "${userText}"`; } - prompt += `\n\nPlease provide a detailed analysis of the log and fix if required and give answer in step wise.`; + prompt += `\n\nPlease provide a detailed analysis of the log and fix if required and give answer in step wise. and answer should be in a simple language which can be easy to understand and also don't give too long response give accurate and point to point.`; return prompt; }; router.post('/chat', async (req: Request, res: Response): Promise => { - console.log("Received request body:", req.body); const { logId, userText } = req.body; - console.log("Received logId:", logId); - console.log("Received userText:", userText); if (!logId) { - console.log("logId is missing in the request body."); res.status(400).json({ error: "logId is required." }); } try { - const rowLog = await LinuxLogModel.findById(logId); + const rowLog = await UnifiedLogModel.findById({ _id: logId }); if (!rowLog) { res.status(404).json({ error: "Log not found." }); return; } - const prompt = getSeverityPrompt(rowLog.rawLine, userText); + const prompt = getSeverityPrompt(rowLog.rawLine || "", userText); const response = await model.generateContent(prompt); const generatedText = response.response.text();