diff --git a/package-lock.json b/package-lock.json index 9da2e1c..ef9cec0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,17 +11,15 @@ "@emotion/react": "^11.13.3", "@emotion/styled": "^11.13.0", "@fontsource/roboto": "^5.1.0", - "@mui/icons-material": "^6.1.7", + "@mui/icons-material": "^6.1.8", "@mui/lab": "^6.0.0-beta.15", "@mui/material": "^6.1.7", - "@mui/x-date-pickers": "^7.22.2", + "@mui/x-date-pickers": "^7.22.3", "@zl-asica/react": "^0.3.4", - "date-fns": "^4.1.0", + "dayjs": "^1.11.13", "es-toolkit": "^1.27.0", "firebase": "^11.0.2", - "moment": "^2.30.1", "react": "^18.3.1", - "react-big-calendar": "^1.15.0", "react-dom": "^18.3.1", "react-router-dom": "^6.28.0" }, @@ -117,6 +115,13 @@ "url": "https://opencollective.com/babel" } }, + "node_modules/@babel/core/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, "node_modules/@babel/core/node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -367,16 +372,16 @@ } }, "node_modules/@emotion/babel-plugin": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.12.0.tgz", - "integrity": "sha512-y2WQb+oP8Jqvvclh8Q55gLUyb7UFvgv7eJfsj7td5TToBrIUtPay2kMrZi4xjq9qw2vD0ZR5fSho0yqoFgX7Rw==", + "version": "11.13.5", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.13.5.tgz", + "integrity": "sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ==", "license": "MIT", "dependencies": { "@babel/helper-module-imports": "^7.16.7", "@babel/runtime": "^7.18.3", "@emotion/hash": "^0.9.2", "@emotion/memoize": "^0.9.0", - "@emotion/serialize": "^1.2.0", + "@emotion/serialize": "^1.3.3", "babel-plugin-macros": "^3.1.0", "convert-source-map": "^1.5.0", "escape-string-regexp": "^4.0.0", @@ -385,21 +390,15 @@ "stylis": "4.2.0" } }, - "node_modules/@emotion/babel-plugin/node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "license": "MIT" - }, "node_modules/@emotion/cache": { - "version": "11.13.1", - "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.13.1.tgz", - "integrity": "sha512-iqouYkuEblRcXmylXIwwOodiEK5Ifl7JcX7o6V4jI3iW4mLXX3dmt5xwBtIkJiQEXFAI+pC8X0i67yiPkH9Ucw==", + "version": "11.13.5", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.13.5.tgz", + "integrity": "sha512-Z3xbtJ+UcK76eWkagZ1onvn/wAVb1GOMuR15s30Fm2wrMgC7jzpnO2JZXr4eujTTqoQFUrZIw/rT0c6Zzjca1g==", "license": "MIT", "dependencies": { "@emotion/memoize": "^0.9.0", "@emotion/sheet": "^1.4.0", - "@emotion/utils": "^1.4.0", + "@emotion/utils": "^1.4.2", "@emotion/weak-memoize": "^0.4.0", "stylis": "4.2.0" } @@ -426,17 +425,17 @@ "license": "MIT" }, "node_modules/@emotion/react": { - "version": "11.13.3", - "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.13.3.tgz", - "integrity": "sha512-lIsdU6JNrmYfJ5EbUCf4xW1ovy5wKQ2CkPRM4xogziOxH1nXxBSjpC9YqbFAP7circxMfYp+6x676BqWcEiixg==", + "version": "11.13.5", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.13.5.tgz", + "integrity": "sha512-6zeCUxUH+EPF1s+YF/2hPVODeV/7V07YU5x+2tfuRL8MdW6rv5vb2+CBEGTGwBdux0OIERcOS+RzxeK80k2DsQ==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.18.3", - "@emotion/babel-plugin": "^11.12.0", - "@emotion/cache": "^11.13.0", - "@emotion/serialize": "^1.3.1", + "@emotion/babel-plugin": "^11.13.5", + "@emotion/cache": "^11.13.5", + "@emotion/serialize": "^1.3.3", "@emotion/use-insertion-effect-with-fallbacks": "^1.1.0", - "@emotion/utils": "^1.4.0", + "@emotion/utils": "^1.4.2", "@emotion/weak-memoize": "^0.4.0", "hoist-non-react-statics": "^3.3.1" }, @@ -450,15 +449,15 @@ } }, "node_modules/@emotion/serialize": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.3.2.tgz", - "integrity": "sha512-grVnMvVPK9yUVE6rkKfAJlYZgo0cu3l9iMC77V7DW6E1DUIrU68pSEXRmFZFOFB1QFo57TncmOcvcbMDWsL4yA==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.3.3.tgz", + "integrity": "sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA==", "license": "MIT", "dependencies": { "@emotion/hash": "^0.9.2", "@emotion/memoize": "^0.9.0", "@emotion/unitless": "^0.10.0", - "@emotion/utils": "^1.4.1", + "@emotion/utils": "^1.4.2", "csstype": "^3.0.2" } }, @@ -469,17 +468,17 @@ "license": "MIT" }, "node_modules/@emotion/styled": { - "version": "11.13.0", - "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.13.0.tgz", - "integrity": "sha512-tkzkY7nQhW/zC4hztlwucpT8QEZ6eUzpXDRhww/Eej4tFfO0FxQYWRyg/c5CCXa4d/f174kqeXYjuQRnhzf6dA==", + "version": "11.13.5", + "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.13.5.tgz", + "integrity": "sha512-gnOQ+nGLPvDXgIx119JqGalys64lhMdnNQA9TMxhDA4K0Hq5+++OE20Zs5GxiCV9r814xQ2K5WmtofSpHVW6BQ==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.18.3", - "@emotion/babel-plugin": "^11.12.0", + "@emotion/babel-plugin": "^11.13.5", "@emotion/is-prop-valid": "^1.3.0", - "@emotion/serialize": "^1.3.0", + "@emotion/serialize": "^1.3.3", "@emotion/use-insertion-effect-with-fallbacks": "^1.1.0", - "@emotion/utils": "^1.4.0" + "@emotion/utils": "^1.4.2" }, "peerDependencies": { "@emotion/react": "^11.0.0-rc.0", @@ -507,9 +506,9 @@ } }, "node_modules/@emotion/utils": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.4.1.tgz", - "integrity": "sha512-BymCXzCG3r72VKJxaYVwOXATqXIZ85cuvg0YOUDxMGNrKc1DJRZk8MgV5wyXRyEayIMd4FuXJIUgTBXvDNW5cA==", + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.4.2.tgz", + "integrity": "sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA==", "license": "MIT" }, "node_modules/@emotion/weak-memoize": { @@ -928,6 +927,19 @@ "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, "node_modules/@eslint-community/regexpp": { "version": "4.12.1", "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", @@ -939,9 +951,9 @@ } }, "node_modules/@eslint/config-array": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.18.0.tgz", - "integrity": "sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw==", + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.19.0.tgz", + "integrity": "sha512-zdHg2FPIFNKPdcHWtiNT+jEFCHYVplAXRDlQDyqy0zGx/q2parwh7brGJSiTxRk/TSMkbM//zt/f5CHgyTyaSQ==", "dev": true, "license": "Apache-2.0", "peer": true, @@ -981,9 +993,9 @@ } }, "node_modules/@eslint/core": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.7.0.tgz", - "integrity": "sha512-xp5Jirz5DyPYlPiKat8jaq0EmYvDXKKpzTbxXMpT9eqlRJkRKIz9AGMdlvYjih+im+QlhWrpvVjl8IPC/lHlUw==", + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.9.0.tgz", + "integrity": "sha512-7ATR9F0e4W85D/0w7cU0SNj7qkAexMG+bAHEZOjo9akvGuhHE2m7umzWzfnpa0XAg5Kxc1BWmtPMV67jJ+9VUg==", "dev": true, "license": "Apache-2.0", "peer": true, @@ -992,9 +1004,9 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.1.0.tgz", - "integrity": "sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.2.0.tgz", + "integrity": "sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==", "dev": true, "license": "MIT", "peer": true, @@ -1057,9 +1069,9 @@ } }, "node_modules/@eslint/js": { - "version": "9.14.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.14.0.tgz", - "integrity": "sha512-pFoEtFWCPyDOl+C6Ift+wC7Ro89otjigCf5vcuWqWgqNSQbRrpjSvdeE6ofLz4dHmyxD5f7gIdGT4+p36L6Twg==", + "version": "9.15.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.15.0.tgz", + "integrity": "sha512-tMTqrY+EzbXmKJR5ToI8lxu7jaN5EdmrBFJpQk5JmSlyLsx6o4t27r883K5xsLuCYCpfKBCGswMSWXsM+jB7lg==", "dev": true, "license": "MIT", "peer": true, @@ -1893,15 +1905,15 @@ } }, "node_modules/@mui/base": { - "version": "5.0.0-beta.61", - "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.61.tgz", - "integrity": "sha512-YaMOTXS3ecDNGsPKa6UdlJ8loFLvcL9+VbpCK3hfk71OaNauZRp4Yf7KeXDYr7Ms3M/XBD3SaiR6JMr6vYtfDg==", + "version": "5.0.0-beta.62", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.62.tgz", + "integrity": "sha512-TzJLCNlrMkSU4bTCdTT+TVUiGx4sjZLhH673UV6YN+rNNP8wJpkWfRSvjDB5HcbH2T0lUamnz643ZnV+8IiMjw==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.26.0", "@floating-ui/react-dom": "^2.1.1", "@mui/types": "^7.2.19", - "@mui/utils": "^6.1.6", + "@mui/utils": "^6.1.8", "@popperjs/core": "^2.11.8", "clsx": "^2.1.1", "prop-types": "^15.8.1" @@ -1925,9 +1937,9 @@ } }, "node_modules/@mui/core-downloads-tracker": { - "version": "6.1.7", - "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-6.1.7.tgz", - "integrity": "sha512-POuIBi80BZBogQkG4PQKIGwy4QFwB+kOr+OI4k7Znh7LqMAIhwB9OC00l6M+w1GrZJYj3T8R5WX8G6QAIvoVEw==", + "version": "6.1.8", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-6.1.8.tgz", + "integrity": "sha512-TGAvzwUg9hybDacwfIGFjI2bXYXrIqky+vMfaeay8rvT56/PNAlvIDUJ54kpT5KRc9AWAihOvtDI7/LJOThOmQ==", "license": "MIT", "funding": { "type": "opencollective", @@ -1935,9 +1947,9 @@ } }, "node_modules/@mui/icons-material": { - "version": "6.1.7", - "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-6.1.7.tgz", - "integrity": "sha512-RGzkeHNArIVy5ZQ12bq/8VYNeICEyngngsFskTJ/2hYKhIeIII3iRGtaZaSvLpXh7h3Fg3VKTulT+QU0w5K4XQ==", + "version": "6.1.8", + "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-6.1.8.tgz", + "integrity": "sha512-6frsXcf1TcJKWevWwRup6V4L8lzI33cbHcAjT83YLgKw0vYRZKY0kjMI9fhrJZdRWXgFFgKKvEv3GjoxbqFF7A==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.26.0" @@ -1950,7 +1962,7 @@ "url": "https://opencollective.com/mui-org" }, "peerDependencies": { - "@mui/material": "^6.1.7", + "@mui/material": "^6.1.8", "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", "react": "^17.0.0 || ^18.0.0 || ^19.0.0" }, @@ -1961,16 +1973,16 @@ } }, "node_modules/@mui/lab": { - "version": "6.0.0-beta.15", - "resolved": "https://registry.npmjs.org/@mui/lab/-/lab-6.0.0-beta.15.tgz", - "integrity": "sha512-LwX34gdIBBpIHi0RkWUjktCnX1rEB+U2tOzDKfF2f4h+GXTO+DOjAXTkFw558zQ8SWmpQTOUp58sGRxlZ2x9FQ==", + "version": "6.0.0-beta.16", + "resolved": "https://registry.npmjs.org/@mui/lab/-/lab-6.0.0-beta.16.tgz", + "integrity": "sha512-YFeKREMMCiUhp4dGXd6Y/7N3BLepys9bM6xi4aF0WTZOvfl1ksDXPzuXPGiiiIuMgQFJeyN5iUnS1iPu3wH+kQ==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.26.0", - "@mui/base": "5.0.0-beta.61", - "@mui/system": "^6.1.7", + "@mui/base": "5.0.0-beta.62", + "@mui/system": "^6.1.8", "@mui/types": "^7.2.19", - "@mui/utils": "^6.1.7", + "@mui/utils": "^6.1.8", "clsx": "^2.1.1", "prop-types": "^15.8.1" }, @@ -1984,8 +1996,8 @@ "peerDependencies": { "@emotion/react": "^11.5.0", "@emotion/styled": "^11.3.0", - "@mui/material": "^6.1.7", - "@mui/material-pigment-css": "^6.1.7", + "@mui/material": "^6.1.8", + "@mui/material-pigment-css": "^6.1.8", "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", "react": "^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" @@ -2006,16 +2018,16 @@ } }, "node_modules/@mui/material": { - "version": "6.1.7", - "resolved": "https://registry.npmjs.org/@mui/material/-/material-6.1.7.tgz", - "integrity": "sha512-KsjujQL/A2hLd1PV3QboF+W6SSL5QqH6ZlSuQoeYz9r69+TnyBFIevbYLxdjJcJmGBjigL5pfpn7hTGop+vhSg==", + "version": "6.1.8", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-6.1.8.tgz", + "integrity": "sha512-QZdQFnXct+7NXIzHgT3qt+sQiO7HYGZU2vymP9Xl9tUMXEOA/S1mZMMb7+WGZrk5TzNlU/kP/85K0da5V1jXoQ==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.26.0", - "@mui/core-downloads-tracker": "^6.1.7", - "@mui/system": "^6.1.7", + "@mui/core-downloads-tracker": "^6.1.8", + "@mui/system": "^6.1.8", "@mui/types": "^7.2.19", - "@mui/utils": "^6.1.7", + "@mui/utils": "^6.1.8", "@popperjs/core": "^2.11.8", "@types/react-transition-group": "^4.4.11", "clsx": "^2.1.1", @@ -2034,7 +2046,7 @@ "peerDependencies": { "@emotion/react": "^11.5.0", "@emotion/styled": "^11.3.0", - "@mui/material-pigment-css": "^6.1.7", + "@mui/material-pigment-css": "^6.1.8", "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", "react": "^17.0.0 || ^18.0.0 || ^19.0.0", "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" @@ -2055,13 +2067,13 @@ } }, "node_modules/@mui/private-theming": { - "version": "6.1.7", - "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-6.1.7.tgz", - "integrity": "sha512-uLbfUSsug5K0LVkv0PI6Flste3le8+6WSL2omdTiYde93P89Qr7pKr8TA6d2yXfr+Bm+SvD8/fGnkaRwFkryuQ==", + "version": "6.1.8", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-6.1.8.tgz", + "integrity": "sha512-TuKl7msynCNCVvhX3c0ef1sF0Qb3VHcPs8XOGB/8bdOGBr/ynmIG1yTMjZeiFQXk8yN9fzK/FDEKMFxILNn3wg==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.26.0", - "@mui/utils": "^6.1.7", + "@mui/utils": "^6.1.8", "prop-types": "^15.8.1" }, "engines": { @@ -2082,9 +2094,9 @@ } }, "node_modules/@mui/styled-engine": { - "version": "6.1.7", - "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-6.1.7.tgz", - "integrity": "sha512-Ou4CxN7MQmwrfG1Pu6EYjPgPChQXxPDJrwgizLXlRPOad5qAq4gYXRuzrGQ2DfGjjwmJhjI8T6A0SeapAZPGig==", + "version": "6.1.8", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-6.1.8.tgz", + "integrity": "sha512-ZvEoT0U2nPLSLI+B4by4cVjaZnPT2f20f4JUPkyHdwLv65ZzuoHiTlwyhqX1Ch63p8bcJzKTHQVGisEoMK6PGA==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.26.0", @@ -2116,16 +2128,16 @@ } }, "node_modules/@mui/system": { - "version": "6.1.7", - "resolved": "https://registry.npmjs.org/@mui/system/-/system-6.1.7.tgz", - "integrity": "sha512-qbMGgcC/FodpuRSfjXlEDdbNQaW++eATh0vNBcPUv2/YXSpReoOpoT9FhogxEBNks+aQViDXBRZKh6HX2fVmwg==", + "version": "6.1.8", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-6.1.8.tgz", + "integrity": "sha512-i1kLfQoWxzFpXTBQIuPoA3xKnAnP3en4I2T8xIolovSolGQX5k8vGjw1JaydQS40td++cFsgCdEU458HDNTGUA==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.26.0", - "@mui/private-theming": "^6.1.7", - "@mui/styled-engine": "^6.1.7", + "@mui/private-theming": "^6.1.8", + "@mui/styled-engine": "^6.1.8", "@mui/types": "^7.2.19", - "@mui/utils": "^6.1.7", + "@mui/utils": "^6.1.8", "clsx": "^2.1.1", "csstype": "^3.1.3", "prop-types": "^15.8.1" @@ -2170,9 +2182,9 @@ } }, "node_modules/@mui/utils": { - "version": "6.1.7", - "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-6.1.7.tgz", - "integrity": "sha512-Gr7cRZxBoZ0BIa3Xqf/2YaUrBLyNPJvXPQH3OsD9WMZukI/TutibbQBVqLYpgqJn8pKSjbD50Yq2auG0wI1xOw==", + "version": "6.1.8", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-6.1.8.tgz", + "integrity": "sha512-O2DWb1kz8hiANVcR7Z4gOB3SvPPsSQGUmStpyBDzde6dJIfBzgV9PbEQOBZd3EBsd1pB+Uv1z5LAJAbymmawrA==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.26.0", @@ -2200,9 +2212,9 @@ } }, "node_modules/@mui/x-date-pickers": { - "version": "7.22.2", - "resolved": "https://registry.npmjs.org/@mui/x-date-pickers/-/x-date-pickers-7.22.2.tgz", - "integrity": "sha512-1KHSlIlnSoY3oHm820By8X344pIdGYqPvCCvfVHrEeeIQ/pHdxDD8tjZFWkFl4Jgm9oVFK90fMcqNZAzc+WaCw==", + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@mui/x-date-pickers/-/x-date-pickers-7.22.3.tgz", + "integrity": "sha512-shNp92IrST5BiVy2f4jbrmRaD32QhyUthjh1Oexvpcn0v6INyuWgxfodoTi5ZCnE5Ue5UVFSs4R9Xre0UbJ5DQ==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.25.7", @@ -2413,22 +2425,10 @@ "node": ">=14.0.0" } }, - "node_modules/@restart/hooks": { - "version": "0.4.16", - "resolved": "https://registry.npmjs.org/@restart/hooks/-/hooks-0.4.16.tgz", - "integrity": "sha512-f7aCv7c+nU/3mF7NWLtVVr0Ra80RqsO89hO72r+Y/nvQr5+q0UFGkocElTH6MJApvReVh6JHUFYn2cw1WdHF3w==", - "license": "MIT", - "dependencies": { - "dequal": "^2.0.3" - }, - "peerDependencies": { - "react": ">=16.8.0" - } - }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.25.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.25.0.tgz", - "integrity": "sha512-CC/ZqFZwlAIbU1wUPisHyV/XRc5RydFrNLtgl3dGYskdwPZdt4HERtKm50a/+DtTlKeCq9IXFEWR+P6blwjqBA==", + "version": "4.27.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.27.3.tgz", + "integrity": "sha512-EzxVSkIvCFxUd4Mgm4xR9YXrcp976qVaHnqom/Tgm+vU79k4vV4eYTjmRvGfeoW8m9LVcsAy/lGjcgVegKEhLQ==", "cpu": [ "arm" ], @@ -2440,9 +2440,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.25.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.25.0.tgz", - "integrity": "sha512-/Y76tmLGUJqVBXXCfVS8Q8FJqYGhgH4wl4qTA24E9v/IJM0XvJCGQVSW1QZ4J+VURO9h8YCa28sTFacZXwK7Rg==", + "version": "4.27.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.27.3.tgz", + "integrity": "sha512-LJc5pDf1wjlt9o/Giaw9Ofl+k/vLUaYsE2zeQGH85giX2F+wn/Cg8b3c5CDP3qmVmeO5NzwVUzQQxwZvC2eQKw==", "cpu": [ "arm64" ], @@ -2454,9 +2454,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.25.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.25.0.tgz", - "integrity": "sha512-YVT6L3UrKTlC0FpCZd0MGA7NVdp7YNaEqkENbWQ7AOVOqd/7VzyHpgIpc1mIaxRAo1ZsJRH45fq8j4N63I/vvg==", + "version": "4.27.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.27.3.tgz", + "integrity": "sha512-OuRysZ1Mt7wpWJ+aYKblVbJWtVn3Cy52h8nLuNSzTqSesYw1EuN6wKp5NW/4eSre3mp12gqFRXOKTcN3AI3LqA==", "cpu": [ "arm64" ], @@ -2468,9 +2468,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.25.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.25.0.tgz", - "integrity": "sha512-ZRL+gexs3+ZmmWmGKEU43Bdn67kWnMeWXLFhcVv5Un8FQcx38yulHBA7XR2+KQdYIOtD0yZDWBCudmfj6lQJoA==", + "version": "4.27.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.27.3.tgz", + "integrity": "sha512-xW//zjJMlJs2sOrCmXdB4d0uiilZsOdlGQIC/jjmMWT47lkLLoB1nsNhPUcnoqyi5YR6I4h+FjBpILxbEy8JRg==", "cpu": [ "x64" ], @@ -2482,9 +2482,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.25.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.25.0.tgz", - "integrity": "sha512-xpEIXhiP27EAylEpreCozozsxWQ2TJbOLSivGfXhU4G1TBVEYtUPi2pOZBnvGXHyOdLAUUhPnJzH3ah5cqF01g==", + "version": "4.27.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.27.3.tgz", + "integrity": "sha512-58E0tIcwZ+12nK1WiLzHOD8I0d0kdrY/+o7yFVPRHuVGY3twBwzwDdTIBGRxLmyjciMYl1B/U515GJy+yn46qw==", "cpu": [ "arm64" ], @@ -2496,9 +2496,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.25.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.25.0.tgz", - "integrity": "sha512-sC5FsmZGlJv5dOcURrsnIK7ngc3Kirnx3as2XU9uER+zjfyqIjdcMVgzy4cOawhsssqzoAX19qmxgJ8a14Qrqw==", + "version": "4.27.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.27.3.tgz", + "integrity": "sha512-78fohrpcVwTLxg1ZzBMlwEimoAJmY6B+5TsyAZ3Vok7YabRBUvjYTsRXPTjGEvv/mfgVBepbW28OlMEz4w8wGA==", "cpu": [ "x64" ], @@ -2510,9 +2510,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.25.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.25.0.tgz", - "integrity": "sha512-uD/dbLSs1BEPzg564TpRAQ/YvTnCds2XxyOndAO8nJhaQcqQGFgv/DAVko/ZHap3boCvxnzYMa3mTkV/B/3SWA==", + "version": "4.27.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.27.3.tgz", + "integrity": "sha512-h2Ay79YFXyQi+QZKo3ISZDyKaVD7uUvukEHTOft7kh00WF9mxAaxZsNs3o/eukbeKuH35jBvQqrT61fzKfAB/Q==", "cpu": [ "arm" ], @@ -2524,9 +2524,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.25.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.25.0.tgz", - "integrity": "sha512-ZVt/XkrDlQWegDWrwyC3l0OfAF7yeJUF4fq5RMS07YM72BlSfn2fQQ6lPyBNjt+YbczMguPiJoCfaQC2dnflpQ==", + "version": "4.27.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.27.3.tgz", + "integrity": "sha512-Sv2GWmrJfRY57urktVLQ0VKZjNZGogVtASAgosDZ1aUB+ykPxSi3X1nWORL5Jk0sTIIwQiPH7iE3BMi9zGWfkg==", "cpu": [ "arm" ], @@ -2538,9 +2538,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.25.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.25.0.tgz", - "integrity": "sha512-qboZ+T0gHAW2kkSDPHxu7quaFaaBlynODXpBVnPxUgvWYaE84xgCKAPEYE+fSMd3Zv5PyFZR+L0tCdYCMAtG0A==", + "version": "4.27.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.27.3.tgz", + "integrity": "sha512-FPoJBLsPW2bDNWjSrwNuTPUt30VnfM8GPGRoLCYKZpPx0xiIEdFip3dH6CqgoT0RnoGXptaNziM0WlKgBc+OWQ==", "cpu": [ "arm64" ], @@ -2552,9 +2552,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.25.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.25.0.tgz", - "integrity": "sha512-ndWTSEmAaKr88dBuogGH2NZaxe7u2rDoArsejNslugHZ+r44NfWiwjzizVS1nUOHo+n1Z6qV3X60rqE/HlISgw==", + "version": "4.27.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.27.3.tgz", + "integrity": "sha512-TKxiOvBorYq4sUpA0JT+Fkh+l+G9DScnG5Dqx7wiiqVMiRSkzTclP35pE6eQQYjP4Gc8yEkJGea6rz4qyWhp3g==", "cpu": [ "arm64" ], @@ -2566,9 +2566,9 @@ ] }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.25.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.25.0.tgz", - "integrity": "sha512-BVSQvVa2v5hKwJSy6X7W1fjDex6yZnNKy3Kx1JGimccHft6HV0THTwNtC2zawtNXKUu+S5CjXslilYdKBAadzA==", + "version": "4.27.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.27.3.tgz", + "integrity": "sha512-v2M/mPvVUKVOKITa0oCFksnQQ/TqGrT+yD0184/cWHIu0LoIuYHwox0Pm3ccXEz8cEQDLk6FPKd1CCm+PlsISw==", "cpu": [ "ppc64" ], @@ -2580,9 +2580,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.25.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.25.0.tgz", - "integrity": "sha512-G4hTREQrIdeV0PE2JruzI+vXdRnaK1pg64hemHq2v5fhv8C7WjVaeXc9P5i4Q5UC06d/L+zA0mszYIKl+wY8oA==", + "version": "4.27.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.27.3.tgz", + "integrity": "sha512-LdrI4Yocb1a/tFVkzmOE5WyYRgEBOyEhWYJe4gsDWDiwnjYKjNs7PS6SGlTDB7maOHF4kxevsuNBl2iOcj3b4A==", "cpu": [ "riscv64" ], @@ -2594,9 +2594,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.25.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.25.0.tgz", - "integrity": "sha512-9T/w0kQ+upxdkFL9zPVB6zy9vWW1deA3g8IauJxojN4bnz5FwSsUAD034KpXIVX5j5p/rn6XqumBMxfRkcHapQ==", + "version": "4.27.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.27.3.tgz", + "integrity": "sha512-d4wVu6SXij/jyiwPvI6C4KxdGzuZOvJ6y9VfrcleHTwo68fl8vZC5ZYHsCVPUi4tndCfMlFniWgwonQ5CUpQcA==", "cpu": [ "s390x" ], @@ -2608,9 +2608,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.25.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.25.0.tgz", - "integrity": "sha512-ThcnU0EcMDn+J4B9LD++OgBYxZusuA7iemIIiz5yzEcFg04VZFzdFjuwPdlURmYPZw+fgVrFzj4CA64jSTG4Ig==", + "version": "4.27.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.27.3.tgz", + "integrity": "sha512-/6bn6pp1fsCGEY5n3yajmzZQAh+mW4QPItbiWxs69zskBzJuheb3tNynEjL+mKOsUSFK11X4LYF2BwwXnzWleA==", "cpu": [ "x64" ], @@ -2622,9 +2622,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.25.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.25.0.tgz", - "integrity": "sha512-zx71aY2oQxGxAT1JShfhNG79PnjYhMC6voAjzpu/xmMjDnKNf6Nl/xv7YaB/9SIa9jDYf8RBPWEnjcdlhlv1rQ==", + "version": "4.27.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.27.3.tgz", + "integrity": "sha512-nBXOfJds8OzUT1qUreT/en3eyOXd2EH5b0wr2bVB5999qHdGKkzGzIyKYaKj02lXk6wpN71ltLIaQpu58YFBoQ==", "cpu": [ "x64" ], @@ -2636,9 +2636,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.25.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.25.0.tgz", - "integrity": "sha512-JT8tcjNocMs4CylWY/CxVLnv8e1lE7ff1fi6kbGocWwxDq9pj30IJ28Peb+Y8yiPNSF28oad42ApJB8oUkwGww==", + "version": "4.27.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.27.3.tgz", + "integrity": "sha512-ogfbEVQgIZOz5WPWXF2HVb6En+kWzScuxJo/WdQTqEgeyGkaa2ui5sQav9Zkr7bnNCLK48uxmmK0TySm22eiuw==", "cpu": [ "arm64" ], @@ -2650,9 +2650,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.25.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.25.0.tgz", - "integrity": "sha512-dRLjLsO3dNOfSN6tjyVlG+Msm4IiZnGkuZ7G5NmpzwF9oOc582FZG05+UdfTbz5Jd4buK/wMb6UeHFhG18+OEg==", + "version": "4.27.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.27.3.tgz", + "integrity": "sha512-ecE36ZBMLINqiTtSNQ1vzWc5pXLQHlf/oqGp/bSbi7iedcjcNb6QbCBNG73Euyy2C+l/fn8qKWEwxr+0SSfs3w==", "cpu": [ "ia32" ], @@ -2664,9 +2664,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.25.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.25.0.tgz", - "integrity": "sha512-/RqrIFtLB926frMhZD0a5oDa4eFIbyNEwLLloMTEjmqfwZWXywwVVOVmwTsuyhC9HKkVEZcOOi+KV4U9wmOdlg==", + "version": "4.27.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.27.3.tgz", + "integrity": "sha512-vliZLrDmYKyaUoMzEbMTg2JkerfBjn03KmAw9CykO0Zzkzoyd7o3iZNam/TpyWNjNT+Cz2iO3P9Smv2wgrR+Eg==", "cpu": [ "x64" ], @@ -2809,9 +2809,9 @@ "peer": true }, "node_modules/@types/node": { - "version": "22.9.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.9.0.tgz", - "integrity": "sha512-vuyHg81vvWA1Z1ELfvLko2c8f34gyA0zaic0+Rllc5lbCnbSyuvb2Oxpm6TAUAC/2xZN3QGqxBNggD1nNR2AfQ==", + "version": "22.9.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.9.1.tgz", + "integrity": "sha512-p8Yy/8sw1caA8CdRIQBG5tiLHmxtQKObCijiAa9Ez+d4+PRffM4054xbju0msf+cvhJpnFEeNjxmVT/0ipktrg==", "license": "MIT", "dependencies": { "undici-types": "~6.19.8" @@ -2866,24 +2866,18 @@ "@types/react": "*" } }, - "node_modules/@types/warning": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/warning/-/warning-3.0.3.tgz", - "integrity": "sha512-D1XC7WK8K+zZEveUPY+cf4+kgauk8N4eHr/XIHXGlGYkHLud6hK9lYfZk1ry1TNh798cZUCgb6MqGEG8DkJt6Q==", - "license": "MIT" - }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.13.0.tgz", - "integrity": "sha512-nQtBLiZYMUPkclSeC3id+x4uVd1SGtHuElTxL++SfP47jR0zfkZBJHc+gL4qPsgTuypz0k8Y2GheaDYn6Gy3rg==", + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.15.0.tgz", + "integrity": "sha512-+zkm9AR1Ds9uLWN3fkoeXgFppaQ+uEVtfOV62dDmsy9QCNqlRHWNEck4yarvRNrvRcHQLGfqBNui3cimoz8XAg==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.13.0", - "@typescript-eslint/type-utils": "8.13.0", - "@typescript-eslint/utils": "8.13.0", - "@typescript-eslint/visitor-keys": "8.13.0", + "@typescript-eslint/scope-manager": "8.15.0", + "@typescript-eslint/type-utils": "8.15.0", + "@typescript-eslint/utils": "8.15.0", + "@typescript-eslint/visitor-keys": "8.15.0", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", @@ -2907,16 +2901,16 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.13.0.tgz", - "integrity": "sha512-w0xp+xGg8u/nONcGw1UXAr6cjCPU1w0XVyBs6Zqaj5eLmxkKQAByTdV/uGgNN5tVvN/kKpoQlP2cL7R+ajZZIQ==", + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.15.0.tgz", + "integrity": "sha512-7n59qFpghG4uazrF9qtGKBZXn7Oz4sOMm8dwNWDQY96Xlm2oX67eipqcblDj+oY1lLCbf1oltMZFpUso66Kl1A==", "dev": true, "license": "BSD-2-Clause", "dependencies": { - "@typescript-eslint/scope-manager": "8.13.0", - "@typescript-eslint/types": "8.13.0", - "@typescript-eslint/typescript-estree": "8.13.0", - "@typescript-eslint/visitor-keys": "8.13.0", + "@typescript-eslint/scope-manager": "8.15.0", + "@typescript-eslint/types": "8.15.0", + "@typescript-eslint/typescript-estree": "8.15.0", + "@typescript-eslint/visitor-keys": "8.15.0", "debug": "^4.3.4" }, "engines": { @@ -2936,14 +2930,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.13.0.tgz", - "integrity": "sha512-XsGWww0odcUT0gJoBZ1DeulY1+jkaHUciUq4jKNv4cpInbvvrtDoyBH9rE/n2V29wQJPk8iCH1wipra9BhmiMA==", + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.15.0.tgz", + "integrity": "sha512-QRGy8ADi4J7ii95xz4UoiymmmMd/zuy9azCaamnZ3FM8T5fZcex8UfJcjkiEZjJSztKfEBe3dZ5T/5RHAmw2mA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.13.0", - "@typescript-eslint/visitor-keys": "8.13.0" + "@typescript-eslint/types": "8.15.0", + "@typescript-eslint/visitor-keys": "8.15.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2954,14 +2948,14 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.13.0.tgz", - "integrity": "sha512-Rqnn6xXTR316fP4D2pohZenJnp+NwQ1mo7/JM+J1LWZENSLkJI8ID8QNtlvFeb0HnFSK94D6q0cnMX6SbE5/vA==", + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.15.0.tgz", + "integrity": "sha512-UU6uwXDoI3JGSXmcdnP5d8Fffa2KayOhUUqr/AiBnG1Gl7+7ut/oyagVeSkh7bxQ0zSXV9ptRh/4N15nkCqnpw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/typescript-estree": "8.13.0", - "@typescript-eslint/utils": "8.13.0", + "@typescript-eslint/typescript-estree": "8.15.0", + "@typescript-eslint/utils": "8.15.0", "debug": "^4.3.4", "ts-api-utils": "^1.3.0" }, @@ -2972,6 +2966,9 @@ "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0" + }, "peerDependenciesMeta": { "typescript": { "optional": true @@ -2979,9 +2976,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.13.0.tgz", - "integrity": "sha512-4cyFErJetFLckcThRUFdReWJjVsPCqyBlJTi6IDEpc1GWCIIZRFxVppjWLIMcQhNGhdWJJRYFHpHoDWvMlDzng==", + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.15.0.tgz", + "integrity": "sha512-n3Gt8Y/KyJNe0S3yDCD2RVKrHBC4gTUcLTebVBXacPy091E6tNspFLKRXlk3hwT4G55nfr1n2AdFqi/XMxzmPQ==", "dev": true, "license": "MIT", "engines": { @@ -2993,14 +2990,14 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.13.0.tgz", - "integrity": "sha512-v7SCIGmVsRK2Cy/LTLGN22uea6SaUIlpBcO/gnMGT/7zPtxp90bphcGf4fyrCQl3ZtiBKqVTG32hb668oIYy1g==", + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.15.0.tgz", + "integrity": "sha512-1eMp2JgNec/niZsR7ioFBlsh/Fk0oJbhaqO0jRyQBMgkz7RrFfkqF9lYYmBoGBaSiLnu8TAPQTwoTUiSTUW9dg==", "dev": true, "license": "BSD-2-Clause", "dependencies": { - "@typescript-eslint/types": "8.13.0", - "@typescript-eslint/visitor-keys": "8.13.0", + "@typescript-eslint/types": "8.15.0", + "@typescript-eslint/visitor-keys": "8.15.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", @@ -3022,16 +3019,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.13.0.tgz", - "integrity": "sha512-A1EeYOND6Uv250nybnLZapeXpYMl8tkzYUxqmoKAWnI4sei3ihf2XdZVd+vVOmHGcp3t+P7yRrNsyyiXTvShFQ==", + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.15.0.tgz", + "integrity": "sha512-k82RI9yGhr0QM3Dnq+egEpz9qB6Un+WLYhmoNcvl8ltMEededhh7otBVVIDDsEEttauwdY/hQoSsOv13lxrFzQ==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.13.0", - "@typescript-eslint/types": "8.13.0", - "@typescript-eslint/typescript-estree": "8.13.0" + "@typescript-eslint/scope-manager": "8.15.0", + "@typescript-eslint/types": "8.15.0", + "@typescript-eslint/typescript-estree": "8.15.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3042,17 +3039,22 @@ }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.13.0.tgz", - "integrity": "sha512-7N/+lztJqH4Mrf0lb10R/CbI1EaAMMGyF5y0oJvFoAhafwgiRA7TXyd8TFn8FC8k5y2dTsYogg238qavRGNnlw==", + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.15.0.tgz", + "integrity": "sha512-h8vYOulWec9LhpwfAdZf2bjr8xIp0KNKnpgqSz0qqYYKAW/QZKw3ktRndbiAtUz4acH4QLQavwZBYCc0wulA/Q==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.13.0", - "eslint-visitor-keys": "^3.4.3" + "@typescript-eslint/types": "8.15.0", + "eslint-visitor-keys": "^4.2.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3083,14 +3085,14 @@ } }, "node_modules/@vitest/expect": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.1.4.tgz", - "integrity": "sha512-DOETT0Oh1avie/D/o2sgMHGrzYUFFo3zqESB2Hn70z6QB1HrS2IQ9z5DfyTqU8sg4Bpu13zZe9V4+UTNQlUeQA==", + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.1.5.tgz", + "integrity": "sha512-nZSBTW1XIdpZvEJyoP/Sy8fUg0b8od7ZpGDkTUcfJ7wz/VoZAFzFfLyxVxGFhUjJzhYqSbIpfMtl/+k/dpWa3Q==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/spy": "2.1.4", - "@vitest/utils": "2.1.4", + "@vitest/spy": "2.1.5", + "@vitest/utils": "2.1.5", "chai": "^5.1.2", "tinyrainbow": "^1.2.0" }, @@ -3099,13 +3101,13 @@ } }, "node_modules/@vitest/mocker": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-2.1.4.tgz", - "integrity": "sha512-Ky/O1Lc0QBbutJdW0rqLeFNbuLEyS+mIPiNdlVlp2/yhJ0SbyYqObS5IHdhferJud8MbbwMnexg4jordE5cCoQ==", + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-2.1.5.tgz", + "integrity": "sha512-XYW6l3UuBmitWqSUXTNXcVBUCRytDogBsWuNXQijc00dtnU/9OqpXWp4OJroVrad/gLIomAq9aW8yWDBtMthhQ==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/spy": "2.1.4", + "@vitest/spy": "2.1.5", "estree-walker": "^3.0.3", "magic-string": "^0.30.12" }, @@ -3126,9 +3128,9 @@ } }, "node_modules/@vitest/pretty-format": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.1.4.tgz", - "integrity": "sha512-L95zIAkEuTDbUX1IsjRl+vyBSLh3PwLLgKpghl37aCK9Jvw0iP+wKwIFhfjdUtA2myLgjrG6VU6JCFLv8q/3Ww==", + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.1.5.tgz", + "integrity": "sha512-4ZOwtk2bqG5Y6xRGHcveZVr+6txkH7M2e+nPFd6guSoN638v/1XQ0K06eOpi0ptVU/2tW/pIU4IoPotY/GZ9fw==", "dev": true, "license": "MIT", "dependencies": { @@ -3139,13 +3141,13 @@ } }, "node_modules/@vitest/runner": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-2.1.4.tgz", - "integrity": "sha512-sKRautINI9XICAMl2bjxQM8VfCMTB0EbsBc/EDFA57V6UQevEKY/TOPOF5nzcvCALltiLfXWbq4MaAwWx/YxIA==", + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-2.1.5.tgz", + "integrity": "sha512-pKHKy3uaUdh7X6p1pxOkgkVAFW7r2I818vHDthYLvUyjRfkKOU6P45PztOch4DZarWQne+VOaIMwA/erSSpB9g==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/utils": "2.1.4", + "@vitest/utils": "2.1.5", "pathe": "^1.1.2" }, "funding": { @@ -3153,13 +3155,13 @@ } }, "node_modules/@vitest/snapshot": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.1.4.tgz", - "integrity": "sha512-3Kab14fn/5QZRog5BPj6Rs8dc4B+mim27XaKWFWHWA87R56AKjHTGcBFKpvZKDzC4u5Wd0w/qKsUIio3KzWW4Q==", + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.1.5.tgz", + "integrity": "sha512-zmYw47mhfdfnYbuhkQvkkzYroXUumrwWDGlMjpdUr4jBd3HZiV2w7CQHj+z7AAS4VOtWxI4Zt4bWt4/sKcoIjg==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "2.1.4", + "@vitest/pretty-format": "2.1.5", "magic-string": "^0.30.12", "pathe": "^1.1.2" }, @@ -3168,9 +3170,9 @@ } }, "node_modules/@vitest/spy": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.1.4.tgz", - "integrity": "sha512-4JOxa+UAizJgpZfaCPKK2smq9d8mmjZVPMt2kOsg/R8QkoRzydHH1qHxIYNvr1zlEaFj4SXiaaJWxq/LPLKaLg==", + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.1.5.tgz", + "integrity": "sha512-aWZF3P0r3w6DiYTVskOYuhBc7EMc3jvn1TkBg8ttylFFRqNN2XGD7V5a4aQdk6QiUzZQ4klNBSpCLJgWNdIiNw==", "dev": true, "license": "MIT", "dependencies": { @@ -3181,35 +3183,35 @@ } }, "node_modules/@vitest/ui": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@vitest/ui/-/ui-2.1.4.tgz", - "integrity": "sha512-Zd9e5oU063c+j9N9XzGJagCLNvG71x/2tOme3Js4JEZKX55zsgxhJwUgLI8hkN6NjMLpdJO8d7nVUUuPGAA58Q==", + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@vitest/ui/-/ui-2.1.5.tgz", + "integrity": "sha512-ERgKkDMTfngrZip6VG5h8L9B5D0AH/4+bga4yR1UzGH7c2cxv3LWogw2Dvuwr9cP3/iKDHYys7kIFLDKpxORTg==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/utils": "2.1.4", + "@vitest/utils": "2.1.5", "fflate": "^0.8.2", "flatted": "^3.3.1", "pathe": "^1.1.2", "sirv": "^3.0.0", - "tinyglobby": "^0.2.9", + "tinyglobby": "^0.2.10", "tinyrainbow": "^1.2.0" }, "funding": { "url": "https://opencollective.com/vitest" }, "peerDependencies": { - "vitest": "2.1.4" + "vitest": "2.1.5" } }, "node_modules/@vitest/utils": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.1.4.tgz", - "integrity": "sha512-MXDnZn0Awl2S86PSNIim5PWXgIAx8CIkzu35mBdSApUip6RFOGXBCf3YFyeEu8n1IHk4bWD46DeYFu9mQlFIRg==", + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.1.5.tgz", + "integrity": "sha512-yfj6Yrp0Vesw2cwJbP+cl04OC+IHFsuQsrsJBL9pyGeQXE56v1UAOQco+SR55Vf1nQzfV0QJg1Qum7AaWUwwYg==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "2.1.4", + "@vitest/pretty-format": "2.1.5", "loupe": "^3.1.2", "tinyrainbow": "^1.2.0" }, @@ -3722,9 +3724,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001679", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001679.tgz", - "integrity": "sha512-j2YqID/YwpLnKzCmBOS4tlZdWprXm3ZmQLBH9ZBXFOhoxLA46fwyBvx6toCBWBmnuwUY/qB3kEU6gFx8qgCroA==", + "version": "1.0.30001683", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001683.tgz", + "integrity": "sha512-iqmNnThZ0n70mNwvxpEC2nBJ037ZHZUoBI5Gorh1Mw6IlEAZujEoU1tXA628iZfzm7R9FvFzxbfdgml82a3k8Q==", "dev": true, "funding": [ { @@ -3787,9 +3789,9 @@ } }, "node_modules/ci-info": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.0.0.tgz", - "integrity": "sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.1.0.tgz", + "integrity": "sha512-HutrvTNsF48wnxkzERIXOe5/mlcfFcbfCmwcg6CJnizbSue78AbDt+1cgl26zwn61WFxhcPykPfZrbqjGmBb4A==", "dev": true, "funding": [ { @@ -3999,10 +4001,9 @@ "peer": true }, "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true, + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", "license": "MIT" }, "node_modules/core-js-compat": { @@ -4036,19 +4037,10 @@ "node": ">=10" } }, - "node_modules/cosmiconfig/node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "license": "ISC", - "engines": { - "node": ">= 6" - } - }, "node_modules/cross-spawn": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.5.tgz", - "integrity": "sha512-ZVJrKKYunU38/76t0RMOulHOnUcbU9GbpWKAOZ0mhjr7CX6FVrH+4FrAapSOekrgFQ3f/8gwMEuIft0aKq6Hug==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, "license": "MIT", "dependencies": { @@ -4158,17 +4150,13 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/date-arithmetic": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/date-arithmetic/-/date-arithmetic-4.1.0.tgz", - "integrity": "sha512-QWxYLR5P/6GStZcdem+V1xoto6DMadYWpMXU82ES3/RfR3Wdwr3D0+be7mgOJ+Ov0G9D5Dmb9T17sNLQYj9XOg==", - "license": "MIT" - }, "node_modules/date-fns": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-4.1.0.tgz", "integrity": "sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==", "license": "MIT", + "optional": true, + "peer": true, "funding": { "type": "github", "url": "https://github.com/sponsors/kossnocorp" @@ -4274,6 +4262,7 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -4311,9 +4300,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.55", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.55.tgz", - "integrity": "sha512-6maZ2ASDOTBtjt9FhqYPRnbvKU5tjG0IN9SztUOWYw2AzNDNpKJYLJmlK0/En4Hs/aiWnB+JZ+gW19PIGszgKg==", + "version": "1.5.63", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.63.tgz", + "integrity": "sha512-ddeXKuY9BHo/mw145axlyWjlJ1UBt4WK3AlvkT7W2AbqfRQoacVoRUCF6wL3uIx/8wT9oLKXzI+rFqHHscByaA==", "dev": true, "license": "ISC" }, @@ -4361,9 +4350,9 @@ } }, "node_modules/es-abstract": { - "version": "1.23.3", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", - "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", + "version": "1.23.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.5.tgz", + "integrity": "sha512-vlmniQ0WNPwXqA0BnmwV3Ng7HxiGlh6r5U6JcTMNx8OilcAGqVJBHJcPjqOMaczU9fRuRK5Px2BdVyPRnKMMVQ==", "dev": true, "license": "MIT", "peer": true, @@ -4383,7 +4372,7 @@ "function.prototype.name": "^1.1.6", "get-intrinsic": "^1.2.4", "get-symbol-description": "^1.0.2", - "globalthis": "^1.0.3", + "globalthis": "^1.0.4", "gopd": "^1.0.1", "has-property-descriptors": "^1.0.2", "has-proto": "^1.0.3", @@ -4399,10 +4388,10 @@ "is-string": "^1.0.7", "is-typed-array": "^1.1.13", "is-weakref": "^1.0.2", - "object-inspect": "^1.13.1", + "object-inspect": "^1.13.3", "object-keys": "^1.1.1", "object.assign": "^4.1.5", - "regexp.prototype.flags": "^1.5.2", + "regexp.prototype.flags": "^1.5.3", "safe-array-concat": "^1.1.2", "safe-regex-test": "^1.0.3", "string.prototype.trim": "^1.2.9", @@ -4475,6 +4464,13 @@ "node": ">= 0.4" } }, + "node_modules/es-module-lexer": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", + "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==", + "dev": true, + "license": "MIT" + }, "node_modules/es-object-atoms": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", @@ -4606,28 +4602,28 @@ } }, "node_modules/eslint": { - "version": "9.14.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.14.0.tgz", - "integrity": "sha512-c2FHsVBr87lnUtjP4Yhvk4yEhKrQavGafRA/Se1ouse8PfbfC/Qh9Mxa00yWsZRlqeUB9raXip0aiiUZkgnr9g==", + "version": "9.15.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.15.0.tgz", + "integrity": "sha512-7CrWySmIibCgT1Os28lUU6upBshZ+GxybLOrmRzi08kS8MBuO8QA7pXEgYgY5W8vK3e74xv0lpjo9DbaGU9Rkw==", "dev": true, "license": "MIT", "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.18.0", - "@eslint/core": "^0.7.0", - "@eslint/eslintrc": "^3.1.0", - "@eslint/js": "9.14.0", - "@eslint/plugin-kit": "^0.2.0", + "@eslint/config-array": "^0.19.0", + "@eslint/core": "^0.9.0", + "@eslint/eslintrc": "^3.2.0", + "@eslint/js": "9.15.0", + "@eslint/plugin-kit": "^0.2.3", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", - "@humanwhocodes/retry": "^0.4.0", + "@humanwhocodes/retry": "^0.4.1", "@types/estree": "^1.0.6", "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", + "cross-spawn": "^7.0.5", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.2.0", @@ -4646,8 +4642,7 @@ "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "text-table": "^0.2.0" + "optionator": "^0.9.3" }, "bin": { "eslint": "bin/eslint.js" @@ -5026,9 +5021,9 @@ } }, "node_modules/eslint-plugin-unicorn": { - "version": "56.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-56.0.0.tgz", - "integrity": "sha512-aXpddVz/PQMmd69uxO98PA4iidiVNvA0xOtbpUoz1WhBd4RxOQQYqN618v68drY0hmy5uU2jy1bheKEVWBjlPw==", + "version": "56.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-56.0.1.tgz", + "integrity": "sha512-FwVV0Uwf8XPfVnKSGpMg7NtlZh0G0gBarCaFcMUOoqPxXryxdYxTRRv4kH6B9TFCVIrjRXG+emcxIk2ayZilog==", "dev": true, "license": "MIT", "peer": true, @@ -5079,13 +5074,13 @@ } }, "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", "dev": true, "license": "Apache-2.0", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" @@ -5103,20 +5098,6 @@ "concat-map": "0.0.1" } }, - "node_modules/eslint/node_modules/eslint-visitor-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", - "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, "node_modules/eslint/node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -5150,20 +5131,6 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", - "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, "node_modules/esquery": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", @@ -5451,9 +5418,9 @@ } }, "node_modules/flatted": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", - "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz", + "integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==", "dev": true, "license": "ISC" }, @@ -5637,11 +5604,6 @@ "node": ">=10.13.0" } }, - "node_modules/globalize": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/globalize/-/globalize-0.1.1.tgz", - "integrity": "sha512-5e01v8eLGfuQSOvx2MsDMOWS0GFtCx1wPzQSmcHw4hkxFzrQDBO3Xwg/m8Hr/7qXMrHeOIE29qWVzyv06u1TZA==" - }, "node_modules/globals": { "version": "15.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-15.12.0.tgz", @@ -5874,9 +5836,9 @@ } }, "node_modules/husky": { - "version": "9.1.6", - "resolved": "https://registry.npmjs.org/husky/-/husky-9.1.6.tgz", - "integrity": "sha512-sqbjZKK7kf44hfdE94EoX8MZNk0n7HeW37O4YrVGCF4wzgQjp+akPAkfUK5LZ6KuR/6sqeAVuXHji+RzQgOn5A==", + "version": "9.1.7", + "resolved": "https://registry.npmjs.org/husky/-/husky-9.1.7.tgz", + "integrity": "sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==", "dev": true, "license": "MIT", "bin": { @@ -5972,15 +5934,6 @@ "node": ">= 0.4" } }, - "node_modules/invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.0.0" - } - }, "node_modules/is-array-buffer": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", @@ -6696,6 +6649,19 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/lint-staged/node_modules/yaml": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.5.1.tgz", + "integrity": "sha512-bLQOjaX/ADgQ20isPJRvF0iRUHIxVhYvr53Of7wGcWlO2jvtUlH5m87DsmulFVxRpNLOnI4tB6p/oh8D7kpn9Q==", + "dev": true, + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/listr2": { "version": "8.2.5", "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.2.5.tgz", @@ -6731,18 +6697,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "license": "MIT" - }, - "node_modules/lodash-es": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", - "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", - "license": "MIT" - }, "node_modules/lodash.camelcase": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", @@ -6858,15 +6812,6 @@ "yallist": "^3.0.2" } }, - "node_modules/luxon": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.5.0.tgz", - "integrity": "sha512-rh+Zjr6DNfUYR3bPwJEnuwDdqMbxZW7LOQfUN4B54+Cl+0o5zaU9RJ6bcidfDtC1cWCZXQ+nvX8bf6bAji37QQ==", - "license": "MIT", - "engines": { - "node": ">=12" - } - }, "node_modules/lz-string": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", @@ -6878,21 +6823,15 @@ } }, "node_modules/magic-string": { - "version": "0.30.12", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.12.tgz", - "integrity": "sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==", + "version": "0.30.13", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.13.tgz", + "integrity": "sha512-8rYBO+MsWkgjDSOvLomYnzhdwEG51olQ4zL5KXnNJWV5MNmrb4rTZdrtkhxjnD/QyZUqR/Z/XDsUs/4ej2nx0g==", "dev": true, "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0" } }, - "node_modules/memoize-one": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz", - "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==", - "license": "MIT" - }, "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -7011,27 +6950,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/moment": { - "version": "2.30.1", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", - "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==", - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/moment-timezone": { - "version": "0.5.46", - "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.46.tgz", - "integrity": "sha512-ZXm9b36esbe7OmdABqIWJuBBiLLwAjrN7CE+7sYdCCx82Nabt1wHDj8TVseS59QIlfFPbOoiBPm6ca9BioG4hw==", - "license": "MIT", - "dependencies": { - "moment": "^2.29.4" - }, - "engines": { - "node": "*" - } - }, "node_modules/mrmime": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz", @@ -7498,9 +7416,9 @@ } }, "node_modules/postcss": { - "version": "8.4.47", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz", - "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==", + "version": "8.4.49", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", + "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", "dev": true, "funding": [ { @@ -7519,7 +7437,7 @@ "license": "MIT", "dependencies": { "nanoid": "^3.3.7", - "picocolors": "^1.1.0", + "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, "engines": { @@ -7673,43 +7591,6 @@ "node": ">=0.10.0" } }, - "node_modules/react-big-calendar": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/react-big-calendar/-/react-big-calendar-1.15.0.tgz", - "integrity": "sha512-RNiPH1Vh/fpJpNIValpl6lHvuEroWkDvS8z3YW2QpmGUuAk6a0Q1uEujlQTd/gQrpKAaBA4Gyc1mzCdNIQ7DZQ==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.20.7", - "clsx": "^1.2.1", - "date-arithmetic": "^4.1.0", - "dayjs": "^1.11.7", - "dom-helpers": "^5.2.1", - "globalize": "^0.1.1", - "invariant": "^2.2.4", - "lodash": "^4.17.21", - "lodash-es": "^4.17.21", - "luxon": "^3.2.1", - "memoize-one": "^6.0.0", - "moment": "^2.29.4", - "moment-timezone": "^0.5.40", - "prop-types": "^15.8.1", - "react-overlays": "^5.2.1", - "uncontrollable": "^7.2.1" - }, - "peerDependencies": { - "react": "^16.14.0 || ^17 || ^18", - "react-dom": "^16.14.0 || ^17 || ^18" - } - }, - "node_modules/react-big-calendar/node_modules/clsx": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", - "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/react-dom": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", @@ -7729,32 +7610,6 @@ "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", "license": "MIT" }, - "node_modules/react-lifecycles-compat": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", - "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==", - "license": "MIT" - }, - "node_modules/react-overlays": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/react-overlays/-/react-overlays-5.2.1.tgz", - "integrity": "sha512-GLLSOLWr21CqtJn8geSwQfoJufdt3mfdsnIiQswouuQ2MMPns+ihZklxvsTDKD3cR2tF8ELbi5xUsvqVhR6WvA==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.13.8", - "@popperjs/core": "^2.11.6", - "@restart/hooks": "^0.4.7", - "@types/warning": "^3.0.0", - "dom-helpers": "^5.2.0", - "prop-types": "^15.7.2", - "uncontrollable": "^7.2.1", - "warning": "^4.0.3" - }, - "peerDependencies": { - "react": ">=16.3.0", - "react-dom": ">=16.3.0" - } - }, "node_modules/react-refresh": { "version": "0.14.2", "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", @@ -8091,9 +7946,9 @@ "license": "MIT" }, "node_modules/rollup": { - "version": "4.25.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.25.0.tgz", - "integrity": "sha512-uVbClXmR6wvx5R1M3Od4utyLUxrmOcEm3pAtMphn73Apq19PDtHpgZoEvqH2YnnaNUuvKmg2DgRd2Sqv+odyqg==", + "version": "4.27.3", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.27.3.tgz", + "integrity": "sha512-SLsCOnlmGt9VoZ9Ek8yBK8tAdmPHeppkw+Xa7yDlCEhDTvwYei03JlWo1fdc7YTfLZ4tD8riJCUyAgTbszk1fQ==", "dev": true, "license": "MIT", "dependencies": { @@ -8107,24 +7962,24 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.25.0", - "@rollup/rollup-android-arm64": "4.25.0", - "@rollup/rollup-darwin-arm64": "4.25.0", - "@rollup/rollup-darwin-x64": "4.25.0", - "@rollup/rollup-freebsd-arm64": "4.25.0", - "@rollup/rollup-freebsd-x64": "4.25.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.25.0", - "@rollup/rollup-linux-arm-musleabihf": "4.25.0", - "@rollup/rollup-linux-arm64-gnu": "4.25.0", - "@rollup/rollup-linux-arm64-musl": "4.25.0", - "@rollup/rollup-linux-powerpc64le-gnu": "4.25.0", - "@rollup/rollup-linux-riscv64-gnu": "4.25.0", - "@rollup/rollup-linux-s390x-gnu": "4.25.0", - "@rollup/rollup-linux-x64-gnu": "4.25.0", - "@rollup/rollup-linux-x64-musl": "4.25.0", - "@rollup/rollup-win32-arm64-msvc": "4.25.0", - "@rollup/rollup-win32-ia32-msvc": "4.25.0", - "@rollup/rollup-win32-x64-msvc": "4.25.0", + "@rollup/rollup-android-arm-eabi": "4.27.3", + "@rollup/rollup-android-arm64": "4.27.3", + "@rollup/rollup-darwin-arm64": "4.27.3", + "@rollup/rollup-darwin-x64": "4.27.3", + "@rollup/rollup-freebsd-arm64": "4.27.3", + "@rollup/rollup-freebsd-x64": "4.27.3", + "@rollup/rollup-linux-arm-gnueabihf": "4.27.3", + "@rollup/rollup-linux-arm-musleabihf": "4.27.3", + "@rollup/rollup-linux-arm64-gnu": "4.27.3", + "@rollup/rollup-linux-arm64-musl": "4.27.3", + "@rollup/rollup-linux-powerpc64le-gnu": "4.27.3", + "@rollup/rollup-linux-riscv64-gnu": "4.27.3", + "@rollup/rollup-linux-s390x-gnu": "4.27.3", + "@rollup/rollup-linux-x64-gnu": "4.27.3", + "@rollup/rollup-linux-x64-musl": "4.27.3", + "@rollup/rollup-win32-arm64-msvc": "4.27.3", + "@rollup/rollup-win32-ia32-msvc": "4.27.3", + "@rollup/rollup-win32-x64-msvc": "4.27.3", "fsevents": "~2.3.2" } }, @@ -8742,14 +8597,6 @@ "dev": true, "license": "MIT" }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true, - "license": "MIT", - "peer": true - }, "node_modules/tinybench": { "version": "2.9.0", "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", @@ -8807,9 +8654,9 @@ } }, "node_modules/tinypool": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.0.1.tgz", - "integrity": "sha512-URZYihUbRPcGv95En+sz6MfghfIc2OJ1sv/RmhWZLouPY0/8Vo80viwPvg3dlaS9fuq7fQMEfgRRK7BBZThBEA==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.0.2.tgz", + "integrity": "sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==", "dev": true, "license": "MIT", "engines": { @@ -8837,22 +8684,22 @@ } }, "node_modules/tldts": { - "version": "6.1.59", - "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.59.tgz", - "integrity": "sha512-472ilPxsRuqBBpn+KuRBHJvZhk6tTo4yTVsmODrLBNLwRYJPkDfMEHivgNwp5iEl+cbrZzzRtLKRxZs7+QKkRg==", + "version": "6.1.62", + "resolved": "https://registry.npmjs.org/tldts/-/tldts-6.1.62.tgz", + "integrity": "sha512-TF+wo3MgTLbf37keEwQD0IxvOZO8UZxnpPJDg5iFGAASGxYzbX/Q0y944ATEjrfxG/pF1TWRHCPbFp49Mz1Y1w==", "dev": true, "license": "MIT", "dependencies": { - "tldts-core": "^6.1.59" + "tldts-core": "^6.1.62" }, "bin": { "tldts": "bin/cli.js" } }, "node_modules/tldts-core": { - "version": "6.1.59", - "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.59.tgz", - "integrity": "sha512-EiYgNf275AQyVORl8HQYYe7rTVnmLb4hkWK7wAk/12Ksy5EiHpmUmTICa4GojookBPC8qkLMBKKwCmzNA47ZPQ==", + "version": "6.1.62", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.62.tgz", + "integrity": "sha512-ohONqbfobpuaylhqFbtCzc0dFFeNz85FVKSesgT8DS9OV3a25Yj730pTj7/dDtCqmgoCgEj6gDiU9XxgHKQlBw==", "dev": true, "license": "MIT" }, @@ -9094,15 +8941,15 @@ } }, "node_modules/typescript-eslint": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.13.0.tgz", - "integrity": "sha512-vIMpDRJrQd70au2G8w34mPps0ezFSPMEX4pXkTzUkrNbRX+36ais2ksGWN0esZL+ZMaFJEneOBHzCgSqle7DHw==", + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.15.0.tgz", + "integrity": "sha512-wY4FRGl0ZI+ZU4Jo/yjdBu0lVTSML58pu6PgGtJmCufvzfV565pUF6iACQt092uFOd49iLOTX/sEVmHtbSrS+w==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "8.13.0", - "@typescript-eslint/parser": "8.13.0", - "@typescript-eslint/utils": "8.13.0" + "@typescript-eslint/eslint-plugin": "8.15.0", + "@typescript-eslint/parser": "8.15.0", + "@typescript-eslint/utils": "8.15.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -9111,6 +8958,9 @@ "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0" + }, "peerDependenciesMeta": { "typescript": { "optional": true @@ -9134,21 +8984,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/uncontrollable": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/uncontrollable/-/uncontrollable-7.2.1.tgz", - "integrity": "sha512-svtcfoTADIB0nT9nltgjujTi7BzVmwjZClOmskKu/E8FW9BXzg9os8OLr4f8Dlnk0rYWJIWr4wv9eKUXiQvQwQ==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.6.3", - "@types/react": ">=16.9.11", - "invariant": "^2.2.4", - "react-lifecycles-compat": "^3.0.4" - }, - "peerDependencies": { - "react": ">=15.0.0" - } - }, "node_modules/undici-types": { "version": "6.19.8", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", @@ -9270,14 +9105,15 @@ } }, "node_modules/vite-node": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-2.1.4.tgz", - "integrity": "sha512-kqa9v+oi4HwkG6g8ufRnb5AeplcRw8jUF6/7/Qz1qRQOXHImG8YnLbB+LLszENwFnoBl9xIf9nVdCFzNd7GQEg==", + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-2.1.5.tgz", + "integrity": "sha512-rd0QIgx74q4S1Rd56XIiL2cYEdyWn13cunYBIuqh9mpmQr7gGS0IxXoP8R6OaZtNQQLyXSWbd4rXKYUbhFpK5w==", "dev": true, "license": "MIT", "dependencies": { "cac": "^6.7.14", "debug": "^4.3.7", + "es-module-lexer": "^1.5.4", "pathe": "^1.1.2", "vite": "^5.0.0" }, @@ -9292,9 +9128,9 @@ } }, "node_modules/vite-tsconfig-paths": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/vite-tsconfig-paths/-/vite-tsconfig-paths-5.1.2.tgz", - "integrity": "sha512-gEIbKfJzSEv0yR3XS2QEocKetONoWkbROj6hGx0FHM18qKUojhvcokQsxQx5nMkelZq2n37zbSGCJn+FSODSjA==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/vite-tsconfig-paths/-/vite-tsconfig-paths-5.1.3.tgz", + "integrity": "sha512-0bz+PDlLpGfP2CigeSKL9NFTF1KtXkeHGZSSaGQSuPZH77GhoiQaA8IjYgOaynSuwlDTolSUEU0ErVvju3NURg==", "dev": true, "license": "MIT", "dependencies": { @@ -9312,31 +9148,31 @@ } }, "node_modules/vitest": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-2.1.4.tgz", - "integrity": "sha512-eDjxbVAJw1UJJCHr5xr/xM86Zx+YxIEXGAR+bmnEID7z9qWfoxpHw0zdobz+TQAFOLT+nEXz3+gx6nUJ7RgmlQ==", + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-2.1.5.tgz", + "integrity": "sha512-P4ljsdpuzRTPI/kbND2sDZ4VmieerR2c9szEZpjc+98Z9ebvnXmM5+0tHEKqYZumXqlvnmfWsjeFOjXVriDG7A==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/expect": "2.1.4", - "@vitest/mocker": "2.1.4", - "@vitest/pretty-format": "^2.1.4", - "@vitest/runner": "2.1.4", - "@vitest/snapshot": "2.1.4", - "@vitest/spy": "2.1.4", - "@vitest/utils": "2.1.4", + "@vitest/expect": "2.1.5", + "@vitest/mocker": "2.1.5", + "@vitest/pretty-format": "^2.1.5", + "@vitest/runner": "2.1.5", + "@vitest/snapshot": "2.1.5", + "@vitest/spy": "2.1.5", + "@vitest/utils": "2.1.5", "chai": "^5.1.2", "debug": "^4.3.7", "expect-type": "^1.1.0", "magic-string": "^0.30.12", "pathe": "^1.1.2", - "std-env": "^3.7.0", + "std-env": "^3.8.0", "tinybench": "^2.9.0", "tinyexec": "^0.3.1", "tinypool": "^1.0.1", "tinyrainbow": "^1.2.0", "vite": "^5.0.0", - "vite-node": "2.1.4", + "vite-node": "2.1.5", "why-is-node-running": "^2.3.0" }, "bin": { @@ -9351,8 +9187,8 @@ "peerDependencies": { "@edge-runtime/vm": "*", "@types/node": "^18.0.0 || >=20.0.0", - "@vitest/browser": "2.1.4", - "@vitest/ui": "2.1.4", + "@vitest/browser": "2.1.5", + "@vitest/ui": "2.1.5", "happy-dom": "*", "jsdom": "*" }, @@ -9390,15 +9226,6 @@ "node": ">=18" } }, - "node_modules/warning": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", - "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.0.0" - } - }, "node_modules/webidl-conversions": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", @@ -9687,16 +9514,12 @@ "license": "ISC" }, "node_modules/yaml": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.5.1.tgz", - "integrity": "sha512-bLQOjaX/ADgQ20isPJRvF0iRUHIxVhYvr53Of7wGcWlO2jvtUlH5m87DsmulFVxRpNLOnI4tB6p/oh8D7kpn9Q==", - "dev": true, + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", "license": "ISC", - "bin": { - "yaml": "bin.mjs" - }, "engines": { - "node": ">= 14" + "node": ">= 6" } }, "node_modules/yargs": { diff --git a/package.json b/package.json index b8e2788..463312a 100644 --- a/package.json +++ b/package.json @@ -27,17 +27,15 @@ "@emotion/react": "^11.13.3", "@emotion/styled": "^11.13.0", "@fontsource/roboto": "^5.1.0", - "@mui/icons-material": "^6.1.7", + "@mui/icons-material": "^6.1.8", "@mui/lab": "^6.0.0-beta.15", "@mui/material": "^6.1.7", - "@mui/x-date-pickers": "^7.22.2", + "@mui/x-date-pickers": "^7.22.3", "@zl-asica/react": "^0.3.4", - "date-fns": "^4.1.0", + "dayjs": "^1.11.13", "es-toolkit": "^1.27.0", "firebase": "^11.0.2", - "moment": "^2.30.1", "react": "^18.3.1", - "react-big-calendar": "^1.15.0", "react-dom": "^18.3.1", "react-router-dom": "^6.28.0" }, diff --git a/src/App.tsx b/src/App.tsx index 5b427b2..6e4b483 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -4,7 +4,6 @@ import { ThemeProvider } from '@mui/material'; import { BrowserRouter as Router } from 'react-router-dom'; import { UserProvider } from '@/context/UserContext'; -import { EventsProvider } from '@/context/EventsContext'; import AppRoutes from '@/routes'; import { Header, Footer } from '@/components/common'; @@ -15,25 +14,23 @@ const App = () => { return ( - -
- -
-
- {/* Main content area where pages will render */} - -
+
+ +
+
+ {/* Main content area where pages will render */} + +
- {/* Bottom Navigation with React Router links */} -
- -
- + {/* Bottom Navigation with React Router links */} +
); diff --git a/src/components/Home/DonorDashboard/DonationModal.tsx b/src/components/Home/DonorDashboard/DonationModal.tsx new file mode 100644 index 0000000..1cf8fe2 --- /dev/null +++ b/src/components/Home/DonorDashboard/DonationModal.tsx @@ -0,0 +1,199 @@ +import { useState } from 'react'; +import { + Modal, + Box, + Typography, + Button, + RadioGroup, + FormControlLabel, + Radio, + Divider, +} from '@mui/material'; +import { LocalizationProvider, DateTimePicker } from '@mui/x-date-pickers'; +import { AdapterDayjs } from '@mui/x-date-pickers/AdapterDayjs'; +import type dayjs from 'dayjs'; + +import { useEvents } from '@/hooks'; + +import { MessageDialog } from '@/components/common'; + +interface DonationModalProps { + open: boolean; + onClose: () => void; + organization: OrganizationProfile; + selectedNeeds: string[]; + donor: DonorProfile; +} + +const DonationModal = ({ + open, + onClose, + organization, + selectedNeeds, + donor, +}: DonationModalProps) => { + const [method, setMethod] = useState('drop-off'); + const [selectedTime, setSelectedTime] = useState(null); + const [openMessageDialog, setOpenMessageDialog] = useState(false); + const [message, setMessage] = useState(''); + const { addOrUpdateEvent } = useEvents(); + + const handleConfirm = async () => { + if (selectedNeeds.length === 0 || !selectedTime || !method) { + setMessage('Please fill out all fields and select at least one need.'); + setOpenMessageDialog(true); + return; + } + + const newEvent: DonationEvent = { + eventId: `${organization.uid}-${donor.uid}-${new Date().toISOString()}`, // Unique ID + organizationId: organization.uid, + donorId: donor.uid, + title: `Donation to ${organization.name}`, + description: `Donation of items: ${selectedNeeds.join(', ')}`, + date: selectedTime!.toDate(), // Ensure selectedTime is not null + supplies: selectedNeeds.map( + (item) => + ({ + itemName: item, + quantityNeeded: 1, // Default assumption + quantityProvided: 1, // Donor provides these items + providedBy: [donor.uid], // Add the donor ID + status: true, + }) as Supply + ), + }; + + try { + // Add or update the event using the useEvents hook + await addOrUpdateEvent(newEvent); + + setMessage('Donation successfully added to your schedule!'); + setOpenMessageDialog(true); + onClose(); // Close the modal + } catch (error) { + console.error('Error adding/updating event:', error); + setMessage('Failed to schedule donation. Please try again.'); + setOpenMessageDialog(true); + } + }; + + return ( + <> + + + + Schedule Your Donation + + + + + Select a Delivery Method: + + setMethod(e.target.value)} + > + } + label='Drop-off' + /> + {organization.pickup && ( + } + label='Pick-up' + /> + )} + + + + + Select a Time: + + + + + + + + + + + + + + setOpenMessageDialog(false)} + message={message} + /> + + ); +}; + +export default DonationModal; diff --git a/src/components/Home/DonorDashboard/NeedList.tsx b/src/components/Home/DonorDashboard/NeedList.tsx new file mode 100644 index 0000000..fc4dc33 --- /dev/null +++ b/src/components/Home/DonorDashboard/NeedList.tsx @@ -0,0 +1,39 @@ +import { + List, + ListItem, + Checkbox, + ListItemText, + Typography, +} from '@mui/material'; + +interface NeedsListProps { + needs: string[]; + checkedItems: boolean[]; + onToggle: (index: number) => void; +} + +const NeedsList = ({ needs, checkedItems, onToggle }: NeedsListProps) => ( + + {needs.length > 0 ? ( + needs.map((need, index) => ( + + onToggle(index)} + /> + + + )) + ) : ( + + No current needs. + + )} + +); + +export default NeedsList; diff --git a/src/components/Home/DonorDashboard/OrganizationCard.tsx b/src/components/Home/DonorDashboard/OrganizationCard.tsx new file mode 100644 index 0000000..2fd84cb --- /dev/null +++ b/src/components/Home/DonorDashboard/OrganizationCard.tsx @@ -0,0 +1,170 @@ +import { + Card, + CardContent, + CardActions, + CardHeader, + Button, + Collapse, + Typography, + Divider, +} from '@mui/material'; +import { ExpandMore, ExpandLess } from '@mui/icons-material'; +import { lighten, useTheme } from '@mui/material/styles'; +import { useState, useMemo, useCallback } from 'react'; +import { useToggle } from '@zl-asica/react'; + +import DonationModal from './DonationModal'; +import NeedsList from './NeedList'; + +import { useSavedOrgs, useUser } from '@/hooks'; + +import { RoleSelectionModal } from '@/components/common'; + +interface OrganizationCardProps { + organization: OrganizationProfile; +} + +const OrganizationCard = ({ organization }: OrganizationCardProps) => { + const theme = useTheme(); + const { user } = useUser(); + const { savedOrgs, updateSavedOrgs } = useSavedOrgs(); + const hasNeeds = organization.needs.length > 0 ? true : false; + const [isModalOpen, toggleModal] = useToggle(); + const [isExpanded, toggleExpand] = useToggle(); + const [roleDialogOpen, toggleRoleDialog] = useToggle(); + const [checkedItems, setCheckedItems] = useState( + organization.needs.map(() => false) + ); + + const isSaved = useMemo( + () => savedOrgs.some((org) => org.uid === organization.uid), + [savedOrgs, organization.uid] + ); + + const checkedItemsList = useMemo( + () => organization.needs.filter((_, index) => checkedItems[index]), + [checkedItems, organization.needs] + ); + + const handleAction = useCallback( + (action: 'save' | 'donate') => { + if (!user) { + toggleRoleDialog(); + return; + } + + if (action === 'save') { + updateSavedOrgs(organization); + } else if (action === 'donate') { + toggleModal(); + } + }, + [user, organization, toggleModal, toggleRoleDialog, updateSavedOrgs] + ); + + const handleCheckboxToggle = useCallback((index: number) => { + setCheckedItems((prevCheckedItems) => + prevCheckedItems.map((item, i) => (i === index ? !item : item)) + ); + }, []); + + const cardStyles = useMemo( + () => ({ + mt: 2, + mx: 2, + backgroundColor: lighten(theme.palette.primary.light, 0.8), + }), + [theme] + ); + + return ( + <> + + handleAction('save')} + > + {isSaved ? 'Unsave' : 'Save'} + + ) + } + /> + + + {organization.description} + + + + + {hasNeeds && ( + + )} + {organization.loanable && } + {hasNeeds && user && ( + + )} + + + {hasNeeds ? ( + <> + + + + + + ) : ( + + No current needs. + + )} + + + + + ); +}; + +export default OrganizationCard; diff --git a/src/pages/DonorDashboard.tsx b/src/components/Home/DonorDashboard/index.tsx similarity index 50% rename from src/pages/DonorDashboard.tsx rename to src/components/Home/DonorDashboard/index.tsx index 4fc54d2..a557245 100644 --- a/src/pages/DonorDashboard.tsx +++ b/src/components/Home/DonorDashboard/index.tsx @@ -1,36 +1,19 @@ -import { Box } from '@mui/material'; +import { Box, Typography } from '@mui/material'; import { filter, lowerCase, some } from 'es-toolkit/compat'; import { useState } from 'react'; +import OrganizationCard from './OrganizationCard'; + +import { useUser } from '@/hooks'; + import { SearchBar } from '@/components/common'; -import OrganizationCard from '@/components/Home/OrganizationCard'; const DonorDashboard = () => { - const organizations = [ - { - id: 1, - name: 'Community Food Pantry', - location: 'City Center', - description: 'Providing food for those in need.', - website: 'https://example.com', - needs: ['Bread', 'Canned Soup', 'Boxed Pasta', 'Fresh Vegetables'], - loanable: false, - }, - { - id: 2, - name: 'Youth Theater Company', - location: 'Downtown', - description: 'Supporting young artists.', - website: 'https://example.com', - needs: ['Costumes', 'Props'], - loanable: true, - }, - ]; - - const [searchQuery, setSearchQuery] = useState(''); // New state for search query + const [searchQuery, setSearchQuery] = useState(''); + const { organizationProfiles } = useUser(); // Filtered organizations based on search query - const filteredOrganizations = filter(organizations, (org) => { + const filteredOrganizations = filter(organizationProfiles, (org) => { const searchTerm = lowerCase(searchQuery); return ( lowerCase(org.name).includes(searchTerm) || @@ -39,7 +22,7 @@ const DonorDashboard = () => { ); }); - return ( + return organizationProfiles.length > 0 ? (
{ {filteredOrganizations.map((org) => ( ))}
+ ) : ( + + No organizations. + ); }; diff --git a/src/components/Home/OrganizationCard.tsx b/src/components/Home/OrganizationCard.tsx deleted file mode 100644 index e2d221c..0000000 --- a/src/components/Home/OrganizationCard.tsx +++ /dev/null @@ -1,139 +0,0 @@ -import { - Card, - CardContent, - CardActions, - CardHeader, - Button, - Collapse, - List, - ListItem, - ListItemText, - Checkbox, - Typography, -} from '@mui/material'; -import { ExpandMore, ExpandLess } from '@mui/icons-material'; -import { lighten, useTheme } from '@mui/material/styles'; -import { useEffect, useState } from 'react'; -import { useToggle } from '@zl-asica/react'; - -import { useSavedOrgs } from '@/hooks'; - -import { DonationModal } from '@/components/common'; - -const OrganizationCard: React.FC<{ organization: OrganizationProfile }> = ({ - organization, -}) => { - const theme = useTheme(); - const [isExpanded, toggleExpand] = useToggle(); - const { savedOrgs, updateSavedOrgs } = useSavedOrgs(); - const isSaved = savedOrgs.some((org) => org.uid === organization.uid); - const [isModalOpen, toggleModal] = useToggle(); - const [checkedItems, setCheckedItems] = useState([]); - const [checkedItemsList, setCheckedItemsList] = useState([]); - - // Function to handle checkbox toggling - const handleCheckboxToggle = (index: number) => { - setCheckedItems((prevCheckedItems) => { - const newCheckedItems = [...prevCheckedItems]; - newCheckedItems[index] = !newCheckedItems[index]; - return newCheckedItems; - }); - }; - - useEffect(() => { - setCheckedItems(organization.needs.map(() => false)); - }, [organization.needs]); - - useEffect(() => { - const checked = organization.needs.filter( - (_: string, index: number) => checkedItems[index] - ); - setCheckedItemsList(checked); - }, [checkedItems, organization.needs]); - - return ( - - updateSavedOrgs(organization)} - > - {isSaved ? 'Unsave' : 'Save'} - - } - /> - - - {organization.description} - - - - - - {organization.loanable && } - - - - - {organization.needs.length > 0 ? ( - - {organization.needs.map((need: string, index: number) => ( - - handleCheckboxToggle(index)} - /> - - - ))} - - ) : ( - - No current needs. - - )} - - - ); -}; - -export default OrganizationCard; diff --git a/src/pages/OrganizationDashboard.tsx b/src/components/Home/OrganizationDashboard/index.tsx similarity index 91% rename from src/pages/OrganizationDashboard.tsx rename to src/components/Home/OrganizationDashboard/index.tsx index 63861b8..7dd4556 100644 --- a/src/pages/OrganizationDashboard.tsx +++ b/src/components/Home/OrganizationDashboard/index.tsx @@ -1,5 +1,3 @@ -import React from 'react'; - const OrganizationDashboard = () => { return (
diff --git a/src/components/Home/SavedCard.tsx b/src/components/Saved/SavedCard.tsx similarity index 100% rename from src/components/Home/SavedCard.tsx rename to src/components/Saved/SavedCard.tsx diff --git a/src/components/Schedule/index.tsx b/src/components/Schedule/index.tsx new file mode 100644 index 0000000..b954199 --- /dev/null +++ b/src/components/Schedule/index.tsx @@ -0,0 +1,213 @@ +import { useState } from 'react'; +import { + Box, + Typography, + Dialog, + DialogActions, + DialogContent, + DialogTitle, + Button, +} from '@mui/material'; +import type { PickersDayProps } from '@mui/x-date-pickers'; +import { LocalizationProvider, StaticDatePicker } from '@mui/x-date-pickers'; +import { AdapterDayjs } from '@mui/x-date-pickers/AdapterDayjs'; +import type { Dayjs } from 'dayjs'; +import dayjs from 'dayjs'; +import { useToggle } from '@zl-asica/react'; + +interface ScheduleBaseProps { + events: DonationEvent[]; + title: string; + description: string; +} + +const ScheduleBase = ({ events, title, description }: ScheduleBaseProps) => { + const [selectedDate, setSelectedDate] = useState(dayjs()); + const [selectedEvent, setSelectedEvent] = useState( + null + ); + const [open, toggleOpen] = useToggle(); + + const eventsForSelectedDate = events.filter((event) => + dayjs(event.date).isSame(selectedDate, 'day') + ); + + const handleEventClick = (event: DonationEvent) => { + setSelectedEvent(event); + toggleOpen(); + }; + + const handleClose = () => { + toggleOpen(); + setSelectedEvent(null); + }; + + const hasEventOnDate = (date: Dayjs) => + events.some((event) => dayjs(event.date).isSame(date, 'day')); + + return ( + + + {title} + + + {description} + + + setSelectedDate(newDate)} + displayStaticWrapperAs='desktop' + // ! NEEDS TO BE FIXED + // @ts-expect-error: Ignore for now + renderDay={( + day: Dayjs, + _value: Dayjs, + DayComponentProps: PickersDayProps + ) => { + const isEventDay = hasEventOnDate(day); + + return ( + +
{DayComponentProps.children}
+ {isEventDay && ( + + )} + + ); + }} + /> +
+ + + Events for {selectedDate?.format('MMMM D, YYYY')}: + + {eventsForSelectedDate.length > 0 ? ( + eventsForSelectedDate.map((event) => ( + handleEventClick(event)} + > + + {event.title} + + {event.description} + + {dayjs(event.date).format('MMMM D, YYYY, h:mm A')} + + + )) + ) : ( + + No events for this date. + + )} + + + {/* Event Details Modal */} + + Event Details + + {selectedEvent && ( + <> + + Title: + + {selectedEvent.title} + + Description: + + {selectedEvent.description} + + Date & Time: + + + {dayjs(selectedEvent.date).format('MMMM D, YYYY, h:mm A')} + + + Supplies: + + {selectedEvent.supplies.map((supply, index) => ( + + {supply.itemName} - {supply.quantityProvided} provided + + ))} + + )} + + + + + +
+ ); +}; + +export default ScheduleBase; diff --git a/src/components/common/DonationModal.tsx b/src/components/common/DonationModal.tsx deleted file mode 100644 index 7cda9c7..0000000 --- a/src/components/common/DonationModal.tsx +++ /dev/null @@ -1,144 +0,0 @@ -import { useState } from 'react'; -import { - Modal, - Box, - Typography, - Button, - RadioGroup, - FormControlLabel, - Radio, - TextField, -} from '@mui/material'; - -import { useEvents } from '@/hooks'; - -import { MessageDialog } from '@/components/common'; - -interface DonationModalProps { - open: boolean; - onClose: () => void; - organization: { - name: string; - location: string; - pickup: boolean; - }; - selectedNeeds: string[]; -} - -const DonationModal: React.FC = ({ - open, - onClose, - organization, - selectedNeeds, -}) => { - const [method, setMethod] = useState('drop-off'); - const [selectedTime, setSelectedTime] = useState(''); - const [openMessageDialog, setOpenMessageDialog] = useState(false); - const [message, setMessage] = useState(''); - const { addEvent } = useEvents(); - - const handleConfirm = () => { - if (selectedNeeds.length === 0 || !selectedTime || !method) { - setMessage('Please fill out all fields and select at least one need'); - setOpenMessageDialog(true); - return; - } - - addEvent({ - organizationName: organization.name, - organizationLocation: organization.location, - items: selectedNeeds, - time: selectedTime, - method, - }); - - setMessage('Donation successfully added to your schedule!'); - setOpenMessageDialog(true); - - onClose(); - }; - - return ( - <> - - - - Schedule Your Donation - - setMethod(e.target.value)} - sx={{ mb: 2 }} - > - } - label='Drop-off' - /> - {organization.pickup && ( - } - label='Pick-up' - /> - )} - - - Select a time: - - setSelectedTime(e.target.value)} - sx={{ mb: 2 }} - /> - - - - - - - - setOpenMessageDialog(false)} - message={message} - /> - - ); -}; - -export default DonationModal; diff --git a/src/components/common/Header.tsx b/src/components/common/Header.tsx index 38bd1c8..0d591be 100644 --- a/src/components/common/Header.tsx +++ b/src/components/common/Header.tsx @@ -13,10 +13,10 @@ import { useToggle } from '@zl-asica/react'; import { useUser } from '@/hooks'; -import { CustomDialog, ConfirmationDialog } from '@/components/common'; +import { RoleSelectionModal, ConfirmationDialog } from '@/components/common'; const Header = () => { - const { user, login, logout } = useUser(); + const { user, logout } = useUser(); const location = useLocation(); const navigate = useNavigate(); @@ -107,28 +107,10 @@ const Header = () => { - {/* Role Selection Dialog */} - { - await login('donor', navigate); - toggleRoleDialog(); - }, - }, - { - text: 'Organization', - onClick: async () => { - await login('organization', navigate); - toggleRoleDialog(); - }, - }, - ]} /> ); diff --git a/src/components/common/RoleSelectionModal.tsx b/src/components/common/RoleSelectionModal.tsx new file mode 100644 index 0000000..66cb790 --- /dev/null +++ b/src/components/common/RoleSelectionModal.tsx @@ -0,0 +1,43 @@ +import { useNavigate } from 'react-router-dom'; + +import CustomDialog from './CustomDialog'; + +import { useUser } from '@/hooks'; + +interface RoleSelectionModalProps { + open: boolean; + onClose: () => void; +} + +const RoleSelectionModal = ({ open, onClose }: RoleSelectionModalProps) => { + const { login } = useUser(); + const navigate = useNavigate(); + + return ( + // Role Selection Dialog + { + await login('donor', navigate); + onClose(); + }, + }, + { + text: 'Organization', + onClick: async () => { + await login('organization', navigate); + onClose(); + }, + }, + ]} + /> + ); +}; + +export default RoleSelectionModal; diff --git a/src/components/common/index.tsx b/src/components/common/index.tsx index bd3542c..29bd5ad 100644 --- a/src/components/common/index.tsx +++ b/src/components/common/index.tsx @@ -5,5 +5,5 @@ export { default as SearchBar } from './SearchBar'; export { default as ConfirmationDialog } from './ConfirmationDialog'; export { default as ProtectedRoute } from './ProtectedRoute'; export { default as MessageDialog } from './MessageDialog'; -export { default as DonationModal } from './DonationModal'; export { default as CustomDialog } from './CustomDialog'; +export { default as RoleSelectionModal } from './RoleSelectionModal'; diff --git a/src/context/EventsContext.tsx b/src/context/EventsContext.tsx deleted file mode 100644 index 40fd6fd..0000000 --- a/src/context/EventsContext.tsx +++ /dev/null @@ -1,26 +0,0 @@ -import { createContext, useState } from 'react'; - -interface EventsContextType { - events: ScheduledDonation[]; - addEvent: (newEvent: ScheduledDonation) => void; -} - -const EventsContext = createContext(undefined); - -const EventsProvider: React.FC<{ children: React.ReactNode }> = ({ - children, -}) => { - const [events, setEvents] = useState([]); - - const addEvent = (newEvent: ScheduledDonation) => { - setEvents((prevEvents) => [...prevEvents, newEvent]); - }; - - return ( - - {children} - - ); -}; - -export { EventsContext, EventsProvider }; diff --git a/src/context/UserContext.tsx b/src/context/UserContext.tsx index 356b702..b84522f 100644 --- a/src/context/UserContext.tsx +++ b/src/context/UserContext.tsx @@ -11,11 +11,13 @@ import { auth, updateDocument, getAllOrganizationProfiles, + listenToEventsByIds, } from '@/utils/firebase'; interface UserContextType { user: User | undefined; organizationProfiles: OrganizationProfile[]; + events: DonationEvent[]; loading: boolean; login: (userType: UserType, navigate: NavigateFunction) => Promise; logout: (navigate: NavigateFunction) => Promise; @@ -32,18 +34,25 @@ const UserProvider = ({ children }: { children: React.ReactNode }) => { ); const { value: organizationProfiles, setValue: setOrganizationProfiles } = useSessionStorage('organizationProfiles', []); + const { value: events, setValue: setEvents } = useSessionStorage< + DonationEvent[] + >('events', []); + const [loading, setLoading] = useState(true); // Monitor auth state changes useEffect(() => { let unsubscribeProfiles: (() => void) | undefined; + let unsubscribeEvents: (() => void) | undefined; if (organizationProfiles.length === 0) { unsubscribeProfiles = getAllOrganizationProfiles(setOrganizationProfiles); } const unsubscribeAuth = onAuthStateChanged(auth, async (firebaseUser) => { if (firebaseUser) { - if (!user) { + if (user) { + unsubscribeEvents = listenToEventsByIds(user.joinedEvents, setEvents); + } else { // if user logged in but not in local storage // clear user and let the user login again setUser(undefined); @@ -56,6 +65,7 @@ const UserProvider = ({ children }: { children: React.ReactNode }) => { return () => { if (unsubscribeProfiles) unsubscribeProfiles(); + if (unsubscribeEvents) unsubscribeEvents(); unsubscribeAuth(); }; }, []); @@ -117,6 +127,7 @@ const UserProvider = ({ children }: { children: React.ReactNode }) => { value={{ user, organizationProfiles, + events, loading, login, logout, diff --git a/src/hooks/useEvents.ts b/src/hooks/useEvents.ts index cc7658a..d541895 100644 --- a/src/hooks/useEvents.ts +++ b/src/hooks/useEvents.ts @@ -1,13 +1,69 @@ -import { useContext } from 'react'; +import useUser from './useUser'; -import { EventsContext } from '@/context/EventsContext'; +import { updateEvent, removeEvent } from '@/utils/firebase'; const useEvents = () => { - const context = useContext(EventsContext); - if (!context) { - throw new Error('useEvents must be used within an EventsProvider'); + const { user, updateProfile } = useUser(); + + if (!user) { + return { + events: [], + addOrUpdateEvent: async () => { + console.warn('No user logged in.'); + }, + removeEvent: async () => { + console.warn('No user logged in.'); + }, + }; } - return context; + + const { joinedEvents = [] } = user; + + const addOrUpdateEvent = async (event: DonationEvent): Promise => { + const isAlreadyJoined = joinedEvents.includes(event.eventId); + + const updatedEvents = isAlreadyJoined + ? joinedEvents + : [...joinedEvents, event.eventId]; + + try { + // Update the user profile's joinedEvents + await updateProfile({ joinedEvents: updatedEvents }); + + // Add or update the event in the Firestore collection + await updateEvent(event); + + console.info( + isAlreadyJoined + ? `Event ${event.eventId} updated successfully.` + : `Event ${event.eventId} added successfully.` + ); + } catch (error) { + console.error('Error adding/updating event:', error); + alert('Failed to add/update event. Please try again.'); + } + }; + + const removeEventFromUser = async (eventId: string): Promise => { + const updatedEvents = joinedEvents.filter((id) => id !== eventId); + + try { + // Update the user profile's joinedEvents + await updateProfile({ joinedEvents: updatedEvents }); + + // Remove the event from the Firestore collection + await removeEvent(eventId); + } catch (error) { + console.error('Error removing event:', error); + alert('Failed to remove event. Please try again.'); + } + }; + + return { + events: joinedEvents, // Return user's joined events (IDs only) + addOrUpdateEvent, + removeEvent: removeEventFromUser, + }; }; export default useEvents; diff --git a/src/pages/Home.tsx b/src/pages/Home.tsx index 26a8175..109c543 100644 --- a/src/pages/Home.tsx +++ b/src/pages/Home.tsx @@ -1,50 +1,16 @@ -import { Box, Typography } from '@mui/material'; -import { filter, lowerCase, some } from 'es-toolkit/compat'; -import { useState } from 'react'; - import { useUser } from '@/hooks'; -import { SearchBar } from '@/components/common'; -import OrganizationCard from '@/components/Home/OrganizationCard'; +import OrganizationDashboard from '@/components/Home/OrganizationDashboard'; +import DonorDashboard from '@/components/Home/DonorDashboard'; const Home = () => { - const [searchQuery, setSearchQuery] = useState(''); // New state for search query - const { organizationProfiles } = useUser(); // Get organization profiles from context + const { user } = useUser(); - // Filtered organizations based on search query - const filteredOrganizations = filter(organizationProfiles, (org) => { - const searchTerm = lowerCase(searchQuery); - return ( - lowerCase(org.name).includes(searchTerm) || - lowerCase(org.location).includes(searchTerm) || - some(org.needs, (need) => lowerCase(need).includes(searchTerm)) - ); - }); + if (user && user.role === 'organization') { + return ; + } - return organizationProfiles.length > 0 ? ( -
- - - {filteredOrganizations.map((org) => ( - - ))} - -
- ) : ( - - No organizations. - - ); + return ; }; export default Home; diff --git a/src/pages/Saved.tsx b/src/pages/Saved.tsx index 6b4c39e..5d1a5d5 100644 --- a/src/pages/Saved.tsx +++ b/src/pages/Saved.tsx @@ -2,7 +2,7 @@ import { Box, Typography } from '@mui/material'; import { useSavedOrgs } from '@/hooks'; -import SavedOrganizationCard from '@/components/Home/SavedCard'; +import SavedOrganizationCard from '@/components/Saved/SavedCard'; const Saved = () => { const { savedOrgs, updateSavedOrgs } = useSavedOrgs(); diff --git a/src/pages/Schedule.tsx b/src/pages/Schedule.tsx index e8afc4a..843bbdd 100644 --- a/src/pages/Schedule.tsx +++ b/src/pages/Schedule.tsx @@ -1,99 +1,27 @@ -import { useState } from 'react'; -import { Calendar as BigCalendar, momentLocalizer } from 'react-big-calendar'; -import moment from 'moment'; -import 'react-big-calendar/lib/css/react-big-calendar.css'; -import { - Dialog, - DialogActions, - DialogContent, - DialogTitle, - Button, -} from '@mui/material'; -import { useToggle } from '@zl-asica/react'; - -import { useEvents } from '@/hooks'; - -// Set the localizer to use moment.js -const localizer = momentLocalizer(moment); // Create localizer using moment - -const Schedule = () => { - const { events }: { events: ScheduledDonation[] } = useEvents(); - const [selectedEvent, setSelectedEvent] = useState( - null - ); // For the modal event details - const [open, toggleOpen] = useToggle(); - - // Convert ScheduledDonation to a calendar event format - const calendarEvents: CalendarEvent[] = events.map((donation) => ({ - title: `${donation.organizationName}`, - start: new Date(donation.time), // Convert string time to Date object - end: new Date(new Date(donation.time).getTime() + 30 * 60 * 1000), - donationDetails: donation, // Store the donation details in the event object - })); - - // Event click handler to open the modal - const handleEventClick = (event: CalendarEvent) => { - setSelectedEvent(event.donationDetails); // Set the selected event's details - toggleOpen(); - }; - - // Handle closing the modal - const handleClose = () => { - toggleOpen(); - setSelectedEvent(null); // Clear selected event data - }; - - return ( -
-

Schedule

- - - {/* Modal to show event details */} - - Donation Details - - {selectedEvent && ( - <> -

- Organization: {selectedEvent.organizationName} -

-

- Location: {selectedEvent.organizationLocation} -

-

- Items: {selectedEvent.items.join(', ')} -

-

- Time:{' '} - {moment(selectedEvent.time).format('MMMM Do YYYY, h:mm a')} -

-

- Method: {selectedEvent.method} -

- - )} -
- - - -
-
+import { useUser } from '@/hooks'; + +import ScheduleBase from '@/components/Schedule'; + +const DonorSchedule = () => { + const { user, events } = useUser(); + + if (!user || !events) { + return null; + } + + return user.role === 'donor' ? ( + + ) : ( + ); }; -export default Schedule; +export default DonorSchedule; diff --git a/src/routes.tsx b/src/routes.tsx index 897cdb8..2b7a81d 100644 --- a/src/routes.tsx +++ b/src/routes.tsx @@ -4,23 +4,22 @@ import Home from '@/pages/Home'; import Schedule from '@/pages/Schedule'; import Saved from '@/pages/Saved'; import Alerts from '@/pages/Alerts'; -import OrganizationDashboard from '@/pages/OrganizationDashboard'; -import DonorDashboard from '@/pages/DonorDashboard'; import { ProtectedRoute } from '@/components/common'; const AppRoutes = () => { const routeConfig = [ - { path: '/', element: }, { path: '/schedule', element: }, { path: '/saved', element: }, { path: '/alerts', element: }, - { path: '/organization-dashboard', element: }, - { path: '/donor-dashboard', element: }, ]; return ( + } + /> {routeConfig.map(({ path, element }) => ( ; saved: OrganizationProfile[]; } @@ -24,22 +42,9 @@ interface OrganizationProfile extends BasicProfile { location: string; description: string; website: string; - events: { - eventId: string; - title: string; - description: string; - date: Date; - supplies: { - itemName: string; - quantityNeeded: number; - quantityProvided: number; - providedBy: string[]; // array of uid of donors - status: boolean; // true if provided - }[]; - }[]; needs: string[]; loanable: boolean; pickup: boolean; } -type User = OrganizationProfile | DonorProfile; +type User = DonorProfile | OrganizationProfile; diff --git a/src/utils/firebase/eventsUtils.ts b/src/utils/firebase/eventsUtils.ts new file mode 100644 index 0000000..555aa0c --- /dev/null +++ b/src/utils/firebase/eventsUtils.ts @@ -0,0 +1,96 @@ +import { + collection, + deleteDoc, + doc, + getDoc, + onSnapshot, + setDoc, +} from 'firebase/firestore'; + +import { db } from './firebaseConfig'; + +/** + * Listen to all events by event IDs. + * + * @param eventIds The array of event IDs to listen for. + * @param callback A function to update the state with the latest events data. + * @returns A cleanup function to unsubscribe from the Firestore listener. + */ +const listenToEventsByIds = ( + eventIds: string[], + callback: (events: DonationEvent[]) => void +): (() => void) => { + const eventsCollection = collection(db, 'events'); + const unsubscribes: (() => void)[] = []; + + for (const eventId of eventIds) { + const eventRef = doc(eventsCollection, eventId); + + const unsubscribe = onSnapshot(eventRef, (eventSnap) => { + if (eventSnap.exists()) { + const updatedEvent = { + ...eventSnap.data(), + eventId, + } as DonationEvent; + + callback([updatedEvent]); + } + }); + + unsubscribes.push(unsubscribe); + } + + // Cleanup function to unsubscribe all listeners + return () => { + for (const unsubscribe of unsubscribes) unsubscribe(); + }; +}; + +/** + * Add or update an event in the Firestore `events` collection. + * + * @param event The DonationEvent object to be added or updated. + * @returns A promise that resolves when the event is updated. + */ +const updateEvent = async (event: DonationEvent): Promise => { + try { + const eventRef = doc(db, 'events', event.eventId); + const eventSnap = await getDoc(eventRef); + + if (eventSnap.exists()) { + // Merge updates with the existing event + await setDoc( + eventRef, + { ...eventSnap.data(), ...event }, + { merge: true } + ); + console.info(`Event ${event.eventId} updated successfully.`); + } else { + // Create a new event + await setDoc(eventRef, event); + console.info(`Event ${event.eventId} added successfully.`); + } + } catch (error) { + console.error('Error updating event:', error); + throw error; // Rethrow error for caller to handle + } +}; + +/** + * Remove an event from the Firestore `events` collection. + * + * @param eventId The ID of the event to be removed. + * @returns A promise that resolves when the event is removed. + */ +const removeEvent = async (eventId: string): Promise => { + try { + const eventRef = doc(db, 'events', eventId); + await deleteDoc(eventRef); + console.info(`Event ${eventId} removed successfully.`); + } catch (error) { + console.error(`Error removing event ${eventId}:`, error); + throw error; // Rethrow error for caller to handle + } +}; + +export { listenToEventsByIds, updateEvent, removeEvent }; diff --git a/src/utils/firebase/firebaseUtils.ts b/src/utils/firebase/firebaseUtils.ts index f801c46..7225587 100644 --- a/src/utils/firebase/firebaseUtils.ts +++ b/src/utils/firebase/firebaseUtils.ts @@ -3,7 +3,6 @@ import { collection, doc, getDoc, - getDocs, setDoc, onSnapshot, } from 'firebase/firestore'; diff --git a/src/utils/firebase/index.ts b/src/utils/firebase/index.ts index 190097d..cabb53a 100644 --- a/src/utils/firebase/index.ts +++ b/src/utils/firebase/index.ts @@ -1,3 +1,4 @@ export { loginUser, logoutUser } from './auth'; export { auth } from './firebaseConfig'; export { updateDocument, getAllOrganizationProfiles } from './firebaseUtils'; +export { listenToEventsByIds, updateEvent, removeEvent } from './eventsUtils'; diff --git a/src/utils/firebase/userProfile.ts b/src/utils/firebase/userProfile.ts index 297f1b0..02f126b 100644 --- a/src/utils/firebase/userProfile.ts +++ b/src/utils/firebase/userProfile.ts @@ -3,85 +3,69 @@ import type { NavigateFunction } from 'react-router-dom'; import { getOrCreateDocument } from './firebaseUtils'; +const createDefaultProfile = ( + role: UserType, + basicData: Partial +): DonorProfile | OrganizationProfile => { + const baseProfile = { + uid: basicData.uid as string, + name: basicData.name as string, + email: basicData.email as string, + profilePic: basicData.profilePic as string, + joinedEvents: [], + createdAt: new Date(), + role, + }; + + if (role === 'donor') { + return { + ...baseProfile, + providedSupplies: [], + saved: [], + }; + } + + return { + ...baseProfile, + location: '', + description: '', + website: '', + needs: [], + loanable: false, + pickup: false, + }; +}; + const getUserProfile = async ( user: User, - role: 'donor' | 'organization', + role: UserType, navigate: NavigateFunction ): Promise => { const { uid, email, photoURL, displayName } = user; + const defaultProfile = createDefaultProfile(role, { + uid, + email: email as string, + profilePic: photoURL || '', + name: displayName || 'Unnamed User', + }); + const userProfile = role === 'donor' - ? getDonorProfile( + ? await getOrCreateDocument( + 'donor', uid, - email as string, - photoURL as string, - displayName as string + defaultProfile as DonorProfile ) - : getOrganizationProfile( + : await getOrCreateDocument( + 'organizations', uid, - email as string, - photoURL as string, - displayName as string + defaultProfile as OrganizationProfile ); - if (role === 'donor' || !userProfile) { - navigate('/'); - } else if (role === 'organization') { - navigate('/organization-dashboard'); - } + navigate('/'); return userProfile; }; -const getDonorProfile = async ( - uid: string, - email: string, // Login email from authentication - photoURL: string, - displayName: string -): Promise => { - const defaultProfile: DonorProfile = { - uid, - name: displayName, - email, // Store the login email - profilePic: photoURL, - createdAt: new Date(), - role: 'donor', - joinedEvents: [], // Initialize empty array - providedSupplies: [], // Initialize empty array - saved: [], - }; - - return getOrCreateDocument('donor', uid, defaultProfile); -}; - -const getOrganizationProfile = async ( - uid: string, - email: string, // Login email for the organization - photoURL: string, - displayName: string -): Promise => { - const defaultProfile: OrganizationProfile = { - uid, - name: displayName, - email, // Store the login email - profilePic: photoURL, - createdAt: new Date(), - role: 'organization', - location: '', // Default empty string - description: '', // Default empty string - website: '', // Default empty string - events: [], // Initialize empty array - needs: [], - loanable: false, - pickup: false, - }; - - return getOrCreateDocument( - 'organizations', - uid, - defaultProfile - ); -}; - export default getUserProfile; diff --git a/vite.config.ts b/vite.config.ts index 4218456..742ee0d 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -15,6 +15,7 @@ export default defineConfig({ environment: 'jsdom', }, build: { + cssCodeSplit: true, rollupOptions: { output: { manualChunks: { @@ -26,9 +27,6 @@ export default defineConfig({ '@mui/x-date-pickers', ], firebase: ['firebase/app', 'firebase/auth', 'firebase/firestore'], - dateFns: ['date-fns'], - bigCalendar: ['react-big-calendar'], - moment: ['moment'], }, }, },