From efed1c0edbf93987c551952a03c9c4b3c461d819 Mon Sep 17 00:00:00 2001 From: doprz <52579214+doprz@users.noreply.github.com> Date: Thu, 21 Mar 2024 13:19:40 -0500 Subject: [PATCH] feat: enable TS strict mode (#168) * feat: enable TS strict mode * fix: strict TS errors * fix: strict TS errors * fix: strict TS errors * fix: strict TS errors * fix: strict TS errors * fix: strict TS errors * fix: strict TS errors * fix: strict TS errors * fix: colors bug with default * fix: strict TS errors * fix: strict TS errors * fix: strict TS errors * fix: strict TS errors * fix: strict TS errors * fix: strict TS errors * fix: strict TS errors * fix: strict TS errors * fix: strict TS errors * fix: strict TS errors * fix: strict TS errors * fix: text type errors * fix: strict TS errors * fix: strict TS errors * fix: strict TS errors - add definite assignment assertion * fix: strict TS errors - add definite assignment assertion * fix: strict TS errors * fix: strict TS errors * fix: strict TS errors * fix: strict TS errors * fix: strict TS errors * fix: strict TS errors * fix(ESLint): error on no-explicit-any * fix: type annotations for any types * fix: strict TS errors * fix: strict TS errors * fix: strict TS errors * fix: strict TS errors (and remove packages) * fix: strict TS errors * fix: strict TS errors * fix: strict TS errors * fix: strict TS errors * fix: strict TS errors * fix: strict TS errors * fix: strict TS errors * feat: enable React.StrictMode * fix: strict TS errors (done!) * fix: build error * fix: replace no-explicit-any assertions * refactor: cleanup * refactor: more cleanup * style: prettier --------- Co-authored-by: Lukas Zenick Co-authored-by: Razboy20 --- .eslintrc.cjs | 3 +- README.md | 2 +- package.json | 5 +- pnpm-lock.yaml | 1146 +++-------------- src/debug/index.tsx | 33 +- src/debug/reactDevtools.ts | 24 - src/pages/background/background.ts | 2 +- src/pages/background/handler/CESHandler.ts | 2 +- .../handler/calendarBackgroundHandler.ts | 28 +- src/pages/background/lib/renameSchedule.ts | 5 +- src/pages/background/lib/switchSchedule.ts | 3 +- src/pages/background/util/openDebugTab.ts | 2 +- src/pages/background/util/openNewTab.ts | 6 +- src/pages/calendar/index.tsx | 2 +- src/pages/options/index.tsx | 2 +- src/pages/popup/index.tsx | 2 +- src/shared/types/Course.ts | 26 +- src/shared/types/CourseMeeting.ts | 6 +- src/shared/types/CourseSchedule.ts | 28 +- src/shared/types/Instructor.ts | 14 +- src/shared/types/ThemeColors.ts | 3 +- src/shared/util/colors.ts | 54 +- src/shared/util/icons.tsx | 5 +- src/shared/util/themeColors.ts | 10 +- src/stories/components/Dropdown.stories.tsx | 3 +- src/stories/components/List.stories.tsx | 8 +- src/stories/components/Prompt.stories.tsx | 2 +- .../calendar/CalendarBottomBar.stories.tsx | 4 +- .../calendar/CalendarCourse.stories.tsx | 1 - .../calendar/CalendarCourseCell.stories.tsx | 5 +- src/views/components/CourseCatalogMain.tsx | 6 +- .../components/calendar/Calendar/Calendar.tsx | 14 +- .../CalendarCourseMeeting.tsx | 20 +- .../CourseCellColorPicker.tsx | 20 +- .../calendar/CalendarGrid/CalendarGrid.tsx | 27 +- src/views/components/calendar/utils.ts | 12 +- src/views/components/common/Button/Button.tsx | 2 +- src/views/components/common/Card/Card.tsx | 2 +- src/views/components/common/Chip/Chip.tsx | 2 +- src/views/components/common/Dialog/Dialog.tsx | 4 +- .../common/ExtensionRoot/ExtensionRoot.tsx | 8 +- .../components/common/Link/Link.module.scss | 11 - src/views/components/common/Link/Link.tsx | 13 +- src/views/components/common/List/List.tsx | 32 +- .../PopupCourseBlock/PopupCourseBlock.tsx | 3 +- .../ScheduleDropdown/ScheduleDropdown.tsx | 4 +- .../ScheduleListItem/ScheduleListItem.tsx | 2 +- src/views/components/common/Text/Text.tsx | 23 +- .../components/injected/AutoLoad/AutoLoad.tsx | 2 +- .../GradeDistribution.tsx | 71 +- .../HeadingAndActions.tsx | 19 +- .../RecruitmentBanner/RecruitmentBanner.tsx | 2 +- .../components/injected/TableRow/TableRow.tsx | 16 +- .../TableSubheading/TableSubheading.tsx | 4 +- src/views/hooks/useFlattenedCourseSchedule.ts | 53 +- src/views/hooks/useKeyPress.ts | 4 +- src/views/hooks/useSchedules.ts | 2 +- src/views/lib/CourseCatalogScraper.ts | 14 +- src/views/lib/database/queryDistribution.ts | 7 +- tsconfig.json | 4 + vite.config.ts | 32 +- 61 files changed, 562 insertions(+), 1309 deletions(-) delete mode 100644 src/debug/reactDevtools.ts delete mode 100644 src/views/components/common/Link/Link.module.scss diff --git a/.eslintrc.cjs b/.eslintrc.cjs index 81809735..460630dd 100644 --- a/.eslintrc.cjs +++ b/.eslintrc.cjs @@ -9,6 +9,7 @@ module.exports = { ignorePatterns: ['*.html', 'tsconfig.json'], extends: [ 'eslint:recommended', + 'plugin:@typescript-eslint/recommended', 'plugin:react/recommended', 'plugin:react-hooks/recommended', 'plugin:storybook/recommended', @@ -164,7 +165,7 @@ module.exports = { ], }, ], - '@typescript-eslint/no-explicit-any': 'off', + '@typescript-eslint/no-explicit-any': 'error', '@typescript-eslint/no-unused-vars': 'warn', '@typescript-eslint/naming-convention': 'off', '@typescript-eslint/space-before-function-paren': 'off', diff --git a/README.md b/README.md index edf46315..7167a2ea 100644 --- a/README.md +++ b/README.md @@ -41,7 +41,7 @@ This extension, UT Registration Plus (UTRP), tries to streamline most of the unn - Run `pnpm dev` > [!NOTE] -> Injected content such as extension content on UT pages is not properly styled, and are missing class stylings. When developing for these pages, use `pnpm build -w` to build and watch for changes. This will ensure you are seeing an accurate representation of the extension. +> Injected content such as extension content on UT pages is not properly styled, and are missing class stylings. When developing for these pages, use `NODE_ENV='development' pnpm run dev build --mode development -w` to build and watch for changes. This will ensure you are seeing an accurate representation of the extension. ### Production Builds diff --git a/package.json b/package.json index b5c68178..d9276420 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,6 @@ "test:ui": "vitest --ui", "coverage": "vitest run --coverage", "preview": "vite preview", - "devtools": "react-devtools", "preinstall": "npx only-allow pnpm", "storybook": "storybook dev -p 6006", "build-storybook": "storybook build", @@ -37,7 +36,6 @@ "husky": "^9.0.11", "nanoid": "^5.0.6", "react": "^18.2.0", - "react-devtools-core": "^5.0.0", "react-dom": "^18.2.0", "sass": "^1.71.1", "sql.js": "1.10.2" @@ -102,9 +100,8 @@ "postcss": "^8.4.35", "prettier": "^3.2.5", "react-dev-utils": "^12.0.1", - "react-devtools": "^5.0.0", "storybook": "^7.6.17", - "typescript": "^5.3.3", + "typescript": "^5.4.3", "unocss": "^0.58.6", "unocss-preset-primitives": "0.0.2-beta.0", "unplugin-icons": "^0.18.5", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e13f988c..a57b1484 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -52,9 +52,6 @@ dependencies: react: specifier: ^18.2.0 version: 18.2.0 - react-devtools-core: - specifier: ^5.0.0 - version: 5.0.0 react-dom: specifier: ^18.2.0 version: 18.2.0(react@18.2.0) @@ -68,7 +65,7 @@ dependencies: devDependencies: '@commitlint/cli': specifier: ^18.6.1 - version: 18.6.1(@types/node@20.11.24)(typescript@5.3.3) + version: 18.6.1(@types/node@20.11.24)(typescript@5.4.3) '@commitlint/config-conventional': specifier: ^18.6.2 version: 18.6.2 @@ -98,16 +95,16 @@ devDependencies: version: 7.6.17(@types/react-dom@18.2.19)(@types/react@18.2.61)(react-dom@18.2.0)(react@18.2.0) '@storybook/react': specifier: ^7.6.17 - version: 7.6.17(react-dom@18.2.0)(react@18.2.0)(typescript@5.3.3) + version: 7.6.17(react-dom@18.2.0)(react@18.2.0)(typescript@5.4.3) '@storybook/react-vite': specifier: ^7.6.17 - version: 7.6.17(react-dom@18.2.0)(react@18.2.0)(typescript@5.3.3)(vite@5.1.4) + version: 7.6.17(react-dom@18.2.0)(react@18.2.0)(typescript@5.4.3)(vite@5.1.4) '@storybook/test': specifier: ^7.6.17 version: 7.6.17(vitest@1.3.1) '@svgr/core': specifier: ^8.1.0 - version: 8.1.0(typescript@5.3.3) + version: 8.1.0(typescript@5.4.3) '@svgr/plugin-jsx': specifier: ^8.1.0 version: 8.1.0(@svgr/core@8.1.0) @@ -134,13 +131,13 @@ devDependencies: version: 1.4.9 '@typescript-eslint/eslint-plugin': specifier: ^6.21.0 - version: 6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.57.0)(typescript@5.3.3) + version: 6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.57.0)(typescript@5.4.3) '@typescript-eslint/parser': specifier: ^6.21.0 - version: 6.21.0(eslint@8.57.0)(typescript@5.3.3) + version: 6.21.0(eslint@8.57.0)(typescript@5.4.3) '@unocss/eslint-config': specifier: ^0.58.6 - version: 0.58.6(eslint@8.57.0)(typescript@5.3.3) + version: 0.58.6(eslint@8.57.0)(typescript@5.4.3) '@unocss/postcss': specifier: ^0.58.6 version: 0.58.6(postcss@8.4.35) @@ -230,7 +227,7 @@ devDependencies: version: 12.0.0(eslint@8.57.0) eslint-plugin-storybook: specifier: ^0.6.15 - version: 0.6.15(eslint@8.57.0)(typescript@5.3.3) + version: 0.6.15(eslint@8.57.0)(typescript@5.4.3) path: specifier: ^0.12.7 version: 0.12.7 @@ -242,16 +239,13 @@ devDependencies: version: 3.2.5 react-dev-utils: specifier: ^12.0.1 - version: 12.0.1(eslint@8.57.0)(typescript@5.3.3)(webpack@5.90.3) - react-devtools: - specifier: ^5.0.0 - version: 5.0.0 + version: 12.0.1(eslint@8.57.0)(typescript@5.4.3)(webpack@5.90.3) storybook: specifier: ^7.6.17 version: 7.6.17 typescript: - specifier: ^5.3.3 - version: 5.3.3 + specifier: ^5.4.3 + version: 5.4.3 unocss: specifier: ^0.58.6 version: 0.58.6(postcss@8.4.35)(vite@5.1.4) @@ -1581,14 +1575,14 @@ packages: dev: true optional: true - /@commitlint/cli@18.6.1(@types/node@20.11.24)(typescript@5.3.3): + /@commitlint/cli@18.6.1(@types/node@20.11.24)(typescript@5.4.3): resolution: {integrity: sha512-5IDE0a+lWGdkOvKH892HHAZgbAjcj1mT5QrfA/SVbLJV/BbBMGyKN0W5mhgjekPJJwEQdVNvhl9PwUacY58Usw==} engines: {node: '>=v18'} hasBin: true dependencies: '@commitlint/format': 18.6.1 '@commitlint/lint': 18.6.1 - '@commitlint/load': 18.6.1(@types/node@20.11.24)(typescript@5.3.3) + '@commitlint/load': 18.6.1(@types/node@20.11.24)(typescript@5.4.3) '@commitlint/read': 18.6.1 '@commitlint/types': 18.6.1 execa: 5.1.1 @@ -1660,7 +1654,7 @@ packages: '@commitlint/types': 18.6.1 dev: true - /@commitlint/load@18.6.1(@types/node@20.11.24)(typescript@5.3.3): + /@commitlint/load@18.6.1(@types/node@20.11.24)(typescript@5.4.3): resolution: {integrity: sha512-p26x8734tSXUHoAw0ERIiHyW4RaI4Bj99D8YgUlVV9SedLf8hlWAfyIFhHRIhfPngLlCe0QYOdRKYFt8gy56TA==} engines: {node: '>=v18'} dependencies: @@ -1669,8 +1663,8 @@ packages: '@commitlint/resolve-extends': 18.6.1 '@commitlint/types': 18.6.1 chalk: 4.1.2 - cosmiconfig: 8.3.6(typescript@5.3.3) - cosmiconfig-typescript-loader: 5.0.0(@types/node@20.11.24)(cosmiconfig@8.3.6)(typescript@5.3.3) + cosmiconfig: 8.3.6(typescript@5.4.3) + cosmiconfig-typescript-loader: 5.0.0(@types/node@20.11.24)(cosmiconfig@8.3.6)(typescript@5.4.3) lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 lodash.uniq: 4.5.0 @@ -1783,23 +1777,6 @@ packages: engines: {node: '>=10.0.0'} dev: true - /@electron/get@2.0.3: - resolution: {integrity: sha512-Qkzpg2s9GnVV2I2BjRksUi43U5e6+zaQMcjoJy0C+C5oxaKl+fmckGDQFtRpZpZV0NQekuZZ+tGz7EA9TVnQtQ==} - engines: {node: '>=12'} - dependencies: - debug: 4.3.4 - env-paths: 2.2.1 - fs-extra: 8.1.0 - got: 11.8.6 - progress: 2.0.3 - semver: 6.3.1 - sumchecker: 3.0.1 - optionalDependencies: - global-agent: 3.0.0 - transitivePeerDependencies: - - supports-color - dev: true - /@emotion/use-insertion-effect-with-fallbacks@1.0.1(react@18.2.0): resolution: {integrity: sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==} peerDependencies: @@ -2438,7 +2415,7 @@ packages: chalk: 4.1.2 dev: true - /@joshwooding/vite-plugin-react-docgen-typescript@0.3.0(typescript@5.3.3)(vite@5.1.4): + /@joshwooding/vite-plugin-react-docgen-typescript@0.3.0(typescript@5.4.3)(vite@5.1.4): resolution: {integrity: sha512-2D6y7fNvFmsLmRt6UCOFJPvFoPMJGT0Uh1Wg0RaigUp7kdQPs6yYn8Dmx6GZkOH/NW0yMTwRz/p0SRMMRo50vA==} peerDependencies: typescript: '>= 4.3.x' @@ -2450,8 +2427,8 @@ packages: glob: 7.2.3 glob-promise: 4.2.2(glob@7.2.3) magic-string: 0.27.0 - react-docgen-typescript: 2.2.2(typescript@5.3.3) - typescript: 5.3.3 + react-docgen-typescript: 2.2.2(typescript@5.4.3) + typescript: 5.4.3 vite: 5.1.4(@types/node@20.11.24)(sass@1.71.1) dev: true @@ -2471,8 +2448,8 @@ packages: resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} engines: {node: '>=6.0.0'} - /@jridgewell/source-map@0.3.6: - resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==} + /@jridgewell/source-map@0.3.5: + resolution: {integrity: sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==} dependencies: '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 @@ -3138,92 +3115,92 @@ packages: estree-walker: 2.0.2 picomatch: 2.3.1 - /@rollup/rollup-android-arm-eabi@4.12.0: - resolution: {integrity: sha512-+ac02NL/2TCKRrJu2wffk1kZ+RyqxVUlbjSagNgPm94frxtr+XDL12E5Ll1enWskLrtrZ2r8L3wED1orIibV/w==} + /@rollup/rollup-android-arm-eabi@4.13.0: + resolution: {integrity: sha512-5ZYPOuaAqEH/W3gYsRkxQATBW3Ii1MfaT4EQstTnLKViLi2gLSQmlmtTpGucNP3sXEpOiI5tdGhjdE111ekyEg==} cpu: [arm] os: [android] requiresBuild: true optional: true - /@rollup/rollup-android-arm64@4.12.0: - resolution: {integrity: sha512-OBqcX2BMe6nvjQ0Nyp7cC90cnumt8PXmO7Dp3gfAju/6YwG0Tj74z1vKrfRz7qAv23nBcYM8BCbhrsWqO7PzQQ==} + /@rollup/rollup-android-arm64@4.13.0: + resolution: {integrity: sha512-BSbaCmn8ZadK3UAQdlauSvtaJjhlDEjS5hEVVIN3A4bbl3X+otyf/kOJV08bYiRxfejP3DXFzO2jz3G20107+Q==} cpu: [arm64] os: [android] requiresBuild: true optional: true - /@rollup/rollup-darwin-arm64@4.12.0: - resolution: {integrity: sha512-X64tZd8dRE/QTrBIEs63kaOBG0b5GVEd3ccoLtyf6IdXtHdh8h+I56C2yC3PtC9Ucnv0CpNFJLqKFVgCYe0lOQ==} + /@rollup/rollup-darwin-arm64@4.13.0: + resolution: {integrity: sha512-Ovf2evVaP6sW5Ut0GHyUSOqA6tVKfrTHddtmxGQc1CTQa1Cw3/KMCDEEICZBbyppcwnhMwcDce9ZRxdWRpVd6g==} cpu: [arm64] os: [darwin] requiresBuild: true optional: true - /@rollup/rollup-darwin-x64@4.12.0: - resolution: {integrity: sha512-cc71KUZoVbUJmGP2cOuiZ9HSOP14AzBAThn3OU+9LcA1+IUqswJyR1cAJj3Mg55HbjZP6OLAIscbQsQLrpgTOg==} + /@rollup/rollup-darwin-x64@4.13.0: + resolution: {integrity: sha512-U+Jcxm89UTK592vZ2J9st9ajRv/hrwHdnvyuJpa5A2ngGSVHypigidkQJP+YiGL6JODiUeMzkqQzbCG3At81Gg==} cpu: [x64] os: [darwin] requiresBuild: true optional: true - /@rollup/rollup-linux-arm-gnueabihf@4.12.0: - resolution: {integrity: sha512-a6w/Y3hyyO6GlpKL2xJ4IOh/7d+APaqLYdMf86xnczU3nurFTaVN9s9jOXQg97BE4nYm/7Ga51rjec5nfRdrvA==} + /@rollup/rollup-linux-arm-gnueabihf@4.13.0: + resolution: {integrity: sha512-8wZidaUJUTIR5T4vRS22VkSMOVooG0F4N+JSwQXWSRiC6yfEsFMLTYRFHvby5mFFuExHa/yAp9juSphQQJAijQ==} cpu: [arm] os: [linux] requiresBuild: true optional: true - /@rollup/rollup-linux-arm64-gnu@4.12.0: - resolution: {integrity: sha512-0fZBq27b+D7Ar5CQMofVN8sggOVhEtzFUwOwPppQt0k+VR+7UHMZZY4y+64WJ06XOhBTKXtQB/Sv0NwQMXyNAA==} + /@rollup/rollup-linux-arm64-gnu@4.13.0: + resolution: {integrity: sha512-Iu0Kno1vrD7zHQDxOmvweqLkAzjxEVqNhUIXBsZ8hu8Oak7/5VTPrxOEZXYC1nmrBVJp0ZcL2E7lSuuOVaE3+w==} cpu: [arm64] os: [linux] requiresBuild: true optional: true - /@rollup/rollup-linux-arm64-musl@4.12.0: - resolution: {integrity: sha512-eTvzUS3hhhlgeAv6bfigekzWZjaEX9xP9HhxB0Dvrdbkk5w/b+1Sxct2ZuDxNJKzsRStSq1EaEkVSEe7A7ipgQ==} + /@rollup/rollup-linux-arm64-musl@4.13.0: + resolution: {integrity: sha512-C31QrW47llgVyrRjIwiOwsHFcaIwmkKi3PCroQY5aVq4H0A5v/vVVAtFsI1nfBngtoRpeREvZOkIhmRwUKkAdw==} cpu: [arm64] os: [linux] requiresBuild: true optional: true - /@rollup/rollup-linux-riscv64-gnu@4.12.0: - resolution: {integrity: sha512-ix+qAB9qmrCRiaO71VFfY8rkiAZJL8zQRXveS27HS+pKdjwUfEhqo2+YF2oI+H/22Xsiski+qqwIBxVewLK7sw==} + /@rollup/rollup-linux-riscv64-gnu@4.13.0: + resolution: {integrity: sha512-Oq90dtMHvthFOPMl7pt7KmxzX7E71AfyIhh+cPhLY9oko97Zf2C9tt/XJD4RgxhaGeAraAXDtqxvKE1y/j35lA==} cpu: [riscv64] os: [linux] requiresBuild: true optional: true - /@rollup/rollup-linux-x64-gnu@4.12.0: - resolution: {integrity: sha512-TenQhZVOtw/3qKOPa7d+QgkeM6xY0LtwzR8OplmyL5LrgTWIXpTQg2Q2ycBf8jm+SFW2Wt/DTn1gf7nFp3ssVA==} + /@rollup/rollup-linux-x64-gnu@4.13.0: + resolution: {integrity: sha512-yUD/8wMffnTKuiIsl6xU+4IA8UNhQ/f1sAnQebmE/lyQ8abjsVyDkyRkWop0kdMhKMprpNIhPmYlCxgHrPoXoA==} cpu: [x64] os: [linux] requiresBuild: true optional: true - /@rollup/rollup-linux-x64-musl@4.12.0: - resolution: {integrity: sha512-LfFdRhNnW0zdMvdCb5FNuWlls2WbbSridJvxOvYWgSBOYZtgBfW9UGNJG//rwMqTX1xQE9BAodvMH9tAusKDUw==} + /@rollup/rollup-linux-x64-musl@4.13.0: + resolution: {integrity: sha512-9RyNqoFNdF0vu/qqX63fKotBh43fJQeYC98hCaf89DYQpv+xu0D8QFSOS0biA7cGuqJFOc1bJ+m2rhhsKcw1hw==} cpu: [x64] os: [linux] requiresBuild: true optional: true - /@rollup/rollup-win32-arm64-msvc@4.12.0: - resolution: {integrity: sha512-JPDxovheWNp6d7AHCgsUlkuCKvtu3RB55iNEkaQcf0ttsDU/JZF+iQnYcQJSk/7PtT4mjjVG8N1kpwnI9SLYaw==} + /@rollup/rollup-win32-arm64-msvc@4.13.0: + resolution: {integrity: sha512-46ue8ymtm/5PUU6pCvjlic0z82qWkxv54GTJZgHrQUuZnVH+tvvSP0LsozIDsCBFO4VjJ13N68wqrKSeScUKdA==} cpu: [arm64] os: [win32] requiresBuild: true optional: true - /@rollup/rollup-win32-ia32-msvc@4.12.0: - resolution: {integrity: sha512-fjtuvMWRGJn1oZacG8IPnzIV6GF2/XG+h71FKn76OYFqySXInJtseAqdprVTDTyqPxQOG9Exak5/E9Z3+EJ8ZA==} + /@rollup/rollup-win32-ia32-msvc@4.13.0: + resolution: {integrity: sha512-P5/MqLdLSlqxbeuJ3YDeX37srC8mCflSyTrUsgbU1c/U9j6l2g2GiIdYaGD9QjdMQPMSgYm7hgg0551wHyIluw==} cpu: [ia32] os: [win32] requiresBuild: true optional: true - /@rollup/rollup-win32-x64-msvc@4.12.0: - resolution: {integrity: sha512-ZYmr5mS2wd4Dew/JjT0Fqi2NPB/ZhZ2VvPp7SmvPZb4Y1CG/LRcS6tcRo2cYU7zLK5A7cdbhWnnWmUjoI4qapg==} + /@rollup/rollup-win32-x64-msvc@4.13.0: + resolution: {integrity: sha512-UKXUQNbO3DOhzLRwHSpa0HnhhCgNODvfoPWv2FCXme8N/ANFfhIPMGuOT+QuKd16+B5yxZ0HdpNlqPvTMS1qfw==} cpu: [x64] os: [win32] requiresBuild: true @@ -3233,11 +3210,6 @@ packages: resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} dev: true - /@sindresorhus/is@4.6.0: - resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} - engines: {node: '>=10'} - dev: true - /@storybook/addon-actions@7.6.17: resolution: {integrity: sha512-TBphs4v6LRfyTpFo/WINF0TkMaE3rrNog7wW5mbz6n0j8o53kDN4o9ZEcygSL5zQX43CAaghQTeDCss7ueG7ZQ==} dependencies: @@ -3480,7 +3452,7 @@ packages: - supports-color dev: true - /@storybook/builder-vite@7.6.17(typescript@5.3.3)(vite@5.1.4): + /@storybook/builder-vite@7.6.17(typescript@5.4.3)(vite@5.1.4): resolution: {integrity: sha512-2Q32qalI401EsKKr9Hkk8TAOcHEerqwsjCpQgTNJnCu6GgCVKoVUcb99oRbR9Vyg0xh+jb19XiWqqQujFtLYlQ==} peerDependencies: '@preact/preset-vite': '*' @@ -3511,7 +3483,7 @@ packages: fs-extra: 11.2.0 magic-string: 0.30.7 rollup: 3.29.4 - typescript: 5.3.3 + typescript: 5.4.3 vite: 5.1.4(@types/node@20.11.24)(sass@1.71.1) transitivePeerDependencies: - encoding @@ -3868,7 +3840,7 @@ packages: react-dom: 18.2.0(react@18.2.0) dev: true - /@storybook/react-vite@7.6.17(react-dom@18.2.0)(react@18.2.0)(typescript@5.3.3)(vite@5.1.4): + /@storybook/react-vite@7.6.17(react-dom@18.2.0)(react@18.2.0)(typescript@5.4.3)(vite@5.1.4): resolution: {integrity: sha512-4dIm3CuRl44X1TLzN3WoZh/bChzJF7Ud28li9atj9C8db0bb/y0zl8cahrsRFoR7/LyfqdOVLqaztrnA5SsWfg==} engines: {node: '>=16'} peerDependencies: @@ -3876,10 +3848,10 @@ packages: react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 vite: ^3.0.0 || ^4.0.0 || ^5.0.0 dependencies: - '@joshwooding/vite-plugin-react-docgen-typescript': 0.3.0(typescript@5.3.3)(vite@5.1.4) + '@joshwooding/vite-plugin-react-docgen-typescript': 0.3.0(typescript@5.4.3)(vite@5.1.4) '@rollup/pluginutils': 5.1.0 - '@storybook/builder-vite': 7.6.17(typescript@5.3.3)(vite@5.1.4) - '@storybook/react': 7.6.17(react-dom@18.2.0)(react@18.2.0)(typescript@5.3.3) + '@storybook/builder-vite': 7.6.17(typescript@5.4.3)(vite@5.1.4) + '@storybook/react': 7.6.17(react-dom@18.2.0)(react@18.2.0)(typescript@5.4.3) '@vitejs/plugin-react': 3.1.0(vite@5.1.4) magic-string: 0.30.7 react: 18.2.0 @@ -3895,7 +3867,7 @@ packages: - vite-plugin-glimmerx dev: true - /@storybook/react@7.6.17(react-dom@18.2.0)(react@18.2.0)(typescript@5.3.3): + /@storybook/react@7.6.17(react-dom@18.2.0)(react@18.2.0)(typescript@5.4.3): resolution: {integrity: sha512-lVqzQSU03rRJWYW+gK2gq6mSo3/qtnVICY8B8oP7gc36jVu4ksDIu45bTfukM618ODkUZy0vZe6T4engK3azjA==} engines: {node: '>=16.0.0'} peerDependencies: @@ -3928,7 +3900,7 @@ packages: react-element-to-jsx-string: 15.0.0(react-dom@18.2.0)(react@18.2.0) ts-dedent: 2.2.0 type-fest: 2.19.0 - typescript: 5.3.3 + typescript: 5.4.3 util-deprecate: 1.0.2 transitivePeerDependencies: - encoding @@ -4094,14 +4066,14 @@ packages: '@svgr/babel-plugin-transform-svg-component': 8.0.0(@babel/core@7.24.0) dev: true - /@svgr/core@8.1.0(typescript@5.3.3): + /@svgr/core@8.1.0(typescript@5.4.3): resolution: {integrity: sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==} engines: {node: '>=14'} dependencies: '@babel/core': 7.24.0 '@svgr/babel-preset': 8.1.0(@babel/core@7.24.0) camelcase: 6.3.0 - cosmiconfig: 8.3.6(typescript@5.3.3) + cosmiconfig: 8.3.6(typescript@5.4.3) snake-case: 3.0.4 transitivePeerDependencies: - supports-color @@ -4124,7 +4096,7 @@ packages: dependencies: '@babel/core': 7.24.0 '@svgr/babel-preset': 8.1.0(@babel/core@7.24.0) - '@svgr/core': 8.1.0(typescript@5.3.3) + '@svgr/core': 8.1.0(typescript@5.4.3) '@svgr/hast-util-to-babel-ast': 8.0.0 svg-parser: 2.0.4 transitivePeerDependencies: @@ -4254,13 +4226,6 @@ packages: resolution: {integrity: sha512-myfUej5naTBWnqOCc/MdVOLVjXUXtIA+NpDrDBKJtLLg2shUjBu3cZmB/85RyitKc55+lUUyl7oRfLOvkr2hsw==} dev: true - /@szmarczak/http-timer@4.0.6: - resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} - engines: {node: '>=10'} - dependencies: - defer-to-connect: 2.0.1 - dev: true - /@tanstack/react-virtual@3.1.3(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-YCzcbF/Ws/uZ0q3Z6fagH+JVhx4JLvbSflgldMgLsuvB8aXjZLLb3HvrEVxY480F9wFlBiXlvQxOyXb5ENPrNA==} peerDependencies: @@ -4372,15 +4337,6 @@ packages: '@types/node': 20.11.24 dev: true - /@types/cacheable-request@6.0.3: - resolution: {integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==} - dependencies: - '@types/http-cache-semantics': 4.0.4 - '@types/keyv': 3.1.4 - '@types/node': 20.11.24 - '@types/responselike': 1.0.3 - dev: true - /@types/chai@4.3.12: resolution: {integrity: sha512-zNKDHG/1yxm8Il6uCCVsm+dRdEsJlFoDu73X17y09bId6UwoYww+vFBsAcRzl8knM1sab3Dp1VRikFQwDOtDDw==} dev: true @@ -4511,10 +4467,6 @@ packages: hoist-non-react-statics: 3.3.2 dev: false - /@types/http-cache-semantics@4.0.4: - resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==} - dev: true - /@types/http-errors@2.0.4: resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==} dev: true @@ -4543,12 +4495,6 @@ packages: resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} dev: true - /@types/keyv@3.1.4: - resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} - dependencies: - '@types/node': 20.11.24 - dev: true - /@types/lodash@4.14.202: resolution: {integrity: sha512-OvlIYQK9tNneDlS0VN54LLd5uiPCBOp7gS5Z0f1mjoJYBrtStzgmJBxONW3U6OZqdtNzZPmn9BS/7WI7BFFcFQ==} dev: true @@ -4584,10 +4530,6 @@ packages: form-data: 4.0.0 dev: true - /@types/node@16.18.86: - resolution: {integrity: sha512-QMvdZf+ZTSiv7gspwhqbfB7Y5DmbYgCsUnakS8Ul9uRbJQehDKaM7SL+GbcDS003Lh7VK4YlelHsRm9HCv26eA==} - dev: true - /@types/node@18.19.21: resolution: {integrity: sha512-2Q2NeB6BmiTFQi4DHBzncSoq/cJMLDdhPaAoJFnFCyD9a8VPZRf7a1GAwp1Edb7ROaZc5Jz/tnZyL6EsWMRaqw==} dependencies: @@ -4599,12 +4541,6 @@ packages: dependencies: undici-types: 5.26.5 - /@types/node@20.11.27: - resolution: {integrity: sha512-qyUZfMnCg1KEz57r7pzFtSGt49f6RPkPBis3Vo4PbS7roQEDn22hiHzl/Lo1q4i4hDEgBJmBF/NTNg2XR0HbFg==} - dependencies: - undici-types: 5.26.5 - dev: true - /@types/normalize-package-data@2.4.4: resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} dev: true @@ -4651,12 +4587,6 @@ packages: resolution: {integrity: sha512-A4STmOXPhMUtHH+S6ymgE2GiBSMqf4oTvcQZMcHzokuTLVYzXTB8ttjcgxOVaAp2lGwEdzZ0J+cRbbeevQj1UQ==} dev: true - /@types/responselike@1.0.3: - resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} - dependencies: - '@types/node': 20.11.24 - dev: true - /@types/scheduler@0.16.8: resolution: {integrity: sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==} @@ -4712,15 +4642,7 @@ packages: '@types/yargs-parser': 21.0.3 dev: true - /@types/yauzl@2.10.3: - resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} - requiresBuild: true - dependencies: - '@types/node': 20.11.24 - dev: true - optional: true - - /@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.57.0)(typescript@5.3.3): + /@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.57.0)(typescript@5.4.3): resolution: {integrity: sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: @@ -4732,10 +4654,10 @@ packages: optional: true dependencies: '@eslint-community/regexpp': 4.10.0 - '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.3.3) + '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.4.3) '@typescript-eslint/scope-manager': 6.21.0 - '@typescript-eslint/type-utils': 6.21.0(eslint@8.57.0)(typescript@5.3.3) - '@typescript-eslint/utils': 6.21.0(eslint@8.57.0)(typescript@5.3.3) + '@typescript-eslint/type-utils': 6.21.0(eslint@8.57.0)(typescript@5.4.3) + '@typescript-eslint/utils': 6.21.0(eslint@8.57.0)(typescript@5.4.3) '@typescript-eslint/visitor-keys': 6.21.0 debug: 4.3.4 eslint: 8.57.0 @@ -4743,13 +4665,13 @@ packages: ignore: 5.3.1 natural-compare: 1.4.0 semver: 7.6.0 - ts-api-utils: 1.2.1(typescript@5.3.3) - typescript: 5.3.3 + ts-api-utils: 1.2.1(typescript@5.4.3) + typescript: 5.4.3 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.3.3): + /@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.3): resolution: {integrity: sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: @@ -4761,11 +4683,11 @@ packages: dependencies: '@typescript-eslint/scope-manager': 6.21.0 '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.3.3) + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.4.3) '@typescript-eslint/visitor-keys': 6.21.0 debug: 4.3.4 eslint: 8.57.0 - typescript: 5.3.3 + typescript: 5.4.3 transitivePeerDependencies: - supports-color dev: true @@ -4794,7 +4716,7 @@ packages: '@typescript-eslint/visitor-keys': 7.2.0 dev: true - /@typescript-eslint/type-utils@6.21.0(eslint@8.57.0)(typescript@5.3.3): + /@typescript-eslint/type-utils@6.21.0(eslint@8.57.0)(typescript@5.4.3): resolution: {integrity: sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: @@ -4804,12 +4726,12 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.3.3) - '@typescript-eslint/utils': 6.21.0(eslint@8.57.0)(typescript@5.3.3) + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.4.3) + '@typescript-eslint/utils': 6.21.0(eslint@8.57.0)(typescript@5.4.3) debug: 4.3.4 eslint: 8.57.0 - ts-api-utils: 1.2.1(typescript@5.3.3) - typescript: 5.3.3 + ts-api-utils: 1.2.1(typescript@5.4.3) + typescript: 5.4.3 transitivePeerDependencies: - supports-color dev: true @@ -4829,7 +4751,7 @@ packages: engines: {node: ^16.0.0 || >=18.0.0} dev: true - /@typescript-eslint/typescript-estree@5.62.0(typescript@5.3.3): + /@typescript-eslint/typescript-estree@5.62.0(typescript@5.4.3): resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -4844,13 +4766,13 @@ packages: globby: 11.1.0 is-glob: 4.0.3 semver: 7.6.0 - tsutils: 3.21.0(typescript@5.3.3) - typescript: 5.3.3 + tsutils: 3.21.0(typescript@5.4.3) + typescript: 5.4.3 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/typescript-estree@6.21.0(typescript@5.3.3): + /@typescript-eslint/typescript-estree@6.21.0(typescript@5.4.3): resolution: {integrity: sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: @@ -4866,13 +4788,13 @@ packages: is-glob: 4.0.3 minimatch: 9.0.3 semver: 7.6.0 - ts-api-utils: 1.2.1(typescript@5.3.3) - typescript: 5.3.3 + ts-api-utils: 1.2.1(typescript@5.4.3) + typescript: 5.4.3 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/typescript-estree@7.2.0(typescript@5.3.3): + /@typescript-eslint/typescript-estree@7.2.0(typescript@5.4.3): resolution: {integrity: sha512-cyxS5WQQCoBwSakpMrvMXuMDEbhOo9bNHHrNcEWis6XHx6KF518tkF1wBvKIn/tpq5ZpUYK7Bdklu8qY0MsFIA==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: @@ -4888,13 +4810,13 @@ packages: is-glob: 4.0.3 minimatch: 9.0.3 semver: 7.6.0 - ts-api-utils: 1.2.1(typescript@5.3.3) - typescript: 5.3.3 + ts-api-utils: 1.2.1(typescript@5.4.3) + typescript: 5.4.3 transitivePeerDependencies: - supports-color dev: true - /@typescript-eslint/utils@5.62.0(eslint@8.57.0)(typescript@5.3.3): + /@typescript-eslint/utils@5.62.0(eslint@8.57.0)(typescript@5.4.3): resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -4905,7 +4827,7 @@ packages: '@types/semver': 7.5.8 '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.3.3) + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.4.3) eslint: 8.57.0 eslint-scope: 5.1.1 semver: 7.6.0 @@ -4914,7 +4836,7 @@ packages: - typescript dev: true - /@typescript-eslint/utils@6.21.0(eslint@8.57.0)(typescript@5.3.3): + /@typescript-eslint/utils@6.21.0(eslint@8.57.0)(typescript@5.4.3): resolution: {integrity: sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: @@ -4925,7 +4847,7 @@ packages: '@types/semver': 7.5.8 '@typescript-eslint/scope-manager': 6.21.0 '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.3.3) + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.4.3) eslint: 8.57.0 semver: 7.6.0 transitivePeerDependencies: @@ -4933,7 +4855,7 @@ packages: - typescript dev: true - /@typescript-eslint/utils@7.2.0(eslint@8.57.0)(typescript@5.3.3): + /@typescript-eslint/utils@7.2.0(eslint@8.57.0)(typescript@5.4.3): resolution: {integrity: sha512-YfHpnMAGb1Eekpm3XRK8hcMwGLGsnT6L+7b2XyRv6ouDuJU1tZir1GS2i0+VXRatMwSI1/UfcyPe53ADkU+IuA==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: @@ -4944,7 +4866,7 @@ packages: '@types/semver': 7.5.8 '@typescript-eslint/scope-manager': 7.2.0 '@typescript-eslint/types': 7.2.0 - '@typescript-eslint/typescript-estree': 7.2.0(typescript@5.3.3) + '@typescript-eslint/typescript-estree': 7.2.0(typescript@5.4.3) eslint: 8.57.0 semver: 7.6.0 transitivePeerDependencies: @@ -5032,22 +4954,22 @@ packages: /@unocss/core@0.58.6: resolution: {integrity: sha512-m87iuENM/PLqLKnfE2mJbpfzj7NQ99LP2go0r+x5X4kXKppyGRJNQg6RIW3AqTS22jup1YPgd62UNXvvRtHtww==} - /@unocss/eslint-config@0.58.6(eslint@8.57.0)(typescript@5.3.3): + /@unocss/eslint-config@0.58.6(eslint@8.57.0)(typescript@5.4.3): resolution: {integrity: sha512-0usx9oxBx8vYy58XKE71OsRROfcE84FRgtu87Bmmdd0c9i02RgwYiUlhRMO7R3OCdkDF1bBrFMnNAyl/o6NDKg==} engines: {node: '>=14'} dependencies: - '@unocss/eslint-plugin': 0.58.6(eslint@8.57.0)(typescript@5.3.3) + '@unocss/eslint-plugin': 0.58.6(eslint@8.57.0)(typescript@5.4.3) transitivePeerDependencies: - eslint - supports-color - typescript dev: true - /@unocss/eslint-plugin@0.58.6(eslint@8.57.0)(typescript@5.3.3): + /@unocss/eslint-plugin@0.58.6(eslint@8.57.0)(typescript@5.4.3): resolution: {integrity: sha512-GxLU5TZWz8O2AT5FbtP0gHafrYfDc/27yAUvT2OGe0nOH9z3k5moWU7vQzsxx+U13rWNk14ztO5i1krmDGuo8w==} engines: {node: '>=14'} dependencies: - '@typescript-eslint/utils': 7.2.0(eslint@8.57.0)(typescript@5.3.3) + '@typescript-eslint/utils': 7.2.0(eslint@8.57.0)(typescript@5.4.3) '@unocss/config': 0.58.6 '@unocss/core': 0.58.6 magic-string: 0.30.8 @@ -5311,7 +5233,7 @@ packages: /@vitest/snapshot@1.3.1: resolution: {integrity: sha512-EF++BZbt6RZmOlE3SuTPu/NfwBF6q4ABS37HHXzs2LUVPBLx2QoY/K0fKpRChSo8eLiuxcbCVfqKgx/dplCDuQ==} dependencies: - magic-string: 0.30.8 + magic-string: 0.30.7 pathe: 1.1.2 pretty-format: 29.7.0 dev: true @@ -5360,8 +5282,8 @@ packages: pretty-format: 29.7.0 dev: true - /@webassemblyjs/ast@1.12.1: - resolution: {integrity: sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==} + /@webassemblyjs/ast@1.11.6: + resolution: {integrity: sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==} dependencies: '@webassemblyjs/helper-numbers': 1.11.6 '@webassemblyjs/helper-wasm-bytecode': 1.11.6 @@ -5375,8 +5297,8 @@ packages: resolution: {integrity: sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==} dev: true - /@webassemblyjs/helper-buffer@1.12.1: - resolution: {integrity: sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==} + /@webassemblyjs/helper-buffer@1.11.6: + resolution: {integrity: sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==} dev: true /@webassemblyjs/helper-numbers@1.11.6: @@ -5391,13 +5313,13 @@ packages: resolution: {integrity: sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==} dev: true - /@webassemblyjs/helper-wasm-section@1.12.1: - resolution: {integrity: sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==} + /@webassemblyjs/helper-wasm-section@1.11.6: + resolution: {integrity: sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==} dependencies: - '@webassemblyjs/ast': 1.12.1 - '@webassemblyjs/helper-buffer': 1.12.1 + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/helper-buffer': 1.11.6 '@webassemblyjs/helper-wasm-bytecode': 1.11.6 - '@webassemblyjs/wasm-gen': 1.12.1 + '@webassemblyjs/wasm-gen': 1.11.6 dev: true /@webassemblyjs/ieee754@1.11.6: @@ -5416,42 +5338,42 @@ packages: resolution: {integrity: sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==} dev: true - /@webassemblyjs/wasm-edit@1.12.1: - resolution: {integrity: sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==} + /@webassemblyjs/wasm-edit@1.11.6: + resolution: {integrity: sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==} dependencies: - '@webassemblyjs/ast': 1.12.1 - '@webassemblyjs/helper-buffer': 1.12.1 + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/helper-buffer': 1.11.6 '@webassemblyjs/helper-wasm-bytecode': 1.11.6 - '@webassemblyjs/helper-wasm-section': 1.12.1 - '@webassemblyjs/wasm-gen': 1.12.1 - '@webassemblyjs/wasm-opt': 1.12.1 - '@webassemblyjs/wasm-parser': 1.12.1 - '@webassemblyjs/wast-printer': 1.12.1 + '@webassemblyjs/helper-wasm-section': 1.11.6 + '@webassemblyjs/wasm-gen': 1.11.6 + '@webassemblyjs/wasm-opt': 1.11.6 + '@webassemblyjs/wasm-parser': 1.11.6 + '@webassemblyjs/wast-printer': 1.11.6 dev: true - /@webassemblyjs/wasm-gen@1.12.1: - resolution: {integrity: sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==} + /@webassemblyjs/wasm-gen@1.11.6: + resolution: {integrity: sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==} dependencies: - '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/ast': 1.11.6 '@webassemblyjs/helper-wasm-bytecode': 1.11.6 '@webassemblyjs/ieee754': 1.11.6 '@webassemblyjs/leb128': 1.11.6 '@webassemblyjs/utf8': 1.11.6 dev: true - /@webassemblyjs/wasm-opt@1.12.1: - resolution: {integrity: sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==} + /@webassemblyjs/wasm-opt@1.11.6: + resolution: {integrity: sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==} dependencies: - '@webassemblyjs/ast': 1.12.1 - '@webassemblyjs/helper-buffer': 1.12.1 - '@webassemblyjs/wasm-gen': 1.12.1 - '@webassemblyjs/wasm-parser': 1.12.1 + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/helper-buffer': 1.11.6 + '@webassemblyjs/wasm-gen': 1.11.6 + '@webassemblyjs/wasm-parser': 1.11.6 dev: true - /@webassemblyjs/wasm-parser@1.12.1: - resolution: {integrity: sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==} + /@webassemblyjs/wasm-parser@1.11.6: + resolution: {integrity: sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==} dependencies: - '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/ast': 1.11.6 '@webassemblyjs/helper-api-error': 1.11.6 '@webassemblyjs/helper-wasm-bytecode': 1.11.6 '@webassemblyjs/ieee754': 1.11.6 @@ -5459,10 +5381,10 @@ packages: '@webassemblyjs/utf8': 1.11.6 dev: true - /@webassemblyjs/wast-printer@1.12.1: - resolution: {integrity: sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==} + /@webassemblyjs/wast-printer@1.11.6: + resolution: {integrity: sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==} dependencies: - '@webassemblyjs/ast': 1.12.1 + '@webassemblyjs/ast': 1.11.6 '@xtuc/long': 4.2.2 dev: true @@ -5609,17 +5531,6 @@ packages: uri-js: 4.4.1 dev: true - /ansi-align@2.0.0: - resolution: {integrity: sha512-TdlOggdA/zURfMYa7ABC66j+oqfMew58KpJMbUlH3bcZP1b+cBHIHDDn5uH9INsxrHBPjsqM0tDB4jPTF/vgJA==} - dependencies: - string-width: 2.1.1 - dev: true - - /ansi-regex@3.0.1: - resolution: {integrity: sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==} - engines: {node: '>=4'} - dev: true - /ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} @@ -5996,25 +5907,6 @@ packages: resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} dev: true - /boolean@3.2.0: - resolution: {integrity: sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==} - requiresBuild: true - dev: true - optional: true - - /boxen@1.3.0: - resolution: {integrity: sha512-TNPjfTr432qx7yOjQyaXm3dSR0MH9vXp7eT1BFSl/C51g+EFnOR9hTg1IreahGBmDNCehscshe45f+C1TBZbLw==} - engines: {node: '>=4'} - dependencies: - ansi-align: 2.0.0 - camelcase: 4.1.0 - chalk: 2.4.2 - cli-boxes: 1.0.0 - string-width: 2.1.1 - term-size: 1.2.0 - widest-line: 2.0.1 - dev: true - /bplist-parser@0.2.0: resolution: {integrity: sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==} engines: {node: '>= 5.10.0'} @@ -6109,24 +6001,6 @@ packages: engines: {node: '>=8'} dev: true - /cacheable-lookup@5.0.4: - resolution: {integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==} - engines: {node: '>=10.6.0'} - dev: true - - /cacheable-request@7.0.4: - resolution: {integrity: sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==} - engines: {node: '>=8'} - dependencies: - clone-response: 1.0.3 - get-stream: 5.2.0 - http-cache-semantics: 4.1.1 - keyv: 4.5.4 - lowercase-keys: 2.0.0 - normalize-url: 6.1.0 - responselike: 2.0.1 - dev: true - /call-bind@1.0.7: resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} engines: {node: '>= 0.4'} @@ -6152,11 +6026,6 @@ packages: quick-lru: 4.0.1 dev: true - /camelcase@4.1.0: - resolution: {integrity: sha512-FxAv7HpHrXbh3aPo4o2qxHay2lkLY3x5Mw3KeE4KQE8ysVfziWeRZDwcjauvwBSGEC/nXUPzZy8zeh4HokqOnw==} - engines: {node: '>=4'} - dev: true - /camelcase@5.3.1: resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} engines: {node: '>=6'} @@ -6179,11 +6048,6 @@ packages: /caniuse-lite@1.0.30001591: resolution: {integrity: sha512-PCzRMei/vXjJyL5mJtzNiUCKP59dm8Apqc3PH8gJkMnMXZGox93RbE76jHsmLwmIo6/3nsYIpJtx0O7u5PqFuQ==} - /capture-stack-trace@1.0.2: - resolution: {integrity: sha512-X/WM2UQs6VMHUtjUDnZTRI+i1crWteJySFzr9UpGoQa4WQffXVTTXuekjl7TjZRlcF2XfjgITT0HxZ9RnxeT0w==} - engines: {node: '>=0.10.0'} - dev: true - /chai@4.4.1: resolution: {integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==} engines: {node: '>=4'} @@ -6304,10 +6168,6 @@ packages: engines: {node: '>=6.0'} dev: true - /ci-info@1.6.0: - resolution: {integrity: sha512-vsGdkwSCDpWmP80ncATX7iea5DWQemg1UgCW5J8tqjU3lYw4FBYuj89J0CTVomA7BEfvSZd84GmHko+MxFQU2A==} - dev: true - /ci-info@3.9.0: resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} engines: {node: '>=8'} @@ -6324,11 +6184,6 @@ packages: engines: {node: '>=6'} dev: true - /cli-boxes@1.0.0: - resolution: {integrity: sha512-3Fo5wu8Ytle8q9iCzS4D2MWVL2X7JVWRiS1BnXbTFDhS9c/REkM9vd1AmabsoZoY5/dGi5TT9iKL8Kb6DeBRQg==} - engines: {node: '>=0.10.0'} - dev: true - /cli-cursor@3.1.0: resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} engines: {node: '>=8'} @@ -6372,12 +6227,6 @@ packages: shallow-clone: 3.0.1 dev: true - /clone-response@1.0.3: - resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==} - dependencies: - mimic-response: 1.0.1 - dev: true - /clone@1.0.4: resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} engines: {node: '>=0.8'} @@ -6488,18 +6337,6 @@ packages: typedarray: 0.0.6 dev: true - /configstore@3.1.5: - resolution: {integrity: sha512-nlOhI4+fdzoK5xmJ+NY+1gZK56bwEaWZr8fYuXohZ9Vkc1o3a4T/R3M+yE/w7x/ZVJ1zF8c+oaOvF0dztdUgmA==} - engines: {node: '>=4'} - dependencies: - dot-prop: 4.2.1 - graceful-fs: 4.2.11 - make-dir: 1.3.0 - unique-string: 1.0.0 - write-file-atomic: 2.4.3 - xdg-basedir: 3.0.0 - dev: true - /confusing-browser-globals@1.0.11: resolution: {integrity: sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==} dev: true @@ -6584,7 +6421,7 @@ packages: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} dev: true - /cosmiconfig-typescript-loader@5.0.0(@types/node@20.11.24)(cosmiconfig@8.3.6)(typescript@5.3.3): + /cosmiconfig-typescript-loader@5.0.0(@types/node@20.11.24)(cosmiconfig@8.3.6)(typescript@5.4.3): resolution: {integrity: sha512-+8cK7jRAReYkMwMiG+bxhcNKiHJDM6bR9FD/nGBXOWdMLuYawjF5cGrtLilJ+LGd3ZjCXnJjR5DkfWPoIVlqJA==} engines: {node: '>=v16'} peerDependencies: @@ -6593,9 +6430,9 @@ packages: typescript: '>=4' dependencies: '@types/node': 20.11.24 - cosmiconfig: 8.3.6(typescript@5.3.3) + cosmiconfig: 8.3.6(typescript@5.4.3) jiti: 1.21.0 - typescript: 5.3.3 + typescript: 5.4.3 dev: true /cosmiconfig@6.0.0: @@ -6609,7 +6446,7 @@ packages: yaml: 1.10.2 dev: true - /cosmiconfig@8.3.6(typescript@5.3.3): + /cosmiconfig@8.3.6(typescript@5.4.3): resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} engines: {node: '>=14'} peerDependencies: @@ -6622,22 +6459,7 @@ packages: js-yaml: 4.1.0 parse-json: 5.2.0 path-type: 4.0.0 - typescript: 5.3.3 - dev: true - - /create-error-class@3.0.2: - resolution: {integrity: sha512-gYTKKexFO3kh200H1Nit76sRwRtOY32vQd3jpAQKpLtZqyNsSQNfI4N7o3eP2wUjV35pTWKRYqFUDBvUha/Pkw==} - engines: {node: '>=0.10.0'} - dependencies: - capture-stack-trace: 1.0.2 - dev: true - - /cross-spawn@5.1.0: - resolution: {integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==} - dependencies: - lru-cache: 4.1.5 - shebang-command: 1.2.0 - which: 1.3.1 + typescript: 5.4.3 dev: true /cross-spawn@7.0.3: @@ -6649,11 +6471,6 @@ packages: which: 2.0.2 dev: true - /crypto-random-string@1.0.0: - resolution: {integrity: sha512-GsVpkFPlycH7/fRR7Dhcmnoii54gV1nz7y4CWyeFS14N+JVBBhY+r8amRHE4BwSYal7BPTDp8isvAlCxyFt3Hg==} - engines: {node: '>=4'} - dev: true - /crypto-random-string@2.0.0: resolution: {integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==} engines: {node: '>=8'} @@ -6852,13 +6669,6 @@ packages: engines: {node: '>=0.10.0'} dev: true - /decompress-response@6.0.0: - resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} - engines: {node: '>=10'} - dependencies: - mimic-response: 3.1.0 - dev: true - /deep-eql@4.1.3: resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} engines: {node: '>=6'} @@ -6890,11 +6700,6 @@ packages: which-typed-array: 1.1.14 dev: true - /deep-extend@0.6.0: - resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} - engines: {node: '>=4.0.0'} - dev: true - /deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} dev: true @@ -6931,11 +6736,6 @@ packages: clone: 1.0.4 dev: true - /defer-to-connect@2.0.1: - resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} - engines: {node: '>=10'} - dev: true - /define-data-property@1.1.4: resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} engines: {node: '>= 0.4'} @@ -7014,12 +6814,6 @@ packages: resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} dev: true - /detect-node@2.1.0: - resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} - requiresBuild: true - dev: true - optional: true - /detect-package-manager@2.0.1: resolution: {integrity: sha512-j/lJHyoLlWi6G1LDdLgvUtz60Zo5GEj+sVYtTVXnYLDPuzgC3llMxonXym9zIwhhUII8vjdw0LXxavpLqTbl1A==} engines: {node: '>=12'} @@ -7116,13 +6910,6 @@ packages: tslib: 2.6.2 dev: true - /dot-prop@4.2.1: - resolution: {integrity: sha512-l0p4+mIuJIua0mhxGoh4a+iNL9bmeK5DvnSVQa6T0OhrVmaEa1XScX5Etc673FePCJOArq/4Pa2cLGODUWTPOQ==} - engines: {node: '>=4'} - dependencies: - is-obj: 1.0.1 - dev: true - /dot-prop@5.3.0: resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} engines: {node: '>=8'} @@ -7140,10 +6927,6 @@ packages: engines: {node: '>=12'} dev: true - /duplexer3@0.1.5: - resolution: {integrity: sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==} - dev: true - /duplexer@0.1.2: resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} @@ -7175,19 +6958,6 @@ packages: /electron-to-chromium@1.4.690: resolution: {integrity: sha512-+2OAGjUx68xElQhydpcbqH50hE8Vs2K6TkAeLhICYfndb67CVH0UsZaijmRUE3rHlIxU1u0jxwhgVe6fK3YANA==} - /electron@23.3.13: - resolution: {integrity: sha512-BaXtHEb+KYKLouUXlUVDa/lj9pj4F5kiE0kwFdJV84Y2EU7euIDgPthfKtchhr5MVHmjtavRMIV/zAwEiSQ9rQ==} - engines: {node: '>= 12.20.55'} - hasBin: true - requiresBuild: true - dependencies: - '@electron/get': 2.0.3 - '@types/node': 16.18.86 - extract-zip: 2.0.1 - transitivePeerDependencies: - - supports-color - dev: true - /emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} dev: true @@ -7215,24 +6985,11 @@ packages: tapable: 2.2.1 dev: true - /enhanced-resolve@5.16.0: - resolution: {integrity: sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA==} - engines: {node: '>=10.13.0'} - dependencies: - graceful-fs: 4.2.11 - tapable: 2.2.1 - dev: true - /entities@4.5.0: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} dev: true - /env-paths@2.2.1: - resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} - engines: {node: '>=6'} - dev: true - /envinfo@7.11.1: resolution: {integrity: sha512-8PiZgZNIB4q/Lw4AhOvAfB/ityHAd2bli3lESSWmWSzSsl5dKpy5N1d1Rfkd2teq/g9xN90lc6o98DOjMeYHpg==} engines: {node: '>=4'} @@ -7375,12 +7132,6 @@ packages: is-symbol: 1.0.4 dev: true - /es6-error@4.1.1: - resolution: {integrity: sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==} - requiresBuild: true - dev: true - optional: true - /esbuild-plugin-alias@0.2.1: resolution: {integrity: sha512-jyfL/pwPqaFXyKnj8lP8iLk6Z0m099uXR45aSN8Av1XD4vhvQutxxPzgA2bTcAwQpa1zCXDcWOlhFgyP3GKqhQ==} dev: true @@ -7508,8 +7259,8 @@ packages: eslint: ^7.32.0 || ^8.2.0 eslint-plugin-import: ^2.25.3 dependencies: - '@typescript-eslint/eslint-plugin': 6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.57.0)(typescript@5.3.3) - '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.3.3) + '@typescript-eslint/eslint-plugin': 6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.57.0)(typescript@5.4.3) + '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.4.3) eslint: 8.57.0 eslint-config-airbnb-base: 15.0.0(eslint-plugin-import@2.29.1)(eslint@8.57.0) eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.21.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0) @@ -7598,7 +7349,7 @@ packages: eslint-import-resolver-webpack: optional: true dependencies: - '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.3.3) + '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.4.3) debug: 3.2.7 eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 @@ -7625,7 +7376,7 @@ packages: '@typescript-eslint/parser': optional: true dependencies: - '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.3.3) + '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.4.3) array-includes: 3.1.7 array.prototype.findlastindex: 1.2.4 array.prototype.flat: 1.3.2 @@ -7687,7 +7438,7 @@ packages: emoji-regex: 9.2.2 es-iterator-helpers: 1.0.17 eslint: 8.57.0 - hasown: 2.0.2 + hasown: 2.0.1 jsx-ast-utils: 3.3.5 language-tags: 1.0.9 minimatch: 3.1.2 @@ -7770,14 +7521,14 @@ packages: eslint: 8.57.0 dev: true - /eslint-plugin-storybook@0.6.15(eslint@8.57.0)(typescript@5.3.3): + /eslint-plugin-storybook@0.6.15(eslint@8.57.0)(typescript@5.4.3): resolution: {integrity: sha512-lAGqVAJGob47Griu29KXYowI4G7KwMoJDOkEip8ujikuDLxU+oWJ1l0WL6F2oDO4QiyUFXvtDkEkISMOPzo+7w==} engines: {node: 12.x || 14.x || >= 16} peerDependencies: eslint: '>=6' dependencies: '@storybook/csf': 0.0.1 - '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.3.3) + '@typescript-eslint/utils': 5.62.0(eslint@8.57.0)(typescript@5.4.3) eslint: 8.57.0 requireindex: 1.2.0 ts-dedent: 2.2.0 @@ -7917,19 +7668,6 @@ packages: engines: {node: '>=0.8.x'} dev: true - /execa@0.7.0: - resolution: {integrity: sha512-RztN09XglpYI7aBBrJCPW95jEH7YF1UEPOoX9yDhUTPdp7mK+CQvnLTuD10BNXZ3byLTu2uehZ8EcKT/4CGiFw==} - engines: {node: '>=4'} - dependencies: - cross-spawn: 5.1.0 - get-stream: 3.0.0 - is-stream: 1.1.0 - npm-run-path: 2.0.2 - p-finally: 1.0.0 - signal-exit: 3.0.7 - strip-eof: 1.0.0 - dev: true - /execa@5.1.1: resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} engines: {node: '>=10'} @@ -8015,20 +7753,6 @@ packages: - supports-color dev: true - /extract-zip@2.0.1: - resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==} - engines: {node: '>= 10.17.0'} - hasBin: true - dependencies: - debug: 4.3.4 - get-stream: 5.2.0 - yauzl: 2.10.0 - optionalDependencies: - '@types/yauzl': 2.10.3 - transitivePeerDependencies: - - supports-color - dev: true - /fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} dev: true @@ -8199,7 +7923,7 @@ packages: signal-exit: 4.1.0 dev: true - /fork-ts-checker-webpack-plugin@6.5.3(eslint@8.57.0)(typescript@5.3.3)(webpack@5.90.3): + /fork-ts-checker-webpack-plugin@6.5.3(eslint@8.57.0)(typescript@5.4.3)(webpack@5.90.3): resolution: {integrity: sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ==} engines: {node: '>=10', yarn: '>=1.0.0'} peerDependencies: @@ -8227,7 +7951,7 @@ packages: schema-utils: 2.7.0 semver: 7.6.0 tapable: 1.1.3 - typescript: 5.3.3 + typescript: 5.4.3 webpack: 5.90.3(esbuild@0.18.20) dev: true @@ -8285,15 +8009,6 @@ packages: universalify: 2.0.1 dev: true - /fs-extra@8.1.0: - resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} - engines: {node: '>=6 <7 || >=8'} - dependencies: - graceful-fs: 4.2.11 - jsonfile: 4.0.0 - universalify: 0.1.2 - dev: true - /fs-extra@9.1.0: resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==} engines: {node: '>=10'} @@ -8388,18 +8103,6 @@ packages: engines: {node: '>=8'} dev: true - /get-stream@3.0.0: - resolution: {integrity: sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==} - engines: {node: '>=4'} - dev: true - - /get-stream@5.2.0: - resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} - engines: {node: '>=8'} - dependencies: - pump: 3.0.0 - dev: true - /get-stream@6.0.1: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} engines: {node: '>=10'} @@ -8505,20 +8208,6 @@ packages: path-is-absolute: 1.0.1 dev: true - /global-agent@3.0.0: - resolution: {integrity: sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==} - engines: {node: '>=10.0'} - requiresBuild: true - dependencies: - boolean: 3.2.0 - es6-error: 4.1.1 - matcher: 3.0.0 - roarr: 2.15.4 - semver: 7.6.0 - serialize-error: 7.0.1 - dev: true - optional: true - /global-dirs@0.1.1: resolution: {integrity: sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==} engines: {node: '>=4'} @@ -8578,42 +8267,6 @@ packages: get-intrinsic: 1.2.4 dev: true - /got@11.8.6: - resolution: {integrity: sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==} - engines: {node: '>=10.19.0'} - dependencies: - '@sindresorhus/is': 4.6.0 - '@szmarczak/http-timer': 4.0.6 - '@types/cacheable-request': 6.0.3 - '@types/responselike': 1.0.3 - cacheable-lookup: 5.0.4 - cacheable-request: 7.0.4 - decompress-response: 6.0.0 - http2-wrapper: 1.0.3 - lowercase-keys: 2.0.0 - p-cancelable: 2.1.1 - responselike: 2.0.1 - dev: true - - /got@6.7.1: - resolution: {integrity: sha512-Y/K3EDuiQN9rTZhBvPRWMLXIKdeD1Rj0nzunfoi0Yyn5WBEbzxXKU9Ub2X41oZBagVWOBU3MuDonFMgPWQFnwg==} - engines: {node: '>=4'} - dependencies: - '@types/keyv': 3.1.4 - '@types/responselike': 1.0.3 - create-error-class: 3.0.2 - duplexer3: 0.1.5 - get-stream: 3.0.0 - is-redirect: 1.0.0 - is-retry-allowed: 1.2.0 - is-stream: 1.1.0 - lowercase-keys: 1.0.1 - safe-buffer: 5.2.1 - timed-out: 4.0.1 - unzip-response: 2.0.1 - url-parse-lax: 1.0.0 - dev: true - /graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} dev: true @@ -8701,13 +8354,6 @@ packages: function-bind: 1.1.2 dev: true - /hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} - engines: {node: '>= 0.4'} - dependencies: - function-bind: 1.1.2 - dev: true - /highcharts-react-official@3.2.1(highcharts@11.3.0)(react@18.2.0): resolution: {integrity: sha512-hyQTX7ezCxl7JqumaWiGsroGWalzh24GedQIgO3vJbkGOZ6ySRAltIYjfxhrq4HszJOySZegotEF7v+haQ75UA==} peerDependencies: @@ -8761,10 +8407,6 @@ packages: entities: 4.5.0 dev: true - /http-cache-semantics@4.1.1: - resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} - dev: true - /http-errors@2.0.0: resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} engines: {node: '>= 0.8'} @@ -8776,14 +8418,6 @@ packages: toidentifier: 1.0.1 dev: true - /http2-wrapper@1.0.3: - resolution: {integrity: sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==} - engines: {node: '>=10.19.0'} - dependencies: - quick-lru: 5.1.1 - resolve-alpn: 1.2.1 - dev: true - /https-proxy-agent@4.0.0: resolution: {integrity: sha512-zoDhWrkR3of1l9QAL8/scJZyLu8j/gBkcwcaQOZh7Gyh/+uJQzGVETdgT30akuwkpL8HTRfssqI3BZuV18teDg==} engines: {node: '>= 6.0.0'} @@ -8841,11 +8475,6 @@ packages: resolve-from: 4.0.0 dev: true - /import-lazy@2.1.0: - resolution: {integrity: sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A==} - engines: {node: '>=4'} - dev: true - /imurmurhash@0.1.4: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} @@ -8890,10 +8519,6 @@ packages: loose-envify: 1.4.0 dev: true - /ip@1.1.9: - resolution: {integrity: sha512-cyRxvOEpNHNtchU3Ln9KC/auJgup87llfQpQ+t5ghoC/UhL16SWzbueiCsdTnWmqAWl7LadfuwhlqmtOaqMHdQ==} - dev: true - /ip@2.0.1: resolution: {integrity: sha512-lJUL9imLTNi1ZfXT+DU6rBBdbiKGBuay9B6xGSPVjUeQwaH1RIGqef8RZkUtHioLmSNpPR5M4HVKJGm1j8FWVQ==} dev: true @@ -8967,13 +8592,6 @@ packages: engines: {node: '>= 0.4'} dev: true - /is-ci@1.2.1: - resolution: {integrity: sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==} - hasBin: true - dependencies: - ci-info: 1.6.0 - dev: true - /is-core-module@2.13.1: resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} dependencies: @@ -9013,11 +8631,6 @@ packages: call-bind: 1.0.7 dev: true - /is-fullwidth-code-point@2.0.0: - resolution: {integrity: sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==} - engines: {node: '>=4'} - dev: true - /is-fullwidth-code-point@3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} @@ -9049,14 +8662,6 @@ packages: is-docker: 3.0.0 dev: true - /is-installed-globally@0.1.0: - resolution: {integrity: sha512-ERNhMg+i/XgDwPIPF3u24qpajVreaiSuvpb1Uu0jugw7KKcxGyCX8cgp8P5fwTmAuXku6beDHHECdKArjlg7tw==} - engines: {node: '>=4'} - dependencies: - global-dirs: 0.1.1 - is-path-inside: 1.0.1 - dev: true - /is-interactive@1.0.0: resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} engines: {node: '>=8'} @@ -9079,11 +8684,6 @@ packages: engines: {node: '>= 0.4'} dev: true - /is-npm@1.0.0: - resolution: {integrity: sha512-9r39FIr3d+KD9SbX0sfMsHzb5PP3uimOiwr3YupUaUFG4W0l1U57Rx3utpttV7qz5U3jmrO5auUa04LU9pyHsg==} - engines: {node: '>=0.10.0'} - dev: true - /is-number-object@1.0.7: resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} engines: {node: '>= 0.4'} @@ -9095,11 +8695,6 @@ packages: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} - /is-obj@1.0.1: - resolution: {integrity: sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==} - engines: {node: '>=0.10.0'} - dev: true - /is-obj@2.0.0: resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} engines: {node: '>=8'} @@ -9110,13 +8705,6 @@ packages: engines: {node: '>=6'} dev: true - /is-path-inside@1.0.1: - resolution: {integrity: sha512-qhsCR/Esx4U4hg/9I19OVUAJkGWtjRYHMRgUMZE2TDdj+Ag+kttZanLupfddNyglzz50cUlmWzUaI37GDfNx/g==} - engines: {node: '>=0.10.0'} - dependencies: - path-is-inside: 1.0.2 - dev: true - /is-path-inside@3.0.3: resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} engines: {node: '>=8'} @@ -9139,11 +8727,6 @@ packages: engines: {node: '>=0.10.0'} dev: true - /is-redirect@1.0.0: - resolution: {integrity: sha512-cr/SlUEe5zOGmzvj9bUyC4LVvkNVAXu4GytXLNMr1pny+a65MpQ9IJzFHD5vi7FyJgb4qt27+eS3TuQnqB+RQw==} - engines: {node: '>=0.10.0'} - dev: true - /is-regex@1.1.4: resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} engines: {node: '>= 0.4'} @@ -9152,11 +8735,6 @@ packages: has-tostringtag: 1.0.2 dev: true - /is-retry-allowed@1.2.0: - resolution: {integrity: sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==} - engines: {node: '>=0.10.0'} - dev: true - /is-root@2.1.0: resolution: {integrity: sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==} engines: {node: '>=6'} @@ -9173,11 +8751,6 @@ packages: call-bind: 1.0.7 dev: true - /is-stream@1.1.0: - resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} - engines: {node: '>=0.10.0'} - dev: true - /is-stream@2.0.1: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} engines: {node: '>=8'} @@ -9385,7 +8958,7 @@ packages: resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} engines: {node: '>= 10.13.0'} dependencies: - '@types/node': 20.11.27 + '@types/node': 20.11.24 merge-stream: 2.0.0 supports-color: 8.1.1 dev: true @@ -9501,12 +9074,6 @@ packages: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} dev: true - /json-stringify-safe@5.0.1: - resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} - requiresBuild: true - dev: true - optional: true - /json5@1.0.2: resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} hasBin: true @@ -9522,12 +9089,6 @@ packages: /jsonc-parser@3.2.1: resolution: {integrity: sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==} - /jsonfile@4.0.0: - resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} - optionalDependencies: - graceful-fs: 4.2.11 - dev: true - /jsonfile@6.1.0: resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} dependencies: @@ -9582,13 +9143,6 @@ packages: language-subtag-registry: 0.3.22 dev: true - /latest-version@3.1.0: - resolution: {integrity: sha512-Be1YRHWWlZaSsrz2U+VInk+tO0EwLIyV+23RhWLINJYwg/UIikxjlj3MhH37/6/EDCAusjajvMkMMUXRaMWl/w==} - engines: {node: '>=4'} - dependencies: - package-json: 4.0.1 - dev: true - /lazy-universal-dotenv@4.0.0: resolution: {integrity: sha512-aXpZJRnTkpK6gQ/z4nk+ZBLd/Qdp118cvPruLSIQzQNRhKwEcdXCOzXuF55VDqIiuAaY3UGZ10DJtvZzDcvsxg==} engines: {node: '>=14.0.0'} @@ -9760,28 +9314,11 @@ packages: tslib: 2.6.2 dev: true - /lowercase-keys@1.0.1: - resolution: {integrity: sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==} - engines: {node: '>=0.10.0'} - dev: true - - /lowercase-keys@2.0.0: - resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} - engines: {node: '>=8'} - dev: true - /lru-cache@10.2.0: resolution: {integrity: sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==} engines: {node: 14 || >=16.14} dev: true - /lru-cache@4.1.5: - resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} - dependencies: - pseudomap: 1.0.2 - yallist: 2.1.2 - dev: true - /lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} dependencies: @@ -9834,13 +9371,6 @@ packages: source-map-js: 1.0.2 dev: true - /make-dir@1.3.0: - resolution: {integrity: sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==} - engines: {node: '>=4'} - dependencies: - pify: 3.0.0 - dev: true - /make-dir@2.1.0: resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} engines: {node: '>=6'} @@ -9892,15 +9422,6 @@ packages: react: 18.2.0 dev: true - /matcher@3.0.0: - resolution: {integrity: sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==} - engines: {node: '>=10'} - requiresBuild: true - dependencies: - escape-string-regexp: 4.0.0 - dev: true - optional: true - /mdast-util-definitions@4.0.0: resolution: {integrity: sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ==} dependencies: @@ -10020,16 +9541,6 @@ packages: engines: {node: '>=12'} dev: true - /mimic-response@1.0.1: - resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} - engines: {node: '>=4'} - dev: true - - /mimic-response@3.1.0: - resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} - engines: {node: '>=10'} - dev: true - /min-indent@1.0.1: resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} engines: {node: '>=4'} @@ -10222,18 +9733,6 @@ packages: engines: {node: '>=0.10.0'} dev: true - /normalize-url@6.1.0: - resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} - engines: {node: '>=10'} - dev: true - - /npm-run-path@2.0.2: - resolution: {integrity: sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==} - engines: {node: '>=4'} - dependencies: - path-key: 2.0.1 - dev: true - /npm-run-path@4.0.1: resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} engines: {node: '>=8'} @@ -10431,16 +9930,6 @@ packages: wcwidth: 1.0.1 dev: true - /p-cancelable@2.1.1: - resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==} - engines: {node: '>=8'} - dev: true - - /p-finally@1.0.0: - resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} - engines: {node: '>=4'} - dev: true - /p-limit@2.3.0: resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} engines: {node: '>=6'} @@ -10495,16 +9984,6 @@ packages: engines: {node: '>=6'} dev: true - /package-json@4.0.1: - resolution: {integrity: sha512-q/R5GrMek0vzgoomq6rm9OX+3PQve8sLwTirmK30YB3Cu0Bbt9OX9M/SIUnroN5BGJkzwGsFwDaRGD9EwBOlCA==} - engines: {node: '>=4'} - dependencies: - got: 6.7.1 - registry-auth-token: 3.4.0 - registry-url: 3.1.0 - semver: 5.7.2 - dev: true - /pako@0.2.9: resolution: {integrity: sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==} dev: true @@ -10559,15 +10038,6 @@ packages: engines: {node: '>=0.10.0'} dev: true - /path-is-inside@1.0.2: - resolution: {integrity: sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==} - dev: true - - /path-key@2.0.1: - resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} - engines: {node: '>=4'} - dev: true - /path-key@3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} @@ -10636,11 +10106,6 @@ packages: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} engines: {node: '>=8.6'} - /pify@3.0.0: - resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} - engines: {node: '>=4'} - dev: true - /pify@4.0.1: resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} engines: {node: '>=6'} @@ -11045,11 +10510,6 @@ packages: engines: {node: '>= 0.8.0'} dev: true - /prepend-http@1.0.4: - resolution: {integrity: sha512-PhmXi5XmoyKw1Un4E+opM2KcsJInDvKyuOumcjjw3waw86ZNjHwVUOOWLc4bCzLdcKNaWBH9e99sbWzDQsVaYg==} - engines: {node: '>=0.10.0'} - dev: true - /prettier-linter-helpers@1.0.0: resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} engines: {node: '>=6.0.0'} @@ -11134,10 +10594,6 @@ packages: resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} dev: true - /pseudomap@1.0.2: - resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} - dev: true - /pump@2.0.1: resolution: {integrity: sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==} dependencies: @@ -11212,11 +10668,6 @@ packages: engines: {node: '>=8'} dev: true - /quick-lru@5.1.1: - resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} - engines: {node: '>=10'} - dev: true - /raf-schd@4.0.3: resolution: {integrity: sha512-tQkJl2GRWh83ui2DiPTJz9wEiMN20syf+5oKfB03yYP7ioZcJwsIK8FjrtLwH1m7C7e+Tt2yYBlrOpdT+dyeIQ==} dev: false @@ -11246,16 +10697,6 @@ packages: unpipe: 1.0.0 dev: true - /rc@1.2.8: - resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} - hasBin: true - dependencies: - deep-extend: 0.6.0 - ini: 1.3.8 - minimist: 1.2.8 - strip-json-comments: 2.0.1 - dev: true - /react-colorful@5.6.1(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-1exovf0uGTGyq5mXQT0zgQ80uvj2PCwvF8zY1RN9/vbJVSjSo3fsB/4L3ObbF7u70NduSiK4xu4Y6q1MHoUGEw==} peerDependencies: @@ -11266,7 +10707,7 @@ packages: react-dom: 18.2.0(react@18.2.0) dev: true - /react-dev-utils@12.0.1(eslint@8.57.0)(typescript@5.3.3)(webpack@5.90.3): + /react-dev-utils@12.0.1(eslint@8.57.0)(typescript@5.4.3)(webpack@5.90.3): resolution: {integrity: sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ==} engines: {node: '>=14'} peerDependencies: @@ -11285,7 +10726,7 @@ packages: escape-string-regexp: 4.0.0 filesize: 8.0.7 find-up: 5.0.0 - fork-ts-checker-webpack-plugin: 6.5.3(eslint@8.57.0)(typescript@5.3.3)(webpack@5.90.3) + fork-ts-checker-webpack-plugin: 6.5.3(eslint@8.57.0)(typescript@5.4.3)(webpack@5.90.3) global-modules: 2.0.0 globby: 11.1.0 gzip-size: 6.0.0 @@ -11300,7 +10741,7 @@ packages: shell-quote: 1.8.1 strip-ansi: 6.0.1 text-table: 0.2.0 - typescript: 5.3.3 + typescript: 5.4.3 webpack: 5.90.3(esbuild@0.18.20) transitivePeerDependencies: - eslint @@ -11308,37 +10749,12 @@ packages: - vue-template-compiler dev: true - /react-devtools-core@5.0.0: - resolution: {integrity: sha512-SAAMLacNDfFjMJjmbXURNWtrTyARi9xTqGkY48Btw5cIWlr1wgxfWYZKxoUZav1qqmhbpgTzSmmF+cpMHGHY3A==} - dependencies: - shell-quote: 1.8.1 - ws: 7.5.9 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - /react-devtools@5.0.0: - resolution: {integrity: sha512-AN24OgEHaS06cbVYxTa/DH1B86TlKwIO483WIJ06jYfUL0QCv3oyX+FpP5mzAI4abcBNrtOORKsRsJ0JnhrEsg==} - hasBin: true - dependencies: - cross-spawn: 5.1.0 - electron: 23.3.13 - ip: 1.1.9 - minimist: 1.2.8 - react-devtools-core: 5.0.0 - update-notifier: 2.5.0 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - dev: true - - /react-docgen-typescript@2.2.2(typescript@5.3.3): + /react-docgen-typescript@2.2.2(typescript@5.4.3): resolution: {integrity: sha512-tvg2ZtOpOi6QDwsb3GZhOjDkkX0h8Z2gipvTg6OVMUyoYoURhEiRNePT8NZItTVCDh39JJHnLdfCOkzoLbFnTg==} peerDependencies: typescript: '>= 4.3.x' dependencies: - typescript: 5.3.3 + typescript: 5.4.3 dev: true /react-docgen@7.0.3: @@ -11633,20 +11049,6 @@ packages: unicode-match-property-value-ecmascript: 2.1.0 dev: true - /registry-auth-token@3.4.0: - resolution: {integrity: sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A==} - dependencies: - rc: 1.2.8 - safe-buffer: 5.2.1 - dev: true - - /registry-url@3.1.0: - resolution: {integrity: sha512-ZbgR5aZEdf4UKZVBPYIgaglBmSF2Hi94s2PcIHhRGFjKYu+chjJdYfHn4rt3hB6eCKLJ8giVIIfgMa1ehDfZKA==} - engines: {node: '>=0.10.0'} - dependencies: - rc: 1.2.8 - dev: true - /regjsparser@0.9.1: resolution: {integrity: sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==} hasBin: true @@ -11687,10 +11089,6 @@ packages: engines: {node: '>=0.10.5'} dev: true - /resolve-alpn@1.2.1: - resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} - dev: true - /resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} @@ -11730,12 +11128,6 @@ packages: supports-preserve-symlinks-flag: 1.0.0 dev: true - /responselike@2.0.1: - resolution: {integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==} - dependencies: - lowercase-keys: 2.0.0 - dev: true - /restore-cursor@3.1.0: resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} engines: {node: '>=8'} @@ -11769,20 +11161,6 @@ packages: glob: 7.2.3 dev: true - /roarr@2.15.4: - resolution: {integrity: sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==} - engines: {node: '>=8.0'} - requiresBuild: true - dependencies: - boolean: 3.2.0 - detect-node: 2.1.0 - globalthis: 1.0.3 - json-stringify-safe: 5.0.1 - semver-compare: 1.0.0 - sprintf-js: 1.1.3 - dev: true - optional: true - /rollup@2.78.1: resolution: {integrity: sha512-VeeCgtGi4P+o9hIg+xz4qQpRl6R401LWEXBmxYKOV4zlF82lyhgh2hTZnheFUbANE8l2A41F458iwj2vEYaXJg==} engines: {node: '>=10.0.0'} @@ -11799,26 +11177,26 @@ packages: fsevents: 2.3.3 dev: true - /rollup@4.12.0: - resolution: {integrity: sha512-wz66wn4t1OHIJw3+XU7mJJQV/2NAfw5OAk6G6Hoo3zcvz/XOfQ52Vgi+AN4Uxoxi0KBBwk2g8zPrTDA4btSB/Q==} + /rollup@4.13.0: + resolution: {integrity: sha512-3YegKemjoQnYKmsBlOHfMLVPPA5xLkQ8MHLLSw/fBrFaVkEayL51DilPpNNLq1exr98F2B1TzrV0FUlN3gWRPg==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true dependencies: '@types/estree': 1.0.5 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.12.0 - '@rollup/rollup-android-arm64': 4.12.0 - '@rollup/rollup-darwin-arm64': 4.12.0 - '@rollup/rollup-darwin-x64': 4.12.0 - '@rollup/rollup-linux-arm-gnueabihf': 4.12.0 - '@rollup/rollup-linux-arm64-gnu': 4.12.0 - '@rollup/rollup-linux-arm64-musl': 4.12.0 - '@rollup/rollup-linux-riscv64-gnu': 4.12.0 - '@rollup/rollup-linux-x64-gnu': 4.12.0 - '@rollup/rollup-linux-x64-musl': 4.12.0 - '@rollup/rollup-win32-arm64-msvc': 4.12.0 - '@rollup/rollup-win32-ia32-msvc': 4.12.0 - '@rollup/rollup-win32-x64-msvc': 4.12.0 + '@rollup/rollup-android-arm-eabi': 4.13.0 + '@rollup/rollup-android-arm64': 4.13.0 + '@rollup/rollup-darwin-arm64': 4.13.0 + '@rollup/rollup-darwin-x64': 4.13.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.13.0 + '@rollup/rollup-linux-arm64-gnu': 4.13.0 + '@rollup/rollup-linux-arm64-musl': 4.13.0 + '@rollup/rollup-linux-riscv64-gnu': 4.13.0 + '@rollup/rollup-linux-x64-gnu': 4.13.0 + '@rollup/rollup-linux-x64-musl': 4.13.0 + '@rollup/rollup-win32-arm64-msvc': 4.13.0 + '@rollup/rollup-win32-ia32-msvc': 4.13.0 + '@rollup/rollup-win32-x64-msvc': 4.13.0 fsevents: 2.3.3 /run-applescript@7.0.0: @@ -11900,19 +11278,6 @@ packages: ajv-keywords: 3.5.2(ajv@6.12.6) dev: true - /semver-compare@1.0.0: - resolution: {integrity: sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==} - requiresBuild: true - dev: true - optional: true - - /semver-diff@2.1.0: - resolution: {integrity: sha512-gL8F8L4ORwsS0+iQ34yCYv///jsOq0ZL7WP55d1HnJ32o7tyFYEFQZQA22mrLIacZdU6xecaBBZ+uEiffGNyXw==} - engines: {node: '>=0.10.0'} - dependencies: - semver: 5.7.2 - dev: true - /semver@5.7.2: resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} hasBin: true @@ -11951,15 +11316,6 @@ packages: - supports-color dev: true - /serialize-error@7.0.1: - resolution: {integrity: sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==} - engines: {node: '>=10'} - requiresBuild: true - dependencies: - type-fest: 0.13.1 - dev: true - optional: true - /serialize-javascript@6.0.2: resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} dependencies: @@ -12011,13 +11367,6 @@ packages: kind-of: 6.0.3 dev: true - /shebang-command@1.2.0: - resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} - engines: {node: '>=0.10.0'} - dependencies: - shebang-regex: 1.0.0 - dev: true - /shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} @@ -12025,11 +11374,6 @@ packages: shebang-regex: 3.0.0 dev: true - /shebang-regex@1.0.0: - resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} - engines: {node: '>=0.10.0'} - dev: true - /shebang-regex@3.0.0: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} @@ -12037,6 +11381,7 @@ packages: /shell-quote@1.8.1: resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} + dev: true /side-channel@1.0.6: resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} @@ -12154,12 +11499,6 @@ packages: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} dev: true - /sprintf-js@1.1.3: - resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} - requiresBuild: true - dev: true - optional: true - /sql.js@1.10.2: resolution: {integrity: sha512-jnKFtdHxuVUNgu1vHwFoTjjwfTuVDVqzGpw7H05Zq3YMNMDOpLFyFGvpgTRIQGd/mqcYntuMy7iygYCytD62jQ==} dev: false @@ -12209,14 +11548,6 @@ packages: resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==} dev: true - /string-width@2.1.1: - resolution: {integrity: sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==} - engines: {node: '>=4'} - dependencies: - is-fullwidth-code-point: 2.0.0 - strip-ansi: 4.0.0 - dev: true - /string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -12286,13 +11617,6 @@ packages: safe-buffer: 5.2.1 dev: true - /strip-ansi@4.0.0: - resolution: {integrity: sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==} - engines: {node: '>=4'} - dependencies: - ansi-regex: 3.0.1 - dev: true - /strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} @@ -12312,11 +11636,6 @@ packages: engines: {node: '>=4'} dev: true - /strip-eof@1.0.0: - resolution: {integrity: sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==} - engines: {node: '>=0.10.0'} - dev: true - /strip-final-newline@2.0.0: resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} engines: {node: '>=6'} @@ -12341,11 +11660,6 @@ packages: min-indent: 1.0.1 dev: true - /strip-json-comments@2.0.1: - resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} - engines: {node: '>=0.10.0'} - dev: true - /strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} @@ -12368,15 +11682,6 @@ packages: postcss-selector-parser: 6.0.15 dev: true - /sumchecker@3.0.1: - resolution: {integrity: sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==} - engines: {node: '>= 8.0'} - dependencies: - debug: 4.3.4 - transitivePeerDependencies: - - supports-color - dev: true - /supports-color@5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} engines: {node: '>=4'} @@ -12511,13 +11816,6 @@ packages: unique-string: 2.0.0 dev: true - /term-size@1.2.0: - resolution: {integrity: sha512-7dPUZQGy/+m3/wjVz3ZW5dobSoD/02NxJpoXUX0WIyjfVS3l0c+b/+9phIDFA7FHzkYtwtMFgeGZ/Y8jVTeqQQ==} - engines: {node: '>=4'} - dependencies: - execa: 0.7.0 - dev: true - /terser-webpack-plugin@5.3.10(esbuild@0.18.20)(webpack@5.90.3): resolution: {integrity: sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==} engines: {node: '>= 10.13.0'} @@ -12539,16 +11837,16 @@ packages: jest-worker: 27.5.1 schema-utils: 3.3.0 serialize-javascript: 6.0.2 - terser: 5.29.2 + terser: 5.28.1 webpack: 5.90.3(esbuild@0.18.20) dev: true - /terser@5.29.2: - resolution: {integrity: sha512-ZiGkhUBIM+7LwkNjXYJq8svgkd+QK3UUr0wJqY4MieaezBSAIPgbSPZyIx0idM6XWK5CMzSWa8MJIzmRcB8Caw==} + /terser@5.28.1: + resolution: {integrity: sha512-wM+bZp54v/E9eRRGXb5ZFDvinrJIOaTapx3WUokyVGZu5ucVCK55zEgGd5Dl2fSr3jUo5sDiERErUWLY6QPFyA==} engines: {node: '>=10'} hasBin: true dependencies: - '@jridgewell/source-map': 0.3.6 + '@jridgewell/source-map': 0.3.5 acorn: 8.11.3 commander: 2.20.3 source-map-support: 0.5.21 @@ -12589,11 +11887,6 @@ packages: resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} dev: true - /timed-out@4.0.1: - resolution: {integrity: sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA==} - engines: {node: '>=0.10.0'} - dev: true - /tiny-invariant@1.3.3: resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} @@ -12647,13 +11940,13 @@ packages: engines: {node: '>=8'} dev: true - /ts-api-utils@1.2.1(typescript@5.3.3): + /ts-api-utils@1.2.1(typescript@5.4.3): resolution: {integrity: sha512-RIYA36cJn2WiH9Hy77hdF9r7oEwxAtB/TS9/S4Qd90Ap4z5FSiin5zEiTL44OII1Y3IIlEvxwxFUVgrHSZ/UpA==} engines: {node: '>=16'} peerDependencies: typescript: '>=4.2.0' dependencies: - typescript: 5.3.3 + typescript: 5.4.3 dev: true /ts-dedent@2.2.0: @@ -12678,14 +11971,14 @@ packages: resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} dev: true - /tsutils@3.21.0(typescript@5.3.3): + /tsutils@3.21.0(typescript@5.4.3): resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} engines: {node: '>= 6'} peerDependencies: typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' dependencies: tslib: 1.14.1 - typescript: 5.3.3 + typescript: 5.4.3 dev: true /type-check@0.4.0: @@ -12700,13 +11993,6 @@ packages: engines: {node: '>=4'} dev: true - /type-fest@0.13.1: - resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==} - engines: {node: '>=10'} - requiresBuild: true - dev: true - optional: true - /type-fest@0.16.0: resolution: {integrity: sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==} engines: {node: '>=10'} @@ -12793,8 +12079,8 @@ packages: resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} dev: true - /typescript@5.3.3: - resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==} + /typescript@5.4.3: + resolution: {integrity: sha512-KrPd3PKaCLr78MalgiwJnA25Nm8HAmdwN3mYUYZgG/wizIo9EainNVQI9/yDavtVFRN2h3k8uf3GLHuhDMgEHg==} engines: {node: '>=14.17'} hasBin: true dev: true @@ -12857,13 +12143,6 @@ packages: engines: {node: '>=4'} dev: true - /unique-string@1.0.0: - resolution: {integrity: sha512-ODgiYu03y5g76A1I9Gt0/chLCzQjvzDy7DsZGsLOE/1MrF6wriEskSncj1+/C58Xk/kPZDppSctDybCwOSaGAg==} - engines: {node: '>=4'} - dependencies: - crypto-random-string: 1.0.0 - dev: true - /unique-string@2.0.0: resolution: {integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==} engines: {node: '>=8'} @@ -12890,11 +12169,6 @@ packages: unist-util-visit-parents: 3.1.1 dev: true - /universalify@0.1.2: - resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} - engines: {node: '>= 4.0.0'} - dev: true - /universalify@2.0.1: resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} engines: {node: '>= 10.0.0'} @@ -12973,7 +12247,7 @@ packages: '@antfu/install-pkg': 0.3.1 '@antfu/utils': 0.7.7 '@iconify/utils': 2.1.22 - '@svgr/core': 8.1.0(typescript@5.3.3) + '@svgr/core': 8.1.0(typescript@5.4.3) debug: 4.3.4 kolorist: 1.8.0 local-pkg: 0.5.0 @@ -12996,11 +12270,6 @@ packages: engines: {node: '>=8'} dev: true - /unzip-response@2.0.1: - resolution: {integrity: sha512-N0XH6lqDtFH84JxptQoZYmloF4nzrQqqrAymNj+/gW60AO2AZgOcf4O/nUXJcYfyQkqvMo9lSupBZmmgvuVXlw==} - engines: {node: '>=4'} - dev: true - /update-browserslist-db@1.0.13(browserslist@4.23.0): resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} hasBin: true @@ -13011,35 +12280,12 @@ packages: escalade: 3.1.2 picocolors: 1.0.0 - /update-notifier@2.5.0: - resolution: {integrity: sha512-gwMdhgJHGuj/+wHJJs9e6PcCszpxR1b236igrOkUofGhqJuG+amlIKwApH1IW1WWl7ovZxsX49lMBWLxSdm5Dw==} - engines: {node: '>=4'} - dependencies: - boxen: 1.3.0 - chalk: 2.4.2 - configstore: 3.1.5 - import-lazy: 2.1.0 - is-ci: 1.2.1 - is-installed-globally: 0.1.0 - is-npm: 1.0.0 - latest-version: 3.1.0 - semver-diff: 2.1.0 - xdg-basedir: 3.0.0 - dev: true - /uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} dependencies: punycode: 2.3.1 dev: true - /url-parse-lax@1.0.0: - resolution: {integrity: sha512-BVA4lR5PIviy2PMseNd2jbFQ+jwSwQGdJejf5ctd1rEXt0Ypd7yanUK9+lYechVlN5VaTJGsu2U/3MDDu6KgBA==} - engines: {node: '>=0.10.0'} - dependencies: - prepend-http: 1.0.4 - dev: true - /use-callback-ref@1.3.1(@types/react@18.2.61)(react@18.2.0): resolution: {integrity: sha512-Lg4Vx1XZQauB42Hw3kK7JM6yjVjgFmFC5/Ab797s79aARomD2nEErc4mCgM8EZrARLmmbWpi5DGCadmK50DcAQ==} engines: {node: '>=10'} @@ -13226,7 +12472,7 @@ packages: '@types/node': 20.11.24 esbuild: 0.19.12 postcss: 8.4.35 - rollup: 4.12.0 + rollup: 4.13.0 sass: 1.71.1 optionalDependencies: fsevents: 2.3.3 @@ -13302,14 +12548,6 @@ packages: graceful-fs: 4.2.11 dev: true - /watchpack@2.4.1: - resolution: {integrity: sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==} - engines: {node: '>=10.13.0'} - dependencies: - glob-to-regexp: 0.4.1 - graceful-fs: 4.2.11 - dev: true - /wcwidth@1.0.1: resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} dependencies: @@ -13341,14 +12579,14 @@ packages: dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.5 - '@webassemblyjs/ast': 1.12.1 - '@webassemblyjs/wasm-edit': 1.12.1 - '@webassemblyjs/wasm-parser': 1.12.1 + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/wasm-edit': 1.11.6 + '@webassemblyjs/wasm-parser': 1.11.6 acorn: 8.11.3 acorn-import-assertions: 1.9.0(acorn@8.11.3) browserslist: 4.23.0 chrome-trace-event: 1.0.3 - enhanced-resolve: 5.16.0 + enhanced-resolve: 5.15.1 es-module-lexer: 1.4.1 eslint-scope: 5.1.1 events: 3.3.0 @@ -13361,7 +12599,7 @@ packages: schema-utils: 3.3.0 tapable: 2.2.1 terser-webpack-plugin: 5.3.10(esbuild@0.18.20)(webpack@5.90.3) - watchpack: 2.4.1 + watchpack: 2.4.0 webpack-sources: 3.2.3 transitivePeerDependencies: - '@swc/core' @@ -13448,13 +12686,6 @@ packages: stackback: 0.0.2 dev: true - /widest-line@2.0.1: - resolution: {integrity: sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA==} - engines: {node: '>=4'} - dependencies: - string-width: 2.1.1 - dev: true - /wordwrap@1.0.0: resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} dev: true @@ -13511,18 +12742,6 @@ packages: async-limiter: 1.0.1 dev: true - /ws@7.5.9: - resolution: {integrity: sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==} - engines: {node: '>=8.3.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - /ws@8.16.0: resolution: {integrity: sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==} engines: {node: '>=10.0.0'} @@ -13536,11 +12755,6 @@ packages: optional: true dev: true - /xdg-basedir@3.0.0: - resolution: {integrity: sha512-1Dly4xqlulvPD3fZUQJLY+FUIeqN3N2MM3uqe4rCJftAvOjFa3jFGfctOgluGx4ahPbUCsZkmJILiP0Vi4T6lQ==} - engines: {node: '>=4'} - dev: true - /xtend@4.0.2: resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} engines: {node: '>=0.4'} @@ -13551,10 +12765,6 @@ packages: engines: {node: '>=10'} dev: true - /yallist@2.1.2: - resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} - dev: true - /yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} diff --git a/src/debug/index.tsx b/src/debug/index.tsx index e39acc93..19cd36c4 100644 --- a/src/debug/index.tsx +++ b/src/debug/index.tsx @@ -4,9 +4,19 @@ import { createRoot } from 'react-dom/client'; const manifest = chrome.runtime.getManifest(); +/** + * Handles editing the storage for a specific area. + * + * @param {string} areaName - The name of the storage area. + * @returns {Function} - A function that accepts changes and sets them in the storage. + */ +const handleEditStorage = (areaName: 'local' | 'sync' | 'session') => (changes: Record) => { + chrome.storage[areaName].set(changes); +}; + interface JSONEditorProps { - data: any; - onChange: (updates: any) => void; + data: unknown; + onChange: ReturnType; } function JSONEditor(props: JSONEditorProps) { @@ -64,9 +74,9 @@ function JSONEditor(props: JSONEditorProps) { // )); function DevDashboard() { - const [localStorage, setLocalStorage] = React.useState({}); - const [syncStorage, setSyncStorage] = React.useState({}); - const [sessionStorage, setSessionStorage] = React.useState({}); + const [localStorage, setLocalStorage] = React.useState>({}); + const [syncStorage, setSyncStorage] = React.useState>({}); + const [sessionStorage, setSessionStorage] = React.useState>({}); useEffect(() => { const onVisibilityChange = () => { @@ -95,7 +105,8 @@ function DevDashboard() { // listen for changes to the chrome storage to update the local storage state displayed in the dashboard useEffect(() => { const onChanged = (changes: chrome.storage.StorageChange, areaName: chrome.storage.AreaName) => { - let copy = {}; + let copy: Record = {}; + if (areaName === 'local') { copy = { ...localStorage }; } else if (areaName === 'sync') { @@ -104,8 +115,8 @@ function DevDashboard() { copy = { ...sessionStorage }; } - Object.keys(changes).forEach(key => { - copy[key] = changes[key].newValue; + Object.keys(changes).forEach((key: string) => { + copy[key] = changes[key as keyof typeof changes].newValue; }); if (areaName === 'local') { @@ -126,10 +137,6 @@ function DevDashboard() { }; }, [localStorage, syncStorage, sessionStorage]); - const handleEditStorage = (areaName: string) => (changes: Record) => { - chrome.storage[areaName].set(changes); - }; - return (

@@ -147,4 +154,4 @@ function DevDashboard() { ); } -createRoot(document.getElementById('root')).render(); +createRoot(document.getElementById('root')!).render(); diff --git a/src/debug/reactDevtools.ts b/src/debug/reactDevtools.ts deleted file mode 100644 index 10f4c2c1..00000000 --- a/src/debug/reactDevtools.ts +++ /dev/null @@ -1,24 +0,0 @@ -// this is a custom wrapper around react-devtools -// that changes it so that we only send messages to the devtools when the current tab is active; -import { connectToDevTools } from 'react-devtools-core'; - -// connect to the devtools server -let ws = new WebSocket('ws://localhost:8097'); - -connectToDevTools({ - websocket: ws, -}); - -// when the tab's visibile state changes, we connect or disconnect from the devtools -const onVisibilityChange = () => { - if (document.visibilityState === 'visible') { - ws = new WebSocket('ws://localhost:8097'); - connectToDevTools({ - websocket: ws, - }); - } else { - ws.close(); - } -}; - -document.addEventListener('visibilitychange', onVisibilityChange); diff --git a/src/pages/background/background.ts b/src/pages/background/background.ts index d35d9ab7..e92a0752 100644 --- a/src/pages/background/background.ts +++ b/src/pages/background/background.ts @@ -44,7 +44,7 @@ messageListener.listen(); UserScheduleStore.listen('schedules', async schedules => { const index = await UserScheduleStore.get('activeIndex'); - const numCourses = schedules[index]?.courses?.length; + const numCourses = schedules.newValue[index]?.courses?.length; if (!numCourses) return; updateBadgeText(numCourses); diff --git a/src/pages/background/handler/CESHandler.ts b/src/pages/background/handler/CESHandler.ts index a9e4f927..3de383ee 100644 --- a/src/pages/background/handler/CESHandler.ts +++ b/src/pages/background/handler/CESHandler.ts @@ -11,7 +11,7 @@ const CESHandler: MessageHandler = { const instructorFirstAndLastName = [instructorFirstName, instructorLastName]; chrome.scripting.executeScript({ target: { tabId: tab.id }, - func: (...instructorFirstAndLastName: String[]) => { + func: (...instructorFirstAndLastName: string[]) => { const inputElement = document.getElementById( 'ctl00_ContentPlaceHolder1_ViewList_tbxValue' ) as HTMLInputElement | null; diff --git a/src/pages/background/handler/calendarBackgroundHandler.ts b/src/pages/background/handler/calendarBackgroundHandler.ts index a63126a1..d9cc56b3 100644 --- a/src/pages/background/handler/calendarBackgroundHandler.ts +++ b/src/pages/background/handler/calendarBackgroundHandler.ts @@ -1,21 +1,21 @@ +import type { TabWithId } from '@background/util/openNewTab'; import openNewTab from '@background/util/openNewTab'; import { tabs } from '@shared/messages'; import type { CalendarBackgroundMessages } from '@shared/messages/CalendarMessages'; import type { MessageHandler } from 'chrome-extension-toolkit'; const getAllTabInfos = async () => { - const openTabs = await chrome.tabs.query({}); + const openTabs = (await chrome.tabs.query({})).filter((tab): tab is TabWithId => tab.id !== undefined); const results = await Promise.allSettled(openTabs.map(tab => tabs.getTabInfo(undefined, tab.id))); + + type TabInfo = PromiseFulfilledResult>>; return results .map((result, index) => ({ result, index })) - .filter(({ result }) => result.status === 'fulfilled') - .map(({ result, index }) => { - if (result.status !== 'fulfilled') throw new Error('Will never happen, typescript dumb'); - return { - ...result.value, - tab: openTabs[index], - }; - }); + .filter((el): el is { result: TabInfo; index: number } => el.result.status === 'fulfilled') + .map(({ result, index }) => ({ + ...result.value, + tab: openTabs[index]!, + })); }; const calendarBackgroundHandler: MessageHandler = { @@ -25,17 +25,21 @@ const calendarBackgroundHandler: MessageHandler = { const allTabs = await getAllTabInfos(); - const openCalendarTabInfo = allTabs.find(tab => tab.url.startsWith(calendarUrl)); + const openCalendarTabInfo = allTabs.find(tab => tab.url?.startsWith(calendarUrl)); if (openCalendarTabInfo !== undefined) { - chrome.tabs.update(openCalendarTabInfo.tab.id, { active: true }); - if (uniqueId !== undefined) await tabs.openCoursePopup({ uniqueId }, openCalendarTabInfo.tab.id); + const tabid = openCalendarTabInfo.tab.id; + + chrome.tabs.update(tabid, { active: true }); + if (uniqueId !== undefined) await tabs.openCoursePopup({ uniqueId }, tabid); + sendResponse(openCalendarTabInfo.tab); } else { const urlParams = new URLSearchParams(); if (uniqueId !== undefined) urlParams.set('uniqueId', uniqueId.toString()); const url = `${calendarUrl}?${urlParams.toString()}`.replace(/\?$/, ''); const tab = await openNewTab(url); + sendResponse(tab); } }, diff --git a/src/pages/background/lib/renameSchedule.ts b/src/pages/background/lib/renameSchedule.ts index 9f2e545e..15024cc0 100644 --- a/src/pages/background/lib/renameSchedule.ts +++ b/src/pages/background/lib/renameSchedule.ts @@ -12,11 +12,8 @@ export default async function renameSchedule(scheduleId: string, newName: string if (scheduleIndex === -1) { return `Schedule ${scheduleId} does not exist`; } - // if (schedules.find(schedule => schedule.name === newName)) { - // return `Schedule ${newName} already exists`; - // } - schedules[scheduleIndex].name = newName; + schedules[scheduleIndex]!.name = newName; // schedules[scheduleIndex].updatedAt = Date.now(); await UserScheduleStore.set('schedules', schedules); diff --git a/src/pages/background/lib/switchSchedule.ts b/src/pages/background/lib/switchSchedule.ts index 1f461db5..6b820a48 100644 --- a/src/pages/background/lib/switchSchedule.ts +++ b/src/pages/background/lib/switchSchedule.ts @@ -13,7 +13,8 @@ export default async function switchSchedule(scheduleId: string): Promise if (scheduleIndex === -1) { throw new Error(`Schedule ${scheduleId} does not exist`); } - schedules[scheduleIndex].updatedAt = Date.now(); + + schedules[scheduleIndex]!.updatedAt = Date.now(); await UserScheduleStore.set('activeIndex', scheduleIndex); } diff --git a/src/pages/background/util/openDebugTab.ts b/src/pages/background/util/openDebugTab.ts index a9b6d273..63a58a76 100644 --- a/src/pages/background/util/openDebugTab.ts +++ b/src/pages/background/util/openDebugTab.ts @@ -10,7 +10,7 @@ export async function openDebugTab() { DevStore.get('wasDebugTabVisible'), ]); - const isAlreadyOpen = await (await chrome.tabs.query({})).some(tab => tab.id === debugTabId); + const isAlreadyOpen = (await chrome.tabs.query({})).some(tab => tab.id === debugTabId); if (isAlreadyOpen) return; const tab = await chrome.tabs.create({ diff --git a/src/pages/background/util/openNewTab.ts b/src/pages/background/util/openNewTab.ts index b5019873..904e375e 100644 --- a/src/pages/background/util/openNewTab.ts +++ b/src/pages/background/util/openNewTab.ts @@ -1,10 +1,12 @@ +export type TabWithId = Omit & { id: number }; + /** * This is a helper function that opens a new tab in the current window, and focuses the window * @param tabIndex - the index of the tab to open the new tab at (optional) * @returns the tab that was opened */ -export default async function openNewTab(url: string, tabIndex?: number): Promise { - const tab = await chrome.tabs.create({ url, index: tabIndex, active: true }); +export default async function openNewTab(url: string, tabIndex?: number): Promise { + const tab = (await chrome.tabs.create({ url, index: tabIndex, active: true })) as TabWithId; await chrome.windows.update(tab.windowId, { focused: true }); return tab; } diff --git a/src/pages/calendar/index.tsx b/src/pages/calendar/index.tsx index 6208baea..d9072803 100644 --- a/src/pages/calendar/index.tsx +++ b/src/pages/calendar/index.tsx @@ -5,4 +5,4 @@ import { createRoot } from 'react-dom/client'; import CalendarMain from './CalendarMain'; -createRoot(document.getElementById('root')).render(); +createRoot(document.getElementById('root')!).render(); diff --git a/src/pages/options/index.tsx b/src/pages/options/index.tsx index 7b6e0272..8ba7b8de 100644 --- a/src/pages/options/index.tsx +++ b/src/pages/options/index.tsx @@ -3,4 +3,4 @@ import { createRoot } from 'react-dom/client'; import App from './App'; -createRoot(document.getElementById('root')).render(); +createRoot(document.getElementById('root')!).render(); diff --git a/src/pages/popup/index.tsx b/src/pages/popup/index.tsx index 40c6aae6..d28753fb 100644 --- a/src/pages/popup/index.tsx +++ b/src/pages/popup/index.tsx @@ -4,4 +4,4 @@ import PopupMain from '@views/components/PopupMain'; import React from 'react'; import { createRoot } from 'react-dom/client'; -createRoot(document.getElementById('root')).render(); +createRoot(document.getElementById('root')!).render(); diff --git a/src/shared/types/Course.ts b/src/shared/types/Course.ts index 8ede8d4b..83bb3c02 100644 --- a/src/shared/types/Course.ts +++ b/src/shared/types/Course.ts @@ -43,40 +43,40 @@ export type Semester = { */ export class Course { /** Every course has a uniqueId within UT's registrar system corresponding to each course section */ - uniqueId: number; + uniqueId!: number; /** This is the course number for a course, i.e CS 314 would be 314, MAL 306H would be 306H */ - number: string; + number!: string; /** The full name of the course, i.e. CS 314 Data Structures and Algorithms */ - fullName: string; + fullName!: string; /** Just the english name for a course, without the number and department */ - courseName: string; + courseName!: string; /** The unique identifier for which department that a course belongs to, i.e. CS, MAL, etc. */ - department: string; + department!: string; /** The number of credits that a course is worth */ - creditHours: number; + creditHours!: number; /** Is the course open, closed, waitlisted, or cancelled? */ - status: StatusType; + status!: StatusType; /** all the people that are teaching this course, and some metadata about their names */ instructors: Instructor[]; /** Some courses at UT are reserved for certain groups of people or people within a certain major, which makes it difficult for people outside of that group to register for the course. */ - isReserved: boolean; + isReserved!: boolean; /** The description of the course as an array of "lines". This will include important information as well as a short summary of the topics covered */ description?: string[]; /** The schedule for the course, which includes the days of the week that the course is taught, the time that the course is taught, and the location that the course is taught */ schedule: CourseSchedule; /** the link to the course details page for this course */ - url: string; + url!: string; /** the link to the registration page for this course, for easy access when registering */ registerURL?: string; /** At UT, some courses have certain "flags" which aid in graduation */ - flags: string[]; + flags!: string[]; /** How is the class being taught (online, hybrid, in person, etc) */ - instructionMode: InstructionMode; + instructionMode!: InstructionMode; /** Which semester is the course from */ - semester: Semester; + semester!: Semester; /** Unix timestamp of when the course was last scraped */ - scrapedAt: number; + scrapedAt!: number; /** The colors of the course when displayed */ colors: CourseColors; diff --git a/src/shared/types/CourseMeeting.ts b/src/shared/types/CourseMeeting.ts index 09c53d87..78381501 100644 --- a/src/shared/types/CourseMeeting.ts +++ b/src/shared/types/CourseMeeting.ts @@ -30,15 +30,15 @@ export type Location = { */ export class CourseMeeting { /** The day of the week that the course is taught */ - days: Day[]; + days!: Day[]; /** NOTE: Times starting and after 12 PM have an additional 720 minutes (12 hrs) added to them * The start time of the course, in minutes since midnight * */ - startTime: number; + startTime!: number; /** NOTE: Times starting and after 12 PM have an additional 720 minutes (12 hrs) added to them * The end time of the course, in minutes since midnight * */ - endTime: number; + endTime!: number; /** The location that the course is taught */ location?: Location; diff --git a/src/shared/types/CourseSchedule.ts b/src/shared/types/CourseSchedule.ts index 6ed85246..68b75308 100644 --- a/src/shared/types/CourseSchedule.ts +++ b/src/shared/types/CourseSchedule.ts @@ -38,7 +38,7 @@ export class CourseSchedule { if (char === 'S' && nextChar === 'U') { day += nextChar; } - return DAY_MAP[day]; + return DAY_MAP[day as keyof typeof DAY_MAP]; }) .filter(Boolean) as Day[]; @@ -47,7 +47,7 @@ export class CourseSchedule { .split('-') .map(time => { const [rawHour, rest] = time.split(':'); - const [rawMinute, ampm] = rest.split(' '); + const [rawMinute, ampm] = rest?.split(' ') ?? ['', '']; const hour = (rawHour === '12' ? 0 : Number(rawHour)) + (ampm === 'pm' ? 12 : 0); const minute = Number(rawMinute); @@ -56,17 +56,27 @@ export class CourseSchedule { const location = locLine.split(' ').filter(Boolean); + if (startTime === undefined || endTime === undefined) { + throw new Error('Failed to parse time'); + } + + if (startTime >= endTime) { + throw new Error('Start time must be before end time'); + } + + if (location === undefined) { + throw new Error('Failed to parse location'); + } + return new CourseMeeting({ days, startTime, endTime, - location: location.length - ? { - building: location[0], - room: location[1], - } - : undefined, - }); + location: { + building: location[0] ?? '', + room: location[1] ?? '', + }, + } satisfies Serialized); } catch (e) { throw new Error(`Failed to parse schedule: ${dayLine} ${timeLine} ${locLine}`); } diff --git a/src/shared/types/Instructor.ts b/src/shared/types/Instructor.ts index d982f1c6..f2c1481a 100644 --- a/src/shared/types/Instructor.ts +++ b/src/shared/types/Instructor.ts @@ -5,9 +5,9 @@ import type { Serialized } from 'chrome-extension-toolkit'; * A type representing an instructor for a course (who teaches it) */ export default class Instructor { - fullName: string; - firstName: string; - lastName: string; + fullName?: string; + firstName?: string; + lastName?: string; middleInitial?: string; constructor(instructor: Serialized) { @@ -53,16 +53,16 @@ export default class Instructor { return capitalize(str); }; - if (format === 'abbr') { + if (format === 'abbr' && firstName && lastName && firstName[0]) { return `${process(firstName[0])}. ${process(lastName)}`; } - if (format === 'full_name') { + if (format === 'full_name' && fullName) { return process(fullName); } - if (format === 'first_last') { + if (format === 'first_last' && firstName && lastName) { return `${process(firstName)} ${process(lastName)}`; } - if (format === 'last') { + if (format === 'last' && lastName) { return process(lastName); } diff --git a/src/shared/types/ThemeColors.ts b/src/shared/types/ThemeColors.ts index 394a74c9..1e8eb155 100644 --- a/src/shared/types/ThemeColors.ts +++ b/src/shared/types/ThemeColors.ts @@ -42,7 +42,7 @@ export const extendedColors = { } as const; type NestedKeys = { - [K in keyof T]: T[K] extends Record ? `${string & K}-${string & keyof T[K]}` : never; + [K in keyof T]: T[K] extends Record ? `${string & K}-${string & keyof T[K]}` : never; }[keyof T]; /** @@ -56,6 +56,7 @@ export type ThemeColor = NestedKeys; export type TWColorway = { [K in keyof typeof theme.colors]: (typeof theme.colors)[K] extends Record ? K : never; }[keyof typeof theme.colors]; +export type TWIndex = keyof (typeof theme.colors)[TWColorway]; /** * Represents the colors for a course. diff --git a/src/shared/util/colors.ts b/src/shared/util/colors.ts index 177e33cd..5441a7d3 100644 --- a/src/shared/util/colors.ts +++ b/src/shared/util/colors.ts @@ -4,7 +4,7 @@ import { theme } from 'unocss/preset-mini'; import type { HexColor, Lab, RGB, sRGB } from '../types/Color'; import { isHexColor } from '../types/Color'; import type { Course } from '../types/Course'; -import type { CourseColors, TWColorway } from '../types/ThemeColors'; +import type { CourseColors, TWColorway, TWIndex } from '../types/ThemeColors'; import { colorwayIndexes } from '../types/ThemeColors'; import type { UserSchedule } from '../types/UserSchedule'; @@ -14,18 +14,21 @@ import type { UserSchedule } from '../types/UserSchedule'; * @param hex - The hexadecimal color value. * @returns An array containing the RGB values. */ -export function hexToRGB(hex: HexColor): RGB { +export function hexToRGB(hex: HexColor): RGB | undefined { // Expand shorthand form (e.g. "03F") to full form (e.g. "0033FF") - let shorthandRegex: RegExp = /^#?([a-f\d])([a-f\d])([a-f\d])$/i; - const parsedHex: string = hex.replace(shorthandRegex, (m, r, g, b) => r + r + g + g + b + b); + let shorthandRegex = /^#?([a-f\d])([a-f\d])([a-f\d])$/i; + const parsedHex = hex.replace(shorthandRegex, (m, r, g, b) => r + r + g + g + b + b); - let result: RegExpExecArray = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(parsedHex); - return result ? [parseInt(result[1], 16), parseInt(result[2], 16), parseInt(result[3], 16)] : null; + let result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(parsedHex); + + if (!result || !(result.length > 3)) return undefined; + + return [parseInt(result[1]!, 16), parseInt(result[2]!, 16), parseInt(result[3]!, 16)]; } export const useableColorways = Object.keys(theme.colors) // check that the color is a colorway (is an object) - .filter(color => typeof theme.colors[color] === 'object') + .filter(color => typeof theme.colors[color as keyof typeof theme.colors] === 'object') .slice(0, 17) as TWColorway[]; /** @@ -33,12 +36,16 @@ export const useableColorways = Object.keys(theme.colors) * @param bgColor the hex color of the background */ export function pickFontColor(bgColor: HexColor): 'text-white' | 'text-black' | 'text-theme-black' { - const coefficients = [0.2126729, 0.7151522, 0.072175]; + const coefficients = [0.2126729, 0.7151522, 0.072175] as const; const flipYs = 0.342; // based on APCA™ 0.98G middle contrast BG color const trc = 2.4; // 2.4 exponent for emulating actual monitor perception - let Ys = hexToRGB(bgColor).reduce((acc, c, i) => acc + (c / 255.0) ** trc * coefficients[i], 0); + const rgb = hexToRGB(bgColor); + if (!rgb) throw new Error('bgColor: Invalid hex.'); + + // coefficients and rgb are both 3 elements long, so this is safe + let Ys = rgb.reduce((acc, c, i) => acc + (c / 255.0) ** trc * coefficients[i]!, 0); if (Ys < flipYs) { return 'text-white'; @@ -54,13 +61,13 @@ export function pickFontColor(bgColor: HexColor): 'text-white' | 'text-black' | export function getCourseColors(colorway: TWColorway, index?: number, offset: number = 300): CourseColors { if (index === undefined) { // eslint-disable-next-line no-param-reassign - index = colorway in colorwayIndexes ? colorwayIndexes[colorway] : 500; + index = colorway in colorwayIndexes ? colorwayIndexes[colorway as keyof typeof colorwayIndexes] : 500; } return { - primaryColor: theme.colors[colorway][index], - secondaryColor: theme.colors[colorway][index + offset], - } satisfies CourseColors; + primaryColor: theme.colors[colorway][index as TWIndex] as HexColor, + secondaryColor: theme.colors[colorway][(index + offset) as TWIndex] as HexColor, + }; } /** @@ -87,7 +94,12 @@ export function getColorwayFromColor(color: HexColor): TWColorway { continue; } - const distance = oklabDistance(rgbToOKlab(hexToRGB(shadeColor)), rgbToOKlab(hexToRGB(color))); + const shadeColorRGB = hexToRGB(shadeColor); + if (!shadeColorRGB) { + continue; + } + + const distance = oklabDistance(rgbToOKlab(shadeColorRGB), rgbToOKlab(shadeColorRGB)); if (distance < closestDistance) { closestDistance = distance; closestColor = shade; @@ -148,7 +160,8 @@ export function getUnusedColor( if (sameDepartment.length > 0) { // check to see if any adjacent colorways are available - const centerCourse = sameDepartment[Math.floor(Math.random() * sameDepartment.length)]; + const centerCourse = sameDepartment[Math.floor(Math.random() * sameDepartment.length)]!; + let nextColorway = getNextColorway(centerCourse.colorway); let prevColorway = getPreviousColorway(centerCourse.colorway); @@ -175,11 +188,18 @@ export function getUnusedColor( if (shortenedColorways.size > 0) { // TODO: make this go by 3's to leave future spaces open - const randomColorway = Array.from(shortenedColorways)[Math.floor(Math.random() * shortenedColorways.size)]; + const randomColorway = Array.from(shortenedColorways)[Math.floor(Math.random() * shortenedColorways.size)]!; + return getCourseColors(randomColorway, index, offset); } // no colorways are at least 2 indexes away from any used colors, just get a random colorway - const randomColorway = Array.from(availableColorways)[Math.floor(Math.random() * availableColorways.size)]; + const randomColorway: TWColorway | undefined = + Array.from(availableColorways)[Math.floor(Math.random() * availableColorways.size)]; + + if (!randomColorway) { + throw new Error('randomColorway is undefined'); + } + return getCourseColors(randomColorway, index, offset); } // TODO: get just a random color idk diff --git a/src/shared/util/icons.tsx b/src/shared/util/icons.tsx index 1a817f49..059344e2 100644 --- a/src/shared/util/icons.tsx +++ b/src/shared/util/icons.tsx @@ -10,9 +10,9 @@ import CancelledIcon from '~icons/material-symbols/warning'; /** * Get Icon component based on status * @param props.status status - * @returns React.ReactElement - the icon component + * @returns the icon component */ -export function StatusIcon(props: SVGProps & { status: StatusType }): React.ReactElement { +export function StatusIcon(props: SVGProps & { status: StatusType }): JSX.Element | null { const { status, ...rest } = props; switch (props.status) { @@ -23,5 +23,6 @@ export function StatusIcon(props: SVGProps & { status: StatusType case Status.CANCELLED: return ; default: + return null; } } diff --git a/src/shared/util/themeColors.ts b/src/shared/util/themeColors.ts index ea6e5803..3ccda177 100644 --- a/src/shared/util/themeColors.ts +++ b/src/shared/util/themeColors.ts @@ -5,12 +5,11 @@ import { hexToRGB } from './colors'; /** * Flattened colors object. - * @type {Record} */ -export const colorsFlattened = Object.entries(colors).reduce( - (acc, [prefix, group]) => { +export const colorsFlattened: Record = Object.entries(colors).reduce( + (acc: Record, [prefix, group]) => { for (const [name, hex] of Object.entries(group)) { - acc[`${prefix}-${name}`] = hex; + acc[`${prefix}-${name}` as ThemeColor] = hex; } return acc; }, @@ -19,9 +18,8 @@ export const colorsFlattened = Object.entries(colors).reduce( /** * Represents the flattened RGB values of the colors. - * @type {Record>} */ -const colorsFlattenedRgb = Object.fromEntries( +const colorsFlattenedRgb: Record> = Object.fromEntries( Object.entries(colorsFlattened).map(([name, hex]) => [name, hexToRGB(hex as HexColor)]) ) as Record>; diff --git a/src/stories/components/Dropdown.stories.tsx b/src/stories/components/Dropdown.stories.tsx index e5bf09d7..6ed49011 100644 --- a/src/stories/components/Dropdown.stories.tsx +++ b/src/stories/components/Dropdown.stories.tsx @@ -3,6 +3,7 @@ import { UserSchedule } from '@shared/types/UserSchedule'; import { generateRandomId } from '@shared/util/random'; import type { Meta, StoryObj } from '@storybook/react'; import List from '@views/components/common/List/List'; +import type { ScheduleDropdownProps } from '@views/components/common/ScheduleDropdown/ScheduleDropdown'; import ScheduleDropdown from '@views/components/common/ScheduleDropdown/ScheduleDropdown'; import ScheduleListItem from '@views/components/common/ScheduleListItem/ScheduleListItem'; import useSchedules, { getActiveSchedule, switchSchedule } from '@views/hooks/useSchedules'; @@ -49,7 +50,7 @@ const meta: Meta = { }, }, }, - render: (args: any) => { + render: (args: ScheduleDropdownProps) => { // eslint-disable-next-line react-hooks/rules-of-hooks const [activeSchedule, schedules] = useSchedules(); diff --git a/src/stories/components/List.stories.tsx b/src/stories/components/List.stories.tsx index c140b300..b2c46eac 100644 --- a/src/stories/components/List.stories.tsx +++ b/src/stories/components/List.stories.tsx @@ -62,7 +62,7 @@ const generateCourses = (count: number): Course[] => { status: Status.WAITLISTED, uniqueId: 12345 + i, // Make uniqueId different for each course url: 'https://utdirect.utexas.edu/apps/registrar/course_schedule/20242/12345/', - colors: tailwindColorways[i], + colors: tailwindColorways[i]!, }); courses.push(course); @@ -86,16 +86,16 @@ const meta = { argTypes: { gap: { control: 'number' }, }, -} satisfies Meta; +} satisfies Meta>; export default meta; -type Story = StoryObj; +type Story = StoryObj>>; export const Default: Story = { args: { draggables: exampleCourses, children: generateCourseBlocks, - itemKey: (item: Course) => item.uniqueId, + itemKey: item => item.uniqueId, gap: 12, }, render: args => ( diff --git a/src/stories/components/Prompt.stories.tsx b/src/stories/components/Prompt.stories.tsx index c9a21bb3..659d56be 100644 --- a/src/stories/components/Prompt.stories.tsx +++ b/src/stories/components/Prompt.stories.tsx @@ -27,7 +27,7 @@ const PromptDialogWithButton = ({ children, ...args }: PromptDialogProps) => { const handleClose = () => setIsOpen(false); const { title, content } = args; - const childrenWithHandleClose: React.ReactElement[] = children.map(child => { + const childrenWithHandleClose: React.ReactElement[] = (children ?? []).map(child => { if (child.type === Button) { return React.cloneElement(child, { onClick: () => handleClose() } as React.HTMLAttributes); } diff --git a/src/stories/components/calendar/CalendarBottomBar.stories.tsx b/src/stories/components/calendar/CalendarBottomBar.stories.tsx index fc93943c..467463bc 100644 --- a/src/stories/components/calendar/CalendarBottomBar.stories.tsx +++ b/src/stories/components/calendar/CalendarBottomBar.stories.tsx @@ -87,12 +87,12 @@ export const Default: Story = { courses: [ { colors: getCourseColors('pink', 200), - courseDeptAndInstr: `${exampleGovCourse.department} ${exampleGovCourse.number} – ${exampleGovCourse.instructors[0].lastName}`, + courseDeptAndInstr: `${exampleGovCourse.department} ${exampleGovCourse.number} – ${exampleGovCourse.instructors[0]!.lastName}`, status: exampleGovCourse.status, }, { colors: getCourseColors('slate', 500), - courseDeptAndInstr: `${examplePsyCourse.department} ${examplePsyCourse.number} – ${examplePsyCourse.instructors[0].lastName}`, + courseDeptAndInstr: `${examplePsyCourse.department} ${examplePsyCourse.number} – ${examplePsyCourse.instructors[0]!.lastName}`, status: examplePsyCourse.status, }, ], diff --git a/src/stories/components/calendar/CalendarCourse.stories.tsx b/src/stories/components/calendar/CalendarCourse.stories.tsx index 173ca8c2..571f8c54 100644 --- a/src/stories/components/calendar/CalendarCourse.stories.tsx +++ b/src/stories/components/calendar/CalendarCourse.stories.tsx @@ -16,7 +16,6 @@ const meta = { argTypes: { course: { control: 'object' }, meetingIdx: { control: 'number' }, - rightIcon: { control: 'object' }, }, } satisfies Meta; export default meta; diff --git a/src/stories/components/calendar/CalendarCourseCell.stories.tsx b/src/stories/components/calendar/CalendarCourseCell.stories.tsx index a2258e4b..97816f9f 100644 --- a/src/stories/components/calendar/CalendarCourseCell.stories.tsx +++ b/src/stories/components/calendar/CalendarCourseCell.stories.tsx @@ -1,6 +1,7 @@ import { Status } from '@shared/types/Course'; import { getCourseColors } from '@shared/util/colors'; import type { Meta, StoryObj } from '@storybook/react'; +import type { CalendarCourseCellProps } from '@views/components/calendar/CalendarCourseCell/CalendarCourseCell'; import CalendarCourseCell from '@views/components/calendar/CalendarCourseCell/CalendarCourseCell'; import React from 'react'; @@ -20,7 +21,7 @@ const meta = { timeAndLocation: { control: { type: 'text' } }, colors: { control: { type: 'object' } }, }, - render: (args: any) => ( + render: (args: CalendarCourseCellProps) => (
@@ -29,7 +30,7 @@ const meta = { courseDeptAndInstr: ExampleCourse.department, className: ExampleCourse.number, status: ExampleCourse.status, - timeAndLocation: ExampleCourse.schedule.meetings[0].getTimeString({ separator: '-' }), + timeAndLocation: ExampleCourse.schedule.meetings[0]!.getTimeString({ separator: '-' }), colors: getCourseColors('emerald', 500), }, diff --git a/src/views/components/CourseCatalogMain.tsx b/src/views/components/CourseCatalogMain.tsx index 160bbf41..d7c0f9f7 100644 --- a/src/views/components/CourseCatalogMain.tsx +++ b/src/views/components/CourseCatalogMain.tsx @@ -20,7 +20,7 @@ interface Props { /** * This is the top level react component orchestrating the course catalog page. */ -export default function CourseCatalogMain({ support }: Props): JSX.Element { +export default function CourseCatalogMain({ support }: Props): JSX.Element | null { const [rows, setRows] = React.useState([]); const [selectedCourse, setSelectedCourse] = useState(null); const [showPopup, setShowPopup] = useState(false); @@ -53,8 +53,6 @@ export default function CourseCatalogMain({ support }: Props): JSX.Element { setSelectedCourse(course); }; - // useKeyPress('Escape', handleClearSelectedCourse); - const [activeSchedule] = useSchedules(); if (!activeSchedule) { @@ -78,7 +76,7 @@ export default function CourseCatalogMain({ support }: Props): JSX.Element { ) )} setShowPopup(false)} afterLeave={() => setSelectedCourse(null)} diff --git a/src/views/components/calendar/Calendar/Calendar.tsx b/src/views/components/calendar/Calendar/Calendar.tsx index 67c284cd..12531782 100644 --- a/src/views/components/calendar/Calendar/Calendar.tsx +++ b/src/views/components/calendar/Calendar/Calendar.tsx @@ -20,16 +20,20 @@ import TeamLinks from '../TeamLinks'; export default function Calendar(): JSX.Element { const calendarRef = useRef(null); const { courseCells, activeSchedule } = useFlattenedCourseSchedule(); + const [course, setCourse] = useState((): Course | null => { const urlParams = new URLSearchParams(window.location.search); const uniqueIdRaw = urlParams.get('uniqueId'); if (uniqueIdRaw === null) return null; + const uniqueId = Number(uniqueIdRaw); const course = activeSchedule.courses.find(course => course.uniqueId === uniqueId); if (course === undefined) return null; + urlParams.delete('uniqueId'); const newUrl = `${window.location.pathname}?${urlParams}`.replace(/\?$/, ''); window.history.replaceState({}, '', newUrl); + return course; }); @@ -41,16 +45,20 @@ export default function Calendar(): JSX.Element { async openCoursePopup({ data, sendResponse }) { const course = activeSchedule.courses.find(course => course.uniqueId === data.uniqueId); if (course === undefined) return; + setCourse(course); setShowPopup(true); - sendResponse(await chrome.tabs.getCurrent()); + + const currentTab = await chrome.tabs.getCurrent(); + if (currentTab === undefined) return; + sendResponse(currentTab); }, }); listener.listen(); return () => listener.unlisten(); - }, [activeSchedule.courses]); + }, [activeSchedule]); useEffect(() => { if (course) setShowPopup(true); @@ -85,7 +93,7 @@ export default function Calendar(): JSX.Element {

setShowPopup(false)} open={showPopup} afterLeave={() => setCourse(null)} diff --git a/src/views/components/calendar/CalendarCourseBlock/CalendarCourseMeeting.tsx b/src/views/components/calendar/CalendarCourseBlock/CalendarCourseMeeting.tsx index 0e4393f6..49b947f7 100644 --- a/src/views/components/calendar/CalendarCourseBlock/CalendarCourseMeeting.tsx +++ b/src/views/components/calendar/CalendarCourseBlock/CalendarCourseMeeting.tsx @@ -1,5 +1,4 @@ import type { Course } from '@shared/types/Course'; -import type { CourseMeeting } from '@shared/types/CourseMeeting'; import React from 'react'; import styles from './CalendarCourseMeeting.module.scss'; @@ -12,28 +11,27 @@ export interface CalendarCourseMeetingProps { course: Course; /* index into course meeting array to display */ meetingIdx?: number; - /** The icon to display on the right side of the course. This is optional. */ - rightIcon?: React.ReactNode; } /** * `CalendarCourseMeeting` is a functional component that displays a course meeting. * * @example - * } /> + * */ -export default function CalendarCourseMeeting({ - course, - meetingIdx, - rightIcon, -}: CalendarCourseMeetingProps): JSX.Element { - let meeting: CourseMeeting | null = meetingIdx !== undefined ? course.schedule.meetings[meetingIdx] : null; +export default function CalendarCourseMeeting({ course, meetingIdx }: CalendarCourseMeetingProps): JSX.Element | null { + let meeting = meetingIdx !== undefined ? course.schedule.meetings[meetingIdx] : undefined; + + if (!meeting) { + return null; + } + return (
- {course.department} {course.number} - {course.instructors[0].lastName} + {course.department} {course.number} - {course.instructors[0]?.lastName}
{`${meeting.getTimeString({ separator: '-', capitalize: true })}${ diff --git a/src/views/components/calendar/CalendarCourseCellColorPicker/CourseCellColorPicker.tsx b/src/views/components/calendar/CalendarCourseCellColorPicker/CourseCellColorPicker.tsx index bb3844fc..393243cc 100644 --- a/src/views/components/calendar/CalendarCourseCellColorPicker/CourseCellColorPicker.tsx +++ b/src/views/components/calendar/CalendarCourseCellColorPicker/CourseCellColorPicker.tsx @@ -1,3 +1,4 @@ +import type { ThemeColor, TWIndex } from '@shared/types/ThemeColors'; import { getThemeColorHexByName } from '@shared/util/themeColors'; import Divider from '@views/components/common/Divider/Divider'; import React from 'react'; @@ -30,16 +31,19 @@ const baseColors = [ 'fuchsia', 'pink', 'rose', -]; +] as const; -const BaseColorNum = 500; -const StartingShadeIndex = 200; +const BaseColorNum: TWIndex = 500; +const StartingShadeIndex: TWIndex = 200; const ShadeIncrement = 100; const colorPatchColors = new Map( - baseColors.map((baseColor: string) => [ + baseColors.map(baseColor => [ theme.colors[baseColor][BaseColorNum], - Array.from({ length: 6 }, (_, index) => theme.colors[baseColor][StartingShadeIndex + ShadeIncrement * index]), + Array.from( + { length: 6 }, + (_, index) => theme.colors[baseColor][(StartingShadeIndex + ShadeIncrement * index) as TWIndex] + ), ]) ); @@ -51,7 +55,7 @@ const hexCodeToBaseColor = new Map( * Props for the CourseCellColorPicker component. */ export interface CourseCellColorPickerProps { - setSelectedColor: React.Dispatch>; + setSelectedColor: React.Dispatch>; isInvertColorsToggled: boolean; setIsInvertColorsToggled: React.Dispatch>; } @@ -89,7 +93,7 @@ export default function CourseCellColorPicker({ const [hexCode, setHexCode] = React.useState( getThemeColorHexByName('ut-gray').slice(1).toLocaleLowerCase() ); - const hexCodeWithHash = `#${hexCode}`; + const hexCodeWithHash = `#${hexCode}` as ThemeColor; const selectedBaseColor = hexCodeToBaseColor.get(hexCodeWithHash); const handleSelectColorPatch = (baseColor: string) => { @@ -124,7 +128,7 @@ export default function CourseCellColorPicker({ )}
- {hexCodeToBaseColor.has(hexCodeWithHash) && ( + {selectedBaseColor && ( <>
diff --git a/src/views/components/calendar/CalendarGrid/CalendarGrid.tsx b/src/views/components/calendar/CalendarGrid/CalendarGrid.tsx index f5f5cbdb..b5b1e39f 100644 --- a/src/views/components/calendar/CalendarGrid/CalendarGrid.tsx +++ b/src/views/components/calendar/CalendarGrid/CalendarGrid.tsx @@ -26,7 +26,7 @@ function CalendarHour({ hour }: { hour: number }) { } function makeGridRow(row: number, cols: number): JSX.Element { - const hour = hoursOfDay[row]; + const hour = hoursOfDay[row]!; return ( <> @@ -83,14 +83,17 @@ interface AccountForCourseConflictsProps { // TODO: Deal with react strict mode (wacky movements) function AccountForCourseConflicts({ courseCells, setCourse }: AccountForCourseConflictsProps): JSX.Element[] { // Groups by dayIndex to identify overlaps - const days = courseCells.reduce((acc, cell: CalendarGridCourse) => { - const { dayIndex } = cell.calendarGridPoint; - if (!acc[dayIndex]) { - acc[dayIndex] = []; - } - acc[dayIndex].push(cell); - return acc; - }, {}); + const days = courseCells.reduce( + (acc, cell: CalendarGridCourse) => { + const { dayIndex } = cell.calendarGridPoint; + if (acc[dayIndex] === undefined) { + acc[dayIndex] = []; + } + acc[dayIndex]!.push(cell); + return acc; + }, + {} as Record + ); // Check for overlaps within each day and adjust gridColumnIndex and totalColumns Object.values(days).forEach((dayCells: CalendarGridCourse[]) => { @@ -121,7 +124,7 @@ function AccountForCourseConflicts({ courseCells, setCourse }: AccountForCourseC }); return courseCells.map((block, i) => { - const { courseDeptAndInstr, timeAndLocation, status } = courseCells[i].componentProps; + const { courseDeptAndInstr, timeAndLocation, status } = courseCells[i]!.componentProps; return (
diff --git a/src/views/components/calendar/utils.ts b/src/views/components/calendar/utils.ts index 36fe7771..1076cd35 100644 --- a/src/views/components/calendar/utils.ts +++ b/src/views/components/calendar/utils.ts @@ -1,4 +1,6 @@ import { UserScheduleStore } from '@shared/storage/UserScheduleStore'; +import type { UserSchedule } from '@shared/types/UserSchedule'; +import type { Serialized } from 'chrome-extension-toolkit'; import { toPng } from 'html-to-image'; export const CAL_MAP = { @@ -13,9 +15,9 @@ export const CAL_MAP = { /** * Retrieves the schedule from the UserScheduleStore based on the active index. - * @returns {Promise} A promise that resolves to the retrieved schedule. + * @returns A promise that resolves to the retrieved schedule. */ -const getSchedule = async () => { +const getSchedule = async (): Promise | undefined> => { const schedules = await UserScheduleStore.get('schedules'); const activeIndex = await UserScheduleStore.get('activeIndex'); const schedule = schedules[activeIndex]; @@ -61,6 +63,10 @@ export const saveAsCal = async () => { let icsString = 'BEGIN:VCALENDAR\nVERSION:2.0\nCALSCALE:GREGORIAN\nX-WR-CALNAME:My Schedule\n'; + if (!schedule) { + throw new Error('No schedule found'); + } + schedule.courses.forEach(course => { course.schedule.meetings.forEach(meeting => { const { startTime, endTime, days, location } = meeting; @@ -85,7 +91,7 @@ export const saveAsCal = async () => { icsString += `DTEND:${endDate}\n`; icsString += `RRULE:FREQ=WEEKLY;BYDAY=${icsDays}\n`; icsString += `SUMMARY:${course.fullName}\n`; - icsString += `LOCATION:${location.building} ${location.room}\n`; + icsString += `LOCATION:${location?.building ?? ''} ${location?.room ?? ''}\n`; icsString += `END:VEVENT\n`; }); }); diff --git a/src/views/components/common/Button/Button.tsx b/src/views/components/common/Button/Button.tsx index 716ebac2..4f64cc91 100644 --- a/src/views/components/common/Button/Button.tsx +++ b/src/views/components/common/Button/Button.tsx @@ -63,7 +63,7 @@ export function Button({ disabled={disabled} onClick={disabled ? undefined : onClick} > - {icon && } + {Icon && } {!isIconOnly && ( {children} diff --git a/src/views/components/common/Card/Card.tsx b/src/views/components/common/Card/Card.tsx index 1659a70b..900cb057 100644 --- a/src/views/components/common/Card/Card.tsx +++ b/src/views/components/common/Card/Card.tsx @@ -9,7 +9,7 @@ import styles from './Card.module.scss'; export type Props = { style?: React.CSSProperties; className?: string; - onClick?: (...args) => void; + onClick?: (...args: unknown[]) => void; children?: React.ReactNode; testId?: string; }; diff --git a/src/views/components/common/Chip/Chip.tsx b/src/views/components/common/Chip/Chip.tsx index 8e0d1805..edd5c20e 100644 --- a/src/views/components/common/Chip/Chip.tsx +++ b/src/views/components/common/Chip/Chip.tsx @@ -31,7 +31,7 @@ export function Chip({ label }: React.PropsWithChildren): JSX.Element { style={{ backgroundColor: '#FFD600', }} - title={Object.keys(flagMap).find(key => flagMap[key] === label)} + title={Object.entries(flagMap).find(([full, short]) => short === label)![0]} > {label} diff --git a/src/views/components/common/Dialog/Dialog.tsx b/src/views/components/common/Dialog/Dialog.tsx index abb19d4f..260e2f60 100644 --- a/src/views/components/common/Dialog/Dialog.tsx +++ b/src/views/components/common/Dialog/Dialog.tsx @@ -6,7 +6,7 @@ import React, { Fragment } from 'react'; import ExtensionRoot from '../ExtensionRoot/ExtensionRoot'; -interface _DialogProps { +export interface _DialogProps { className?: string; title?: JSX.Element; description?: JSX.Element; @@ -21,7 +21,7 @@ export type DialogProps = _DialogProps & Omit): JSX.Element { - const { children, className, open, onTransitionEnd, ...rest } = props; + const { children, className, open, ...rest } = props; return ( diff --git a/src/views/components/common/ExtensionRoot/ExtensionRoot.tsx b/src/views/components/common/ExtensionRoot/ExtensionRoot.tsx index 71fa719c..674df187 100644 --- a/src/views/components/common/ExtensionRoot/ExtensionRoot.tsx +++ b/src/views/components/common/ExtensionRoot/ExtensionRoot.tsx @@ -34,8 +34,10 @@ export default function ExtensionRoot(props: React.PropsWithChildren): JS }, []); return ( -
- {props.children} -
+ +
+ {props.children} +
+
); } diff --git a/src/views/components/common/Link/Link.module.scss b/src/views/components/common/Link/Link.module.scss deleted file mode 100644 index f9770c18..00000000 --- a/src/views/components/common/Link/Link.module.scss +++ /dev/null @@ -1,11 +0,0 @@ -.link { - font-family: 'Inter', sans-serif; - text-decoration: underline; - cursor: pointer; -} - -.disabled { - cursor: not-allowed !important; - text-decoration: none !important; - color: #999999 !important; -} diff --git a/src/views/components/common/Link/Link.tsx b/src/views/components/common/Link/Link.tsx index 07cfef4d..e0fcdaf1 100644 --- a/src/views/components/common/Link/Link.tsx +++ b/src/views/components/common/Link/Link.tsx @@ -5,8 +5,6 @@ import clsx from 'clsx'; import type { PropsWithChildren } from 'react'; import React from 'react'; -import styles from './Link.module.scss'; - type Props = TextProps<'a'> & { href?: string; disabled?: boolean; @@ -19,7 +17,10 @@ export default function Link(props: PropsWithChildren): JSX.Element { let { className, href, ...passedProps } = props; if (href && !props.onClick) { - passedProps.onClick = () => background.openNewTab({ url: href }); + passedProps.onClick = e => { + e.preventDefault(); + background.openNewTab({ url: href }); + }; } const isDisabled = props.disabled || (!href && !props.onClick); @@ -28,11 +29,13 @@ export default function Link(props: PropsWithChildren): JSX.Element { color='bluebonnet' {...passedProps} as='a' + aria-disabled={isDisabled} + href={!isDisabled ? href : undefined} tabIndex={isDisabled ? -1 : 0} className={clsx( - styles.link, { - [styles.disabled]: isDisabled, + 'underline cursor-pointer': !isDisabled, + 'cursor-not-allowed color-ut-gray': isDisabled, }, props.className )} diff --git a/src/views/components/common/List/List.tsx b/src/views/components/common/List/List.tsx index 96631760..8cbe8060 100644 --- a/src/views/components/common/List/List.tsx +++ b/src/views/components/common/List/List.tsx @@ -31,7 +31,10 @@ function reorder(list: T[], startIndex: number, endIndex: number) { const listCopy = [...list]; const [removed] = listCopy.splice(startIndex, 1); - listCopy.splice(endIndex, 0, removed); + if (removed) { + listCopy.splice(endIndex, 0, removed); + } + return listCopy; } @@ -78,7 +81,7 @@ function List({ draggables, itemKey, children, onReordered, gap }: ListProps< // check if the draggables content has *actually* changed if ( draggables.length === items.length && - draggables.every((element, index) => itemKey(element) === items[index].id) + draggables.every((element, index) => itemKey(element) === items[index]?.id) ) { return; } @@ -86,12 +89,12 @@ function List({ draggables, itemKey, children, onReordered, gap }: ListProps< }, [draggables, itemKey, items]); const onDragEnd: OnDragEndResponder = useCallback( - result => { - if (!result.destination) return; - if (result.source.index === result.destination.index) return; + ({ destination, source }) => { + if (!destination) return; + if (source.index === destination.index) return; // will reorder in place - const reordered = reorder(items, result.source.index, result.destination.index); + const reordered = reorder(items, source.index, destination.index); setItems(reordered); onReordered(reordered.map(item => item.content)); @@ -125,7 +128,7 @@ function List({ draggables, itemKey, children, onReordered, gap }: ListProps< }} > - {transformFunction(items[rubric.source.index].content, provided.dragHandleProps)} + {transformFunction(items[rubric.source.index]!.content, provided.dragHandleProps!)} ); @@ -135,17 +138,22 @@ function List({ draggables, itemKey, children, onReordered, gap }: ListProps<
{items.map((item, index) => ( - {draggableProvided => ( + {({ innerRef, draggableProps, dragHandleProps }) => (
- {transformFunction(item.content, draggableProvided.dragHandleProps)} + { + transformFunction( + item.content, + dragHandleProps! + ) /* always exists; only doesn't when "isDragDisabled" is set */ + }
)}
diff --git a/src/views/components/common/PopupCourseBlock/PopupCourseBlock.tsx b/src/views/components/common/PopupCourseBlock/PopupCourseBlock.tsx index 32a8922b..5b0dbcfc 100644 --- a/src/views/components/common/PopupCourseBlock/PopupCourseBlock.tsx +++ b/src/views/components/common/PopupCourseBlock/PopupCourseBlock.tsx @@ -1,3 +1,4 @@ +import type { DraggableProvidedDragHandleProps } from '@hello-pangea/dnd'; import { background } from '@shared/messages'; import type { Course } from '@shared/types/Course'; import { Status } from '@shared/types/Course'; @@ -17,7 +18,7 @@ export interface PopupCourseBlockProps { className?: string; course: Course; colors: CourseColors; - dragHandleProps?: any; + dragHandleProps?: DraggableProvidedDragHandleProps; } /** diff --git a/src/views/components/common/ScheduleDropdown/ScheduleDropdown.tsx b/src/views/components/common/ScheduleDropdown/ScheduleDropdown.tsx index d1f496b1..14fc6829 100644 --- a/src/views/components/common/ScheduleDropdown/ScheduleDropdown.tsx +++ b/src/views/components/common/ScheduleDropdown/ScheduleDropdown.tsx @@ -9,7 +9,7 @@ import DropdownArrowUp from '~icons/material-symbols/arrow-drop-up'; /** * Props for the Dropdown component. */ -export type Props = { +export type ScheduleDropdownProps = { defaultOpen?: boolean; children: React.ReactNode; }; @@ -17,7 +17,7 @@ export type Props = { /** * This is a reusable dropdown component that can be used to toggle the visiblity of information */ -export default function ScheduleDropdown(props: Props) { +export default function ScheduleDropdown(props: ScheduleDropdownProps) { const [activeSchedule] = useSchedules(); return ( diff --git a/src/views/components/common/ScheduleListItem/ScheduleListItem.tsx b/src/views/components/common/ScheduleListItem/ScheduleListItem.tsx index 8abd96fd..46bccda7 100644 --- a/src/views/components/common/ScheduleListItem/ScheduleListItem.tsx +++ b/src/views/components/common/ScheduleListItem/ScheduleListItem.tsx @@ -59,7 +59,7 @@ export default function ScheduleListItem({ schedule, dragHandleProps, onClick }:
!isEditing && onClick(...e)} + onClick={(...e) => !isEditing && onClick?.(...e)} >
= { ref?: React.ForwardedRef>; }; -type AsProps = CleanProps & OurProps & TOverrides; +type AsProps = CleanProps & + OurProps & + TOverrides; const variants = ['mini', 'small', 'p', 'h4', 'h3-course', 'h3', 'h2-course', 'h2', 'h1-course', 'h1'] as const; @@ -25,14 +27,15 @@ type Variant = (typeof variants)[number]; /** * Props for the Text component. */ -export type TextProps = PropsOf['className'] extends string - ? AsProps< - TTag, - { - variant?: Variant; - } - > - : never; +export type TextProps = + NonNullable['className']> extends string + ? AsProps< + TTag, + { + variant?: Variant; + } + > + : never; /** * A reusable Text component with props that build on top of the design system for the extension @@ -47,4 +50,4 @@ function Text( return ; } -export default React.forwardRef(Text) as typeof Text; +export default React.forwardRef(Text) as (props: TextProps) => JSX.Element; diff --git a/src/views/components/injected/AutoLoad/AutoLoad.tsx b/src/views/components/injected/AutoLoad/AutoLoad.tsx index f3941f3b..661d6396 100644 --- a/src/views/components/injected/AutoLoad/AutoLoad.tsx +++ b/src/views/components/injected/AutoLoad/AutoLoad.tsx @@ -21,7 +21,7 @@ type Props = { * This component is responsible for loading the next page of courses when the user scrolls to the bottom of the page. * @returns */ -export default function AutoLoad({ addRows }: Props): JSX.Element { +export default function AutoLoad({ addRows }: Props): JSX.Element | null { const [container, setContainer] = useState(null); const [status, setStatus] = useState(AutoLoadStatus.IDLE); diff --git a/src/views/components/injected/CourseCatalogInjectedPopup/GradeDistribution.tsx b/src/views/components/injected/CourseCatalogInjectedPopup/GradeDistribution.tsx index 26b4eaa1..6b9e65e8 100644 --- a/src/views/components/injected/CourseCatalogInjectedPopup/GradeDistribution.tsx +++ b/src/views/components/injected/CourseCatalogInjectedPopup/GradeDistribution.tsx @@ -53,40 +53,41 @@ export default function GradeDistribution({ course }: GradeDistributionProps): J const [status, setStatus] = React.useState(DataStatus.LOADING); const ref = React.useRef(null); - const chartData = React.useMemo(() => { - if (status === DataStatus.FOUND && distributions[semester]) { - return Object.entries(distributions[semester]).map(([grade, count]) => ({ - y: count, - color: GRADE_COLORS[grade as LetterGrade], - })); - } - return Array(12).fill(0); - }, [distributions, semester, status]); + // const chartData = React.useMemo(() => { + // if (status === DataStatus.FOUND && distributions[semester]) { + // return Object.entries(distributions[semester]).map(([grade, count]) => ({ + // y: count, + // color: GRADE_COLORS[grade as LetterGrade], + // })); + // } + // return Array(12).fill(0); + // }, [distributions, semester, status]); + // const chartData: unknown[] = []; - React.useEffect(() => { - const fetchInitialData = async () => { - try { - const [aggregateDist, semesters] = await queryAggregateDistribution(course); - const initialDistributions: Record = { Aggregate: aggregateDist }; - const semesterPromises = semesters.map(semester => querySemesterDistribution(course, semester)); - const semesterDistributions = await Promise.all(semesterPromises); - semesters.forEach((semester, i) => { - initialDistributions[`${semester.season} ${semester.year}`] = semesterDistributions[i]; - }); - setDistributions(initialDistributions); - setStatus(DataStatus.FOUND); - } catch (e) { - console.error(e); - if (e instanceof NoDataError) { - setStatus(DataStatus.NOT_FOUND); - } else { - setStatus(DataStatus.ERROR); - } - } - }; + // React.useEffect(() => { + // const fetchInitialData = async () => { + // try { + // const [aggregateDist, semesters] = await queryAggregateDistribution(course); + // const initialDistributions: Record = { Aggregate: aggregateDist }; + // const semesterPromises = semesters.map(semester => querySemesterDistribution(course, semester)); + // const semesterDistributions = await Promise.all(semesterPromises); + // semesters.forEach((semester, i) => { + // initialDistributions[`${semester.season} ${semester.year}`] = semesterDistributions[i]; + // }); + // setDistributions(initialDistributions); + // setStatus(DataStatus.FOUND); + // } catch (e) { + // console.error(e); + // if (e instanceof NoDataError) { + // setStatus(DataStatus.NOT_FOUND); + // } else { + // setStatus(DataStatus.ERROR); + // } + // } + // }; - fetchInitialData(); - }, [course]); + // fetchInitialData(); + // }, [course]); const handleSelectSemester = (event: React.ChangeEvent) => { setSemester(event.target.value); @@ -129,7 +130,7 @@ export default function GradeDistribution({ course }: GradeDistributionProps): J { type: 'column', name: 'Grades', - data: chartData, + // data: chartData, }, ], }; @@ -156,7 +157,7 @@ export default function GradeDistribution({ course }: GradeDistributionProps): J <>
Grade distribution for {`${course.department} ${course.number}`} - + */}
diff --git a/src/views/components/injected/CourseCatalogInjectedPopup/HeadingAndActions.tsx b/src/views/components/injected/CourseCatalogInjectedPopup/HeadingAndActions.tsx index 07ec926d..411a2315 100644 --- a/src/views/components/injected/CourseCatalogInjectedPopup/HeadingAndActions.tsx +++ b/src/views/components/injected/CourseCatalogInjectedPopup/HeadingAndActions.tsx @@ -52,7 +52,7 @@ export default function HeadingAndActions({ course, activeSchedule, onClose }: H const formattedUniqueId = uniqueId.toString().padStart(5, '0'); const getInstructorFullName = (instructor: Instructor) => { - const { firstName, lastName } = instructor; + const { firstName = '', lastName = '' } = instructor; if (firstName === '') return capitalizeString(lastName); return `${capitalizeString(firstName)} ${capitalizeString(lastName)}`; }; @@ -76,7 +76,7 @@ export default function HeadingAndActions({ course, activeSchedule, onClose }: H const handleOpenCES = async () => { const openTabs = instructors.map(instructor => { - let { firstName, lastName } = instructor; + let { firstName = '', lastName = '' } = instructor; firstName = capitalizeString(firstName); lastName = capitalizeString(lastName); return openCESPage({ instructorFirstName: firstName, instructorLastName: lastName }); @@ -134,9 +134,12 @@ export default function HeadingAndActions({ course, activeSchedule, onClose }: H .flatMap((el, i) => (i === 0 ? [el] : [', ', el]))} )} -
- {flags.map(flag => ( - +
+ {flags.map((flag: string) => ( + ))}
@@ -145,7 +148,11 @@ export default function HeadingAndActions({ course, activeSchedule, onClose }: H const daysString = meeting.getDaysString({ format: 'long', separator: 'long' }); const timeString = meeting.getTimeString({ separator: ' to ', capitalize: false }); return ( - + {daysString} {timeString} {meeting.location && ( <> diff --git a/src/views/components/injected/RecruitmentBanner/RecruitmentBanner.tsx b/src/views/components/injected/RecruitmentBanner/RecruitmentBanner.tsx index 923e0ff6..cd636f74 100644 --- a/src/views/components/injected/RecruitmentBanner/RecruitmentBanner.tsx +++ b/src/views/components/injected/RecruitmentBanner/RecruitmentBanner.tsx @@ -14,7 +14,7 @@ const RECRUIT_FROM_DEPARTMENTS = ['C S', 'ECE', 'MIS', 'CSE', 'EE', 'ITD']; * This adds a new column to the course catalog table header. * @returns a react portal to the new column or null if the column has not been created yet. */ -export default function RecruitmentBanner(): JSX.Element { +export default function RecruitmentBanner(): JSX.Element | null { const [container, setContainer] = useState(null); useEffect(() => { diff --git a/src/views/components/injected/TableRow/TableRow.tsx b/src/views/components/injected/TableRow/TableRow.tsx index e0540df9..c1addabe 100644 --- a/src/views/components/injected/TableRow/TableRow.tsx +++ b/src/views/components/injected/TableRow/TableRow.tsx @@ -12,7 +12,7 @@ import styles from './TableRow.module.scss'; interface Props { isSelected: boolean; row: ScrapedRow; - onClick: (...args: any[]) => any; + onClick: (...args: unknown[]) => unknown; activeSchedule?: UserSchedule; } @@ -29,7 +29,7 @@ export default function TableRow({ row, isSelected, activeSchedule, onClick }: P const { element, course } = row; useEffect(() => { - element.classList.add(styles.row); + element.classList.add(styles.row!); element.classList.add('group'); const portalContainer = document.createElement('td'); // portalContainer.style.textAlign = 'right'; @@ -39,12 +39,12 @@ export default function TableRow({ row, isSelected, activeSchedule, onClick }: P return () => { portalContainer.remove(); - element.classList.remove(styles.row); + element.classList.remove(styles.row!); }; }, [element]); useEffect(() => { - element.classList[isSelected ? 'add' : 'remove'](styles.selectedRow); + element.classList[isSelected ? 'add' : 'remove'](styles.selectedRow!); }, [isSelected, element.classList]); useEffect(() => { @@ -52,10 +52,10 @@ export default function TableRow({ row, isSelected, activeSchedule, onClick }: P const isInSchedule = activeSchedule.containsCourse(course); - element.classList[isInSchedule ? 'add' : 'remove'](styles.inActiveSchedule); + element.classList[isInSchedule ? 'add' : 'remove'](styles.inActiveSchedule!); return () => { - element.classList.remove(styles.inActiveSchedule); + element.classList.remove(styles.inActiveSchedule!); }; }, [activeSchedule, course, element.classList]); @@ -72,11 +72,11 @@ export default function TableRow({ row, isSelected, activeSchedule, onClick }: P } } - element.classList[conflicts.length ? 'add' : 'remove'](styles.isConflict); + element.classList[conflicts.length ? 'add' : 'remove'](styles.isConflict!); setConflicts(conflicts); return () => { - element.classList.remove(styles.isConflict); + element.classList.remove(styles.isConflict!); setConflicts([]); }; }, [activeSchedule, course, element.classList]); diff --git a/src/views/components/injected/TableSubheading/TableSubheading.tsx b/src/views/components/injected/TableSubheading/TableSubheading.tsx index d42bdb0b..5ff9b592 100644 --- a/src/views/components/injected/TableSubheading/TableSubheading.tsx +++ b/src/views/components/injected/TableSubheading/TableSubheading.tsx @@ -15,10 +15,10 @@ export default function TableSubheading({ row }: Props): JSX.Element | null { const { element } = row; useEffect(() => { - element.classList.add(styles.subheader); + element.classList.add(styles.subheader!); return () => { - element.classList.remove(styles.subheader); + element.classList.remove(styles.subheader!); }; }, [element]); diff --git a/src/views/hooks/useFlattenedCourseSchedule.ts b/src/views/hooks/useFlattenedCourseSchedule.ts index 656a90c7..66433f28 100644 --- a/src/views/hooks/useFlattenedCourseSchedule.ts +++ b/src/views/hooks/useFlattenedCourseSchedule.ts @@ -2,7 +2,7 @@ import type { HexColor } from '@shared/types/Color'; import type { Course, StatusType } from '@shared/types/Course'; import type { CourseMeeting } from '@shared/types/CourseMeeting'; import { colors } from '@shared/types/ThemeColors'; -import { UserSchedule } from '@shared/types/UserSchedule'; +import type { UserSchedule } from '@shared/types/UserSchedule'; import type { CalendarCourseCellProps } from '@views/components/calendar/CalendarCourseCell/CalendarCourseCell'; import useSchedules from './useSchedules'; @@ -13,6 +13,8 @@ const dayToNumber = { Wednesday: 2, Thursday: 3, Friday: 4, + Saturday: 5, + Sunday: 6, } as const satisfies Record; interface CalendarGridPoint { @@ -42,7 +44,7 @@ export interface CalendarGridCourse { */ export interface FlattenedCourseSchedule { courseCells: CalendarGridCourse[]; - activeSchedule?: UserSchedule; + activeSchedule: UserSchedule; } /** @@ -59,46 +61,22 @@ export const convertMinutesToIndex = (minutes: number): number => Math.floor((mi export function useFlattenedCourseSchedule(): FlattenedCourseSchedule { const [activeSchedule] = useSchedules(); - if (!activeSchedule) { - return { - courseCells: [] as CalendarGridCourse[], - activeSchedule: new UserSchedule({ - courses: [], - id: 'error', - name: 'Something may have went wrong', - hours: 0, - updatedAt: Date.now(), - }), - } satisfies FlattenedCourseSchedule; - } - - if (activeSchedule.courses.length === 0) { - return { - courseCells: [] as CalendarGridCourse[], - activeSchedule, - } satisfies FlattenedCourseSchedule; - } - - const { courses, name, hours } = activeSchedule; - - const processedCourses = courses - .flatMap((course: Course) => { + const processedCourses = activeSchedule.courses + .flatMap(course => { const { status, courseDeptAndInstr, meetings } = extractCourseInfo(course); if (meetings.length === 0) { return processAsyncCourses({ courseDeptAndInstr, status, course }); } - return meetings.flatMap((meeting: CourseMeeting) => - processInPersonMeetings(meeting, { courseDeptAndInstr, status, course }) - ); + return meetings.flatMap(meeting => processInPersonMeetings(meeting, courseDeptAndInstr, status, course)); }) .sort(sortCourses); return { - courseCells: processedCourses as CalendarGridCourse[], - activeSchedule: { name, courses, hours } as UserSchedule, - } satisfies FlattenedCourseSchedule; + courseCells: processedCourses, + activeSchedule, + }; } /** @@ -109,7 +87,7 @@ function extractCourseInfo(course: Course) { status, schedule: { meetings }, } = course; - const courseDeptAndInstr = `${course.department} ${course.number} – ${course.instructors[0].lastName}`; + const courseDeptAndInstr = `${course.department} ${course.number} – ${course.instructors[0]?.lastName}`; return { status, courseDeptAndInstr, meetings, course }; } @@ -149,12 +127,17 @@ function processAsyncCourses({ /** * Function to process each in-person class into its distinct meeting objects for calendar grid */ -function processInPersonMeetings(meeting: CourseMeeting, { courseDeptAndInstr, status, course }) { +function processInPersonMeetings( + meeting: CourseMeeting, + courseDeptAndInstr: string, + status: StatusType, + course: Course +) { const { days, startTime, endTime, location } = meeting; const midnightIndex = 1440; const normalizingTimeFactor = 720; const time = meeting.getTimeString({ separator: '-', capitalize: true }); - const timeAndLocation = `${time} - ${location ? location.building : 'WB'}`; + const timeAndLocation = `${time}${location ? ` - ${location.building}` : ''}`; const normalizedStartTime = startTime >= midnightIndex ? startTime - normalizingTimeFactor : startTime; const normalizedEndTime = endTime >= midnightIndex ? endTime - normalizingTimeFactor : endTime; diff --git a/src/views/hooks/useKeyPress.ts b/src/views/hooks/useKeyPress.ts index 24edf9f8..35bf9ade 100644 --- a/src/views/hooks/useKeyPress.ts +++ b/src/views/hooks/useKeyPress.ts @@ -5,11 +5,11 @@ import { useEffect } from 'react'; * @param key the key to listen for * @param callback the callback to call when the key is pressed */ -export function useKeyPress(key: string, callback: (...args: any[]) => void): void { +export function useKeyPress(key: string, callback: (event: KeyboardEvent) => void): void { useEffect(() => { const handleKeyDown = (event: KeyboardEvent) => { if (event.key === key) { - callback(); + callback(event); } }; document.addEventListener('keydown', handleKeyDown); diff --git a/src/views/hooks/useSchedules.ts b/src/views/hooks/useSchedules.ts index dbe351eb..613bbf33 100644 --- a/src/views/hooks/useSchedules.ts +++ b/src/views/hooks/useSchedules.ts @@ -2,7 +2,7 @@ import { UserScheduleStore } from '@shared/storage/UserScheduleStore'; import { UserSchedule } from '@shared/types/UserSchedule'; import { useEffect, useState } from 'react'; -let schedulesCache = []; +let schedulesCache: UserSchedule[] = []; let activeIndexCache = -1; let initialLoad = true; diff --git a/src/views/lib/CourseCatalogScraper.ts b/src/views/lib/CourseCatalogScraper.ts index abc417be..b8176c27 100644 --- a/src/views/lib/CourseCatalogScraper.ts +++ b/src/views/lib/CourseCatalogScraper.ts @@ -165,7 +165,7 @@ export class CourseCatalogScraper { .filter(Boolean); return names.map(fullName => { - const [lastName, rest] = fullName.split(',').map(s => s.trim()); + const [lastName, rest = ''] = fullName.split(',').map(s => s.trim()); const [firstName, middleInitial] = rest.split(' '); return new Instructor({ @@ -334,13 +334,11 @@ export class CourseCatalogScraper { const schedule = new CourseSchedule(); for (let i = 0; i < dayLines.length; i += 1) { - schedule.meetings.push( - CourseSchedule.parse( - dayLines[i].textContent || '', - hourLines[i].textContent || '', - locLines[i].textContent || '' - ) - ); + const dayText = dayLines[i]?.textContent || ''; + const hourText = hourLines[i]?.textContent || ''; + const locationText = locLines[i]?.textContent || ''; + + schedule.meetings.push(CourseSchedule.parse(dayText, hourText, locationText)); } return schedule; diff --git a/src/views/lib/database/queryDistribution.ts b/src/views/lib/database/queryDistribution.ts index a024d08e..9bed9667 100644 --- a/src/views/lib/database/queryDistribution.ts +++ b/src/views/lib/database/queryDistribution.ts @@ -20,7 +20,7 @@ export async function queryAggregateDistribution(course: Course): Promise<[Distr let row: Required = {} as Required; res.columns.forEach((col, i) => { - row[res.columns[i]] = res.values[0][i]; + row[col as keyof CourseSQLRow] = res.values[0]![i]! as never; }); const distribution: Distribution = { @@ -48,6 +48,9 @@ export async function queryAggregateDistribution(course: Course): Promise<[Distr rawSemesters.forEach((sem: string) => { const [season, year] = sem.split(' '); + if (!season || !year) { + throw new Error('Season is undefined'); + } semesters.push({ year: parseInt(year, 10), season: season as Semester['season'] }); }); @@ -92,7 +95,7 @@ export async function querySemesterDistribution(course: Course, semester: Semest let row: Required = {} as Required; res.columns.forEach((col, i) => { - row[res.columns[i]] = res.values[0][i]; + row[col as keyof CourseSQLRow] = res.values[0]![i]! as never; }); const distribution: Distribution = { diff --git a/tsconfig.json b/tsconfig.json index 3f4e470d..a17fda0d 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -14,6 +14,10 @@ "types": ["vite/client", "unplugin-icons/types/react", "node"], "noFallthroughCasesInSwitch": true, "allowSyntheticDefaultImports": true, + "strict": true, + "noUncheckedIndexedAccess": true, + "moduleDetection": "force", + "isolatedModules": true, "paths": { "src/*": ["src/*"], "@assets/*": ["src/assets/*"], diff --git a/vite.config.ts b/vite.config.ts index c5b1e402..11fdb4e4 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -4,7 +4,7 @@ import react from '@vitejs/plugin-react-swc'; import { resolve } from 'path'; import UnoCSS from 'unocss/vite'; import Icons from 'unplugin-icons/vite'; -import type { Plugin, ResolvedConfig, ViteDevServer } from 'vite'; +import type { Plugin, ResolvedConfig, Rollup, ViteDevServer } from 'vite'; import { defineConfig } from 'vite'; import inspect from 'vite-plugin-inspect'; @@ -26,9 +26,11 @@ window.$RefreshSig$ = () => (type) => type window.__vite_plugin_react_preamble_installed__ = true `; +const isOutputChunk = (input: Rollup.OutputAsset | Rollup.OutputChunk): input is Rollup.OutputChunk => 'code' in input; + const renameFile = (source: string, destination: string): Plugin => { if (typeof source !== 'string' || typeof destination !== 'string') { - return; + throw new Error('Invalid arguments for renameFile'); } return { @@ -36,25 +38,30 @@ const renameFile = (source: string, destination: string): Plugin => { apply: 'build', enforce: 'post', generateBundle(options, bundle) { - if (!bundle[source]) return; - bundle[source].fileName = destination; + const file = bundle[source]; + if (!file) return; + file.fileName = destination; }, }; }; -const fixManifestOptionsPage = () => ({ +const fixManifestOptionsPage = (): Plugin => ({ name: 'fix-manifest-options-page', - apply: 'build' as const, - enforce: 'post' as const, + apply: 'build', + enforce: 'post', generateBundle(_, bundle) { for (const fileName of Object.keys(bundle)) { if (fileName.startsWith('assets/crx-manifest')) { const chunk = bundle[fileName]; - chunk.code = chunk.code.replace( - /"options_page":"src\/pages\/options\/index.html"/, - `"options_page":"options.html"` - ); - break; + if (!chunk) continue; + + if (isOutputChunk(chunk)) { + chunk.code = chunk.code.replace( + /"options_page":"src\/pages\/options\/index.html"/, + `"options_page":"options.html"` + ); + return; + } } } }, @@ -126,6 +133,7 @@ export default defineConfig({ return code; }, }, + renameFile('src/pages/debug/index.html', 'debug.html'), renameFile('src/pages/options/index.html', 'options.html'), renameFile('src/pages/calendar/index.html', 'calendar.html'), ],