diff --git a/package-lock.json b/package-lock.json index e8c4831..76746cc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "dotbugi", - "version": "3.1.13", + "version": "3.1.16", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "dotbugi", - "version": "3.1.13", + "version": "3.1.16", "dependencies": { "@heroui/switch": "^2.2.9", "@heroui/system": "^2.4.7", @@ -24,12 +24,14 @@ "@radix-ui/react-tabs": "^1.1.2", "@radix-ui/react-toast": "^1.2.4", "@radix-ui/react-tooltip": "^1.1.7", + "@types/gapi.client.calendar": "^3.0.12", "axios": "^1.12.0", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "date-fns": "^4.1.0", "framer-motion": "^12.0.6", "glob": "^11.0.1", + "googleapis": "^160.0.0", "lucide-react": "^0.471.2", "node-fetch": "^3.3.2", "react": "^18.3.1", @@ -1402,6 +1404,26 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@maxim_mazurok/gapi.client.calendar-v3": { + "version": "0.1.20250912", + "resolved": "https://registry.npmjs.org/@maxim_mazurok/gapi.client.calendar-v3/-/gapi.client.calendar-v3-0.1.20250912.tgz", + "integrity": "sha512-xPaQawkpo8GRpTa1uYC478nfBEA0xUqGc7uQWYCOspoHea6Ept/cqCFDFAlHYaJwEXrYwR4p5rVg3gY+Xi1udA==", + "license": "MIT", + "dependencies": { + "@types/gapi.client": "*", + "@types/gapi.client.discovery-v1": "*" + } + }, + "node_modules/@maxim_mazurok/gapi.client.discovery-v1": { + "version": "0.4.20200806", + "resolved": "https://registry.npmjs.org/@maxim_mazurok/gapi.client.discovery-v1/-/gapi.client.discovery-v1-0.4.20200806.tgz", + "integrity": "sha512-Jeo/KZqK39DI6ExXHcJ4lqnn1O/wEqboQ6eQ8WnNpu5eJ7wUnX/C5KazOgs1aRhnIB/dVzDe8wm62nmtkMIoaw==", + "license": "MIT", + "dependencies": { + "@types/gapi.client": "*", + "@types/gapi.client.discovery-v1": "*" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -3317,6 +3339,31 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/gapi.client": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/gapi.client/-/gapi.client-1.0.8.tgz", + "integrity": "sha512-qJQUmmumbYym3Amax0S8CVzuSngcXsC1fJdwRS2zeW5lM63zXkw4wJFP+bG0jzgi0R6EsJKoHnGNVTDbOyG1ng==", + "license": "MIT" + }, + "node_modules/@types/gapi.client.calendar": { + "version": "3.0.12", + "resolved": "https://registry.npmjs.org/@types/gapi.client.calendar/-/gapi.client.calendar-3.0.12.tgz", + "integrity": "sha512-3H4hubmAuOkYHGSoVkxYAz6zg2g5LhQ1Y0/GLDIt1AkebKZgGiK+5JNFq4Nn2qDkjFh8pMY3TLIC/J5ueMd6YA==", + "deprecated": "use @types/gapi.client.calendar-v3 instead; see https://github.com/Maxim-Mazurok/google-api-typings-generator/issues/652 for details", + "license": "MIT", + "dependencies": { + "@maxim_mazurok/gapi.client.calendar-v3": "latest" + } + }, + "node_modules/@types/gapi.client.discovery-v1": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/@types/gapi.client.discovery-v1/-/gapi.client.discovery-v1-0.0.4.tgz", + "integrity": "sha512-uevhRumNE65F5mf2gABLaReOmbFSXONuzFZjNR3dYv6BmkHg+wciubHrfBAsp3554zNo3Dcg6dUAlwMqQfpwjQ==", + "license": "MIT", + "dependencies": { + "@maxim_mazurok/gapi.client.discovery-v1": "latest" + } + }, "node_modules/@types/har-format": { "version": "1.2.16", "resolved": "https://registry.npmjs.org/@types/har-format/-/har-format-1.2.16.tgz", @@ -3851,6 +3898,15 @@ "node": ">=0.4.0" } }, + "node_modules/agent-base": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz", + "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==", + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -4056,6 +4112,35 @@ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "license": "MIT" }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/bignumber.js": { + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.3.1.tgz", + "integrity": "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ==", + "license": "MIT", + "engines": { + "node": "*" + } + }, "node_modules/binary-extensions": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", @@ -4131,6 +4216,12 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", + "license": "BSD-3-Clause" + }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", @@ -4152,6 +4243,22 @@ "node": ">= 0.4" } }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -4656,6 +4763,15 @@ "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", "license": "MIT" }, + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, "node_modules/electron-to-chromium": { "version": "1.5.82", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.82.tgz", @@ -5049,6 +5165,12 @@ "node": ">=0.8.x" } }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "license": "MIT" + }, "node_modules/extract-comments": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/extract-comments/-/extract-comments-1.1.0.tgz", @@ -5377,6 +5499,34 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/gaxios": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-7.1.1.tgz", + "integrity": "sha512-Odju3uBUJyVCkW64nLD4wKLhbh93bh6vIg/ZIXkWiLPBrdgtc65+tls/qml+un3pr6JqYVFDZbbmLDQT68rTOQ==", + "license": "Apache-2.0", + "dependencies": { + "extend": "^3.0.2", + "https-proxy-agent": "^7.0.1", + "node-fetch": "^3.3.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/gcp-metadata": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-7.0.1.tgz", + "integrity": "sha512-UcO3kefx6dCcZkgcTGgVOTFb7b1LlQ02hY1omMjjrrBzkajRMCFgYOjs7J71WqnuG1k2b+9ppGL7FsOfhZMQKQ==", + "license": "Apache-2.0", + "dependencies": { + "gaxios": "^7.0.0", + "google-logging-utils": "^1.0.0", + "json-bigint": "^1.0.0" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -5519,6 +5669,62 @@ "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", "license": "MIT" }, + "node_modules/google-auth-library": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-10.3.0.tgz", + "integrity": "sha512-ylSE3RlCRZfZB56PFJSfUCuiuPq83Fx8hqu1KPWGK8FVdSaxlp/qkeMMX/DT/18xkwXIHvXEXkZsljRwfrdEfQ==", + "license": "Apache-2.0", + "dependencies": { + "base64-js": "^1.3.0", + "ecdsa-sig-formatter": "^1.0.11", + "gaxios": "^7.0.0", + "gcp-metadata": "^7.0.0", + "google-logging-utils": "^1.0.0", + "gtoken": "^8.0.0", + "jws": "^4.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/google-logging-utils": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/google-logging-utils/-/google-logging-utils-1.1.1.tgz", + "integrity": "sha512-rcX58I7nqpu4mbKztFeOAObbomBbHU2oIb/d3tJfF3dizGSApqtSwYJigGCooHdnMyQBIw8BrWyK96w3YXgr6A==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, + "node_modules/googleapis": { + "version": "160.0.0", + "resolved": "https://registry.npmjs.org/googleapis/-/googleapis-160.0.0.tgz", + "integrity": "sha512-lAGFQVSeYvWKCxeCQKo20xWFFDgnWuJYbLn92IgLrT4UTYVOGdrZ9XTqgWJf316isE9KdfuDY5X8Tu4ZrXSFig==", + "license": "Apache-2.0", + "dependencies": { + "google-auth-library": "^10.2.0", + "googleapis-common": "^8.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/googleapis-common": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/googleapis-common/-/googleapis-common-8.0.0.tgz", + "integrity": "sha512-66if47It7y+Sab3HMkwEXx1kCq9qUC9px8ZXoj1CMrmLmUw81GpbnsNlXnlyZyGbGPGcj+tDD9XsZ23m7GLaJQ==", + "license": "Apache-2.0", + "dependencies": { + "extend": "^3.0.2", + "gaxios": "^7.0.0-rc.4", + "google-auth-library": "^10.1.0", + "qs": "^6.7.0", + "url-template": "^2.0.8" + }, + "engines": { + "node": ">=18.0.0" + } + }, "node_modules/gopd": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", @@ -5545,6 +5751,19 @@ "dev": true, "license": "MIT" }, + "node_modules/gtoken": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-8.0.0.tgz", + "integrity": "sha512-+CqsMbHPiSTdtSO14O51eMNlrp9N79gmeqmXeouJOhfucAedHw9noVe/n5uJk3tbKE6a+6ZCQg3RPhVhHByAIw==", + "license": "MIT", + "dependencies": { + "gaxios": "^7.0.0", + "jws": "^4.0.0" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -5614,6 +5833,19 @@ "entities": "^4.5.0" } }, + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/iconv-lite": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", @@ -5843,6 +6075,15 @@ "node": ">=6" } }, + "node_modules/json-bigint": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", + "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", + "license": "MIT", + "dependencies": { + "bignumber.js": "^9.0.0" + } + }, "node_modules/json-buffer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", @@ -5898,6 +6139,27 @@ "graceful-fs": "^4.1.6" } }, + "node_modules/jwa": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.1.tgz", + "integrity": "sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==", + "license": "MIT", + "dependencies": { + "buffer-equal-constant-time": "^1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jws": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz", + "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==", + "license": "MIT", + "dependencies": { + "jwa": "^2.0.0", + "safe-buffer": "^5.0.1" + } + }, "node_modules/keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", @@ -6286,6 +6548,18 @@ "node": ">= 6" } }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/optionator": { "version": "0.9.4", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", @@ -6695,6 +6969,21 @@ "node": ">=6" } }, + "node_modules/qs": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -7028,7 +7317,6 @@ "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, "funding": [ { "type": "github", @@ -7043,8 +7331,7 @@ "url": "https://feross.org/support" } ], - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/safer-buffer": { "version": "2.1.2", @@ -7130,6 +7417,78 @@ "node": ">=8" } }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/signal-exit": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", @@ -7933,6 +8292,12 @@ "punycode": "^2.1.0" } }, + "node_modules/url-template": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/url-template/-/url-template-2.0.8.tgz", + "integrity": "sha512-XdVKMF4SJ0nP/O7XIPB0JwAEuT9lDIYnNsK8yGVe43y0AWoKeJNdv3ZNWh7ksJ6KqQFjOO6ox/VEitLnaVNufw==", + "license": "BSD" + }, "node_modules/use-callback-ref": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.3.tgz", diff --git a/package.json b/package.json index d26f71c..074303e 100644 --- a/package.json +++ b/package.json @@ -26,12 +26,14 @@ "@radix-ui/react-tabs": "^1.1.2", "@radix-ui/react-toast": "^1.2.4", "@radix-ui/react-tooltip": "^1.1.7", + "@types/gapi.client.calendar": "^3.0.12", "axios": "^1.12.0", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "date-fns": "^4.1.0", "framer-motion": "^12.0.6", "glob": "^11.0.1", + "googleapis": "^160.0.0", "lucide-react": "^0.471.2", "node-fetch": "^3.3.2", "react": "^18.3.1", diff --git a/src/background.ts b/src/background.ts index 5121d79..13084f1 100644 --- a/src/background.ts +++ b/src/background.ts @@ -79,7 +79,7 @@ chrome.alarms.onAlarm.addListener((alarm) => { /** * 메시지를 통해 알람 예약 및 취소 요청을 처리하는 리스너 */ -chrome.runtime.onMessage.addListener((message, sender, sendResponse) => { +chrome.runtime.onMessage.addListener((message, _, sendResponse) => { if (message.action === 'scheduleAlarm') { const { alarmId, dateTime, title, message: alarmMessage } = message; schedulePreEventAlarm(alarmId, dateTime, title, alarmMessage); diff --git a/src/content/App.tsx b/src/content/App.tsx index c5d46d3..9989bc1 100644 --- a/src/content/App.tsx +++ b/src/content/App.tsx @@ -2,7 +2,7 @@ import { Popover, PopoverTrigger, PopoverContent } from '@/components/ui/popover import { useEffect, useMemo, useState } from 'react'; import icon from '@/assets/icon.png'; import exit from '@/assets/exit.png'; -import { Assign, Filters, Quiz, TAB_TYPE, Vod } from './types'; +import { Assign, CourseBase, Filters, Quiz, TAB_TYPE, Vod } from './types'; import { ListFilter, OctagonAlert, RefreshCw, Search } from 'lucide-react'; import filter from '@/assets/filter.svg'; import PopoverFooter from './components/PopoverFooter'; @@ -29,18 +29,19 @@ const submitOptions = [ export default function App() { const { courses } = useGetCourses(); + const typeCourses: CourseBase[] = courses; // 데이터 관련 상태를 useCourseData 커스텀 훅으로 관리 - const { vods, assigns, quizes, isPending, remainingTime, refreshTime, isError, updateData, setIsPending } = - useCourseData(courses); + const { vods, assigns, quizes, isPending, remainingTime, isError, updateData, setIsPending } = + useCourseData(typeCourses); // activeTab의 타입을 TAB_TYPE으로 지정 const [activeTab, setActiveTab] = useState(TAB_TYPE.VIDEO); const [isOpen, setIsOpen] = useState(false); const [searchTerm, setSearchTerm] = useState(''); - const [vodSortBy, setVodSortBy] = useState('isAttendance'); - const [assignSortBy, setAssignSortBy] = useState('isSubmit'); - const [quizSortBy, setQuizSortBy] = useState('dueDate'); + const [vodSortBy] = useState('isAttendance'); + const [assignSortBy] = useState('isSubmit'); + const [quizSortBy] = useState('dueDate'); const [isFilterOpen, setIsFilterOpen] = useState(false); // 필터 상태 관리 - Record을 사용하여 TAB_TYPE을 키로 지정 diff --git a/src/content/components/PendingDialog.tsx b/src/content/components/PendingDialog.tsx index 9782fcb..007cf40 100644 --- a/src/content/components/PendingDialog.tsx +++ b/src/content/components/PendingDialog.tsx @@ -1,6 +1,6 @@ import { useState, useEffect } from 'react'; import ReactDOM from 'react-dom'; -import { Card, CardContent, CardFooter, CardHeader, CardTitle } from '@/components/ui/card'; +import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { Button } from '@/components/ui/button'; import { Loader2 } from 'lucide-react'; import styles from '@/styles/shadow.css?inline'; diff --git a/src/content/components/Video.tsx b/src/content/components/Video.tsx index 26592e0..122cd2f 100644 --- a/src/content/components/Video.tsx +++ b/src/content/components/Video.tsx @@ -158,9 +158,13 @@ export default function Video({ courseData }: Props) {
{formatDateString(vod.range)},{' '} - + {vod.length}
diff --git a/src/hooks/useCardData.ts b/src/hooks/useCardData.ts index 3d12c2a..53cf9db 100644 --- a/src/hooks/useCardData.ts +++ b/src/hooks/useCardData.ts @@ -1,7 +1,5 @@ import { useState, useEffect } from 'react'; -import { startOfDay } from 'date-fns'; import { loadDataFromStorage } from '@/lib/storage'; -import { removeSquareBrackets } from '@/lib/utils'; import { Vod, Assign, Quiz } from '@/content/types'; export type CardData = { @@ -57,7 +55,7 @@ function useCardData() { ); let done = 0; - Object.entries(groupedData).forEach(([_, vodItems]) => { + Object.values(groupedData).forEach((vodItems) => { if (vodItems[0].weeklyAttendance.toLowerCase() === 'o') { done += 1; } @@ -97,8 +95,7 @@ function useCardData() { 'quiz', (quizzes) => { const total = quizzes.length; - let done = 0; - // quiz에 대한 done 로직이 있다면 여기에 추가합니다. + const done = 0; return [ { type: 'quiz', diff --git a/src/hooks/useCourseData.tsx b/src/hooks/useCourseData.tsx index 73ce045..c973e30 100644 --- a/src/hooks/useCourseData.tsx +++ b/src/hooks/useCourseData.tsx @@ -1,5 +1,5 @@ import { useState, useEffect, useCallback } from 'react'; -import { Vod, Assign, Quiz } from '@/content/types'; +import { Vod, Assign, Quiz, CourseBase } from '@/content/types'; import { loadDataFromStorage, saveDataToStorage } from '@/lib/storage'; import { requestData } from '@/lib/fetchCourseData'; import { isCurrentDateByDate, isCurrentDateInRange } from '@/lib/utils'; @@ -8,7 +8,7 @@ const makeVodKey = (courseId: string, title: string, week: number) => `${courseI const makeAssignKey = (courseId: string, title: string, dueDate: string) => `${courseId}-${title}-${dueDate}`; const makeQuizKey = (courseId: string, title: string, dueDate: string) => `${courseId}-${title}-${dueDate}`; -export function useCourseData(courses: any[]) { +export function useCourseData(courses: CourseBase[]) { const [vods, setVods] = useState([]); const [assigns, setAssigns] = useState([]); const [quizes, setQuizes] = useState([]); @@ -29,8 +29,8 @@ export function useCourseData(courses: any[]) { const tempQuizes: Quiz[] = [...quizes]; const vodSet = new Set(tempVods.map((v) => makeVodKey(v.courseId, v.title, v.week))); - const assignSet = new Set(tempAssigns.map((a) => makeAssignKey(a.courseId, a.title, a.dueDate))); - const quizSet = new Set(tempQuizes.map((q) => makeQuizKey(q.courseId, q.title, q.dueDate))); + const assignSet = new Set(tempAssigns.map((a) => makeAssignKey(a.courseId, a.title, a.dueDate ? a.dueDate : ''))); + const quizSet = new Set(tempQuizes.map((q) => makeQuizKey(q.courseId, q.title, q.dueDate ? q.dueDate : ''))); await Promise.all( courses.map(async (course) => { @@ -61,7 +61,11 @@ export function useCourseData(courses: any[]) { }); result.assignDataArray.forEach((assignData) => { - const assignKey = makeAssignKey(course.courseId, assignData.title, assignData.dueDate); + const assignKey = makeAssignKey( + course.courseId, + assignData.title, + assignData.dueDate ? assignData.dueDate : '' + ); if (!assignSet.has(assignKey)) { console.info(assignKey); assignSet.add(assignKey); @@ -79,7 +83,7 @@ export function useCourseData(courses: any[]) { }); result.quizDataArray.forEach((quizData) => { - const quizKey = makeQuizKey(course.courseId, quizData.title, quizData.dueDate); + const quizKey = makeQuizKey(course.courseId, quizData.title, quizData.dueDate ? quizData.dueDate : ''); if (!quizSet.has(quizKey)) { console.info(quizKey); quizSet.add(quizKey); @@ -112,6 +116,7 @@ export function useCourseData(courses: any[]) { setIsPending(false); } catch (error) { + console.warn(error); localStorage.removeItem('lastRequestTime'); setIsError(true); setIsPending(false); diff --git a/src/hooks/useGetCourse.ts b/src/hooks/useGetCourse.ts index 6e91c94..3b908d1 100644 --- a/src/hooks/useGetCourse.ts +++ b/src/hooks/useGetCourse.ts @@ -3,11 +3,11 @@ import { saveDataToStorage } from '@/lib/storage'; import { removeSquareBrackets } from '@/lib/utils'; import { useState, useEffect } from 'react'; -interface UseCouresResult { +export interface UseCourseResult { courses: CourseBase[]; } -export const useGetCourses = (): UseCouresResult => { +export const useGetCourses = (): UseCourseResult => { const [courses, setCourses] = useState([]); useEffect(() => { if (!document) return; diff --git a/src/lib/fetchAssign.ts b/src/lib/fetchAssign.ts index 82834ce..c4cdd48 100644 --- a/src/lib/fetchAssign.ts +++ b/src/lib/fetchAssign.ts @@ -36,7 +36,7 @@ export const fetchAssign = async (link: string) => { row.querySelector(headerMap.title)?.textContent?.trim() || row.querySelector(headerMap.assign)?.textContent?.trim() || null; - let sbj = row.querySelector(headerMap.subject)?.textContent?.trim() || ''; + const sbj = row.querySelector(headerMap.subject)?.textContent?.trim() || ''; const url = (row.querySelector(headerMap.url) as HTMLAnchorElement)?.href || null; const dueDate = row.querySelector(headerMap.dueDate)?.textContent?.trim() || null; const isSubmit = row.querySelector(headerMap.isSubmit)?.textContent?.trim() === '미제출' ? false : true; diff --git a/src/lib/fetchIndexPage.ts b/src/lib/fetchIndexPage.ts index c62648a..74d5e43 100644 --- a/src/lib/fetchIndexPage.ts +++ b/src/lib/fetchIndexPage.ts @@ -13,10 +13,6 @@ export const fetchIndexPage = async (link: string) => { const parser = new DOMParser(); const doc = parser.parseFromString(html, 'text/html'); - const isAttendances = Array.from( - doc.querySelectorAll('#region-main > div > div > div.user_attendance.course_box > div > ul > li') - ); - const weeks = Array.from(doc.querySelectorAll('#region-main > div > div > div.total_sections > div > ul > li')); const vods = weeks @@ -27,7 +23,9 @@ export const fetchIndexPage = async (link: string) => { .filter((item) => !item.closest('.dimmed')) .map((item) => { const week = index + 1; - const title = item.querySelector('.instancename')?.textContent?.trim() || null; + const instancename = item.querySelector('.instancename'); + instancename?.querySelector('.accesshide')?.remove(); + const title = instancename?.textContent?.trim() || null; const url = item.querySelector('a')?.getAttribute('href') || null; const range = item.querySelector('.text-ubstrap')?.textContent?.trim() || ''; const length = item.querySelector('.text-info')?.textContent?.replace(',', '').trim() || ''; diff --git a/src/lib/fetchQuiz.ts b/src/lib/fetchQuiz.ts index ed1a1ae..8df0bf3 100644 --- a/src/lib/fetchQuiz.ts +++ b/src/lib/fetchQuiz.ts @@ -31,7 +31,7 @@ export const fetchQuiz = async (link: string) => { const rows = Array.from(doc.querySelectorAll('table.generaltable tbody tr')); const quizzes = rows .map((row) => { - let sbj = row.querySelector(headerMap.subject)?.textContent?.trim() || ''; + const sbj = row.querySelector(headerMap.subject)?.textContent?.trim() || ''; const title = row.querySelector(headerMap.title)?.textContent?.trim() || null; let url = (row.querySelector(headerMap.url) as HTMLAnchorElement)?.href || null; const dueDate = row.querySelector(headerMap.dueDate)?.textContent?.trim() || null; diff --git a/src/lib/utils.ts b/src/lib/utils.ts index be5d45e..0f2c101 100644 --- a/src/lib/utils.ts +++ b/src/lib/utils.ts @@ -153,7 +153,7 @@ export const formatDateString = (input: string | null) => { export const calculateRemainingTimeByRange = (range: string | null) => { if (!range) return '정보없음'; - const [startDateStr, endDateStr] = range.split(' ~ '); + const [, endDateStr] = range.split(' ~ '); const endDate = new Date(endDateStr); const now = new Date(); diff --git a/src/option/ColorSetting.tsx b/src/option/ColorSetting.tsx index 0130555..5fdab51 100644 --- a/src/option/ColorSetting.tsx +++ b/src/option/ColorSetting.tsx @@ -93,7 +93,7 @@ export default function ColorSetting() { }); setOriginalColors(originals); } - }, [courses]); + }, [courses, courseColors.length]); const handleColorChange = ( courseId: string, @@ -281,11 +281,6 @@ function CourseCard({ course, colorSetting, originalColor, onColorChange, onRese onColorChange(course.courseId, value, 'solid', undefined, opacity); }; - const handleCustomGradientChange = (value: string) => { - setCustomGradient(value); - onColorChange(course.courseId, value, 'gradient', value, opacity); - }; - const handleGradientColorChange = (startColor: string, endColor: string) => { const newGradient = `linear-gradient(to right, ${startColor}, ${endColor})`; setGradientStartColor(startColor); diff --git a/src/option/Labo.tsx b/src/option/Labo.tsx index 955486d..e856125 100644 --- a/src/option/Labo.tsx +++ b/src/option/Labo.tsx @@ -1,9 +1,12 @@ import React, { useEffect, useState } from 'react'; import { Button } from '@/components/ui/button'; +import { calendar_v3 } from 'googleapis'; + +type CalendarEvent = calendar_v3.Schema$Event; const Labo: React.FC = () => { const [token, setToken] = useState(null); - const [events, setEvents] = useState([]); + const [events, setEvents] = useState([]); const fetchCalendarEvents = (token: string) => { fetch( diff --git a/src/option/Sidebar.tsx b/src/option/Sidebar.tsx index 944719c..811751c 100644 --- a/src/option/Sidebar.tsx +++ b/src/option/Sidebar.tsx @@ -1,6 +1,6 @@ 'use client'; -import { Calendar, Github, LayoutDashboard, NotebookText, Palette, Star, Video, Zap } from 'lucide-react'; +import { Calendar, LayoutDashboard, NotebookText, Palette, Video, Zap } from 'lucide-react'; import type React from 'react'; import { Link, useLocation } from 'react-router-dom'; import icon from '@/assets/icon.png'; diff --git a/src/option/calendar.tsx b/src/option/calendar.tsx index 2e22fbc..02513b2 100644 --- a/src/option/calendar.tsx +++ b/src/option/calendar.tsx @@ -1,4 +1,4 @@ -import React, { useState, useMemo, useEffect } from 'react'; +import { useState, useMemo, useEffect } from 'react'; import { Card } from '@/components/ui/card'; import { Button } from '@/components/ui/button'; import { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover'; diff --git a/src/option/components/AssignCard.tsx b/src/option/components/AssignCard.tsx index 375534c..a20acec 100644 --- a/src/option/components/AssignCard.tsx +++ b/src/option/components/AssignCard.tsx @@ -1,12 +1,9 @@ import { useEffect, useState } from 'react'; import { Card, CardContent } from '@/components/ui/card'; import { Badge } from '@/components/ui/badge'; -import { Assign, Vod } from '@/content/types'; +import { Assign } from '@/content/types'; -import NotificationSwitch from '@/components/ui/notification-switch'; -import { loadDataFromStorage, saveDataToStorage } from '@/lib/storage'; -import { useToast } from '@/hooks/use-toast'; -import { calculateDueDate, calculateRemainingTime, calculateTimeDifference, removeSquareBrackets } from '@/lib/utils'; +import { calculateDueDate, calculateRemainingTime } from '@/lib/utils'; import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/components/ui/tooltip'; interface TaskStatusCardProps { @@ -14,8 +11,6 @@ interface TaskStatusCardProps { } const AssignCard: React.FC = ({ assign }) => { - if (!assign) return <>; - const [showRemainingTime, setShowRemainingTime] = useState(false); useEffect(() => { @@ -28,6 +23,9 @@ const AssignCard: React.FC = ({ assign }) => { return () => clearTimeout(timer); }, [showRemainingTime]); + if (!assign) { + return <>; + } const timeDifference = calculateDueDate(assign.dueDate); return ( diff --git a/src/option/components/AssignContent.tsx b/src/option/components/AssignContent.tsx index 797efc4..f899e9b 100644 --- a/src/option/components/AssignContent.tsx +++ b/src/option/components/AssignContent.tsx @@ -1,4 +1,4 @@ -import { Card, CardContent, CardHeader } from '@/components/ui/card'; +import { Card, CardContent } from '@/components/ui/card'; import { useEffect, useState } from 'react'; import { Assign } from '@/content/types'; import { loadDataFromStorage } from '@/lib/storage'; @@ -8,13 +8,6 @@ import thung from '@/assets/thung.png'; import { isCurrentDateByDate } from '@/lib/utils'; export function AssignContent() { - const date = new Date(); - const formattedDate = date.toLocaleDateString('ko-KR', { - weekday: 'long', - month: 'short', - day: 'numeric', - }); - const [assignArray, setAssignArray] = useState([]); useEffect(() => { @@ -30,7 +23,7 @@ export function AssignContent() { return; } } else { - parsedData = data as any; + parsedData = data as Assign[]; } const sortedAssignArray = parsedData.sort((a, b) => { @@ -93,7 +86,7 @@ export function AssignContent() {
- {assignArray.map((assign, index) => { + {assignArray.map((assign) => { const key = `${assign.courseId}-${assign.title}-${assign.dueDate}`; return ; })} diff --git a/src/option/components/CourseDetailModal.tsx b/src/option/components/CourseDetailModal.tsx index 836768a..fdcb39a 100644 --- a/src/option/components/CourseDetailModal.tsx +++ b/src/option/components/CourseDetailModal.tsx @@ -43,10 +43,6 @@ const CourseDetailModal: React.FC = ({ vodList, onClose }: ModalProp }, 300); }; - const toggleRemainingTime = () => { - setShowRemainingTime((prev) => !prev); - }; - const timeDifference = calculateTimeDifference(vodList[0].range); const modalContent = ( @@ -74,7 +70,7 @@ const CourseDetailModal: React.FC = ({ vodList, onClose }: ModalProp
{vodList.map((vod, index) => { - const isAttendance = vod.isAttendance.toLowerCase() === 'o'; + const isAttendance = vod.isAttendance.toLowerCase().trim() === 'o'; return ( = ({ quiz }) => { - if (!quiz) return <>; - const [showRemainingTime, setShowRemainingTime] = useState(false); useEffect(() => { @@ -25,6 +23,10 @@ const QuizCard: React.FC = ({ quiz }) => { return () => clearTimeout(timer); }, [showRemainingTime]); + if (!quiz) { + return <>; + } + const timeDifference = calculateDueDate(quiz.dueDate); return ( diff --git a/src/option/components/QuizContent.tsx b/src/option/components/QuizContent.tsx index 0016043..644740f 100644 --- a/src/option/components/QuizContent.tsx +++ b/src/option/components/QuizContent.tsx @@ -1,6 +1,6 @@ -import { Card, CardContent, CardHeader } from '@/components/ui/card'; +import { Card, CardContent } from '@/components/ui/card'; import { useEffect, useState } from 'react'; -import { Quiz, Vod } from '@/content/types'; +import { Quiz } from '@/content/types'; import { loadDataFromStorage } from '@/lib/storage'; import QuizCard from './QuizCard'; import { ScrollArea } from '@radix-ui/react-scroll-area'; @@ -8,13 +8,6 @@ import thung from '@/assets/thung.png'; import { isCurrentDateByDate } from '@/lib/utils'; export function QuizContent() { - const date = new Date(); - const formattedDate = date.toLocaleDateString('ko-KR', { - weekday: 'long', - month: 'short', - day: 'numeric', - }); - const [quizArray, setQuizArray] = useState([]); useEffect(() => { @@ -30,7 +23,7 @@ export function QuizContent() { return; } } else { - parsedData = data as any; + parsedData = data as Quiz[]; } const sortedQuizArray = parsedData.sort((a, b) => { @@ -76,7 +69,7 @@ export function QuizContent() {
- {quizArray.map((quiz, index) => { + {quizArray.map((quiz) => { const key = `${quiz.courseId}-${quiz.title}-${quiz.dueDate}`; return ; })} diff --git a/src/option/components/VodCard.tsx b/src/option/components/VodCard.tsx index 853016a..4484b07 100644 --- a/src/option/components/VodCard.tsx +++ b/src/option/components/VodCard.tsx @@ -13,6 +13,8 @@ interface TaskStatusCardProps { } const VodCard: React.FC = ({ vodList }) => { + const [isVisible, setIsVisible] = useState(false); + if (vodList.length === 0) return <>; let value = 0; @@ -21,7 +23,6 @@ const VodCard: React.FC = ({ vodList }) => { }); const total = (value * 100) / vodList.length; - const [isVisible, setIsVisible] = useState(false); return ( <> diff --git a/src/option/components/VodContent.tsx b/src/option/components/VodContent.tsx index e1b452d..9871b6d 100644 --- a/src/option/components/VodContent.tsx +++ b/src/option/components/VodContent.tsx @@ -1,4 +1,4 @@ -import { Card, CardContent, CardHeader } from '@/components/ui/card'; +import { Card, CardContent } from '@/components/ui/card'; import { useEffect, useState } from 'react'; import { Vod } from '@/content/types'; import { loadDataFromStorage } from '@/lib/storage'; @@ -8,7 +8,6 @@ import thung from '@/assets/thung.png'; import { isCurrentDateInRange } from '@/lib/utils'; export function VodContent() { - const date = new Date(); const [vodArray, setVodArray] = useState([]); useEffect(() => { loadDataFromStorage('vod', (data: string | null) => { @@ -23,7 +22,7 @@ export function VodContent() { return; } } else { - parsedData = data as any; + parsedData = data as Vod[]; } const groupedData = parsedData.reduce( @@ -106,8 +105,6 @@ export function VodContent() {
{vodArray.map((vodGroup, index) => { - const item = vodGroup[0]; - const key = `${item.courseId}-${item.subject}-${item.range}`; return ; })}
diff --git a/src/option/components/data.tsx b/src/option/components/data.tsx index 5b10d72..58efcbe 100644 --- a/src/option/components/data.tsx +++ b/src/option/components/data.tsx @@ -1,5 +1,5 @@ import { TYPES } from '@/content/types'; -import { Home, NotebookText, Settings, Video, Zap } from 'lucide-react'; +import { NotebookText, Video, Zap } from 'lucide-react'; export const data = [ { diff --git a/src/pages/DashboardPage.tsx b/src/pages/DashboardPage.tsx index 4848e15..2418497 100644 --- a/src/pages/DashboardPage.tsx +++ b/src/pages/DashboardPage.tsx @@ -1,4 +1,4 @@ -import { Calendar } from '@/option/Calendar'; +import { Calendar } from '@/option/calendar'; import SummaryCard from '@/option/SummaryCard'; export default function DashboardPage() { return ( diff --git a/tsconfig.app.json b/tsconfig.app.json deleted file mode 100755 index abc0a89..0000000 --- a/tsconfig.app.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "paths": { - "@/*": ["src/*"] - }, - "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", - "target": "ES2020", - "useDefineForClassFields": true, - "lib": ["ES2020", "DOM", "DOM.Iterable"], - "module": "ESNext", - "skipLibCheck": true, - - /* Bundler mode */ - "moduleResolution": "bundler", - "allowImportingTsExtensions": true, - "isolatedModules": true, - "moduleDetection": "force", - "noEmit": true, - "jsx": "react-jsx", - - /* Linting */ - "strict": true, - "noUnusedLocals": true, - "noUnusedParameters": true, - "noFallthroughCasesInSwitch": true, - "noUncheckedSideEffectImports": true - }, - "include": ["src"] -} diff --git a/tsconfig.json b/tsconfig.json index 5f4dd36..65d8061 100755 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,24 +1,30 @@ { "compilerOptions": { - "target": "ES2020", + "target": "ES2022", "useDefineForClassFields": true, - "lib": ["ES2020", "DOM", "DOM.Iterable"], + "lib": ["ES2023", "DOM", "DOM.Iterable"], "module": "ESNext", - "skipLibCheck": true, - "strict": true, - "moduleResolution": "bundler", - "allowImportingTsExtensions": true, - "resolveJsonModule": true, + "moduleDetection": "force", + "jsx": "react-jsx", + + "strict": true, + "skipLibCheck": true, "isolatedModules": true, "noEmit": true, - "jsx": "react-jsx", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedSideEffectImports": true, + "baseUrl": ".", "paths": { - "@/*": ["src/*"], - "src/*": ["src/*"] + "@/*": ["src/*"] } }, - "include": ["*/**.ts", "*/**.tsx", "vite.config.ts", "*/src"], + "include": ["src", "vite.config.ts"], "exclude": ["node_modules", "dist"] } diff --git a/tsconfig.node.json b/tsconfig.node.json deleted file mode 100755 index 1cc76d5..0000000 --- a/tsconfig.node.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "paths": { - "@/*": ["src/*"] - }, - "jsx": "react-jsx", - "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.tsbuildinfo", - "target": "ES2022", - "lib": ["ES2023", "DOM"], - "module": "ESNext", - "skipLibCheck": true, - "moduleResolution": "bundler", - "allowImportingTsExtensions": true, - "isolatedModules": true, - "moduleDetection": "force", - "noEmit": true, - "strict": true, - "noUnusedLocals": true, - "noUnusedParameters": true, - "noFallthroughCasesInSwitch": true, - "noUncheckedSideEffectImports": true - }, - "include": ["src", "vite.config.ts"] -}