diff --git a/.eslintrc.json b/.eslintrc.json index d5189a65..c53d8487 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -10,13 +10,44 @@ "eslint:recommended", "plugin:@typescript-eslint/recommended", "plugin:react/recommended", - "prettier", - "prettier/react" + "plugin:import/recommended", + "plugin:import/typescript", + "prettier" ], "rules": { "react/prop-types": [2], "react-hooks/rules-of-hooks": "error", - "@typescript-eslint/no-non-null-assertion": "off" + "@typescript-eslint/no-non-null-assertion": "off", + "@typescript-eslint/no-unused-vars": [ + "warn", + { + "argsIgnorePattern": "^_", + "varsIgnorePattern": "^_", + "caughtErrorsIgnorePattern": "^_" + } + ], + "import/order": [ + "error", + { + "groups": ["builtin", "external", "internal", "parent", "sibling", "index", "object", "type", "unknown"], + "pathGroups": [ + { + "pattern": "*.+(svg|jpg|jpeg)", + "group": "unknown", + "patternOptions": { "matchBase": true, "dot": true, "nocomment": true }, + "position": "after" + }, + { + "pattern": "*.+(css|scss)", + "group": "unknown", + "patternOptions": { "matchBase": true, "dot": true, "nocomment": true }, + "position": "after" + } + ], + "alphabetize": { "order": "asc" }, + "warnOnUnassignedImports": true + } + ] }, "env": { "es6": true, @@ -25,6 +56,10 @@ "settings": { "react": { "version": "18.2" + }, + "import/resolver": { + "typescript": true, + "node": true } } } diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 8b59072e..22cf043a 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -47,6 +47,7 @@ repos: verbose: true # always display output files: \.[jt]sx?$ # *.js, *.jsx, *.ts and *.tsx types: [file] + args: ["--fix"] # (s)css - repo: https://github.com/thibaudcolas/pre-commit-stylelint rev: v15.10.3 diff --git a/csm_web/frontend/src/components/App.tsx b/csm_web/frontend/src/components/App.tsx index 167ace2d..6799ce7c 100644 --- a/csm_web/frontend/src/components/App.tsx +++ b/csm_web/frontend/src/components/App.tsx @@ -1,20 +1,20 @@ -import React, { useEffect, useState } from "react"; +import React, { Component, useEffect, useState } from "react"; import { Link, NavLink, NavLinkProps, Outlet, Route, Routes, useLocation } from "react-router-dom"; + import { useProfiles } from "../utils/queries/base"; import { useMatcherActiveCourses } from "../utils/queries/matcher"; +import { Role } from "../utils/types"; import { emptyRoles, Roles } from "../utils/user"; import CourseMenu from "./CourseMenu"; -import { EnrollmentMatcher } from "./enrollment_automation/EnrollmentMatcher"; import Home from "./Home"; import Policies from "./Policies"; +import { EnrollmentMatcher } from "./enrollment_automation/EnrollmentMatcher"; import { Resources } from "./resource_aggregation/Resources"; import Section from "./section/Section"; -// Images -import LogoNoText from "../../static/frontend/img/logo_no_text.svg"; import LogOutIcon from "../../static/frontend/img/log_out.svg"; +import LogoNoText from "../../static/frontend/img/logo_no_text.svg"; -// Styles import "../css/header.scss"; import "../css/home.scss"; @@ -107,10 +107,10 @@ function Header(): React.ReactElement { // ignore if not active continue; } - if (profile.role === "COORDINATOR") { - roles["COORDINATOR"].add(profile.courseId); - } else if (profile.role === "MENTOR" && profile.sectionId === undefined) { - roles["MENTOR"].add(profile.courseId); + if (profile.role === Role.COORDINATOR) { + roles[Role.COORDINATOR].add(profile.courseId); + } else if (profile.role === Role.MENTOR && profile.sectionId === undefined) { + roles[Role.MENTOR].add(profile.courseId); } } setActiveMatcherRoles(roles); @@ -128,7 +128,7 @@ function Header(): React.ReactElement {

Resources

- {activeMatcherRoles["COORDINATOR"].size > 0 || activeMatcherRoles["MENTOR"].size > 0 ? ( + {activeMatcherRoles[Role.COORDINATOR].size > 0 || activeMatcherRoles[Role.MENTOR].size > 0 ? (

Matcher

@@ -175,7 +175,7 @@ interface ErrorPageProps { * Error boundary component; must be a class component, * as there is currently no equivalent hook. */ -class ErrorBoundary extends React.Component { +class ErrorBoundary extends Component { constructor(props: ErrorBoundaryProps) { super(props); this.state = { error: null }; diff --git a/csm_web/frontend/src/components/CourseMenu.tsx b/csm_web/frontend/src/components/CourseMenu.tsx index aa121ad2..a4d67e90 100644 --- a/csm_web/frontend/src/components/CourseMenu.tsx +++ b/csm_web/frontend/src/components/CourseMenu.tsx @@ -1,14 +1,14 @@ +import { DateTime } from "luxon"; import React, { useEffect, useState } from "react"; import { Link, Route, Routes } from "react-router-dom"; -import { useCourses } from "../utils/queries/courses"; + +import { DEFAULT_LONG_LOCALE_OPTIONS, DEFAULT_TIMEZONE } from "../utils/datetime"; import { useUserInfo } from "../utils/queries/base"; +import { useCourses } from "../utils/queries/courses"; import { Course as CourseType, UserInfo } from "../utils/types"; -import Course from "./course/Course"; import LoadingSpinner from "./LoadingSpinner"; -import { DateTime } from "luxon"; -import { DEFAULT_LONG_LOCALE_OPTIONS, DEFAULT_TIMEZONE } from "../utils/datetime"; +import Course from "./course/Course"; -// Styles import "../css/course-menu.scss"; const CourseMenu = () => { @@ -50,12 +50,10 @@ const CourseMenu = () => { userInfo = null; } - let show_enrollment_times = false; const enrollment_times_by_course: Array<{ courseName: string; enrollmentDate: DateTime }> = []; if (courses !== null) { for (const course of courses.values()) { - show_enrollment_times ||= !course.enrollmentOpen; if (!course.enrollmentOpen) { enrollment_times_by_course.push({ courseName: course.name, diff --git a/csm_web/frontend/src/components/Home.tsx b/csm_web/frontend/src/components/Home.tsx index 4cbbc007..b8f0298f 100644 --- a/csm_web/frontend/src/components/Home.tsx +++ b/csm_web/frontend/src/components/Home.tsx @@ -1,17 +1,15 @@ +import { groupBy } from "lodash"; import React from "react"; import { Link } from "react-router-dom"; -import { groupBy } from "lodash"; + +import { formatSpacetimeInterval } from "../utils/datetime"; import { useProfiles } from "../utils/queries/base"; import { useCourses } from "../utils/queries/courses"; -import { ROLES } from "./section/Section"; -import { Profile, Course } from "../utils/types"; +import { Profile, Course, Role } from "../utils/types"; import LoadingSpinner from "./LoadingSpinner"; -import { formatSpacetimeInterval } from "../utils/datetime"; -// Images import PlusIcon from "../../static/frontend/img/plus.svg"; -// Styles import scssColors from "../css/base/colors-export.module.scss"; const Home = () => { @@ -42,7 +40,7 @@ const Home = () => { } }) .map(([course, courseProfiles]) => { - if (courseProfiles[0].role === ROLES.MENTOR) { + if (courseProfiles[0].role === Role.MENTOR) { const courseProfilesWithSection = courseProfiles.filter((profile: Profile) => profile.sectionId); if (courseProfilesWithSection.length > 0) { return ; @@ -115,7 +113,7 @@ const CourseCard = ({ profiles }: CourseCardProps): React.ReactElement => { ); }; - if (role === ROLES.COORDINATOR) { + if (role === Role.COORDINATOR) { return ( diff --git a/csm_web/frontend/src/components/Modal.tsx b/csm_web/frontend/src/components/Modal.tsx index 1957a328..8a6924dd 100644 --- a/csm_web/frontend/src/components/Modal.tsx +++ b/csm_web/frontend/src/components/Modal.tsx @@ -1,9 +1,8 @@ -import React, { useContext } from "react"; +import React, { createContext, useContext } from "react"; -// Images import XIcon from "../../static/frontend/img/x.svg"; -const ModalContext = React.createContext(Function.prototype); +const ModalContext = createContext(Function.prototype); interface ModalProps { children: React.ReactNode; diff --git a/csm_web/frontend/src/components/Policies.tsx b/csm_web/frontend/src/components/Policies.tsx index b16fbaf4..e86b83c0 100644 --- a/csm_web/frontend/src/components/Policies.tsx +++ b/csm_web/frontend/src/components/Policies.tsx @@ -1,204 +1,201 @@ import React from "react"; -// Styles -import "../css/policies.scss"; +import { SECTIONS } from "../../static/frontend/data/enrollment_policies"; -// Data -import SECTIONS from "../../static/frontend/data/enrollment_policies"; +import "../css/policies.scss"; -export default class Policies extends React.Component { - render(): React.ReactNode { - // see SECTIONS doc below to understand what is going on here - const intro = SECTIONS.introduction; - const htsu = SECTIONS.howToSignUp; - const guides = SECTIONS.guidelines; - const comms = SECTIONS.communications; - const aff = SECTIONS.affinitySections; - const forUnit = SECTIONS.csmForUnit; - const faq = SECTIONS.faq; - return ( -
-
-
-

{intro.title}

-

- {intro.body.p1_a.text} - {intro.body.p1} -

-

- {intro.body.p2} -

-
+const Policies = () => { + // see SECTIONS doc below to understand what is going on here + const intro = SECTIONS.introduction; + const htsu = SECTIONS.howToSignUp; + const guides = SECTIONS.guidelines; + const comms = SECTIONS.communications; + const aff = SECTIONS.affinitySections; + const forUnit = SECTIONS.csmForUnit; + const faq = SECTIONS.faq; + return ( +
+
+
+

{intro.title}

+

+ {intro.body.p1_a.text} + {intro.body.p1} +

+

+ {intro.body.p2} +

+
-
+
-
-

{htsu.title}

-

- {htsu.body.p1_1} - {htsu.body.p1_a.text} - {htsu.body.p1_2} - {htsu.body.p1_b} -

-

{htsu.body.p2}

-
+
+

{htsu.title}

+

+ {htsu.body.p1_1} + {htsu.body.p1_a.text} + {htsu.body.p1_2} + {htsu.body.p1_b} +

+

{htsu.body.p2}

+
-
+
-
-

{guides.title}

-
    -
  1. - {guides.body.i1_1} - {guides.body.i1_b} -
  2. -
  3. {guides.body.i2}
  4. -
  5. - {guides.body.i3_1} - {guides.body.i3_b} - {guides.body.i3_2} -
  6. -
  7. - {guides.body.i4_1} - {guides.body.i4_b} - {guides.body.i4_2} - {guides.body.i4_b2} -
  8. -
  9. {guides.body.i5}
  10. -
-
+
+

{guides.title}

+
    +
  1. + {guides.body.i1_1} + {guides.body.i1_b} +
  2. +
  3. {guides.body.i2}
  4. +
  5. + {guides.body.i3_1} + {guides.body.i3_b} + {guides.body.i3_2} +
  6. +
  7. + {guides.body.i4_1} + {guides.body.i4_b} + {guides.body.i4_2} + {guides.body.i4_b2} +
  8. +
  9. {guides.body.i5}
  10. +
+
-
+
-
-

{comms.title}

-

- {comms.body.p1_1} - {comms.body.p1_a.text} - {comms.body.p1_2} -

-

- {comms.body.p2_1} - {comms.body.p2_a.text} - {comms.body.p2_2} -

-
+
+

{comms.title}

+

+ {comms.body.p1_1} + {comms.body.p1_a.text} + {comms.body.p1_2} +

+

+ {comms.body.p2_1} + {comms.body.p2_a.text} + {comms.body.p2_2} +

+
-
+
-
-

{aff.title}

-

{aff.body.p1}

-
    -
  • - {aff.body.i1_b} - {aff.body.i1_2} -
  • -
  • - {aff.body.i2_b} - {aff.body.i2_2} -
  • -
  • - {aff.body.i3_b} - {aff.body.i3_2} -
  • -
- {aff.body.p2} -
+
+

{aff.title}

+

{aff.body.p1}

+
    +
  • + {aff.body.i1_b} + {aff.body.i1_2} +
  • +
  • + {aff.body.i2_b} + {aff.body.i2_2} +
  • +
  • + {aff.body.i3_b} + {aff.body.i3_2} +
  • +
+ {aff.body.p2} +
-
+
-
-

{forUnit.title}

-

- {forUnit.body.p1_1} - {forUnit.body.p1_b} - {forUnit.body.p1_2} - {forUnit.body.p1_b2} -

-

- {forUnit.body.p2_1} - {forUnit.body.p2_b} - {forUnit.body.p2_2} -

-

- {forUnit.body.p3_1} - {forUnit.body.p3_b} - {forUnit.body.p3_2} -

-

- {forUnit.body.p4_1} - {forUnit.body.p4_b} - {forUnit.body.p4_2} -

-

{forUnit.body.p5}

-

{forUnit.body.p6}

-
    -
  • {forUnit.body.li2_1}
  • -
  • - {forUnit.body.li2_2.bullet} - -
  • -
  • - {forUnit.body.li2_3.bullet} -
      -
    • - {forUnit.body.li2_3.subbull_b} - {forUnit.body.li2_3.subbull_2} -
    • -
    -
  • -
-
+
+

{forUnit.title}

+

+ {forUnit.body.p1_1} + {forUnit.body.p1_b} + {forUnit.body.p1_2} + {forUnit.body.p1_b2} +

+

+ {forUnit.body.p2_1} + {forUnit.body.p2_b} + {forUnit.body.p2_2} +

+

+ {forUnit.body.p3_1} + {forUnit.body.p3_b} + {forUnit.body.p3_2} +

+

+ {forUnit.body.p4_1} + {forUnit.body.p4_b} + {forUnit.body.p4_2} +

+

{forUnit.body.p5}

+

{forUnit.body.p6}

+
    +
  • {forUnit.body.li2_1}
  • +
  • + {forUnit.body.li2_2.bullet} + +
  • +
  • + {forUnit.body.li2_3.bullet} +
      +
    • + {forUnit.body.li2_3.subbull_b} + {forUnit.body.li2_3.subbull_2} +
    • +
    +
  • +
+
-
+
-
-

{faq.title}

-

- {" "} - {faq.body.p1_b} {" "} -

-

{faq.body.p2}

-

- {" "} - {faq.body.p3_b} {" "} -

-

{faq.body.p4}

-

- {" "} - {faq.body.p5_b} {" "} -

-

{faq.body.p6}

-

- {" "} - {faq.body.p7_b} {" "} -

-

{faq.body.p8}

-
    -
  • {faq.body.li1}
  • -
  • {faq.body.li2}
  • -
-

- {faq.body.p9_1} - {faq.body.p9_b} - {faq.body.p9_2} -

-
    -
  • {faq.body.li3}
  • -
  • {faq.body.li4}
  • -
-

{faq.body.p10}

-
+
+

{faq.title}

+

+ {" "} + {faq.body.p1_b} {" "} +

+

{faq.body.p2}

+

+ {" "} + {faq.body.p3_b} {" "} +

+

{faq.body.p4}

+

+ {" "} + {faq.body.p5_b} {" "} +

+

{faq.body.p6}

+

+ {" "} + {faq.body.p7_b} {" "} +

+

{faq.body.p8}

+
    +
  • {faq.body.li1}
  • +
  • {faq.body.li2}
  • +
+

+ {faq.body.p9_1} + {faq.body.p9_b} + {faq.body.p9_2} +

+
    +
  • {faq.body.li3}
  • +
  • {faq.body.li4}
  • +
+

{faq.body.p10}

- ); - } -} +
+ ); +}; +export default Policies; diff --git a/csm_web/frontend/src/components/course/Course.tsx b/csm_web/frontend/src/components/course/Course.tsx index 29e936d4..a46a3f14 100644 --- a/csm_web/frontend/src/components/course/Course.tsx +++ b/csm_web/frontend/src/components/course/Course.tsx @@ -1,21 +1,19 @@ import { DateTime } from "luxon"; import React, { useState } from "react"; import { useParams } from "react-router-dom"; +import { DEFAULT_LONG_LOCALE_OPTIONS } from "../../utils/datetime"; import { useCourseSections } from "../../utils/queries/courses"; import { Course as CourseType } from "../../utils/types"; import LoadingSpinner from "../LoadingSpinner"; import { CreateSectionModal } from "./CreateSectionModal"; import { DataExportModal } from "./DataExportModal"; import { SectionCard } from "./SectionCard"; -import { WhitelistModal } from "./WhitelistModal"; import { SettingsModal } from "./SettingsModal"; -import { DEFAULT_LONG_LOCALE_OPTIONS } from "../../utils/datetime"; +import { WhitelistModal } from "./WhitelistModal"; -// Images import PencilIcon from "../../../static/frontend/img/pencil.svg"; import PlusIcon from "../../../static/frontend/img/plus.svg"; -// Styles import "../../css/course.scss"; const DAY_OF_WEEK_ABREVIATIONS: { [day: string]: string } = Object.freeze({ diff --git a/csm_web/frontend/src/components/course/CreateSectionModal.tsx b/csm_web/frontend/src/components/course/CreateSectionModal.tsx index cc614ec3..e058f326 100644 --- a/csm_web/frontend/src/components/course/CreateSectionModal.tsx +++ b/csm_web/frontend/src/components/course/CreateSectionModal.tsx @@ -1,5 +1,6 @@ import React, { useState } from "react"; -import { dayOfWeekToEnglishString, DAYS_OF_WEEK } from "../../utils/datetime"; + +import { DAYS_OF_WEEK } from "../../utils/datetime"; import { useUserEmails } from "../../utils/queries/base"; import { useSectionCreateMutation } from "../../utils/queries/sections"; import { Spacetime } from "../../utils/types"; diff --git a/csm_web/frontend/src/components/course/DataExportModal.tsx b/csm_web/frontend/src/components/course/DataExportModal.tsx index 29679e09..924686fe 100644 --- a/csm_web/frontend/src/components/course/DataExportModal.tsx +++ b/csm_web/frontend/src/components/course/DataExportModal.tsx @@ -1,4 +1,5 @@ import React, { useEffect, useMemo, useState } from "react"; + import { normalizeEndpoint } from "../../utils/api"; import { useCourses } from "../../utils/queries/courses"; import LoadingSpinner from "../LoadingSpinner"; diff --git a/csm_web/frontend/src/components/course/SectionCard.tsx b/csm_web/frontend/src/components/course/SectionCard.tsx index 49d28323..e7dfc7c2 100644 --- a/csm_web/frontend/src/components/course/SectionCard.tsx +++ b/csm_web/frontend/src/components/course/SectionCard.tsx @@ -1,6 +1,7 @@ import React, { useState } from "react"; import { Link, Navigate } from "react-router-dom"; +import { formatSpacetimeInterval } from "../../utils/datetime"; import { EnrollUserMutationResponse, useEnrollUserMutation } from "../../utils/queries/sections"; import { Mentor, Spacetime } from "../../utils/types"; import Modal, { ModalCloser } from "../Modal"; @@ -11,7 +12,6 @@ import GroupIcon from "../../../static/frontend/img/group.svg"; import LocationIcon from "../../../static/frontend/img/location.svg"; import UserIcon from "../../../static/frontend/img/user.svg"; import XCircle from "../../../static/frontend/img/x_circle.svg"; -import { formatSpacetimeInterval } from "../../utils/datetime"; interface SectionCardProps { id: number; diff --git a/csm_web/frontend/src/components/course/SettingsModal.tsx b/csm_web/frontend/src/components/course/SettingsModal.tsx index 3e298fb6..9b699882 100644 --- a/csm_web/frontend/src/components/course/SettingsModal.tsx +++ b/csm_web/frontend/src/components/course/SettingsModal.tsx @@ -1,14 +1,12 @@ import React, { useEffect, useState } from "react"; -import LoadingSpinner from "../LoadingSpinner"; import { useCourses, useCourseSettingsMutation } from "../../utils/queries/courses"; -import { Tooltip } from "../Tooltip"; +import LoadingSpinner from "../LoadingSpinner"; import Modal from "../Modal"; +import { Tooltip } from "../Tooltip"; -// Images import InfoIcon from "../../../static/frontend/img/info.svg"; -// Styles import "../../css/course-settings.scss"; interface SettingsModalProps { diff --git a/csm_web/frontend/src/components/course/WhitelistModal.tsx b/csm_web/frontend/src/components/course/WhitelistModal.tsx index 7ffd597e..047a5a5a 100644 --- a/csm_web/frontend/src/components/course/WhitelistModal.tsx +++ b/csm_web/frontend/src/components/course/WhitelistModal.tsx @@ -1,4 +1,5 @@ import React, { useEffect, useRef, useState } from "react"; + import { useCourseAddWhitelistMutation, useCourseDeleteWhitelistMutation, @@ -9,13 +10,11 @@ import LoadingSpinner from "../LoadingSpinner"; import Modal from "../Modal"; import { SearchBar } from "../SearchBar"; -// Images import CheckCircleIcon from "../../../static/frontend/img/check_circle.svg"; import ExclamationCircleIcon from "../../../static/frontend/img/exclamation-circle.svg"; import UndoIcon from "../../../static/frontend/img/undo.svg"; import XIcon from "../../../static/frontend/img/x.svg"; -// Styles import "../../css/whitelist_modal.scss"; interface WhitelistModalProps { diff --git a/csm_web/frontend/src/components/enrollment_automation/EnrollmentMatcher.tsx b/csm_web/frontend/src/components/enrollment_automation/EnrollmentMatcher.tsx index 02d1bff2..14212046 100644 --- a/csm_web/frontend/src/components/enrollment_automation/EnrollmentMatcher.tsx +++ b/csm_web/frontend/src/components/enrollment_automation/EnrollmentMatcher.tsx @@ -1,14 +1,13 @@ import React, { useEffect, useState } from "react"; import { Navigate, NavLink, Route, Routes, useParams } from "react-router-dom"; + import { useProfiles } from "../../utils/queries/base"; import { useMatcherActiveCourses } from "../../utils/queries/matcher"; -import { Profile } from "../../utils/types"; - +import { Profile, Role } from "../../utils/types"; import { emptyRoles, Roles } from "../../utils/user"; -import { CoordinatorMatcherForm } from "./coordinator/CoordinatorMatcherForm"; import { MentorSectionPreferences } from "./MentorSectionPreferences"; +import { CoordinatorMatcherForm } from "./coordinator/CoordinatorMatcherForm"; -// Styles import "../../css/enrollment_matcher.scss"; export interface MatcherProfile { @@ -24,7 +23,7 @@ export function EnrollmentMatcher(): JSX.Element { const [mentorProfileMap, setMentorProfileMap] = useState>(new Map()); const [staffCourses, setStaffCourses] = useState>([]); - const [overrideProfile, setOverrideProfile] = useState>(new Map()); + const [overrideProfile, setOverrideProfile] = useState>(new Map()); const { data: profiles, isSuccess: profilesLoaded } = useProfiles(); const { data: activeCourses, isSuccess: activeCoursesLoaded } = useMatcherActiveCourses(); @@ -39,16 +38,16 @@ export function EnrollmentMatcher(): JSX.Element { const newRoles: Roles = emptyRoles(); const newCoordProfileMap: Map = new Map(); const newMentorProfileMap: Map = new Map(); - const newOverrideProfile: Map = new Map(); + const newOverrideProfile: Map = new Map(); profiles.map((profile: Profile) => { - if (profile.role === "COORDINATOR") { + if (profile.role === Role.COORDINATOR) { newCoordProfileMap.set(profile.courseId, profile); - } else if (profile.role === "MENTOR") { + } else if (profile.role === Role.MENTOR) { newMentorProfileMap.set(profile.courseId, profile); } - if (profile.role === "COORDINATOR" || (profile.role === "MENTOR" && profile.sectionId == null)) { + if (profile.role === Role.COORDINATOR || (profile.role === Role.MENTOR && profile.sectionId == null)) { if (!activeCourses.includes(profile.courseId)) { // ignore if not active return; @@ -61,10 +60,10 @@ export function EnrollmentMatcher(): JSX.Element { }); newRoles[profile.role].add(profile.courseId); - if (profile.role === "COORDINATOR") { - newOverrideProfile.set(profile.courseId, "COORDINATOR"); - } else if (profile.role === "MENTOR") { - newOverrideProfile.set(profile.courseId, "MENTOR"); + if (profile.role === Role.COORDINATOR) { + newOverrideProfile.set(profile.courseId, Role.COORDINATOR); + } else if (profile.role === Role.MENTOR) { + newOverrideProfile.set(profile.courseId, Role.MENTOR); } } }); @@ -84,24 +83,24 @@ export function EnrollmentMatcher(): JSX.Element { const switchProfile = (courseId: number) => { if (overrideProfile.has(courseId)) { const newOverrideProfile = new Map(overrideProfile); - if (overrideProfile.get(courseId) === "COORDINATOR") { - newOverrideProfile.set(courseId, "MENTOR"); - } else if (overrideProfile.get(courseId) === "MENTOR") { - newOverrideProfile.set(courseId, "COORDINATOR"); + if (overrideProfile.get(courseId) === Role.COORDINATOR) { + newOverrideProfile.set(courseId, Role.MENTOR); + } else if (overrideProfile.get(courseId) === Role.MENTOR) { + newOverrideProfile.set(courseId, Role.COORDINATOR); } setOverrideProfile(newOverrideProfile); } }; - if (roles["COORDINATOR"].size === 0 && roles["MENTOR"].size === 0) { + if (roles[Role.COORDINATOR].size === 0 && roles[Role.MENTOR].size === 0) { return
No matchers found
; } let defaultMatcher =
No valid roles found.
; - if (roles["COORDINATOR"].size > 0) { - defaultMatcher = ; - } else if (roles["MENTOR"].size > 0) { - defaultMatcher = ; + if (roles[Role.COORDINATOR].size > 0) { + defaultMatcher = ; + } else if (roles[Role.MENTOR].size > 0) { + defaultMatcher = ; } return ( @@ -136,7 +135,7 @@ export function EnrollmentMatcher(): JSX.Element { interface MatcherCourseWrapperProps { roles: Roles; - overrideProfile: Map; + overrideProfile: Map; mentorProfileMap: Map; coordProfileMap: Map; switchProfile: (courseId: number) => void; @@ -151,10 +150,10 @@ const MatcherCourseWrapper = ({ }: MatcherCourseWrapperProps) => { const params = useParams(); const courseId = parseInt(params.courseId!); - const coordAndMentor = roles["COORDINATOR"].has(courseId) && roles["MENTOR"].has(courseId); + const coordAndMentor = roles[Role.COORDINATOR].has(courseId) && roles[Role.MENTOR].has(courseId); const role = overrideProfile.get(courseId); - if (role === "COORDINATOR") { + if (role === Role.COORDINATOR) { return ( switchProfile(courseId)} /> ); - } else if (role === "MENTOR") { + } else if (role === Role.MENTOR) { return ( { + const onCreateDragOver = (_day: string, interval: Interval) => { if (!eventCreationEnabled || !creatingEvent) { return; } @@ -316,7 +315,7 @@ export function Calendar({ * @param day - the day (column) the user ended the drag in * @param interval - the time interval (row) the user ended the drag in */ - const onCreateDragEnd = (day: string, interval: Interval) => { + const onCreateDragEnd = (_day: string, _interval: Interval) => { if (!eventCreationEnabled || !creatingEvent) { return; } @@ -335,7 +334,7 @@ export function Calendar({ * * @param e - event that caused the cancellation of the drag */ - const onCreateDragEndCancel = (e: MouseEvent | FocusEvent) => { + const onCreateDragEndCancel = (_e: MouseEvent | FocusEvent) => { setCurCreatedEvent({ day: "", start: DATETIME_INITIAL_INVALID, diff --git a/csm_web/frontend/src/components/enrollment_automation/calendar/CalendarDay.tsx b/csm_web/frontend/src/components/enrollment_automation/calendar/CalendarDay.tsx index 27a903a5..2a178223 100644 --- a/csm_web/frontend/src/components/enrollment_automation/calendar/CalendarDay.tsx +++ b/csm_web/frontend/src/components/enrollment_automation/calendar/CalendarDay.tsx @@ -1,9 +1,9 @@ import { Duration, Interval } from "luxon"; import React, { useEffect, useState } from "react"; +import { formatInterval } from "../../../utils/datetime"; import { Time } from "../EnrollmentAutomationTypes"; import { CalendarEventSingleTime } from "./CalendarTypes"; -import { formatInterval } from "../../../utils/datetime"; const NO_CONTENT_WIDTH = 35; diff --git a/csm_web/frontend/src/components/enrollment_automation/coordinator/ConfigureStage.tsx b/csm_web/frontend/src/components/enrollment_automation/coordinator/ConfigureStage.tsx index 71a05a21..f8dbc759 100644 --- a/csm_web/frontend/src/components/enrollment_automation/coordinator/ConfigureStage.tsx +++ b/csm_web/frontend/src/components/enrollment_automation/coordinator/ConfigureStage.tsx @@ -1,12 +1,12 @@ import React, { useEffect, useRef, useState } from "react"; +import { formatInterval } from "../../../utils/datetime"; import { useMatcherConfig, useMatcherConfigMutation } from "../../../utils/queries/matcher"; import { Profile } from "../../../utils/types"; import LoadingSpinner from "../../LoadingSpinner"; +import { Slot } from "../EnrollmentAutomationTypes"; import { Calendar } from "../calendar/Calendar"; import { CalendarEventSingleTime } from "../calendar/CalendarTypes"; -import { Slot } from "../EnrollmentAutomationTypes"; -import { formatInterval } from "../../../utils/datetime"; import CheckCircle from "../../../../static/frontend/img/check_circle.svg"; import ErrorCircle from "../../../../static/frontend/img/error_outline.svg"; @@ -51,7 +51,7 @@ export const ConfigureStage = ({ profile, slots, recomputeStage }: ConfigureStag const minMentorMap = new Map(); const maxMentorMap = new Map(); - matcherConfig.slots.forEach((slot: any) => { + matcherConfig.slots.forEach(slot => { minMentorMap.set(slot.id, slot.minMentors); maxMentorMap.set(slot.id, slot.maxMentors); }); @@ -91,7 +91,7 @@ export const ConfigureStage = ({ profile, slots, recomputeStage }: ConfigureStag ); }; - const toggleSelectAll = (e: React.ChangeEvent) => { + const toggleSelectAll = (_e: React.ChangeEvent) => { let newSelectedEventIndices: number[]; if (selectedEventIndices.length == slots.length) { // currently selecting all, so select none diff --git a/csm_web/frontend/src/components/enrollment_automation/coordinator/CoordinatorMatcherForm.tsx b/csm_web/frontend/src/components/enrollment_automation/coordinator/CoordinatorMatcherForm.tsx index 62f9cfad..39688f54 100644 --- a/csm_web/frontend/src/components/enrollment_automation/coordinator/CoordinatorMatcherForm.tsx +++ b/csm_web/frontend/src/components/enrollment_automation/coordinator/CoordinatorMatcherForm.tsx @@ -1,15 +1,15 @@ import { Interval } from "luxon"; import React, { useEffect, useState } from "react"; -import { Profile } from "../../../utils/types"; -import { parseTime } from "../utils"; import { useMatcherAssignment, useMatcherConfig, useMatcherPreferences, useMatcherSlots } from "../../../utils/queries/matcher"; +import { Profile } from "../../../utils/types"; import { Assignment, Slot, SlotPreference, Time } from "../EnrollmentAutomationTypes"; +import { parseTime } from "../utils"; import { ConfigureStage } from "./ConfigureStage"; import { CreateStage } from "./CreateStage"; import { EditStage } from "./EditStage"; diff --git a/csm_web/frontend/src/components/enrollment_automation/coordinator/CreateStage.tsx b/csm_web/frontend/src/components/enrollment_automation/coordinator/CreateStage.tsx index 6e2542f2..fc22683e 100644 --- a/csm_web/frontend/src/components/enrollment_automation/coordinator/CreateStage.tsx +++ b/csm_web/frontend/src/components/enrollment_automation/coordinator/CreateStage.tsx @@ -1,15 +1,15 @@ import _ from "lodash"; import { DateTime, Duration, Interval } from "luxon"; -import React, { useEffect, useState } from "react"; +import React, { createRef, useEffect, useState } from "react"; +import { formatInterval } from "../../../utils/datetime"; +import { useMatcherSlotsMutation } from "../../../utils/queries/matcher"; import { Profile } from "../../../utils/types"; import { Tooltip } from "../../Tooltip"; +import { Slot, Time } from "../EnrollmentAutomationTypes"; import { Calendar } from "../calendar/Calendar"; import { CalendarEvent, CalendarEventSingleTime, DAYS, DAYS_ABBREV } from "../calendar/CalendarTypes"; -import { Slot, Time } from "../EnrollmentAutomationTypes"; import { parseTime, serializeTime } from "../utils"; -import { useMatcherConfigMutation, useMatcherSlotsMutation } from "../../../utils/queries/matcher"; -import { formatInterval } from "../../../utils/datetime"; import InfoIcon from "../../../../static/frontend/img/info.svg"; import XIcon from "../../../../static/frontend/img/x.svg"; @@ -71,7 +71,6 @@ export function CreateStage({ profile, initialSlots, nextStage }: CreateStagePro */ const [edited, setEdited] = useState(false); - const matcherConfigMutation = useMatcherConfigMutation(profile.courseId); const matcherSlotsMutation = useMatcherSlotsMutation(profile.courseId); /** @@ -85,11 +84,11 @@ export function CreateStage({ profile, initialSlots, nextStage }: CreateStagePro * ref objects for tiled event details */ const tileRefs = { - days: React.createRef(), - startTime: React.createRef(), - endTime: React.createRef(), - length: React.createRef(), - toggle: React.createRef() + days: createRef(), + startTime: createRef(), + endTime: createRef(), + length: createRef(), + toggle: createRef() }; /** @@ -304,7 +303,7 @@ export function CreateStage({ profile, initialSlots, nextStage }: CreateStagePro setTileDetails(newDetails); }; - const editTiled_day = (e: React.ChangeEvent): void => { + const editTiled_day = (): void => { if (!tileRefs.days.current) { return; } diff --git a/csm_web/frontend/src/components/enrollment_automation/coordinator/EditStage.tsx b/csm_web/frontend/src/components/enrollment_automation/coordinator/EditStage.tsx index 401d1610..4c019604 100644 --- a/csm_web/frontend/src/components/enrollment_automation/coordinator/EditStage.tsx +++ b/csm_web/frontend/src/components/enrollment_automation/coordinator/EditStage.tsx @@ -2,6 +2,7 @@ import { Interval } from "luxon"; import React, { useEffect, useRef, useState } from "react"; import { useNavigate } from "react-router-dom"; +import { formatInterval } from "../../../utils/datetime"; import { useMatcherAssignmentMutation, useMatcherCreateSectionsMutation, @@ -11,10 +12,9 @@ import { Mentor, Profile } from "../../../utils/types"; import Modal from "../../Modal"; import { SearchBar } from "../../SearchBar"; import { Tooltip } from "../../Tooltip"; +import { Assignment, Slot, SlotPreference, Time } from "../EnrollmentAutomationTypes"; import { Calendar } from "../calendar/Calendar"; import { CalendarEventSingleTime, DAYS, DAYS_ABBREV } from "../calendar/CalendarTypes"; -import { Assignment, Slot, SlotPreference, Time } from "../EnrollmentAutomationTypes"; -import { formatInterval } from "../../../utils/datetime"; import ErrorIcon from "../../../../static/frontend/img/error_outline.svg"; import InfoIcon from "../../../../static/frontend/img/info.svg"; diff --git a/csm_web/frontend/src/components/enrollment_automation/coordinator/ReleaseStage.tsx b/csm_web/frontend/src/components/enrollment_automation/coordinator/ReleaseStage.tsx index c6f9ef8b..244bc58a 100644 --- a/csm_web/frontend/src/components/enrollment_automation/coordinator/ReleaseStage.tsx +++ b/csm_web/frontend/src/components/enrollment_automation/coordinator/ReleaseStage.tsx @@ -1,20 +1,20 @@ import React, { useEffect, useMemo, useRef, useState } from "react"; -import { Mentor, Profile } from "../../../utils/types"; +import { formatInterval } from "../../../utils/datetime"; import { useMatcherAddMentorsMutation, useMatcherConfigMutation, useMatcherMentors, useMatcherRemoveMentorsMutation } from "../../../utils/queries/matcher"; +import { Mentor, Profile } from "../../../utils/types"; import LoadingSpinner from "../../LoadingSpinner"; import Modal from "../../Modal"; import { SearchBar } from "../../SearchBar"; import { Tooltip } from "../../Tooltip"; +import { Slot, SlotPreference } from "../EnrollmentAutomationTypes"; import { Calendar } from "../calendar/Calendar"; import { CalendarEventSingleTime } from "../calendar/CalendarTypes"; -import { Slot, SlotPreference } from "../EnrollmentAutomationTypes"; -import { formatInterval } from "../../../utils/datetime"; import CheckIcon from "../../../../static/frontend/img/check.svg"; import CheckCircleIcon from "../../../../static/frontend/img/check_circle.svg"; diff --git a/csm_web/frontend/src/components/resource_aggregation/ResourceEdit.tsx b/csm_web/frontend/src/components/resource_aggregation/ResourceEdit.tsx index e1acaec9..dfed51e8 100644 --- a/csm_web/frontend/src/components/resource_aggregation/ResourceEdit.tsx +++ b/csm_web/frontend/src/components/resource_aggregation/ResourceEdit.tsx @@ -1,6 +1,9 @@ -import React, { ChangeEvent, MouseEvent, useState, useEffect } from "react"; import _ from "lodash"; +import React, { ChangeEvent, MouseEvent, useState, useEffect } from "react"; + import Modal from "../Modal"; +import { Tooltip } from "../Tooltip"; +import ResourceLinkEdit from "./ResourceLinkEdit"; import { copyWorksheet, copyLink, @@ -16,10 +19,7 @@ import { Resource } from "./ResourceTypes"; import ResourceWorksheetEdit from "./ResourceWorksheetEdit"; -import ResourceLinkEdit from "./ResourceLinkEdit"; -import { Tooltip } from "../Tooltip"; -// Images import CheckCircle from "../../../static/frontend/img/check-circle-solid.svg"; import ExclamationCircle from "../../../static/frontend/img/exclamation-circle.svg"; import PlusIcon from "../../../static/frontend/img/plus.svg"; diff --git a/csm_web/frontend/src/components/resource_aggregation/ResourceLinkEdit.tsx b/csm_web/frontend/src/components/resource_aggregation/ResourceLinkEdit.tsx index 207f1b6e..6eff12dd 100644 --- a/csm_web/frontend/src/components/resource_aggregation/ResourceLinkEdit.tsx +++ b/csm_web/frontend/src/components/resource_aggregation/ResourceLinkEdit.tsx @@ -1,4 +1,5 @@ import React from "react"; + import { Link } from "./ResourceTypes"; import ExclamationCircle from "../../../static/frontend/img/exclamation-circle.svg"; diff --git a/csm_web/frontend/src/components/resource_aggregation/ResourceRow.tsx b/csm_web/frontend/src/components/resource_aggregation/ResourceRow.tsx index 056b9a52..4f1b78ab 100644 --- a/csm_web/frontend/src/components/resource_aggregation/ResourceRow.tsx +++ b/csm_web/frontend/src/components/resource_aggregation/ResourceRow.tsx @@ -1,7 +1,8 @@ import React, { useState, useEffect, ChangeEvent, MouseEvent } from "react"; -import ResourceEdit from "./ResourceEdit"; -import { Link, Resource, Worksheet } from "./ResourceTypes"; + +import { ResourceEdit } from "./ResourceEdit"; import ResourceRowRender from "./ResourceRowRender"; +import { Link, Resource, Worksheet } from "./ResourceTypes"; interface ResourceRowProps { initialResource: Resource; diff --git a/csm_web/frontend/src/components/resource_aggregation/ResourceRowRender.tsx b/csm_web/frontend/src/components/resource_aggregation/ResourceRowRender.tsx index d5ce1145..1e57f6e4 100644 --- a/csm_web/frontend/src/components/resource_aggregation/ResourceRowRender.tsx +++ b/csm_web/frontend/src/components/resource_aggregation/ResourceRowRender.tsx @@ -1,11 +1,12 @@ +import { DateTime } from "luxon"; import React, { useState } from "react"; + +import { DEFAULT_TIMEZONE, formatDate } from "../../utils/datetime"; import Modal from "../Modal"; import { Resource } from "./ResourceTypes"; import Pencil from "../../../static/frontend/img/pencil.svg"; import Trash from "../../../static/frontend/img/trash-alt.svg"; -import { DEFAULT_TIMEZONE, formatDate } from "../../utils/datetime"; -import { DateTime } from "luxon"; interface ResourceRowRenderProps { resource: Resource; diff --git a/csm_web/frontend/src/components/resource_aggregation/ResourceTable.tsx b/csm_web/frontend/src/components/resource_aggregation/ResourceTable.tsx index bd69f0bb..e0896a0b 100644 --- a/csm_web/frontend/src/components/resource_aggregation/ResourceTable.tsx +++ b/csm_web/frontend/src/components/resource_aggregation/ResourceTable.tsx @@ -1,22 +1,21 @@ -import React, { useEffect, useState } from "react"; import { DateTime, Duration } from "luxon"; +import React, { useEffect, useState } from "react"; +import { DEFAULT_TIMEZONE } from "../../utils/datetime"; import { useCreateResourceMutation, useDeleteResourceMutation, useResources, useUpdateResourceMutation } from "../../utils/queries/resources"; +import { Role } from "../../utils/types"; import { Roles } from "../../utils/user"; -import { DEFAULT_TIMEZONE } from "../../utils/datetime"; import LoadingSpinner from "../LoadingSpinner"; -import ResourceRow from "./ResourceRow"; +import { ResourceRow } from "./ResourceRow"; import { emptyResource, Link, Resource, Worksheet } from "./ResourceTypes"; -// Images import PlusIcon from "../../../static/frontend/img/plus.svg"; -// Styles import "../../css/resource_aggregation.scss"; interface ResourceTableProps { @@ -41,7 +40,7 @@ export const ResourceTable = ({ courseID, roles }: ResourceTableProps): React.Re * Gets resource data for a specific course when courseID changes */ useEffect(() => { - setCanEdit(roles["COORDINATOR"].has(courseID)); + setCanEdit(roles[Role.COORDINATOR].has(courseID)); }, [courseID, roles]); if (!resourcesLoaded) { diff --git a/csm_web/frontend/src/components/resource_aggregation/ResourceWorksheetEdit.tsx b/csm_web/frontend/src/components/resource_aggregation/ResourceWorksheetEdit.tsx index d3b76646..6d8f34ff 100644 --- a/csm_web/frontend/src/components/resource_aggregation/ResourceWorksheetEdit.tsx +++ b/csm_web/frontend/src/components/resource_aggregation/ResourceWorksheetEdit.tsx @@ -1,10 +1,11 @@ import React from "react"; + import { Worksheet } from "./ResourceTypes"; import ExclamationCircle from "../../../static/frontend/img/exclamation-circle.svg"; +import Trash from "../../../static/frontend/img/trash-alt.svg"; import Upload from "../../../static/frontend/img/upload.svg"; import Times from "../../../static/frontend/img/x.svg"; -import Trash from "../../../static/frontend/img/trash-alt.svg"; interface ResourceFileFieldProps { worksheet: Worksheet; diff --git a/csm_web/frontend/src/components/resource_aggregation/Resources.tsx b/csm_web/frontend/src/components/resource_aggregation/Resources.tsx index 61e4465e..86a701f0 100644 --- a/csm_web/frontend/src/components/resource_aggregation/Resources.tsx +++ b/csm_web/frontend/src/components/resource_aggregation/Resources.tsx @@ -1,9 +1,10 @@ import React, { useMemo, useState } from "react"; + import { useProfiles } from "../../utils/queries/base"; import { useCourses } from "../../utils/queries/courses"; import { getRoles, Roles } from "../../utils/user"; import LoadingSpinner from "../LoadingSpinner"; -import ResourceTable from "./ResourceTable"; +import { ResourceTable } from "./ResourceTable"; export const Resources = (): React.ReactElement => { const [selectedCourseID, setSelectedCourseID] = useState(1); diff --git a/csm_web/frontend/src/components/section/CoordinatorAddStudentModal.tsx b/csm_web/frontend/src/components/section/CoordinatorAddStudentModal.tsx index 401185cd..ff2f5a5a 100644 --- a/csm_web/frontend/src/components/section/CoordinatorAddStudentModal.tsx +++ b/csm_web/frontend/src/components/section/CoordinatorAddStudentModal.tsx @@ -1,16 +1,15 @@ import { DateTime } from "luxon"; import React, { useState } from "react"; import { Link } from "react-router-dom"; + import { useUserEmails } from "../../utils/queries/base"; +import { useEnrollStudentMutation } from "../../utils/queries/sections"; import LoadingSpinner from "../LoadingSpinner"; import Modal from "../Modal"; -import { useEnrollStudentMutation } from "../../utils/queries/sections"; -// Images import CheckCircle from "../../../static/frontend/img/check_circle.svg"; import ErrorCircle from "../../../static/frontend/img/error_outline.svg"; -// Styles import "../../css/coordinator-add-student.scss"; enum CoordModalStates { diff --git a/csm_web/frontend/src/components/section/MentorSection.tsx b/csm_web/frontend/src/components/section/MentorSection.tsx index 01d4a215..e0ce4387 100644 --- a/csm_web/frontend/src/components/section/MentorSection.tsx +++ b/csm_web/frontend/src/components/section/MentorSection.tsx @@ -1,10 +1,11 @@ import React from "react"; -import { Mentor, Spacetime } from "../../utils/types"; -import { SectionDetail, ROLES } from "./Section"; import { Routes, Route } from "react-router-dom"; + +import { Mentor, Role, Spacetime } from "../../utils/types"; import MentorSectionAttendance from "./MentorSectionAttendance"; -import MentorSectionRoster from "./MentorSectionRoster"; import MentorSectionInfo from "./MentorSectionInfo"; +import MentorSectionRoster from "./MentorSectionRoster"; +import { SectionDetail } from "./Section"; interface MentorSectionProps { id: number; @@ -47,7 +48,7 @@ export default function MentorSection({ index element={ ; - case ROLES.STUDENT: + case Role.STUDENT: return ; + default: + return null; } - return null; } interface SectionHeaderProps { diff --git a/csm_web/frontend/src/components/section/SpacetimeDeleteModal.tsx b/csm_web/frontend/src/components/section/SpacetimeDeleteModal.tsx index 8dbcdaba..26775a65 100644 --- a/csm_web/frontend/src/components/section/SpacetimeDeleteModal.tsx +++ b/csm_web/frontend/src/components/section/SpacetimeDeleteModal.tsx @@ -1,8 +1,8 @@ import React, { useState } from "react"; + import { useSpacetimeDeleteMutation, useSpacetimeOverrideDeleteMutation } from "../../utils/queries/spacetime"; import Modal from "../Modal"; -// Styles import "../../css/spacetime_delete.scss"; interface SpacetimeDeleteProps { diff --git a/csm_web/frontend/src/components/section/SpacetimeEditModal.tsx b/csm_web/frontend/src/components/section/SpacetimeEditModal.tsx index 47c06295..3db100f1 100644 --- a/csm_web/frontend/src/components/section/SpacetimeEditModal.tsx +++ b/csm_web/frontend/src/components/section/SpacetimeEditModal.tsx @@ -1,5 +1,6 @@ import { DateTime } from "luxon"; import React, { useState } from "react"; + import { DAYS_OF_WEEK } from "../../utils/datetime"; import { useSpacetimeModifyMutation, useSpacetimeOverrideMutation } from "../../utils/queries/spacetime"; import { Spacetime } from "../../utils/types"; @@ -7,7 +8,6 @@ import LoadingSpinner from "../LoadingSpinner"; import Modal from "../Modal"; import TimeInput from "../TimeInput"; -// Styles import "../../css/spacetime-edit.scss"; interface SpacetimeEditModalProps { diff --git a/csm_web/frontend/src/components/section/StudentDropper.tsx b/csm_web/frontend/src/components/section/StudentDropper.tsx index edf41a80..18158f5c 100644 --- a/csm_web/frontend/src/components/section/StudentDropper.tsx +++ b/csm_web/frontend/src/components/section/StudentDropper.tsx @@ -1,11 +1,10 @@ import React, { useState } from "react"; + import { useDropStudentMutation } from "../../utils/queries/sections"; import Modal from "../Modal"; -// Images import XIcon from "../../../static/frontend/img/x.svg"; -// Styles import "../../css/student_dropper.scss"; interface StudentDropperProps { diff --git a/csm_web/frontend/src/components/section/StudentSection.tsx b/csm_web/frontend/src/components/section/StudentSection.tsx index fc5d6500..7ba08464 100644 --- a/csm_web/frontend/src/components/section/StudentSection.tsx +++ b/csm_web/frontend/src/components/section/StudentSection.tsx @@ -1,23 +1,22 @@ +import { DateTime } from "luxon"; import React, { useEffect, useState } from "react"; import { Navigate, Route, Routes } from "react-router-dom"; + +import { DEFAULT_TIMEZONE } from "../../utils/datetime"; import { useDropUserMutation, useStudentAttendances, useStudentSubmitWordOfTheDayMutation } from "../../utils/queries/sections"; -import { Mentor, Override, Spacetime } from "../../utils/types"; +import { Mentor, Override, Role, Spacetime } from "../../utils/types"; +import LoadingSpinner from "../LoadingSpinner"; import Modal from "../Modal"; -import { ATTENDANCE_LABELS, InfoCard, ROLES, SectionDetail, SectionSpacetime } from "./Section"; +import { ATTENDANCE_LABELS, InfoCard, SectionDetail, SectionSpacetime } from "./Section"; import { dateSortISO, formatDateLocaleShort, formatDateAbbrevWord } from "./utils"; -// Images -import XIcon from "../../../static/frontend/img/x.svg"; -import LoadingSpinner from "../LoadingSpinner"; import CheckCircle from "../../../static/frontend/img/check_circle.svg"; -import { DateTime } from "luxon"; -import { DEFAULT_TIMEZONE } from "../../utils/datetime"; +import XIcon from "../../../static/frontend/img/x.svg"; -// Styles import scssColors from "../../css/base/colors-export.module.scss"; import "../../css/word-of-the-day.scss"; @@ -44,7 +43,7 @@ export default function StudentSection({

My Section

diff --git a/csm_web/frontend/src/components/section/utils.tsx b/csm_web/frontend/src/components/section/utils.tsx index 5778def6..24afe069 100644 --- a/csm_web/frontend/src/components/section/utils.tsx +++ b/csm_web/frontend/src/components/section/utils.tsx @@ -1,4 +1,5 @@ import { DateTime } from "luxon"; + import { DEFAULT_TIMEZONE } from "../../utils/datetime"; export const MONTH_NUMBERS: Readonly<{ [month: string]: number }> = Object.freeze({ diff --git a/csm_web/frontend/src/index.tsx b/csm_web/frontend/src/index.tsx index 1afb4155..cd031cb3 100644 --- a/csm_web/frontend/src/index.tsx +++ b/csm_web/frontend/src/index.tsx @@ -1,14 +1,17 @@ +// Disable order warnings for style imports in this file +/* eslint import/order: ["error", {"warnOnUnassignedImports": false}] */ + // Global styles (imported before any components to allow for overrides) import "./css/base/styles.scss"; import "./css/fontawesome-styles.scss"; -import App from "./components/App"; import React from "react"; import { BrowserRouter as Router } from "react-router-dom"; import { createRoot } from "react-dom/client"; import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; import { ReactQueryDevtools } from "@tanstack/react-query-devtools"; +import App from "./components/App"; // react-query setup const queryClient = new QueryClient({ diff --git a/csm_web/frontend/src/tests/LoadingSpinner.test.tsx b/csm_web/frontend/src/tests/LoadingSpinner.test.tsx index b8e95218..6e229be9 100644 --- a/csm_web/frontend/src/tests/LoadingSpinner.test.tsx +++ b/csm_web/frontend/src/tests/LoadingSpinner.test.tsx @@ -1,5 +1,5 @@ -import React from "react"; import { render } from "@testing-library/react"; +import React from "react"; import LoadingSpinner from "../components/LoadingSpinner"; describe("LoadingSpinner", () => { diff --git a/csm_web/frontend/src/tests/Modal.test.tsx b/csm_web/frontend/src/tests/Modal.test.tsx index 6456bbb8..d4fdf5a3 100644 --- a/csm_web/frontend/src/tests/Modal.test.tsx +++ b/csm_web/frontend/src/tests/Modal.test.tsx @@ -1,7 +1,7 @@ -import React from "react"; import { fireEvent, render } from "@testing-library/react"; -import Modal, { ModalCloser } from "../components/Modal"; +import React from "react"; import { act } from "react-dom/test-utils"; +import Modal, { ModalCloser } from "../components/Modal"; /** * Returns a test Modal component. diff --git a/csm_web/frontend/src/tests/utils.tsx b/csm_web/frontend/src/tests/utils.tsx index f5629196..3c319999 100644 --- a/csm_web/frontend/src/tests/utils.tsx +++ b/csm_web/frontend/src/tests/utils.tsx @@ -1,5 +1,5 @@ -import React from "react"; import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; +import React from "react"; export const testQueryClient = new QueryClient({ defaultOptions: { diff --git a/csm_web/frontend/src/utils/queries/matcher.tsx b/csm_web/frontend/src/utils/queries/matcher.tsx index fbf4ae7f..cca48d2f 100644 --- a/csm_web/frontend/src/utils/queries/matcher.tsx +++ b/csm_web/frontend/src/utils/queries/matcher.tsx @@ -2,15 +2,8 @@ * Query hooks regarding the matcher. */ -import { - QueryClient, - useMutation, - UseMutationResult, - useQuery, - useQueryClient, - UseQueryResult -} from "@tanstack/react-query"; -import { Assignment, Slot } from "../../components/enrollment_automation/EnrollmentAutomationTypes"; +import { useMutation, UseMutationResult, useQuery, useQueryClient, UseQueryResult } from "@tanstack/react-query"; +import { Assignment } from "../../components/enrollment_automation/EnrollmentAutomationTypes"; import { fetchNormalized, fetchWithMethod, HTTP_METHODS } from "../api"; import { Mentor } from "../types"; import { handleError, handlePermissionsError, handleRetry, PermissionError, ServerError } from "./helpers"; diff --git a/csm_web/frontend/src/utils/types.tsx b/csm_web/frontend/src/utils/types.tsx index 0bd823d0..78e9f215 100644 --- a/csm_web/frontend/src/utils/types.tsx +++ b/csm_web/frontend/src/utils/types.tsx @@ -1,5 +1,11 @@ import { DateTime } from "luxon"; +export enum Role { + COORDINATOR = "COORDINATOR", + MENTOR = "MENTOR", + STUDENT = "STUDENT" +} + export interface Override { date: string; spacetime: Spacetime; @@ -18,7 +24,7 @@ export interface Profile { id: number; course: string; courseTitle: string; - role: string; + role: Role; sectionId: number; courseId: number; sectionSpacetimes: Array; @@ -48,7 +54,7 @@ export interface Section { numStudentsEnrolled: number; description: string; course: string; - userRole: string; + userRole: Role; courseTitle: string; courseRestricted: boolean; } diff --git a/csm_web/frontend/src/utils/user.tsx b/csm_web/frontend/src/utils/user.tsx index f26d4f8e..2d2661ae 100644 --- a/csm_web/frontend/src/utils/user.tsx +++ b/csm_web/frontend/src/utils/user.tsx @@ -1,9 +1,9 @@ -import { Profile } from "./types"; +import { Profile, Role } from "./types"; export interface Roles { - STUDENT: Set; - MENTOR: Set; - COORDINATOR: Set; + [Role.STUDENT]: Set; + [Role.MENTOR]: Set; + [Role.COORDINATOR]: Set; } /** @@ -13,9 +13,9 @@ export interface Roles { */ export function emptyRoles(): Roles { return { - STUDENT: new Set(), - MENTOR: new Set(), - COORDINATOR: new Set() + [Role.STUDENT]: new Set(), + [Role.MENTOR]: new Set(), + [Role.COORDINATOR]: new Set() }; } @@ -27,7 +27,7 @@ export function emptyRoles(): Roles { export function getRoles(profiles: Profile[]): Roles { const roles = emptyRoles(); profiles.map(course => { - roles[course.role as keyof Roles].add(course.courseId); + roles[course.role].add(course.courseId); }); return roles; } diff --git a/package-lock.json b/package-lock.json index 56f57572..3bcc3abd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -51,8 +51,10 @@ "cypress": "^12.2.0", "cypress-pipe": "^2.0.0", "eslint": "^8.50.0", - "eslint-config-prettier": "^7.2.0", + "eslint-config-prettier": "^8.10.0", + "eslint-import-resolver-typescript": "^3.6.1", "eslint-plugin-cypress": "^2.12.1", + "eslint-plugin-import": "^2.28.1", "eslint-plugin-react": "^7.31.10", "eslint-plugin-react-hooks": "^4.6.0", "jest": "^29.6.2", @@ -3885,6 +3887,12 @@ "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", "dev": true }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true + }, "node_modules/@types/lodash": { "version": "4.14.176", "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.176.tgz", @@ -4714,16 +4722,29 @@ "deep-equal": "^2.0.5" } }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", + "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/array-includes": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", - "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", + "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "get-intrinsic": "^1.1.3", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", "is-string": "^1.0.7" }, "engines": { @@ -4742,15 +4763,52 @@ "node": ">=8" } }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz", + "integrity": "sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0", + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", + "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/array.prototype.flatmap": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", - "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", "es-shim-unscopables": "^1.0.0" }, "engines": { @@ -4773,6 +4831,27 @@ "get-intrinsic": "^1.1.3" } }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", + "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "is-array-buffer": "^3.0.2", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/arrify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", @@ -5507,13 +5586,14 @@ } }, "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", + "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", "dev": true, "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.1", + "set-function-length": "^1.1.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -6772,12 +6852,27 @@ "node": ">=0.10.0" } }, + "node_modules/define-data-property": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", + "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, "dependencies": { + "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" }, @@ -6983,9 +7078,9 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz", - "integrity": "sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ==", + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", + "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", "dev": true, "dependencies": { "graceful-fs": "^4.2.4", @@ -7041,35 +7136,50 @@ } }, "node_modules/es-abstract": { - "version": "1.20.4", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.4.tgz", - "integrity": "sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA==", + "version": "1.22.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.3.tgz", + "integrity": "sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", + "array-buffer-byte-length": "^1.0.0", + "arraybuffer.prototype.slice": "^1.0.2", + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.5", + "es-set-tostringtag": "^2.0.1", "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.1.3", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.2", "get-symbol-description": "^1.0.0", - "has": "^1.0.3", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", + "hasown": "^2.0.0", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", "is-callable": "^1.2.7", "is-negative-zero": "^2.0.2", "is-regex": "^1.1.4", "is-shared-array-buffer": "^1.0.2", "is-string": "^1.0.7", + "is-typed-array": "^1.1.12", "is-weakref": "^1.0.2", - "object-inspect": "^1.12.2", + "object-inspect": "^1.13.1", "object-keys": "^1.1.1", "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.4.3", + "regexp.prototype.flags": "^1.5.1", + "safe-array-concat": "^1.0.1", "safe-regex-test": "^1.0.0", - "string.prototype.trimend": "^1.0.5", - "string.prototype.trimstart": "^1.0.5", - "unbox-primitive": "^1.0.2" + "string.prototype.trim": "^1.2.8", + "string.prototype.trimend": "^1.0.7", + "string.prototype.trimstart": "^1.0.7", + "typed-array-buffer": "^1.0.0", + "typed-array-byte-length": "^1.0.0", + "typed-array-byte-offset": "^1.0.0", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.13" }, "engines": { "node": ">= 0.4" @@ -7103,6 +7213,20 @@ "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", "dev": true }, + "node_modules/es-set-tostringtag": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz", + "integrity": "sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.2", + "has-tostringtag": "^1.0.0", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/es-shim-unscopables": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", @@ -7284,9 +7408,9 @@ } }, "node_modules/eslint-config-prettier": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-7.2.0.tgz", - "integrity": "sha512-rV4Qu0C3nfJKPOAhFujFxB7RMP+URFyQqqOZW9DMRD7ZDTFyjaIlETU3xzHELt++4ugC0+Jm084HQYkkJe+Ivg==", + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz", + "integrity": "sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==", "dev": true, "bin": { "eslint-config-prettier": "bin/cli.js" @@ -7295,6 +7419,77 @@ "eslint": ">=7.0.0" } }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "dev": true, + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-import-resolver-typescript": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.1.tgz", + "integrity": "sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==", + "dev": true, + "dependencies": { + "debug": "^4.3.4", + "enhanced-resolve": "^5.12.0", + "eslint-module-utils": "^2.7.4", + "fast-glob": "^3.3.1", + "get-tsconfig": "^4.5.0", + "is-core-module": "^2.11.0", + "is-glob": "^4.0.3" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts/projects/eslint-import-resolver-ts" + }, + "peerDependencies": { + "eslint": "*", + "eslint-plugin-import": "*" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", + "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", + "dev": true, + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, "node_modules/eslint-plugin-cypress": { "version": "2.12.1", "resolved": "https://registry.npmjs.org/eslint-plugin-cypress/-/eslint-plugin-cypress-2.12.1.tgz", @@ -7307,6 +7502,58 @@ "eslint": ">= 3.2.1" } }, + "node_modules/eslint-plugin-import": { + "version": "2.29.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.0.tgz", + "integrity": "sha512-QPOO5NO6Odv5lpoTkddtutccQjysJuFxoPS7fAHO+9m9udNHvTCPSAMW9zGAYj8lAIdr40I8yPCdUYrncXtrwg==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.7", + "array.prototype.findlastindex": "^1.2.3", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.8.0", + "hasown": "^2.0.0", + "is-core-module": "^2.13.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.7", + "object.groupby": "^1.0.1", + "object.values": "^1.1.7", + "semver": "^6.3.1", + "tsconfig-paths": "^3.14.2" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/eslint-plugin-react": { "version": "7.31.11", "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.31.11.tgz", @@ -8123,21 +8370,24 @@ } }, "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/function.prototype.name": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", - "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "functions-have-names": "^1.2.2" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" }, "engines": { "node": ">= 0.4" @@ -8174,14 +8424,15 @@ } }, "node_modules/get-intrinsic": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", - "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", + "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", "dev": true, "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -8224,6 +8475,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/get-tsconfig": { + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.2.tgz", + "integrity": "sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==", + "dev": true, + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, "node_modules/getos": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/getos/-/getos-3.2.1.tgz", @@ -8348,6 +8611,21 @@ "node": ">=4" } }, + "node_modules/globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/globby": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", @@ -8461,6 +8739,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/has-symbols": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", @@ -8488,6 +8778,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/history": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/history/-/history-5.3.0.tgz", @@ -8741,13 +9043,13 @@ } }, "node_modules/internal-slot": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", - "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.6.tgz", + "integrity": "sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==", "dev": true, "dependencies": { - "get-intrinsic": "^1.1.0", - "has": "^1.0.3", + "get-intrinsic": "^1.2.2", + "hasown": "^2.0.0", "side-channel": "^1.0.4" }, "engines": { @@ -8788,6 +9090,20 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-array-buffer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", @@ -8859,12 +9175,12 @@ } }, "node_modules/is-core-module": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", - "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", "dev": true, "dependencies": { - "has": "^1.0.3" + "hasown": "^2.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -9101,16 +9417,12 @@ } }, "node_modules/is-typed-array": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", - "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", + "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", "dev": true, "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" + "which-typed-array": "^1.1.11" }, "engines": { "node": ">= 0.4" @@ -12091,9 +12403,9 @@ } }, "node_modules/object-inspect": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", - "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -12157,14 +12469,14 @@ } }, "node_modules/object.fromentries": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz", - "integrity": "sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz", + "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "engines": { "node": ">= 0.4" @@ -12173,6 +12485,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/object.groupby": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.1.tgz", + "integrity": "sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1" + } + }, "node_modules/object.hasown": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.2.tgz", @@ -12187,14 +12511,14 @@ } }, "node_modules/object.values": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", - "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", + "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "engines": { "node": ">= 0.4" @@ -13609,14 +13933,14 @@ } }, "node_modules/regexp.prototype.flags": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", - "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", + "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "functions-have-names": "^1.2.2" + "define-properties": "^1.2.0", + "set-function-name": "^2.0.0" }, "engines": { "node": ">= 0.4" @@ -13727,12 +14051,12 @@ "dev": true }, "node_modules/resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", "dev": true, "dependencies": { - "is-core-module": "^2.9.0", + "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -13764,6 +14088,15 @@ "node": ">=8" } }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, "node_modules/resolve.exports": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", @@ -13855,11 +14188,29 @@ "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", "dev": true }, - "node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "node_modules/safe-array-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.1.tgz", + "integrity": "sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true }, "node_modules/safe-regex-test": { "version": "1.0.0", @@ -13974,9 +14325,9 @@ } }, "node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -13991,6 +14342,35 @@ "randombytes": "^2.1.0" } }, + "node_modules/set-function-length": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", + "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.1", + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", + "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", + "dev": true, + "dependencies": { + "define-data-property": "^1.0.1", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/shallow-clone": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", @@ -14313,29 +14693,46 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/string.prototype.trim": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", + "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/string.prototype.trimend": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", - "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", + "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.trimstart": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", - "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", + "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -15265,6 +15662,39 @@ } } }, + "node_modules/tsconfig-paths": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", + "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", + "dev": true, + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/tsconfig-paths/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", @@ -15337,6 +15767,71 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/typed-array-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", + "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", + "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", + "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/typescript": { "version": "4.9.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.3.tgz", @@ -15811,17 +16306,16 @@ } }, "node_modules/which-typed-array": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", - "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz", + "integrity": "sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==", "dev": true, "dependencies": { "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", + "call-bind": "^1.0.4", "for-each": "^0.3.3", "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0", - "is-typed-array": "^1.1.10" + "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -18760,6 +19254,12 @@ "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", "dev": true }, + "@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true + }, "@types/lodash": { "version": "4.14.176", "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.176.tgz", @@ -19406,16 +19906,26 @@ "deep-equal": "^2.0.5" } }, + "array-buffer-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", + "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" + } + }, "array-includes": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", - "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", + "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "get-intrinsic": "^1.1.3", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", "is-string": "^1.0.7" } }, @@ -19425,15 +19935,40 @@ "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "dev": true }, + "array.prototype.findlastindex": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz", + "integrity": "sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0", + "get-intrinsic": "^1.2.1" + } + }, + "array.prototype.flat": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", + "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + } + }, "array.prototype.flatmap": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", - "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", "es-shim-unscopables": "^1.0.0" } }, @@ -19450,6 +19985,21 @@ "get-intrinsic": "^1.1.3" } }, + "arraybuffer.prototype.slice": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", + "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==", + "dev": true, + "requires": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "is-array-buffer": "^3.0.2", + "is-shared-array-buffer": "^1.0.2" + } + }, "arrify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", @@ -20037,13 +20587,14 @@ "dev": true }, "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", + "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", "dev": true, "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.1", + "set-function-length": "^1.1.1" } }, "callsites": { @@ -20963,12 +21514,24 @@ "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", "dev": true }, + "define-data-property": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", + "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", + "dev": true, + "requires": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + } + }, "define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, "requires": { + "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" } @@ -21119,9 +21682,9 @@ } }, "enhanced-resolve": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz", - "integrity": "sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ==", + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", + "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", "dev": true, "requires": { "graceful-fs": "^4.2.4", @@ -21159,35 +21722,50 @@ } }, "es-abstract": { - "version": "1.20.4", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.4.tgz", - "integrity": "sha512-0UtvRN79eMe2L+UNEF1BwRe364sj/DXhQ/k5FmivgoSdpM90b8Jc0mDzKMGo7QS0BVbOP/bTwBKNnDc9rNzaPA==", + "version": "1.22.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.3.tgz", + "integrity": "sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==", "dev": true, "requires": { - "call-bind": "^1.0.2", + "array-buffer-byte-length": "^1.0.0", + "arraybuffer.prototype.slice": "^1.0.2", + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.5", + "es-set-tostringtag": "^2.0.1", "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.1.3", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.2", "get-symbol-description": "^1.0.0", - "has": "^1.0.3", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", + "hasown": "^2.0.0", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", "is-callable": "^1.2.7", "is-negative-zero": "^2.0.2", "is-regex": "^1.1.4", "is-shared-array-buffer": "^1.0.2", "is-string": "^1.0.7", + "is-typed-array": "^1.1.12", "is-weakref": "^1.0.2", - "object-inspect": "^1.12.2", + "object-inspect": "^1.13.1", "object-keys": "^1.1.1", "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.4.3", + "regexp.prototype.flags": "^1.5.1", + "safe-array-concat": "^1.0.1", "safe-regex-test": "^1.0.0", - "string.prototype.trimend": "^1.0.5", - "string.prototype.trimstart": "^1.0.5", - "unbox-primitive": "^1.0.2" + "string.prototype.trim": "^1.2.8", + "string.prototype.trimend": "^1.0.7", + "string.prototype.trimstart": "^1.0.7", + "typed-array-buffer": "^1.0.0", + "typed-array-byte-length": "^1.0.0", + "typed-array-byte-offset": "^1.0.0", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.13" } }, "es-get-iterator": { @@ -21212,6 +21790,17 @@ "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", "dev": true }, + "es-set-tostringtag": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz", + "integrity": "sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==", + "dev": true, + "requires": { + "get-intrinsic": "^1.2.2", + "has-tostringtag": "^1.0.0", + "hasown": "^2.0.0" + } + }, "es-shim-unscopables": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", @@ -21508,12 +22097,69 @@ } }, "eslint-config-prettier": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-7.2.0.tgz", - "integrity": "sha512-rV4Qu0C3nfJKPOAhFujFxB7RMP+URFyQqqOZW9DMRD7ZDTFyjaIlETU3xzHELt++4ugC0+Jm084HQYkkJe+Ivg==", + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz", + "integrity": "sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==", "dev": true, "requires": {} }, + "eslint-import-resolver-node": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "dev": true, + "requires": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "eslint-import-resolver-typescript": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.1.tgz", + "integrity": "sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==", + "dev": true, + "requires": { + "debug": "^4.3.4", + "enhanced-resolve": "^5.12.0", + "eslint-module-utils": "^2.7.4", + "fast-glob": "^3.3.1", + "get-tsconfig": "^4.5.0", + "is-core-module": "^2.11.0", + "is-glob": "^4.0.3" + } + }, + "eslint-module-utils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", + "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", + "dev": true, + "requires": { + "debug": "^3.2.7" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, "eslint-plugin-cypress": { "version": "2.12.1", "resolved": "https://registry.npmjs.org/eslint-plugin-cypress/-/eslint-plugin-cypress-2.12.1.tgz", @@ -21523,6 +22169,51 @@ "globals": "^11.12.0" } }, + "eslint-plugin-import": { + "version": "2.29.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.0.tgz", + "integrity": "sha512-QPOO5NO6Odv5lpoTkddtutccQjysJuFxoPS7fAHO+9m9udNHvTCPSAMW9zGAYj8lAIdr40I8yPCdUYrncXtrwg==", + "dev": true, + "requires": { + "array-includes": "^3.1.7", + "array.prototype.findlastindex": "^1.2.3", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.8.0", + "hasown": "^2.0.0", + "is-core-module": "^2.13.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.7", + "object.groupby": "^1.0.1", + "object.values": "^1.1.7", + "semver": "^6.3.1", + "tsconfig-paths": "^3.14.2" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + } + } + }, "eslint-plugin-react": { "version": "7.31.11", "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.31.11.tgz", @@ -21958,21 +22649,21 @@ "optional": true }, "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "dev": true }, "function.prototype.name": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", - "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "functions-have-names": "^1.2.2" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" } }, "functions-have-names": { @@ -21994,14 +22685,15 @@ "dev": true }, "get-intrinsic": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz", - "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", + "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", "dev": true, "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" } }, "get-package-type": { @@ -22026,6 +22718,15 @@ "get-intrinsic": "^1.1.1" } }, + "get-tsconfig": { + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.2.tgz", + "integrity": "sha512-wuMsz4leaj5hbGgg4IvDU0bqJagpftG5l5cXIAvo8uZrqn0NJqwtfupTN00VnkQJPcIRrxYrm1Ue24btpCha2A==", + "dev": true, + "requires": { + "resolve-pkg-maps": "^1.0.0" + } + }, "getos": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/getos/-/getos-3.2.1.tgz", @@ -22125,6 +22826,15 @@ "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true }, + "globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3" + } + }, "globby": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", @@ -22211,6 +22921,12 @@ "get-intrinsic": "^1.1.1" } }, + "has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "dev": true + }, "has-symbols": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", @@ -22226,6 +22942,15 @@ "has-symbols": "^1.0.2" } }, + "hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "dev": true, + "requires": { + "function-bind": "^1.1.2" + } + }, "history": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/history/-/history-5.3.0.tgz", @@ -22405,13 +23130,13 @@ "dev": true }, "internal-slot": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", - "integrity": "sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.6.tgz", + "integrity": "sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==", "dev": true, "requires": { - "get-intrinsic": "^1.1.0", - "has": "^1.0.3", + "get-intrinsic": "^1.2.2", + "hasown": "^2.0.0", "side-channel": "^1.0.4" } }, @@ -22440,6 +23165,17 @@ "has-tostringtag": "^1.0.0" } }, + "is-array-buffer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" + } + }, "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", @@ -22490,12 +23226,12 @@ } }, "is-core-module": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", - "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", "dev": true, "requires": { - "has": "^1.0.3" + "hasown": "^2.0.0" } }, "is-date-object": { @@ -22648,16 +23384,12 @@ } }, "is-typed-array": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", - "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", + "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", "dev": true, "requires": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" + "which-typed-array": "^1.1.11" } }, "is-typedarray": { @@ -24861,9 +25593,9 @@ "dev": true }, "object-inspect": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", - "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", "dev": true }, "object-is": { @@ -24906,14 +25638,26 @@ } }, "object.fromentries": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz", - "integrity": "sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz", + "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + } + }, + "object.groupby": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.1.tgz", + "integrity": "sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1" } }, "object.hasown": { @@ -24927,14 +25671,14 @@ } }, "object.values": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", - "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", + "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" } }, "once": { @@ -25879,14 +26623,14 @@ } }, "regexp.prototype.flags": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", - "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", + "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "functions-have-names": "^1.2.2" + "define-properties": "^1.2.0", + "set-function-name": "^2.0.0" } }, "regexpp": { @@ -25972,12 +26716,12 @@ "dev": true }, "resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", "dev": true, "requires": { - "is-core-module": "^2.9.0", + "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" } @@ -25997,6 +26741,12 @@ "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true }, + "resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true + }, "resolve.exports": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz", @@ -26060,6 +26810,18 @@ } } }, + "safe-array-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.1.tgz", + "integrity": "sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + } + }, "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", @@ -26132,9 +26894,9 @@ } }, "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true }, "serialize-javascript": { @@ -26146,6 +26908,29 @@ "randombytes": "^2.1.0" } }, + "set-function-length": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", + "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", + "dev": true, + "requires": { + "define-data-property": "^1.1.1", + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + } + }, + "set-function-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", + "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", + "dev": true, + "requires": { + "define-data-property": "^1.0.1", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.0" + } + }, "shallow-clone": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", @@ -26407,26 +27192,37 @@ "side-channel": "^1.0.4" } }, + "string.prototype.trim": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", + "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + } + }, "string.prototype.trimend": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", - "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", + "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" } }, "string.prototype.trimstart": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", - "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", + "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", "dev": true, "requires": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" } }, "strip-ansi": { @@ -27062,6 +27858,35 @@ "yn": "3.1.1" } }, + "tsconfig-paths": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", + "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", + "dev": true, + "requires": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + }, + "dependencies": { + "json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true + } + } + }, "tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", @@ -27113,6 +27938,53 @@ "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true }, + "typed-array-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", + "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "is-typed-array": "^1.1.10" + } + }, + "typed-array-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", + "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + } + }, + "typed-array-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", + "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + } + }, + "typed-array-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + } + }, "typescript": { "version": "4.9.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.3.tgz", @@ -27446,17 +28318,16 @@ } }, "which-typed-array": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", - "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz", + "integrity": "sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==", "dev": true, "requires": { "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", + "call-bind": "^1.0.4", "for-each": "^0.3.3", "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0", - "is-typed-array": "^1.1.10" + "has-tostringtag": "^1.0.0" } }, "wildcard": { diff --git a/package.json b/package.json index b526a112..9f4e037e 100644 --- a/package.json +++ b/package.json @@ -54,8 +54,10 @@ "cypress": "^12.2.0", "cypress-pipe": "^2.0.0", "eslint": "^8.50.0", - "eslint-config-prettier": "^7.2.0", + "eslint-config-prettier": "^8.10.0", + "eslint-import-resolver-typescript": "^3.6.1", "eslint-plugin-cypress": "^2.12.1", + "eslint-plugin-import": "^2.28.1", "eslint-plugin-react": "^7.31.10", "eslint-plugin-react-hooks": "^4.6.0", "jest": "^29.6.2",