From c39d7ca4d79a83dae35e07a368a151e680455962 Mon Sep 17 00:00:00 2001 From: Alex Mickelson Date: Mon, 14 Jul 2025 11:53:13 -0600 Subject: [PATCH] day of linting judgement --- .eslintrc.json | 3 - eslint.config.mjs | 30 + package.json | 7 +- pnpm-lock.yaml | 1306 +++++++++-------- postcss.config.mjs | 4 +- src/app/CourseList.tsx | 4 +- src/app/MyToaster.tsx | 4 +- src/app/api/canvas/[...rest]/route.ts | 7 +- .../course/[courseName]/CourseNavigation.tsx | 2 +- .../[courseName]/CourseSettingsLink.tsx | 2 +- .../[courseName]/calendar/CalendarMonth.tsx | 6 +- .../[courseName]/calendar/CalendarWeek.tsx | 2 +- .../[courseName]/calendar/CourseCalendar.tsx | 3 +- .../course/[courseName]/calendar/day/Day.tsx | 2 +- .../[courseName]/calendar/day/DayTitle.tsx | 2 +- .../[courseName]/calendar/day/getStatus.tsx | 1 - .../calendar/day/useTodaysItems.tsx | 2 +- .../context/drag/useItemDropOnDay.ts | 7 +- .../lecture/[lectureDay]/EditLecture.tsx | 10 +- .../lecture/[lectureDay]/EditLectureTitle.tsx | 2 +- .../lecture/[lectureDay]/LectureButtons.tsx | 2 +- .../lecture/[lectureDay]/LecturePreview.tsx | 4 - .../lecture/[lectureDay]/layout.tsx | 2 +- .../preview/LecturePreviewPage.tsx | 2 +- .../[courseName]/modules/ExpandableModule.tsx | 6 +- .../[courseName]/modules/ModuleList.tsx | 2 +- .../[courseName]/modules/NewItemForm.tsx | 4 +- .../AssignmentFooterButtons.tsx | 4 +- .../[assignmentName]/AssignmentPreview.tsx | 7 +- .../[assignmentName]/EditAssignment.tsx | 12 +- .../[assignmentName]/UpdateAssignmentName.tsx | 4 +- .../[moduleName]/page/[pageName]/EditPage.tsx | 12 +- .../page/[pageName]/EditPageButtons.tsx | 4 +- .../page/[pageName]/PagePreview.tsx | 2 - .../page/[pageName]/UpdatePageName.tsx | 15 +- .../[moduleName]/quiz/[quizName]/EditQuiz.tsx | 10 +- .../quiz/[quizName]/QuizButton.tsx | 10 +- .../quiz/[quizName]/QuizPreview.tsx | 12 +- .../quiz/[quizName]/UpdateQuizName.tsx | 17 +- src/app/course/[courseName]/page.tsx | 2 +- .../settings/AssignmentGroupManagement.tsx | 2 +- .../settings/DaysOfWeekSettings.tsx | 2 +- .../[courseName]/settings/DefaultDueTime.tsx | 2 +- .../settings/DefaultFileUploadTypes.tsx | 2 +- .../settings/DefaultLockOffset.tsx | 2 +- .../settings/GithubClassroomList.tsx | 2 +- .../[courseName]/settings/HolidayConfig.tsx | 14 +- .../[courseName]/settings/SettingsHeader.tsx | 2 +- .../[courseName]/settings/StartAndEndDate.tsx | 2 +- .../settings/SubmissionDefaults.tsx | 2 +- .../CanvasNavigationManagement.tsx | 1 - .../canvasNavigation.tsx/NavTabListItem.tsx | 4 +- src/app/newCourse/NewCourseForm.tsx | 8 +- src/app/providers.tsx | 8 +- src/app/todaysLectures/OneCourseLectures.tsx | 2 +- src/app/todaysLectures/TodaysLectures.tsx | 2 +- src/components/MarkdownDisplay.tsx | 2 +- src/components/TimePicker.tsx | 2 +- src/components/editor/InnerMonacoEditor.tsx | 2 +- .../editor/InnerMonacoEditorOther.tsx | 2 +- .../realtime/ClientCacheInvalidation.tsx | 91 +- src/hooks/canvas/canvasAssignmentHooks.ts | 9 +- src/hooks/canvas/canvasModuleHooks.ts | 11 +- src/hooks/canvas/canvasNavigationHooks.tsx | 6 +- src/hooks/canvas/canvasPageHooks.ts | 14 +- src/hooks/canvas/canvasQuizHooks.ts | 12 +- src/hooks/localCourse/assignmentHooks.ts | 189 ++- src/hooks/localCourse/lectureHooks.ts | 46 +- .../localCourse/localCourseModuleHooks.ts | 117 +- src/hooks/localCourse/localCoursesHooks.ts | 61 +- src/hooks/localCourse/pageHooks.ts | 134 +- src/hooks/localCourse/quizHooks.ts | 135 +- .../localCourse/storageDirectoryHooks.ts | 9 +- .../canvas/assignments/canvasAssignment.ts | 4 +- .../canvas/assignments/canvasLockInfo.ts | 2 +- .../discussions/canvasDiscussionModelTopic.ts | 4 +- src/models/canvas/quizzes/canvasQuizModel.ts | 2 +- src/models/local/localCourseSettings.ts | 9 +- .../quiz/utils/quizQuestionMarkdownUtils.ts | 5 +- .../tests/quizMarkdown/multipleChoice.test.ts | 3 +- .../tests/quizMarkdown/quizMarkdown.test.ts | 3 +- .../tests/quizMarkdown/testAnswer.test.ts | 1 - src/services/axiosUtils.ts | 3 +- src/services/canvas/canvasPageService.ts | 1 + src/services/canvas/canvasQuizService.ts | 2 + src/services/canvas/canvasServiceUtils.ts | 8 +- src/services/canvas/canvasWebRequestor.ts | 28 +- .../courseItemFileStorageService.ts | 2 +- .../fileStorage/lectureFileStorageService.ts | 1 + .../fileStorage/settingsFileStorageService.ts | 2 +- src/services/htmlMarkdownUtils.ts | 1 - src/services/serverFunctions/TrpcProvider.tsx | 12 +- .../router/directoriesRouter.ts | 2 - .../serverFunctions/router/settingsRouter.ts | 1 - src/services/tests/fileStorage.test.ts | 2 +- .../tests/fileStorageParsingErrors.test.ts | 4 +- src/services/utils/queryClient.tsx | 90 +- 97 files changed, 1500 insertions(+), 1130 deletions(-) delete mode 100644 .eslintrc.json create mode 100644 eslint.config.mjs diff --git a/.eslintrc.json b/.eslintrc.json deleted file mode 100644 index bffb357..0000000 --- a/.eslintrc.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "extends": "next/core-web-vitals" -} diff --git a/eslint.config.mjs b/eslint.config.mjs new file mode 100644 index 0000000..f0e8a93 --- /dev/null +++ b/eslint.config.mjs @@ -0,0 +1,30 @@ +import { dirname } from "path"; +import { fileURLToPath } from "url"; +import { FlatCompat } from "@eslint/eslintrc"; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = dirname(__filename); + +const compat = new FlatCompat({ + baseDirectory: __dirname, +}); + +const eslintConfig = [ + ...compat.config({ + extends: ["next/core-web-vitals", "next/typescript", "prettier"], + ignorePatterns: ["**/node_modules/**", "**/.next/**", "storage/**"], + rules: { + "react-refresh/only-export-components": "off", // Disabled the rule + "@typescript-eslint/no-unused-vars": [ + "warn", + { + argsIgnorePattern: "^_|error", + varsIgnorePattern: "^_|error", + }, + ], + "jsx-a11y/no-access-key": "off", + }, + }), +]; + +export default eslintConfig; diff --git a/package.json b/package.json index 87ec535..052c5a6 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,7 @@ "build": "next build", "startNoSocket": "next start", "start": "NODE_ENV=production node src/websocket.js", - "lint": "tsc && next lint", + "lint": "eslint . --config eslint.config.mjs && tsc && next lint", "test": "vitest" }, "dependencies": { @@ -23,6 +23,7 @@ "@trpc/server": "11.4.3", "@trpc/tanstack-react-query": "^11.4.3", "@types/ws": "^8.18.1", + "@typescript-eslint/parser": "^8.37.0", "chokidar": "^4.0.3", "dotenv": "^17.0.1", "form-data": "^4.0.3", @@ -37,8 +38,10 @@ "zod": "^3.25.75" }, "devDependencies": { + "@eslint/eslintrc": "^3", "@monaco-editor/loader": "^1.5.0", "@monaco-editor/react": "^4.7.0", + "@next/eslint-plugin-next": "^15.3.5", "@testing-library/dom": "^10.4.0", "@testing-library/react": "^16.3.0", "@types/node": "^24.0.10", @@ -48,6 +51,8 @@ "axios": "^1.10.0", "eslint": "^9.30.1", "eslint-config-next": "^15.3.5", + "eslint-config-prettier": "^10.1.5", + "eslint-plugin-react-hooks": "^5.2.0", "isomorphic-dompurify": "^2.26.0", "marked": "^16.0.0", "monaco-editor": "^0.52.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3235de5..223bb6e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -16,34 +16,37 @@ importers: version: 4.1.11 '@tanstack/react-query': specifier: ^5.81.5 - version: 5.81.5(react@19.1.0) + version: 5.83.0(react@19.1.0) '@tanstack/react-query-devtools': specifier: ^5.81.5 - version: 5.81.5(@tanstack/react-query@5.81.5(react@19.1.0))(react@19.1.0) + version: 5.83.0(@tanstack/react-query@5.83.0(react@19.1.0))(react@19.1.0) '@trpc/client': specifier: 11.4.3 version: 11.4.3(@trpc/server@11.4.3(typescript@5.8.3))(typescript@5.8.3) '@trpc/next': specifier: ^11.4.3 - version: 11.4.3(@tanstack/react-query@5.81.5(react@19.1.0))(@trpc/client@11.4.3(@trpc/server@11.4.3(typescript@5.8.3))(typescript@5.8.3))(@trpc/react-query@11.4.3(@tanstack/react-query@5.81.5(react@19.1.0))(@trpc/client@11.4.3(@trpc/server@11.4.3(typescript@5.8.3))(typescript@5.8.3))(@trpc/server@11.4.3(typescript@5.8.3))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.8.3))(@trpc/server@11.4.3(typescript@5.8.3))(next@15.3.5(@babel/core@7.28.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.8.3) + version: 11.4.3(@tanstack/react-query@5.83.0(react@19.1.0))(@trpc/client@11.4.3(@trpc/server@11.4.3(typescript@5.8.3))(typescript@5.8.3))(@trpc/react-query@11.4.3(@tanstack/react-query@5.83.0(react@19.1.0))(@trpc/client@11.4.3(@trpc/server@11.4.3(typescript@5.8.3))(typescript@5.8.3))(@trpc/server@11.4.3(typescript@5.8.3))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.8.3))(@trpc/server@11.4.3(typescript@5.8.3))(next@15.3.5(@babel/core@7.28.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.8.3) '@trpc/react-query': specifier: 11.4.3 - version: 11.4.3(@tanstack/react-query@5.81.5(react@19.1.0))(@trpc/client@11.4.3(@trpc/server@11.4.3(typescript@5.8.3))(typescript@5.8.3))(@trpc/server@11.4.3(typescript@5.8.3))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.8.3) + version: 11.4.3(@tanstack/react-query@5.83.0(react@19.1.0))(@trpc/client@11.4.3(@trpc/server@11.4.3(typescript@5.8.3))(typescript@5.8.3))(@trpc/server@11.4.3(typescript@5.8.3))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.8.3) '@trpc/server': specifier: 11.4.3 version: 11.4.3(typescript@5.8.3) '@trpc/tanstack-react-query': specifier: ^11.4.3 - version: 11.4.3(@tanstack/react-query@5.81.5(react@19.1.0))(@trpc/client@11.4.3(@trpc/server@11.4.3(typescript@5.8.3))(typescript@5.8.3))(@trpc/server@11.4.3(typescript@5.8.3))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.8.3) + version: 11.4.3(@tanstack/react-query@5.83.0(react@19.1.0))(@trpc/client@11.4.3(@trpc/server@11.4.3(typescript@5.8.3))(typescript@5.8.3))(@trpc/server@11.4.3(typescript@5.8.3))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.8.3) '@types/ws': specifier: ^8.18.1 version: 8.18.1 + '@typescript-eslint/parser': + specifier: ^8.37.0 + version: 8.37.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3) chokidar: specifier: ^4.0.3 version: 4.0.3 dotenv: specifier: ^17.0.1 - version: 17.0.1 + version: 17.2.0 form-data: specifier: ^4.0.3 version: 4.0.3 @@ -52,7 +55,7 @@ importers: version: 26.1.0 marked-katex-extension: specifier: ^5.1.5 - version: 5.1.5(katex@0.16.20)(marked@16.0.0) + version: 5.1.5(katex@0.16.22)(marked@16.0.0) next: specifier: ^15.3.5 version: 15.3.5(@babel/core@7.28.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) @@ -73,14 +76,20 @@ importers: version: 8.18.3 zod: specifier: ^3.25.75 - version: 3.25.75 + version: 3.25.76 devDependencies: + '@eslint/eslintrc': + specifier: ^3 + version: 3.3.1 '@monaco-editor/loader': specifier: ^1.5.0 version: 1.5.0 '@monaco-editor/react': specifier: ^4.7.0 version: 4.7.0(monaco-editor@0.52.2)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) + '@next/eslint-plugin-next': + specifier: ^15.3.5 + version: 15.3.5 '@testing-library/dom': specifier: ^10.4.0 version: 10.4.0 @@ -89,7 +98,7 @@ importers: version: 16.3.0(@testing-library/dom@10.4.0)(@types/react-dom@19.1.6(@types/react@19.1.8))(@types/react@19.1.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0) '@types/node': specifier: ^24.0.10 - version: 24.0.10 + version: 24.0.13 '@types/react': specifier: ^19.1.8 version: 19.1.8 @@ -98,16 +107,22 @@ importers: version: 19.1.6(@types/react@19.1.8) '@vitejs/plugin-react': specifier: ^4.6.0 - version: 4.6.0(vite@5.4.19(@types/node@24.0.10)(lightningcss@1.30.1)) + version: 4.6.0(vite@7.0.4(@types/node@24.0.13)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0)) axios: specifier: ^1.10.0 version: 1.10.0 eslint: specifier: ^9.30.1 - version: 9.30.1(jiti@2.4.2) + version: 9.31.0(jiti@2.4.2) eslint-config-next: specifier: ^15.3.5 - version: 15.3.5(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) + version: 15.3.5(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3) + eslint-config-prettier: + specifier: ^10.1.5 + version: 10.1.5(eslint@9.31.0(jiti@2.4.2)) + eslint-plugin-react-hooks: + specifier: ^5.2.0 + version: 5.2.0(eslint@9.31.0(jiti@2.4.2)) isomorphic-dompurify: specifier: ^2.26.0 version: 2.26.0 @@ -137,7 +152,7 @@ importers: version: 5.8.3 vitest: specifier: ^3.2.4 - version: 3.2.4(@types/node@24.0.10)(jsdom@26.1.0)(lightningcss@1.30.1) + version: 3.2.4(@types/node@24.0.13)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.30.1)(yaml@2.8.0) yaml: specifier: ^2.8.0 version: 2.8.0 @@ -238,8 +253,8 @@ packages: resolution: {integrity: sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg==} engines: {node: '>=6.9.0'} - '@babel/types@7.28.0': - resolution: {integrity: sha512-jYnje+JyZG5YThjHiF28oT4SIZLnYOcSBb6+SDaFIyzDVSkXQmQQYclJ2R+YxcdmK0AX6x1E5OQNtuh3jHDrUg==} + '@babel/types@7.28.1': + resolution: {integrity: sha512-x0LvFTekgSX+83TI28Y9wYPUfzrnl2aT5+5QLnO6v7mSJYtEEevuDRN0F0uSHRk1G1IWZC43o00Y0xDDrpBGPQ==} engines: {node: '>=6.9.0'} '@csstools/color-helpers@5.0.2': @@ -279,141 +294,159 @@ packages: '@emnapi/wasi-threads@1.0.3': resolution: {integrity: sha512-8K5IFFsQqF9wQNJptGbS6FNKgUTsSRYnTqNCG1vPP8jFdjSv18n2mQfJpkt2Oibo9iBEzcDnDxNwKTzC7svlJw==} - '@esbuild/aix-ppc64@0.21.5': - resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} - engines: {node: '>=12'} + '@esbuild/aix-ppc64@0.25.6': + resolution: {integrity: sha512-ShbM/3XxwuxjFiuVBHA+d3j5dyac0aEVVq1oluIDf71hUw0aRF59dV/efUsIwFnR6m8JNM2FjZOzmaZ8yG61kw==} + engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.21.5': - resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} - engines: {node: '>=12'} + '@esbuild/android-arm64@0.25.6': + resolution: {integrity: sha512-hd5zdUarsK6strW+3Wxi5qWws+rJhCCbMiC9QZyzoxfk5uHRIE8T287giQxzVpEvCwuJ9Qjg6bEjcRJcgfLqoA==} + engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.21.5': - resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} - engines: {node: '>=12'} + '@esbuild/android-arm@0.25.6': + resolution: {integrity: sha512-S8ToEOVfg++AU/bHwdksHNnyLyVM+eMVAOf6yRKFitnwnbwwPNqKr3srzFRe7nzV69RQKb5DgchIX5pt3L53xg==} + engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.21.5': - resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} - engines: {node: '>=12'} + '@esbuild/android-x64@0.25.6': + resolution: {integrity: sha512-0Z7KpHSr3VBIO9A/1wcT3NTy7EB4oNC4upJ5ye3R7taCc2GUdeynSLArnon5G8scPwaU866d3H4BCrE5xLW25A==} + engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.21.5': - resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} - engines: {node: '>=12'} + '@esbuild/darwin-arm64@0.25.6': + resolution: {integrity: sha512-FFCssz3XBavjxcFxKsGy2DYK5VSvJqa6y5HXljKzhRZ87LvEi13brPrf/wdyl/BbpbMKJNOr1Sd0jtW4Ge1pAA==} + engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.21.5': - resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} - engines: {node: '>=12'} + '@esbuild/darwin-x64@0.25.6': + resolution: {integrity: sha512-GfXs5kry/TkGM2vKqK2oyiLFygJRqKVhawu3+DOCk7OxLy/6jYkWXhlHwOoTb0WqGnWGAS7sooxbZowy+pK9Yg==} + engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.21.5': - resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} - engines: {node: '>=12'} + '@esbuild/freebsd-arm64@0.25.6': + resolution: {integrity: sha512-aoLF2c3OvDn2XDTRvn8hN6DRzVVpDlj2B/F66clWd/FHLiHaG3aVZjxQX2DYphA5y/evbdGvC6Us13tvyt4pWg==} + engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.21.5': - resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} - engines: {node: '>=12'} + '@esbuild/freebsd-x64@0.25.6': + resolution: {integrity: sha512-2SkqTjTSo2dYi/jzFbU9Plt1vk0+nNg8YC8rOXXea+iA3hfNJWebKYPs3xnOUf9+ZWhKAaxnQNUf2X9LOpeiMQ==} + engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.21.5': - resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} - engines: {node: '>=12'} + '@esbuild/linux-arm64@0.25.6': + resolution: {integrity: sha512-b967hU0gqKd9Drsh/UuAm21Khpoh6mPBSgz8mKRq4P5mVK8bpA+hQzmm/ZwGVULSNBzKdZPQBRT3+WuVavcWsQ==} + engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.21.5': - resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} - engines: {node: '>=12'} + '@esbuild/linux-arm@0.25.6': + resolution: {integrity: sha512-SZHQlzvqv4Du5PrKE2faN0qlbsaW/3QQfUUc6yO2EjFcA83xnwm91UbEEVx4ApZ9Z5oG8Bxz4qPE+HFwtVcfyw==} + engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.21.5': - resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} - engines: {node: '>=12'} + '@esbuild/linux-ia32@0.25.6': + resolution: {integrity: sha512-aHWdQ2AAltRkLPOsKdi3xv0mZ8fUGPdlKEjIEhxCPm5yKEThcUjHpWB1idN74lfXGnZ5SULQSgtr5Qos5B0bPw==} + engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.21.5': - resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} - engines: {node: '>=12'} + '@esbuild/linux-loong64@0.25.6': + resolution: {integrity: sha512-VgKCsHdXRSQ7E1+QXGdRPlQ/e08bN6WMQb27/TMfV+vPjjTImuT9PmLXupRlC90S1JeNNW5lzkAEO/McKeJ2yg==} + engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.21.5': - resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} - engines: {node: '>=12'} + '@esbuild/linux-mips64el@0.25.6': + resolution: {integrity: sha512-WViNlpivRKT9/py3kCmkHnn44GkGXVdXfdc4drNmRl15zVQ2+D2uFwdlGh6IuK5AAnGTo2qPB1Djppj+t78rzw==} + engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.21.5': - resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} - engines: {node: '>=12'} + '@esbuild/linux-ppc64@0.25.6': + resolution: {integrity: sha512-wyYKZ9NTdmAMb5730I38lBqVu6cKl4ZfYXIs31Baf8aoOtB4xSGi3THmDYt4BTFHk7/EcVixkOV2uZfwU3Q2Jw==} + engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.21.5': - resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} - engines: {node: '>=12'} + '@esbuild/linux-riscv64@0.25.6': + resolution: {integrity: sha512-KZh7bAGGcrinEj4qzilJ4hqTY3Dg2U82c8bv+e1xqNqZCrCyc+TL9AUEn5WGKDzm3CfC5RODE/qc96OcbIe33w==} + engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.21.5': - resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} - engines: {node: '>=12'} + '@esbuild/linux-s390x@0.25.6': + resolution: {integrity: sha512-9N1LsTwAuE9oj6lHMyyAM+ucxGiVnEqUdp4v7IaMmrwb06ZTEVCIs3oPPplVsnjPfyjmxwHxHMF8b6vzUVAUGw==} + engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.21.5': - resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} - engines: {node: '>=12'} + '@esbuild/linux-x64@0.25.6': + resolution: {integrity: sha512-A6bJB41b4lKFWRKNrWoP2LHsjVzNiaurf7wyj/XtFNTsnPuxwEBWHLty+ZE0dWBKuSK1fvKgrKaNjBS7qbFKig==} + engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-x64@0.21.5': - resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} - engines: {node: '>=12'} + '@esbuild/netbsd-arm64@0.25.6': + resolution: {integrity: sha512-IjA+DcwoVpjEvyxZddDqBY+uJ2Snc6duLpjmkXm/v4xuS3H+3FkLZlDm9ZsAbF9rsfP3zeA0/ArNDORZgrxR/Q==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.25.6': + resolution: {integrity: sha512-dUXuZr5WenIDlMHdMkvDc1FAu4xdWixTCRgP7RQLBOkkGgwuuzaGSYcOpW4jFxzpzL1ejb8yF620UxAqnBrR9g==} + engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-x64@0.21.5': - resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} - engines: {node: '>=12'} + '@esbuild/openbsd-arm64@0.25.6': + resolution: {integrity: sha512-l8ZCvXP0tbTJ3iaqdNf3pjaOSd5ex/e6/omLIQCVBLmHTlfXW3zAxQ4fnDmPLOB1x9xrcSi/xtCWFwCZRIaEwg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.25.6': + resolution: {integrity: sha512-hKrmDa0aOFOr71KQ/19JC7az1P0GWtCN1t2ahYAf4O007DHZt/dW8ym5+CUdJhQ/qkZmI1HAF8KkJbEFtCL7gw==} + engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/sunos-x64@0.21.5': - resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} - engines: {node: '>=12'} + '@esbuild/openharmony-arm64@0.25.6': + resolution: {integrity: sha512-+SqBcAWoB1fYKmpWoQP4pGtx+pUUC//RNYhFdbcSA16617cchuryuhOCRpPsjCblKukAckWsV+aQ3UKT/RMPcA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.25.6': + resolution: {integrity: sha512-dyCGxv1/Br7MiSC42qinGL8KkG4kX0pEsdb0+TKhmJZgCUDBGmyo1/ArCjNGiOLiIAgdbWgmWgib4HoCi5t7kA==} + engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.21.5': - resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} - engines: {node: '>=12'} + '@esbuild/win32-arm64@0.25.6': + resolution: {integrity: sha512-42QOgcZeZOvXfsCBJF5Afw73t4veOId//XD3i+/9gSkhSV6Gk3VPlWncctI+JcOyERv85FUo7RxuxGy+z8A43Q==} + engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.21.5': - resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} - engines: {node: '>=12'} + '@esbuild/win32-ia32@0.25.6': + resolution: {integrity: sha512-4AWhgXmDuYN7rJI6ORB+uU9DHLq/erBbuMoAuB4VWJTu5KtCgcKYPynF0YI1VkBNuEfjNlLrFr9KZPJzrtLkrQ==} + engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.21.5': - resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} - engines: {node: '>=12'} + '@esbuild/win32-x64@0.25.6': + resolution: {integrity: sha512-NgJPHHbEpLQgDH2MjQu90pzW/5vvXIZ7KOnPyNBm92A6WgZ/7b6fJyUBjoumLqeOQQGqY2QjQxRo97ah4Sj0cA==} + engines: {node: '>=18'} cpu: [x64] os: [win32] @@ -435,10 +468,6 @@ packages: resolution: {integrity: sha512-ViuymvFmcJi04qdZeDc2whTHryouGcDlaxPqarTD0ZE10ISpxGUVZGZDx4w01upyIynL3iu6IXH2bS1NhclQMw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/core@0.14.0': - resolution: {integrity: sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/core@0.15.1': resolution: {integrity: sha512-bkOp+iumZCCbt1K1CmWf0R9pM5yKpDv+ZXtvSyQpudrI9kuFLp+bM2WOPXImuD/ceQuaa8f5pj93Y7zyECIGNA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -447,8 +476,8 @@ packages: resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.30.1': - resolution: {integrity: sha512-zXhuECFlyep42KZUhWjfvsmXGX39W8K8LFb8AWXM9gSV9dQB+MrJGLKvW6Zw0Ggnbpw0VHTtrhFXYe3Gym18jg==} + '@eslint/js@9.31.0': + resolution: {integrity: sha512-LOm5OVt7D4qiKCqoiPbA7LWmI+tbw1VbTUowBcUMgQSuM6poJufkFkYDcQpo5KfgD39TnNySV26QjOh7VFpSyw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@eslint/object-schema@2.1.6': @@ -479,118 +508,124 @@ packages: resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} engines: {node: '>=18.18'} - '@img/sharp-darwin-arm64@0.34.2': - resolution: {integrity: sha512-OfXHZPppddivUJnqyKoi5YVeHRkkNE2zUFT2gbpKxp/JZCFYEYubnMg+gOp6lWfasPrTS+KPosKqdI+ELYVDtg==} + '@img/sharp-darwin-arm64@0.34.3': + resolution: {integrity: sha512-ryFMfvxxpQRsgZJqBd4wsttYQbCxsJksrv9Lw/v798JcQ8+w84mBWuXwl+TT0WJ/WrYOLaYpwQXi3sA9nTIaIg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [darwin] - '@img/sharp-darwin-x64@0.34.2': - resolution: {integrity: sha512-dYvWqmjU9VxqXmjEtjmvHnGqF8GrVjM2Epj9rJ6BUIXvk8slvNDJbhGFvIoXzkDhrJC2jUxNLz/GUjjvSzfw+g==} + '@img/sharp-darwin-x64@0.34.3': + resolution: {integrity: sha512-yHpJYynROAj12TA6qil58hmPmAwxKKC7reUqtGLzsOHfP7/rniNGTL8tjWX6L3CTV4+5P4ypcS7Pp+7OB+8ihA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [darwin] - '@img/sharp-libvips-darwin-arm64@1.1.0': - resolution: {integrity: sha512-HZ/JUmPwrJSoM4DIQPv/BfNh9yrOA8tlBbqbLz4JZ5uew2+o22Ik+tHQJcih7QJuSa0zo5coHTfD5J8inqj9DA==} + '@img/sharp-libvips-darwin-arm64@1.2.0': + resolution: {integrity: sha512-sBZmpwmxqwlqG9ueWFXtockhsxefaV6O84BMOrhtg/YqbTaRdqDE7hxraVE3y6gVM4eExmfzW4a8el9ArLeEiQ==} cpu: [arm64] os: [darwin] - '@img/sharp-libvips-darwin-x64@1.1.0': - resolution: {integrity: sha512-Xzc2ToEmHN+hfvsl9wja0RlnXEgpKNmftriQp6XzY/RaSfwD9th+MSh0WQKzUreLKKINb3afirxW7A0fz2YWuQ==} + '@img/sharp-libvips-darwin-x64@1.2.0': + resolution: {integrity: sha512-M64XVuL94OgiNHa5/m2YvEQI5q2cl9d/wk0qFTDVXcYzi43lxuiFTftMR1tOnFQovVXNZJ5TURSDK2pNe9Yzqg==} cpu: [x64] os: [darwin] - '@img/sharp-libvips-linux-arm64@1.1.0': - resolution: {integrity: sha512-IVfGJa7gjChDET1dK9SekxFFdflarnUB8PwW8aGwEoF3oAsSDuNUTYS+SKDOyOJxQyDC1aPFMuRYLoDInyV9Ew==} + '@img/sharp-libvips-linux-arm64@1.2.0': + resolution: {integrity: sha512-RXwd0CgG+uPRX5YYrkzKyalt2OJYRiJQ8ED/fi1tq9WQW2jsQIn0tqrlR5l5dr/rjqq6AHAxURhj2DVjyQWSOA==} cpu: [arm64] os: [linux] - '@img/sharp-libvips-linux-arm@1.1.0': - resolution: {integrity: sha512-s8BAd0lwUIvYCJyRdFqvsj+BJIpDBSxs6ivrOPm/R7piTs5UIwY5OjXrP2bqXC9/moGsyRa37eYWYCOGVXxVrA==} + '@img/sharp-libvips-linux-arm@1.2.0': + resolution: {integrity: sha512-mWd2uWvDtL/nvIzThLq3fr2nnGfyr/XMXlq8ZJ9WMR6PXijHlC3ksp0IpuhK6bougvQrchUAfzRLnbsen0Cqvw==} cpu: [arm] os: [linux] - '@img/sharp-libvips-linux-ppc64@1.1.0': - resolution: {integrity: sha512-tiXxFZFbhnkWE2LA8oQj7KYR+bWBkiV2nilRldT7bqoEZ4HiDOcePr9wVDAZPi/Id5fT1oY9iGnDq20cwUz8lQ==} + '@img/sharp-libvips-linux-ppc64@1.2.0': + resolution: {integrity: sha512-Xod/7KaDDHkYu2phxxfeEPXfVXFKx70EAFZ0qyUdOjCcxbjqyJOEUpDe6RIyaunGxT34Anf9ue/wuWOqBW2WcQ==} cpu: [ppc64] os: [linux] - '@img/sharp-libvips-linux-s390x@1.1.0': - resolution: {integrity: sha512-xukSwvhguw7COyzvmjydRb3x/09+21HykyapcZchiCUkTThEQEOMtBj9UhkaBRLuBrgLFzQ2wbxdeCCJW/jgJA==} + '@img/sharp-libvips-linux-s390x@1.2.0': + resolution: {integrity: sha512-eMKfzDxLGT8mnmPJTNMcjfO33fLiTDsrMlUVcp6b96ETbnJmd4uvZxVJSKPQfS+odwfVaGifhsB07J1LynFehw==} cpu: [s390x] os: [linux] - '@img/sharp-libvips-linux-x64@1.1.0': - resolution: {integrity: sha512-yRj2+reB8iMg9W5sULM3S74jVS7zqSzHG3Ol/twnAAkAhnGQnpjj6e4ayUz7V+FpKypwgs82xbRdYtchTTUB+Q==} + '@img/sharp-libvips-linux-x64@1.2.0': + resolution: {integrity: sha512-ZW3FPWIc7K1sH9E3nxIGB3y3dZkpJlMnkk7z5tu1nSkBoCgw2nSRTFHI5pB/3CQaJM0pdzMF3paf9ckKMSE9Tg==} cpu: [x64] os: [linux] - '@img/sharp-libvips-linuxmusl-arm64@1.1.0': - resolution: {integrity: sha512-jYZdG+whg0MDK+q2COKbYidaqW/WTz0cc1E+tMAusiDygrM4ypmSCjOJPmFTvHHJ8j/6cAGyeDWZOsK06tP33w==} + '@img/sharp-libvips-linuxmusl-arm64@1.2.0': + resolution: {integrity: sha512-UG+LqQJbf5VJ8NWJ5Z3tdIe/HXjuIdo4JeVNADXBFuG7z9zjoegpzzGIyV5zQKi4zaJjnAd2+g2nna8TZvuW9Q==} cpu: [arm64] os: [linux] - '@img/sharp-libvips-linuxmusl-x64@1.1.0': - resolution: {integrity: sha512-wK7SBdwrAiycjXdkPnGCPLjYb9lD4l6Ze2gSdAGVZrEL05AOUJESWU2lhlC+Ffn5/G+VKuSm6zzbQSzFX/P65A==} + '@img/sharp-libvips-linuxmusl-x64@1.2.0': + resolution: {integrity: sha512-SRYOLR7CXPgNze8akZwjoGBoN1ThNZoqpOgfnOxmWsklTGVfJiGJoC/Lod7aNMGA1jSsKWM1+HRX43OP6p9+6Q==} cpu: [x64] os: [linux] - '@img/sharp-linux-arm64@0.34.2': - resolution: {integrity: sha512-D8n8wgWmPDakc83LORcfJepdOSN6MvWNzzz2ux0MnIbOqdieRZwVYY32zxVx+IFUT8er5KPcyU3XXsn+GzG/0Q==} + '@img/sharp-linux-arm64@0.34.3': + resolution: {integrity: sha512-QdrKe3EvQrqwkDrtuTIjI0bu6YEJHTgEeqdzI3uWJOH6G1O8Nl1iEeVYRGdj1h5I21CqxSvQp1Yv7xeU3ZewbA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] - '@img/sharp-linux-arm@0.34.2': - resolution: {integrity: sha512-0DZzkvuEOqQUP9mo2kjjKNok5AmnOr1jB2XYjkaoNRwpAYMDzRmAqUIa1nRi58S2WswqSfPOWLNOr0FDT3H5RQ==} + '@img/sharp-linux-arm@0.34.3': + resolution: {integrity: sha512-oBK9l+h6KBN0i3dC8rYntLiVfW8D8wH+NPNT3O/WBHeW0OQWCjfWksLUaPidsrDKpJgXp3G3/hkmhptAW0I3+A==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm] os: [linux] - '@img/sharp-linux-s390x@0.34.2': - resolution: {integrity: sha512-EGZ1xwhBI7dNISwxjChqBGELCWMGDvmxZXKjQRuqMrakhO8QoMgqCrdjnAqJq/CScxfRn+Bb7suXBElKQpPDiw==} + '@img/sharp-linux-ppc64@0.34.3': + resolution: {integrity: sha512-GLtbLQMCNC5nxuImPR2+RgrviwKwVql28FWZIW1zWruy6zLgA5/x2ZXk3mxj58X/tszVF69KK0Is83V8YgWhLA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ppc64] + os: [linux] + + '@img/sharp-linux-s390x@0.34.3': + resolution: {integrity: sha512-3gahT+A6c4cdc2edhsLHmIOXMb17ltffJlxR0aC2VPZfwKoTGZec6u5GrFgdR7ciJSsHT27BD3TIuGcuRT0KmQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [s390x] os: [linux] - '@img/sharp-linux-x64@0.34.2': - resolution: {integrity: sha512-sD7J+h5nFLMMmOXYH4DD9UtSNBD05tWSSdWAcEyzqW8Cn5UxXvsHAxmxSesYUsTOBmUnjtxghKDl15EvfqLFbQ==} + '@img/sharp-linux-x64@0.34.3': + resolution: {integrity: sha512-8kYso8d806ypnSq3/Ly0QEw90V5ZoHh10yH0HnrzOCr6DKAPI6QVHvwleqMkVQ0m+fc7EH8ah0BB0QPuWY6zJQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] - '@img/sharp-linuxmusl-arm64@0.34.2': - resolution: {integrity: sha512-NEE2vQ6wcxYav1/A22OOxoSOGiKnNmDzCYFOZ949xFmrWZOVII1Bp3NqVVpvj+3UeHMFyN5eP/V5hzViQ5CZNA==} + '@img/sharp-linuxmusl-arm64@0.34.3': + resolution: {integrity: sha512-vAjbHDlr4izEiXM1OTggpCcPg9tn4YriK5vAjowJsHwdBIdx0fYRsURkxLG2RLm9gyBq66gwtWI8Gx0/ov+JKQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] - '@img/sharp-linuxmusl-x64@0.34.2': - resolution: {integrity: sha512-DOYMrDm5E6/8bm/yQLCWyuDJwUnlevR8xtF8bs+gjZ7cyUNYXiSf/E8Kp0Ss5xasIaXSHzb888V1BE4i1hFhAA==} + '@img/sharp-linuxmusl-x64@0.34.3': + resolution: {integrity: sha512-gCWUn9547K5bwvOn9l5XGAEjVTTRji4aPTqLzGXHvIr6bIDZKNTA34seMPgM0WmSf+RYBH411VavCejp3PkOeQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] - '@img/sharp-wasm32@0.34.2': - resolution: {integrity: sha512-/VI4mdlJ9zkaq53MbIG6rZY+QRN3MLbR6usYlgITEzi4Rpx5S6LFKsycOQjkOGmqTNmkIdLjEvooFKwww6OpdQ==} + '@img/sharp-wasm32@0.34.3': + resolution: {integrity: sha512-+CyRcpagHMGteySaWos8IbnXcHgfDn7pO2fiC2slJxvNq9gDipYBN42/RagzctVRKgxATmfqOSulgZv5e1RdMg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [wasm32] - '@img/sharp-win32-arm64@0.34.2': - resolution: {integrity: sha512-cfP/r9FdS63VA5k0xiqaNaEoGxBg9k7uE+RQGzuK9fHt7jib4zAVVseR9LsE4gJcNWgT6APKMNnCcnyOtmSEUQ==} + '@img/sharp-win32-arm64@0.34.3': + resolution: {integrity: sha512-MjnHPnbqMXNC2UgeLJtX4XqoVHHlZNd+nPt1kRPmj63wURegwBhZlApELdtxM2OIZDRv/DFtLcNhVbd1z8GYXQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [win32] - '@img/sharp-win32-ia32@0.34.2': - resolution: {integrity: sha512-QLjGGvAbj0X/FXl8n1WbtQ6iVBpWU7JO94u/P2M4a8CFYsvQi4GW2mRy/JqkRx0qpBzaOdKJKw8uc930EX2AHw==} + '@img/sharp-win32-ia32@0.34.3': + resolution: {integrity: sha512-xuCdhH44WxuXgOM714hn4amodJMZl3OEvf0GVTm0BEyMeA2to+8HEdRPShH0SLYptJY1uBw+SCFP9WVQi1Q/cw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [ia32] os: [win32] - '@img/sharp-win32-x64@0.34.2': - resolution: {integrity: sha512-aUdT6zEYtDKCaxkofmmJDJYGCf0+pJg3eU9/oBuqvEeoB9dKI6ZLc/1iLJCTuJQDO4ptntAlkUmHgGjyuobZbw==} + '@img/sharp-win32-x64@0.34.3': + resolution: {integrity: sha512-OWwz05d++TxzLEv4VnsTz5CmZ6mI6S05sfQGEMrNrQcOEERbX46332IvE7pO/EUiw7jUrrS40z/M7kPyjfl04g==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [win32] @@ -622,8 +657,8 @@ packages: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - '@napi-rs/wasm-runtime@0.2.11': - resolution: {integrity: sha512-9DPkXtvHydrcOsopiYpUgPHpmj0HWZKMUnL2dZqpvC42lsratuBG06V5ipyno0fUek5VlFsNQ+AcFATSrJXgMA==} + '@napi-rs/wasm-runtime@0.2.12': + resolution: {integrity: sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==} '@next/env@15.3.5': resolution: {integrity: sha512-7g06v8BUVtN2njAX/r8gheoVffhiKFVt4nx74Tt6G4Hqw9HCLYQVx/GkH2qHvPtAHZaUNZ0VXAa0pQP6v1wk7g==} @@ -698,103 +733,103 @@ packages: '@rolldown/pluginutils@1.0.0-beta.19': resolution: {integrity: sha512-3FL3mnMbPu0muGOCaKAhhFEYmqv9eTfPSJRJmANrCwtgK8VuxpsZDGK+m0LYAGoyO8+0j5uRe4PeyPDK1yA/hA==} - '@rollup/rollup-android-arm-eabi@4.44.2': - resolution: {integrity: sha512-g0dF8P1e2QYPOj1gu7s/3LVP6kze9A7m6x0BZ9iTdXK8N5c2V7cpBKHV3/9A4Zd8xxavdhK0t4PnqjkqVmUc9Q==} + '@rollup/rollup-android-arm-eabi@4.45.0': + resolution: {integrity: sha512-2o/FgACbji4tW1dzXOqAV15Eu7DdgbKsF2QKcxfG4xbh5iwU7yr5RRP5/U+0asQliSYv5M4o7BevlGIoSL0LXg==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.44.2': - resolution: {integrity: sha512-Yt5MKrOosSbSaAK5Y4J+vSiID57sOvpBNBR6K7xAaQvk3MkcNVV0f9fE20T+41WYN8hDn6SGFlFrKudtx4EoxA==} + '@rollup/rollup-android-arm64@4.45.0': + resolution: {integrity: sha512-PSZ0SvMOjEAxwZeTx32eI/j5xSYtDCRxGu5k9zvzoY77xUNssZM+WV6HYBLROpY5CkXsbQjvz40fBb7WPwDqtQ==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.44.2': - resolution: {integrity: sha512-EsnFot9ZieM35YNA26nhbLTJBHD0jTwWpPwmRVDzjylQT6gkar+zenfb8mHxWpRrbn+WytRRjE0WKsfaxBkVUA==} + '@rollup/rollup-darwin-arm64@4.45.0': + resolution: {integrity: sha512-BA4yPIPssPB2aRAWzmqzQ3y2/KotkLyZukVB7j3psK/U3nVJdceo6qr9pLM2xN6iRP/wKfxEbOb1yrlZH6sYZg==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.44.2': - resolution: {integrity: sha512-dv/t1t1RkCvJdWWxQ2lWOO+b7cMsVw5YFaS04oHpZRWehI1h0fV1gF4wgGCTyQHHjJDfbNpwOi6PXEafRBBezw==} + '@rollup/rollup-darwin-x64@4.45.0': + resolution: {integrity: sha512-Pr2o0lvTwsiG4HCr43Zy9xXrHspyMvsvEw4FwKYqhli4FuLE5FjcZzuQ4cfPe0iUFCvSQG6lACI0xj74FDZKRA==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.44.2': - resolution: {integrity: sha512-W4tt4BLorKND4qeHElxDoim0+BsprFTwb+vriVQnFFtT/P6v/xO5I99xvYnVzKWrK6j7Hb0yp3x7V5LUbaeOMg==} + '@rollup/rollup-freebsd-arm64@4.45.0': + resolution: {integrity: sha512-lYE8LkE5h4a/+6VnnLiL14zWMPnx6wNbDG23GcYFpRW1V9hYWHAw9lBZ6ZUIrOaoK7NliF1sdwYGiVmziUF4vA==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.44.2': - resolution: {integrity: sha512-tdT1PHopokkuBVyHjvYehnIe20fxibxFCEhQP/96MDSOcyjM/shlTkZZLOufV3qO6/FQOSiJTBebhVc12JyPTA==} + '@rollup/rollup-freebsd-x64@4.45.0': + resolution: {integrity: sha512-PVQWZK9sbzpvqC9Q0GlehNNSVHR+4m7+wET+7FgSnKG3ci5nAMgGmr9mGBXzAuE5SvguCKJ6mHL6vq1JaJ/gvw==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.44.2': - resolution: {integrity: sha512-+xmiDGGaSfIIOXMzkhJ++Oa0Gwvl9oXUeIiwarsdRXSe27HUIvjbSIpPxvnNsRebsNdUo7uAiQVgBD1hVriwSQ==} + '@rollup/rollup-linux-arm-gnueabihf@4.45.0': + resolution: {integrity: sha512-hLrmRl53prCcD+YXTfNvXd776HTxNh8wPAMllusQ+amcQmtgo3V5i/nkhPN6FakW+QVLoUUr2AsbtIRPFU3xIA==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.44.2': - resolution: {integrity: sha512-bDHvhzOfORk3wt8yxIra8N4k/N0MnKInCW5OGZaeDYa/hMrdPaJzo7CSkjKZqX4JFUWjUGm88lI6QJLCM7lDrA==} + '@rollup/rollup-linux-arm-musleabihf@4.45.0': + resolution: {integrity: sha512-XBKGSYcrkdiRRjl+8XvrUR3AosXU0NvF7VuqMsm7s5nRy+nt58ZMB19Jdp1RdqewLcaYnpk8zeVs/4MlLZEJxw==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.44.2': - resolution: {integrity: sha512-NMsDEsDiYghTbeZWEGnNi4F0hSbGnsuOG+VnNvxkKg0IGDvFh7UVpM/14mnMwxRxUf9AdAVJgHPvKXf6FpMB7A==} + '@rollup/rollup-linux-arm64-gnu@4.45.0': + resolution: {integrity: sha512-fRvZZPUiBz7NztBE/2QnCS5AtqLVhXmUOPj9IHlfGEXkapgImf4W9+FSkL8cWqoAjozyUzqFmSc4zh2ooaeF6g==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.44.2': - resolution: {integrity: sha512-lb5bxXnxXglVq+7imxykIp5xMq+idehfl+wOgiiix0191av84OqbjUED+PRC5OA8eFJYj5xAGcpAZ0pF2MnW+A==} + '@rollup/rollup-linux-arm64-musl@4.45.0': + resolution: {integrity: sha512-Btv2WRZOcUGi8XU80XwIvzTg4U6+l6D0V6sZTrZx214nrwxw5nAi8hysaXj/mctyClWgesyuxbeLylCBNauimg==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-loongarch64-gnu@4.44.2': - resolution: {integrity: sha512-Yl5Rdpf9pIc4GW1PmkUGHdMtbx0fBLE1//SxDmuf3X0dUC57+zMepow2LK0V21661cjXdTn8hO2tXDdAWAqE5g==} + '@rollup/rollup-linux-loongarch64-gnu@4.45.0': + resolution: {integrity: sha512-Li0emNnwtUZdLwHjQPBxn4VWztcrw/h7mgLyHiEI5Z0MhpeFGlzaiBHpSNVOMB/xucjXTTcO+dhv469Djr16KA==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.44.2': - resolution: {integrity: sha512-03vUDH+w55s680YYryyr78jsO1RWU9ocRMaeV2vMniJJW/6HhoTBwyyiiTPVHNWLnhsnwcQ0oH3S9JSBEKuyqw==} + '@rollup/rollup-linux-powerpc64le-gnu@4.45.0': + resolution: {integrity: sha512-sB8+pfkYx2kvpDCfd63d5ScYT0Fz1LO6jIb2zLZvmK9ob2D8DeVqrmBDE0iDK8KlBVmsTNzrjr3G1xV4eUZhSw==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.44.2': - resolution: {integrity: sha512-iYtAqBg5eEMG4dEfVlkqo05xMOk6y/JXIToRca2bAWuqjrJYJlx/I7+Z+4hSrsWU8GdJDFPL4ktV3dy4yBSrzg==} + '@rollup/rollup-linux-riscv64-gnu@4.45.0': + resolution: {integrity: sha512-5GQ6PFhh7E6jQm70p1aW05G2cap5zMOvO0se5JMecHeAdj5ZhWEHbJ4hiKpfi1nnnEdTauDXxPgXae/mqjow9w==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-riscv64-musl@4.44.2': - resolution: {integrity: sha512-e6vEbgaaqz2yEHqtkPXa28fFuBGmUJ0N2dOJK8YUfijejInt9gfCSA7YDdJ4nYlv67JfP3+PSWFX4IVw/xRIPg==} + '@rollup/rollup-linux-riscv64-musl@4.45.0': + resolution: {integrity: sha512-N/euLsBd1rekWcuduakTo/dJw6U6sBP3eUq+RXM9RNfPuWTvG2w/WObDkIvJ2KChy6oxZmOSC08Ak2OJA0UiAA==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.44.2': - resolution: {integrity: sha512-evFOtkmVdY3udE+0QKrV5wBx7bKI0iHz5yEVx5WqDJkxp9YQefy4Mpx3RajIVcM6o7jxTvVd/qpC1IXUhGc1Mw==} + '@rollup/rollup-linux-s390x-gnu@4.45.0': + resolution: {integrity: sha512-2l9sA7d7QdikL0xQwNMO3xURBUNEWyHVHfAsHsUdq+E/pgLTUcCE+gih5PCdmyHmfTDeXUWVhqL0WZzg0nua3g==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.44.2': - resolution: {integrity: sha512-/bXb0bEsWMyEkIsUL2Yt5nFB5naLAwyOWMEviQfQY1x3l5WsLKgvZf66TM7UTfED6erckUVUJQ/jJ1FSpm3pRQ==} + '@rollup/rollup-linux-x64-gnu@4.45.0': + resolution: {integrity: sha512-XZdD3fEEQcwG2KrJDdEQu7NrHonPxxaV0/w2HpvINBdcqebz1aL+0vM2WFJq4DeiAVT6F5SUQas65HY5JDqoPw==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.44.2': - resolution: {integrity: sha512-3D3OB1vSSBXmkGEZR27uiMRNiwN08/RVAcBKwhUYPaiZ8bcvdeEwWPvbnXvvXHY+A/7xluzcN+kaiOFNiOZwWg==} + '@rollup/rollup-linux-x64-musl@4.45.0': + resolution: {integrity: sha512-7ayfgvtmmWgKWBkCGg5+xTQ0r5V1owVm67zTrsEY1008L5ro7mCyGYORomARt/OquB9KY7LpxVBZes+oSniAAQ==} cpu: [x64] os: [linux] - '@rollup/rollup-win32-arm64-msvc@4.44.2': - resolution: {integrity: sha512-VfU0fsMK+rwdK8mwODqYeM2hDrF2WiHaSmCBrS7gColkQft95/8tphyzv2EupVxn3iE0FI78wzffoULH1G+dkw==} + '@rollup/rollup-win32-arm64-msvc@4.45.0': + resolution: {integrity: sha512-B+IJgcBnE2bm93jEW5kHisqvPITs4ddLOROAcOc/diBgrEiQJJ6Qcjby75rFSmH5eMGrqJryUgJDhrfj942apQ==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.44.2': - resolution: {integrity: sha512-+qMUrkbUurpE6DVRjiJCNGZBGo9xM4Y0FXU5cjgudWqIBWbcLkjE3XprJUsOFgC6xjBClwVa9k6O3A7K3vxb5Q==} + '@rollup/rollup-win32-ia32-msvc@4.45.0': + resolution: {integrity: sha512-+CXwwG66g0/FpWOnP/v1HnrGVSOygK/osUbu3wPRy8ECXjoYKjRAyfxYpDQOfghC5qPJYLPH0oN4MCOjwgdMug==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.44.2': - resolution: {integrity: sha512-3+QZROYfJ25PDcxFF66UEk8jGWigHJeecZILvkPkyQN7oc5BvFo4YEXFkOs154j3FTMp9mn9Ky8RCOwastduEA==} + '@rollup/rollup-win32-x64-msvc@4.45.0': + resolution: {integrity: sha512-SRf1cytG7wqcHVLrBc9VtPK4pU5wxiB/lNIkNmW2ApKXIg+RpqwHfsaEK+e7eH4A1BpI6BX/aBWXxZCIrJg3uA==} cpu: [x64] os: [win32] @@ -901,20 +936,20 @@ packages: '@tailwindcss/postcss@4.1.11': resolution: {integrity: sha512-q/EAIIpF6WpLhKEuQSEVMZNMIY8KhWoAemZ9eylNAih9jxMGAYPPWBn3I9QL/2jZ+e7OEz/tZkX5HwbBR4HohA==} - '@tanstack/query-core@5.81.5': - resolution: {integrity: sha512-ZJOgCy/z2qpZXWaj/oxvodDx07XcQa9BF92c0oINjHkoqUPsmm3uG08HpTaviviZ/N9eP1f9CM7mKSEkIo7O1Q==} + '@tanstack/query-core@5.83.0': + resolution: {integrity: sha512-0M8dA+amXUkyz5cVUm/B+zSk3xkQAcuXuz5/Q/LveT4ots2rBpPTZOzd7yJa2Utsf8D2Upl5KyjhHRY+9lB/XA==} '@tanstack/query-devtools@5.81.2': resolution: {integrity: sha512-jCeJcDCwKfoyyBXjXe9+Lo8aTkavygHHsUHAlxQKKaDeyT0qyQNLKl7+UyqYH2dDF6UN/14873IPBHchcsU+Zg==} - '@tanstack/react-query-devtools@5.81.5': - resolution: {integrity: sha512-lCGMu4RX0uGnlrlLeSckBfnW/UV+KMlTBVqa97cwK7Z2ED5JKnZRSjNXwoma6sQBTJrcULvzgx2K6jEPvNUpDw==} + '@tanstack/react-query-devtools@5.83.0': + resolution: {integrity: sha512-yfp8Uqd3I1jgx8gl0lxbSSESu5y4MO2ThOPBnGNTYs0P+ZFu+E9g5IdOngyUGuo6Uz6Qa7p9TLdZEX3ntik2fQ==} peerDependencies: - '@tanstack/react-query': ^5.81.5 + '@tanstack/react-query': ^5.83.0 react: ^18 || ^19 - '@tanstack/react-query@5.81.5': - resolution: {integrity: sha512-lOf2KqRRiYWpQT86eeeftAGnjuTR35myTP8MXyvHa81VlomoAWNEd8x5vkcAfQefu0qtYCvyqLropFZqgI2EQw==} + '@tanstack/react-query@5.83.0': + resolution: {integrity: sha512-/XGYhZ3foc5H0VM2jLSD/NyBRIOK4q9kfeml4+0x2DlL6xVuAcVEW+hTlTapAmejObg0i3eNqhkr2dT+eciwoQ==} peerDependencies: react: ^18 || ^19 @@ -985,8 +1020,8 @@ packages: react-dom: '>=18.2.0' typescript: '>=5.7.2' - '@tybys/wasm-util@0.9.0': - resolution: {integrity: sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==} + '@tybys/wasm-util@0.10.0': + resolution: {integrity: sha512-VyyPYFlOMNylG45GoAe0xDoLwWuowvf92F9kySqzYh8vmYm7D2u4iUJKa1tOUpS70Ku13ASrOkS4ScXFsTaCNQ==} '@types/aria-query@5.0.4': resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} @@ -1021,8 +1056,8 @@ packages: '@types/json5@0.0.29': resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - '@types/node@24.0.10': - resolution: {integrity: sha512-ENHwaH+JIRTDIEEbDK6QSQntAYGtbvdDXnMXnZaZ6k13Du1dPMmprkEHIL7ok2Wl2aZevetwTAb5S+7yIF+enA==} + '@types/node@24.0.13': + resolution: {integrity: sha512-Qm9OYVOFHFYg3wJoTSrz80hoec5Lia/dPp84do3X7dZvLikQvM1YpmvTBEdIr/e+U8HTkFjLHLnl78K/qjf+jQ==} '@types/react-dom@19.1.6': resolution: {integrity: sha512-4hOiT/dwO8Ko0gV1m/TJZYk3y0KBnY9vzDh7W+DH17b2HFSOGgdj33dhihPeuy3l0q23+4e+hoXHV6hCC4dCXw==} @@ -1046,8 +1081,8 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/parser@8.36.0': - resolution: {integrity: sha512-FuYgkHwZLuPbZjQHzJXrtXreJdFMKl16BFYyRrLxDhWr6Qr7Kbcu2s1Yhu8tsiMXw1S0W1pjfFfYEt+R604s+Q==} + '@typescript-eslint/parser@8.37.0': + resolution: {integrity: sha512-kVIaQE9vrN9RLCQMQ3iyRlVJpTiDUY6woHGb30JDkfJErqrQEmtdWH3gV0PBAfGZgQXoqzXOO0T3K6ioApbbAA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -1059,16 +1094,32 @@ packages: peerDependencies: typescript: '>=4.8.4 <5.9.0' + '@typescript-eslint/project-service@8.37.0': + resolution: {integrity: sha512-BIUXYsbkl5A1aJDdYJCBAo8rCEbAvdquQ8AnLb6z5Lp1u3x5PNgSSx9A/zqYc++Xnr/0DVpls8iQ2cJs/izTXA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <5.9.0' + '@typescript-eslint/scope-manager@8.36.0': resolution: {integrity: sha512-wCnapIKnDkN62fYtTGv2+RY8FlnBYA3tNm0fm91kc2BjPhV2vIjwwozJ7LToaLAyb1ca8BxrS7vT+Pvvf7RvqA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/scope-manager@8.37.0': + resolution: {integrity: sha512-0vGq0yiU1gbjKob2q691ybTg9JX6ShiVXAAfm2jGf3q0hdP6/BruaFjL/ManAR/lj05AvYCH+5bbVo0VtzmjOA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/tsconfig-utils@8.36.0': resolution: {integrity: sha512-Nhh3TIEgN18mNbdXpd5Q8mSCBnrZQeY9V7Ca3dqYvNDStNIGRmJA6dmrIPMJ0kow3C7gcQbpsG2rPzy1Ks/AnA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <5.9.0' + '@typescript-eslint/tsconfig-utils@8.37.0': + resolution: {integrity: sha512-1/YHvAVTimMM9mmlPvTec9NP4bobA1RkDbMydxG8omqwJJLEW/Iy2C4adsAESIXU3WGLXFHSZUU+C9EoFWl4Zg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <5.9.0' + '@typescript-eslint/type-utils@8.36.0': resolution: {integrity: sha512-5aaGYG8cVDd6cxfk/ynpYzxBRZJk7w/ymto6uiyUFtdCozQIsQWh7M28/6r57Fwkbweng8qAzoMCPwSJfWlmsg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -1080,12 +1131,22 @@ packages: resolution: {integrity: sha512-xGms6l5cTJKQPZOKM75Dl9yBfNdGeLRsIyufewnxT4vZTrjC0ImQT4fj8QmtJK84F58uSh5HVBSANwcfiXxABQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/types@8.37.0': + resolution: {integrity: sha512-ax0nv7PUF9NOVPs+lmQ7yIE7IQmAf8LGcXbMvHX5Gm+YJUYNAl340XkGnrimxZ0elXyoQJuN5sbg6C4evKA4SQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/typescript-estree@8.36.0': resolution: {integrity: sha512-JaS8bDVrfVJX4av0jLpe4ye0BpAaUW7+tnS4Y4ETa3q7NoZgzYbN9zDQTJ8kPb5fQ4n0hliAt9tA4Pfs2zA2Hg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <5.9.0' + '@typescript-eslint/typescript-estree@8.37.0': + resolution: {integrity: sha512-zuWDMDuzMRbQOM+bHyU4/slw27bAUEcKSKKs3hcv2aNnc/tvE/h7w60dwVw8vnal2Pub6RT1T7BI8tFZ1fE+yg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <5.9.0' + '@typescript-eslint/utils@8.36.0': resolution: {integrity: sha512-VOqmHu42aEMT+P2qYjylw6zP/3E/HvptRwdn/PZxyV27KhZg2IOszXod4NcXisWzPAGSS4trE/g4moNj6XmH2g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -1097,98 +1158,102 @@ packages: resolution: {integrity: sha512-vZrhV2lRPWDuGoxcmrzRZyxAggPL+qp3WzUrlZD+slFueDiYHxeBa34dUXPuC0RmGKzl4lS5kFJYvKCq9cnNDA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@unrs/resolver-binding-android-arm-eabi@1.11.0': - resolution: {integrity: sha512-LRw5BW29sYj9NsQC6QoqeLVQhEa+BwVINYyMlcve+6stwdBsSt5UB7zw4UZB4+4PNqIVilHoMaPWCb/KhABHQw==} + '@typescript-eslint/visitor-keys@8.37.0': + resolution: {integrity: sha512-YzfhzcTnZVPiLfP/oeKtDp2evwvHLMe0LOy7oe+hb9KKIumLNohYS9Hgp1ifwpu42YWxhZE8yieggz6JpqO/1w==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@unrs/resolver-binding-android-arm-eabi@1.11.1': + resolution: {integrity: sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==} cpu: [arm] os: [android] - '@unrs/resolver-binding-android-arm64@1.11.0': - resolution: {integrity: sha512-zYX8D2zcWCAHqghA8tPjbp7LwjVXbIZP++mpU/Mrf5jUVlk3BWIxkeB8yYzZi5GpFSlqMcRZQxQqbMI0c2lASQ==} + '@unrs/resolver-binding-android-arm64@1.11.1': + resolution: {integrity: sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==} cpu: [arm64] os: [android] - '@unrs/resolver-binding-darwin-arm64@1.11.0': - resolution: {integrity: sha512-YsYOT049hevAY/lTYD77GhRs885EXPeAfExG5KenqMJ417nYLS2N/kpRpYbABhFZBVQn+2uRPasTe4ypmYoo3w==} + '@unrs/resolver-binding-darwin-arm64@1.11.1': + resolution: {integrity: sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==} cpu: [arm64] os: [darwin] - '@unrs/resolver-binding-darwin-x64@1.11.0': - resolution: {integrity: sha512-PSjvk3OZf1aZImdGY5xj9ClFG3bC4gnSSYWrt+id0UAv+GwwVldhpMFjAga8SpMo2T1GjV9UKwM+QCsQCQmtdA==} + '@unrs/resolver-binding-darwin-x64@1.11.1': + resolution: {integrity: sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==} cpu: [x64] os: [darwin] - '@unrs/resolver-binding-freebsd-x64@1.11.0': - resolution: {integrity: sha512-KC/iFaEN/wsTVYnHClyHh5RSYA9PpuGfqkFua45r4sweXpC0KHZ+BYY7ikfcGPt5w1lMpR1gneFzuqWLQxsRKg==} + '@unrs/resolver-binding-freebsd-x64@1.11.1': + resolution: {integrity: sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==} cpu: [x64] os: [freebsd] - '@unrs/resolver-binding-linux-arm-gnueabihf@1.11.0': - resolution: {integrity: sha512-CDh/0v8uot43cB4yKtDL9CVY8pbPnMV0dHyQCE4lFz6PW/+9tS0i9eqP5a91PAqEBVMqH1ycu+k8rP6wQU846w==} + '@unrs/resolver-binding-linux-arm-gnueabihf@1.11.1': + resolution: {integrity: sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==} cpu: [arm] os: [linux] - '@unrs/resolver-binding-linux-arm-musleabihf@1.11.0': - resolution: {integrity: sha512-+TE7epATDSnvwr3L/hNHX3wQ8KQYB+jSDTdywycg3qDqvavRP8/HX9qdq/rMcnaRDn4EOtallb3vL/5wCWGCkw==} + '@unrs/resolver-binding-linux-arm-musleabihf@1.11.1': + resolution: {integrity: sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==} cpu: [arm] os: [linux] - '@unrs/resolver-binding-linux-arm64-gnu@1.11.0': - resolution: {integrity: sha512-VBAYGg3VahofpQ+L4k/ZO8TSICIbUKKTaMYOWHWfuYBFqPbSkArZZLezw3xd27fQkxX4BaLGb/RKnW0dH9Y/UA==} + '@unrs/resolver-binding-linux-arm64-gnu@1.11.1': + resolution: {integrity: sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==} cpu: [arm64] os: [linux] - '@unrs/resolver-binding-linux-arm64-musl@1.11.0': - resolution: {integrity: sha512-9IgGFUUb02J1hqdRAHXpZHIeUHRrbnGo6vrRbz0fREH7g+rzQy53/IBSyadZ/LG5iqMxukriNPu4hEMUn+uWEg==} + '@unrs/resolver-binding-linux-arm64-musl@1.11.1': + resolution: {integrity: sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==} cpu: [arm64] os: [linux] - '@unrs/resolver-binding-linux-ppc64-gnu@1.11.0': - resolution: {integrity: sha512-LR4iQ/LPjMfivpL2bQ9kmm3UnTas3U+umcCnq/CV7HAkukVdHxrDD1wwx74MIWbbgzQTLPYY7Ur2MnnvkYJCBQ==} + '@unrs/resolver-binding-linux-ppc64-gnu@1.11.1': + resolution: {integrity: sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==} cpu: [ppc64] os: [linux] - '@unrs/resolver-binding-linux-riscv64-gnu@1.11.0': - resolution: {integrity: sha512-HCupFQwMrRhrOg7YHrobbB5ADg0Q8RNiuefqMHVsdhEy9lLyXm/CxsCXeLJdrg27NAPsCaMDtdlm8Z2X8x91Tg==} + '@unrs/resolver-binding-linux-riscv64-gnu@1.11.1': + resolution: {integrity: sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==} cpu: [riscv64] os: [linux] - '@unrs/resolver-binding-linux-riscv64-musl@1.11.0': - resolution: {integrity: sha512-Ckxy76A5xgjWa4FNrzcKul5qFMWgP5JSQ5YKd0XakmWOddPLSkQT+uAvUpQNnFGNbgKzv90DyQlxPDYPQ4nd6A==} + '@unrs/resolver-binding-linux-riscv64-musl@1.11.1': + resolution: {integrity: sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==} cpu: [riscv64] os: [linux] - '@unrs/resolver-binding-linux-s390x-gnu@1.11.0': - resolution: {integrity: sha512-HfO0PUCCRte2pMJmVyxPI+eqT7KuV3Fnvn2RPvMe5mOzb2BJKf4/Vth8sSt9cerQboMaTVpbxyYjjLBWIuI5BQ==} + '@unrs/resolver-binding-linux-s390x-gnu@1.11.1': + resolution: {integrity: sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==} cpu: [s390x] os: [linux] - '@unrs/resolver-binding-linux-x64-gnu@1.11.0': - resolution: {integrity: sha512-9PZdjP7tLOEjpXHS6+B/RNqtfVUyDEmaViPOuSqcbomLdkJnalt5RKQ1tr2m16+qAufV0aDkfhXtoO7DQos/jg==} + '@unrs/resolver-binding-linux-x64-gnu@1.11.1': + resolution: {integrity: sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==} cpu: [x64] os: [linux] - '@unrs/resolver-binding-linux-x64-musl@1.11.0': - resolution: {integrity: sha512-qkE99ieiSKMnFJY/EfyGKVtNra52/k+lVF/PbO4EL5nU6AdvG4XhtJ+WHojAJP7ID9BNIra/yd75EHndewNRfA==} + '@unrs/resolver-binding-linux-x64-musl@1.11.1': + resolution: {integrity: sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==} cpu: [x64] os: [linux] - '@unrs/resolver-binding-wasm32-wasi@1.11.0': - resolution: {integrity: sha512-MjXek8UL9tIX34gymvQLecz2hMaQzOlaqYJJBomwm1gsvK2F7hF+YqJJ2tRyBDTv9EZJGMt4KlKkSD/gZWCOiw==} + '@unrs/resolver-binding-wasm32-wasi@1.11.1': + resolution: {integrity: sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==} engines: {node: '>=14.0.0'} cpu: [wasm32] - '@unrs/resolver-binding-win32-arm64-msvc@1.11.0': - resolution: {integrity: sha512-9LT6zIGO7CHybiQSh7DnQGwFMZvVr0kUjah6qQfkH2ghucxPV6e71sUXJdSM4Ba0MaGE6DC/NwWf7mJmc3DAng==} + '@unrs/resolver-binding-win32-arm64-msvc@1.11.1': + resolution: {integrity: sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==} cpu: [arm64] os: [win32] - '@unrs/resolver-binding-win32-ia32-msvc@1.11.0': - resolution: {integrity: sha512-HYchBYOZ7WN266VjoGm20xFv5EonG/ODURRgwl9EZT7Bq1nLEs6VKJddzfFdXEAho0wfFlt8L/xIiE29Pmy1RA==} + '@unrs/resolver-binding-win32-ia32-msvc@1.11.1': + resolution: {integrity: sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==} cpu: [ia32] os: [win32] - '@unrs/resolver-binding-win32-x64-msvc@1.11.0': - resolution: {integrity: sha512-+oLKLHw3I1UQo4MeHfoLYF+e6YBa8p5vYUw3Rgt7IDzCs+57vIZqQlIo62NDpYM0VG6BjWOwnzBczMvbtH8hag==} + '@unrs/resolver-binding-win32-x64-msvc@1.11.1': + resolution: {integrity: sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==} cpu: [x64] os: [win32] @@ -1380,9 +1445,9 @@ packages: caniuse-lite@1.0.30001727: resolution: {integrity: sha512-pB68nIHmbN6L/4C6MH1DokyR3bYqFwjaSs/sWDHGj4CTcFtQUQMuJftVwWkXq7mNWOybD3KhUv3oWHoGxgP14Q==} - chai@5.2.0: - resolution: {integrity: sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==} - engines: {node: '>=12'} + chai@5.2.1: + resolution: {integrity: sha512-5nFxhUrX0PqtyogoYOA8IPswy5sZFTOsBFl/9bNsmDLgsxYTzSZQJDPppDnZPTQbzSEm0hqGjWPzRemQCYbD6A==} + engines: {node: '>=18'} chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} @@ -1539,16 +1604,16 @@ packages: dompurify@3.2.6: resolution: {integrity: sha512-/2GogDQlohXPZe6D6NOgQvXLPSYBqIWMnZ8zzOhn09REE4eyAzb+Hed3jhoM9OkuaJ8P6ZGTTVWQKAi8ieIzfQ==} - dotenv@17.0.1: - resolution: {integrity: sha512-GLjkduuAL7IMJg/ZnOPm9AnWKJ82mSE2tzXLaJ/6hD6DhwGfZaXG77oB8qbReyiczNxnbxQKyh0OE5mXq0bAHA==} + dotenv@17.2.0: + resolution: {integrity: sha512-Q4sgBT60gzd0BB0lSyYD3xM4YxrXA9y4uBDof1JNYGzOXrQdQ6yX+7XIAqoFOGQFOTK1D3Hts5OllpxMDZFONQ==} engines: {node: '>=12'} dunder-proto@1.0.1: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} - electron-to-chromium@1.5.179: - resolution: {integrity: sha512-UWKi/EbBopgfFsc5k61wFpV7WrnnSlSzW/e2XcBmS6qKYTivZlLtoll5/rdqRTxGglGHkmkW0j0pFNJG10EUIQ==} + electron-to-chromium@1.5.182: + resolution: {integrity: sha512-Lv65Btwv9W4J9pyODI6EWpdnhfvrve/us5h1WspW8B2Fb0366REPtY3hX7ounk1CkV/TBjWCEvCBBbYbmV0qCA==} emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} @@ -1607,9 +1672,9 @@ packages: resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==} engines: {node: '>= 0.4'} - esbuild@0.21.5: - resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} - engines: {node: '>=12'} + esbuild@0.25.6: + resolution: {integrity: sha512-GVuzuUwtdsghE3ocJ9Bs8PNoF13HNQ5TXbEi2AhvVb8xU1Iwt9Fos9FEamfoee+u/TOsn7GUWc04lz46n2bbTg==} + engines: {node: '>=18'} hasBin: true escalade@3.2.0: @@ -1629,6 +1694,12 @@ packages: typescript: optional: true + eslint-config-prettier@10.1.5: + resolution: {integrity: sha512-zc1UmCpNltmVY34vuLRV61r1K27sWuX39E+uyUnY8xS2Bex88VV9cugG+UZbRSRGtGyFboj+D8JODyme1plMpw==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + eslint-import-resolver-node@0.3.9: resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} @@ -1706,8 +1777,8 @@ packages: resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@9.30.1: - resolution: {integrity: sha512-zmxXPNMOXmwm9E0yQLi5uqXHs7uq2UIiqEKo3Gq+3fwo1XrJ+hijAZImyF7hclW3E6oHz43Yk3RP8at6OTKflQ==} + eslint@9.31.0: + resolution: {integrity: sha512-QldCVh/ztyKJJZLr4jXNUByx3gR+TDYZCRXEktiZoUR3PGy4qCmSbkxcIle8GEwGpb5JBZazlaJ/CxLidXdEbQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true peerDependencies: @@ -2112,8 +2183,8 @@ packages: resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} engines: {node: '>=4.0'} - katex@0.16.20: - resolution: {integrity: sha512-jjuLaMGD/7P8jUTpdKhA9IoqnH+yMFB3sdAFtq5QdAqeP2PjiSbnC3EaguKPNtv6dXXanHxp1ckwvF4a86LBig==} + katex@0.16.22: + resolution: {integrity: sha512-XCHRdUw4lf3SKBaJe4EvgqIuWwkPSo9XoeO8GjQW94Bp7TWv9hNhzZjZ+OH9yf1UmLygb7DIT5GSFQiyt16zYg==} hasBin: true keyv@4.5.4: @@ -2505,8 +2576,8 @@ packages: resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - rollup@4.44.2: - resolution: {integrity: sha512-PVoapzTwSEcelaWGth3uR66u7ZRo6qhPHc0f2uRO9fX6XDVNrIiGYS0Pj9+R8yIIYSD/mCx2b16Ws9itljKSPg==} + rollup@4.45.0: + resolution: {integrity: sha512-WLjEcJRIo7i3WDDgOIJqVI2d+lAC3EwvOGy+Xfq6hs+GQuAA4Di/H72xmXkOhrIWFg2PFYSKZYfH0f4vfKXN4A==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -2559,8 +2630,8 @@ packages: resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} engines: {node: '>= 0.4'} - sharp@0.34.2: - resolution: {integrity: sha512-lszvBmB9QURERtyKT2bNmsgxXK0ShJrL/fvqlonCo7e6xBF8nT8xU6pW+PMIbLsz0RxQk3rgH9kd8UmvOzlMJg==} + sharp@0.34.3: + resolution: {integrity: sha512-eX2IQ6nFohW4DbvHIOLRB3MHFpYqaqvXd3Tp5e/T/dSH83fxaNJQRvDMhASmkNTsNTVF2/OOopzRCt7xokgPfg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} shebang-command@2.0.0: @@ -2790,8 +2861,8 @@ packages: undici-types@7.8.0: resolution: {integrity: sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==} - unrs-resolver@1.11.0: - resolution: {integrity: sha512-uw3hCGO/RdAEAb4zgJ3C/v6KIAFFOtBoxR86b2Ejc5TnH7HrhTWJR2o0A9ullC3eWMegKQCw/arQ/JivywQzkg==} + unrs-resolver@1.11.1: + resolution: {integrity: sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==} update-browserslist-db@1.1.3: resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} @@ -2811,22 +2882,27 @@ packages: engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true - vite@5.4.19: - resolution: {integrity: sha512-qO3aKv3HoQC8QKiNSTuUM1l9o/XX3+c+VTgLHbJWHZGeTPVAg2XwazI9UWzoxjIJCGCV2zU60uqMzjeLZuULqA==} - engines: {node: ^18.0.0 || >=20.0.0} + vite@7.0.4: + resolution: {integrity: sha512-SkaSguuS7nnmV7mfJ8l81JGBFV7Gvzp8IzgE8A8t23+AxuNX61Q5H1Tpz5efduSN7NHC8nQXD3sKQKZAu5mNEA==} + engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: - '@types/node': ^18.0.0 || >=20.0.0 - less: '*' + '@types/node': ^20.19.0 || >=22.12.0 + jiti: '>=1.21.0' + less: ^4.0.0 lightningcss: ^1.21.0 - sass: '*' - sass-embedded: '*' - stylus: '*' - sugarss: '*' - terser: ^5.4.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 peerDependenciesMeta: '@types/node': optional: true + jiti: + optional: true less: optional: true lightningcss: @@ -2841,6 +2917,10 @@ packages: optional: true terser: optional: true + tsx: + optional: true + yaml: + optional: true vitest@3.2.4: resolution: {integrity: sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==} @@ -2971,8 +3051,8 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} - zod@3.25.75: - resolution: {integrity: sha512-OhpzAmVzabPOL6C3A3gpAifqr9MqihV/Msx3gor2b2kviCgcb+HM9SEOpMWwwNp9MRunWnhtAKUoo0AHhjyPPg==} + zod@3.25.76: + resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} snapshots: @@ -3010,7 +3090,7 @@ snapshots: '@babel/parser': 7.28.0 '@babel/template': 7.27.2 '@babel/traverse': 7.28.0 - '@babel/types': 7.28.0 + '@babel/types': 7.28.1 convert-source-map: 2.0.0 debug: 4.4.1 gensync: 1.0.0-beta.2 @@ -3022,7 +3102,7 @@ snapshots: '@babel/generator@7.28.0': dependencies: '@babel/parser': 7.28.0 - '@babel/types': 7.28.0 + '@babel/types': 7.28.1 '@jridgewell/gen-mapping': 0.3.12 '@jridgewell/trace-mapping': 0.3.29 jsesc: 3.1.0 @@ -3040,7 +3120,7 @@ snapshots: '@babel/helper-module-imports@7.27.1': dependencies: '@babel/traverse': 7.28.0 - '@babel/types': 7.28.0 + '@babel/types': 7.28.1 transitivePeerDependencies: - supports-color @@ -3064,11 +3144,11 @@ snapshots: '@babel/helpers@7.27.6': dependencies: '@babel/template': 7.27.2 - '@babel/types': 7.28.0 + '@babel/types': 7.28.1 '@babel/parser@7.28.0': dependencies: - '@babel/types': 7.28.0 + '@babel/types': 7.28.1 '@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.28.0)': dependencies: @@ -3086,7 +3166,7 @@ snapshots: dependencies: '@babel/code-frame': 7.27.1 '@babel/parser': 7.28.0 - '@babel/types': 7.28.0 + '@babel/types': 7.28.1 '@babel/traverse@7.28.0': dependencies: @@ -3095,12 +3175,12 @@ snapshots: '@babel/helper-globals': 7.28.0 '@babel/parser': 7.28.0 '@babel/template': 7.27.2 - '@babel/types': 7.28.0 + '@babel/types': 7.28.1 debug: 4.4.1 transitivePeerDependencies: - supports-color - '@babel/types@7.28.0': + '@babel/types@7.28.1': dependencies: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.27.1 @@ -3141,78 +3221,87 @@ snapshots: tslib: 2.8.1 optional: true - '@esbuild/aix-ppc64@0.21.5': + '@esbuild/aix-ppc64@0.25.6': optional: true - '@esbuild/android-arm64@0.21.5': + '@esbuild/android-arm64@0.25.6': optional: true - '@esbuild/android-arm@0.21.5': + '@esbuild/android-arm@0.25.6': optional: true - '@esbuild/android-x64@0.21.5': + '@esbuild/android-x64@0.25.6': optional: true - '@esbuild/darwin-arm64@0.21.5': + '@esbuild/darwin-arm64@0.25.6': optional: true - '@esbuild/darwin-x64@0.21.5': + '@esbuild/darwin-x64@0.25.6': optional: true - '@esbuild/freebsd-arm64@0.21.5': + '@esbuild/freebsd-arm64@0.25.6': optional: true - '@esbuild/freebsd-x64@0.21.5': + '@esbuild/freebsd-x64@0.25.6': optional: true - '@esbuild/linux-arm64@0.21.5': + '@esbuild/linux-arm64@0.25.6': optional: true - '@esbuild/linux-arm@0.21.5': + '@esbuild/linux-arm@0.25.6': optional: true - '@esbuild/linux-ia32@0.21.5': + '@esbuild/linux-ia32@0.25.6': optional: true - '@esbuild/linux-loong64@0.21.5': + '@esbuild/linux-loong64@0.25.6': optional: true - '@esbuild/linux-mips64el@0.21.5': + '@esbuild/linux-mips64el@0.25.6': optional: true - '@esbuild/linux-ppc64@0.21.5': + '@esbuild/linux-ppc64@0.25.6': optional: true - '@esbuild/linux-riscv64@0.21.5': + '@esbuild/linux-riscv64@0.25.6': optional: true - '@esbuild/linux-s390x@0.21.5': + '@esbuild/linux-s390x@0.25.6': optional: true - '@esbuild/linux-x64@0.21.5': + '@esbuild/linux-x64@0.25.6': optional: true - '@esbuild/netbsd-x64@0.21.5': + '@esbuild/netbsd-arm64@0.25.6': optional: true - '@esbuild/openbsd-x64@0.21.5': + '@esbuild/netbsd-x64@0.25.6': optional: true - '@esbuild/sunos-x64@0.21.5': + '@esbuild/openbsd-arm64@0.25.6': optional: true - '@esbuild/win32-arm64@0.21.5': + '@esbuild/openbsd-x64@0.25.6': optional: true - '@esbuild/win32-ia32@0.21.5': + '@esbuild/openharmony-arm64@0.25.6': optional: true - '@esbuild/win32-x64@0.21.5': + '@esbuild/sunos-x64@0.25.6': optional: true - '@eslint-community/eslint-utils@4.7.0(eslint@9.30.1(jiti@2.4.2))': + '@esbuild/win32-arm64@0.25.6': + optional: true + + '@esbuild/win32-ia32@0.25.6': + optional: true + + '@esbuild/win32-x64@0.25.6': + optional: true + + '@eslint-community/eslint-utils@4.7.0(eslint@9.31.0(jiti@2.4.2))': dependencies: - eslint: 9.30.1(jiti@2.4.2) + eslint: 9.31.0(jiti@2.4.2) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.1': {} @@ -3227,10 +3316,6 @@ snapshots: '@eslint/config-helpers@0.3.0': {} - '@eslint/core@0.14.0': - dependencies: - '@types/json-schema': 7.0.15 - '@eslint/core@0.15.1': dependencies: '@types/json-schema': 7.0.15 @@ -3249,7 +3334,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@9.30.1': {} + '@eslint/js@9.31.0': {} '@eslint/object-schema@2.1.6': {} @@ -3271,85 +3356,90 @@ snapshots: '@humanwhocodes/retry@0.4.3': {} - '@img/sharp-darwin-arm64@0.34.2': + '@img/sharp-darwin-arm64@0.34.3': optionalDependencies: - '@img/sharp-libvips-darwin-arm64': 1.1.0 + '@img/sharp-libvips-darwin-arm64': 1.2.0 optional: true - '@img/sharp-darwin-x64@0.34.2': + '@img/sharp-darwin-x64@0.34.3': optionalDependencies: - '@img/sharp-libvips-darwin-x64': 1.1.0 + '@img/sharp-libvips-darwin-x64': 1.2.0 optional: true - '@img/sharp-libvips-darwin-arm64@1.1.0': + '@img/sharp-libvips-darwin-arm64@1.2.0': optional: true - '@img/sharp-libvips-darwin-x64@1.1.0': + '@img/sharp-libvips-darwin-x64@1.2.0': optional: true - '@img/sharp-libvips-linux-arm64@1.1.0': + '@img/sharp-libvips-linux-arm64@1.2.0': optional: true - '@img/sharp-libvips-linux-arm@1.1.0': + '@img/sharp-libvips-linux-arm@1.2.0': optional: true - '@img/sharp-libvips-linux-ppc64@1.1.0': + '@img/sharp-libvips-linux-ppc64@1.2.0': optional: true - '@img/sharp-libvips-linux-s390x@1.1.0': + '@img/sharp-libvips-linux-s390x@1.2.0': optional: true - '@img/sharp-libvips-linux-x64@1.1.0': + '@img/sharp-libvips-linux-x64@1.2.0': optional: true - '@img/sharp-libvips-linuxmusl-arm64@1.1.0': + '@img/sharp-libvips-linuxmusl-arm64@1.2.0': optional: true - '@img/sharp-libvips-linuxmusl-x64@1.1.0': + '@img/sharp-libvips-linuxmusl-x64@1.2.0': optional: true - '@img/sharp-linux-arm64@0.34.2': + '@img/sharp-linux-arm64@0.34.3': optionalDependencies: - '@img/sharp-libvips-linux-arm64': 1.1.0 + '@img/sharp-libvips-linux-arm64': 1.2.0 optional: true - '@img/sharp-linux-arm@0.34.2': + '@img/sharp-linux-arm@0.34.3': optionalDependencies: - '@img/sharp-libvips-linux-arm': 1.1.0 + '@img/sharp-libvips-linux-arm': 1.2.0 optional: true - '@img/sharp-linux-s390x@0.34.2': + '@img/sharp-linux-ppc64@0.34.3': optionalDependencies: - '@img/sharp-libvips-linux-s390x': 1.1.0 + '@img/sharp-libvips-linux-ppc64': 1.2.0 optional: true - '@img/sharp-linux-x64@0.34.2': + '@img/sharp-linux-s390x@0.34.3': optionalDependencies: - '@img/sharp-libvips-linux-x64': 1.1.0 + '@img/sharp-libvips-linux-s390x': 1.2.0 optional: true - '@img/sharp-linuxmusl-arm64@0.34.2': + '@img/sharp-linux-x64@0.34.3': optionalDependencies: - '@img/sharp-libvips-linuxmusl-arm64': 1.1.0 + '@img/sharp-libvips-linux-x64': 1.2.0 optional: true - '@img/sharp-linuxmusl-x64@0.34.2': + '@img/sharp-linuxmusl-arm64@0.34.3': optionalDependencies: - '@img/sharp-libvips-linuxmusl-x64': 1.1.0 + '@img/sharp-libvips-linuxmusl-arm64': 1.2.0 optional: true - '@img/sharp-wasm32@0.34.2': + '@img/sharp-linuxmusl-x64@0.34.3': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-x64': 1.2.0 + optional: true + + '@img/sharp-wasm32@0.34.3': dependencies: '@emnapi/runtime': 1.4.4 optional: true - '@img/sharp-win32-arm64@0.34.2': + '@img/sharp-win32-arm64@0.34.3': optional: true - '@img/sharp-win32-ia32@0.34.2': + '@img/sharp-win32-ia32@0.34.3': optional: true - '@img/sharp-win32-x64@0.34.2': + '@img/sharp-win32-x64@0.34.3': optional: true '@isaacs/fs-minipass@4.0.1': @@ -3381,11 +3471,11 @@ snapshots: react: 19.1.0 react-dom: 19.1.0(react@19.1.0) - '@napi-rs/wasm-runtime@0.2.11': + '@napi-rs/wasm-runtime@0.2.12': dependencies: '@emnapi/core': 1.4.4 '@emnapi/runtime': 1.4.4 - '@tybys/wasm-util': 0.9.0 + '@tybys/wasm-util': 0.10.0 optional: true '@next/env@15.3.5': {} @@ -3434,64 +3524,64 @@ snapshots: '@rolldown/pluginutils@1.0.0-beta.19': {} - '@rollup/rollup-android-arm-eabi@4.44.2': + '@rollup/rollup-android-arm-eabi@4.45.0': optional: true - '@rollup/rollup-android-arm64@4.44.2': + '@rollup/rollup-android-arm64@4.45.0': optional: true - '@rollup/rollup-darwin-arm64@4.44.2': + '@rollup/rollup-darwin-arm64@4.45.0': optional: true - '@rollup/rollup-darwin-x64@4.44.2': + '@rollup/rollup-darwin-x64@4.45.0': optional: true - '@rollup/rollup-freebsd-arm64@4.44.2': + '@rollup/rollup-freebsd-arm64@4.45.0': optional: true - '@rollup/rollup-freebsd-x64@4.44.2': + '@rollup/rollup-freebsd-x64@4.45.0': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.44.2': + '@rollup/rollup-linux-arm-gnueabihf@4.45.0': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.44.2': + '@rollup/rollup-linux-arm-musleabihf@4.45.0': optional: true - '@rollup/rollup-linux-arm64-gnu@4.44.2': + '@rollup/rollup-linux-arm64-gnu@4.45.0': optional: true - '@rollup/rollup-linux-arm64-musl@4.44.2': + '@rollup/rollup-linux-arm64-musl@4.45.0': optional: true - '@rollup/rollup-linux-loongarch64-gnu@4.44.2': + '@rollup/rollup-linux-loongarch64-gnu@4.45.0': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.44.2': + '@rollup/rollup-linux-powerpc64le-gnu@4.45.0': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.44.2': + '@rollup/rollup-linux-riscv64-gnu@4.45.0': optional: true - '@rollup/rollup-linux-riscv64-musl@4.44.2': + '@rollup/rollup-linux-riscv64-musl@4.45.0': optional: true - '@rollup/rollup-linux-s390x-gnu@4.44.2': + '@rollup/rollup-linux-s390x-gnu@4.45.0': optional: true - '@rollup/rollup-linux-x64-gnu@4.44.2': + '@rollup/rollup-linux-x64-gnu@4.45.0': optional: true - '@rollup/rollup-linux-x64-musl@4.44.2': + '@rollup/rollup-linux-x64-musl@4.45.0': optional: true - '@rollup/rollup-win32-arm64-msvc@4.44.2': + '@rollup/rollup-win32-arm64-msvc@4.45.0': optional: true - '@rollup/rollup-win32-ia32-msvc@4.44.2': + '@rollup/rollup-win32-ia32-msvc@4.45.0': optional: true - '@rollup/rollup-win32-x64-msvc@4.44.2': + '@rollup/rollup-win32-x64-msvc@4.45.0': optional: true '@rtsao/scc@1.1.0': {} @@ -3578,19 +3668,19 @@ snapshots: postcss: 8.5.6 tailwindcss: 4.1.11 - '@tanstack/query-core@5.81.5': {} + '@tanstack/query-core@5.83.0': {} '@tanstack/query-devtools@5.81.2': {} - '@tanstack/react-query-devtools@5.81.5(@tanstack/react-query@5.81.5(react@19.1.0))(react@19.1.0)': + '@tanstack/react-query-devtools@5.83.0(@tanstack/react-query@5.83.0(react@19.1.0))(react@19.1.0)': dependencies: '@tanstack/query-devtools': 5.81.2 - '@tanstack/react-query': 5.81.5(react@19.1.0) + '@tanstack/react-query': 5.83.0(react@19.1.0) react: 19.1.0 - '@tanstack/react-query@5.81.5(react@19.1.0)': + '@tanstack/react-query@5.83.0(react@19.1.0)': dependencies: - '@tanstack/query-core': 5.81.5 + '@tanstack/query-core': 5.83.0 react: 19.1.0 '@testing-library/dom@10.4.0': @@ -3619,7 +3709,7 @@ snapshots: '@trpc/server': 11.4.3(typescript@5.8.3) typescript: 5.8.3 - '@trpc/next@11.4.3(@tanstack/react-query@5.81.5(react@19.1.0))(@trpc/client@11.4.3(@trpc/server@11.4.3(typescript@5.8.3))(typescript@5.8.3))(@trpc/react-query@11.4.3(@tanstack/react-query@5.81.5(react@19.1.0))(@trpc/client@11.4.3(@trpc/server@11.4.3(typescript@5.8.3))(typescript@5.8.3))(@trpc/server@11.4.3(typescript@5.8.3))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.8.3))(@trpc/server@11.4.3(typescript@5.8.3))(next@15.3.5(@babel/core@7.28.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.8.3)': + '@trpc/next@11.4.3(@tanstack/react-query@5.83.0(react@19.1.0))(@trpc/client@11.4.3(@trpc/server@11.4.3(typescript@5.8.3))(typescript@5.8.3))(@trpc/react-query@11.4.3(@tanstack/react-query@5.83.0(react@19.1.0))(@trpc/client@11.4.3(@trpc/server@11.4.3(typescript@5.8.3))(typescript@5.8.3))(@trpc/server@11.4.3(typescript@5.8.3))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.8.3))(@trpc/server@11.4.3(typescript@5.8.3))(next@15.3.5(@babel/core@7.28.0)(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.8.3)': dependencies: '@trpc/client': 11.4.3(@trpc/server@11.4.3(typescript@5.8.3))(typescript@5.8.3) '@trpc/server': 11.4.3(typescript@5.8.3) @@ -3628,12 +3718,12 @@ snapshots: react-dom: 19.1.0(react@19.1.0) typescript: 5.8.3 optionalDependencies: - '@tanstack/react-query': 5.81.5(react@19.1.0) - '@trpc/react-query': 11.4.3(@tanstack/react-query@5.81.5(react@19.1.0))(@trpc/client@11.4.3(@trpc/server@11.4.3(typescript@5.8.3))(typescript@5.8.3))(@trpc/server@11.4.3(typescript@5.8.3))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.8.3) + '@tanstack/react-query': 5.83.0(react@19.1.0) + '@trpc/react-query': 11.4.3(@tanstack/react-query@5.83.0(react@19.1.0))(@trpc/client@11.4.3(@trpc/server@11.4.3(typescript@5.8.3))(typescript@5.8.3))(@trpc/server@11.4.3(typescript@5.8.3))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.8.3) - '@trpc/react-query@11.4.3(@tanstack/react-query@5.81.5(react@19.1.0))(@trpc/client@11.4.3(@trpc/server@11.4.3(typescript@5.8.3))(typescript@5.8.3))(@trpc/server@11.4.3(typescript@5.8.3))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.8.3)': + '@trpc/react-query@11.4.3(@tanstack/react-query@5.83.0(react@19.1.0))(@trpc/client@11.4.3(@trpc/server@11.4.3(typescript@5.8.3))(typescript@5.8.3))(@trpc/server@11.4.3(typescript@5.8.3))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.8.3)': dependencies: - '@tanstack/react-query': 5.81.5(react@19.1.0) + '@tanstack/react-query': 5.83.0(react@19.1.0) '@trpc/client': 11.4.3(@trpc/server@11.4.3(typescript@5.8.3))(typescript@5.8.3) '@trpc/server': 11.4.3(typescript@5.8.3) react: 19.1.0 @@ -3644,16 +3734,16 @@ snapshots: dependencies: typescript: 5.8.3 - '@trpc/tanstack-react-query@11.4.3(@tanstack/react-query@5.81.5(react@19.1.0))(@trpc/client@11.4.3(@trpc/server@11.4.3(typescript@5.8.3))(typescript@5.8.3))(@trpc/server@11.4.3(typescript@5.8.3))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.8.3)': + '@trpc/tanstack-react-query@11.4.3(@tanstack/react-query@5.83.0(react@19.1.0))(@trpc/client@11.4.3(@trpc/server@11.4.3(typescript@5.8.3))(typescript@5.8.3))(@trpc/server@11.4.3(typescript@5.8.3))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.8.3)': dependencies: - '@tanstack/react-query': 5.81.5(react@19.1.0) + '@tanstack/react-query': 5.83.0(react@19.1.0) '@trpc/client': 11.4.3(@trpc/server@11.4.3(typescript@5.8.3))(typescript@5.8.3) '@trpc/server': 11.4.3(typescript@5.8.3) react: 19.1.0 react-dom: 19.1.0(react@19.1.0) typescript: 5.8.3 - '@tybys/wasm-util@0.9.0': + '@tybys/wasm-util@0.10.0': dependencies: tslib: 2.8.1 optional: true @@ -3663,23 +3753,23 @@ snapshots: '@types/babel__core@7.20.5': dependencies: '@babel/parser': 7.28.0 - '@babel/types': 7.28.0 + '@babel/types': 7.28.1 '@types/babel__generator': 7.27.0 '@types/babel__template': 7.4.4 '@types/babel__traverse': 7.20.7 '@types/babel__generator@7.27.0': dependencies: - '@babel/types': 7.28.0 + '@babel/types': 7.28.1 '@types/babel__template@7.4.4': dependencies: '@babel/parser': 7.28.0 - '@babel/types': 7.28.0 + '@babel/types': 7.28.1 '@types/babel__traverse@7.20.7': dependencies: - '@babel/types': 7.28.0 + '@babel/types': 7.28.1 '@types/chai@5.2.2': dependencies: @@ -3687,7 +3777,7 @@ snapshots: '@types/cors@2.8.19': dependencies: - '@types/node': 24.0.10 + '@types/node': 24.0.13 '@types/deep-eql@4.0.2': {} @@ -3697,7 +3787,7 @@ snapshots: '@types/json5@0.0.29': {} - '@types/node@24.0.10': + '@types/node@24.0.13': dependencies: undici-types: 7.8.0 @@ -3714,17 +3804,17 @@ snapshots: '@types/ws@8.18.1': dependencies: - '@types/node': 24.0.10 + '@types/node': 24.0.13 - '@typescript-eslint/eslint-plugin@8.36.0(@typescript-eslint/parser@8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3)': + '@typescript-eslint/eslint-plugin@8.36.0(@typescript-eslint/parser@8.37.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/parser': 8.37.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3) '@typescript-eslint/scope-manager': 8.36.0 - '@typescript-eslint/type-utils': 8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/utils': 8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/type-utils': 8.36.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/utils': 8.36.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3) '@typescript-eslint/visitor-keys': 8.36.0 - eslint: 9.30.1(jiti@2.4.2) + eslint: 9.31.0(jiti@2.4.2) graphemer: 1.4.0 ignore: 7.0.5 natural-compare: 1.4.0 @@ -3733,14 +3823,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3)': + '@typescript-eslint/parser@8.37.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3)': dependencies: - '@typescript-eslint/scope-manager': 8.36.0 - '@typescript-eslint/types': 8.36.0 - '@typescript-eslint/typescript-estree': 8.36.0(typescript@5.8.3) - '@typescript-eslint/visitor-keys': 8.36.0 + '@typescript-eslint/scope-manager': 8.37.0 + '@typescript-eslint/types': 8.37.0 + '@typescript-eslint/typescript-estree': 8.37.0(typescript@5.8.3) + '@typescript-eslint/visitor-keys': 8.37.0 debug: 4.4.1 - eslint: 9.30.1(jiti@2.4.2) + eslint: 9.31.0(jiti@2.4.2) typescript: 5.8.3 transitivePeerDependencies: - supports-color @@ -3754,21 +3844,39 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/project-service@8.37.0(typescript@5.8.3)': + dependencies: + '@typescript-eslint/tsconfig-utils': 8.37.0(typescript@5.8.3) + '@typescript-eslint/types': 8.37.0 + debug: 4.4.1 + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/scope-manager@8.36.0': dependencies: '@typescript-eslint/types': 8.36.0 '@typescript-eslint/visitor-keys': 8.36.0 + '@typescript-eslint/scope-manager@8.37.0': + dependencies: + '@typescript-eslint/types': 8.37.0 + '@typescript-eslint/visitor-keys': 8.37.0 + '@typescript-eslint/tsconfig-utils@8.36.0(typescript@5.8.3)': dependencies: typescript: 5.8.3 - '@typescript-eslint/type-utils@8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3)': + '@typescript-eslint/tsconfig-utils@8.37.0(typescript@5.8.3)': + dependencies: + typescript: 5.8.3 + + '@typescript-eslint/type-utils@8.36.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3)': dependencies: '@typescript-eslint/typescript-estree': 8.36.0(typescript@5.8.3) - '@typescript-eslint/utils': 8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/utils': 8.36.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3) debug: 4.4.1 - eslint: 9.30.1(jiti@2.4.2) + eslint: 9.31.0(jiti@2.4.2) ts-api-utils: 2.1.0(typescript@5.8.3) typescript: 5.8.3 transitivePeerDependencies: @@ -3776,6 +3884,8 @@ snapshots: '@typescript-eslint/types@8.36.0': {} + '@typescript-eslint/types@8.37.0': {} + '@typescript-eslint/typescript-estree@8.36.0(typescript@5.8.3)': dependencies: '@typescript-eslint/project-service': 8.36.0(typescript@5.8.3) @@ -3792,13 +3902,29 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3)': + '@typescript-eslint/typescript-estree@8.37.0(typescript@5.8.3)': dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.30.1(jiti@2.4.2)) + '@typescript-eslint/project-service': 8.37.0(typescript@5.8.3) + '@typescript-eslint/tsconfig-utils': 8.37.0(typescript@5.8.3) + '@typescript-eslint/types': 8.37.0 + '@typescript-eslint/visitor-keys': 8.37.0 + debug: 4.4.1 + fast-glob: 3.3.3 + is-glob: 4.0.3 + minimatch: 9.0.5 + semver: 7.7.2 + ts-api-utils: 2.1.0(typescript@5.8.3) + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@8.36.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3)': + dependencies: + '@eslint-community/eslint-utils': 4.7.0(eslint@9.31.0(jiti@2.4.2)) '@typescript-eslint/scope-manager': 8.36.0 '@typescript-eslint/types': 8.36.0 '@typescript-eslint/typescript-estree': 8.36.0(typescript@5.8.3) - eslint: 9.30.1(jiti@2.4.2) + eslint: 9.31.0(jiti@2.4.2) typescript: 5.8.3 transitivePeerDependencies: - supports-color @@ -3808,66 +3934,71 @@ snapshots: '@typescript-eslint/types': 8.36.0 eslint-visitor-keys: 4.2.1 - '@unrs/resolver-binding-android-arm-eabi@1.11.0': - optional: true - - '@unrs/resolver-binding-android-arm64@1.11.0': - optional: true - - '@unrs/resolver-binding-darwin-arm64@1.11.0': - optional: true - - '@unrs/resolver-binding-darwin-x64@1.11.0': - optional: true - - '@unrs/resolver-binding-freebsd-x64@1.11.0': - optional: true - - '@unrs/resolver-binding-linux-arm-gnueabihf@1.11.0': - optional: true - - '@unrs/resolver-binding-linux-arm-musleabihf@1.11.0': - optional: true - - '@unrs/resolver-binding-linux-arm64-gnu@1.11.0': - optional: true - - '@unrs/resolver-binding-linux-arm64-musl@1.11.0': - optional: true - - '@unrs/resolver-binding-linux-ppc64-gnu@1.11.0': - optional: true - - '@unrs/resolver-binding-linux-riscv64-gnu@1.11.0': - optional: true - - '@unrs/resolver-binding-linux-riscv64-musl@1.11.0': - optional: true - - '@unrs/resolver-binding-linux-s390x-gnu@1.11.0': - optional: true - - '@unrs/resolver-binding-linux-x64-gnu@1.11.0': - optional: true - - '@unrs/resolver-binding-linux-x64-musl@1.11.0': - optional: true - - '@unrs/resolver-binding-wasm32-wasi@1.11.0': + '@typescript-eslint/visitor-keys@8.37.0': dependencies: - '@napi-rs/wasm-runtime': 0.2.11 + '@typescript-eslint/types': 8.37.0 + eslint-visitor-keys: 4.2.1 + + '@unrs/resolver-binding-android-arm-eabi@1.11.1': optional: true - '@unrs/resolver-binding-win32-arm64-msvc@1.11.0': + '@unrs/resolver-binding-android-arm64@1.11.1': optional: true - '@unrs/resolver-binding-win32-ia32-msvc@1.11.0': + '@unrs/resolver-binding-darwin-arm64@1.11.1': optional: true - '@unrs/resolver-binding-win32-x64-msvc@1.11.0': + '@unrs/resolver-binding-darwin-x64@1.11.1': optional: true - '@vitejs/plugin-react@4.6.0(vite@5.4.19(@types/node@24.0.10)(lightningcss@1.30.1))': + '@unrs/resolver-binding-freebsd-x64@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-arm-gnueabihf@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-arm-musleabihf@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-arm64-gnu@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-arm64-musl@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-ppc64-gnu@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-riscv64-gnu@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-riscv64-musl@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-s390x-gnu@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-x64-gnu@1.11.1': + optional: true + + '@unrs/resolver-binding-linux-x64-musl@1.11.1': + optional: true + + '@unrs/resolver-binding-wasm32-wasi@1.11.1': + dependencies: + '@napi-rs/wasm-runtime': 0.2.12 + optional: true + + '@unrs/resolver-binding-win32-arm64-msvc@1.11.1': + optional: true + + '@unrs/resolver-binding-win32-ia32-msvc@1.11.1': + optional: true + + '@unrs/resolver-binding-win32-x64-msvc@1.11.1': + optional: true + + '@vitejs/plugin-react@4.6.0(vite@7.0.4(@types/node@24.0.13)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0))': dependencies: '@babel/core': 7.28.0 '@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.28.0) @@ -3875,7 +4006,7 @@ snapshots: '@rolldown/pluginutils': 1.0.0-beta.19 '@types/babel__core': 7.20.5 react-refresh: 0.17.0 - vite: 5.4.19(@types/node@24.0.10)(lightningcss@1.30.1) + vite: 7.0.4(@types/node@24.0.13)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0) transitivePeerDependencies: - supports-color @@ -3884,16 +4015,16 @@ snapshots: '@types/chai': 5.2.2 '@vitest/spy': 3.2.4 '@vitest/utils': 3.2.4 - chai: 5.2.0 + chai: 5.2.1 tinyrainbow: 2.0.0 - '@vitest/mocker@3.2.4(vite@5.4.19(@types/node@24.0.10)(lightningcss@1.30.1))': + '@vitest/mocker@3.2.4(vite@7.0.4(@types/node@24.0.13)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0))': dependencies: '@vitest/spy': 3.2.4 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: - vite: 5.4.19(@types/node@24.0.10)(lightningcss@1.30.1) + vite: 7.0.4(@types/node@24.0.13)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0) '@vitest/pretty-format@3.2.4': dependencies: @@ -4068,7 +4199,7 @@ snapshots: browserslist@4.25.1: dependencies: caniuse-lite: 1.0.30001727 - electron-to-chromium: 1.5.179 + electron-to-chromium: 1.5.182 node-releases: 2.0.19 update-browserslist-db: 1.1.3(browserslist@4.25.1) @@ -4099,7 +4230,7 @@ snapshots: caniuse-lite@1.0.30001727: {} - chai@5.2.0: + chai@5.2.1: dependencies: assertion-error: 2.0.1 check-error: 2.1.1 @@ -4245,7 +4376,7 @@ snapshots: optionalDependencies: '@types/trusted-types': 2.0.7 - dotenv@17.0.1: {} + dotenv@17.2.0: {} dunder-proto@1.0.1: dependencies: @@ -4253,7 +4384,7 @@ snapshots: es-errors: 1.3.0 gopd: 1.2.0 - electron-to-chromium@1.5.179: {} + electron-to-chromium@1.5.182: {} emoji-regex@9.2.2: {} @@ -4274,7 +4405,7 @@ snapshots: engine.io@6.6.4: dependencies: '@types/cors': 2.8.19 - '@types/node': 24.0.10 + '@types/node': 24.0.13 accepts: 1.3.8 base64id: 2.0.0 cookie: 0.7.2 @@ -4397,49 +4528,52 @@ snapshots: is-date-object: 1.1.0 is-symbol: 1.1.1 - esbuild@0.21.5: + esbuild@0.25.6: optionalDependencies: - '@esbuild/aix-ppc64': 0.21.5 - '@esbuild/android-arm': 0.21.5 - '@esbuild/android-arm64': 0.21.5 - '@esbuild/android-x64': 0.21.5 - '@esbuild/darwin-arm64': 0.21.5 - '@esbuild/darwin-x64': 0.21.5 - '@esbuild/freebsd-arm64': 0.21.5 - '@esbuild/freebsd-x64': 0.21.5 - '@esbuild/linux-arm': 0.21.5 - '@esbuild/linux-arm64': 0.21.5 - '@esbuild/linux-ia32': 0.21.5 - '@esbuild/linux-loong64': 0.21.5 - '@esbuild/linux-mips64el': 0.21.5 - '@esbuild/linux-ppc64': 0.21.5 - '@esbuild/linux-riscv64': 0.21.5 - '@esbuild/linux-s390x': 0.21.5 - '@esbuild/linux-x64': 0.21.5 - '@esbuild/netbsd-x64': 0.21.5 - '@esbuild/openbsd-x64': 0.21.5 - '@esbuild/sunos-x64': 0.21.5 - '@esbuild/win32-arm64': 0.21.5 - '@esbuild/win32-ia32': 0.21.5 - '@esbuild/win32-x64': 0.21.5 + '@esbuild/aix-ppc64': 0.25.6 + '@esbuild/android-arm': 0.25.6 + '@esbuild/android-arm64': 0.25.6 + '@esbuild/android-x64': 0.25.6 + '@esbuild/darwin-arm64': 0.25.6 + '@esbuild/darwin-x64': 0.25.6 + '@esbuild/freebsd-arm64': 0.25.6 + '@esbuild/freebsd-x64': 0.25.6 + '@esbuild/linux-arm': 0.25.6 + '@esbuild/linux-arm64': 0.25.6 + '@esbuild/linux-ia32': 0.25.6 + '@esbuild/linux-loong64': 0.25.6 + '@esbuild/linux-mips64el': 0.25.6 + '@esbuild/linux-ppc64': 0.25.6 + '@esbuild/linux-riscv64': 0.25.6 + '@esbuild/linux-s390x': 0.25.6 + '@esbuild/linux-x64': 0.25.6 + '@esbuild/netbsd-arm64': 0.25.6 + '@esbuild/netbsd-x64': 0.25.6 + '@esbuild/openbsd-arm64': 0.25.6 + '@esbuild/openbsd-x64': 0.25.6 + '@esbuild/openharmony-arm64': 0.25.6 + '@esbuild/sunos-x64': 0.25.6 + '@esbuild/win32-arm64': 0.25.6 + '@esbuild/win32-ia32': 0.25.6 + '@esbuild/win32-x64': 0.25.6 escalade@3.2.0: {} escape-string-regexp@4.0.0: {} - eslint-config-next@15.3.5(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3): + eslint-config-next@15.3.5(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3): dependencies: '@next/eslint-plugin-next': 15.3.5 '@rushstack/eslint-patch': 1.12.0 - '@typescript-eslint/eslint-plugin': 8.36.0(@typescript-eslint/parser@8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) - '@typescript-eslint/parser': 8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) - eslint: 9.30.1(jiti@2.4.2) + '@typescript-eslint/eslint-plugin': 8.36.0(@typescript-eslint/parser@8.37.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3))(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/parser': 8.37.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3) + eslint: 9.31.0(jiti@2.4.2) eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.30.1(jiti@2.4.2)) - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.30.1(jiti@2.4.2)) - eslint-plugin-jsx-a11y: 6.10.2(eslint@9.30.1(jiti@2.4.2)) - eslint-plugin-react: 7.37.5(eslint@9.30.1(jiti@2.4.2)) - eslint-plugin-react-hooks: 5.2.0(eslint@9.30.1(jiti@2.4.2)) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.31.0(jiti@2.4.2)) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.37.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.31.0(jiti@2.4.2)) + eslint-plugin-jsx-a11y: 6.10.2(eslint@9.31.0(jiti@2.4.2)) + eslint-plugin-react: 7.37.5(eslint@9.31.0(jiti@2.4.2)) + eslint-plugin-react-hooks: 5.2.0(eslint@9.31.0(jiti@2.4.2)) optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: @@ -4447,6 +4581,10 @@ snapshots: - eslint-plugin-import-x - supports-color + eslint-config-prettier@10.1.5(eslint@9.31.0(jiti@2.4.2)): + dependencies: + eslint: 9.31.0(jiti@2.4.2) + eslint-import-resolver-node@0.3.9: dependencies: debug: 3.2.7 @@ -4455,33 +4593,33 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@9.30.1(jiti@2.4.2)): + eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@9.31.0(jiti@2.4.2)): dependencies: '@nolyfill/is-core-module': 1.0.39 debug: 4.4.1 - eslint: 9.30.1(jiti@2.4.2) + eslint: 9.31.0(jiti@2.4.2) get-tsconfig: 4.10.1 is-bun-module: 2.0.0 stable-hash: 0.0.5 tinyglobby: 0.2.14 - unrs-resolver: 1.11.0 + unrs-resolver: 1.11.1 optionalDependencies: - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.30.1(jiti@2.4.2)) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.37.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.31.0(jiti@2.4.2)) transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.1(@typescript-eslint/parser@8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.30.1(jiti@2.4.2)): + eslint-module-utils@2.12.1(@typescript-eslint/parser@8.37.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.31.0(jiti@2.4.2)): dependencies: debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) - eslint: 9.30.1(jiti@2.4.2) + '@typescript-eslint/parser': 8.37.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3) + eslint: 9.31.0(jiti@2.4.2) eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.30.1(jiti@2.4.2)) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.31.0(jiti@2.4.2)) transitivePeerDependencies: - supports-color - eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.30.1(jiti@2.4.2)): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.37.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.31.0(jiti@2.4.2)): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -4490,9 +4628,9 @@ snapshots: array.prototype.flatmap: 1.3.3 debug: 3.2.7 doctrine: 2.1.0 - eslint: 9.30.1(jiti@2.4.2) + eslint: 9.31.0(jiti@2.4.2) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.30.1(jiti@2.4.2)) + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.37.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.31.0(jiti@2.4.2)) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -4504,13 +4642,13 @@ snapshots: string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 8.36.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) + '@typescript-eslint/parser': 8.37.0(eslint@9.31.0(jiti@2.4.2))(typescript@5.8.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - eslint-plugin-jsx-a11y@6.10.2(eslint@9.30.1(jiti@2.4.2)): + eslint-plugin-jsx-a11y@6.10.2(eslint@9.31.0(jiti@2.4.2)): dependencies: aria-query: 5.3.2 array-includes: 3.1.9 @@ -4520,7 +4658,7 @@ snapshots: axobject-query: 4.1.0 damerau-levenshtein: 1.0.8 emoji-regex: 9.2.2 - eslint: 9.30.1(jiti@2.4.2) + eslint: 9.31.0(jiti@2.4.2) hasown: 2.0.2 jsx-ast-utils: 3.3.5 language-tags: 1.0.9 @@ -4529,11 +4667,11 @@ snapshots: safe-regex-test: 1.1.0 string.prototype.includes: 2.0.1 - eslint-plugin-react-hooks@5.2.0(eslint@9.30.1(jiti@2.4.2)): + eslint-plugin-react-hooks@5.2.0(eslint@9.31.0(jiti@2.4.2)): dependencies: - eslint: 9.30.1(jiti@2.4.2) + eslint: 9.31.0(jiti@2.4.2) - eslint-plugin-react@7.37.5(eslint@9.30.1(jiti@2.4.2)): + eslint-plugin-react@7.37.5(eslint@9.31.0(jiti@2.4.2)): dependencies: array-includes: 3.1.9 array.prototype.findlast: 1.2.5 @@ -4541,7 +4679,7 @@ snapshots: array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 es-iterator-helpers: 1.2.1 - eslint: 9.30.1(jiti@2.4.2) + eslint: 9.31.0(jiti@2.4.2) estraverse: 5.3.0 hasown: 2.0.2 jsx-ast-utils: 3.3.5 @@ -4564,15 +4702,15 @@ snapshots: eslint-visitor-keys@4.2.1: {} - eslint@9.30.1(jiti@2.4.2): + eslint@9.31.0(jiti@2.4.2): dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.30.1(jiti@2.4.2)) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.31.0(jiti@2.4.2)) '@eslint-community/regexpp': 4.12.1 '@eslint/config-array': 0.21.0 '@eslint/config-helpers': 0.3.0 - '@eslint/core': 0.14.0 + '@eslint/core': 0.15.1 '@eslint/eslintrc': 3.3.1 - '@eslint/js': 9.30.1 + '@eslint/js': 9.31.0 '@eslint/plugin-kit': 0.3.3 '@humanfs/node': 0.16.6 '@humanwhocodes/module-importer': 1.0.1 @@ -5025,7 +5163,7 @@ snapshots: object.assign: 4.1.7 object.values: 1.2.1 - katex@0.16.20: + katex@0.16.22: dependencies: commander: 8.3.0 @@ -5113,9 +5251,9 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.5.4 - marked-katex-extension@5.1.5(katex@0.16.20)(marked@16.0.0): + marked-katex-extension@5.1.5(katex@0.16.22)(marked@16.0.0): dependencies: - katex: 0.16.20 + katex: 0.16.22 marked: 16.0.0 marked@16.0.0: {} @@ -5185,7 +5323,7 @@ snapshots: '@next/swc-linux-x64-musl': 15.3.5 '@next/swc-win32-arm64-msvc': 15.3.5 '@next/swc-win32-x64-msvc': 15.3.5 - sharp: 0.34.2 + sharp: 0.34.3 transitivePeerDependencies: - '@babel/core' - babel-plugin-macros @@ -5382,30 +5520,30 @@ snapshots: reusify@1.1.0: {} - rollup@4.44.2: + rollup@4.45.0: dependencies: '@types/estree': 1.0.8 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.44.2 - '@rollup/rollup-android-arm64': 4.44.2 - '@rollup/rollup-darwin-arm64': 4.44.2 - '@rollup/rollup-darwin-x64': 4.44.2 - '@rollup/rollup-freebsd-arm64': 4.44.2 - '@rollup/rollup-freebsd-x64': 4.44.2 - '@rollup/rollup-linux-arm-gnueabihf': 4.44.2 - '@rollup/rollup-linux-arm-musleabihf': 4.44.2 - '@rollup/rollup-linux-arm64-gnu': 4.44.2 - '@rollup/rollup-linux-arm64-musl': 4.44.2 - '@rollup/rollup-linux-loongarch64-gnu': 4.44.2 - '@rollup/rollup-linux-powerpc64le-gnu': 4.44.2 - '@rollup/rollup-linux-riscv64-gnu': 4.44.2 - '@rollup/rollup-linux-riscv64-musl': 4.44.2 - '@rollup/rollup-linux-s390x-gnu': 4.44.2 - '@rollup/rollup-linux-x64-gnu': 4.44.2 - '@rollup/rollup-linux-x64-musl': 4.44.2 - '@rollup/rollup-win32-arm64-msvc': 4.44.2 - '@rollup/rollup-win32-ia32-msvc': 4.44.2 - '@rollup/rollup-win32-x64-msvc': 4.44.2 + '@rollup/rollup-android-arm-eabi': 4.45.0 + '@rollup/rollup-android-arm64': 4.45.0 + '@rollup/rollup-darwin-arm64': 4.45.0 + '@rollup/rollup-darwin-x64': 4.45.0 + '@rollup/rollup-freebsd-arm64': 4.45.0 + '@rollup/rollup-freebsd-x64': 4.45.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.45.0 + '@rollup/rollup-linux-arm-musleabihf': 4.45.0 + '@rollup/rollup-linux-arm64-gnu': 4.45.0 + '@rollup/rollup-linux-arm64-musl': 4.45.0 + '@rollup/rollup-linux-loongarch64-gnu': 4.45.0 + '@rollup/rollup-linux-powerpc64le-gnu': 4.45.0 + '@rollup/rollup-linux-riscv64-gnu': 4.45.0 + '@rollup/rollup-linux-riscv64-musl': 4.45.0 + '@rollup/rollup-linux-s390x-gnu': 4.45.0 + '@rollup/rollup-linux-x64-gnu': 4.45.0 + '@rollup/rollup-linux-x64-musl': 4.45.0 + '@rollup/rollup-win32-arm64-msvc': 4.45.0 + '@rollup/rollup-win32-ia32-msvc': 4.45.0 + '@rollup/rollup-win32-x64-msvc': 4.45.0 fsevents: 2.3.3 rrweb-cssom@0.8.0: {} @@ -5467,33 +5605,34 @@ snapshots: es-errors: 1.3.0 es-object-atoms: 1.1.1 - sharp@0.34.2: + sharp@0.34.3: dependencies: color: 4.2.3 detect-libc: 2.0.4 semver: 7.7.2 optionalDependencies: - '@img/sharp-darwin-arm64': 0.34.2 - '@img/sharp-darwin-x64': 0.34.2 - '@img/sharp-libvips-darwin-arm64': 1.1.0 - '@img/sharp-libvips-darwin-x64': 1.1.0 - '@img/sharp-libvips-linux-arm': 1.1.0 - '@img/sharp-libvips-linux-arm64': 1.1.0 - '@img/sharp-libvips-linux-ppc64': 1.1.0 - '@img/sharp-libvips-linux-s390x': 1.1.0 - '@img/sharp-libvips-linux-x64': 1.1.0 - '@img/sharp-libvips-linuxmusl-arm64': 1.1.0 - '@img/sharp-libvips-linuxmusl-x64': 1.1.0 - '@img/sharp-linux-arm': 0.34.2 - '@img/sharp-linux-arm64': 0.34.2 - '@img/sharp-linux-s390x': 0.34.2 - '@img/sharp-linux-x64': 0.34.2 - '@img/sharp-linuxmusl-arm64': 0.34.2 - '@img/sharp-linuxmusl-x64': 0.34.2 - '@img/sharp-wasm32': 0.34.2 - '@img/sharp-win32-arm64': 0.34.2 - '@img/sharp-win32-ia32': 0.34.2 - '@img/sharp-win32-x64': 0.34.2 + '@img/sharp-darwin-arm64': 0.34.3 + '@img/sharp-darwin-x64': 0.34.3 + '@img/sharp-libvips-darwin-arm64': 1.2.0 + '@img/sharp-libvips-darwin-x64': 1.2.0 + '@img/sharp-libvips-linux-arm': 1.2.0 + '@img/sharp-libvips-linux-arm64': 1.2.0 + '@img/sharp-libvips-linux-ppc64': 1.2.0 + '@img/sharp-libvips-linux-s390x': 1.2.0 + '@img/sharp-libvips-linux-x64': 1.2.0 + '@img/sharp-libvips-linuxmusl-arm64': 1.2.0 + '@img/sharp-libvips-linuxmusl-x64': 1.2.0 + '@img/sharp-linux-arm': 0.34.3 + '@img/sharp-linux-arm64': 0.34.3 + '@img/sharp-linux-ppc64': 0.34.3 + '@img/sharp-linux-s390x': 0.34.3 + '@img/sharp-linux-x64': 0.34.3 + '@img/sharp-linuxmusl-arm64': 0.34.3 + '@img/sharp-linuxmusl-x64': 0.34.3 + '@img/sharp-wasm32': 0.34.3 + '@img/sharp-win32-arm64': 0.34.3 + '@img/sharp-win32-ia32': 0.34.3 + '@img/sharp-win32-x64': 0.34.3 optional: true shebang-command@2.0.0: @@ -5779,29 +5918,29 @@ snapshots: undici-types@7.8.0: {} - unrs-resolver@1.11.0: + unrs-resolver@1.11.1: dependencies: napi-postinstall: 0.3.0 optionalDependencies: - '@unrs/resolver-binding-android-arm-eabi': 1.11.0 - '@unrs/resolver-binding-android-arm64': 1.11.0 - '@unrs/resolver-binding-darwin-arm64': 1.11.0 - '@unrs/resolver-binding-darwin-x64': 1.11.0 - '@unrs/resolver-binding-freebsd-x64': 1.11.0 - '@unrs/resolver-binding-linux-arm-gnueabihf': 1.11.0 - '@unrs/resolver-binding-linux-arm-musleabihf': 1.11.0 - '@unrs/resolver-binding-linux-arm64-gnu': 1.11.0 - '@unrs/resolver-binding-linux-arm64-musl': 1.11.0 - '@unrs/resolver-binding-linux-ppc64-gnu': 1.11.0 - '@unrs/resolver-binding-linux-riscv64-gnu': 1.11.0 - '@unrs/resolver-binding-linux-riscv64-musl': 1.11.0 - '@unrs/resolver-binding-linux-s390x-gnu': 1.11.0 - '@unrs/resolver-binding-linux-x64-gnu': 1.11.0 - '@unrs/resolver-binding-linux-x64-musl': 1.11.0 - '@unrs/resolver-binding-wasm32-wasi': 1.11.0 - '@unrs/resolver-binding-win32-arm64-msvc': 1.11.0 - '@unrs/resolver-binding-win32-ia32-msvc': 1.11.0 - '@unrs/resolver-binding-win32-x64-msvc': 1.11.0 + '@unrs/resolver-binding-android-arm-eabi': 1.11.1 + '@unrs/resolver-binding-android-arm64': 1.11.1 + '@unrs/resolver-binding-darwin-arm64': 1.11.1 + '@unrs/resolver-binding-darwin-x64': 1.11.1 + '@unrs/resolver-binding-freebsd-x64': 1.11.1 + '@unrs/resolver-binding-linux-arm-gnueabihf': 1.11.1 + '@unrs/resolver-binding-linux-arm-musleabihf': 1.11.1 + '@unrs/resolver-binding-linux-arm64-gnu': 1.11.1 + '@unrs/resolver-binding-linux-arm64-musl': 1.11.1 + '@unrs/resolver-binding-linux-ppc64-gnu': 1.11.1 + '@unrs/resolver-binding-linux-riscv64-gnu': 1.11.1 + '@unrs/resolver-binding-linux-riscv64-musl': 1.11.1 + '@unrs/resolver-binding-linux-s390x-gnu': 1.11.1 + '@unrs/resolver-binding-linux-x64-gnu': 1.11.1 + '@unrs/resolver-binding-linux-x64-musl': 1.11.1 + '@unrs/resolver-binding-wasm32-wasi': 1.11.1 + '@unrs/resolver-binding-win32-arm64-msvc': 1.11.1 + '@unrs/resolver-binding-win32-ia32-msvc': 1.11.1 + '@unrs/resolver-binding-win32-x64-msvc': 1.11.1 update-browserslist-db@1.1.3(browserslist@4.25.1): dependencies: @@ -5815,15 +5954,16 @@ snapshots: vary@1.1.2: {} - vite-node@3.2.4(@types/node@24.0.10)(lightningcss@1.30.1): + vite-node@3.2.4(@types/node@24.0.13)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0): dependencies: cac: 6.7.14 debug: 4.4.1 es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 5.4.19(@types/node@24.0.10)(lightningcss@1.30.1) + vite: 7.0.4(@types/node@24.0.13)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0) transitivePeerDependencies: - '@types/node' + - jiti - less - lightningcss - sass @@ -5832,28 +5972,35 @@ snapshots: - sugarss - supports-color - terser + - tsx + - yaml - vite@5.4.19(@types/node@24.0.10)(lightningcss@1.30.1): + vite@7.0.4(@types/node@24.0.13)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0): dependencies: - esbuild: 0.21.5 + esbuild: 0.25.6 + fdir: 6.4.6(picomatch@4.0.2) + picomatch: 4.0.2 postcss: 8.5.6 - rollup: 4.44.2 + rollup: 4.45.0 + tinyglobby: 0.2.14 optionalDependencies: - '@types/node': 24.0.10 + '@types/node': 24.0.13 fsevents: 2.3.3 + jiti: 2.4.2 lightningcss: 1.30.1 + yaml: 2.8.0 - vitest@3.2.4(@types/node@24.0.10)(jsdom@26.1.0)(lightningcss@1.30.1): + vitest@3.2.4(@types/node@24.0.13)(jiti@2.4.2)(jsdom@26.1.0)(lightningcss@1.30.1)(yaml@2.8.0): dependencies: '@types/chai': 5.2.2 '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@5.4.19(@types/node@24.0.10)(lightningcss@1.30.1)) + '@vitest/mocker': 3.2.4(vite@7.0.4(@types/node@24.0.13)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0)) '@vitest/pretty-format': 3.2.4 '@vitest/runner': 3.2.4 '@vitest/snapshot': 3.2.4 '@vitest/spy': 3.2.4 '@vitest/utils': 3.2.4 - chai: 5.2.0 + chai: 5.2.1 debug: 4.4.1 expect-type: 1.2.2 magic-string: 0.30.17 @@ -5865,13 +6012,14 @@ snapshots: tinyglobby: 0.2.14 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 5.4.19(@types/node@24.0.10)(lightningcss@1.30.1) - vite-node: 3.2.4(@types/node@24.0.10)(lightningcss@1.30.1) + vite: 7.0.4(@types/node@24.0.13)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0) + vite-node: 3.2.4(@types/node@24.0.13)(jiti@2.4.2)(lightningcss@1.30.1)(yaml@2.8.0) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 24.0.10 + '@types/node': 24.0.13 jsdom: 26.1.0 transitivePeerDependencies: + - jiti - less - lightningcss - msw @@ -5881,6 +6029,8 @@ snapshots: - sugarss - supports-color - terser + - tsx + - yaml w3c-xmlserializer@5.0.0: dependencies: @@ -5969,4 +6119,4 @@ snapshots: yocto-queue@0.1.0: {} - zod@3.25.75: {} + zod@3.25.76: {} diff --git a/postcss.config.mjs b/postcss.config.mjs index a943082..c7bcb4b 100644 --- a/postcss.config.mjs +++ b/postcss.config.mjs @@ -1,7 +1,5 @@ -/** @type {import('postcss-load-config').Config} */ const config = { - plugins: { "@tailwindcss/postcss": {}, - }, + plugins: ["@tailwindcss/postcss"], }; export default config; diff --git a/src/app/CourseList.tsx b/src/app/CourseList.tsx index aab5ee9..7aec5fd 100644 --- a/src/app/CourseList.tsx +++ b/src/app/CourseList.tsx @@ -34,11 +34,11 @@ function getTermName(startDate: string) { } export default function CourseList() { - const [allSettings] = useLocalCoursesSettingsQuery(); + const { data: allSettings } = useLocalCoursesSettingsQuery(); const coursesByStartDate = groupByStartDate(allSettings); - const sortedDates = Object.keys(coursesByStartDate).sort() + const sortedDates = Object.keys(coursesByStartDate).sort(); return (
diff --git a/src/app/MyToaster.tsx b/src/app/MyToaster.tsx index 9038a29..fb58d3e 100644 --- a/src/app/MyToaster.tsx +++ b/src/app/MyToaster.tsx @@ -1,10 +1,8 @@ "use client"; import React from "react"; -import { Toaster, ToastBar, useToaster } from "react-hot-toast"; +import { Toaster } from "react-hot-toast"; export const MyToaster = () => { - const { toasts, handlers } = useToaster({ duration: Infinity }); - const { startPause, endPause } = handlers; return ( // diff --git a/src/app/api/canvas/[...rest]/route.ts b/src/app/api/canvas/[...rest]/route.ts index 083efd4..353c4ca 100644 --- a/src/app/api/canvas/[...rest]/route.ts +++ b/src/app/api/canvas/[...rest]/route.ts @@ -17,9 +17,10 @@ const getUrl = (params: { rest: string[] }, req: NextRequest) => { appendQueryParams(url, req); - return url;`` + return url; }; +// eslint-disable-next-line @typescript-eslint/no-explicit-any const proxyResponseHeaders = (response: any) => { const headers = new Headers(); Object.entries(response.headers).forEach(([key, value]) => { @@ -39,6 +40,7 @@ export async function GET( const response = await axiosClient.get(url.toString()); const headers = proxyResponseHeaders(response); return NextResponse.json(response.data, { headers }); + // eslint-disable-next-line @typescript-eslint/no-explicit-any } catch (error: any) { console.log("canvas get error", error, error?.message); return NextResponse.json( @@ -61,6 +63,7 @@ export async function POST( const headers = proxyResponseHeaders(response); return new NextResponse(JSON.stringify(response.data), { headers }); + // eslint-disable-next-line @typescript-eslint/no-explicit-any } catch (error: any) { if (isAxiosError(error)) { console.log(url.toString(), body); @@ -89,6 +92,7 @@ export async function PUT( const headers = proxyResponseHeaders(response); return new NextResponse(JSON.stringify(response.data), { headers }); + // eslint-disable-next-line @typescript-eslint/no-explicit-any } catch (error: any) { if (isAxiosError(error)) { console.log(url.toString(), body); @@ -123,6 +127,7 @@ export async function DELETE( const headers = proxyResponseHeaders(response); return new NextResponse(JSON.stringify(response.data), { headers }); + // eslint-disable-next-line @typescript-eslint/no-explicit-any } catch (error: any) { return new NextResponse( JSON.stringify({ diff --git a/src/app/course/[courseName]/CourseNavigation.tsx b/src/app/course/[courseName]/CourseNavigation.tsx index e421aff..8914da7 100644 --- a/src/app/course/[courseName]/CourseNavigation.tsx +++ b/src/app/course/[courseName]/CourseNavigation.tsx @@ -22,7 +22,7 @@ import { useQueryClient } from "@tanstack/react-query"; import Link from "next/link"; export function CourseNavigation() { - const [settings] = useLocalCourseSettingsQuery(); + const { data: settings } = useLocalCourseSettingsQuery(); const queryClient = useQueryClient(); const canvasAssignmentsQuery = useCanvasAssignmentsQuery(); diff --git a/src/app/course/[courseName]/CourseSettingsLink.tsx b/src/app/course/[courseName]/CourseSettingsLink.tsx index c18d319..453480c 100644 --- a/src/app/course/[courseName]/CourseSettingsLink.tsx +++ b/src/app/course/[courseName]/CourseSettingsLink.tsx @@ -7,7 +7,7 @@ import { getCourseSettingsUrl } from "@/services/urlUtils"; export default function CourseSettingsLink() { const { courseName } = useCourseContext(); - const [settings] = useLocalCourseSettingsQuery(); + const { data: settings } = useLocalCourseSettingsQuery(); return (
{settings.name} diff --git a/src/app/course/[courseName]/calendar/CalendarMonth.tsx b/src/app/course/[courseName]/calendar/CalendarMonth.tsx index e2e08da..866ac01 100644 --- a/src/app/course/[courseName]/calendar/CalendarMonth.tsx +++ b/src/app/course/[courseName]/calendar/CalendarMonth.tsx @@ -11,7 +11,7 @@ import DownChevron from "@/components/icons/DownChevron"; export const CalendarMonth = ({ month }: { month: CalendarMonthModel }) => { // const weekInMilliseconds = 604_800_000; const four_days_in_milliseconds = 345_600_000; - const [settings] = useLocalCourseSettingsQuery(); + const { data: settings } = useLocalCourseSettingsQuery(); const startDate = getDateFromStringOrThrow( settings.startDate, "week calculation start date" @@ -50,7 +50,9 @@ export const CalendarMonth = ({ month }: { month: CalendarMonthModel }) => { role="button" > {monthName} -
{isExpanded ? : }
+
+ {isExpanded ? : } +
)} diff --git a/src/app/course/[courseName]/calendar/CalendarWeek.tsx b/src/app/course/[courseName]/calendar/CalendarWeek.tsx index 0cc0ecd..29a2cd3 100644 --- a/src/app/course/[courseName]/calendar/CalendarWeek.tsx +++ b/src/app/course/[courseName]/calendar/CalendarWeek.tsx @@ -11,7 +11,7 @@ export function CalendarWeek({ week: string[]; //date strings monthNumber: number; }) { - const [settings]= useLocalCourseSettingsQuery(); + const { data: settings } = useLocalCourseSettingsQuery(); const startDate = getDateFromStringOrThrow( settings.startDate, "week calculation start date" diff --git a/src/app/course/[courseName]/calendar/CourseCalendar.tsx b/src/app/course/[courseName]/calendar/CourseCalendar.tsx index c12a67f..5a230b1 100644 --- a/src/app/course/[courseName]/calendar/CourseCalendar.tsx +++ b/src/app/course/[courseName]/calendar/CourseCalendar.tsx @@ -5,10 +5,9 @@ import { CalendarMonth } from "./CalendarMonth"; import { useLocalCourseSettingsQuery } from "@/hooks/localCourse/localCoursesHooks"; import { useEffect, useMemo, useRef } from "react"; import CalendarItemsContextProvider from "../context/CalendarItemsContextProvider"; -import { SuspenseAndErrorHandling } from "@/components/SuspenseAndErrorHandling"; export default function CourseCalendar() { - const [settings] = useLocalCourseSettingsQuery(); + const { data: settings } = useLocalCourseSettingsQuery(); const startDateTime = useMemo( () => getDateFromStringOrThrow(settings.startDate, "course start date"), diff --git a/src/app/course/[courseName]/calendar/day/Day.tsx b/src/app/course/[courseName]/calendar/day/Day.tsx index 8cf2161..bd2dcc6 100644 --- a/src/app/course/[courseName]/calendar/day/Day.tsx +++ b/src/app/course/[courseName]/calendar/day/Day.tsx @@ -19,7 +19,7 @@ export default function Day({ day, month }: { day: string; month: number }) { getDateOnlyMarkdownString(new Date()) === getDateOnlyMarkdownString(dayAsDate); - const [settings] = useLocalCourseSettingsQuery(); + const { data: settings } = useLocalCourseSettingsQuery(); const { itemDropOnDay } = useDraggingContext(); const { todaysAssignments, todaysQuizzes, todaysPages } = useTodaysItems(day); diff --git a/src/app/course/[courseName]/calendar/day/DayTitle.tsx b/src/app/course/[courseName]/calendar/day/DayTitle.tsx index 0c7a7ef..cabf522 100644 --- a/src/app/course/[courseName]/calendar/day/DayTitle.tsx +++ b/src/app/course/[courseName]/calendar/day/DayTitle.tsx @@ -13,7 +13,7 @@ import { useRef, useState } from "react"; export function DayTitle({ day, dayAsDate }: { day: string; dayAsDate: Date }) { const { courseName } = useCourseContext(); - const [weeks] = useLecturesSuspenseQuery(); + const { data: weeks } = useLecturesSuspenseQuery(); const { setIsDragging } = useDragStyleContext(); const todaysLecture = getLectureForDay(weeks, dayAsDate); const modal = useModal(); diff --git a/src/app/course/[courseName]/calendar/day/getStatus.tsx b/src/app/course/[courseName]/calendar/day/getStatus.tsx index 2b984e6..7fbaf8f 100644 --- a/src/app/course/[courseName]/calendar/day/getStatus.tsx +++ b/src/app/course/[courseName]/calendar/day/getStatus.tsx @@ -35,7 +35,6 @@ export const getStatus = ({ if (type === "page") { const canvasPage = canvasItem as CanvasPage; - const page = item as LocalCoursePage; if (!canvasPage.published) return { status: "incomplete", message: "canvas page not published" }; diff --git a/src/app/course/[courseName]/calendar/day/useTodaysItems.tsx b/src/app/course/[courseName]/calendar/day/useTodaysItems.tsx index 0f2c2a6..bba42b9 100644 --- a/src/app/course/[courseName]/calendar/day/useTodaysItems.tsx +++ b/src/app/course/[courseName]/calendar/day/useTodaysItems.tsx @@ -15,7 +15,7 @@ import { getStatus } from "./getStatus"; import { useLocalCourseSettingsQuery } from "@/hooks/localCourse/localCoursesHooks"; export function useTodaysItems(day: string) { - const [settings] = useLocalCourseSettingsQuery(); + const { data: settings } = useLocalCourseSettingsQuery(); const dayAsDate = getDateFromStringOrThrow( day, "calculating same month in day items" diff --git a/src/app/course/[courseName]/context/drag/useItemDropOnDay.ts b/src/app/course/[courseName]/context/drag/useItemDropOnDay.ts index a50adf6..061bfe3 100644 --- a/src/app/course/[courseName]/context/drag/useItemDropOnDay.ts +++ b/src/app/course/[courseName]/context/drag/useItemDropOnDay.ts @@ -35,10 +35,9 @@ export function useItemDropOnDay({ setIsLoading: Dispatch>; modal: { isOpen: boolean; openModal: () => void; closeModal: () => void }; }) { - const [settings] = useLocalCourseSettingsQuery(); + const { data: settings } = useLocalCourseSettingsQuery(); const { courseName } = useCourseContext(); - // const { data: weeks } = useLecturesByWeekQuery(); - const [weeks] = useLecturesSuspenseQuery(); + const { data: weeks } = useLecturesSuspenseQuery(); const updateQuizMutation = useUpdateQuizMutation(); const updateLectureMutation = useLectureUpdateMutation(); const updateAssignmentMutation = useUpdateAssignmentMutation(); @@ -72,7 +71,7 @@ export function useItemDropOnDay({ return dayAsDate; } function updateLecture(dayAsDate: Date) { - const { dueAt, ...lecture } = itemBeingDragged.item as Lecture & { + const { dueAt: _, ...lecture } = itemBeingDragged.item as Lecture & { dueAt: string; }; console.log("dropped lecture on day"); diff --git a/src/app/course/[courseName]/lecture/[lectureDay]/EditLecture.tsx b/src/app/course/[courseName]/lecture/[lectureDay]/EditLecture.tsx index d06622c..3061e53 100644 --- a/src/app/course/[courseName]/lecture/[lectureDay]/EditLecture.tsx +++ b/src/app/course/[courseName]/lecture/[lectureDay]/EditLecture.tsx @@ -19,9 +19,12 @@ import { useAuthoritativeUpdates } from "../../utils/useAuthoritativeUpdates"; export default function EditLecture({ lectureDay }: { lectureDay: string }) { const { courseName } = useCourseContext(); - const [settings] = useLocalCourseSettingsQuery(); - const [weeks, { dataUpdatedAt: serverDataUpdatedAt, isFetching }] = - useLecturesSuspenseQuery(); + const { data: settings } = useLocalCourseSettingsQuery(); + const { + data: weeks, + dataUpdatedAt: serverDataUpdatedAt, + isFetching, + } = useLecturesSuspenseQuery(); const updateLecture = useLectureUpdateMutation(); const lecture = weeks @@ -63,6 +66,7 @@ export default function EditLecture({ lectureDay }: { lectureDay: string }) { } } setError(""); + // eslint-disable-next-line @typescript-eslint/no-explicit-any } catch (e: any) { setError(e.toString()); } diff --git a/src/app/course/[courseName]/lecture/[lectureDay]/EditLectureTitle.tsx b/src/app/course/[courseName]/lecture/[lectureDay]/EditLectureTitle.tsx index b6d482a..dc0286e 100644 --- a/src/app/course/[courseName]/lecture/[lectureDay]/EditLectureTitle.tsx +++ b/src/app/course/[courseName]/lecture/[lectureDay]/EditLectureTitle.tsx @@ -11,7 +11,7 @@ export default function EditLectureTitle({ }: { lectureDay: string; }) { - const [settings] = useLocalCourseSettingsQuery(); + const { data: settings } = useLocalCourseSettingsQuery(); const { courseName } = useCourseContext(); const lectureDate = getDateFromString(lectureDay); const lectureWeekName = getLectureWeekName(settings.startDate, lectureDay); diff --git a/src/app/course/[courseName]/lecture/[lectureDay]/LectureButtons.tsx b/src/app/course/[courseName]/lecture/[lectureDay]/LectureButtons.tsx index be7b046..5438ecc 100644 --- a/src/app/course/[courseName]/lecture/[lectureDay]/LectureButtons.tsx +++ b/src/app/course/[courseName]/lecture/[lectureDay]/LectureButtons.tsx @@ -12,7 +12,7 @@ import Link from "next/link"; export default function LectureButtons({ lectureDay }: { lectureDay: string }) { const { courseName } = useCourseContext(); - const [settings] = useLocalCourseSettingsQuery(); + const { data: settings } = useLocalCourseSettingsQuery(); const router = useRouter(); const [isLoading, setIsLoading] = useState(false); const modal = useModal(); diff --git a/src/app/course/[courseName]/lecture/[lectureDay]/LecturePreview.tsx b/src/app/course/[courseName]/lecture/[lectureDay]/LecturePreview.tsx index 7874662..76c14cf 100644 --- a/src/app/course/[courseName]/lecture/[lectureDay]/LecturePreview.tsx +++ b/src/app/course/[courseName]/lecture/[lectureDay]/LecturePreview.tsx @@ -1,11 +1,7 @@ import MarkdownDisplay from "@/components/MarkdownDisplay"; -import { SuspenseAndErrorHandling } from "@/components/SuspenseAndErrorHandling"; -import { useLocalCourseSettingsQuery } from "@/hooks/localCourse/localCoursesHooks"; import { Lecture } from "@/models/local/lecture"; -import { markdownToHTMLSafe } from "@/services/htmlMarkdownUtils"; export default function LecturePreview({ lecture }: { lecture: Lecture }) { - const [settings] = useLocalCourseSettingsQuery(); return ( <>
diff --git a/src/app/course/[courseName]/lecture/[lectureDay]/layout.tsx b/src/app/course/[courseName]/lecture/[lectureDay]/layout.tsx index 956bc1f..52f6931 100644 --- a/src/app/course/[courseName]/lecture/[lectureDay]/layout.tsx +++ b/src/app/course/[courseName]/lecture/[lectureDay]/layout.tsx @@ -23,7 +23,7 @@ export default async function LectureLayout({ children: React.ReactNode; params: Promise<{ courseName: string; lectureDay: string }>; }) { - const { courseName, lectureDay } = await params; + const { courseName } = await params; const decodedCourseName = decodeURIComponent(courseName); if (courseName.includes(".js.map")) { console.log("cannot load course that is .js.map " + decodedCourseName); diff --git a/src/app/course/[courseName]/lecture/[lectureDay]/preview/LecturePreviewPage.tsx b/src/app/course/[courseName]/lecture/[lectureDay]/preview/LecturePreviewPage.tsx index 456ddd3..d21b7b8 100644 --- a/src/app/course/[courseName]/lecture/[lectureDay]/preview/LecturePreviewPage.tsx +++ b/src/app/course/[courseName]/lecture/[lectureDay]/preview/LecturePreviewPage.tsx @@ -12,7 +12,7 @@ export default function LecturePreviewPage({ lectureDay: string; }) { const { courseName } = useCourseContext(); - const [weeks] = useLecturesSuspenseQuery(); + const { data: weeks } = useLecturesSuspenseQuery(); const lecture = weeks .flatMap(({ lectures }) => lectures.map((lecture) => lecture)) .find((l) => l.date === lectureDay); diff --git a/src/app/course/[courseName]/modules/ExpandableModule.tsx b/src/app/course/[courseName]/modules/ExpandableModule.tsx index 6a0256b..a9277e4 100644 --- a/src/app/course/[courseName]/modules/ExpandableModule.tsx +++ b/src/app/course/[courseName]/modules/ExpandableModule.tsx @@ -32,15 +32,15 @@ export default function ExpandableModule({ }) { const { itemDropOnModule } = useDraggingContext(); const { courseName } = useCourseContext(); - const [assignmentNames] = useAssignmentNamesQuery(moduleName); + const { data: assignmentNames } = useAssignmentNamesQuery(moduleName); const [assignments] = trpc.useSuspenseQueries((t) => assignmentNames.map((assignmentName) => t.assignment.getAssignment({ courseName, moduleName, assignmentName }) ) ); - const [quizzes] = useQuizzesQueries(moduleName); - const [pages] = usePagesQueries(moduleName); + const { data: quizzes } = useQuizzesQueries(moduleName); + const { data: pages } = usePagesQueries(moduleName); const modal = useModal(); const moduleItems: { diff --git a/src/app/course/[courseName]/modules/ModuleList.tsx b/src/app/course/[courseName]/modules/ModuleList.tsx index f3ed202..f7b7c15 100644 --- a/src/app/course/[courseName]/modules/ModuleList.tsx +++ b/src/app/course/[courseName]/modules/ModuleList.tsx @@ -4,7 +4,7 @@ import ExpandableModule from "./ExpandableModule"; import CreateModule from "./CreateModule"; export default function ModuleList() { - const [moduleNames] = useModuleNamesQuery(); + const { data: moduleNames } = useModuleNamesQuery(); return (
{moduleNames.map((m) => ( diff --git a/src/app/course/[courseName]/modules/NewItemForm.tsx b/src/app/course/[courseName]/modules/NewItemForm.tsx index 1cf05de..247c768 100644 --- a/src/app/course/[courseName]/modules/NewItemForm.tsx +++ b/src/app/course/[courseName]/modules/NewItemForm.tsx @@ -27,9 +27,9 @@ export default function NewItemForm({ creationDate?: string; onCreate?: () => void; }) { - const [settings] = useLocalCourseSettingsQuery(); + const { data: settings } = useLocalCourseSettingsQuery(); const { courseName } = useCourseContext(); - const [modules] = useModuleNamesQuery(); + const { data: modules } = useModuleNamesQuery(); const [type, setType] = useState<"Assignment" | "Quiz" | "Page">( "Assignment" ); diff --git a/src/app/course/[courseName]/modules/[moduleName]/assignment/[assignmentName]/AssignmentFooterButtons.tsx b/src/app/course/[courseName]/modules/[moduleName]/assignment/[assignmentName]/AssignmentFooterButtons.tsx index ceb3a09..b3f5417 100644 --- a/src/app/course/[courseName]/modules/[moduleName]/assignment/[assignmentName]/AssignmentFooterButtons.tsx +++ b/src/app/course/[courseName]/modules/[moduleName]/assignment/[assignmentName]/AssignmentFooterButtons.tsx @@ -29,10 +29,10 @@ export function AssignmentFooterButtons({ }) { const router = useRouter(); const { courseName } = useCourseContext(); - const [settings] = useLocalCourseSettingsQuery(); + const { data: settings } = useLocalCourseSettingsQuery(); const { data: canvasAssignments, isFetching: canvasIsFetching } = useCanvasAssignmentsQuery(); - const [assignment, { isFetching }] = useAssignmentQuery( + const { data: assignment, isFetching } = useAssignmentQuery( moduleName, assignmentName ); diff --git a/src/app/course/[courseName]/modules/[moduleName]/assignment/[assignmentName]/AssignmentPreview.tsx b/src/app/course/[courseName]/modules/[moduleName]/assignment/[assignmentName]/AssignmentPreview.tsx index a0338fe..38a7b04 100644 --- a/src/app/course/[courseName]/modules/[moduleName]/assignment/[assignmentName]/AssignmentPreview.tsx +++ b/src/app/course/[courseName]/modules/[moduleName]/assignment/[assignmentName]/AssignmentPreview.tsx @@ -1,11 +1,7 @@ -import ClientOnly from "@/components/ClientOnly"; import MarkdownDisplay from "@/components/MarkdownDisplay"; -import { SuspenseAndErrorHandling } from "@/components/SuspenseAndErrorHandling"; -import { useLocalCourseSettingsQuery } from "@/hooks/localCourse/localCoursesHooks"; import { LocalAssignment } from "@/models/local/assignment/localAssignment"; import { rubricItemIsExtraCredit } from "@/models/local/assignment/rubricItem"; import { assignmentPoints } from "@/models/local/assignment/utils/assignmentPointsUtils"; -import { markdownToHTMLSafe } from "@/services/htmlMarkdownUtils"; import React, { Fragment } from "react"; export default function AssignmentPreview({ @@ -13,8 +9,7 @@ export default function AssignmentPreview({ }: { assignment: LocalAssignment; }) { - const [settings] = useLocalCourseSettingsQuery(); - const totalPoints = assignmentPoints(assignment.rubric) + const totalPoints = assignmentPoints(assignment.rubric); const extraPoints = assignment.rubric.reduce( (sum, cur) => (rubricItemIsExtraCredit(cur) ? sum + cur.points : sum), 0 diff --git a/src/app/course/[courseName]/modules/[moduleName]/assignment/[assignmentName]/EditAssignment.tsx b/src/app/course/[courseName]/modules/[moduleName]/assignment/[assignmentName]/EditAssignment.tsx index ee7a8b1..ac7e7a5 100644 --- a/src/app/course/[courseName]/modules/[moduleName]/assignment/[assignmentName]/EditAssignment.tsx +++ b/src/app/course/[courseName]/modules/[moduleName]/assignment/[assignmentName]/EditAssignment.tsx @@ -31,11 +31,12 @@ export default function EditAssignment({ }) { const router = useRouter(); const { courseName } = useCourseContext(); - const [settings] = useLocalCourseSettingsQuery(); - const [ - assignment, - { dataUpdatedAt: serverDataUpdatedAt, isFetching: assignmentIsFetching }, - ] = useAssignmentQuery(moduleName, assignmentName); + const { data: settings } = useLocalCourseSettingsQuery(); + const { + data: assignment, + dataUpdatedAt: serverDataUpdatedAt, + isFetching: assignmentIsFetching, + } = useAssignmentQuery(moduleName, assignmentName); const updateAssignment = useUpdateAssignmentMutation(); const { isPending: imageUpdateIsPending } = useUpdateImageSettingsForAssignment({ moduleName, assignmentName }); @@ -94,6 +95,7 @@ export default function EditAssignment({ } } setError(""); + // eslint-disable-next-line @typescript-eslint/no-explicit-any } catch (e: any) { setError(e.toString()); } diff --git a/src/app/course/[courseName]/modules/[moduleName]/assignment/[assignmentName]/UpdateAssignmentName.tsx b/src/app/course/[courseName]/modules/[moduleName]/assignment/[assignmentName]/UpdateAssignmentName.tsx index f9d52de..fb326c3 100644 --- a/src/app/course/[courseName]/modules/[moduleName]/assignment/[assignmentName]/UpdateAssignmentName.tsx +++ b/src/app/course/[courseName]/modules/[moduleName]/assignment/[assignmentName]/UpdateAssignmentName.tsx @@ -20,11 +20,11 @@ export function UpdateAssignmentName({ const modal = useModal(); const { courseName } = useCourseContext(); const router = useRouter(); - const [assignment] = useAssignmentQuery(moduleName, assignmentName); + const { data: assignment } = useAssignmentQuery(moduleName, assignmentName); const updateAssignment = useUpdateAssignmentMutation(); const [name, setName] = useState(assignment.name); const [isLoading, setIsLoading] = useState(false); - + return (
{ const delay = 500; @@ -85,6 +86,7 @@ export default function EditPage({ } } setError(""); + // eslint-disable-next-line @typescript-eslint/no-explicit-any } catch (e: any) { setError(e.toString()); } diff --git a/src/app/course/[courseName]/modules/[moduleName]/page/[pageName]/EditPageButtons.tsx b/src/app/course/[courseName]/modules/[moduleName]/page/[pageName]/EditPageButtons.tsx index 9541443..e65d017 100644 --- a/src/app/course/[courseName]/modules/[moduleName]/page/[pageName]/EditPageButtons.tsx +++ b/src/app/course/[courseName]/modules/[moduleName]/page/[pageName]/EditPageButtons.tsx @@ -27,8 +27,8 @@ export default function EditPageButtons({ }) { const router = useRouter(); const { courseName } = useCourseContext(); - const [settings] = useLocalCourseSettingsQuery(); - const [page] = usePageQuery(moduleName, pageName); + const { data: settings } = useLocalCourseSettingsQuery(); + const { data: page } = usePageQuery(moduleName, pageName); const { data: canvasPages } = useCanvasPagesQuery(); const createPageInCanvas = useCreateCanvasPageMutation(); const updatePageInCanvas = useUpdateCanvasPageMutation(); diff --git a/src/app/course/[courseName]/modules/[moduleName]/page/[pageName]/PagePreview.tsx b/src/app/course/[courseName]/modules/[moduleName]/page/[pageName]/PagePreview.tsx index f06b679..a0bed9d 100644 --- a/src/app/course/[courseName]/modules/[moduleName]/page/[pageName]/PagePreview.tsx +++ b/src/app/course/[courseName]/modules/[moduleName]/page/[pageName]/PagePreview.tsx @@ -1,7 +1,5 @@ import MarkdownDisplay from "@/components/MarkdownDisplay"; -import { useLocalCourseSettingsQuery } from "@/hooks/localCourse/localCoursesHooks"; import { LocalCoursePage } from "@/models/local/page/localCoursePage"; -import { markdownToHTMLSafe } from "@/services/htmlMarkdownUtils"; import React from "react"; export default function PagePreview({ page }: { page: LocalCoursePage }) { diff --git a/src/app/course/[courseName]/modules/[moduleName]/page/[pageName]/UpdatePageName.tsx b/src/app/course/[courseName]/modules/[moduleName]/page/[pageName]/UpdatePageName.tsx index 7d7deb4..15239ec 100644 --- a/src/app/course/[courseName]/modules/[moduleName]/page/[pageName]/UpdatePageName.tsx +++ b/src/app/course/[courseName]/modules/[moduleName]/page/[pageName]/UpdatePageName.tsx @@ -2,7 +2,10 @@ import { useCourseContext } from "@/app/course/[courseName]/context/courseContex import TextInput from "@/components/form/TextInput"; import Modal, { useModal } from "@/components/Modal"; import { Spinner } from "@/components/Spinner"; -import { usePageQuery, useUpdatePageMutation } from "@/hooks/localCourse/pageHooks"; +import { + usePageQuery, + useUpdatePageMutation, +} from "@/hooks/localCourse/pageHooks"; import { getModuleItemUrl } from "@/services/urlUtils"; import { useRouter } from "next/navigation"; import { useState } from "react"; @@ -17,11 +20,11 @@ export function UpdatePageName({ const modal = useModal(); const { courseName } = useCourseContext(); const router = useRouter(); - const [page] = usePageQuery(moduleName, pageName); + const { data: page } = usePageQuery(moduleName, pageName); const updatePage = useUpdatePageMutation(); const [name, setName] = useState(page.name); const [isLoading, setIsLoading] = useState(false); - + return (
- + {isLoading && } diff --git a/src/app/course/[courseName]/modules/[moduleName]/quiz/[quizName]/EditQuiz.tsx b/src/app/course/[courseName]/modules/[moduleName]/quiz/[quizName]/EditQuiz.tsx index cd87b2d..5a98876 100644 --- a/src/app/course/[courseName]/modules/[moduleName]/quiz/[quizName]/EditQuiz.tsx +++ b/src/app/course/[courseName]/modules/[moduleName]/quiz/[quizName]/EditQuiz.tsx @@ -75,10 +75,13 @@ export default function EditQuiz({ moduleName: string; }) { const router = useRouter(); - const [settings] = useLocalCourseSettingsQuery(); + const { data: settings } = useLocalCourseSettingsQuery(); const { courseName } = useCourseContext(); - const [quiz, { dataUpdatedAt: serverDataUpdatedAt, isFetching }] = - useQuizQuery(moduleName, quizName); + const { + data: quiz, + dataUpdatedAt: serverDataUpdatedAt, + isFetching, + } = useQuizQuery(moduleName, quizName); const updateQuizMutation = useUpdateQuizMutation(); const { clientIsAuthoritative, text, textUpdate, monacoKey } = useAuthoritativeUpdates({ @@ -122,6 +125,7 @@ export default function EditQuiz({ } } setError(""); + // eslint-disable-next-line @typescript-eslint/no-explicit-any } catch (e: any) { setError(e.toString()); } diff --git a/src/app/course/[courseName]/modules/[moduleName]/quiz/[quizName]/QuizButton.tsx b/src/app/course/[courseName]/modules/[moduleName]/quiz/[quizName]/QuizButton.tsx index 3b1a756..2f3bb66 100644 --- a/src/app/course/[courseName]/modules/[moduleName]/quiz/[quizName]/QuizButton.tsx +++ b/src/app/course/[courseName]/modules/[moduleName]/quiz/[quizName]/QuizButton.tsx @@ -27,10 +27,10 @@ export function QuizButtons({ }) { const router = useRouter(); const { courseName } = useCourseContext(); - const [settings] = useLocalCourseSettingsQuery(); + const { data: settings } = useLocalCourseSettingsQuery(); const { data: canvasQuizzes } = useCanvasQuizzesQuery(); - const [quiz] = useQuizQuery(moduleName, quizName); + const { data: quiz } = useQuizQuery(moduleName, quizName); const addToCanvas = useAddQuizToCanvasMutation(); const deleteFromCanvas = useDeleteQuizFromCanvasMutation(); const deleteLocal = useDeleteQuizMutation(); @@ -90,7 +90,11 @@ export function QuizButtons({
{isLoading && } diff --git a/src/app/course/[courseName]/page.tsx b/src/app/course/[courseName]/page.tsx index b1492d8..9c1aaa4 100644 --- a/src/app/course/[courseName]/page.tsx +++ b/src/app/course/[courseName]/page.tsx @@ -5,7 +5,7 @@ import { DragStyleContextProvider } from "./context/drag/dragStyleContext"; import CollapsableSidebar from "./CollapsableSidebar"; -export default async function CoursePage({}: {}) { +export default async function CoursePage() { return ( <>
diff --git a/src/app/course/[courseName]/settings/AssignmentGroupManagement.tsx b/src/app/course/[courseName]/settings/AssignmentGroupManagement.tsx index f0023cb..3aeeb3e 100644 --- a/src/app/course/[courseName]/settings/AssignmentGroupManagement.tsx +++ b/src/app/course/[courseName]/settings/AssignmentGroupManagement.tsx @@ -14,7 +14,7 @@ import { baseCanvasUrl } from "@/services/canvas/canvasServiceUtils"; import MeatballIcon from "./MeatballIcon"; export default function AssignmentGroupManagement() { - const [settings, { isPending }] = useLocalCourseSettingsQuery(); + const { data: settings, isPending } = useLocalCourseSettingsQuery(); const updateSettings = useUpdateLocalCourseSettingsMutation(); const applyInCanvas = useSetAssignmentGroupsMutation(settings.canvasId); diff --git a/src/app/course/[courseName]/settings/DaysOfWeekSettings.tsx b/src/app/course/[courseName]/settings/DaysOfWeekSettings.tsx index 1a71b2d..959f059 100644 --- a/src/app/course/[courseName]/settings/DaysOfWeekSettings.tsx +++ b/src/app/course/[courseName]/settings/DaysOfWeekSettings.tsx @@ -8,7 +8,7 @@ import { import React from "react"; export default function DaysOfWeekSettings() { - const [settings] = useLocalCourseSettingsQuery(); + const { data: settings } = useLocalCourseSettingsQuery(); const updateSettings = useUpdateLocalCourseSettingsMutation(); return ( diff --git a/src/app/course/[courseName]/settings/DefaultDueTime.tsx b/src/app/course/[courseName]/settings/DefaultDueTime.tsx index 92e79be..40bebba 100644 --- a/src/app/course/[courseName]/settings/DefaultDueTime.tsx +++ b/src/app/course/[courseName]/settings/DefaultDueTime.tsx @@ -10,7 +10,7 @@ import DefaultLockOffset from "./DefaultLockOffset"; import { settingsBox } from "./sharedSettings"; export default function DefaultDueTime() { - const [settings] = useLocalCourseSettingsQuery(); + const { data: settings } = useLocalCourseSettingsQuery(); const updateSettings = useUpdateLocalCourseSettingsMutation(); const [haveLockOffset, setHaveLockOffset] = useState( typeof settings.defaultLockHoursOffset !== "undefined" diff --git a/src/app/course/[courseName]/settings/DefaultFileUploadTypes.tsx b/src/app/course/[courseName]/settings/DefaultFileUploadTypes.tsx index 52b4476..5ce7f21 100644 --- a/src/app/course/[courseName]/settings/DefaultFileUploadTypes.tsx +++ b/src/app/course/[courseName]/settings/DefaultFileUploadTypes.tsx @@ -8,7 +8,7 @@ import { useState, useEffect } from "react"; import { settingsBox } from "./sharedSettings"; export default function DefaultFileUploadTypes() { - const [settings] = useLocalCourseSettingsQuery(); + const { data: settings } = useLocalCourseSettingsQuery(); const [defaultFileUploadTypes, setDefaultFileUploadTypes] = useState< string[] >(settings.defaultFileUploadTypes); diff --git a/src/app/course/[courseName]/settings/DefaultLockOffset.tsx b/src/app/course/[courseName]/settings/DefaultLockOffset.tsx index cfa3ebf..a2d009f 100644 --- a/src/app/course/[courseName]/settings/DefaultLockOffset.tsx +++ b/src/app/course/[courseName]/settings/DefaultLockOffset.tsx @@ -8,7 +8,7 @@ import { import { useEffect, useState } from "react"; export default function DefaultLockOffset() { - const [settings] = useLocalCourseSettingsQuery(); + const { data: settings } = useLocalCourseSettingsQuery(); const updateSettings = useUpdateLocalCourseSettingsMutation(); const [hoursOffset, setHoursOffset] = useState( settings.defaultLockHoursOffset?.toString() ?? "0" diff --git a/src/app/course/[courseName]/settings/GithubClassroomList.tsx b/src/app/course/[courseName]/settings/GithubClassroomList.tsx index 86aeec5..800d830 100644 --- a/src/app/course/[courseName]/settings/GithubClassroomList.tsx +++ b/src/app/course/[courseName]/settings/GithubClassroomList.tsx @@ -5,7 +5,7 @@ import { useCourseStudentsQuery } from "@/hooks/canvas/canvasCourseHooks"; import { Spinner } from "@/components/Spinner"; export default function GithubClassroomList() { - const [settings] = useLocalCourseSettingsQuery(); + const { data: settings } = useLocalCourseSettingsQuery(); const enrollmentsQuery = useCourseStudentsQuery(settings.canvasId); if (enrollmentsQuery.isLoading) diff --git a/src/app/course/[courseName]/settings/HolidayConfig.tsx b/src/app/course/[courseName]/settings/HolidayConfig.tsx index 3bf6e0f..a99a2a9 100644 --- a/src/app/course/[courseName]/settings/HolidayConfig.tsx +++ b/src/app/course/[courseName]/settings/HolidayConfig.tsx @@ -33,8 +33,12 @@ export const holidaysAreEqual = ( ): boolean => { if (holidays1.length !== holidays2.length) return false; - const sortedObj1 = [...holidays1].sort((a, b) => a.name.localeCompare(b.name)); - const sortedObj2 = [...holidays2].sort((a, b) => a.name.localeCompare(b.name)); + const sortedObj1 = [...holidays1].sort((a, b) => + a.name.localeCompare(b.name) + ); + const sortedObj2 = [...holidays2].sort((a, b) => + a.name.localeCompare(b.name) + ); for (let i = 0; i < sortedObj1.length; i++) { const holiday1 = sortedObj1[i]; @@ -63,7 +67,7 @@ export default function HolidayConfig() { ); } function InnerHolidayConfig() { - const [settings] = useLocalCourseSettingsQuery(); + const { data: settings } = useLocalCourseSettingsQuery(); const updateSettings = useUpdateLocalCourseSettingsMutation(); const [rawText, setRawText] = useState(holidaysToString(settings.holidays)); @@ -83,7 +87,7 @@ function InnerHolidayConfig() { }, }); } - } catch (error: any) {} + } catch {} }, 500); return () => clearTimeout(id); }, [rawText, settings.holidays, settings, updateSettings]); @@ -127,7 +131,7 @@ function ParsedHolidaysDisplay({ value }: { value: string }) { const parsed = parseHolidays(value); setParsedHolidays(parsed); setError(""); - } catch (error: any) { + } catch (error) { setError(error + ""); } }, [value]); diff --git a/src/app/course/[courseName]/settings/SettingsHeader.tsx b/src/app/course/[courseName]/settings/SettingsHeader.tsx index 23dc0f6..9550e21 100644 --- a/src/app/course/[courseName]/settings/SettingsHeader.tsx +++ b/src/app/course/[courseName]/settings/SettingsHeader.tsx @@ -7,7 +7,7 @@ import { useCourseContext } from "../context/courseContext"; export default function SettingsHeader() { const { courseName } = useCourseContext(); - const [settings] = useLocalCourseSettingsQuery(); + const { data: settings } = useLocalCourseSettingsQuery(); return ( <>
diff --git a/src/app/course/[courseName]/settings/StartAndEndDate.tsx b/src/app/course/[courseName]/settings/StartAndEndDate.tsx index 6791aef..c84869e 100644 --- a/src/app/course/[courseName]/settings/StartAndEndDate.tsx +++ b/src/app/course/[courseName]/settings/StartAndEndDate.tsx @@ -5,7 +5,7 @@ import React from "react"; import { settingsBox } from "./sharedSettings"; export default function StartAndEndDate() { - const [settings] = useLocalCourseSettingsQuery(); + const { data: settings } = useLocalCourseSettingsQuery(); const startDate = new Date(settings.startDate); const endDate = new Date(settings.endDate); return ( diff --git a/src/app/course/[courseName]/settings/SubmissionDefaults.tsx b/src/app/course/[courseName]/settings/SubmissionDefaults.tsx index a7f6293..2c75c71 100644 --- a/src/app/course/[courseName]/settings/SubmissionDefaults.tsx +++ b/src/app/course/[courseName]/settings/SubmissionDefaults.tsx @@ -12,7 +12,7 @@ import React, { useEffect, useState } from "react"; import { settingsBox } from "./sharedSettings"; export default function SubmissionDefaults() { - const [settings] = useLocalCourseSettingsQuery(); + const { data: settings } = useLocalCourseSettingsQuery(); const [defaultSubmissionTypes, setDefaultSubmissionTypes] = useState< AssignmentSubmissionType[] >(settings.defaultAssignmentSubmissionTypes); diff --git a/src/app/course/[courseName]/settings/canvasNavigation.tsx/CanvasNavigationManagement.tsx b/src/app/course/[courseName]/settings/canvasNavigation.tsx/CanvasNavigationManagement.tsx index ee0d4e3..22c6b8b 100644 --- a/src/app/course/[courseName]/settings/canvasNavigation.tsx/CanvasNavigationManagement.tsx +++ b/src/app/course/[courseName]/settings/canvasNavigation.tsx/CanvasNavigationManagement.tsx @@ -1,6 +1,5 @@ import React, { useState } from "react"; import { useCanvasTabsQuery } from "@/hooks/canvas/canvasNavigationHooks"; -import { CanvasCourseTab } from "@/services/canvas/canvasNavigationService"; import { useUpdateCanvasTabMutation } from "@/hooks/canvas/canvasNavigationHooks"; import { Spinner } from "@/components/Spinner"; import { NavTabListItem } from "./NavTabListItem"; diff --git a/src/app/course/[courseName]/settings/canvasNavigation.tsx/NavTabListItem.tsx b/src/app/course/[courseName]/settings/canvasNavigation.tsx/NavTabListItem.tsx index c7f901a..d8bc5a8 100644 --- a/src/app/course/[courseName]/settings/canvasNavigation.tsx/NavTabListItem.tsx +++ b/src/app/course/[courseName]/settings/canvasNavigation.tsx/NavTabListItem.tsx @@ -9,7 +9,7 @@ export const NavTabListItem: FC<{ onDragStart: () => void; onDragOver: (e: React.DragEvent) => void; onDrop: () => void; -}> = ({ tab, idx, onDragStart, onDragOver, onDrop }) => { +}> = ({ tab, onDragStart, onDrop }) => { const updateTab = useUpdateCanvasTabMutation(); const [isDragOver, setIsDragOver] = React.useState(false); const handleToggleVisibility = () => { @@ -32,7 +32,7 @@ export const NavTabListItem: FC<{ setIsDragOver(true); }} onDragLeave={() => setIsDragOver(false)} - onDrop={(e) => { + onDrop={() => { setIsDragOver(false); onDrop(); }} diff --git a/src/app/newCourse/NewCourseForm.tsx b/src/app/newCourse/NewCourseForm.tsx index ebe7305..d776ab7 100644 --- a/src/app/newCourse/NewCourseForm.tsx +++ b/src/app/newCourse/NewCourseForm.tsx @@ -99,7 +99,7 @@ export default function NewCourseForm() { holidays: [], assignmentGroups: courseToImport.assignmentGroups.map( (assignmentGroup) => { - const { canvasId, ...groupWithoutCanvas } = + const { canvasId: _, ...groupWithoutCanvas } = assignmentGroup; return { ...groupWithoutCanvas, canvasId: undefined }; } @@ -172,10 +172,10 @@ function OtherSettings({ >; }) { const { data: canvasCourses } = useCourseListInTermQuery(selectedTerm.id); - const [allSettings] = useLocalCoursesSettingsQuery(); - const [emptyDirectories] = useEmptyDirectoriesQuery(); + const { data: allSettings } = useLocalCoursesSettingsQuery(); + const { data: emptyDirectories } = useEmptyDirectoriesQuery(); - const populatedCanvasCourseIds = allSettings.map((s) => s.canvasId); + const populatedCanvasCourseIds = allSettings?.map((s) => s.canvasId) ?? []; const availableCourses = canvasCourses?.filter( (canvas: CanvasCourseModel) => diff --git a/src/app/providers.tsx b/src/app/providers.tsx index f51ae02..5f5a87f 100644 --- a/src/app/providers.tsx +++ b/src/app/providers.tsx @@ -15,12 +15,12 @@ export default function Providers({ children }: { children: ReactNode }) { return ( - - + + {/* */} {children} - - + + ); } diff --git a/src/app/todaysLectures/OneCourseLectures.tsx b/src/app/todaysLectures/OneCourseLectures.tsx index 2e276c9..4f0fdbb 100644 --- a/src/app/todaysLectures/OneCourseLectures.tsx +++ b/src/app/todaysLectures/OneCourseLectures.tsx @@ -9,7 +9,7 @@ import { getDateOnlyMarkdownString } from "@/models/local/utils/timeUtils"; export default function OneCourseLectures() { const { courseName } = useCourseContext(); - const [weeks] = useLecturesQuery(); + const {data: weeks} = useLecturesQuery(); const dayAsDate = new Date(); const dayAsString = getDateOnlyMarkdownString(dayAsDate); diff --git a/src/app/todaysLectures/TodaysLectures.tsx b/src/app/todaysLectures/TodaysLectures.tsx index e186ada..a4a462e 100644 --- a/src/app/todaysLectures/TodaysLectures.tsx +++ b/src/app/todaysLectures/TodaysLectures.tsx @@ -7,7 +7,7 @@ import CourseContextProvider from "../course/[courseName]/context/CourseContextP import { Fragment } from "react"; export default function TodaysLectures() { - const [allSettings] = useLocalCoursesSettingsQuery(); + const { data: allSettings } = useLocalCoursesSettingsQuery(); return (
diff --git a/src/components/MarkdownDisplay.tsx b/src/components/MarkdownDisplay.tsx index 1363696..8f0b5d4 100644 --- a/src/components/MarkdownDisplay.tsx +++ b/src/components/MarkdownDisplay.tsx @@ -10,7 +10,7 @@ export default function MarkdownDisplay({ markdown: string; className?: string; }) { - const [settings] = useLocalCourseSettingsQuery(); + const { data: settings } = useLocalCourseSettingsQuery(); return ( void; diff --git a/src/components/editor/InnerMonacoEditor.tsx b/src/components/editor/InnerMonacoEditor.tsx index d654787..6bfb486 100644 --- a/src/components/editor/InnerMonacoEditor.tsx +++ b/src/components/editor/InnerMonacoEditor.tsx @@ -38,7 +38,7 @@ export default function InnerMonacoEditor({ }; editorRef.current = monaco.editor.create(divRef.current, properties); - editorRef.current.onDidChangeModelContent((e) => { + editorRef.current.onDidChangeModelContent(() => { console.log("in on change", onChange); onChange(editorRef.current?.getModel()?.getValue() ?? ""); }); diff --git a/src/components/editor/InnerMonacoEditorOther.tsx b/src/components/editor/InnerMonacoEditorOther.tsx index fda34e8..5fd06f4 100644 --- a/src/components/editor/InnerMonacoEditorOther.tsx +++ b/src/components/editor/InnerMonacoEditorOther.tsx @@ -15,7 +15,7 @@ export default function InnerMonacoEditorOther({ function handleEditorDidMount(editor: editor.IStandaloneCodeEditor) { editorRef.current = editor; - editor.onDidChangeModelContent((e) => { + editor.onDidChangeModelContent(() => { onChange(editorRef.current?.getModel()?.getValue() ?? ""); }); } diff --git a/src/components/realtime/ClientCacheInvalidation.tsx b/src/components/realtime/ClientCacheInvalidation.tsx index ced3d7e..dfbde2b 100644 --- a/src/components/realtime/ClientCacheInvalidation.tsx +++ b/src/components/realtime/ClientCacheInvalidation.tsx @@ -1,8 +1,9 @@ "use client"; -import { trpc } from "@/services/serverFunctions/trpcClient"; +import { useTRPC } from "@/services/serverFunctions/trpcClient"; import React, { useCallback, useEffect, useState } from "react"; import { io, Socket } from "socket.io-client"; +import { useQueryClient } from "@tanstack/react-query"; interface ServerToClientEvents { message: (data: string) => void; @@ -59,7 +60,8 @@ export function ClientCacheInvalidation() { } const useFilePathInvalidation = () => { - const utils = trpc.useUtils(); + const trpc = useTRPC(); + const queryClient = useQueryClient(); return useCallback( (filePath: string) => { const [courseName, moduleOrLectures, itemType, itemFile] = @@ -69,69 +71,88 @@ const useFilePathInvalidation = () => { const allParts = [courseName, moduleOrLectures, itemType, itemName]; if (moduleOrLectures === "settings.yml") { - utils.settings.allCoursesSettings.invalidate(); - utils.settings.courseSettings.invalidate({ courseName }); + queryClient.invalidateQueries({ + queryKey: trpc.settings.allCoursesSettings.queryKey(), + }); + queryClient.invalidateQueries({ + queryKey: trpc.settings.courseSettings.queryKey({ courseName }), + }); return; } if (moduleOrLectures === "00 - lectures") { console.log("lecture updated on FS ", allParts); - utils.lectures.getLectures.invalidate({ courseName }); + queryClient.invalidateQueries({ + queryKey: trpc.lectures.getLectures.queryKey({ courseName }), + }); return; } if (itemType === "assignments") { console.log("assignment updated on FS ", allParts); - utils.assignment.getAllAssignments.invalidate({ - courseName, - moduleName: moduleOrLectures, + queryClient.invalidateQueries({ + queryKey: trpc.assignment.getAllAssignments.queryKey({ + courseName, + moduleName: moduleOrLectures, + }), }); - utils.assignment.getAssignment.invalidate({ - courseName, - moduleName: moduleOrLectures, - assignmentName: itemName, + queryClient.invalidateQueries({ + queryKey: trpc.assignment.getAssignment.queryKey({ + courseName, + moduleName: moduleOrLectures, + assignmentName: itemName, + }), }); return; } if (itemType === "quizzes") { console.log("quiz updated on FS ", allParts); - utils.quiz.getAllQuizzes.invalidate({ - courseName, - moduleName: moduleOrLectures, + queryClient.invalidateQueries({ + queryKey: trpc.quiz.getAllQuizzes.queryKey({ + courseName, + moduleName: moduleOrLectures, + }), }); - utils.quiz.getQuiz.invalidate({ - courseName, - moduleName: moduleOrLectures, - quizName: itemName, + queryClient.invalidateQueries({ + queryKey: trpc.quiz.getQuiz.queryKey({ + courseName, + moduleName: moduleOrLectures, + quizName: itemName, + }), }); return; } if (itemType === "pages") { console.log("page updated on FS ", allParts); - utils.page.getAllPages.invalidate({ - courseName, - moduleName: moduleOrLectures, + queryClient.invalidateQueries({ + queryKey: trpc.page.getAllPages.queryKey({ + courseName, + moduleName: moduleOrLectures, + }), }); - utils.page.getPage.invalidate({ - courseName, - moduleName: moduleOrLectures, - pageName: itemName, + queryClient.invalidateQueries({ + queryKey: trpc.page.getPage.queryKey({ + courseName, + moduleName: moduleOrLectures, + pageName: itemName, + }), }); return; } }, [ - utils.assignment.getAllAssignments, - utils.assignment.getAssignment, - utils.lectures.getLectures, - utils.page.getAllPages, - utils.page.getPage, - utils.quiz.getAllQuizzes, - utils.quiz.getQuiz, - utils.settings.allCoursesSettings, - utils.settings.courseSettings, + queryClient, + trpc.assignment.getAllAssignments, + trpc.assignment.getAssignment, + trpc.lectures.getLectures, + trpc.page.getAllPages, + trpc.page.getPage, + trpc.quiz.getAllQuizzes, + trpc.quiz.getQuiz, + trpc.settings.allCoursesSettings, + trpc.settings.courseSettings, ] ); }; diff --git a/src/hooks/canvas/canvasAssignmentHooks.ts b/src/hooks/canvas/canvasAssignmentHooks.ts index 00972bd..1b425c4 100644 --- a/src/hooks/canvas/canvasAssignmentHooks.ts +++ b/src/hooks/canvas/canvasAssignmentHooks.ts @@ -14,7 +14,7 @@ export const canvasAssignmentKeys = { }; export const useCanvasAssignmentsQuery = () => { - const [settings] = useLocalCourseSettingsQuery(); + const { data: settings } = useLocalCourseSettingsQuery(); return useQuery({ queryKey: canvasAssignmentKeys.assignments(settings.canvasId), @@ -22,9 +22,8 @@ export const useCanvasAssignmentsQuery = () => { }); }; - export const useAddAssignmentToCanvasMutation = () => { - const [settings] = useLocalCourseSettingsQuery(); + const { data: settings } = useLocalCourseSettingsQuery(); const { data: canvasModules } = useCanvasModulesQuery(); const addModule = useAddCanvasModuleMutation(); const queryClient = useQueryClient(); @@ -74,7 +73,7 @@ export const useAddAssignmentToCanvasMutation = () => { }; export const useUpdateAssignmentInCanvasMutation = () => { - const [settings] = useLocalCourseSettingsQuery(); + const { data: settings } = useLocalCourseSettingsQuery(); const queryClient = useQueryClient(); return useMutation({ @@ -105,7 +104,7 @@ export const useUpdateAssignmentInCanvasMutation = () => { }; export const useDeleteAssignmentFromCanvasMutation = () => { - const [settings] = useLocalCourseSettingsQuery(); + const { data: settings } = useLocalCourseSettingsQuery(); const queryClient = useQueryClient(); return useMutation({ mutationFn: async ({ diff --git a/src/hooks/canvas/canvasModuleHooks.ts b/src/hooks/canvas/canvasModuleHooks.ts index 0a6a8ae..3a45575 100644 --- a/src/hooks/canvas/canvasModuleHooks.ts +++ b/src/hooks/canvas/canvasModuleHooks.ts @@ -1,9 +1,5 @@ import { canvasModuleService } from "@/services/canvas/canvasModuleService"; -import { - useMutation, - useQuery, - useQueryClient, -} from "@tanstack/react-query"; +import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; import { useLocalCourseSettingsQuery } from "../localCourse/localCoursesHooks"; export const canvasCourseModuleKeys = { @@ -11,7 +7,7 @@ export const canvasCourseModuleKeys = { }; export const useCanvasModulesQuery = () => { - const [settings] = useLocalCourseSettingsQuery(); + const { data: settings } = useLocalCourseSettingsQuery(); return useQuery({ queryKey: canvasCourseModuleKeys.modules(settings.canvasId), queryFn: async () => @@ -20,7 +16,7 @@ export const useCanvasModulesQuery = () => { }; export const useAddCanvasModuleMutation = () => { - const [settings] = useLocalCourseSettingsQuery(); + const { data: settings } = useLocalCourseSettingsQuery(); const queryClient = useQueryClient(); return useMutation({ mutationFn: async (moduleName: string) => @@ -32,4 +28,3 @@ export const useAddCanvasModuleMutation = () => { }, }); }; - diff --git a/src/hooks/canvas/canvasNavigationHooks.tsx b/src/hooks/canvas/canvasNavigationHooks.tsx index a00c639..d3359d3 100644 --- a/src/hooks/canvas/canvasNavigationHooks.tsx +++ b/src/hooks/canvas/canvasNavigationHooks.tsx @@ -7,7 +7,7 @@ export const canvasCourseTabKeys = { }; export const useCanvasTabsQuery = () => { - const [settings] = useLocalCourseSettingsQuery(); + const { data: settings } = useLocalCourseSettingsQuery(); return useQuery({ queryKey: canvasCourseTabKeys.tabs(settings.canvasId), queryFn: async () => @@ -16,7 +16,7 @@ export const useCanvasTabsQuery = () => { }; export const useUpdateCanvasTabMutation = () => { - const [settings] = useLocalCourseSettingsQuery(); + const { data: settings } = useLocalCourseSettingsQuery(); const queryClient = useQueryClient(); return useMutation({ mutationFn: async ({ @@ -35,7 +35,7 @@ export const useUpdateCanvasTabMutation = () => { onSuccess: () => { queryClient.invalidateQueries({ queryKey: canvasCourseTabKeys.tabs(settings.canvasId), - refetchType: "all" + refetchType: "all", }); }, }); diff --git a/src/hooks/canvas/canvasPageHooks.ts b/src/hooks/canvas/canvasPageHooks.ts index 86e653d..1ec31fc 100644 --- a/src/hooks/canvas/canvasPageHooks.ts +++ b/src/hooks/canvas/canvasPageHooks.ts @@ -17,7 +17,7 @@ export const canvasPageKeys = { }; export const useCanvasPagesQuery = () => { - const [settings] = useLocalCourseSettingsQuery(); + const { data: settings } = useLocalCourseSettingsQuery(); return useQuery({ queryKey: canvasPageKeys.pagesInCourse(settings.canvasId), queryFn: async () => await canvasPageService.getAll(settings.canvasId), @@ -25,7 +25,7 @@ export const useCanvasPagesQuery = () => { }; export const useCreateCanvasPageMutation = () => { - const [settings] = useLocalCourseSettingsQuery(); + const { data: settings } = useLocalCourseSettingsQuery(); const queryClient = useQueryClient(); const { data: canvasModules } = useCanvasModulesQuery(); const addModule = useAddCanvasModuleMutation(); @@ -44,7 +44,8 @@ export const useCreateCanvasPageMutation = () => { } const canvasPage = await canvasPageService.create( settings.canvasId, - page,settings + page, + settings ); const canvasModule = canvasModules.find((c) => c.name === moduleName); @@ -69,7 +70,7 @@ export const useCreateCanvasPageMutation = () => { }; export const useUpdateCanvasPageMutation = () => { - const [settings] = useLocalCourseSettingsQuery(); + const { data: settings } = useLocalCourseSettingsQuery(); const queryClient = useQueryClient(); return useMutation({ mutationFn: async ({ @@ -78,7 +79,8 @@ export const useUpdateCanvasPageMutation = () => { }: { page: LocalCoursePage; canvasPageId: number; - }) => canvasPageService.update(settings.canvasId, canvasPageId, page, settings), + }) => + canvasPageService.update(settings.canvasId, canvasPageId, page, settings), onSuccess: () => { queryClient.invalidateQueries({ queryKey: canvasPageKeys.pagesInCourse(settings.canvasId), @@ -88,7 +90,7 @@ export const useUpdateCanvasPageMutation = () => { }; export const useDeleteCanvasPageMutation = () => { - const [settings] = useLocalCourseSettingsQuery(); + const { data: settings } = useLocalCourseSettingsQuery(); const queryClient = useQueryClient(); return useMutation({ mutationFn: async (canvasPageId: number) => diff --git a/src/hooks/canvas/canvasQuizHooks.ts b/src/hooks/canvas/canvasQuizHooks.ts index f13bc99..b5efe0f 100644 --- a/src/hooks/canvas/canvasQuizHooks.ts +++ b/src/hooks/canvas/canvasQuizHooks.ts @@ -1,8 +1,4 @@ -import { - useMutation, - useQuery, - useQueryClient, -} from "@tanstack/react-query"; +import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query"; import { useLocalCourseSettingsQuery } from "../localCourse/localCoursesHooks"; import { canvasQuizService } from "@/services/canvas/canvasQuizService"; import { LocalQuiz } from "@/models/local/quiz/localQuiz"; @@ -18,7 +14,7 @@ export const canvasQuizKeys = { }; export const useCanvasQuizzesQuery = () => { - const [settings] = useLocalCourseSettingsQuery(); + const { data: settings } = useLocalCourseSettingsQuery(); return useQuery({ queryKey: canvasQuizKeys.quizzes(settings.canvasId), @@ -27,7 +23,7 @@ export const useCanvasQuizzesQuery = () => { }; export const useAddQuizToCanvasMutation = () => { - const [settings] = useLocalCourseSettingsQuery(); + const { data: settings } = useLocalCourseSettingsQuery(); const queryClient = useQueryClient(); const { data: canvasModules } = useCanvasModulesQuery(); const addModule = useAddCanvasModuleMutation(); @@ -76,7 +72,7 @@ export const useAddQuizToCanvasMutation = () => { }; export const useDeleteQuizFromCanvasMutation = () => { - const [settings] = useLocalCourseSettingsQuery(); + const { data: settings } = useLocalCourseSettingsQuery(); const queryClient = useQueryClient(); return useMutation({ mutationFn: async (canvasQuizId: number) => { diff --git a/src/hooks/localCourse/assignmentHooks.ts b/src/hooks/localCourse/assignmentHooks.ts index ecf3b1e..6f2f33b 100644 --- a/src/hooks/localCourse/assignmentHooks.ts +++ b/src/hooks/localCourse/assignmentHooks.ts @@ -1,5 +1,5 @@ "use client"; -import { trpc } from "@/services/serverFunctions/trpcClient"; +import { useTRPC } from "@/services/serverFunctions/trpcClient"; import { useCourseContext } from "@/app/course/[courseName]/context/courseContext"; import { useLocalCourseSettingsQuery, @@ -10,18 +10,25 @@ import { markdownToHtmlNoImages, } from "@/services/htmlMarkdownUtils"; import { useEffect, useState } from "react"; -import { useMutation } from "@tanstack/react-query"; +import { + useMutation, + useQueryClient, + useSuspenseQuery, +} from "@tanstack/react-query"; export const useAssignmentQuery = ( moduleName: string, assignmentName: string ) => { const { courseName } = useCourseContext(); - return trpc.assignment.getAssignment.useSuspenseQuery({ - moduleName, - courseName, - assignmentName, - }); + const trpc = useTRPC(); + return useSuspenseQuery( + trpc.assignment.getAssignment.queryOptions({ + moduleName, + courseName, + assignmentName, + }) + ); }; const enable_images = process.env.NEXT_PUBLIC_ENABLE_FILE_SYNC === "true"; @@ -33,13 +40,15 @@ export const useUpdateImageSettingsForAssignment = ({ moduleName: string; assignmentName: string; }) => { - const [assignment] = useAssignmentQuery(moduleName, assignmentName); + const { data: assignment } = useAssignmentQuery(moduleName, assignmentName); const [isPending, setIsPending] = useState(false); const addNewImagesToCanvasMutation = useAddNewImagesToCanvasMutation(); useEffect(() => { if (!enable_images) { - console.log("not uploading images, NEXT_PUBLIC_ENABLE_FILE_SYNC is not set to true"); + console.log( + "not uploading images, NEXT_PUBLIC_ENABLE_FILE_SYNC is not set to true" + ); return; } @@ -62,9 +71,11 @@ export const useUpdateImageSettingsForAssignment = ({ }; export const useAddNewImagesToCanvasMutation = () => { - const [settings] = useLocalCourseSettingsQuery(); - const createCanvasUrlMutation = - trpc.canvasFile.getCanvasFileUrl.useMutation(); + const { data: settings } = useLocalCourseSettingsQuery(); + const trpc = useTRPC(); + const createCanvasUrlMutation = useMutation( + trpc.canvasFile.getCanvasFileUrl.mutationOptions() + ); const updateSettings = useUpdateLocalCourseSettingsMutation(); return useMutation({ @@ -103,81 +114,101 @@ export const useAddNewImagesToCanvasMutation = () => { export const useAssignmentNamesQuery = (moduleName: string) => { const { courseName } = useCourseContext(); - return trpc.assignment.getAllAssignments.useSuspenseQuery( - { + const trpc = useTRPC(); + return useSuspenseQuery({ + ...trpc.assignment.getAllAssignments.queryOptions({ moduleName, courseName, - }, - { - select: (assignments) => assignments.map((a) => a.name), - } - ); + }), + select: (assignments) => assignments.map((a) => a.name), + }); }; export const useUpdateAssignmentMutation = () => { - const utils = trpc.useUtils(); - return trpc.assignment.updateAssignment.useMutation({ - onSuccess: ( - _, - { - courseName, - moduleName, - assignmentName, - previousAssignmentName, - previousModuleName, - } - ) => { - if (moduleName !== previousModuleName) { - utils.assignment.getAllAssignments.invalidate( - { - courseName, - moduleName: previousModuleName, - }, - { refetchType: "all" } - ); - } - utils.assignment.getAllAssignments.invalidate( - { courseName, moduleName }, - { refetchType: "all" } - ); - utils.assignment.getAssignment.invalidate({ - courseName, - moduleName, - assignmentName, - }); - utils.assignment.getAssignment.invalidate({ - courseName, - moduleName, - assignmentName: previousAssignmentName, - }); - }, - }); -}; - -export const useCreateAssignmentMutation = () => { - const utils = trpc.useUtils(); - return trpc.assignment.createAssignment.useMutation({ - onSuccess: (_, { courseName, moduleName }) => { - utils.assignment.getAllAssignments.invalidate({ courseName, moduleName }); - }, - }); -}; - -export const useDeleteAssignmentMutation = () => { - const utils = trpc.useUtils(); - return trpc.assignment.deleteAssignment.useMutation({ - onSuccess: (_, { courseName, moduleName, assignmentName }) => { - utils.assignment.getAllAssignments.invalidate({ courseName, moduleName }); - utils.assignment.getAssignment.invalidate( + const trpc = useTRPC(); + const queryClient = useQueryClient(); + return useMutation( + trpc.assignment.updateAssignment.mutationOptions({ + onSuccess: ( + _, { courseName, moduleName, assignmentName, - }, - { - refetchType: "all", + previousAssignmentName, + previousModuleName, } - ); - }, - }); + ) => { + if (moduleName !== previousModuleName) { + queryClient.invalidateQueries({ + queryKey: trpc.assignment.getAllAssignments.queryKey({ + courseName, + moduleName: previousModuleName, + }), + }); + } + queryClient.invalidateQueries({ + queryKey: trpc.assignment.getAllAssignments.queryKey({ + courseName, + moduleName, + }), + }); + queryClient.invalidateQueries({ + queryKey: trpc.assignment.getAssignment.queryKey({ + courseName, + moduleName, + assignmentName, + }), + }); + queryClient.invalidateQueries({ + queryKey: trpc.assignment.getAssignment.queryKey({ + courseName, + moduleName, + assignmentName: previousAssignmentName, + }), + }); + }, + }) + ); +}; + +export const useCreateAssignmentMutation = () => { + const trpc = useTRPC(); + const queryClient = useQueryClient(); + return useMutation( + trpc.assignment.createAssignment.mutationOptions({ + onSuccess: (_result, { courseName, moduleName }) => { + queryClient.invalidateQueries({ + queryKey: trpc.assignment.getAllAssignments.queryKey({ + courseName, + moduleName, + }), + }); + }, + }) + ); +}; + +export const useDeleteAssignmentMutation = () => { + const trpc = useTRPC(); + const queryClient = useQueryClient(); + return useMutation( + trpc.assignment.deleteAssignment.mutationOptions({ + onSuccess: (_result, { courseName, moduleName, assignmentName }) => { + queryClient.invalidateQueries({ + queryKey: trpc.assignment.getAllAssignments.queryKey({ + courseName, + moduleName, + }), + }); + queryClient.invalidateQueries({ + queryKey: trpc.assignment.getAssignment.queryKey({ + courseName, + moduleName, + assignmentName, + }), + }); + }, + }) + ); }; diff --git a/src/hooks/localCourse/lectureHooks.ts b/src/hooks/localCourse/lectureHooks.ts index 3b8fc74..9b7b822 100644 --- a/src/hooks/localCourse/lectureHooks.ts +++ b/src/hooks/localCourse/lectureHooks.ts @@ -1,25 +1,43 @@ import { useCourseContext } from "@/app/course/[courseName]/context/courseContext"; -import { trpc } from "@/services/serverFunctions/trpcClient"; +import { useTRPC } from "@/services/serverFunctions/trpcClient"; +import { + useSuspenseQuery, + useMutation, + useQueryClient, +} from "@tanstack/react-query"; export const useLecturesSuspenseQuery = () => { const { courseName } = useCourseContext(); - return trpc.lectures.getLectures.useSuspenseQuery({ courseName }); + const trpc = useTRPC(); + return useSuspenseQuery( + trpc.lectures.getLectures.queryOptions({ courseName }) + ); }; export const useLectureUpdateMutation = () => { - const utils = trpc.useUtils(); - return trpc.lectures.updateLecture.useMutation({ - onSuccess: () => { - utils.lectures.getLectures.invalidate(); - }, - }); + const trpc = useTRPC(); + const queryClient = useQueryClient(); + return useMutation( + trpc.lectures.updateLecture.mutationOptions({ + onSuccess: () => { + queryClient.invalidateQueries({ + queryKey: trpc.lectures.getLectures.queryKey(), + }); + }, + }) + ); }; export const useDeleteLectureMutation = () => { - const utils = trpc.useUtils(); - return trpc.lectures.deleteLecture.useMutation({ - onSuccess: () => { - utils.lectures.getLectures.invalidate(); - }, - }); + const trpc = useTRPC(); + const queryClient = useQueryClient(); + return useMutation( + trpc.lectures.deleteLecture.mutationOptions({ + onSuccess: () => { + queryClient.invalidateQueries({ + queryKey: trpc.lectures.getLectures.queryKey(), + }); + }, + }) + ); }; diff --git a/src/hooks/localCourse/localCourseModuleHooks.ts b/src/hooks/localCourse/localCourseModuleHooks.ts index 74e0333..f5d7d90 100644 --- a/src/hooks/localCourse/localCourseModuleHooks.ts +++ b/src/hooks/localCourse/localCourseModuleHooks.ts @@ -1,41 +1,55 @@ import { useCourseContext } from "@/app/course/[courseName]/context/courseContext"; -import { trpc } from "@/services/serverFunctions/trpcClient"; +import { useTRPC } from "@/services/serverFunctions/trpcClient"; import { CalendarItemsInterface } from "@/app/course/[courseName]/context/calendarItemsContext"; import { getDateOnlyMarkdownString, getDateFromStringOrThrow, } from "@/models/local/utils/timeUtils"; +import { + useSuspenseQuery, + useMutation, + useQueryClient, + useSuspenseQueries, +} from "@tanstack/react-query"; export const useModuleNamesQuery = () => { const { courseName } = useCourseContext(); - return trpc.module.getModuleNames.useSuspenseQuery({ courseName }); + const trpc = useTRPC(); + return useSuspenseQuery( + trpc.module.getModuleNames.queryOptions({ courseName }) + ); }; export const useCreateModuleMutation = () => { const { courseName } = useCourseContext(); - const utils = trpc.useUtils(); - - return trpc.module.createModule.useMutation({ - onSuccess: () => { - utils.module.getModuleNames.invalidate({ courseName }); - }, - }); + const trpc = useTRPC(); + const queryClient = useQueryClient(); + return useMutation( + trpc.module.createModule.mutationOptions({ + onSuccess: () => { + queryClient.invalidateQueries({ + queryKey: trpc.module.getModuleNames.queryKey({ courseName }), + }); + }, + }) + ); }; export const useCourseQuizzesByModuleByDateQuery = () => { const { courseName } = useCourseContext(); - const [moduleNames] = useModuleNamesQuery(); - - const [quizzes] = trpc.useSuspenseQueries((t) => - moduleNames.map((moduleName) => - t.quiz.getAllQuizzes({ courseName, moduleName }) - ) - ); - - const quizzesAndModules = moduleNames.flatMap((moduleName, index) => { - return quizzes[index].map((quiz) => ({ moduleName, quiz })); + const { data: moduleNames } = useModuleNamesQuery(); + const trpc = useTRPC(); + const quizzesResults = useSuspenseQueries({ + queries: moduleNames.map((moduleName: string) => + trpc.quiz.getAllQuizzes.queryOptions({ courseName, moduleName }) + ), }); - + const quizzes = quizzesResults.map((result) => result.data ?? []); + const quizzesAndModules = moduleNames.flatMap( + (moduleName: string, index: number) => { + return quizzes[index].map((quiz) => ({ moduleName, quiz })); + } + ); const quizzesByModuleByDate = quizzesAndModules.reduce( (previous, { quiz, moduleName }) => { const dueDay = getDateOnlyMarkdownString( @@ -45,12 +59,10 @@ export const useCourseQuizzesByModuleByDateQuery = () => { const previousModule = previousModules[moduleName] ?? { quizzes: [], }; - const updatedModule = { ...previousModule, quizzes: [...previousModule.quizzes, quiz], }; - return { ...previous, [dueDay]: { @@ -66,19 +78,24 @@ export const useCourseQuizzesByModuleByDateQuery = () => { export const useCoursePagesByModuleByDateQuery = () => { const { courseName } = useCourseContext(); - const [moduleNames] = useModuleNamesQuery(); - const [pages] = trpc.useSuspenseQueries((t) => - moduleNames.map((moduleName) => - t.page.getAllPages({ courseName, moduleName }) - ) - ); - - const pagesAndModules = moduleNames.flatMap((moduleName, index) => { - return pages[index].map((page) => ({ moduleName, page })); + const { data: moduleNames } = useModuleNamesQuery(); + const trpc = useTRPC(); + const pagesResults = useSuspenseQueries({ + queries: moduleNames.map((moduleName: string) => + trpc.page.getAllPages.queryOptions({ courseName, moduleName }) + ), }); - + const pages = pagesResults.map((result) => result.data ?? []); + const pagesAndModules = moduleNames.flatMap( + (moduleName: string, index: number) => { + return pages[index].map((page) => ({ moduleName, page })); + } + ); const pagesByModuleByDate = pagesAndModules.reduce( - (previous, { page, moduleName }) => { + ( + previous, + { page, moduleName } + ) => { const dueDay = getDateOnlyMarkdownString( getDateFromStringOrThrow(page.dueAt, "due at for page in items context") ); @@ -86,12 +103,10 @@ export const useCoursePagesByModuleByDateQuery = () => { const previousModule = previousModules[moduleName] ?? { pages: [], }; - const updatedModule = { ...previousModule, pages: [...previousModule.pages, page], }; - return { ...previous, [dueDay]: { @@ -107,17 +122,29 @@ export const useCoursePagesByModuleByDateQuery = () => { export const useCourseAssignmentsByModuleByDateQuery = () => { const { courseName } = useCourseContext(); - const [moduleNames] = useModuleNamesQuery(); - const [assignments] = trpc.useSuspenseQueries((t) => - moduleNames.map((moduleName) => - t.assignment.getAllAssignments({ courseName, moduleName }) - ) - ); - const assignmentsAndModules = moduleNames.flatMap((moduleName, index) => { - return assignments[index].map((assignment) => ({ moduleName, assignment })); + const { data: moduleNames } = useModuleNamesQuery(); + const trpc = useTRPC(); + const assignmentsResults = useSuspenseQueries({ + queries: moduleNames.map((moduleName: string) => + trpc.assignment.getAllAssignments.queryOptions({ courseName, moduleName }) + ), }); + const assignments = assignmentsResults.map( + (result) => result.data + ); + const assignmentsAndModules = moduleNames.flatMap( + (moduleName: string, index: number) => { + return assignments[index].map((assignment) => ({ + moduleName, + assignment, + })); + } + ); const assignmentsByModuleByDate = assignmentsAndModules.reduce( - (previous, { assignment, moduleName }) => { + ( + previous, + { assignment, moduleName } + ) => { const dueDay = getDateOnlyMarkdownString( getDateFromStringOrThrow( assignment.dueAt, @@ -128,12 +155,10 @@ export const useCourseAssignmentsByModuleByDateQuery = () => { const previousModule = previousModules[moduleName] ?? { assignments: [], }; - const updatedModule = { ...previousModule, assignments: [...previousModule.assignments, assignment], }; - return { ...previous, [dueDay]: { diff --git a/src/hooks/localCourse/localCoursesHooks.ts b/src/hooks/localCourse/localCoursesHooks.ts index 42b79ce..6fb3a02 100644 --- a/src/hooks/localCourse/localCoursesHooks.ts +++ b/src/hooks/localCourse/localCoursesHooks.ts @@ -1,33 +1,56 @@ "use client"; import { useCourseContext } from "@/app/course/[courseName]/context/courseContext"; -import { trpc } from "@/services/serverFunctions/trpcClient"; +import { useTRPC } from "@/services/serverFunctions/trpcClient"; +import { + useSuspenseQuery, + useMutation, + useQueryClient, +} from "@tanstack/react-query"; -export const useLocalCoursesSettingsQuery = () => - trpc.settings.allCoursesSettings.useSuspenseQuery(); +export const useLocalCoursesSettingsQuery = () => { + const trpc = useTRPC(); + return useSuspenseQuery(trpc.settings.allCoursesSettings.queryOptions()); +}; export const useLocalCourseSettingsQuery = () => { const { courseName } = useCourseContext(); - return trpc.settings.courseSettings.useSuspenseQuery({ courseName }); + const trpc = useTRPC(); + return useSuspenseQuery( + trpc.settings.courseSettings.queryOptions({ courseName }) + ); }; export const useCreateLocalCourseMutation = () => { - const utils = trpc.useUtils(); - return trpc.settings.createCourse.useMutation({ - onSuccess: () => { - utils.settings.allCoursesSettings.invalidate(); - utils.directories.getEmptyDirectories.invalidate(); - }, - }); + const trpc = useTRPC(); + const queryClient = useQueryClient(); + return useMutation( + trpc.settings.createCourse.mutationOptions({ + onSuccess: () => { + queryClient.invalidateQueries({ + queryKey: trpc.settings.allCoursesSettings.queryKey(), + }); + queryClient.invalidateQueries({ + queryKey: trpc.directories.getEmptyDirectories.queryKey(), + }); + }, + }) + ); }; export const useUpdateLocalCourseSettingsMutation = () => { const { courseName } = useCourseContext(); - const utils = trpc.useUtils(); - - return trpc.settings.updateSettings.useMutation({ - onSuccess: () => { - utils.settings.allCoursesSettings.invalidate(); - utils.settings.courseSettings.invalidate({ courseName }); - }, - }); + const trpc = useTRPC(); + const queryClient = useQueryClient(); + return useMutation( + trpc.settings.updateSettings.mutationOptions({ + onSuccess: () => { + queryClient.invalidateQueries({ + queryKey: trpc.settings.allCoursesSettings.queryKey(), + }); + queryClient.invalidateQueries({ + queryKey: trpc.settings.courseSettings.queryKey({ courseName }), + }); + }, + }) + ); }; diff --git a/src/hooks/localCourse/pageHooks.ts b/src/hooks/localCourse/pageHooks.ts index 7023202..4690165 100644 --- a/src/hooks/localCourse/pageHooks.ts +++ b/src/hooks/localCourse/pageHooks.ts @@ -1,64 +1,98 @@ "use client"; - import { useCourseContext } from "@/app/course/[courseName]/context/courseContext"; -import { trpc } from "@/services/serverFunctions/trpcClient"; +import { useTRPC } from "@/services/serverFunctions/trpcClient"; +import { + useSuspenseQuery, + useMutation, + useQueryClient, +} from "@tanstack/react-query"; export const usePageQuery = (moduleName: string, pageName: string) => { const { courseName } = useCourseContext(); - return trpc.page.getPage.useSuspenseQuery({ - courseName, - moduleName, - pageName, - }); + const trpc = useTRPC(); + return useSuspenseQuery( + trpc.page.getPage.queryOptions({ + courseName, + moduleName, + pageName, + }) + ); }; export const usePagesQueries = (moduleName: string) => { const { courseName } = useCourseContext(); - return trpc.page.getAllPages.useSuspenseQuery({ - courseName, - moduleName, - }); + const trpc = useTRPC(); + return useSuspenseQuery( + trpc.page.getAllPages.queryOptions({ + courseName, + moduleName, + }) + ); }; export const useUpdatePageMutation = () => { - const utils = trpc.useUtils(); - return trpc.page.updatePage.useMutation({ - onSuccess: ( - _, - { courseName, moduleName, pageName, previousModuleName } - ) => { - utils.page.getAllPages.invalidate({ courseName, moduleName }, - { refetchType: "all" }); - utils.page.getPage.invalidate({ courseName, moduleName, pageName }); - if (moduleName !== previousModuleName) { - utils.page.getAllPages.invalidate({ - courseName, - moduleName: previousModuleName, - }, - { refetchType: "all" }); - } - }, - }); -}; -export const useCreatePageMutation = () => { - const utils = trpc.useUtils(); - return trpc.page.createPage.useMutation({ - onSuccess: (_, { courseName, moduleName }) => { - utils.page.getAllPages.invalidate({ courseName, moduleName }); - }, - }); -}; -export const useDeletePageMutation = () => { - const utils = trpc.useUtils(); - return trpc.page.deletePage.useMutation({ - onSuccess: (_, { courseName, moduleName, pageName }) => { - utils.page.getAllPages.invalidate( - { courseName, moduleName }, - { - refetchType: "all", + const trpc = useTRPC(); + const queryClient = useQueryClient(); + return useMutation( + trpc.page.updatePage.mutationOptions({ + onSuccess: ( + _, + { courseName, moduleName, pageName, previousModuleName } + ) => { + queryClient.invalidateQueries({ + queryKey: trpc.page.getAllPages.queryKey({ courseName, moduleName }), + }); + queryClient.invalidateQueries({ + queryKey: trpc.page.getPage.queryKey({ + courseName, + moduleName, + pageName, + }), + }); + if (moduleName !== previousModuleName) { + queryClient.invalidateQueries({ + queryKey: trpc.page.getAllPages.queryKey({ + courseName, + moduleName: previousModuleName, + }), + }); } - ); - utils.page.getPage.invalidate({ courseName, moduleName, pageName }); - }, - }); + }, + }) + ); +}; + +export const useCreatePageMutation = () => { + const trpc = useTRPC(); + const queryClient = useQueryClient(); + return useMutation( + trpc.page.createPage.mutationOptions({ + onSuccess: (_, { courseName, moduleName }) => { + queryClient.invalidateQueries({ + queryKey: trpc.page.getAllPages.queryKey({ courseName, moduleName }), + }); + }, + }) + ); +}; + +export const useDeletePageMutation = () => { + const trpc = useTRPC(); + const queryClient = useQueryClient(); + return useMutation( + trpc.page.deletePage.mutationOptions({ + onSuccess: (_, { courseName, moduleName, pageName }) => { + queryClient.invalidateQueries({ + queryKey: trpc.page.getAllPages.queryKey({ courseName, moduleName }), + }); + queryClient.invalidateQueries({ + queryKey: trpc.page.getPage.queryKey({ + courseName, + moduleName, + pageName, + }), + }); + }, + }) + ); }; diff --git a/src/hooks/localCourse/quizHooks.ts b/src/hooks/localCourse/quizHooks.ts index 74ef390..579e4f1 100644 --- a/src/hooks/localCourse/quizHooks.ts +++ b/src/hooks/localCourse/quizHooks.ts @@ -1,62 +1,107 @@ "use client"; - import { useCourseContext } from "@/app/course/[courseName]/context/courseContext"; -import { trpc } from "@/services/serverFunctions/trpcClient"; +import { useTRPC } from "@/services/serverFunctions/trpcClient"; +import { + useSuspenseQuery, + useMutation, + useQueryClient, +} from "@tanstack/react-query"; export const useQuizQuery = (moduleName: string, quizName: string) => { const { courseName } = useCourseContext(); - return trpc.quiz.getQuiz.useSuspenseQuery({ - courseName, - moduleName, - quizName, - }); + const trpc = useTRPC(); + return useSuspenseQuery( + trpc.quiz.getQuiz.queryOptions({ + courseName, + moduleName, + quizName, + }) + ); }; export const useQuizzesQueries = (moduleName: string) => { const { courseName } = useCourseContext(); - // const trpc = usetrpc(); - return trpc.quiz.getAllQuizzes.useSuspenseQuery({ - courseName, - moduleName, - }); + const trpc = useTRPC(); + return useSuspenseQuery( + trpc.quiz.getAllQuizzes.queryOptions({ + courseName, + moduleName, + }) + ); }; export const useUpdateQuizMutation = () => { - const utils = trpc.useUtils(); - return trpc.quiz.updateQuiz.useMutation({ - onSuccess: ( - _, - { courseName, moduleName, quizName, previousModuleName } - ) => { - if (moduleName !== previousModuleName) - utils.quiz.getAllQuizzes.invalidate({ - courseName, - moduleName: previousModuleName, - }, - { refetchType: "all" }); - utils.quiz.getAllQuizzes.invalidate({ courseName, moduleName }, - { refetchType: "all" }); - utils.quiz.getQuiz.invalidate({ courseName, moduleName, quizName }); - }, - }); + const trpc = useTRPC(); + const queryClient = useQueryClient(); + return useMutation( + trpc.quiz.updateQuiz.mutationOptions({ + onSuccess: ( + _, + { courseName, moduleName, quizName, previousModuleName } + ) => { + if (moduleName !== previousModuleName) { + queryClient.invalidateQueries({ + queryKey: trpc.quiz.getAllQuizzes.queryKey({ + courseName, + moduleName: previousModuleName, + }), + }); + } + queryClient.invalidateQueries({ + queryKey: trpc.quiz.getAllQuizzes.queryKey({ + courseName, + moduleName, + }), + }); + queryClient.invalidateQueries({ + queryKey: trpc.quiz.getQuiz.queryKey({ + courseName, + moduleName, + quizName, + }), + }); + }, + }) + ); }; + export const useCreateQuizMutation = () => { - const utils = trpc.useUtils(); - return trpc.quiz.createQuiz.useMutation({ - onSuccess: (_, { courseName, moduleName }) => { - utils.quiz.getAllQuizzes.invalidate({ courseName, moduleName }); - }, - }); + const trpc = useTRPC(); + const queryClient = useQueryClient(); + return useMutation( + trpc.quiz.createQuiz.mutationOptions({ + onSuccess: (_, { courseName, moduleName }) => { + queryClient.invalidateQueries({ + queryKey: trpc.quiz.getAllQuizzes.queryKey({ + courseName, + moduleName, + }), + }); + }, + }) + ); }; + export const useDeleteQuizMutation = () => { - const utils = trpc.useUtils(); - return trpc.quiz.deleteQuiz.useMutation({ - onSuccess: (_, { courseName, moduleName, quizName }) => { - utils.quiz.getAllQuizzes.invalidate( - { courseName, moduleName }, - { refetchType: "all" } - ); - utils.quiz.getQuiz.invalidate({ courseName, moduleName, quizName }); - }, - }); + const trpc = useTRPC(); + const queryClient = useQueryClient(); + return useMutation( + trpc.quiz.deleteQuiz.mutationOptions({ + onSuccess: (_, { courseName, moduleName, quizName }) => { + queryClient.invalidateQueries({ + queryKey: trpc.quiz.getAllQuizzes.queryKey({ + courseName, + moduleName, + }), + }); + queryClient.invalidateQueries({ + queryKey: trpc.quiz.getQuiz.queryKey({ + courseName, + moduleName, + quizName, + }), + }); + }, + }) + ); }; diff --git a/src/hooks/localCourse/storageDirectoryHooks.ts b/src/hooks/localCourse/storageDirectoryHooks.ts index 7b89d44..8168a3e 100644 --- a/src/hooks/localCourse/storageDirectoryHooks.ts +++ b/src/hooks/localCourse/storageDirectoryHooks.ts @@ -1,8 +1,11 @@ -import { trpc } from "@/services/serverFunctions/trpcClient"; +import { useTRPC } from "@/services/serverFunctions/trpcClient"; +import { useSuspenseQuery } from "@tanstack/react-query"; export const directoryKeys = { emptyFolders: ["empty folders"] as const, }; -export const useEmptyDirectoriesQuery = () => - trpc.directories.getEmptyDirectories.useSuspenseQuery(); +export const useEmptyDirectoriesQuery = () => { + const trpc = useTRPC(); + return useSuspenseQuery(trpc.directories.getEmptyDirectories.queryOptions()); +}; diff --git a/src/models/canvas/assignments/canvasAssignment.ts b/src/models/canvas/assignments/canvasAssignment.ts index ae791f2..7214c0a 100644 --- a/src/models/canvas/assignments/canvasAssignment.ts +++ b/src/models/canvas/assignments/canvasAssignment.ts @@ -54,7 +54,7 @@ export interface CanvasAssignment { }[]; post_to_sis?: boolean; integration_id?: string; - integration_data?: any; + integration_data?: unknown; muted?: boolean; points_possible?: number; has_submitted_submissions?: boolean; @@ -69,7 +69,7 @@ export interface CanvasAssignment { frozen_attributes?: string[]; submission?: CanvasSubmissionModel; use_rubric_for_grading?: boolean; - rubric_settings?: any; + rubric_settings?: unknown; rubric?: CanvasRubricCriteria[]; assignment_visibility?: number[]; overrides?: CanvasAssignmentOverride[]; diff --git a/src/models/canvas/assignments/canvasLockInfo.ts b/src/models/canvas/assignments/canvasLockInfo.ts index ac8fb57..3370091 100644 --- a/src/models/canvas/assignments/canvasLockInfo.ts +++ b/src/models/canvas/assignments/canvasLockInfo.ts @@ -2,6 +2,6 @@ export interface CanvasLockInfo { asset_string: string; unlock_at?: string; // ISO 8601 date string lock_at?: string; // ISO 8601 date string - context_module?: any; + context_module?: unknown; manually_locked?: boolean; } diff --git a/src/models/canvas/discussions/canvasDiscussionModelTopic.ts b/src/models/canvas/discussions/canvasDiscussionModelTopic.ts index c667b16..e13825a 100644 --- a/src/models/canvas/discussions/canvasDiscussionModelTopic.ts +++ b/src/models/canvas/discussions/canvasDiscussionModelTopic.ts @@ -30,8 +30,8 @@ export interface CanvasDiscussionTopicModel { locked?: boolean; pinned?: boolean; locked_for_user?: boolean; - lock_info?: any; - group_topic_children?: any; + lock_info?: unknown; + group_topic_children?: unknown; root_topic_id?: number; group_category_id?: number; allow_rating?: boolean; diff --git a/src/models/canvas/quizzes/canvasQuizModel.ts b/src/models/canvas/quizzes/canvasQuizModel.ts index c207dd0..ece29ce 100644 --- a/src/models/canvas/quizzes/canvasQuizModel.ts +++ b/src/models/canvas/quizzes/canvasQuizModel.ts @@ -37,7 +37,7 @@ export interface CanvasQuiz { speedgrader_url?: string; quiz_extensions_url?: string; permissions: CanvasQuizPermissions; - all_dates?: any; // Depending on the structure of the dates, this could be further specified + all_dates?: unknown; // Depending on the structure of the dates, this could be further specified version_number?: number; question_types?: string[]; anonymous_submissions?: boolean; diff --git a/src/models/local/localCourseSettings.ts b/src/models/local/localCourseSettings.ts index 4d7ea53..13b900c 100644 --- a/src/models/local/localCourseSettings.ts +++ b/src/models/local/localCourseSettings.ts @@ -9,11 +9,6 @@ import { } from "./assignment/localAssignmentGroup"; import { parse, stringify } from "yaml"; -// export interface LocalCourse { -// modules: LocalModule[]; -// settings: LocalCourseSettings; -// } - export interface SimpleTimeOnly { hour: number; minute: number; @@ -109,9 +104,9 @@ function lowercaseFirstLetter(obj: T): T { if (Array.isArray(obj)) return obj.map(lowercaseFirstLetter) as unknown as T; - const result: Record = {}; + const result: Record = {}; Object.keys(obj).forEach((key) => { - const value = (obj as Record)[key]; + const value = (obj as Record)[key]; const newKey = key.charAt(0).toLowerCase() + key.slice(1); if (value && typeof value === "object") { diff --git a/src/models/local/quiz/utils/quizQuestionMarkdownUtils.ts b/src/models/local/quiz/utils/quizQuestionMarkdownUtils.ts index 0f4d10b..062a76f 100644 --- a/src/models/local/quiz/utils/quizQuestionMarkdownUtils.ts +++ b/src/models/local/quiz/utils/quizQuestionMarkdownUtils.ts @@ -1,4 +1,3 @@ -import { LocalQuiz } from "../localQuiz"; import { LocalQuizQuestion, QuestionType } from "../localQuizQuestion"; import { LocalQuizQuestionAnswer } from "../localQuizQuestionAnswer"; import { quizQuestionAnswerMarkdownUtils } from "./quizQuestionAnswerMarkdownUtils"; @@ -112,7 +111,7 @@ const getAnswers = ( questionIndex ); - const answers = answerLines.map((a, i) => + const answers = answerLines.map((a) => quizQuestionAnswerMarkdownUtils.parseMarkdown(a, questionType) ); return answers; @@ -215,7 +214,7 @@ export const quizQuestionMarkdownUtils = { ? linesWithoutAnswers .slice(0, linesWithoutPoints.length) .filter( - (line, index) => + (line) => !questionTypesWithoutAnswers.includes(line.toLowerCase()) ) : linesWithoutAnswers; diff --git a/src/models/local/tests/quizMarkdown/multipleChoice.test.ts b/src/models/local/tests/quizMarkdown/multipleChoice.test.ts index 2d4936f..83b7bb9 100644 --- a/src/models/local/tests/quizMarkdown/multipleChoice.test.ts +++ b/src/models/local/tests/quizMarkdown/multipleChoice.test.ts @@ -1,7 +1,6 @@ import { describe, it, expect } from "vitest"; import { LocalQuiz } from "../../quiz/localQuiz"; -import { LocalQuizQuestion, QuestionType } from "../../quiz/localQuizQuestion"; -import { LocalQuizQuestionAnswer } from "../../quiz/localQuizQuestionAnswer"; +import { QuestionType } from "../../quiz/localQuizQuestion"; import { quizMarkdownUtils } from "@/models/local/quiz/utils/quizMarkdownUtils"; import { quizQuestionMarkdownUtils } from "@/models/local/quiz/utils/quizQuestionMarkdownUtils"; diff --git a/src/models/local/tests/quizMarkdown/quizMarkdown.test.ts b/src/models/local/tests/quizMarkdown/quizMarkdown.test.ts index 3ffab70..7992877 100644 --- a/src/models/local/tests/quizMarkdown/quizMarkdown.test.ts +++ b/src/models/local/tests/quizMarkdown/quizMarkdown.test.ts @@ -3,7 +3,7 @@ import { LocalQuiz } from "../../quiz/localQuiz"; import { quizMarkdownUtils } from "../../quiz/utils/quizMarkdownUtils"; import { QuestionType } from "@/models/local/quiz/localQuizQuestion"; import { quizQuestionMarkdownUtils } from "@/models/local/quiz/utils/quizQuestionMarkdownUtils"; -import { markdownToHtmlNoImages, markdownToHTMLSafe } from "@/services/htmlMarkdownUtils"; +import { markdownToHtmlNoImages } from "@/services/htmlMarkdownUtils"; // Test suite for QuizMarkdown describe("QuizMarkdownTests", () => { @@ -256,7 +256,6 @@ short answer }); it("can parse quiz with latex in a question", () => { - const name = "Test Quiz"; const rawMarkdownQuiz = ` ShuffleAnswers: true OneQuestionAtATime: false diff --git a/src/models/local/tests/quizMarkdown/testAnswer.test.ts b/src/models/local/tests/quizMarkdown/testAnswer.test.ts index 39a5baf..591a6a9 100644 --- a/src/models/local/tests/quizMarkdown/testAnswer.test.ts +++ b/src/models/local/tests/quizMarkdown/testAnswer.test.ts @@ -3,7 +3,6 @@ import { QuestionType, zodQuestionType } from "../../quiz/localQuizQuestion"; import { quizMarkdownUtils } from "../../quiz/utils/quizMarkdownUtils"; import { quizQuestionMarkdownUtils } from "../../quiz/utils/quizQuestionMarkdownUtils"; import { describe, it, expect } from "vitest"; -import { LocalCourseSettings } from "../../localCourseSettings"; describe("TextAnswerTests", () => { it("can parse essay", () => { diff --git a/src/services/axiosUtils.ts b/src/services/axiosUtils.ts index 6297646..18048e1 100644 --- a/src/services/axiosUtils.ts +++ b/src/services/axiosUtils.ts @@ -43,7 +43,8 @@ export function getAxiosErrorMessage(error: AxiosError) { console.log("response error", error.response); const responseErrorText = typeof error.response.data === "object" - ? (error.response.data as any).error + ? // eslint-disable-next-line @typescript-eslint/no-explicit-any + (error.response.data as any).error : error.response.data; if ( diff --git a/src/services/canvas/canvasPageService.ts b/src/services/canvas/canvasPageService.ts index 88f83f0..3483667 100644 --- a/src/services/canvas/canvasPageService.ts +++ b/src/services/canvas/canvasPageService.ts @@ -15,6 +15,7 @@ export const canvasPageService = { url, }); return pages.flatMap((pageList) => pageList); + // eslint-disable-next-line @typescript-eslint/no-explicit-any } catch (error: any) { if (error?.response?.status === 403) { console.log( diff --git a/src/services/canvas/canvasQuizService.ts b/src/services/canvas/canvasQuizService.ts index 62a7fbd..a8b7f3bf 100644 --- a/src/services/canvas/canvasQuizService.ts +++ b/src/services/canvas/canvasQuizService.ts @@ -72,6 +72,7 @@ const createQuestionOnly = async ( const hackFixQuestionOrdering = async ( canvasCourseId: number, canvasQuizId: number, + // eslint-disable-next-line @typescript-eslint/no-explicit-any questionAndPositions: Array<{ question: any; position: number }> ) => { console.log("Fixing question order"); @@ -149,6 +150,7 @@ export const canvasQuizService = { ? new Date(quiz.lock_at).toLocaleString() : undefined, })); + // eslint-disable-next-line @typescript-eslint/no-explicit-any } catch (error: any) { if (error?.response?.status === 403) { console.log( diff --git a/src/services/canvas/canvasServiceUtils.ts b/src/services/canvas/canvasServiceUtils.ts index 8aded91..620db83 100644 --- a/src/services/canvas/canvasServiceUtils.ts +++ b/src/services/canvas/canvasServiceUtils.ts @@ -33,10 +33,10 @@ const getNextUrl = ( return nextUrl; }; -export async function paginatedRequest(request: { +export async function paginatedRequest(request: { url: string; }): Promise { - var requestCount = 1; + let requestCount = 1; const url = new URL(request.url); url.searchParams.set("per_page", "100"); @@ -44,8 +44,8 @@ export async function paginatedRequest(request: { url.toString() ); - var returnData = Array.isArray(firstData) ? [...firstData] : [firstData]; // terms come across as nested objects {enrolmentTerms: terms[]} - var nextUrl = getNextUrl(firstHeaders); + let returnData = Array.isArray(firstData) ? [...firstData] : [firstData]; // terms come across as nested objects {enrolmentTerms: terms[]} + let nextUrl = getNextUrl(firstHeaders); while (nextUrl) { requestCount += 1; diff --git a/src/services/canvas/canvasWebRequestor.ts b/src/services/canvas/canvasWebRequestor.ts index 5fa7d83..2091c73 100644 --- a/src/services/canvas/canvasWebRequestor.ts +++ b/src/services/canvas/canvasWebRequestor.ts @@ -1,8 +1,6 @@ import { AxiosResponse } from "axios"; import { axiosClient } from "../axiosUtils"; -type FetchOptions = Omit; - const rateLimitRetryCount = 6; const rateLimitSleepInterval = 1000; @@ -18,21 +16,21 @@ export const isRateLimited = async ( ); }; -const rateLimitAwarePost = async (url: string, body: any, retryCount = 0) => { - const response = await axiosClient.post(url, body); +// const rateLimitAwarePost = async (url: string, body: unknown, retryCount = 0) => { +// const response = await axiosClient.post(url, body); - if (await isRateLimited(response)) { - if (retryCount < rateLimitRetryCount) { - console.info( - `Hit rate limit on post, retry count is ${retryCount} / ${rateLimitRetryCount}, retrying` - ); - await sleep(rateLimitSleepInterval); - return await rateLimitAwarePost(url, body, retryCount + 1); - } - } +// if (await isRateLimited(response)) { +// if (retryCount < rateLimitRetryCount) { +// console.info( +// `Hit rate limit on post, retry count is ${retryCount} / ${rateLimitRetryCount}, retrying` +// ); +// await sleep(rateLimitSleepInterval); +// return await rateLimitAwarePost(url, body, retryCount + 1); +// } +// } - return response; -}; +// return response; +// }; export const rateLimitAwareDelete = async ( url: string, diff --git a/src/services/fileStorage/courseItemFileStorageService.ts b/src/services/fileStorage/courseItemFileStorageService.ts index f3c6998..ffb0353 100644 --- a/src/services/fileStorage/courseItemFileStorageService.ts +++ b/src/services/fileStorage/courseItemFileStorageService.ts @@ -120,7 +120,7 @@ export const courseItemFileStorageService = { ); const markdownDictionary: { - [key in CourseItemType]: () => string; + [_key in CourseItemType]: () => string; } = { Assignment: () => assignmentMarkdownSerializer.toMarkdown(item as LocalAssignment), diff --git a/src/services/fileStorage/lectureFileStorageService.ts b/src/services/fileStorage/lectureFileStorageService.ts index cdb6bd3..45aea98 100644 --- a/src/services/fileStorage/lectureFileStorageService.ts +++ b/src/services/fileStorage/lectureFileStorageService.ts @@ -102,6 +102,7 @@ export async function deleteLecture( await fs.access(lecturePath); // throws error if no file await fs.unlink(lecturePath); console.log(`File deleted: ${lecturePath}`); + // eslint-disable-next-line @typescript-eslint/no-explicit-any } catch (error: any) { if (error?.code === "ENOENT") { console.log(`Cannot delete lecture, file does not exist: ${lecturePath}`); diff --git a/src/services/fileStorage/settingsFileStorageService.ts b/src/services/fileStorage/settingsFileStorageService.ts index 3aa9812..5c2a4a2 100644 --- a/src/services/fileStorage/settingsFileStorageService.ts +++ b/src/services/fileStorage/settingsFileStorageService.ts @@ -75,7 +75,7 @@ export const settingsFileStorageService = { const courseDirectory = path.join(basePath, courseName); const settingsPath = path.join(courseDirectory, "settings.yml"); - const { name, ...settingsWithoutName } = settings; + const { name: _, ...settingsWithoutName } = settings; const settingsMarkdown = localCourseYamlUtils.settingsToYaml(settingsWithoutName); diff --git a/src/services/htmlMarkdownUtils.ts b/src/services/htmlMarkdownUtils.ts index 97936e5..ed3209c 100644 --- a/src/services/htmlMarkdownUtils.ts +++ b/src/services/htmlMarkdownUtils.ts @@ -3,7 +3,6 @@ import { marked } from "marked"; import DOMPurify from "isomorphic-dompurify"; import { LocalCourseSettings } from "@/models/local/localCourseSettings"; import markedKatex from "marked-katex-extension"; -import toast from "react-hot-toast"; marked.use( markedKatex({ diff --git a/src/services/serverFunctions/TrpcProvider.tsx b/src/services/serverFunctions/TrpcProvider.tsx index 339cf7b..c89151b 100644 --- a/src/services/serverFunctions/TrpcProvider.tsx +++ b/src/services/serverFunctions/TrpcProvider.tsx @@ -2,7 +2,7 @@ import { useState } from "react"; import superjson from "superjson"; import { httpBatchLink } from "@trpc/client"; -import { trpc } from "./trpcClient"; +import { trpc, TRPCProvider } from "./trpcClient"; import { getQueryClient } from "@/app/providersQueryClientUtils"; import { isServer } from "@tanstack/react-query"; @@ -13,6 +13,7 @@ export default function TrpcProvider({ }) { const url = isServer ? "http://localhost:3000/api/trpc/" : "/api/trpc"; + const queryClient = getQueryClient(); const [trpcClient] = useState(() => trpc.createClient({ links: [ @@ -25,9 +26,14 @@ export default function TrpcProvider({ }) ); + // return ( + // + // {children} + // + // ); return ( - + {children} - + ); } diff --git a/src/services/serverFunctions/router/directoriesRouter.ts b/src/services/serverFunctions/router/directoriesRouter.ts index 3298364..0950387 100644 --- a/src/services/serverFunctions/router/directoriesRouter.ts +++ b/src/services/serverFunctions/router/directoriesRouter.ts @@ -1,8 +1,6 @@ import publicProcedure from "../procedures/public"; -import { z } from "zod"; import { router } from "../trpcSetup"; import { fileStorageService } from "@/services/fileStorage/fileStorageService"; -import { zodLocalAssignment } from "@/models/local/assignment/localAssignment"; export const directoriesRouter = router({ getEmptyDirectories: publicProcedure.query(async () => { diff --git a/src/services/serverFunctions/router/settingsRouter.ts b/src/services/serverFunctions/router/settingsRouter.ts index 45ff3c7..0d59cb3 100644 --- a/src/services/serverFunctions/router/settingsRouter.ts +++ b/src/services/serverFunctions/router/settingsRouter.ts @@ -3,7 +3,6 @@ import { z } from "zod"; import { router } from "../trpcSetup"; import { fileStorageService } from "@/services/fileStorage/fileStorageService"; import { zodLocalCourseSettings } from "@/models/local/localCourseSettings"; -import { trpc } from "../trpcClient"; import { getLectures, updateLecture, diff --git a/src/services/tests/fileStorage.test.ts b/src/services/tests/fileStorage.test.ts index 9d7f11b..235a6c2 100644 --- a/src/services/tests/fileStorage.test.ts +++ b/src/services/tests/fileStorage.test.ts @@ -13,7 +13,7 @@ describe("FileStorageTests", () => { try { await fs.access(storageDirectory); await fs.rm(storageDirectory, { recursive: true }); - } catch (error) {} + } catch {} await fs.mkdir(storageDirectory, { recursive: true }); }); diff --git a/src/services/tests/fileStorageParsingErrors.test.ts b/src/services/tests/fileStorageParsingErrors.test.ts index e56b763..3ec76b1 100644 --- a/src/services/tests/fileStorageParsingErrors.test.ts +++ b/src/services/tests/fileStorageParsingErrors.test.ts @@ -10,7 +10,7 @@ describe("FileStorageTests", () => { try { await fs.access(storageDirectory); await fs.rm(storageDirectory, { recursive: true }); - } catch (error) {} + } catch {} await fs.mkdir(storageDirectory, { recursive: true }); }); @@ -75,7 +75,7 @@ a) truthy // `${basePath}/${courseName}/${moduleName}/quizzes/testQuiz.md`, // invalidQuizMarkdown // ); - + // const invalidReasons = await fileStorageService.quizzes.getInvalidQuizzes( // courseName, // moduleName diff --git a/src/services/utils/queryClient.tsx b/src/services/utils/queryClient.tsx index 47fdd7e..eaf3858 100644 --- a/src/services/utils/queryClient.tsx +++ b/src/services/utils/queryClient.tsx @@ -1,49 +1,50 @@ -import toast, { ErrorIcon, CheckmarkIcon } from "react-hot-toast"; +import toast, { CheckmarkIcon } from "react-hot-toast"; import { ReactNode } from "react"; -import { MutationCache, QueryCache, QueryClient } from "@tanstack/react-query"; -const addErrorAsToast = async (error: any) => { - console.error("error from toast", error); - const message = getErrorMessage(error); +// const addErrorAsToast = async (error: unknown) => { +// console.error("error from toast", error); +// const message = getErrorMessage(error); - toast( - (t: any) => ( -
-
- -
-
-
{message}
- -
-
- -
-
- ), - { - duration: Infinity, - } - ); -}; +// toast( +// (t) => ( +//
+//
+// +//
+//
+//
{message}
+// +//
+//
+// +//
+//
+// ), +// { +// duration: Infinity, +// } +// ); +// }; +// eslint-disable-next-line @typescript-eslint/no-explicit-any export function getErrorMessage(error: any) { if (error?.response?.status === 422) { console.log(error.response.data.detail); const serializationMessages = error.response.data.detail.map( + // eslint-disable-next-line @typescript-eslint/no-explicit-any (d: any) => `${d.type} - ${d.loc[1]}` ); return `Deserialization error on request:\n${serializationMessages.join( @@ -66,12 +67,8 @@ export function createInfoToast( children: ReactNode, onClose: () => void = () => {} ) { - const closeHandler = (t: any) => { - toast.dismiss(t.id); - onClose(); - }; toast( - (t: any) => ( + (t) => (
@@ -79,7 +76,10 @@ export function createInfoToast(
{children}