diff --git a/apps/private/package.json b/apps/private/package.json index be55937..fcd6a4c 100644 --- a/apps/private/package.json +++ b/apps/private/package.json @@ -5,7 +5,7 @@ "@paralleldrive/cuid2": "^2.2.2", "axios": "^1.7.7", "dayjs": "^1.11.13", - "koi-pool": "^0.0.33", + "koi-pool": "^0.0.34", "react": "^18.3.1", "react-dom": "^18.3.1", "react-router-dom": "^6.26.2", diff --git a/apps/private/src/Pages/Home/Home.css b/apps/private/src/Pages/Home/Home.css index ec31de0..8e2954d 100644 --- a/apps/private/src/Pages/Home/Home.css +++ b/apps/private/src/Pages/Home/Home.css @@ -7,7 +7,7 @@ min-height: 100vh; } -.Home h1 { +.Home > h1 { color: #fff; text-shadow: 2px 2px 3px rgba(0,0,0,.26666666666666666); cursor: pointer; diff --git a/apps/private/src/components/GoalList/actions/GoalActions.ts b/apps/private/src/components/GoalList/actions/GoalActions.ts index 0d59e25..96267eb 100644 --- a/apps/private/src/components/GoalList/actions/GoalActions.ts +++ b/apps/private/src/components/GoalList/actions/GoalActions.ts @@ -27,15 +27,12 @@ const GoalActions = { return newState; }, - updateDueDate: (goalId: string, dueDate: DUE_DATE) => (prevState: GoalListType): GoalListType => { + updateDueDate: (goalId: string, dueDate: DUE_DATE | Date) => (prevState: GoalListType): GoalListType => { const goalBeingModified = prevState[goalId]; if (goalBeingModified) { - const date = getDateFromDueDate(dueDate); + goalBeingModified.completionDate = typeof dueDate !== 'object' ? getDateFromDueDate(dueDate) : dueDate; - if (date !== null) { - goalBeingModified.completionDate = date; - return {...prevState}; - } + return {...prevState}; } return prevState; diff --git a/apps/private/src/components/GoalList/components/Goal/Goal.css b/apps/private/src/components/GoalList/components/Goal/Goal.css index 0128f04..4badd2f 100644 --- a/apps/private/src/components/GoalList/components/Goal/Goal.css +++ b/apps/private/src/components/GoalList/components/Goal/Goal.css @@ -44,9 +44,6 @@ height: 32px; } -#Star{ - fill: cadetblue; -} .Goal .Subheader{ justify-content: space-around; padding-top: .25rem; @@ -61,7 +58,7 @@ padding-top: .25rem; background-color: white; box-shadow: unset; } -.Goal .GoalIndicator { +.Goal .BottomIndicator { height: 6px; position: absolute; bottom: 0; diff --git a/apps/private/src/components/GoalList/components/Goal/Goal.tsx b/apps/private/src/components/GoalList/components/Goal/Goal.tsx index da74934..9cb5f45 100644 --- a/apps/private/src/components/GoalList/components/Goal/Goal.tsx +++ b/apps/private/src/components/GoalList/components/Goal/Goal.tsx @@ -14,55 +14,35 @@ import { allDueDates, ColorSelection, type DUE_DATE, - findNextElementInListToFocusOn, getDueDateFromDate } from "../../../../utils/utils"; import Tasks from "../Task/Task"; -import {handleSubmitEnter} from "@repo/shared"; -import dayjs from "dayjs"; -import copy from './assets/copy.svg' import star from './assets/star.svg' import starOutline from './assets/star_outline.svg' -import uncheckAll from './assets/remove_check.svg' -import checkAll from './assets/confirm_check.svg' -import edit from './assets/pencil.svg' -import trash from './assets/archive.ico' import './Goal.css'; +import GoalHeader from "./components/GoalHeader"; +import GoalActionGroup from "./components/GoalActionGroup"; +import GoalDeleteButton from "./components/GoalDeleteModal"; type GoalProps = GoalType & { id: string } -function Goal({id, completionDate, name, isEditing, isFavorite, tasks, tasksCompleted}: GoalProps) { +function Goal(currentGoal: GoalProps) { + const {id, completionDate, isFavorite, tasks, name} = currentGoal; const {applyActionToGoalList} = useGoalListContext(); - const tasksListOfIds = Object.keys(tasks); + const taskListOfIds = Object.keys(tasks); - const handleAddTask = () => applyActionToGoalList(TaskActions.create(id)); - const handleDuplicateGoal = () => applyActionToGoalList(GoalActions.duplicate(id)); const handleUpdateDueDate = (value: DUE_DATE) => applyActionToGoalList(GoalActions.updateDueDate(id, value)) - const handleUpdateGoalName = (value: ChangeEvent) => applyActionToGoalList(GoalActions.updateName(id, value.target.value)) - const handleDeleteGoal = () => applyActionToGoalList(GoalActions.remove(id)); const handleToggleGoalEditing = () => applyActionToGoalList(GoalActions.toggleEditing(id, 'isEditing')); const handleToggleGoalFavorite = () => applyActionToGoalList(GoalActions.toggleEditing(id, 'isFavorite')); - const handleToggleAllTasks = () => applyActionToGoalList(TaskActions.toggleAllTasks(id)); - - const formattedDate = dayjs(completionDate).format('M/D/YY') - - const isEveryTaskComplete = tasksListOfIds.every((taskId) => { - const taskBeingChecked = tasks[taskId] as TaskType; + const handleAddTask = () => applyActionToGoalList(TaskActions.create(id)); - return taskBeingChecked.isCompleted - }) const selectedOption = getDueDateFromDate(completionDate); - const handleGoalNameEnterPress = (event: KeyboardEvent) => handleSubmitEnter(event, ()=> { - handleToggleGoalEditing() - findNextElementInListToFocusOn(tasksListOfIds) - }) return
- containerAttributes={{className: 'Select'}} selectedOptionAttributes={{ @@ -73,59 +53,24 @@ function Goal({id, completionDate, name, isEditing, isFavorite, tasks, tasksComp {style: ((option) => ({...ColorSelection['Default'][option]}))} } selectedOption={selectedOption} onClick={handleUpdateDueDate}/> - + -
- { - isEditing - ? - - : -

- {name} -

- } -
-

Due: {formattedDate}

-

Completed: {Math.round((tasksCompleted / tasksListOfIds.length) * 100)}%

-
- -
-
- - - - - - -
+ +
- {tasksListOfIds.map((taskId, index) => + {taskListOfIds.map((taskId, index) => - )}
-
+
; } diff --git a/apps/private/src/components/GoalList/components/Goal/components/GoalActionGroup.tsx b/apps/private/src/components/GoalList/components/Goal/components/GoalActionGroup.tsx new file mode 100644 index 0000000..f31def4 --- /dev/null +++ b/apps/private/src/components/GoalList/components/Goal/components/GoalActionGroup.tsx @@ -0,0 +1,51 @@ +import React from 'react'; +import {IconButton} from "koi-pool"; +import checkAll from "../assets/confirm_check.svg"; +import uncheckAll from "../assets/remove_check.svg"; +import edit from "../assets/pencil.svg"; +import copy from "../assets/copy.svg"; +import trash from "../assets/archive.ico"; +import {GoalType, TaskType} from "@repo/types"; +import TaskActions from "../../../actions/TaskActions"; +import {useGoalListContext} from "../../../../../contexts/GoalListProvider/GoalListProvider"; +import GoalActions from "../../../actions/GoalActions"; + +type GoalActionGroupProps = GoalType & {id: string, taskListOfIds: string[], handleToggleGoalEditing: ()=> void} + +const GoalActionGroup = ({tasks, id, taskListOfIds, handleToggleGoalEditing}: GoalActionGroupProps) => { + const {applyActionToGoalList} = useGoalListContext(); + + const handleToggleAllTasks = () => applyActionToGoalList(TaskActions.toggleAllTasks(id)); + const handleDuplicateGoal = () => applyActionToGoalList(GoalActions.duplicate(id)); + + + const isEveryTaskComplete = taskListOfIds.every((taskId) => { + const taskBeingChecked = tasks[taskId] as TaskType; + + return taskBeingChecked.isCompleted + }) + + return ( +
+ + + + + + + +
+ ); +}; + +export default GoalActionGroup; \ No newline at end of file diff --git a/apps/private/src/components/GoalList/components/Goal/components/GoalDeleteModal.tsx b/apps/private/src/components/GoalList/components/Goal/components/GoalDeleteModal.tsx new file mode 100644 index 0000000..034c490 --- /dev/null +++ b/apps/private/src/components/GoalList/components/Goal/components/GoalDeleteModal.tsx @@ -0,0 +1,55 @@ +import React, {useState} from 'react'; +import {CloseButton, GenericAcceptanceModal} from "koi-pool"; +import GoalActions from "../../../actions/GoalActions.js"; +import {useGoalListContext} from "../../../../../contexts/GoalListProvider/GoalListProvider.js"; +import {TaskType} from "@repo/types"; + +type GoalDeleteButtonProps = { id: string, name: string, taskListOfIds: string[] }; + +const GoalDeleteButton = ({id, name, taskListOfIds}: GoalDeleteButtonProps) => { + const {applyActionToGoalList} = useGoalListContext(); + const [showConfirmDeleteModal, setShowConfirmDeleteModal] = useState(false) + + const handleClose = () => { + setShowConfirmDeleteModal(false); + } + + const handleDeleteGoal = () => applyActionToGoalList(GoalActions.remove(id)); + + const showDeleteModal = () => { + if (taskListOfIds.length <= 1) { + handleDeleteGoal(); + } else { + setShowConfirmDeleteModal(true) + } + } + + return ( + <> + + + +

+ Are you sure you want to delete the goal + {Boolean(name) ? ({name}) : ''}? +

+
+ + + ); +}; + +export default GoalDeleteButton; \ No newline at end of file diff --git a/apps/private/src/components/GoalList/components/Goal/components/GoalHeader.tsx b/apps/private/src/components/GoalList/components/Goal/components/GoalHeader.tsx new file mode 100644 index 0000000..d38c69a --- /dev/null +++ b/apps/private/src/components/GoalList/components/Goal/components/GoalHeader.tsx @@ -0,0 +1,68 @@ +import React, {ChangeEvent, KeyboardEvent} from 'react'; +import {FloatingLabelInputWithButton} from "koi-pool"; +import {GoalType} from "@repo/types"; +import dayjs from "dayjs"; +import GoalActions from "../../../actions/GoalActions"; +import {useGoalListContext} from "../../../../../contexts/GoalListProvider/GoalListProvider"; +import {handleSubmitEnter} from "@repo/shared"; +import {findNextElementInListToFocusOn} from "../../../../../utils/utils"; + +type GoalHeaderProps = GoalType & { id: string, handleToggleGoalEditing: () => void, tasksListOfIds: string[] } + +const GoalHeader = ({ + completionDate, + isEditing, + tasksCompleted, + name, + id, + handleToggleGoalEditing, + tasksListOfIds + }: GoalHeaderProps) => { + const {applyActionToGoalList} = useGoalListContext(); + + + const handleGoalNameEnterPress = (event: KeyboardEvent) => handleSubmitEnter(event, () => { + handleToggleGoalEditing() + findNextElementInListToFocusOn(tasksListOfIds) + }) + + const handleUpdateGoalName = (value: ChangeEvent) => applyActionToGoalList(GoalActions.updateName(id, value.target.value)) + + const handleUpdateGoalDate = (event: ChangeEvent) => { + const userDate = event.target.value; + const parsedDate = dayjs(userDate); + if (parsedDate.isValid()) { + applyActionToGoalList(GoalActions.updateDueDate(id, parsedDate.toDate())) + } else { + console.error('Invalid date:', userDate); + } + } + + const formattedDate = dayjs(completionDate).format('YYYY-MM-DD') + + return ( +
+ { + isEditing + ? + + : +

+ {name} +

+ } +
+ +

Due:

+

Completed: {Math.round((tasksCompleted / tasksListOfIds.length) * 100)}%

+
+ +
+ ); +}; + +export default GoalHeader; \ No newline at end of file diff --git a/apps/private/src/utils/utils.ts b/apps/private/src/utils/utils.ts index 7be55d0..1ee4f38 100644 --- a/apps/private/src/utils/utils.ts +++ b/apps/private/src/utils/utils.ts @@ -2,6 +2,7 @@ import dayjs, {ManipulateType} from "dayjs"; export enum DUE_DATE { + LATE = "PAST DUE", TODAY = 'Today', TOMORROW = 'Tomorrow', WEEK = "Next Week", @@ -12,7 +13,7 @@ export enum DUE_DATE { SIX_MONTHS = "6 Months from now", YEAR = 'Next Year', TWO_YEARS = '2 Years from now', - CUSTOM = "Custom" + THREE_YEARS = '3 Years from now', } export const allDueDates = (): DUE_DATE[] => [ @@ -26,17 +27,17 @@ export const allDueDates = (): DUE_DATE[] => [ DUE_DATE.SIX_MONTHS, DUE_DATE.YEAR, DUE_DATE.TWO_YEARS, - DUE_DATE.CUSTOM + DUE_DATE.THREE_YEARS ]; -export const allDueDatesAndDates = (): Record => { - return allDueDates().reduce>((yeet, dueDate) => { +export const allDueDatesAndDates = (): Record => { + return allDueDates().reduce>((yeet, dueDate) => { yeet[dueDate] = getDateFromDueDate(dueDate); return yeet; - }, {} as Record); + }, {} as Record); }; -export const getDateFromDueDate = (currentDueDate: DUE_DATE): Date | null => { +export const getDateFromDueDate = (currentDueDate: DUE_DATE): Date => { switch (currentDueDate) { case DUE_DATE.TODAY: return dayjs().toDate(); @@ -58,8 +59,10 @@ export const getDateFromDueDate = (currentDueDate: DUE_DATE): Date | null => { return dayjs().add(1, "year").toDate(); case DUE_DATE.TWO_YEARS: return dayjs().add(2, 'year').toDate(); + case DUE_DATE.THREE_YEARS: + return dayjs().add(3, 'year').toDate(); default: - return null; + return dayjs().subtract(1, 'day').toDate(); } }; @@ -68,6 +71,8 @@ export const getDueDateFromDate = (date: Date): DUE_DATE => { const currentDate = dayjs(date); const TodayDate = dayjs(new Date()); + if(currentDate.isBefore(TodayDate, 'day')) return DUE_DATE.LATE; + if (currentDate.isSame(TodayDate, 'day')) return DUE_DATE.TODAY; const thresholds: { value: number, unit: ManipulateType, result: DUE_DATE }[] = [ @@ -79,14 +84,15 @@ export const getDueDateFromDate = (date: Date): DUE_DATE => { {value: 3, unit: 'months', result: DUE_DATE.QUARTER}, {value: 6, unit: 'months', result: DUE_DATE.SIX_MONTHS}, {value: 1, unit: 'years', result: DUE_DATE.YEAR}, - {value: 2, unit: 'years', result: DUE_DATE.TWO_YEARS} + {value: 2, unit: 'years', result: DUE_DATE.TWO_YEARS}, + {value: 3, unit: 'years', result: DUE_DATE.THREE_YEARS} ]; for (const threshold of thresholds) { const addTime = dayjs(TodayDate).add(threshold.value, threshold.unit); if (currentDate.isBefore(addTime) || currentDate.isSame(addTime)) return threshold.result; } - return DUE_DATE.CUSTOM; + return DUE_DATE.THREE_YEARS; }; @@ -102,12 +108,13 @@ export const ColorSelection: ColorType = ( [DUE_DATE.WEEK]: {backgroundColor: "#65ff00"}, [DUE_DATE.TWO_WEEKS]: {backgroundColor: "#c7f000"}, [DUE_DATE.MONTH]: {backgroundColor: "#f0ca00"}, - [DUE_DATE.TWO_MONTHS]: {backgroundColor: "#f05c00"}, - [DUE_DATE.QUARTER]: {backgroundColor: "#cf3900"}, - [DUE_DATE.SIX_MONTHS]: {backgroundColor: "#871000"}, - [DUE_DATE.YEAR]: {backgroundColor: "#4d0000", color: "white"}, - [DUE_DATE.TWO_YEARS]: {backgroundColor: "#210000", color: 'white'}, - [DUE_DATE.CUSTOM]: {backgroundColor: ""} + [DUE_DATE.TWO_MONTHS]: {backgroundColor: "#f07800"}, + [DUE_DATE.QUARTER]: {backgroundColor: "#c93900"}, + [DUE_DATE.SIX_MONTHS]: {backgroundColor: "#a41300"}, + [DUE_DATE.YEAR]: {backgroundColor: "#6c0000", color: "white"}, + [DUE_DATE.TWO_YEARS]: {backgroundColor: "#540000", color: 'white'}, + [DUE_DATE.THREE_YEARS]: {backgroundColor: "#110000", color: 'white'}, + [DUE_DATE.LATE]: {backgroundColor: "black", color: 'white'} } } ) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 50b3948..fc907af 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -133,8 +133,8 @@ importers: specifier: ^1.11.13 version: 1.11.13 koi-pool: - specifier: ^0.0.33 - version: 0.0.33(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + specifier: ^0.0.34 + version: 0.0.34(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react: specifier: ^18.3.1 version: 18.3.1 @@ -2582,8 +2582,8 @@ packages: react: ^18.2.0 react-dom: ^18.2.0 - koi-pool@0.0.33: - resolution: {integrity: sha512-WXWMlOf169GV+bI6QzRxqvmc1FqROwqDBhs2Kfd91p+0LYkLaG6b4AsqLZ3iDCbVcRvmaAgHTmH4Ra+eNlNvyg==} + koi-pool@0.0.34: + resolution: {integrity: sha512-dP9Xjhknhfn+go+LYbB9DfnRkY4zECJgbf7TDQiI3ygimKmya4wov6AjNRzb3gMvDJmN2AatqdSOEvEXoE+kog==} peerDependencies: react: ^18.2.0 react-dom: ^18.2.0 @@ -4406,10 +4406,10 @@ snapshots: '@typescript-eslint/eslint-plugin': 7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1)(typescript@5.6.2) '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@5.6.2) eslint-config-prettier: 9.1.0(eslint@8.57.1) - eslint-import-resolver-alias: 1.1.2(eslint-plugin-import@2.30.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1)) - eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.2))(eslint-plugin-import@2.30.0)(eslint@8.57.1) + eslint-import-resolver-alias: 1.1.2(eslint-plugin-import@2.30.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.2))(eslint-plugin-import@2.30.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1)) + eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.2))(eslint-plugin-import@2.30.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1))(eslint@8.57.1) eslint-plugin-eslint-comments: 3.2.0(eslint@8.57.1) - eslint-plugin-import: 2.30.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1) + eslint-plugin-import: 2.30.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.2))(eslint-plugin-import@2.30.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1) eslint-plugin-jest: 27.9.0(@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1)(typescript@5.6.2) eslint-plugin-jsx-a11y: 6.10.0(eslint@8.57.1) eslint-plugin-playwright: 1.6.2(eslint-plugin-jest@27.9.0(@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1) @@ -5031,9 +5031,9 @@ snapshots: eslint: 8.57.1 eslint-plugin-turbo: 2.1.2(eslint@8.57.1) - eslint-import-resolver-alias@1.1.2(eslint-plugin-import@2.30.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1)): + eslint-import-resolver-alias@1.1.2(eslint-plugin-import@2.30.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.2))(eslint-plugin-import@2.30.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1)): dependencies: - eslint-plugin-import: 2.30.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1) + eslint-plugin-import: 2.30.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.2))(eslint-plugin-import@2.30.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1) eslint-import-resolver-node@0.3.9: dependencies: @@ -5043,33 +5043,33 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.2))(eslint-plugin-import@2.30.0)(eslint@8.57.1): + eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.2))(eslint-plugin-import@2.30.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1))(eslint@8.57.1): dependencies: '@nolyfill/is-core-module': 1.0.39 debug: 4.3.7 enhanced-resolve: 5.17.1 eslint: 8.57.1 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.2))(eslint-plugin-import@2.30.0)(eslint@8.57.1))(eslint@8.57.1) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.2))(eslint-plugin-import@2.30.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1) fast-glob: 3.3.2 get-tsconfig: 4.8.0 is-bun-module: 1.2.1 is-glob: 4.0.3 optionalDependencies: - eslint-plugin-import: 2.30.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1) + eslint-plugin-import: 2.30.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.2))(eslint-plugin-import@2.30.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1) transitivePeerDependencies: - '@typescript-eslint/parser' - eslint-import-resolver-node - eslint-import-resolver-webpack - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.2))(eslint-plugin-import@2.30.0)(eslint@8.57.1))(eslint@8.57.1): + eslint-module-utils@2.12.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.2))(eslint-plugin-import@2.30.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1): dependencies: debug: 3.2.7 optionalDependencies: '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@5.6.2) eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.2))(eslint-plugin-import@2.30.0)(eslint@8.57.1) + eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.2))(eslint-plugin-import@2.30.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1))(eslint@8.57.1) transitivePeerDependencies: - supports-color @@ -5079,7 +5079,7 @@ snapshots: eslint: 8.57.1 ignore: 5.3.2 - eslint-plugin-import@2.30.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1): + eslint-plugin-import@2.30.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.2))(eslint-plugin-import@2.30.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.8 @@ -5090,7 +5090,7 @@ snapshots: doctrine: 2.1.0 eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.2))(eslint-plugin-import@2.30.0)(eslint@8.57.1))(eslint@8.57.1) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.2))(eslint-plugin-import@2.30.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1) hasown: 2.0.2 is-core-module: 2.15.1 is-glob: 4.0.3 @@ -5913,7 +5913,7 @@ snapshots: react: 18.3.1 react-dom: 18.3.1(react@18.3.1) - koi-pool@0.0.33(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + koi-pool@0.0.34(react-dom@18.3.1(react@18.3.1))(react@18.3.1): dependencies: react: 18.3.1 react-dom: 18.3.1(react@18.3.1)