From 89a4223f4ccaace0ebd9ed535f50d2569f876784 Mon Sep 17 00:00:00 2001 From: frozenhelium Date: Mon, 2 Sep 2024 08:01:12 +0545 Subject: [PATCH 01/10] Add dynamic nesting --- package.json | 4 + pnpm-lock.yaml | 56 +++- src/App/routes/PageError/index.tsx | 90 +++--- src/App/routes/PageError/styles.module.css | 54 ++-- src/components/Indent/index.tsx | 23 ++ src/components/Indent/styles.module.css | 12 + src/index.css | 51 ++- src/utils/common.ts | 120 +++++++ src/utils/constants.ts | 33 +- src/utils/types.ts | 18 ++ .../WorkItemRow/styles.module.css | 2 +- src/views/DailyJournal/DayView/index.tsx | 251 ++++++++++----- .../DailyJournal/DayView/styles.module.css | 42 +++ src/views/DailyJournal/StartSidebar/index.tsx | 297 +++++++++++++----- .../StartSidebar/styles.module.css | 49 +++ src/views/DailyJournal/index.tsx | 9 + 16 files changed, 873 insertions(+), 238 deletions(-) create mode 100644 src/components/Indent/index.tsx create mode 100644 src/components/Indent/styles.module.css diff --git a/package.json b/package.json index e44dba9..ec44f81 100644 --- a/package.json +++ b/package.json @@ -21,6 +21,8 @@ }, "dependencies": { "@codemirror/lang-markdown": "^6.2.5", + "@dnd-kit/core": "^6.1.0", + "@dnd-kit/sortable": "^8.0.0", "@replit/codemirror-vim": "^6.2.1", "@sentry/react": "^8.26.0", "@togglecorp/fujs": "^2.2.0", @@ -55,6 +57,7 @@ "@vitejs/plugin-react-swc": "^3.5.0", "@vitest/coverage-v8": "^1.2.2", "autoprefixer": "^10.4.14", + "core": "link:@types/dnd-kit/core", "eslint": "^8.40.0", "eslint-config-airbnb": "^19.0.4", "eslint-import-resolver-typescript": "^3.5.5", @@ -74,6 +77,7 @@ "postcss-preset-env": "^8.3.2", "postinstall-postinstall": "^2.1.0", "rollup-plugin-visualizer": "^5.9.0", + "sortable": "link:@types/dnd-kit/sortable", "stylelint": "^16.7.0", "stylelint-config-concentric": "^2.0.2", "stylelint-config-recommended": "^14.0.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9d4c289..266fc0f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,6 +8,12 @@ dependencies: '@codemirror/lang-markdown': specifier: ^6.2.5 version: 6.2.5 + '@dnd-kit/core': + specifier: ^6.1.0 + version: 6.1.0(react-dom@18.2.0)(react@18.2.0) + '@dnd-kit/sortable': + specifier: ^8.0.0 + version: 8.0.0(@dnd-kit/core@6.1.0)(react@18.2.0) '@replit/codemirror-vim': specifier: ^6.2.1 version: 6.2.1(@codemirror/commands@6.6.0)(@codemirror/language@6.10.2)(@codemirror/search@6.5.6)(@codemirror/state@6.4.1)(@codemirror/view@6.29.1) @@ -106,6 +112,9 @@ devDependencies: autoprefixer: specifier: ^10.4.14 version: 10.4.14(postcss@8.3.0) + core: + specifier: link:@types/dnd-kit/core + version: link:@types/dnd-kit/core eslint: specifier: ^8.40.0 version: 8.40.0 @@ -163,6 +172,9 @@ devDependencies: rollup-plugin-visualizer: specifier: ^5.9.0 version: 5.9.0(rollup@2.79.1) + sortable: + specifier: link:@types/dnd-kit/sortable + version: link:@types/dnd-kit/sortable stylelint: specifier: ^16.7.0 version: 16.7.0(typescript@5.0.4) @@ -2132,6 +2144,49 @@ packages: postcss: 8.3.0 dev: true + /@dnd-kit/accessibility@3.1.0(react@18.2.0): + resolution: {integrity: sha512-ea7IkhKvlJUv9iSHJOnxinBcoOI3ppGnnL+VDJ75O45Nss6HtZd8IdN8touXPDtASfeI2T2LImb8VOZcL47wjQ==} + peerDependencies: + react: '>=16.8.0' + dependencies: + react: 18.2.0 + tslib: 2.6.3 + dev: false + + /@dnd-kit/core@6.1.0(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-J3cQBClB4TVxwGo3KEjssGEXNJqGVWx17aRTZ1ob0FliR5IjYgTxl5YJbKTzA6IzrtelotH19v6y7uoIRUZPSg==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + dependencies: + '@dnd-kit/accessibility': 3.1.0(react@18.2.0) + '@dnd-kit/utilities': 3.2.2(react@18.2.0) + react: 18.2.0 + react-dom: 18.2.0(react@18.2.0) + tslib: 2.6.3 + dev: false + + /@dnd-kit/sortable@8.0.0(@dnd-kit/core@6.1.0)(react@18.2.0): + resolution: {integrity: sha512-U3jk5ebVXe1Lr7c2wU7SBZjcWdQP+j7peHJfCspnA81enlu88Mgd7CC8Q+pub9ubP7eKVETzJW+IBAhsqbSu/g==} + peerDependencies: + '@dnd-kit/core': ^6.1.0 + react: '>=16.8.0' + dependencies: + '@dnd-kit/core': 6.1.0(react-dom@18.2.0)(react@18.2.0) + '@dnd-kit/utilities': 3.2.2(react@18.2.0) + react: 18.2.0 + tslib: 2.6.3 + dev: false + + /@dnd-kit/utilities@3.2.2(react@18.2.0): + resolution: {integrity: sha512-+MKAJEOfaBe5SmV6t34p80MMKhjvUz0vRrvVJbPT0WElzaOJ/1xs+D+KDv+tD/NE5ujfrChEcshd4fLn0wpiqg==} + peerDependencies: + react: '>=16.8.0' + dependencies: + react: 18.2.0 + tslib: 2.6.3 + dev: false + /@dual-bundle/import-meta-resolve@4.1.0: resolution: {integrity: sha512-+nxncfwHM5SgAtrVzgpzJOI1ol0PkumhVo469KCf9lUi21IGcY90G98VuHm9VRrUypmAzawAHO9bs6hqeADaVg==} dev: true @@ -10053,7 +10108,6 @@ packages: /tslib@2.6.3: resolution: {integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==} - dev: true /tsutils@3.21.0(typescript@5.0.4): resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} diff --git a/src/App/routes/PageError/index.tsx b/src/App/routes/PageError/index.tsx index f93df11..d1e7916 100644 --- a/src/App/routes/PageError/index.tsx +++ b/src/App/routes/PageError/index.tsx @@ -3,8 +3,15 @@ import { useEffect, useState, } from 'react'; +import { + IoCaretDown, + IoCaretUp, + IoHome, + IoReload, +} from 'react-icons/io5'; import { useRouteError } from 'react-router-dom'; +import Button from '#components/Button'; import Link from '#components/Link'; import styles from './styles.module.css'; @@ -24,14 +31,7 @@ function PageError() { const [ fullErrorVisible, setFullErrorVisible, - ] = useState(false); - - const handleErrorVisibleToggle = useCallback( - () => { - setFullErrorVisible((oldValue) => !oldValue); - }, - [setFullErrorVisible], - ); + ] = useState(import.meta.env.DEV); const handleReloadButtonClick = useCallback( () => { @@ -49,45 +49,53 @@ function PageError() {

Looks like we ran into some issue!

-
- {errorResponse?.error?.message - ?? errorResponse?.message - ?? 'Something unexpected happended!'} -
- + {!fullErrorVisible && ( +
+ {errorResponse?.error?.message + ?? errorResponse?.message + ?? 'Something unexpected happended!'} +
+ )} {fullErrorVisible && ( - <> -
- {errorResponse?.error?.stack - ?? errorResponse?.stack ?? 'Stack trace not available!'} -
-
- See the developer console for more details. -
- +
+ {errorResponse?.error?.stack + ?? errorResponse?.stack ?? 'Stack trace not available!'} +
)} +
+ See the developer console for more details. +
- {/* NOTE: using the anchor element as it will refresh the page */} - - Go back to homepage - - + {fullErrorVisible ? 'Hide details' : 'Show details'} + +
+ {/* NOTE: using the anchor element as it will refresh the page */} + } + variant="quaternary" + > + Go to homepage + + +
diff --git a/src/App/routes/PageError/styles.module.css b/src/App/routes/PageError/styles.module.css index c495c1f..818ec32 100644 --- a/src/App/routes/PageError/styles.module.css +++ b/src/App/routes/PageError/styles.module.css @@ -8,56 +8,54 @@ .container { display: flex; flex-direction: column; - /* - border-top: var(--go-ui-width-separator-large) solid var(--go-ui-color-primary-red); - border-radius: var(--go-ui-border-radius-xl); - box-shadow: var(--go-ui-box-shadow-2xl); - background-color: var(--go-ui-color-white); - padding: var(--go-ui-spacing-2xl); - width: calc(100% - var(--go-ui-spacing-2xl)); - */ + border-top: var(--width-separator-lg) solid var(--color-primary); + border-radius: var(--border-radius-xl); + box-shadow: var(--box-shadow-lg); + background-color: var(--color-foreground); + padding: var(--spacing-2xl); + width: calc(100% - var(--spacing-2xl)); max-width: 60rem; max-height: 60rem; - /* - gap: var(--go-ui-spacing-2xl); - */ + gap: var(--spacing-lg); .content { display: flex; flex-direction: column; - /* - gap: var(--go-ui-spacing-md); - */ + gap: var(--spacing-md); .heading { margin: 0; - /* - font-weight: var(--go-ui-font-weight-medium); - */ + font-weight: var(--font-weight-semibold); + } + + .message { + font-family: var(--font-family-mono); } .stack { flex-grow: 1; - /* - background-color: var(--go-ui-color-background); - padding: var(--go-ui-spacing-md); - */ + background-color: var(--color-background); + padding: var(--spacing-md); width: 100%; overflow: auto; white-space: pre; - /* - font-family: var(--go-ui-font-family-mono); - */ + font-family: var(--font-family-mono); } } .footer { display: flex; align-items: center; - justify-content: flex-end; - /* - gap: var(--go-ui-spacing-md); - */ + justify-content: space-between; + flex-wrap: wrap; + gap: var(--spacing-md); + + .actions { + display: flex; + align-items: center; + justify-content: flex-end; + gap: var(--spacing-sm); + } } } } diff --git a/src/components/Indent/index.tsx b/src/components/Indent/index.tsx new file mode 100644 index 0000000..7c2fc42 --- /dev/null +++ b/src/components/Indent/index.tsx @@ -0,0 +1,23 @@ +import styles from './styles.module.css'; + +interface Props { + level: number; +} + +function Indent(props: Props) { + const { level } = props; + + if (level === 0) { + return null; + } + + return ( +
+ {Array.from(new Array(level).keys()).map((key) => ( + + ))} +
+ ); +} + +export default Indent; diff --git a/src/components/Indent/styles.module.css b/src/components/Indent/styles.module.css new file mode 100644 index 0000000..118962e --- /dev/null +++ b/src/components/Indent/styles.module.css @@ -0,0 +1,12 @@ +.indent { + display: flex; + height: 100%; + gap: var(--spacing-sm); + min-height: 1.5rem; + + .item { + border-right: var(--width-separator-sm) solid var(--color-separator-dark); + width: var(--spacing-2xs); + height: 100%; + } +} diff --git a/src/index.css b/src/index.css index 69b3d6a..8fcaf09 100644 --- a/src/index.css +++ b/src/index.css @@ -4,6 +4,7 @@ :root { --font-family-sans-serif: "Fira Sans", sans-serif; + --font-family-mono: "Oxygen Mono", monospace; --color-primary: #c45332; --color-secondary: #9cb56e; @@ -18,6 +19,7 @@ --color-text-on-dark: #ffffff; --color-separator: rgba(0, 0, 0, 0.1); + --color-separator-dark: rgba(0, 0, 0, 0.2); --base-font-size: 1rem; @@ -32,15 +34,17 @@ --font-size-4xl: calc(var(--base-font-size) * 3.6); @media screen and (max-width: 40rem) { - --font-size-2xs: calc(var(--base-font-size) * 0.625); - --font-size-xs: calc(var(--base-font-size) * 0.75); - --font-size-sm: calc(var(--base-font-size) * 0.875); + --base-font-size: 0.875rem; + + --font-size-2xs: calc(var(--base-font-size) * 0.75); + --font-size-xs: calc(var(--base-font-size) * 0.875); + --font-size-sm: calc(var(--base-font-size) * 0.9375); --font-size-md: calc(var(--base-font-size) * 1); - --font-size-lg: calc(var(--base-font-size) * 1.25); - --font-size-xl: calc(var(--base-font-size) * 1.44); - --font-size-2xl: calc(var(--base-font-size) * 1.8); - --font-size-3xl: calc(var(--base-font-size) * 2.25); - --font-size-4xl: calc(var(--base-font-size) * 3); + --font-size-lg: calc(var(--base-font-size) * 1.125); + --font-size-xl: calc(var(--base-font-size) * 1.25); + --font-size-2xl: calc(var(--base-font-size) * 1.44); + --font-size-3xl: calc(var(--base-font-size) * 1.8); + --font-size-4xl: calc(var(--base-font-size) * 2.25); } --font-weight-light: 300; @@ -72,11 +76,11 @@ @media screen and (max-width: 900px) { --base-spacing: 0.75rem; - --spacing-4xs: calc(var(--base-spacing) * 0.0625); - --spacing-3xs: calc(var(--base-spacing) * 0.125); - --spacing-2xs: calc(var(--base-spacing) * 0.25); - --spacing-xs: calc(var(--base-spacing) * 0.4); - --spacing-sm: calc(var(--base-spacing) * 0.625); + --spacing-4xs: calc(var(--base-spacing) * 0.125); + --spacing-3xs: calc(var(--base-spacing) * 0.25); + --spacing-2xs: calc(var(--base-spacing) * 0.5); + --spacing-xs: calc(var(--base-spacing) * 0.75); + --spacing-sm: calc(var(--base-spacing) * 0.875); --spacing-md: calc(var(--base-spacing) * 1); --spacing-lg: calc(var(--base-spacing) * 1.25); --spacing-xl: calc(var(--base-spacing) * 1.5625); @@ -141,6 +145,7 @@ body { font-weight: var(--font-weight-normal); font-style: normal; font-optical-sizing: auto; + font-size: var(--font-size-md); @media screen { margin: 0; @@ -159,6 +164,26 @@ h1, h2, h3, h4, h5, h6 { font-weight: var(--font-weight-semibold); } +h1 { + font-size: var(--font-size-2xl); +} + +h2 { + font-size: var(--font-size-xl); +} + +h3 { + font-size: var(--font-size-lg); +} + +h4 { + font-size: var(--font-size-md); +} + +h5 { + font-size: var(--font-size-sm); +} + p { margin: 0; } diff --git a/src/utils/common.ts b/src/utils/common.ts index 3e0b7cf..551ebc3 100644 --- a/src/utils/common.ts +++ b/src/utils/common.ts @@ -212,3 +212,123 @@ export function fuzzySearch( rows, ); } + +export function sortByAttributes( + list: LIST_ITEM[], + attributes: ATTRIBUTE[], + sortFn: (a: LIST_ITEM, b: LIST_ITEM, attr: ATTRIBUTE) => number, +): LIST_ITEM[] { + const newList = [...list]; + newList.sort( + (a, b) => { + let sortResult = 0; + + for (let i = 0; i < attributes.length; i += 1) { + const currentSortResult = sortFn( + a, + b, + attributes[i], + ); + + if (currentSortResult !== 0) { + sortResult = currentSortResult; + break; + } + } + + return sortResult; + }, + ); + + return newList; +} + +type GroupedItem = { + key: string; + type: 'heading'; + value: LIST_ITEM; + attribute: ATTRIBUTE; + level: number; +} | { + type: 'list-item'; + value: LIST_ITEM; + level: number; +}; + +// NOTE: the list must be sorted before grouping +export function groupListByAttributes( + list: LIST_ITEM[], + attributes: ATTRIBUTE[], + compareItemAttributes: (a: LIST_ITEM, b: LIST_ITEM, attribute: ATTRIBUTE) => boolean, +): GroupedItem[] { + if (isNotDefined(list) || list.length === 0) { + return []; + } + + const groupedItems = list.flatMap((listItem, listIndex) => { + if (listIndex === 0) { + const headings = attributes.map((attribute, i) => ({ + type: 'heading' as const, + value: listItem, + attribute, + level: i, + key: `heading-${listIndex}-${i}`, + })); + + return [ + ...headings, + { + type: 'list-item' as const, + value: listItem, + level: attributes.length, + }, + ]; + } + + const prevListItem = list[listIndex - 1]; + const attributeMismatchIndex = attributes.findIndex((attribute) => { + const hasSameCurrentAttribute = compareItemAttributes( + listItem, + prevListItem, + attribute, + ); + + return !hasSameCurrentAttribute; + }); + + if (attributeMismatchIndex === -1) { + return [ + { + type: 'list-item' as const, + value: listItem, + level: attributes.length, + }, + ]; + } + + const headings = attributes.map((attribute, i) => { + if (i < attributeMismatchIndex) { + return undefined; + } + + return { + type: 'heading' as const, + value: listItem, + attribute, + level: i, + key: `heading-${listIndex}-${i}`, + }; + }).filter(isDefined); + + return [ + ...headings, + { + type: 'list-item' as const, + value: listItem, + level: attributes.length, + }, + ]; + }); + + return groupedItems; +} diff --git a/src/utils/constants.ts b/src/utils/constants.ts index ef93e69..3e61e37 100644 --- a/src/utils/constants.ts +++ b/src/utils/constants.ts @@ -1,4 +1,7 @@ -import { ConfigStorage } from './types'; +import { + ConfigStorage, + NumericOption, +} from './types'; export const KEY_CONFIG_STORAGE = 'timur-config'; @@ -11,6 +14,16 @@ export const defaultConfigValue: ConfigStorage = { showInputIcons: false, startSidebarShown: window.innerWidth >= 900, endSidebarShown: false, + dailyJournalGrouping: { + groupLevel: 2, + joinLevel: 2, + }, + dailyJournalAttributeOrder: [ + { key: 'project', sortDirection: 1 }, + { key: 'contract', sortDirection: 1 }, + { key: 'task', sortDirection: 1 }, + { key: 'status', sortDirection: 1 }, + ], }; export const colorscheme: [string, string][] = [ @@ -33,3 +46,21 @@ export const colorscheme: [string, string][] = [ // horchata 8 ['#7d5327', '#ecdecc'], ]; + +export const numericOptions: NumericOption[] = [ + { key: 1, label: '1' }, + { key: 2, label: '2' }, + { key: 3, label: '3' }, + { key: 4, label: '4' }, + { key: 5, label: '5' }, + { key: 6, label: '6' }, + { key: 7, label: '7' }, + { key: 8, label: '8' }, + { key: 9, label: '9' }, +]; +export function numericOptionKeySelector(option: NumericOption) { + return option.key; +} +export function numericOptionLabelSelector(option: NumericOption) { + return option.label; +} diff --git a/src/utils/types.ts b/src/utils/types.ts index 1f11e8f..5ee4a48 100644 --- a/src/utils/types.ts +++ b/src/utils/types.ts @@ -30,6 +30,17 @@ export interface Note { content: string | undefined; } +export type DailyJournalAttributeKeys = 'project' | 'contract' | 'task' | 'status'; +export interface DailyJournalAttributeOrder { + key: DailyJournalAttributeKeys; + sortDirection: number; +} + +export interface DailyJournalGrouping { + groupLevel: number; + joinLevel: number; +} + export type ConfigStorage = { defaultTaskType: WorkItemType | undefined, defaultTaskStatus: WorkItemStatus, @@ -39,6 +50,8 @@ export type ConfigStorage = { startSidebarShown: boolean, endSidebarShown: boolean, compactTextArea: boolean, + dailyJournalAttributeOrder: DailyJournalAttributeOrder[]; + dailyJournalGrouping: DailyJournalGrouping; } export interface GeneralEvent { @@ -50,3 +63,8 @@ export interface GeneralEvent { date: string; remainingDays: number; } + +export interface NumericOption { + key: number; + label: string; +} diff --git a/src/views/DailyJournal/DayView/ProjectGroupedView/ContractGroupedView/WorkItemRow/styles.module.css b/src/views/DailyJournal/DayView/ProjectGroupedView/ContractGroupedView/WorkItemRow/styles.module.css index b727bc2..e21b83a 100644 --- a/src/views/DailyJournal/DayView/ProjectGroupedView/ContractGroupedView/WorkItemRow/styles.module.css +++ b/src/views/DailyJournal/DayView/ProjectGroupedView/ContractGroupedView/WorkItemRow/styles.module.css @@ -2,7 +2,7 @@ display: grid; align-items: flex-start; grid-template-columns: 5rem 2fr 5fr 9rem 4rem 4rem; - padding: var(--spacing-2xs) var(--spacing-xs); + padding: var(--spacing-xs) var(--spacing-sm); gap: var(--spacing-xs); &.with-icons { diff --git a/src/views/DailyJournal/DayView/index.tsx b/src/views/DailyJournal/DayView/index.tsx index a5fb25c..3f6fb45 100644 --- a/src/views/DailyJournal/DayView/index.tsx +++ b/src/views/DailyJournal/DayView/index.tsx @@ -1,4 +1,6 @@ import { + ElementType, + Fragment, useCallback, useContext, useMemo, @@ -6,33 +8,37 @@ import { import { FcClock } from 'react-icons/fc'; import { _cs, + bound, + compareString, isDefined, isNotDefined, - listToGroupList, - mapToList, sum, } from '@togglecorp/fujs'; -import List from '#components/List'; +import DefaultMessage from '#components/DefaultMessage'; import EnumsContext from '#contexts/enums'; import useFormattedRelativeDate from '#hooks/useFormattedRelativeDate'; import useLocalStorage from '#hooks/useLocalStorage'; -import { getDurationString } from '#utils/common'; +import { + getDurationString, + groupListByAttributes, + sortByAttributes, +} from '#utils/common'; import { defaultConfigValue, KEY_CONFIG_STORAGE, } from '#utils/constants'; import { ConfigStorage, - Contract, + DailyJournalAttributeOrder, EntriesAsList, - Project, WorkItem, } from '#utils/types'; -import ProjectGroupedView, { Props as ProjectGroupedViewProps } from './ProjectGroupedView'; +import WorkItemRow from './ProjectGroupedView/ContractGroupedView/WorkItemRow'; import styles from './styles.module.css'; +import Indent from '#components/Indent'; const dateFormatter = new Intl.DateTimeFormat( [], @@ -44,18 +50,6 @@ const dateFormatter = new Intl.DateTimeFormat( }, ); -interface ProjectGroupedWorkItem { - project: Project, - contracts: { - contract: Contract, - workItems: WorkItem[], - }[], -} - -function getId(item: ProjectGroupedWorkItem) { - return item.project.id; -} - interface Props { className?: string; workItems: WorkItem[] | undefined; @@ -85,54 +79,37 @@ function DayView(props: Props) { defaultConfigValue, ); - const groupedWorkItems = useMemo( - (): ProjectGroupedWorkItem[] | undefined => { - if (isNotDefined(workItems) || isNotDefined(taskById)) { - return undefined; - } + const getWorkItemAttribute = useCallback(( + item: WorkItem, + attr: DailyJournalAttributeOrder, + ) => { + if (attr.key === 'status') { + return item.status; + } - return mapToList(listToGroupList( - mapToList(listToGroupList( - workItems, - (workItem) => taskById[workItem.task].contract.id, - undefined, - (list) => ({ - contract: taskById[list[0].task].contract, - workItems: list, - }), - )), - (contractGrouped) => contractGrouped.contract.project.id, - undefined, - (list) => ({ - project: list[0].contract.project, - contracts: list, - }), - )); - }, - [workItems, taskById], - ); + if (isNotDefined(taskById)) { + return undefined; + } - type GroupedWorkItem = NonNullable<(typeof groupedWorkItems)>[number]; - - const rendererParams = useCallback( - (_: string, item: GroupedWorkItem): ProjectGroupedViewProps => ({ - contracts: item.contracts, - project: item.project, - onWorkItemClone, - onWorkItemChange, - onWorkItemDelete, - }), - [ - onWorkItemClone, - onWorkItemChange, - onWorkItemDelete, - ], - ); + const taskDetails = taskById[item.task]; - const formattedDate = dateFormatter.format(new Date(selectedDate)); + if (attr.key === 'task') { + return taskDetails.name; + } - const formattedRelativeDate = useFormattedRelativeDate(selectedDate); + if (attr.key === 'contract') { + return taskDetails.contract.name; + } + + if (attr.key === 'project') { + return taskDetails.contract.project.name; + } + return undefined; + }, [taskById]); + + const formattedDate = dateFormatter.format(new Date(selectedDate)); + const formattedRelativeDate = useFormattedRelativeDate(selectedDate); const totalHours = useMemo( () => { if (isDefined(workItems)) { @@ -144,6 +121,48 @@ function DayView(props: Props) { [workItems], ); + const { + dailyJournalAttributeOrder, + dailyJournalGrouping, + } = storedConfig; + + const { groupLevel, joinLevel } = dailyJournalGrouping; + + const groupedItems = useMemo(() => { + if (isNotDefined(taskById) || isNotDefined(workItems)) { + return []; + } + + const sortedWorkItems = sortByAttributes( + workItems, + dailyJournalAttributeOrder, + (a, b, attr) => ( + compareString( + getWorkItemAttribute(a, attr), + getWorkItemAttribute(b, attr), + attr.sortDirection, + ) + ), + ); + + return groupListByAttributes( + sortedWorkItems, + dailyJournalAttributeOrder.slice(0, groupLevel), + (a, b, attr) => { + const aValue = getWorkItemAttribute(a, attr); + const bValue = getWorkItemAttribute(b, attr); + + return aValue === bValue; + }, + ); + }, [ + taskById, + workItems, + getWorkItemAttribute, + dailyJournalAttributeOrder, + groupLevel, + ]); + return (
@@ -170,29 +189,97 @@ function DayView(props: Props) { )}
- - Click on - {' '} - Add entry - {' '} - to create a new entry. - - )} /> + {!errored && !loading && ( +
+ {groupedItems.map((groupedItem) => { + if (groupedItem.type === 'heading') { + const levelDiff = groupLevel - joinLevel; + + const headingText = getWorkItemAttribute( + groupedItem.value, + groupedItem.attribute, + ); + + if (groupedItem.level < levelDiff) { + const Heading = `h${bound(groupedItem.level + 2, 2, 4)}` as unknown as ElementType; + + return ( + + + {headingText} + + ); + } + + if (groupedItem.level < (groupLevel - 1)) { + return null; + } + + return ( +

+ + {dailyJournalAttributeOrder.map((attribute, i) => { + if (i >= groupLevel) { + return null; + } + + const currentLabel = getWorkItemAttribute( + groupedItem.value, + attribute, + ); + + if (i < (groupLevel - joinLevel)) { + return null; + } + + return ( + + {i > (groupLevel - joinLevel) && ( +
+ )} +
{currentLabel}
+ + ); + })} +

+ ); + } + + const taskDetails = taskById?.[groupedItem.value.task]; + + if (!taskDetails) { + return null; + } + + return ( +
+ + +
+ ); + })} +
+ )}
); } diff --git a/src/views/DailyJournal/DayView/styles.module.css b/src/views/DailyJournal/DayView/styles.module.css index 13a4709..fb21a57 100644 --- a/src/views/DailyJournal/DayView/styles.module.css +++ b/src/views/DailyJournal/DayView/styles.module.css @@ -54,4 +54,46 @@ flex-direction: column; gap: var(--spacing-md); } + + .new-group { + display: flex; + flex-direction: column; + + .nested-heading { + display: flex; + align-items: center; + gap: var(--spacing-sm); + color: var(--color-text-light); + font-weight: var(--font-weight-semibold); + + &h2 { + margin-top: var(--spacing-md); + } + } + + .joined-heading { + display: flex; + align-items: center; + gap: var(--spacing-sm); + color: var(--color-secondary); + font-weight: var(--font-weight-semibold); + + .separator { + border-radius: 0.5rem; + background-color: var(--color-text-light); + width: 0.5rem; + height: 0.5rem; + } + } + + .work-item-container { + display: flex; + gap: var(--spacing-sm); + + .work-item { + flex-grow: 1; + background-color: var(--color-foreground); + } + } + } } diff --git a/src/views/DailyJournal/StartSidebar/index.tsx b/src/views/DailyJournal/StartSidebar/index.tsx index 23fd6d6..c8bee20 100644 --- a/src/views/DailyJournal/StartSidebar/index.tsx +++ b/src/views/DailyJournal/StartSidebar/index.tsx @@ -1,19 +1,33 @@ import { useCallback, useContext, + useMemo, } from 'react'; +import { MdDragIndicator } from 'react-icons/md'; import { + closestCenter, + DndContext, + DragEndEvent, + DraggableAttributes, + PointerSensor, + useSensor, + useSensors, +} from '@dnd-kit/core'; +import { SyntheticListenerMap } from '@dnd-kit/core/dist/hooks/utilities'; +import { + SortableContext, + useSortable, + verticalListSortingStrategy, +} from '@dnd-kit/sortable'; +import { + _cs, isDefined, - isFalsyString, isNotDefined, - listToGroupList, - mapToList, } from '@togglecorp/fujs'; -import Button from '#components/Button'; import Checkbox from '#components/Checkbox'; -import Link from '#components/Link'; import MonthlyCalendar from '#components/MonthlyCalendar'; +import RadioInput from '#components/RadioInput'; import SelectInput from '#components/SelectInput'; import EnumsContext from '#contexts/enums'; import { EnumsQuery } from '#generated/types/graphql'; @@ -23,16 +37,126 @@ import { colorscheme, defaultConfigValue, KEY_CONFIG_STORAGE, + numericOptionKeySelector, + numericOptionLabelSelector, + numericOptions, } from '#utils/constants'; import { ConfigStorage, + DailyJournalAttributeKeys, + DailyJournalAttributeOrder, + DailyJournalGrouping, EditingMode, - WorkItem, - WorkItemStatus, } from '#utils/types'; import styles from './styles.module.css'; +const dailyJournalAttributeDetails: Record = { + project: { label: 'Project' }, + contract: { label: 'Contract' }, + task: { label: 'Task' }, + status: { label: 'Status' }, +}; + +interface ItemProps { + className?: string; + attribute: DailyJournalAttributeOrder; + setNodeRef?: (node: HTMLElement | null) => void; + draggableAttributes?: DraggableAttributes; + draggableListeners?: SyntheticListenerMap | undefined; + transformStyle?: string | undefined; + transitionStyle?: string | undefined; +} + +function Item(props: ItemProps) { + const { + className, + setNodeRef, + attribute, + draggableAttributes, + draggableListeners, + transformStyle, + transitionStyle, + } = props; + + return ( +
+
+ +
+
+ {dailyJournalAttributeDetails[attribute.key].label} +
+
+ ); +} + +interface SortableItemProps { + className?: string; + attribute: DailyJournalAttributeOrder; +} + +function SortableItem(props: SortableItemProps) { + const { + attribute, + className, + } = props; + + const { + attributes, + listeners, + setNodeRef, + transform, + transition, + isDragging, + over, + } = useSortable({ id: attribute.key }); + + const transformStyle = useMemo(() => { + if (isNotDefined(transform)) { + return undefined; + } + + const transformations = [ + // isDefined(transform.x) && `translateX(${transform.x}px)`, + isDefined(transform.y) && `translateY(${transform.y}px)`, + isDefined(transform.scaleX) && `scaleY(${transform.scaleX})`, + isDefined(transform.scaleY) && `scaleY(${transform.scaleY})`, + ]; + + return transformations.filter(Boolean).join(' '); + }, [transform]); + + return ( + + ); +} + type EditingOption = { key: EditingMode, label: string }; function editingOptionKeySelector(item: EditingOption) { return item.key; @@ -75,7 +199,6 @@ function defaultColorSelector(_: T, i: number): [string, string] { } interface Props { - workItems: WorkItem[]; selectedDate: string; setSelectedDate: (newDate: string) => void; calendarComponentRef?: React.MutableRefObject<{ @@ -86,12 +209,10 @@ interface Props { function StartSidebar(props: Props) { const { calendarComponentRef, - workItems, selectedDate, setSelectedDate, } = props; - const { taskById } = useContext(EnumsContext); const { enums } = useContext(EnumsContext); const [storedConfig, setStoredConfig] = useLocalStorage( @@ -101,53 +222,57 @@ function StartSidebar(props: Props) { const setConfigFieldValue = useSetFieldValue(setStoredConfig); - const handleCopyTextButtonClick = useCallback( - () => { - function toSubItem(workItem: WorkItem) { - const description = workItem.description ?? '??'; - const status: WorkItemStatus = workItem.status ?? 'TODO'; - const task = taskById?.[workItem.task]?.name ?? '??'; - - return description - .split('\n') - .map((item, i) => ([ - i === 0 ? ' -' : ' ', - status !== 'DONE' ? `\`${status.toUpperCase()}\`` : undefined, - i === 0 ? `${task}: ${item}` : item, - ].filter(isDefined).join(' '))) - .join('\n'); - } - - if (isNotDefined(taskById)) { - return; - } - - const groupedWorkItems = mapToList(listToGroupList( - workItems, - (workItem) => taskById[workItem.task].contract.project.id, - undefined, - (list) => ({ - project: taskById?.[list[0].task].contract.project, - workItems: list, - }), - )); - - const text = groupedWorkItems.map((projectGrouped) => { - const { project, workItems: projectWorkItems } = projectGrouped; - - return `- ${project.name}\n${projectWorkItems.map((workItem) => toSubItem(workItem)).join('\n')}`; - }).join('\n'); - - if (isFalsyString(text)) { - return; - } - - window.navigator.clipboard.writeText(text); - }, - [workItems, taskById], + const date = new Date(selectedDate); + + const updateJournalGrouping = useCallback((value: number, name: 'groupLevel' | 'joinLevel') => { + const oldValue = storedConfig.dailyJournalGrouping + ?? defaultConfigValue.dailyJournalGrouping; + + if (name === 'groupLevel') { + setConfigFieldValue({ + groupLevel: value, + joinLevel: Math.min(oldValue.joinLevel, value), + } satisfies DailyJournalGrouping, 'dailyJournalGrouping'); + + return; + } + + setConfigFieldValue({ + groupLevel: oldValue.groupLevel, + joinLevel: Math.min(oldValue.groupLevel, value), + } satisfies DailyJournalGrouping, 'dailyJournalGrouping'); + }, [storedConfig.dailyJournalGrouping, setConfigFieldValue]); + + const sensors = useSensors( + useSensor(PointerSensor), ); - const date = new Date(selectedDate); + const handleDndEnd = useCallback((dragEndEvent: DragEndEvent) => { + const { + active, + over, + } = dragEndEvent; + + const oldAttributes = storedConfig.dailyJournalAttributeOrder + ?? defaultConfigValue.dailyJournalAttributeOrder; + + if (isNotDefined(active) || isNotDefined(over)) { + return; + } + + const newAttributes = [...oldAttributes]; + const sourceIndex = newAttributes.findIndex(({ key }) => active.id === key); + const destinationIndex = newAttributes.findIndex(({ key }) => over.id === key); + + if (sourceIndex === -1 || destinationIndex === -1) { + return; + } + + const [removedItem] = newAttributes.splice(sourceIndex, 1); + newAttributes.splice(destinationIndex, 0, removedItem); + + setConfigFieldValue(newAttributes, 'dailyJournalAttributeOrder'); + }, [setConfigFieldValue, storedConfig.dailyJournalAttributeOrder]); return (
-
- - Go to today - - +
+

Ordering

+
+ + ({ id: key }), + )} + strategy={verticalListSortingStrategy} + > + {storedConfig.dailyJournalAttributeOrder.map((attribute) => ( + + ))} + + +
+
+
+

+ Grouping +

+ +

diff --git a/src/views/DailyJournal/StartSidebar/styles.module.css b/src/views/DailyJournal/StartSidebar/styles.module.css index 5d69438..1982374 100644 --- a/src/views/DailyJournal/StartSidebar/styles.module.css +++ b/src/views/DailyJournal/StartSidebar/styles.module.css @@ -10,6 +10,55 @@ gap: var(--spacing-sm); } + .attributes { + display: flex; + flex-direction: column; + gap: var(--spacing-sm); + + .attribute-list { + display: flex; + flex-direction: column; + gap: var(--width-separator-md); + + &.dragging-over { + outline: var(--width-separator-md) solid var(--color-separator); + } + + .attribute { + display: flex; + align-items: center; + background-color: var(--color-foreground); + padding: var(--spacing-xs) var(--spacing-sm); + gap: var(--spacing-xs); + + &.dragging { + z-index: 1; + box-shadow: var(--box-shadow-md); + opacity: 0.8; + } + + .drag-handle { + cursor: grab; + } + + &:hover { + background-color: var(--color-tertiary); + } + + .label { + flex-grow: 1; + } + } + } + } + + .grouping { + display: flex; + flex-direction: column; + gap: var(--spacing-sm); + } + + .quick-settings { display: flex; flex-direction: column; diff --git a/src/views/DailyJournal/index.tsx b/src/views/DailyJournal/index.tsx index 98675ce..76efc55 100644 --- a/src/views/DailyJournal/index.tsx +++ b/src/views/DailyJournal/index.tsx @@ -27,6 +27,7 @@ import { encodeDate, isDefined, isNotDefined, + isTruthyString, } from '@togglecorp/fujs'; import { gql, @@ -745,6 +746,14 @@ export function Component() { > Add entry + {!isTruthyString(dateFromParams) && ( + + Go to today + + )}

Date: Fri, 6 Sep 2024 13:48:50 +0545 Subject: [PATCH 02/10] Update usage of useLocalStorage --- src/App/index.tsx | 14 +- src/App/routes/PageError/styles.module.css | 2 +- src/components/Page/index.tsx | 14 +- src/contexts/localStorage.tsx | 21 ++- src/hooks/useLocalStorage.ts | 112 +++++++++------ src/index.css | 2 +- src/utils/common.ts | 34 ++++- src/utils/constants.ts | 2 - src/utils/localStorage.ts | 7 +- .../ContractGroupedView/index.tsx | 129 ------------------ .../ContractGroupedView/styles.module.css | 60 -------- .../DayView/ProjectGroupedView/index.tsx | 76 ----------- .../ProjectGroupedView/styles.module.css | 5 - .../WorkItemRow/index.tsx | 12 +- .../WorkItemRow/styles.module.css | 0 src/views/DailyJournal/DayView/index.tsx | 15 +- .../DailyJournal/DayView/styles.module.css | 7 +- src/views/DailyJournal/StartSidebar/index.tsx | 7 +- .../StartSidebar/styles.module.css | 2 +- src/views/DailyJournal/index.tsx | 12 +- 20 files changed, 146 insertions(+), 387 deletions(-) delete mode 100644 src/views/DailyJournal/DayView/ProjectGroupedView/ContractGroupedView/index.tsx delete mode 100644 src/views/DailyJournal/DayView/ProjectGroupedView/ContractGroupedView/styles.module.css delete mode 100644 src/views/DailyJournal/DayView/ProjectGroupedView/index.tsx delete mode 100644 src/views/DailyJournal/DayView/ProjectGroupedView/styles.module.css rename src/views/DailyJournal/DayView/{ProjectGroupedView/ContractGroupedView => }/WorkItemRow/index.tsx (98%) rename src/views/DailyJournal/DayView/{ProjectGroupedView/ContractGroupedView => }/WorkItemRow/styles.module.css (100%) diff --git a/src/App/index.tsx b/src/App/index.tsx index c91c16b..995ffd8 100644 --- a/src/App/index.tsx +++ b/src/App/index.tsx @@ -33,7 +33,7 @@ import { } from '#generated/types/graphql'; import useThrottledValue from '#hooks/useThrottledValue'; import { getWindowSize } from '#utils/common'; -import { setToStorage } from '#utils/localStorage'; +import { defaultConfigValue } from '#utils/constants'; import wrappedRoutes, { unwrappedRoutes } from './routes'; @@ -111,13 +111,11 @@ function App() { const [userAuth, setUserAuth] = useState(); const [size, setSize] = useState(getWindowSize); const [ready, setReady] = useState(false); - const [storageState, setStorageState] = useState({}); - - useEffect(() => { - Object.keys(storageState).forEach((key) => { - setToStorage(key, storageState[key].value); - }); - }, [storageState]); + const [storageState, setStorageState] = useState({ + 'timur-config': { + defaultValue: defaultConfigValue, + }, + }); const debouncedSize = useThrottledValue(size); diff --git a/src/App/routes/PageError/styles.module.css b/src/App/routes/PageError/styles.module.css index 818ec32..d3c4983 100644 --- a/src/App/routes/PageError/styles.module.css +++ b/src/App/routes/PageError/styles.module.css @@ -46,8 +46,8 @@ .footer { display: flex; align-items: center; - justify-content: space-between; flex-wrap: wrap; + justify-content: space-between; gap: var(--spacing-md); .actions { diff --git a/src/components/Page/index.tsx b/src/components/Page/index.tsx index 38bef4b..1919561 100644 --- a/src/components/Page/index.tsx +++ b/src/components/Page/index.tsx @@ -23,11 +23,6 @@ import SizeContext from '#contexts/size'; import useDebouncedValue from '#hooks/useDebouncedValue'; import useLocalStorage from '#hooks/useLocalStorage'; import useSetFieldValue from '#hooks/useSetFieldValue'; -import { - defaultConfigValue, - KEY_CONFIG_STORAGE, -} from '#utils/constants'; -import { ConfigStorage } from '#utils/types'; import styles from './styles.module.css'; @@ -62,17 +57,14 @@ function Page(props: Props) { const { width } = useContext(SizeContext); - const [storedState, setStoredState] = useLocalStorage( - KEY_CONFIG_STORAGE, - defaultConfigValue, - ); + const [storedConfig, setStoredConfig] = useLocalStorage('timur-config'); const { startSidebarShown, endSidebarShown, - } = storedState; + } = storedConfig; - const setFieldValue = useSetFieldValue(setStoredState); + const setFieldValue = useSetFieldValue(setStoredConfig); const setSidebarShown = useCallback( (newValue: boolean) => setFieldValue(newValue, 'startSidebarShown'), diff --git a/src/contexts/localStorage.tsx b/src/contexts/localStorage.tsx index 8e21426..6c1ab2c 100644 --- a/src/contexts/localStorage.tsx +++ b/src/contexts/localStorage.tsx @@ -1,19 +1,28 @@ import { createContext } from 'react'; -export type StoredValue = { - timestamp: number; - value: VALUE; +import { PutNull } from '#utils/common'; +import { defaultConfigValue } from '#utils/constants'; +import { ConfigStorage } from '#utils/types'; + +export type StoredValue = { + value?: PutNull; + defaultValue: VALUE; +}; +export type StorageState = { + 'timur-config': StoredValue, }; -type StorageState = Record>; export interface LocalStorageContextProps { storageState: StorageState; setStorageState: React.Dispatch>; } -// FIXME: replace this with simpler alternative const LocalStorageContext = createContext({ - storageState: {}, + storageState: { + 'timur-config': { + defaultValue: defaultConfigValue, + }, + }, setStorageState: () => { // eslint-disable-next-line no-console console.error('LocalStorageContext::setStorage() called without a provider'); diff --git a/src/hooks/useLocalStorage.ts b/src/hooks/useLocalStorage.ts index b9808fd..77a6570 100644 --- a/src/hooks/useLocalStorage.ts +++ b/src/hooks/useLocalStorage.ts @@ -2,65 +2,87 @@ import { useCallback, useContext, useEffect, - useState, + useMemo, } from 'react'; +import { isDefined } from '@togglecorp/fujs'; -import LocalStorageContext, { StoredValue } from '#contexts/localStorage'; -import { isCallable } from '#utils/common'; -import { getFromStorage } from '#utils/localStorage'; +import LocalStorageContext, { StorageState } from '#contexts/localStorage'; +import { + isCallable, + putNull, + putUndefined, +} from '#utils/common'; +import { + getFromStorage, + setToStorage, +} from '#utils/localStorage'; -import useDebouncedValue from './useDebouncedValue'; +function useLocalStorage(key: K) { + const { + storageState, + setStorageState, + } = useContext(LocalStorageContext); -function useLocalStorage( - key: string, - defaultValue: T, - debounce = 200, -) { - const [value, setValue] = useState>( - () => { - const fromStorage = getFromStorage(key); + type T = StorageState[K]; + + const hasReadValue = isDefined(storageState[key].value); - return { - timestamp: new Date().getTime(), - value: fromStorage ?? defaultValue, - }; + useEffect( + () => { + if (hasReadValue) { + return; + } + const val = getFromStorage(key); + setStorageState((oldValue) => ({ + ...oldValue, + [key]: { + ...oldValue[key], + value: val, + }, + })); }, + [key, hasReadValue, setStorageState], ); - const { storageState, setStorageState } = useContext(LocalStorageContext); - const debouncedValue = useDebouncedValue(value, debounce); + const setValue: React.Dispatch>> = useCallback( + (newValue) => { + setStorageState((oldValue) => { + const oldValueValue = oldValue[key].value; + const oldValueDefaultValue = oldValue[key].defaultValue; - useEffect(() => { - if (!storageState[key]) { - return; - } + const resolvedValue = isCallable(newValue) + ? newValue(oldValueValue ?? oldValueDefaultValue) + : newValue; - if (storageState[key].timestamp > value.timestamp) { - setValue(storageState[key] as StoredValue); - } - }, [storageState, key, value]); + setToStorage(key, putNull(resolvedValue)); - useEffect(() => { - setStorageState((oldStorageValue) => ({ - ...oldStorageValue, - [key]: debouncedValue, - })); - }, [debouncedValue, key, setStorageState]); + return { + ...oldValue, + [key]: { + ...oldValue[key], + value: resolvedValue, + }, + } satisfies StorageState; + }); + }, + [key, setStorageState], + ); - const setValueSafe = useCallback((newValue: T | ((v: T) => T)) => { - setValue((oldValue) => { - const resolvedValue = isCallable(newValue) - ? newValue(oldValue.value) - : newValue; + const { value } = storageState[key]; + const { defaultValue } = storageState[key]; - return { - timestamp: new Date().getTime(), - value: resolvedValue, - } satisfies StoredValue; - }); - }, []); + const finalValue = useMemo( + () => putUndefined({ + ...defaultValue, + ...value, + }), + [defaultValue, value], + ); - return [value.value, setValueSafe] as const; + return [ + finalValue, + setValue, + ] as const; } export default useLocalStorage; diff --git a/src/index.css b/src/index.css index 8fcaf09..959ae23 100644 --- a/src/index.css +++ b/src/index.css @@ -142,10 +142,10 @@ body { overflow-x: hidden; color: var(--color-text); font-family: var(--font-family-sans-serif); + font-size: var(--font-size-md); font-weight: var(--font-weight-normal); font-style: normal; font-optical-sizing: auto; - font-size: var(--font-size-md); @media screen { margin: 0; diff --git a/src/utils/common.ts b/src/utils/common.ts index 551ebc3..c0b96e9 100644 --- a/src/utils/common.ts +++ b/src/utils/common.ts @@ -107,7 +107,7 @@ export function getDurationNumber(value: string | undefined) { } // decimal if (value.match(/^\d{0,2}\.\d{1,2}$/)) { - return Number(value); + return Math.round(Number(value) * 60); } // hh:mm // hh:m @@ -332,3 +332,35 @@ export function groupListByAttributes( return groupedItems; } + +export type PutNull = { + [key in keyof T]: T[key] extends undefined ? null : T[key]; +} +export function putNull(value: T) { + type PartialWithNull = { + [P in keyof Q]: Q[P] | null; + }; + const copy: PartialWithNull = { ...value }; + Object.keys(copy).forEach((key) => { + const safeKey = key as keyof T; + if (copy[safeKey] === undefined) { + copy[safeKey] = null; + } + }); + + return copy as PutNull; +} +export type PutUndefined = { + [key in keyof T]: T[key] extends null ? undefined : T[key]; +} +export function putUndefined(value: T) { + const copy: Partial = { ...value }; + Object.keys(copy).forEach((key) => { + const safeKey = key as keyof T; + if (copy[safeKey] === null) { + copy[safeKey] = undefined; + } + }); + + return copy as PutUndefined; +} diff --git a/src/utils/constants.ts b/src/utils/constants.ts index 3e61e37..0b57fbf 100644 --- a/src/utils/constants.ts +++ b/src/utils/constants.ts @@ -3,8 +3,6 @@ import { NumericOption, } from './types'; -export const KEY_CONFIG_STORAGE = 'timur-config'; - export const defaultConfigValue: ConfigStorage = { defaultTaskType: undefined, defaultTaskStatus: 'DONE', diff --git a/src/utils/localStorage.ts b/src/utils/localStorage.ts index 2b854ca..f11a825 100644 --- a/src/utils/localStorage.ts +++ b/src/utils/localStorage.ts @@ -1,3 +1,5 @@ +import { isNotDefined } from '@togglecorp/fujs'; + export function getFromStorage(key: string) { const val = localStorage.getItem(key); return val === null || val === undefined ? undefined : JSON.parse(val) as T; @@ -7,6 +9,9 @@ export function removeFromStorage(key: string) { localStorage.removeItem(key); } -export function setToStorage(key: string, value: T) { +export function setToStorage(key: string, value: unknown) { + if (isNotDefined(value)) { + localStorage.clearItem(key); + } localStorage.setItem(key, JSON.stringify(value)); } diff --git a/src/views/DailyJournal/DayView/ProjectGroupedView/ContractGroupedView/index.tsx b/src/views/DailyJournal/DayView/ProjectGroupedView/ContractGroupedView/index.tsx deleted file mode 100644 index 7a2f84b..0000000 --- a/src/views/DailyJournal/DayView/ProjectGroupedView/ContractGroupedView/index.tsx +++ /dev/null @@ -1,129 +0,0 @@ -import { - useCallback, - useMemo, -} from 'react'; -import { FcClock } from 'react-icons/fc'; -import { - _cs, - isDefined, - sum, -} from '@togglecorp/fujs'; - -import DisplayPicture from '#components/DisplayPicture'; -import List from '#components/List'; -import useLocalStorage from '#hooks/useLocalStorage'; -import { getDurationString } from '#utils/common'; -import { - defaultConfigValue, - KEY_CONFIG_STORAGE, -} from '#utils/constants'; -import { - ConfigStorage, - Contract, - EntriesAsList, - Project, - WorkItem, -} from '#utils/types'; - -import WorkItemRow, { Props as WorkItemRowProps } from './WorkItemRow'; - -import styles from './styles.module.css'; - -function keySelector(item: WorkItem) { - return item.clientId; -} - -export interface Props { - className?: string; - contract: Contract; - project: Project; - workItems: WorkItem[]; - onWorkItemClone: (clientId: string, override?: Partial) => void; - onWorkItemChange: (clientId: string, ...entries: EntriesAsList) => void; - onWorkItemDelete: (clientId: string) => void; -} - -function ContractGroupedView(props: Props) { - const { - className, - contract, - project, - workItems, - onWorkItemClone, - onWorkItemChange, - onWorkItemDelete, - } = props; - - const [config] = useLocalStorage( - KEY_CONFIG_STORAGE, - defaultConfigValue, - ); - - const totalHours = useMemo( - () => ( - sum(workItems.map((item) => item.duration).filter(isDefined)) - ), - [workItems], - ); - - const rendererParams = useCallback( - (_: string, item: WorkItem): WorkItemRowProps => ({ - workItem: item, - onClone: onWorkItemClone, - onChange: onWorkItemChange, - onDelete: onWorkItemDelete, - contract, - }), - [ - onWorkItemClone, - onWorkItemChange, - onWorkItemDelete, - contract, - ], - ); - - return ( -
-
- -
-

- {project.name} -

-
- {contract.name} -
-
-
- {config.showInputIcons && ( - - )} - {getDurationString(totalHours)} -
-
- -
- ); -} - -export default ContractGroupedView; diff --git a/src/views/DailyJournal/DayView/ProjectGroupedView/ContractGroupedView/styles.module.css b/src/views/DailyJournal/DayView/ProjectGroupedView/ContractGroupedView/styles.module.css deleted file mode 100644 index dcfdf80..0000000 --- a/src/views/DailyJournal/DayView/ProjectGroupedView/ContractGroupedView/styles.module.css +++ /dev/null @@ -1,60 +0,0 @@ -.contract-grouped-view { - display: flex; - flex-direction: column; - border-radius: var(--border-radius-lg); - - .heading { - display: flex; - gap: var(--spacing-sm); - align-items: flex-start; - - .display-picture { - font-size: var(--font-size-xl); - } - - .text-section { - display: flex; - align-items: baseline; - gap: 0 var(--spacing-sm); - flex-grow: 1; - flex-wrap: wrap; - - .contract-name { - color: var(--color-text-light); - font-size: var(--font-size-sm); - } - } - - .duration { - display: flex; - align-items: center; - align-self: flex-end; - flex-shrink: 0; - padding: var(--spacing-xs) 0; - width: calc(8rem + 2 * var(--spacing-xs)); - color: var(--color-text-light); - font-weight: var(--font-weight-bold); - gap: var(--spacing-2xs); - - &.with-icon { - width: calc(9rem + 2 * var(--spacing-xs)); - } - - @media screen and (max-width: 900px) { - width: unset; - - &.with-icon { - width: unset; - } - } - } - } - - .work-item-list { - display: flex; - flex-direction: column; - border-radius: var(--border-radius-lg); - background-color: var(--color-foreground); - padding: var(--spacing-3xs) 0; - } -} diff --git a/src/views/DailyJournal/DayView/ProjectGroupedView/index.tsx b/src/views/DailyJournal/DayView/ProjectGroupedView/index.tsx deleted file mode 100644 index d00ffd2..0000000 --- a/src/views/DailyJournal/DayView/ProjectGroupedView/index.tsx +++ /dev/null @@ -1,76 +0,0 @@ -import { useCallback } from 'react'; -import { _cs } from '@togglecorp/fujs'; - -import List from '#components/List'; -import { - Contract, - EntriesAsList, - Project, - WorkItem, -} from '#utils/types'; - -import ContractGroupedView, { Props as ContractGroupedViewProps } from './ContractGroupedView'; - -import styles from './styles.module.css'; - -type ContractGroupedWorkItem = { - contract: Contract; - workItems: WorkItem[]; -}; - -function getId(item: ContractGroupedWorkItem) { - return item.contract.id; -} - -export interface Props { - className?: string; - project: Project; - contracts: ContractGroupedWorkItem[]; - onWorkItemClone: (clientId: string, override?: Partial) => void; - onWorkItemChange: (clientId: string, ...entries: EntriesAsList) => void; - onWorkItemDelete: (clientId: string) => void; -} - -function ProjectGroupedView(props: Props) { - const { - className, - project, - contracts, - onWorkItemClone, - onWorkItemChange, - onWorkItemDelete, - } = props; - - const rendererParams = useCallback( - (_: string, item: ContractGroupedWorkItem): ContractGroupedViewProps => ({ - project, - contract: item.contract, - workItems: item.workItems, - onWorkItemClone, - onWorkItemChange, - onWorkItemDelete, - }), - [ - project, - onWorkItemClone, - onWorkItemChange, - onWorkItemDelete, - ], - ); - - return ( - - ); -} - -export default ProjectGroupedView; diff --git a/src/views/DailyJournal/DayView/ProjectGroupedView/styles.module.css b/src/views/DailyJournal/DayView/ProjectGroupedView/styles.module.css deleted file mode 100644 index 0221640..0000000 --- a/src/views/DailyJournal/DayView/ProjectGroupedView/styles.module.css +++ /dev/null @@ -1,5 +0,0 @@ -.contract-grouped-list { - display: flex; - flex-direction: column; - gap: var(--spacing-md); -} diff --git a/src/views/DailyJournal/DayView/ProjectGroupedView/ContractGroupedView/WorkItemRow/index.tsx b/src/views/DailyJournal/DayView/WorkItemRow/index.tsx similarity index 98% rename from src/views/DailyJournal/DayView/ProjectGroupedView/ContractGroupedView/WorkItemRow/index.tsx rename to src/views/DailyJournal/DayView/WorkItemRow/index.tsx index 1d6bda1..1b15277 100644 --- a/src/views/DailyJournal/DayView/ProjectGroupedView/ContractGroupedView/WorkItemRow/index.tsx +++ b/src/views/DailyJournal/DayView/WorkItemRow/index.tsx @@ -37,13 +37,8 @@ import SizeContext from '#contexts/size'; import { EnumsQuery } from '#generated/types/graphql'; import { useFocusClient } from '#hooks/useFocus'; import useLocalStorage from '#hooks/useLocalStorage'; +import { colorscheme } from '#utils/constants'; import { - colorscheme, - defaultConfigValue, - KEY_CONFIG_STORAGE, -} from '#utils/constants'; -import { - ConfigStorage, Contract, EntriesAsList, Task, @@ -111,10 +106,7 @@ function WorkItemRow(props: Props) { const { enums } = useContext(EnumsContext); const { width: windowWidth } = useContext(SizeContext); const inputRef = useFocusClient(workItem.clientId); - const [config] = useLocalStorage( - KEY_CONFIG_STORAGE, - defaultConfigValue, - ); + const [config] = useLocalStorage('timur-config'); const setFieldValue = useCallback( (...entries: EntriesAsList) => { diff --git a/src/views/DailyJournal/DayView/ProjectGroupedView/ContractGroupedView/WorkItemRow/styles.module.css b/src/views/DailyJournal/DayView/WorkItemRow/styles.module.css similarity index 100% rename from src/views/DailyJournal/DayView/ProjectGroupedView/ContractGroupedView/WorkItemRow/styles.module.css rename to src/views/DailyJournal/DayView/WorkItemRow/styles.module.css diff --git a/src/views/DailyJournal/DayView/index.tsx b/src/views/DailyJournal/DayView/index.tsx index 3f6fb45..73adcce 100644 --- a/src/views/DailyJournal/DayView/index.tsx +++ b/src/views/DailyJournal/DayView/index.tsx @@ -16,6 +16,7 @@ import { } from '@togglecorp/fujs'; import DefaultMessage from '#components/DefaultMessage'; +import Indent from '#components/Indent'; import EnumsContext from '#contexts/enums'; import useFormattedRelativeDate from '#hooks/useFormattedRelativeDate'; import useLocalStorage from '#hooks/useLocalStorage'; @@ -25,20 +26,14 @@ import { sortByAttributes, } from '#utils/common'; import { - defaultConfigValue, - KEY_CONFIG_STORAGE, -} from '#utils/constants'; -import { - ConfigStorage, DailyJournalAttributeOrder, EntriesAsList, WorkItem, } from '#utils/types'; -import WorkItemRow from './ProjectGroupedView/ContractGroupedView/WorkItemRow'; +import WorkItemRow from './WorkItemRow'; import styles from './styles.module.css'; -import Indent from '#components/Indent'; const dateFormatter = new Intl.DateTimeFormat( [], @@ -74,10 +69,8 @@ function DayView(props: Props) { } = props; const { taskById } = useContext(EnumsContext); - const [storedConfig] = useLocalStorage( - KEY_CONFIG_STORAGE, - defaultConfigValue, - ); + + const [storedConfig] = useLocalStorage('timur-config'); const getWorkItemAttribute = useCallback(( item: WorkItem, diff --git a/src/views/DailyJournal/DayView/styles.module.css b/src/views/DailyJournal/DayView/styles.module.css index fb21a57..aafdf35 100644 --- a/src/views/DailyJournal/DayView/styles.module.css +++ b/src/views/DailyJournal/DayView/styles.module.css @@ -58,6 +58,7 @@ .new-group { display: flex; flex-direction: column; + gap: var(--spacing-2xs); .nested-heading { display: flex; @@ -74,13 +75,13 @@ .joined-heading { display: flex; align-items: center; - gap: var(--spacing-sm); - color: var(--color-secondary); + gap: var(--spacing-md); + color: var(--color-text-light); font-weight: var(--font-weight-semibold); .separator { border-radius: 0.5rem; - background-color: var(--color-text-light); + background-color: var(--color-separator); width: 0.5rem; height: 0.5rem; } diff --git a/src/views/DailyJournal/StartSidebar/index.tsx b/src/views/DailyJournal/StartSidebar/index.tsx index c8bee20..45d862a 100644 --- a/src/views/DailyJournal/StartSidebar/index.tsx +++ b/src/views/DailyJournal/StartSidebar/index.tsx @@ -36,13 +36,11 @@ import useSetFieldValue from '#hooks/useSetFieldValue'; import { colorscheme, defaultConfigValue, - KEY_CONFIG_STORAGE, numericOptionKeySelector, numericOptionLabelSelector, numericOptions, } from '#utils/constants'; import { - ConfigStorage, DailyJournalAttributeKeys, DailyJournalAttributeOrder, DailyJournalGrouping, @@ -215,10 +213,7 @@ function StartSidebar(props: Props) { const { enums } = useContext(EnumsContext); - const [storedConfig, setStoredConfig] = useLocalStorage( - KEY_CONFIG_STORAGE, - defaultConfigValue, - ); + const [storedConfig, setStoredConfig] = useLocalStorage('timur-config'); const setConfigFieldValue = useSetFieldValue(setStoredConfig); diff --git a/src/views/DailyJournal/StartSidebar/styles.module.css b/src/views/DailyJournal/StartSidebar/styles.module.css index 1982374..382fbc7 100644 --- a/src/views/DailyJournal/StartSidebar/styles.module.css +++ b/src/views/DailyJournal/StartSidebar/styles.module.css @@ -32,9 +32,9 @@ gap: var(--spacing-xs); &.dragging { + opacity: 0.8; z-index: 1; box-shadow: var(--box-shadow-md); - opacity: 0.8; } .drag-handle { diff --git a/src/views/DailyJournal/index.tsx b/src/views/DailyJournal/index.tsx index 76efc55..d57ec19 100644 --- a/src/views/DailyJournal/index.tsx +++ b/src/views/DailyJournal/index.tsx @@ -59,13 +59,9 @@ import { addDays, getNewId, } from '#utils/common'; -import { - defaultConfigValue, - KEY_CONFIG_STORAGE, -} from '#utils/constants'; +import { defaultConfigValue } from '#utils/constants'; import { removeNull } from '#utils/nullHelper'; import { - ConfigStorage, EntriesAsList, WorkItem, } from '#utils/types'; @@ -222,10 +218,7 @@ export function Component() { return prevDay; }, [selectedDate]); - const [storedConfig] = useLocalStorage( - KEY_CONFIG_STORAGE, - defaultConfigValue, - ); + const [storedConfig] = useLocalStorage('timur-config'); const editMode = storedConfig.editingMode ?? defaultConfigValue.editingMode; @@ -610,7 +603,6 @@ export function Component() { )} From c4bd527d4e3bb08bc239b1687cd2c83c3ac964bf Mon Sep 17 00:00:00 2001 From: tnagorra Date: Fri, 6 Sep 2024 15:56:43 +0545 Subject: [PATCH 03/10] Move rarely used configuration to Settings page - Fix issue with knip configuration --- knip.json | 4 +- src/App/index.tsx | 34 +++-- src/App/routes/index.tsx | 7 +- src/App/styles.module.css | 6 - src/PwaPrompt/index.tsx | 5 +- src/components/Link/index.tsx | 2 +- src/utils/localStorage.ts | 6 +- .../DayView/WorkItemRow/index.tsx | 10 +- src/views/DailyJournal/DayView/index.tsx | 2 +- src/views/DailyJournal/StartSidebar/index.tsx | 109 -------------- src/views/DailyStandup/index.tsx | 3 +- src/views/Settings/index.tsx | 136 ++++++++++++++++++ src/views/Settings/styles.module.css | 13 ++ 13 files changed, 190 insertions(+), 147 deletions(-) create mode 100644 src/views/Settings/index.tsx create mode 100644 src/views/Settings/styles.module.css diff --git a/knip.json b/knip.json index faebd69..40e4fc1 100644 --- a/knip.json +++ b/knip.json @@ -1,5 +1,5 @@ { "$schema": "https://unpkg.com/knip@5/schema.json", - "entry": ["src/index.tsx"], - "project": ["src/**/*.tsx", "src/**/*.ts"] + "entry": ["src/index.tsx!"], + "project": ["src/**/*.tsx!", "src/**/*.ts!"] } diff --git a/src/App/index.tsx b/src/App/index.tsx index 995ffd8..a468821 100644 --- a/src/App/index.tsx +++ b/src/App/index.tsx @@ -111,14 +111,23 @@ function App() { const [userAuth, setUserAuth] = useState(); const [size, setSize] = useState(getWindowSize); const [ready, setReady] = useState(false); + + // Local Storage + const [storageState, setStorageState] = useState({ 'timur-config': { defaultValue: defaultConfigValue, }, }); - const debouncedSize = useThrottledValue(size); + const storageContextValue = useMemo(() => ({ + storageState, + setStorageState, + }), [storageState]); + // Device Size + + const throttledSize = useThrottledValue(size); useEffect(() => { function handleResize() { setSize(getWindowSize()); @@ -131,6 +140,8 @@ function App() { }; }, []); + // Authentication + const [meResult] = useQuery( { query: ME_QUERY }, ); @@ -143,10 +154,6 @@ function App() { setReady(true); }, [meResult.data, meResult.fetching]); - const [enumsResult] = useQuery( - { query: ENUMS_QUERY }, - ); - const removeUserAuth = useCallback( () => { setUserAuth(undefined); @@ -163,6 +170,12 @@ function App() { [userAuth, removeUserAuth], ); + // Enums + + const [enumsResult] = useQuery( + { query: ENUMS_QUERY }, + ); + const enumsContextValue = useMemo( () => ({ enums: enumsResult.data, @@ -182,10 +195,7 @@ function App() { [enumsResult], ); - const storageContextValue = useMemo(() => ({ - storageState, - setStorageState, - }), [storageState]); + // Page layouts const navbarStartActionRef = useRef(null); const navbarMidActionRef = useRef(null); @@ -197,6 +207,8 @@ function App() { endActionsRef: navbarEndActionRef, }), []); + // Route + const fallbackElement = (
); + // NOTE: We should block page for authentication before we mount routes + // TODO: Handle error with authentication if (!ready) { return fallbackElement; } return ( - + diff --git a/src/App/routes/index.tsx b/src/App/routes/index.tsx index c1af8da..419ca67 100644 --- a/src/App/routes/index.tsx +++ b/src/App/routes/index.tsx @@ -84,11 +84,8 @@ const settings = customWrapRoute({ parent: rootLayout, path: 'settings', component: { - render: () => import('#components/TemplateView'), - props: { - title: 'Settings', - description: 'No settings to configure', - }, + render: () => import('#views/Settings'), + props: {}, }, wrapperComponent: Auth, context: { diff --git a/src/App/styles.module.css b/src/App/styles.module.css index 05e5da5..6dbff78 100644 --- a/src/App/styles.module.css +++ b/src/App/styles.module.css @@ -3,9 +3,6 @@ align-items: center; flex-direction: column; justify-content: center; - /* - background-color: var(--go-ui-color-background); - */ width: 100vw; height: 100vh; gap: 1rem; @@ -13,8 +10,5 @@ .app-logo { margin-top: -4rem; height: 6rem; - /* - animation: slide-up var(--go-ui-duration-animation-slow) ease-in-out forwards; - */ } } diff --git a/src/PwaPrompt/index.tsx b/src/PwaPrompt/index.tsx index 0f13e90..fc2769e 100644 --- a/src/PwaPrompt/index.tsx +++ b/src/PwaPrompt/index.tsx @@ -10,7 +10,7 @@ import styles from './styles.module.css'; // eslint-disable-next-line no-console console.info('PWA information:', pwaInfo); -function ReloadPrompt() { +function PwaPrompt() { const { offlineReady: [offlineReady, setOfflineReady], needRefresh: [needRefresh, setNeedRefresh], @@ -38,6 +38,7 @@ function ReloadPrompt() { console.info('SW registration error', error); }, }); + const reload = useCallback( () => { updateServiceWorker(true); @@ -96,4 +97,4 @@ function ReloadPrompt() { ); } -export default ReloadPrompt; +export default PwaPrompt; diff --git a/src/components/Link/index.tsx b/src/components/Link/index.tsx index 746afec..d86b5aa 100644 --- a/src/components/Link/index.tsx +++ b/src/components/Link/index.tsx @@ -56,7 +56,7 @@ export function resolvePath( } // eslint-disable-next-line react-refresh/only-export-components -export function useLink(props: { +function useLink(props: { external: true, href: string | undefined | null, to?: never, diff --git a/src/utils/localStorage.ts b/src/utils/localStorage.ts index f11a825..80cb1be 100644 --- a/src/utils/localStorage.ts +++ b/src/utils/localStorage.ts @@ -5,13 +5,9 @@ export function getFromStorage(key: string) { return val === null || val === undefined ? undefined : JSON.parse(val) as T; } -export function removeFromStorage(key: string) { - localStorage.removeItem(key); -} - export function setToStorage(key: string, value: unknown) { if (isNotDefined(value)) { - localStorage.clearItem(key); + localStorage.removeItem(key); } localStorage.setItem(key, JSON.stringify(value)); } diff --git a/src/views/DailyJournal/DayView/WorkItemRow/index.tsx b/src/views/DailyJournal/DayView/WorkItemRow/index.tsx index 1b15277..da0de34 100644 --- a/src/views/DailyJournal/DayView/WorkItemRow/index.tsx +++ b/src/views/DailyJournal/DayView/WorkItemRow/index.tsx @@ -39,7 +39,6 @@ import { useFocusClient } from '#hooks/useFocus'; import useLocalStorage from '#hooks/useLocalStorage'; import { colorscheme } from '#utils/constants'; import { - Contract, EntriesAsList, Task, WorkItem, @@ -86,7 +85,7 @@ function defaultColorSelector(_: T, i: number): [string, string] { export interface Props { className?: string; workItem: WorkItem; - contract: Contract; + contractId: string; onClone: (clientId: string, override?: Partial) => void; onChange: (clientId: string, ...entries: EntriesAsList) => void; @@ -97,7 +96,7 @@ function WorkItemRow(props: Props) { const { className, workItem, - contract, + contractId, onClone, onDelete, onChange, @@ -105,6 +104,7 @@ function WorkItemRow(props: Props) { const { enums } = useContext(EnumsContext); const { width: windowWidth } = useContext(SizeContext); + const inputRef = useFocusClient(workItem.clientId); const [config] = useLocalStorage('timur-config'); @@ -116,8 +116,8 @@ function WorkItemRow(props: Props) { ); const filteredTaskList = useMemo( - () => enums?.private?.allActiveTasks?.filter((task) => task.contract.id === contract.id), - [contract.id, enums], + () => enums?.private?.allActiveTasks?.filter((task) => task.contract.id === contractId), + [contractId, enums], ); const handleStatusCheck = useCallback(() => { diff --git a/src/views/DailyJournal/DayView/index.tsx b/src/views/DailyJournal/DayView/index.tsx index 73adcce..599990d 100644 --- a/src/views/DailyJournal/DayView/index.tsx +++ b/src/views/DailyJournal/DayView/index.tsx @@ -266,7 +266,7 @@ function DayView(props: Props) { onClone={onWorkItemClone} onChange={onWorkItemChange} onDelete={onWorkItemDelete} - contract={taskDetails?.contract} + contractId={taskDetails.contract.id} />
); diff --git a/src/views/DailyJournal/StartSidebar/index.tsx b/src/views/DailyJournal/StartSidebar/index.tsx index 45d862a..a160674 100644 --- a/src/views/DailyJournal/StartSidebar/index.tsx +++ b/src/views/DailyJournal/StartSidebar/index.tsx @@ -1,6 +1,5 @@ import { useCallback, - useContext, useMemo, } from 'react'; import { MdDragIndicator } from 'react-icons/md'; @@ -25,16 +24,11 @@ import { isNotDefined, } from '@togglecorp/fujs'; -import Checkbox from '#components/Checkbox'; import MonthlyCalendar from '#components/MonthlyCalendar'; import RadioInput from '#components/RadioInput'; -import SelectInput from '#components/SelectInput'; -import EnumsContext from '#contexts/enums'; -import { EnumsQuery } from '#generated/types/graphql'; import useLocalStorage from '#hooks/useLocalStorage'; import useSetFieldValue from '#hooks/useSetFieldValue'; import { - colorscheme, defaultConfigValue, numericOptionKeySelector, numericOptionLabelSelector, @@ -44,7 +38,6 @@ import { DailyJournalAttributeKeys, DailyJournalAttributeOrder, DailyJournalGrouping, - EditingMode, } from '#utils/types'; import styles from './styles.module.css'; @@ -155,47 +148,6 @@ function SortableItem(props: SortableItemProps) { ); } -type EditingOption = { key: EditingMode, label: string }; -function editingOptionKeySelector(item: EditingOption) { - return item.key; -} -function editingOptionLabelSelector(item: EditingOption) { - return item.label; -} -const editingOptions: EditingOption[] = [ - { key: 'normal', label: 'Normies' }, - { key: 'vim', label: 'Vim Masterace' }, -]; - -type WorkItemTypeOption = EnumsQuery['enums']['TimeEntryType'][number]; -function workItemTypeKeySelector(item: WorkItemTypeOption) { - return item.key; -} -function workItemTypeLabelSelector(item: WorkItemTypeOption) { - return item.label; -} - -type WorkItemStatusOption = EnumsQuery['enums']['TimeEntryStatus'][number]; -function workItemStatusKeySelector(item: WorkItemStatusOption) { - return item.key; -} -function workItemStatusLabelSelector(item: WorkItemStatusOption) { - return item.label; -} -function workItemStatusColorSelector(item: WorkItemStatusOption): [string, string] { - if (item.key === 'DOING') { - return colorscheme[1]; - } - if (item.key === 'DONE') { - return colorscheme[5]; - } - return colorscheme[7]; -} - -function defaultColorSelector(_: T, i: number): [string, string] { - return colorscheme[i % colorscheme.length]; -} - interface Props { selectedDate: string; setSelectedDate: (newDate: string) => void; @@ -211,8 +163,6 @@ function StartSidebar(props: Props) { setSelectedDate, } = props; - const { enums } = useContext(EnumsContext); - const [storedConfig, setStoredConfig] = useLocalStorage('timur-config'); const setConfigFieldValue = useSetFieldValue(setStoredConfig); @@ -327,65 +277,6 @@ function StartSidebar(props: Props) { labelSelector={numericOptionLabelSelector} />
-
-

- Quick Settings -

- - - - - - -
); } diff --git a/src/views/DailyStandup/index.tsx b/src/views/DailyStandup/index.tsx index 02ccd0e..81c56ed 100644 --- a/src/views/DailyStandup/index.tsx +++ b/src/views/DailyStandup/index.tsx @@ -336,8 +336,9 @@ export function Component() { onClick={handlePresentClick} variant="quaternary" title="Enter full screen" + icons={} > - + Present diff --git a/src/views/Settings/index.tsx b/src/views/Settings/index.tsx new file mode 100644 index 0000000..c8178ef --- /dev/null +++ b/src/views/Settings/index.tsx @@ -0,0 +1,136 @@ +import { useContext } from 'react'; + +import Checkbox from '#components/Checkbox'; +import Page from '#components/Page'; +import SelectInput from '#components/SelectInput'; +import EnumsContext from '#contexts/enums'; +import { EnumsQuery } from '#generated/types/graphql'; +import useLocalStorage from '#hooks/useLocalStorage'; +import useSetFieldValue from '#hooks/useSetFieldValue'; +import { colorscheme } from '#utils/constants'; +import { EditingMode } from '#utils/types'; + +import styles from './styles.module.css'; + +type EditingOption = { key: EditingMode, label: string }; +function editingOptionKeySelector(item: EditingOption) { + return item.key; +} +function editingOptionLabelSelector(item: EditingOption) { + return item.label; +} +const editingOptions: EditingOption[] = [ + { key: 'normal', label: 'Normies' }, + { key: 'vim', label: 'Vim Masterace' }, +]; + +type WorkItemTypeOption = EnumsQuery['enums']['TimeEntryType'][number]; +function workItemTypeKeySelector(item: WorkItemTypeOption) { + return item.key; +} +function workItemTypeLabelSelector(item: WorkItemTypeOption) { + return item.label; +} + +type WorkItemStatusOption = EnumsQuery['enums']['TimeEntryStatus'][number]; +function workItemStatusKeySelector(item: WorkItemStatusOption) { + return item.key; +} +function workItemStatusLabelSelector(item: WorkItemStatusOption) { + return item.label; +} +function workItemStatusColorSelector(item: WorkItemStatusOption): [string, string] { + if (item.key === 'DOING') { + return colorscheme[1]; + } + if (item.key === 'DONE') { + return colorscheme[5]; + } + return colorscheme[7]; +} + +function defaultColorSelector(_: T, i: number): [string, string] { + return colorscheme[i % colorscheme.length]; +} + +// eslint-disable-next-line import/prefer-default-export +export function Component() { + const { enums } = useContext(EnumsContext); + const [storedConfig, setStoredConfig] = useLocalStorage('timur-config'); + const setConfigFieldValue = useSetFieldValue(setStoredConfig); + + return ( + +
+

+ Journal +

+ + + + + +
+
+

+ Note +

+ +
+
+ ); +} + +Component.displayName = 'Settings'; diff --git a/src/views/Settings/styles.module.css b/src/views/Settings/styles.module.css new file mode 100644 index 0000000..6ca80fa --- /dev/null +++ b/src/views/Settings/styles.module.css @@ -0,0 +1,13 @@ +.settings { + .main-content { + display: flex; + flex-direction: column; + gap: var(--spacing-lg); + + .section { + display: flex; + flex-direction: column; + gap: var(--spacing-sm); + } + } +} From 7a9ffc6cf31d3c1b7c26ff6241208d40f088f0cf Mon Sep 17 00:00:00 2001 From: tnagorra Date: Fri, 6 Sep 2024 18:03:03 +0545 Subject: [PATCH 04/10] Add github workflows - Remove unused things - Fix issue with knip - Update eslint flat config for compatibility with knip --- eslint.config.js => .eslintrc.cjs | 26 +- .github/workflows/ci.yml | 135 ++ .gitignore | 2 +- codegen.ts | 2 +- env.ts | 2 +- knip.json | 19 +- package.json | 20 +- pnpm-lock.yaml | 1585 +++++++++-------- src/App/routes/SmartNavigate.tsx | 49 - .../AvailabilityIndicator/index.tsx | 2 +- src/components/CalendarInput/index.tsx | 2 +- src/components/DateInput/index.tsx | 63 - src/components/Link/index.tsx | 2 +- src/components/NumberInput/index.tsx | 106 -- src/components/RadioInput/index.tsx | 4 +- src/contexts/localStorage.tsx | 2 +- src/hooks/useFormattedRelativeTime.ts | 51 - src/hooks/useRouting.ts | 73 - src/hooks/useSizeTracking.ts | 47 - src/utils/colors.ts | 137 -- src/utils/common.ts | 2 +- src/utils/resolveUrl.ts | 9 - src/utils/temporal.ts | 91 +- src/utils/types.ts | 8 - .../DayView/WorkItemRow/index.tsx | 2 +- src/views/DailyJournal/index.tsx | 1 + src/views/DailyStandup/index.tsx | 1 + src/views/Home/index.tsx | 1 + src/views/Settings/index.tsx | 1 + vite.config.ts | 37 +- 30 files changed, 1051 insertions(+), 1431 deletions(-) rename eslint.config.js => .eslintrc.cjs (85%) create mode 100644 .github/workflows/ci.yml delete mode 100644 src/App/routes/SmartNavigate.tsx delete mode 100644 src/components/DateInput/index.tsx delete mode 100644 src/components/NumberInput/index.tsx delete mode 100644 src/hooks/useFormattedRelativeTime.ts delete mode 100644 src/hooks/useRouting.ts delete mode 100644 src/hooks/useSizeTracking.ts delete mode 100644 src/utils/colors.ts delete mode 100644 src/utils/resolveUrl.ts diff --git a/eslint.config.js b/.eslintrc.cjs similarity index 85% rename from eslint.config.js rename to .eslintrc.cjs index ba66430..b130e4b 100644 --- a/eslint.config.js +++ b/.eslintrc.cjs @@ -1,15 +1,4 @@ -import { FlatCompat } from '@eslint/eslintrc'; -import js from '@eslint/js'; -import process from 'process'; - -const dirname = process.cwd(); - -const compat = new FlatCompat({ - baseDirectory: dirname, - resolvePluginsRelativeTo: dirname, -}); - -const appConfigs = compat.config({ +const config = { env: { node: true, browser: true, @@ -118,17 +107,6 @@ const appConfigs = compat.config({ } } ] -}).map((conf) => ({ - ...conf, - files: ['src/**/*.tsx', 'src/**/*.jsx', 'src/**/*.ts', 'src/**/*.js', 'generated/**/*.ts'], -})); - -const otherConfig = { - files: ['*.js', '*.ts', '*.cjs'], - ...js.configs.recommended, }; -export default [ - ...appConfigs, - otherConfig, -]; +module.exports = config; diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..db70eae --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,135 @@ +name: Lint & Build + +on: + pull_request: + push: + branches: + - 'develop' + +env: + APP_TITLE: ${{ vars.APP_TITLE }} + APP_ENVIRONMENT: ${{ vars.APP_ENVIRONMENT }} + APP_GRAPHQL_CODEGEN_ENDPOINT: ${{ vars.APP_GRAPHQL_CODEGEN_ENDPOINT }} + APP_GRAPHQL_ENDPOINT: ${{ vars.APP_GRAPHQL_ENDPOINT }} + APP_AUTH_URL: ${{ vars.APP_AUTH_URL }} + APP_ADMIN_URL: ${{ vars.APP_ADMIN_URL }} + APP_UMAMI_SRC: ${{ vars.APP_UMAMI_SRC }} + APP_UMAMI_ID: ${{ vars.APP_UMAMI_ID }} + APP_SENTRY_DSN: ${{ vars.APP_SENTRY_DSN }} + GITHUB_WORKFLOW: true + +jobs: + unused: + name: Find unused things + environment: 'test' + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + submodules: true + + - uses: pnpm/action-setup@v4 + name: Install pnpm + + - name: Install Node.js + uses: actions/setup-node@v4 + with: + node-version: 20 + cache: 'pnpm' + + - name: Install dependencies + run: pnpm install + + - name: Run knip + run: pnpm generate:type && pnpm lint:unused + lint-js: + name: Lint JS + environment: 'test' + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + submodules: true + + - uses: pnpm/action-setup@v4 + name: Install pnpm + + - name: Install Node.js + uses: actions/setup-node@v4 + with: + node-version: 20 + cache: 'pnpm' + + - name: Install dependencies + run: pnpm install + + - name: Lint Javascript + run: pnpm generate:type && pnpm lint:js + css-lint: + name: Lint CSS + environment: 'test' + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - uses: pnpm/action-setup@v4 + name: Install pnpm + + - name: Install Node.js + uses: actions/setup-node@v4 + with: + node-version: 20 + cache: 'pnpm' + + - name: Install dependencies + run: pnpm install + + - name: Css Lint + run: pnpm lint:css + typecheck: + name: Typecheck + environment: 'test' + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + submodules: true + + - uses: pnpm/action-setup@v4 + name: Install pnpm + + - name: Install Node.js + uses: actions/setup-node@v4 + with: + node-version: 20 + cache: 'pnpm' + + - name: Install dependencies + run: pnpm install + + - name: Lint Javascript + run: pnpm generate:type && pnpm typecheck + build: + name: Build + environment: 'test' + needs: [lint-js, css-lint, typecheck] + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + submodules: true + + - uses: pnpm/action-setup@v4 + name: Install pnpm + + - name: Install Node.js + uses: actions/setup-node@v4 + with: + node-version: 20 + cache: 'pnpm' + + - name: Install dependencies + run: pnpm install + + - name: Build + run: pnpm generate:type && pnpm build diff --git a/.gitignore b/.gitignore index 9aaadbe..d5bce58 100644 --- a/.gitignore +++ b/.gitignore @@ -10,5 +10,5 @@ pnpm-debug.log* # Custom build/ generated/ +coverage/ stats.html - diff --git a/codegen.ts b/codegen.ts index 67500c7..0e09f41 100644 --- a/codegen.ts +++ b/codegen.ts @@ -9,7 +9,7 @@ const config: CodegenConfig = { ignoreNoDocuments: true, // for better experience with the watcher generates: { './generated/types/': { - preset: 'client' + preset: 'client', } }, config: { diff --git a/env.ts b/env.ts index c426bdc..b8667de 100644 --- a/env.ts +++ b/env.ts @@ -10,4 +10,4 @@ export default defineConfig({ APP_UMAMI_SRC: Schema.string.optional(), APP_UMAMI_ID: Schema.string.optional(), APP_SENTRY_DSN: Schema.string.optional(), -}) +}); diff --git a/knip.json b/knip.json index 40e4fc1..975df57 100644 --- a/knip.json +++ b/knip.json @@ -1,5 +1,20 @@ { "$schema": "https://unpkg.com/knip@5/schema.json", - "entry": ["src/index.tsx!"], - "project": ["src/**/*.tsx!", "src/**/*.ts!"] + "ignoreDependencies": [ + "virtual:pwa-info", + "virtual:pwa-register" + ], + "entry": [ + "src/**/*.test.ts", + "src/**/*.test.tsx", + "generated/**/*.ts", + "src/index.tsx!" + ], + "project": [ + "src/**/*.d.ts", + "src/**/*.test.ts", + "src/**/*.test.tsx", + "src/**/*.tsx!", + "src/**/*.ts!" + ] } diff --git a/package.json b/package.json index ec44f81..9bc127a 100644 --- a/package.json +++ b/package.json @@ -8,13 +8,13 @@ "build": "vite build", "preview": "vite preview", "generate-and-watch:type": "graphql-codegen --require dotenv/config --config codegen.ts --watch", - "generate:type": "graphql-codegen --require dotenv/config --config codegen.ts && eslint --fix generated/", + "generate:type": "graphql-codegen --require dotenv/config --config codegen.ts", "typecheck": "tsc", + "lint": "pnpm lint:js && pnpm lint:css", + "lint:fix": "pnpm lint:js --fix && pnpm lint:css --fix", "lint:js": "eslint src", "lint:css": "stylelint \"./src/**/*.css\"", - "lint": "yarn lint:js && yarn lint:css", - "lint:unused": "knip", - "lint:fix": "yarn lint:js --fix && yarn lint:css --fix", + "lint:unused": "knip --tags=-knipignore", "test": "vitest", "test:coverage": "vitest run --coverage", "postinstall": "patch-package" @@ -40,11 +40,8 @@ "urql": "^4.1.0" }, "devDependencies": { - "@eslint/eslintrc": "^2.0.3", "@graphql-codegen/cli": "^5.0.2", "@graphql-codegen/client-preset": "^4.3.3", - "@graphql-codegen/introspection": "^4.0.3", - "@graphql-codegen/typescript-operations": "^4.2.3", "@graphql-typed-document-node/core": "^3.2.0", "@julr/vite-plugin-validate-env": "^1.0.1", "@types/node": "^20.11.6", @@ -57,27 +54,26 @@ "@vitejs/plugin-react-swc": "^3.5.0", "@vitest/coverage-v8": "^1.2.2", "autoprefixer": "^10.4.14", - "core": "link:@types/dnd-kit/core", + "dotenv": "^16.4.5", "eslint": "^8.40.0", "eslint-config-airbnb": "^19.0.4", "eslint-import-resolver-typescript": "^3.5.5", "eslint-plugin-import": "^2.27.5", - "eslint-plugin-import-exports-imports-resolver": "^1.0.1", "eslint-plugin-import-newlines": "^1.3.4", "eslint-plugin-jsx-a11y": "^6.7.1", "eslint-plugin-react": "^7.32.2", "eslint-plugin-react-hooks": "^4.6.0", "eslint-plugin-react-refresh": "^0.3.4", "eslint-plugin-simple-import-sort": "^10.0.0", - "knip": "^5.27.3", + "graphql": "^16.9.0", + "happy-dom": "^15.7.3", + "knip": "^5.29.2", "patch-package": "^7.0.0", "postcss": "^8.3.0", "postcss-nested": "^6.0.1", "postcss-normalize": "^10.0.1", "postcss-preset-env": "^8.3.2", - "postinstall-postinstall": "^2.1.0", "rollup-plugin-visualizer": "^5.9.0", - "sortable": "link:@types/dnd-kit/sortable", "stylelint": "^16.7.0", "stylelint-config-concentric": "^2.0.2", "stylelint-config-recommended": "^14.0.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 266fc0f..d7a9d1c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -16,7 +16,7 @@ dependencies: version: 8.0.0(@dnd-kit/core@6.1.0)(react@18.2.0) '@replit/codemirror-vim': specifier: ^6.2.1 - version: 6.2.1(@codemirror/commands@6.6.0)(@codemirror/language@6.10.2)(@codemirror/search@6.5.6)(@codemirror/state@6.4.1)(@codemirror/view@6.29.1) + version: 6.2.1(@codemirror/commands@6.6.1)(@codemirror/language@6.10.2)(@codemirror/search@6.5.6)(@codemirror/state@6.4.1)(@codemirror/view@6.33.0) '@sentry/react': specifier: ^8.26.0 version: 8.26.0(react@18.2.0) @@ -25,13 +25,13 @@ dependencies: version: 2.2.0 '@uiw/codemirror-theme-github': specifier: ^4.23.0 - version: 4.23.0(@codemirror/language@6.10.2)(@codemirror/state@6.4.1)(@codemirror/view@6.29.1) + version: 4.23.0(@codemirror/language@6.10.2)(@codemirror/state@6.4.1)(@codemirror/view@6.33.0) '@uiw/react-codemirror': specifier: ^4.23.0 - version: 4.23.0(@babel/runtime@7.24.8)(@codemirror/autocomplete@6.17.0)(@codemirror/language@6.10.2)(@codemirror/lint@6.8.1)(@codemirror/search@6.5.6)(@codemirror/state@6.4.1)(@codemirror/theme-one-dark@6.1.2)(@codemirror/view@6.29.1)(codemirror@6.0.1)(react-dom@18.2.0)(react@18.2.0) + version: 4.23.0(@babel/runtime@7.25.6)(@codemirror/autocomplete@6.18.0)(@codemirror/language@6.10.2)(@codemirror/lint@6.8.1)(@codemirror/search@6.5.6)(@codemirror/state@6.4.1)(@codemirror/theme-one-dark@6.1.2)(@codemirror/view@6.33.0)(codemirror@6.0.1)(react-dom@18.2.0)(react@18.2.0) '@urql/exchange-graphcache': specifier: ^7.1.2 - version: 7.1.2(@urql/core@5.0.5)(graphql@15.9.0) + version: 7.1.2(@urql/core@5.0.6)(graphql@16.9.0) match-sorter: specifier: ^6.3.4 version: 6.3.4 @@ -58,27 +58,18 @@ dependencies: version: 2.4.0 urql: specifier: ^4.1.0 - version: 4.1.0(@urql/core@5.0.5)(react@18.2.0) + version: 4.1.0(@urql/core@5.0.6)(react@18.2.0) devDependencies: - '@eslint/eslintrc': - specifier: ^2.0.3 - version: 2.0.3 '@graphql-codegen/cli': specifier: ^5.0.2 - version: 5.0.2(@types/node@20.11.6)(graphql@15.9.0)(typescript@5.0.4) + version: 5.0.2(@types/node@20.11.6)(graphql@16.9.0)(typescript@5.0.4) '@graphql-codegen/client-preset': specifier: ^4.3.3 - version: 4.3.3(graphql@15.9.0) - '@graphql-codegen/introspection': - specifier: ^4.0.3 - version: 4.0.3(graphql@15.9.0) - '@graphql-codegen/typescript-operations': - specifier: ^4.2.3 - version: 4.2.3(graphql@15.9.0) + version: 4.3.3(graphql@16.9.0) '@graphql-typed-document-node/core': specifier: ^3.2.0 - version: 3.2.0(graphql@15.9.0) + version: 3.2.0(graphql@16.9.0) '@julr/vite-plugin-validate-env': specifier: ^1.0.1 version: 1.0.1(vite@5.0.10)(zod@3.23.8) @@ -112,9 +103,9 @@ devDependencies: autoprefixer: specifier: ^10.4.14 version: 10.4.14(postcss@8.3.0) - core: - specifier: link:@types/dnd-kit/core - version: link:@types/dnd-kit/core + dotenv: + specifier: ^16.4.5 + version: 16.4.5 eslint: specifier: ^8.40.0 version: 8.40.0 @@ -127,9 +118,6 @@ devDependencies: eslint-plugin-import: specifier: ^2.27.5 version: 2.27.5(@typescript-eslint/parser@5.59.5)(eslint-import-resolver-typescript@3.5.5)(eslint@8.40.0) - eslint-plugin-import-exports-imports-resolver: - specifier: ^1.0.1 - version: 1.0.1 eslint-plugin-import-newlines: specifier: ^1.3.4 version: 1.3.4(eslint@8.40.0) @@ -148,9 +136,15 @@ devDependencies: eslint-plugin-simple-import-sort: specifier: ^10.0.0 version: 10.0.0(eslint@8.40.0) + graphql: + specifier: ^16.9.0 + version: 16.9.0 + happy-dom: + specifier: ^15.7.3 + version: 15.7.3 knip: - specifier: ^5.27.3 - version: 5.27.3(@types/node@20.11.6)(typescript@5.0.4) + specifier: ^5.29.2 + version: 5.29.2(@types/node@20.11.6)(typescript@5.0.4) patch-package: specifier: ^7.0.0 version: 7.0.0 @@ -166,15 +160,9 @@ devDependencies: postcss-preset-env: specifier: ^8.3.2 version: 8.3.2(postcss@8.3.0) - postinstall-postinstall: - specifier: ^2.1.0 - version: 2.1.0 rollup-plugin-visualizer: specifier: ^5.9.0 version: 5.9.0(rollup@2.79.1) - sortable: - specifier: link:@types/dnd-kit/sortable - version: link:@types/dnd-kit/sortable stylelint: specifier: ^16.7.0 version: 16.7.0(typescript@5.0.4) @@ -216,14 +204,14 @@ devDependencies: version: 4.2.2(typescript@5.0.4)(vite@5.0.10) vitest: specifier: ^1.2.2 - version: 1.2.2(@types/node@20.11.6) + version: 1.2.2(@types/node@20.11.6)(happy-dom@15.7.3) workbox-window: specifier: ^7.1.0 version: 7.1.0 packages: - /@0no-co/graphql.web@1.0.7(graphql@15.9.0): + /@0no-co/graphql.web@1.0.7(graphql@16.9.0): resolution: {integrity: sha512-E3Qku4mTzdrlwVWGPxklDnME5ANrEGetvYw4i2GCRlppWXXE4QD66j7pwb8HelZwS6LnqEChhrSOGCXpbiu6MQ==} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 @@ -231,7 +219,18 @@ packages: graphql: optional: true dependencies: - graphql: 15.9.0 + graphql: 16.9.0 + dev: false + + /@0no-co/graphql.web@1.0.8(graphql@16.9.0): + resolution: {integrity: sha512-8BG6woLtDMvXB9Ajb/uE+Zr/U7y4qJ3upXi0JQHZmsKUJa7HjF/gFvmL2f3/mSmfZoQGRr9VoY97LCX2uaFMzA==} + peerDependencies: + graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 + peerDependenciesMeta: + graphql: + optional: true + dependencies: + graphql: 16.9.0 dev: false /@ampproject/remapping@2.3.0: @@ -258,24 +257,24 @@ packages: leven: 3.1.0 dev: true - /@ardatan/relay-compiler@12.0.0(graphql@15.9.0): + /@ardatan/relay-compiler@12.0.0(graphql@16.9.0): resolution: {integrity: sha512-9anThAaj1dQr6IGmzBMcfzOQKTa5artjuPmw8NYK/fiGEMjADbSguBY2FMDykt+QhilR3wc9VA/3yVju7JHg7Q==} hasBin: true peerDependencies: graphql: '*' dependencies: - '@babel/core': 7.24.9 - '@babel/generator': 7.25.0 - '@babel/parser': 7.25.3 - '@babel/runtime': 7.24.8 - '@babel/traverse': 7.25.3 - '@babel/types': 7.25.2 - babel-preset-fbjs: 3.4.0(@babel/core@7.24.9) + '@babel/core': 7.25.2 + '@babel/generator': 7.25.6 + '@babel/parser': 7.25.6 + '@babel/runtime': 7.25.6 + '@babel/traverse': 7.25.6 + '@babel/types': 7.25.6 + babel-preset-fbjs: 3.4.0(@babel/core@7.25.2) chalk: 4.1.2 fb-watchman: 2.0.2 fbjs: 3.0.5 glob: 7.2.3 - graphql: 15.9.0 + graphql: 16.9.0 immutable: 3.7.6 invariant: 2.2.4 nullthrows: 1.1.1 @@ -309,8 +308,8 @@ packages: engines: {node: '>=6.9.0'} dev: true - /@babel/compat-data@7.25.2: - resolution: {integrity: sha512-bYcppcpKBvX4znYaPEeFau03bp89ShqNMLs+rmdptMw+heSZh9+z84d2YG+K7cYLbWwzdjtDoW/uqZmPjulClQ==} + /@babel/compat-data@7.25.4: + resolution: {integrity: sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ==} engines: {node: '>=6.9.0'} dev: true @@ -320,16 +319,39 @@ packages: dependencies: '@ampproject/remapping': 2.3.0 '@babel/code-frame': 7.24.7 - '@babel/generator': 7.25.0 + '@babel/generator': 7.25.6 '@babel/helper-compilation-targets': 7.24.8 '@babel/helper-module-transforms': 7.24.9(@babel/core@7.24.9) '@babel/helpers': 7.24.8 - '@babel/parser': 7.25.3 + '@babel/parser': 7.25.6 '@babel/template': 7.25.0 - '@babel/traverse': 7.25.3 - '@babel/types': 7.25.2 + '@babel/traverse': 7.25.6 + '@babel/types': 7.25.6 convert-source-map: 2.0.0 - debug: 4.3.5 + debug: 4.3.7 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/core@7.25.2: + resolution: {integrity: sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==} + engines: {node: '>=6.9.0'} + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.24.7 + '@babel/generator': 7.25.6 + '@babel/helper-compilation-targets': 7.25.2 + '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2) + '@babel/helpers': 7.25.6 + '@babel/parser': 7.25.6 + '@babel/template': 7.25.0 + '@babel/traverse': 7.25.6 + '@babel/types': 7.25.6 + convert-source-map: 2.0.0 + debug: 4.3.7 gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -347,19 +369,29 @@ packages: jsesc: 2.5.2 dev: true + /@babel/generator@7.25.6: + resolution: {integrity: sha512-VPC82gr1seXOpkjAAKoLhP50vx4vGNlF4msF64dSFq1P8RfB+QAuJWGHPXXPc8QyfVWwwB/TNNU4+ayZmHNbZw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.25.6 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 2.5.2 + dev: true + /@babel/helper-annotate-as-pure@7.24.7: resolution: {integrity: sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.25.2 + '@babel/types': 7.25.6 dev: true /@babel/helper-builder-binary-assignment-operator-visitor@7.24.7: resolution: {integrity: sha512-xZeCVVdwb4MsDBkkyZ64tReWYrLRHlMN72vP7Bdm3OUOuyFZExhsHUUnuWnm2/XOlAJzR0LfPpB56WXZn0X/lA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/traverse': 7.25.3 - '@babel/types': 7.25.2 + '@babel/traverse': 7.25.6 + '@babel/types': 7.25.6 transitivePeerDependencies: - supports-color dev: true @@ -379,52 +411,52 @@ packages: resolution: {integrity: sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/compat-data': 7.25.2 + '@babel/compat-data': 7.25.4 '@babel/helper-validator-option': 7.24.8 browserslist: 4.23.3 lru-cache: 5.1.1 semver: 6.3.1 dev: true - /@babel/helper-create-class-features-plugin@7.25.0(@babel/core@7.24.9): - resolution: {integrity: sha512-GYM6BxeQsETc9mnct+nIIpf63SAyzvyYN7UB/IlTyd+MBg06afFGp0mIeUqGyWgS2mxad6vqbMrHVlaL3m70sQ==} + /@babel/helper-create-class-features-plugin@7.25.4(@babel/core@7.25.2): + resolution: {integrity: sha512-ro/bFs3/84MDgDmMwbcHgDa8/E6J3QKNTk4xJJnVeFtGE+tL0K26E3pNxhYz2b67fJpt7Aphw5XcploKXuCvCQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-annotate-as-pure': 7.24.7 '@babel/helper-member-expression-to-functions': 7.24.8 '@babel/helper-optimise-call-expression': 7.24.7 - '@babel/helper-replace-supers': 7.25.0(@babel/core@7.24.9) + '@babel/helper-replace-supers': 7.25.0(@babel/core@7.25.2) '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 - '@babel/traverse': 7.25.3 + '@babel/traverse': 7.25.6 semver: 6.3.1 transitivePeerDependencies: - supports-color dev: true - /@babel/helper-create-regexp-features-plugin@7.25.2(@babel/core@7.24.9): + /@babel/helper-create-regexp-features-plugin@7.25.2(@babel/core@7.25.2): resolution: {integrity: sha512-+wqVGP+DFmqwFD3EH6TMTfUNeqDehV3E/dl+Sd54eaXqm17tEUNbEIn4sVivVowbvUpOtIGxdo3GoXyDH9N/9g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-annotate-as-pure': 7.24.7 regexpu-core: 5.3.2 semver: 6.3.1 dev: true - /@babel/helper-define-polyfill-provider@0.6.2(@babel/core@7.24.9): + /@babel/helper-define-polyfill-provider@0.6.2(@babel/core@7.25.2): resolution: {integrity: sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-compilation-targets': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 - debug: 4.3.5 + debug: 4.3.7 lodash.debounce: 4.0.8 resolve: 1.22.8 transitivePeerDependencies: @@ -435,15 +467,15 @@ packages: resolution: {integrity: sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.25.2 + '@babel/types': 7.25.6 dev: true /@babel/helper-member-expression-to-functions@7.24.8: resolution: {integrity: sha512-LABppdt+Lp/RlBxqrh4qgf1oEH/WxdzQNDJIu5gC/W1GyvPVrOBiItmmM8wan2fm4oYqFuFfkXmlGpLQhPY8CA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/traverse': 7.25.3 - '@babel/types': 7.25.2 + '@babel/traverse': 7.25.6 + '@babel/types': 7.25.6 transitivePeerDependencies: - supports-color dev: true @@ -452,8 +484,8 @@ packages: resolution: {integrity: sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/traverse': 7.25.3 - '@babel/types': 7.25.2 + '@babel/traverse': 7.25.6 + '@babel/types': 7.25.6 transitivePeerDependencies: - supports-color dev: true @@ -474,17 +506,17 @@ packages: - supports-color dev: true - /@babel/helper-module-transforms@7.25.2(@babel/core@7.24.9): + /@babel/helper-module-transforms@7.25.2(@babel/core@7.25.2): resolution: {integrity: sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-module-imports': 7.24.7 '@babel/helper-simple-access': 7.24.7 '@babel/helper-validator-identifier': 7.24.7 - '@babel/traverse': 7.25.3 + '@babel/traverse': 7.25.6 transitivePeerDependencies: - supports-color dev: true @@ -493,7 +525,7 @@ packages: resolution: {integrity: sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.25.2 + '@babel/types': 7.25.6 dev: true /@babel/helper-plugin-utils@7.24.8: @@ -501,30 +533,30 @@ packages: engines: {node: '>=6.9.0'} dev: true - /@babel/helper-remap-async-to-generator@7.25.0(@babel/core@7.24.9): + /@babel/helper-remap-async-to-generator@7.25.0(@babel/core@7.25.2): resolution: {integrity: sha512-NhavI2eWEIz/H9dbrG0TuOicDhNexze43i5z7lEqwYm0WEZVTwnPpA0EafUTP7+6/W79HWIP2cTe3Z5NiSTVpw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-annotate-as-pure': 7.24.7 '@babel/helper-wrap-function': 7.25.0 - '@babel/traverse': 7.25.3 + '@babel/traverse': 7.25.6 transitivePeerDependencies: - supports-color dev: true - /@babel/helper-replace-supers@7.25.0(@babel/core@7.24.9): + /@babel/helper-replace-supers@7.25.0(@babel/core@7.25.2): resolution: {integrity: sha512-q688zIvQVYtZu+i2PsdIu/uWGRpfxzr5WESsfpShfZECkO+d2o+WROWezCi/Q6kJ0tfPa5+pUGUlfx2HhrA3Bg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-member-expression-to-functions': 7.24.8 '@babel/helper-optimise-call-expression': 7.24.7 - '@babel/traverse': 7.25.3 + '@babel/traverse': 7.25.6 transitivePeerDependencies: - supports-color dev: true @@ -533,8 +565,8 @@ packages: resolution: {integrity: sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/traverse': 7.25.3 - '@babel/types': 7.25.2 + '@babel/traverse': 7.25.6 + '@babel/types': 7.25.6 transitivePeerDependencies: - supports-color dev: true @@ -543,8 +575,8 @@ packages: resolution: {integrity: sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/traverse': 7.25.3 - '@babel/types': 7.25.2 + '@babel/traverse': 7.25.6 + '@babel/types': 7.25.6 transitivePeerDependencies: - supports-color dev: true @@ -553,7 +585,7 @@ packages: resolution: {integrity: sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.25.2 + '@babel/types': 7.25.6 dev: true /@babel/helper-string-parser@7.24.8: @@ -576,8 +608,8 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/template': 7.25.0 - '@babel/traverse': 7.25.3 - '@babel/types': 7.25.2 + '@babel/traverse': 7.25.6 + '@babel/types': 7.25.6 transitivePeerDependencies: - supports-color dev: true @@ -587,7 +619,15 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/template': 7.25.0 - '@babel/types': 7.25.2 + '@babel/types': 7.25.6 + dev: true + + /@babel/helpers@7.25.6: + resolution: {integrity: sha512-Xg0tn4HcfTijTwfDwYlvVCl43V6h4KyVVX2aEm4qdO/PC6L2YvzLHFdmxhoeSA3eslcE6+ZVXHgWwopXYLNq4Q==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.25.0 + '@babel/types': 7.25.6 dev: true /@babel/highlight@7.24.7: @@ -605,160 +645,168 @@ packages: engines: {node: '>=6.0.0'} hasBin: true dependencies: - '@babel/types': 7.25.2 + '@babel/types': 7.25.6 + dev: true + + /@babel/parser@7.25.6: + resolution: {integrity: sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.25.6 dev: true - /@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.3(@babel/core@7.24.9): + /@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.3(@babel/core@7.25.2): resolution: {integrity: sha512-wUrcsxZg6rqBXG05HG1FPYgsP6EvwF4WpBbxIpWIIYnH8wG0gzx3yZY3dtEHas4sTAOGkbTsc9EGPxwff8lRoA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 - '@babel/traverse': 7.25.3 + '@babel/traverse': 7.25.6 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-bugfix-safari-class-field-initializer-scope@7.25.0(@babel/core@7.24.9): + /@babel/plugin-bugfix-safari-class-field-initializer-scope@7.25.0(@babel/core@7.25.2): resolution: {integrity: sha512-Bm4bH2qsX880b/3ziJ8KD711LT7z4u8CFudmjqle65AZj/HNUFhEf90dqYv6O86buWvSBmeQDjv0Tn2aF/bIBA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.25.0(@babel/core@7.24.9): + /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.25.0(@babel/core@7.25.2): resolution: {integrity: sha512-lXwdNZtTmeVOOFtwM/WDe7yg1PL8sYhRk/XH0FzbR2HDQ0xC+EnQ/JHeoMYSavtU115tnUk0q9CDyq8si+LMAA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.24.7(@babel/core@7.24.9): + /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.24.7(@babel/core@7.25.2): resolution: {integrity: sha512-+izXIbke1T33mY4MSNnrqhPXDz01WYhEf3yF5NbnUtkiNnm+XBZJl3kNfoK6NKmYlz/D07+l2GWVK/QfDkNCuQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.13.0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 - '@babel/plugin-transform-optional-chaining': 7.24.8(@babel/core@7.24.9) + '@babel/plugin-transform-optional-chaining': 7.24.8(@babel/core@7.25.2) transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.25.0(@babel/core@7.24.9): + /@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.25.0(@babel/core@7.25.2): resolution: {integrity: sha512-tggFrk1AIShG/RUQbEwt2Tr/E+ObkfwrPjR6BjbRvsx24+PSjK8zrq0GWPNCjo8qpRx4DuJzlcvWJqlm+0h3kw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 - '@babel/traverse': 7.25.3 + '@babel/traverse': 7.25.6 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.24.9): + /@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.25.2): resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==} engines: {node: '>=6.9.0'} deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead. peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 - '@babel/helper-create-class-features-plugin': 7.25.0(@babel/core@7.24.9) + '@babel/core': 7.25.2 + '@babel/helper-create-class-features-plugin': 7.25.4(@babel/core@7.25.2) '@babel/helper-plugin-utils': 7.24.8 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-proposal-object-rest-spread@7.20.7(@babel/core@7.24.9): + /@babel/plugin-proposal-object-rest-spread@7.20.7(@babel/core@7.25.2): resolution: {integrity: sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==} engines: {node: '>=6.9.0'} deprecated: This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-object-rest-spread instead. peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/compat-data': 7.25.2 - '@babel/core': 7.24.9 + '@babel/compat-data': 7.25.4 + '@babel/core': 7.25.2 '@babel/helper-compilation-targets': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.9) - '@babel/plugin-transform-parameters': 7.24.7(@babel/core@7.24.9) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-transform-parameters': 7.24.7(@babel/core@7.25.2) dev: true - /@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.24.9): + /@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.25.2): resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 dev: true - /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.24.9): + /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.25.2): resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.24.9): + /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.25.2): resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.24.9): + /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.25.2): resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.24.9): + /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.25.2): resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.24.9): + /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.25.2): resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-syntax-flow@7.24.7(@babel/core@7.24.9): + /@babel/plugin-syntax-flow@7.24.7(@babel/core@7.25.2): resolution: {integrity: sha512-9G8GYT/dxn/D1IIKOUBmGX0mnmj46mGH9NnZyJLwtCpgh5f7D2VbuKodb+2s9m1Yavh1s7ASQN8lf0eqrb1LTw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 dev: true @@ -772,842 +820,852 @@ packages: '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-syntax-import-attributes@7.24.7(@babel/core@7.24.9): - resolution: {integrity: sha512-hbX+lKKeUMGihnK8nvKqmXBInriT3GVjzXKFriV3YC6APGxMbP8RZNFwy91+hocLXq90Mta+HshoB31802bb8A==} + /@babel/plugin-syntax-import-assertions@7.25.6(@babel/core@7.25.2): + resolution: {integrity: sha512-aABl0jHw9bZ2karQ/uUD6XP4u0SG22SJrOHFoL6XB1R7dTovOP4TzTlsxOYC5yQ1pdscVK2JTUnF6QL3ARoAiQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.24.9): + /@babel/plugin-syntax-import-attributes@7.25.6(@babel/core@7.25.2): + resolution: {integrity: sha512-sXaDXaJN9SNLymBdlWFA+bjzBhFD617ZaFiY13dGt7TVslVvVgA6fkZOP7Ki3IGElC45lwHdOTrCtKZGVAWeLQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.25.2 + '@babel/helper-plugin-utils': 7.24.8 + dev: true + + /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.25.2): resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.24.9): + /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.25.2): resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-syntax-jsx@7.24.7(@babel/core@7.24.9): + /@babel/plugin-syntax-jsx@7.24.7(@babel/core@7.25.2): resolution: {integrity: sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.24.9): + /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.25.2): resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.24.9): + /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.25.2): resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.24.9): + /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.25.2): resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.24.9): + /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.25.2): resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.24.9): + /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.25.2): resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.24.9): + /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.25.2): resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.24.9): + /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.25.2): resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.24.9): + /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.25.2): resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.24.9): + /@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.25.2): resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.9 - '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.24.9) + '@babel/core': 7.25.2 + '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.25.2) '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-transform-arrow-functions@7.24.7(@babel/core@7.24.9): + /@babel/plugin-transform-arrow-functions@7.24.7(@babel/core@7.25.2): resolution: {integrity: sha512-Dt9LQs6iEY++gXUwY03DNFat5C2NbO48jj+j/bSAz6b3HgPs39qcPiYt77fDObIcFwj3/C2ICX9YMwGflUoSHQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-transform-async-generator-functions@7.25.0(@babel/core@7.24.9): - resolution: {integrity: sha512-uaIi2FdqzjpAMvVqvB51S42oC2JEVgh0LDsGfZVDysWE8LrJtQC2jvKmOqEYThKyB7bDEb7BP1GYWDm7tABA0Q==} + /@babel/plugin-transform-async-generator-functions@7.25.4(@babel/core@7.25.2): + resolution: {integrity: sha512-jz8cV2XDDTqjKPwVPJBIjORVEmSGYhdRa8e5k5+vN+uwcjSrSxUaebBRa4ko1jqNF2uxyg8G6XYk30Jv285xzg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 - '@babel/helper-remap-async-to-generator': 7.25.0(@babel/core@7.24.9) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.9) - '@babel/traverse': 7.25.3 + '@babel/helper-remap-async-to-generator': 7.25.0(@babel/core@7.25.2) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.25.2) + '@babel/traverse': 7.25.6 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-transform-async-to-generator@7.24.7(@babel/core@7.24.9): + /@babel/plugin-transform-async-to-generator@7.24.7(@babel/core@7.25.2): resolution: {integrity: sha512-SQY01PcJfmQ+4Ash7NE+rpbLFbmqA2GPIgqzxfFTL4t1FKRq4zTms/7htKpoCUI9OcFYgzqfmCdH53s6/jn5fA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-module-imports': 7.24.7 '@babel/helper-plugin-utils': 7.24.8 - '@babel/helper-remap-async-to-generator': 7.25.0(@babel/core@7.24.9) + '@babel/helper-remap-async-to-generator': 7.25.0(@babel/core@7.25.2) transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-transform-block-scoped-functions@7.24.7(@babel/core@7.24.9): + /@babel/plugin-transform-block-scoped-functions@7.24.7(@babel/core@7.25.2): resolution: {integrity: sha512-yO7RAz6EsVQDaBH18IDJcMB1HnrUn2FJ/Jslc/WtPPWcjhpUJXU/rjbwmluzp7v/ZzWcEhTMXELnnsz8djWDwQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-transform-block-scoping@7.25.0(@babel/core@7.24.9): + /@babel/plugin-transform-block-scoping@7.25.0(@babel/core@7.25.2): resolution: {integrity: sha512-yBQjYoOjXlFv9nlXb3f1casSHOZkWr29NX+zChVanLg5Nc157CrbEX9D7hxxtTpuFy7Q0YzmmWfJxzvps4kXrQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-transform-class-properties@7.24.7(@babel/core@7.24.9): - resolution: {integrity: sha512-vKbfawVYayKcSeSR5YYzzyXvsDFWU2mD8U5TFeXtbCPLFUqe7GyCgvO6XDHzje862ODrOwy6WCPmKeWHbCFJ4w==} + /@babel/plugin-transform-class-properties@7.25.4(@babel/core@7.25.2): + resolution: {integrity: sha512-nZeZHyCWPfjkdU5pA/uHiTaDAFUEqkpzf1YoQT2NeSynCGYq9rxfyI3XpQbfx/a0hSnFH6TGlEXvae5Vi7GD8g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 - '@babel/helper-create-class-features-plugin': 7.25.0(@babel/core@7.24.9) + '@babel/core': 7.25.2 + '@babel/helper-create-class-features-plugin': 7.25.4(@babel/core@7.25.2) '@babel/helper-plugin-utils': 7.24.8 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-transform-class-static-block@7.24.7(@babel/core@7.24.9): + /@babel/plugin-transform-class-static-block@7.24.7(@babel/core@7.25.2): resolution: {integrity: sha512-HMXK3WbBPpZQufbMG4B46A90PkuuhN9vBCb5T8+VAHqvAqvcLi+2cKoukcpmUYkszLhScU3l1iudhrks3DggRQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.12.0 dependencies: - '@babel/core': 7.24.9 - '@babel/helper-create-class-features-plugin': 7.25.0(@babel/core@7.24.9) + '@babel/core': 7.25.2 + '@babel/helper-create-class-features-plugin': 7.25.4(@babel/core@7.25.2) '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.24.9) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.25.2) transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-transform-classes@7.25.0(@babel/core@7.24.9): - resolution: {integrity: sha512-xyi6qjr/fYU304fiRwFbekzkqVJZ6A7hOjWZd+89FVcBqPV3S9Wuozz82xdpLspckeaafntbzglaW4pqpzvtSw==} + /@babel/plugin-transform-classes@7.25.4(@babel/core@7.25.2): + resolution: {integrity: sha512-oexUfaQle2pF/b6E0dwsxQtAol9TLSO88kQvym6HHBWFliV2lGdrPieX+WgMRLSJDVzdYywk7jXbLPuO2KLTLg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-annotate-as-pure': 7.24.7 '@babel/helper-compilation-targets': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 - '@babel/helper-replace-supers': 7.25.0(@babel/core@7.24.9) - '@babel/traverse': 7.25.3 + '@babel/helper-replace-supers': 7.25.0(@babel/core@7.25.2) + '@babel/traverse': 7.25.6 globals: 11.12.0 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-transform-computed-properties@7.24.7(@babel/core@7.24.9): + /@babel/plugin-transform-computed-properties@7.24.7(@babel/core@7.25.2): resolution: {integrity: sha512-25cS7v+707Gu6Ds2oY6tCkUwsJ9YIDbggd9+cu9jzzDgiNq7hR/8dkzxWfKWnTic26vsI3EsCXNd4iEB6e8esQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 '@babel/template': 7.25.0 dev: true - /@babel/plugin-transform-destructuring@7.24.8(@babel/core@7.24.9): + /@babel/plugin-transform-destructuring@7.24.8(@babel/core@7.25.2): resolution: {integrity: sha512-36e87mfY8TnRxc7yc6M9g9gOB7rKgSahqkIKwLpz4Ppk2+zC2Cy1is0uwtuSG6AE4zlTOUa+7JGz9jCJGLqQFQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-transform-dotall-regex@7.24.7(@babel/core@7.24.9): + /@babel/plugin-transform-dotall-regex@7.24.7(@babel/core@7.25.2): resolution: {integrity: sha512-ZOA3W+1RRTSWvyqcMJDLqbchh7U4NRGqwRfFSVbOLS/ePIP4vHB5e8T8eXcuqyN1QkgKyj5wuW0lcS85v4CrSw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 - '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.24.9) + '@babel/core': 7.25.2 + '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.25.2) '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-transform-duplicate-keys@7.24.7(@babel/core@7.24.9): + /@babel/plugin-transform-duplicate-keys@7.24.7(@babel/core@7.25.2): resolution: {integrity: sha512-JdYfXyCRihAe46jUIliuL2/s0x0wObgwwiGxw/UbgJBr20gQBThrokO4nYKgWkD7uBaqM7+9x5TU7NkExZJyzw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.25.0(@babel/core@7.24.9): + /@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.25.0(@babel/core@7.25.2): resolution: {integrity: sha512-YLpb4LlYSc3sCUa35un84poXoraOiQucUTTu8X1j18JV+gNa8E0nyUf/CjZ171IRGr4jEguF+vzJU66QZhn29g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.9 - '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.24.9) + '@babel/core': 7.25.2 + '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.25.2) '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-transform-dynamic-import@7.24.7(@babel/core@7.24.9): + /@babel/plugin-transform-dynamic-import@7.24.7(@babel/core@7.25.2): resolution: {integrity: sha512-sc3X26PhZQDb3JhORmakcbvkeInvxz+A8oda99lj7J60QRuPZvNAk9wQlTBS1ZynelDrDmTU4pw1tyc5d5ZMUg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.24.9) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.25.2) dev: true - /@babel/plugin-transform-exponentiation-operator@7.24.7(@babel/core@7.24.9): + /@babel/plugin-transform-exponentiation-operator@7.24.7(@babel/core@7.25.2): resolution: {integrity: sha512-Rqe/vSc9OYgDajNIK35u7ot+KeCoetqQYFXM4Epf7M7ez3lWlOjrDjrwMei6caCVhfdw+mIKD4cgdGNy5JQotQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-builder-binary-assignment-operator-visitor': 7.24.7 '@babel/helper-plugin-utils': 7.24.8 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-transform-export-namespace-from@7.24.7(@babel/core@7.24.9): + /@babel/plugin-transform-export-namespace-from@7.24.7(@babel/core@7.25.2): resolution: {integrity: sha512-v0K9uNYsPL3oXZ/7F9NNIbAj2jv1whUEtyA6aujhekLs56R++JDQuzRcP2/z4WX5Vg/c5lE9uWZA0/iUoFhLTA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.24.9) + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.25.2) dev: true - /@babel/plugin-transform-flow-strip-types@7.25.2(@babel/core@7.24.9): + /@babel/plugin-transform-flow-strip-types@7.25.2(@babel/core@7.25.2): resolution: {integrity: sha512-InBZ0O8tew5V0K6cHcQ+wgxlrjOw1W4wDXLkOTjLRD8GYhTSkxTVBtdy3MMtvYBrbAWa1Qm3hNoTc1620Yj+Mg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-flow': 7.24.7(@babel/core@7.24.9) + '@babel/plugin-syntax-flow': 7.24.7(@babel/core@7.25.2) dev: true - /@babel/plugin-transform-for-of@7.24.7(@babel/core@7.24.9): + /@babel/plugin-transform-for-of@7.24.7(@babel/core@7.25.2): resolution: {integrity: sha512-wo9ogrDG1ITTTBsy46oGiN1dS9A7MROBTcYsfS8DtsImMkHk9JXJ3EWQM6X2SUw4x80uGPlwj0o00Uoc6nEE3g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-transform-function-name@7.25.1(@babel/core@7.24.9): + /@babel/plugin-transform-function-name@7.25.1(@babel/core@7.25.2): resolution: {integrity: sha512-TVVJVdW9RKMNgJJlLtHsKDTydjZAbwIsn6ySBPQaEAUU5+gVvlJt/9nRmqVbsV/IBanRjzWoaAQKLoamWVOUuA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-compilation-targets': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 - '@babel/traverse': 7.25.3 + '@babel/traverse': 7.25.6 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-transform-json-strings@7.24.7(@babel/core@7.24.9): + /@babel/plugin-transform-json-strings@7.24.7(@babel/core@7.25.2): resolution: {integrity: sha512-2yFnBGDvRuxAaE/f0vfBKvtnvvqU8tGpMHqMNpTN2oWMKIR3NqFkjaAgGwawhqK/pIN2T3XdjGPdaG0vDhOBGw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.9) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.25.2) dev: true - /@babel/plugin-transform-literals@7.25.2(@babel/core@7.24.9): + /@babel/plugin-transform-literals@7.25.2(@babel/core@7.25.2): resolution: {integrity: sha512-HQI+HcTbm9ur3Z2DkO+jgESMAMcYLuN/A7NRw9juzxAezN9AvqvUTnpKP/9kkYANz6u7dFlAyOu44ejuGySlfw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-transform-logical-assignment-operators@7.24.7(@babel/core@7.24.9): + /@babel/plugin-transform-logical-assignment-operators@7.24.7(@babel/core@7.25.2): resolution: {integrity: sha512-4D2tpwlQ1odXmTEIFWy9ELJcZHqrStlzK/dAOWYyxX3zT0iXQB6banjgeOJQXzEc4S0E0a5A+hahxPaEFYftsw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.9) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.25.2) dev: true - /@babel/plugin-transform-member-expression-literals@7.24.7(@babel/core@7.24.9): + /@babel/plugin-transform-member-expression-literals@7.24.7(@babel/core@7.25.2): resolution: {integrity: sha512-T/hRC1uqrzXMKLQ6UCwMT85S3EvqaBXDGf0FaMf4446Qx9vKwlghvee0+uuZcDUCZU5RuNi4781UQ7R308zzBw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-transform-modules-amd@7.24.7(@babel/core@7.24.9): + /@babel/plugin-transform-modules-amd@7.24.7(@babel/core@7.25.2): resolution: {integrity: sha512-9+pB1qxV3vs/8Hdmz/CulFB8w2tuu6EB94JZFsjdqxQokwGa9Unap7Bo2gGBGIvPmDIVvQrom7r5m/TCDMURhg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 - '@babel/helper-module-transforms': 7.25.2(@babel/core@7.24.9) + '@babel/core': 7.25.2 + '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2) '@babel/helper-plugin-utils': 7.24.8 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-transform-modules-commonjs@7.24.8(@babel/core@7.24.9): + /@babel/plugin-transform-modules-commonjs@7.24.8(@babel/core@7.25.2): resolution: {integrity: sha512-WHsk9H8XxRs3JXKWFiqtQebdh9b/pTk4EgueygFzYlTKAg0Ud985mSevdNjdXdFBATSKVJGQXP1tv6aGbssLKA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 - '@babel/helper-module-transforms': 7.25.2(@babel/core@7.24.9) + '@babel/core': 7.25.2 + '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2) '@babel/helper-plugin-utils': 7.24.8 '@babel/helper-simple-access': 7.24.7 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-transform-modules-systemjs@7.25.0(@babel/core@7.24.9): + /@babel/plugin-transform-modules-systemjs@7.25.0(@babel/core@7.25.2): resolution: {integrity: sha512-YPJfjQPDXxyQWg/0+jHKj1llnY5f/R6a0p/vP4lPymxLu7Lvl4k2WMitqi08yxwQcCVUUdG9LCUj4TNEgAp3Jw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 - '@babel/helper-module-transforms': 7.25.2(@babel/core@7.24.9) + '@babel/core': 7.25.2 + '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2) '@babel/helper-plugin-utils': 7.24.8 '@babel/helper-validator-identifier': 7.24.7 - '@babel/traverse': 7.25.3 + '@babel/traverse': 7.25.6 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-transform-modules-umd@7.24.7(@babel/core@7.24.9): + /@babel/plugin-transform-modules-umd@7.24.7(@babel/core@7.25.2): resolution: {integrity: sha512-3aytQvqJ/h9z4g8AsKPLvD4Zqi2qT+L3j7XoFFu1XBlZWEl2/1kWnhmAbxpLgPrHSY0M6UA02jyTiwUVtiKR6A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 - '@babel/helper-module-transforms': 7.25.2(@babel/core@7.24.9) + '@babel/core': 7.25.2 + '@babel/helper-module-transforms': 7.25.2(@babel/core@7.25.2) '@babel/helper-plugin-utils': 7.24.8 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-transform-named-capturing-groups-regex@7.24.7(@babel/core@7.24.9): + /@babel/plugin-transform-named-capturing-groups-regex@7.24.7(@babel/core@7.25.2): resolution: {integrity: sha512-/jr7h/EWeJtk1U/uz2jlsCioHkZk1JJZVcc8oQsJ1dUlaJD83f4/6Zeh2aHt9BIFokHIsSeDfhUmju0+1GPd6g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.9 - '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.24.9) + '@babel/core': 7.25.2 + '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.25.2) '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-transform-new-target@7.24.7(@babel/core@7.24.9): + /@babel/plugin-transform-new-target@7.24.7(@babel/core@7.25.2): resolution: {integrity: sha512-RNKwfRIXg4Ls/8mMTza5oPF5RkOW8Wy/WgMAp1/F1yZ8mMbtwXW+HDoJiOsagWrAhI5f57Vncrmr9XeT4CVapA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-transform-nullish-coalescing-operator@7.24.7(@babel/core@7.24.9): + /@babel/plugin-transform-nullish-coalescing-operator@7.24.7(@babel/core@7.25.2): resolution: {integrity: sha512-Ts7xQVk1OEocqzm8rHMXHlxvsfZ0cEF2yomUqpKENHWMF4zKk175Y4q8H5knJes6PgYad50uuRmt3UJuhBw8pQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.9) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.25.2) dev: true - /@babel/plugin-transform-numeric-separator@7.24.7(@babel/core@7.24.9): + /@babel/plugin-transform-numeric-separator@7.24.7(@babel/core@7.25.2): resolution: {integrity: sha512-e6q1TiVUzvH9KRvicuxdBTUj4AdKSRwzIyFFnfnezpCfP2/7Qmbb8qbU2j7GODbl4JMkblitCQjKYUaX/qkkwA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.9) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.25.2) dev: true - /@babel/plugin-transform-object-rest-spread@7.24.7(@babel/core@7.24.9): + /@babel/plugin-transform-object-rest-spread@7.24.7(@babel/core@7.25.2): resolution: {integrity: sha512-4QrHAr0aXQCEFni2q4DqKLD31n2DL+RxcwnNjDFkSG0eNQ/xCavnRkfCUjsyqGC2OviNJvZOF/mQqZBw7i2C5Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-compilation-targets': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.9) - '@babel/plugin-transform-parameters': 7.24.7(@babel/core@7.24.9) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-transform-parameters': 7.24.7(@babel/core@7.25.2) dev: true - /@babel/plugin-transform-object-super@7.24.7(@babel/core@7.24.9): + /@babel/plugin-transform-object-super@7.24.7(@babel/core@7.25.2): resolution: {integrity: sha512-A/vVLwN6lBrMFmMDmPPz0jnE6ZGx7Jq7d6sT/Ev4H65RER6pZ+kczlf1DthF5N0qaPHBsI7UXiE8Zy66nmAovg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 - '@babel/helper-replace-supers': 7.25.0(@babel/core@7.24.9) + '@babel/helper-replace-supers': 7.25.0(@babel/core@7.25.2) transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-transform-optional-catch-binding@7.24.7(@babel/core@7.24.9): + /@babel/plugin-transform-optional-catch-binding@7.24.7(@babel/core@7.25.2): resolution: {integrity: sha512-uLEndKqP5BfBbC/5jTwPxLh9kqPWWgzN/f8w6UwAIirAEqiIVJWWY312X72Eub09g5KF9+Zn7+hT7sDxmhRuKA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.9) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.25.2) dev: true - /@babel/plugin-transform-optional-chaining@7.24.8(@babel/core@7.24.9): + /@babel/plugin-transform-optional-chaining@7.24.8(@babel/core@7.25.2): resolution: {integrity: sha512-5cTOLSMs9eypEy8JUVvIKOu6NgvbJMnpG62VpIHrTmROdQ+L5mDAaI40g25k5vXti55JWNX5jCkq3HZxXBQANw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.9) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.25.2) transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-transform-parameters@7.24.7(@babel/core@7.24.9): + /@babel/plugin-transform-parameters@7.24.7(@babel/core@7.25.2): resolution: {integrity: sha512-yGWW5Rr+sQOhK0Ot8hjDJuxU3XLRQGflvT4lhlSY0DFvdb3TwKaY26CJzHtYllU0vT9j58hc37ndFPsqT1SrzA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-transform-private-methods@7.24.7(@babel/core@7.24.9): - resolution: {integrity: sha512-COTCOkG2hn4JKGEKBADkA8WNb35TGkkRbI5iT845dB+NyqgO8Hn+ajPbSnIQznneJTa3d30scb6iz/DhH8GsJQ==} + /@babel/plugin-transform-private-methods@7.25.4(@babel/core@7.25.2): + resolution: {integrity: sha512-ao8BG7E2b/URaUQGqN3Tlsg+M3KlHY6rJ1O1gXAEUnZoyNQnvKyH87Kfg+FoxSeyWUB8ISZZsC91C44ZuBFytw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 - '@babel/helper-create-class-features-plugin': 7.25.0(@babel/core@7.24.9) + '@babel/core': 7.25.2 + '@babel/helper-create-class-features-plugin': 7.25.4(@babel/core@7.25.2) '@babel/helper-plugin-utils': 7.24.8 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-transform-private-property-in-object@7.24.7(@babel/core@7.24.9): + /@babel/plugin-transform-private-property-in-object@7.24.7(@babel/core@7.25.2): resolution: {integrity: sha512-9z76mxwnwFxMyxZWEgdgECQglF2Q7cFLm0kMf8pGwt+GSJsY0cONKj/UuO4bOH0w/uAel3ekS4ra5CEAyJRmDA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-annotate-as-pure': 7.24.7 - '@babel/helper-create-class-features-plugin': 7.25.0(@babel/core@7.24.9) + '@babel/helper-create-class-features-plugin': 7.25.4(@babel/core@7.25.2) '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.24.9) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.25.2) transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-transform-property-literals@7.24.7(@babel/core@7.24.9): + /@babel/plugin-transform-property-literals@7.24.7(@babel/core@7.25.2): resolution: {integrity: sha512-EMi4MLQSHfd2nrCqQEWxFdha2gBCqU4ZcCng4WBGZ5CJL4bBRW0ptdqqDdeirGZcpALazVVNJqRmsO8/+oNCBA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-transform-react-display-name@7.24.7(@babel/core@7.24.9): + /@babel/plugin-transform-react-display-name@7.24.7(@babel/core@7.25.2): resolution: {integrity: sha512-H/Snz9PFxKsS1JLI4dJLtnJgCJRoo0AUm3chP6NYr+9En1JMKloheEiLIhlp5MDVznWo+H3AAC1Mc8lmUEpsgg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-transform-react-jsx@7.25.2(@babel/core@7.24.9): + /@babel/plugin-transform-react-jsx@7.25.2(@babel/core@7.25.2): resolution: {integrity: sha512-KQsqEAVBpU82NM/B/N9j9WOdphom1SZH3R+2V7INrQUH+V9EBFwZsEJl8eBIVeQE62FxJCc70jzEZwqU7RcVqA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-annotate-as-pure': 7.24.7 '@babel/helper-module-imports': 7.24.7 '@babel/helper-plugin-utils': 7.24.8 - '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.24.9) - '@babel/types': 7.25.2 + '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.25.2) + '@babel/types': 7.25.6 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-transform-regenerator@7.24.7(@babel/core@7.24.9): + /@babel/plugin-transform-regenerator@7.24.7(@babel/core@7.25.2): resolution: {integrity: sha512-lq3fvXPdimDrlg6LWBoqj+r/DEWgONuwjuOuQCSYgRroXDH/IdM1C0IZf59fL5cHLpjEH/O6opIRBbqv7ELnuA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 regenerator-transform: 0.15.2 dev: true - /@babel/plugin-transform-reserved-words@7.24.7(@babel/core@7.24.9): + /@babel/plugin-transform-reserved-words@7.24.7(@babel/core@7.25.2): resolution: {integrity: sha512-0DUq0pHcPKbjFZCfTss/pGkYMfy3vFWydkUBd9r0GHpIyfs2eCDENvqadMycRS9wZCXR41wucAfJHJmwA0UmoQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-transform-shorthand-properties@7.24.7(@babel/core@7.24.9): + /@babel/plugin-transform-shorthand-properties@7.24.7(@babel/core@7.25.2): resolution: {integrity: sha512-KsDsevZMDsigzbA09+vacnLpmPH4aWjcZjXdyFKGzpplxhbeB4wYtury3vglQkg6KM/xEPKt73eCjPPf1PgXBA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-transform-spread@7.24.7(@babel/core@7.24.9): + /@babel/plugin-transform-spread@7.24.7(@babel/core@7.25.2): resolution: {integrity: sha512-x96oO0I09dgMDxJaANcRyD4ellXFLLiWhuwDxKZX5g2rWP1bTPkBSwCYv96VDXVT1bD9aPj8tppr5ITIh8hBng==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 '@babel/helper-skip-transparent-expression-wrappers': 7.24.7 transitivePeerDependencies: - supports-color dev: true - /@babel/plugin-transform-sticky-regex@7.24.7(@babel/core@7.24.9): + /@babel/plugin-transform-sticky-regex@7.24.7(@babel/core@7.25.2): resolution: {integrity: sha512-kHPSIJc9v24zEml5geKg9Mjx5ULpfncj0wRpYtxbvKyTtHCYDkVE3aHQ03FrpEo4gEe2vrJJS1Y9CJTaThA52g==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-transform-template-literals@7.24.7(@babel/core@7.24.9): + /@babel/plugin-transform-template-literals@7.24.7(@babel/core@7.25.2): resolution: {integrity: sha512-AfDTQmClklHCOLxtGoP7HkeMw56k1/bTQjwsfhL6pppo/M4TOBSq+jjBUBLmV/4oeFg4GWMavIl44ZeCtmmZTw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-transform-typeof-symbol@7.24.8(@babel/core@7.24.9): + /@babel/plugin-transform-typeof-symbol@7.24.8(@babel/core@7.25.2): resolution: {integrity: sha512-adNTUpDCVnmAE58VEqKlAA6ZBlNkMnWD0ZcW76lyNFN3MJniyGFZfNwERVk8Ap56MCnXztmDr19T4mPTztcuaw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-transform-unicode-escapes@7.24.7(@babel/core@7.24.9): + /@babel/plugin-transform-unicode-escapes@7.24.7(@babel/core@7.25.2): resolution: {integrity: sha512-U3ap1gm5+4edc2Q/P+9VrBNhGkfnf+8ZqppY71Bo/pzZmXhhLdqgaUl6cuB07O1+AQJtCLfaOmswiNbSQ9ivhw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-transform-unicode-property-regex@7.24.7(@babel/core@7.24.9): + /@babel/plugin-transform-unicode-property-regex@7.24.7(@babel/core@7.25.2): resolution: {integrity: sha512-uH2O4OV5M9FZYQrwc7NdVmMxQJOCCzFeYudlZSzUAHRFeOujQefa92E74TQDVskNHCzOXoigEuoyzHDhaEaK5w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 - '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.24.9) + '@babel/core': 7.25.2 + '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.25.2) '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-transform-unicode-regex@7.24.7(@babel/core@7.24.9): + /@babel/plugin-transform-unicode-regex@7.24.7(@babel/core@7.25.2): resolution: {integrity: sha512-hlQ96MBZSAXUq7ltkjtu3FJCCSMx/j629ns3hA3pXnBXjanNP0LHi+JpPeA81zaWgVK1VGH95Xuy7u0RyQ8kMg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.9 - '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.24.9) + '@babel/core': 7.25.2 + '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.25.2) '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/plugin-transform-unicode-sets-regex@7.24.7(@babel/core@7.24.9): - resolution: {integrity: sha512-2G8aAvF4wy1w/AGZkemprdGMRg5o6zPNhbHVImRz3lss55TYCBd6xStN19rt8XJHq20sqV0JbyWjOWwQRwV/wg==} + /@babel/plugin-transform-unicode-sets-regex@7.25.4(@babel/core@7.25.2): + resolution: {integrity: sha512-qesBxiWkgN1Q+31xUE9RcMk79eOXXDCv6tfyGMRSs4RGlioSg2WVyQAm07k726cSE56pa+Kb0y9epX2qaXzTvA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.9 - '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.24.9) + '@babel/core': 7.25.2 + '@babel/helper-create-regexp-features-plugin': 7.25.2(@babel/core@7.25.2) '@babel/helper-plugin-utils': 7.24.8 dev: true - /@babel/preset-env@7.25.3(@babel/core@7.24.9): - resolution: {integrity: sha512-QsYW7UeAaXvLPX9tdVliMJE7MD7M6MLYVTovRTIwhoYQVFHR1rM4wO8wqAezYi3/BpSD+NzVCZ69R6smWiIi8g==} + /@babel/preset-env@7.25.4(@babel/core@7.25.2): + resolution: {integrity: sha512-W9Gyo+KmcxjGahtt3t9fb14vFRWvPpu5pT6GBlovAK6BTBcxgjfVMSQCfJl4oi35ODrxP6xx2Wr8LNST57Mraw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/compat-data': 7.25.2 - '@babel/core': 7.24.9 + '@babel/compat-data': 7.25.4 + '@babel/core': 7.25.2 '@babel/helper-compilation-targets': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 '@babel/helper-validator-option': 7.24.8 - '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.25.3(@babel/core@7.24.9) - '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.25.0(@babel/core@7.24.9) - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.25.0(@babel/core@7.24.9) - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.25.0(@babel/core@7.24.9) - '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.24.9) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.9) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.24.9) - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.24.9) - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.24.9) - '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.24.9) - '@babel/plugin-syntax-import-assertions': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-syntax-import-attributes': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.24.9) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.9) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.9) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.9) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.9) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.9) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.9) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.9) - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.24.9) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.24.9) - '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.24.9) - '@babel/plugin-transform-arrow-functions': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-async-generator-functions': 7.25.0(@babel/core@7.24.9) - '@babel/plugin-transform-async-to-generator': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-block-scoped-functions': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-block-scoping': 7.25.0(@babel/core@7.24.9) - '@babel/plugin-transform-class-properties': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-class-static-block': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-classes': 7.25.0(@babel/core@7.24.9) - '@babel/plugin-transform-computed-properties': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-destructuring': 7.24.8(@babel/core@7.24.9) - '@babel/plugin-transform-dotall-regex': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-duplicate-keys': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.25.0(@babel/core@7.24.9) - '@babel/plugin-transform-dynamic-import': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-exponentiation-operator': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-export-namespace-from': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-for-of': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-function-name': 7.25.1(@babel/core@7.24.9) - '@babel/plugin-transform-json-strings': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-literals': 7.25.2(@babel/core@7.24.9) - '@babel/plugin-transform-logical-assignment-operators': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-member-expression-literals': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-modules-amd': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-modules-commonjs': 7.24.8(@babel/core@7.24.9) - '@babel/plugin-transform-modules-systemjs': 7.25.0(@babel/core@7.24.9) - '@babel/plugin-transform-modules-umd': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-named-capturing-groups-regex': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-new-target': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-nullish-coalescing-operator': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-numeric-separator': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-object-rest-spread': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-object-super': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-optional-catch-binding': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-optional-chaining': 7.24.8(@babel/core@7.24.9) - '@babel/plugin-transform-parameters': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-private-methods': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-private-property-in-object': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-property-literals': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-regenerator': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-reserved-words': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-shorthand-properties': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-spread': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-sticky-regex': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-template-literals': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-typeof-symbol': 7.24.8(@babel/core@7.24.9) - '@babel/plugin-transform-unicode-escapes': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-unicode-property-regex': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-unicode-regex': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-unicode-sets-regex': 7.24.7(@babel/core@7.24.9) - '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.24.9) - babel-plugin-polyfill-corejs2: 0.4.11(@babel/core@7.24.9) - babel-plugin-polyfill-corejs3: 0.10.6(@babel/core@7.24.9) - babel-plugin-polyfill-regenerator: 0.6.2(@babel/core@7.24.9) - core-js-compat: 3.38.0 + '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.25.3(@babel/core@7.25.2) + '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.25.0(@babel/core@7.25.2) + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.25.0(@babel/core@7.25.2) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.25.0(@babel/core@7.25.2) + '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.25.2) + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.25.2) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.25.2) + '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.25.2) + '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-import-assertions': 7.25.6(@babel/core@7.25.2) + '@babel/plugin-syntax-import-attributes': 7.25.6(@babel/core@7.25.2) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.25.2) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.25.2) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.25.2) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.25.2) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.25.2) + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.25.2) + '@babel/plugin-transform-arrow-functions': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-async-generator-functions': 7.25.4(@babel/core@7.25.2) + '@babel/plugin-transform-async-to-generator': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-block-scoped-functions': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-block-scoping': 7.25.0(@babel/core@7.25.2) + '@babel/plugin-transform-class-properties': 7.25.4(@babel/core@7.25.2) + '@babel/plugin-transform-class-static-block': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-classes': 7.25.4(@babel/core@7.25.2) + '@babel/plugin-transform-computed-properties': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-destructuring': 7.24.8(@babel/core@7.25.2) + '@babel/plugin-transform-dotall-regex': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-duplicate-keys': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.25.0(@babel/core@7.25.2) + '@babel/plugin-transform-dynamic-import': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-exponentiation-operator': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-export-namespace-from': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-for-of': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-function-name': 7.25.1(@babel/core@7.25.2) + '@babel/plugin-transform-json-strings': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-literals': 7.25.2(@babel/core@7.25.2) + '@babel/plugin-transform-logical-assignment-operators': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-member-expression-literals': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-modules-amd': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-modules-commonjs': 7.24.8(@babel/core@7.25.2) + '@babel/plugin-transform-modules-systemjs': 7.25.0(@babel/core@7.25.2) + '@babel/plugin-transform-modules-umd': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-named-capturing-groups-regex': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-new-target': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-nullish-coalescing-operator': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-numeric-separator': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-object-rest-spread': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-object-super': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-optional-catch-binding': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-optional-chaining': 7.24.8(@babel/core@7.25.2) + '@babel/plugin-transform-parameters': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-private-methods': 7.25.4(@babel/core@7.25.2) + '@babel/plugin-transform-private-property-in-object': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-property-literals': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-regenerator': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-reserved-words': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-shorthand-properties': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-spread': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-sticky-regex': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-template-literals': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-typeof-symbol': 7.24.8(@babel/core@7.25.2) + '@babel/plugin-transform-unicode-escapes': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-unicode-property-regex': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-unicode-regex': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-unicode-sets-regex': 7.25.4(@babel/core@7.25.2) + '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.25.2) + babel-plugin-polyfill-corejs2: 0.4.11(@babel/core@7.25.2) + babel-plugin-polyfill-corejs3: 0.10.6(@babel/core@7.25.2) + babel-plugin-polyfill-regenerator: 0.6.2(@babel/core@7.25.2) + core-js-compat: 3.38.1 semver: 6.3.1 transitivePeerDependencies: - supports-color dev: true - /@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.24.9): + /@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.25.2): resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} peerDependencies: '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-plugin-utils': 7.24.8 - '@babel/types': 7.25.2 + '@babel/types': 7.25.6 esutils: 2.0.3 dev: true @@ -1629,6 +1687,12 @@ packages: dependencies: regenerator-runtime: 0.14.1 + /@babel/runtime@7.25.6: + resolution: {integrity: sha512-VBj9MYyDb9tuLq7yzqjgzt6Q+IBQLrGZfdjOekyEirZPHxXWoTSGUTMrpsfi58Up73d13NfYLv8HT9vmznjzhQ==} + engines: {node: '>=6.9.0'} + dependencies: + regenerator-runtime: 0.14.1 + /@babel/template@7.25.0: resolution: {integrity: sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==} engines: {node: '>=6.9.0'} @@ -1638,16 +1702,16 @@ packages: '@babel/types': 7.25.2 dev: true - /@babel/traverse@7.25.3: - resolution: {integrity: sha512-HefgyP1x754oGCsKmV5reSmtV7IXj/kpaE1XYY+D9G5PvKKoFfSbiS4M77MdjuwlZKDIKFCffq9rPU+H/s3ZdQ==} + /@babel/traverse@7.25.6: + resolution: {integrity: sha512-9Vrcx5ZW6UwK5tvqsj0nGpp/XzqthkT0dqIc9g1AdtygFToNtTF67XzYS//dm+SAK9cp3B9R4ZO/46p63SCjlQ==} engines: {node: '>=6.9.0'} dependencies: '@babel/code-frame': 7.24.7 - '@babel/generator': 7.25.0 - '@babel/parser': 7.25.3 + '@babel/generator': 7.25.6 + '@babel/parser': 7.25.6 '@babel/template': 7.25.0 - '@babel/types': 7.25.2 - debug: 4.3.5 + '@babel/types': 7.25.6 + debug: 4.3.7 globals: 11.12.0 transitivePeerDependencies: - supports-color @@ -1662,6 +1726,15 @@ packages: to-fast-properties: 2.0.0 dev: true + /@babel/types@7.25.6: + resolution: {integrity: sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.24.8 + '@babel/helper-validator-identifier': 7.24.7 + to-fast-properties: 2.0.0 + dev: true + /@bcoe/v8-coverage@0.2.3: resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} dev: true @@ -1684,6 +1757,20 @@ packages: '@lezer/common': 1.2.1 dev: false + /@codemirror/autocomplete@6.18.0(@codemirror/language@6.10.2)(@codemirror/state@6.4.1)(@codemirror/view@6.33.0)(@lezer/common@1.2.1): + resolution: {integrity: sha512-5DbOvBbY4qW5l57cjDsmmpDh3/TeK1vXfTHa+BUMrRzdWdcxKZ4U4V7vQaTtOpApNU4kLS4FQ6cINtLg245LXA==} + peerDependencies: + '@codemirror/language': ^6.0.0 + '@codemirror/state': ^6.0.0 + '@codemirror/view': ^6.0.0 + '@lezer/common': ^1.0.0 + dependencies: + '@codemirror/language': 6.10.2 + '@codemirror/state': 6.4.1 + '@codemirror/view': 6.33.0 + '@lezer/common': 1.2.1 + dev: false + /@codemirror/commands@6.6.0: resolution: {integrity: sha512-qnY+b7j1UNcTS31Eenuc/5YJB6gQOzkUoNmJQc0rznwqSRpeaWWpjkWy2C/MPTcePpsKJEM26hXrOXl1+nceXg==} dependencies: @@ -1693,6 +1780,15 @@ packages: '@lezer/common': 1.2.1 dev: false + /@codemirror/commands@6.6.1: + resolution: {integrity: sha512-iBfKbyIoXS1FGdsKcZmnrxmbc8VcbMrSgD7AVrsnX+WyAYjmUDWvE93dt5D874qS4CCVu4O1JpbagHdXbbLiOw==} + dependencies: + '@codemirror/language': 6.10.2 + '@codemirror/state': 6.4.1 + '@codemirror/view': 6.33.0 + '@lezer/common': 1.2.1 + dev: false + /@codemirror/lang-css@6.2.1(@codemirror/view@6.29.1): resolution: {integrity: sha512-/UNWDNV5Viwi/1lpr/dIXJNWiwDxpw13I4pTUAsNxZdg6E0mI2kTQb0P2iHczg1Tu+H4EBgJR+hYhKiHKko7qg==} dependencies: @@ -1766,7 +1862,7 @@ packages: resolution: {integrity: sha512-rpMgcsh7o0GuCDUXKPvww+muLA1pDJaFrpq/CCHtpQJYz8xopu4D1hPcKRoDD0YlF8gZaqTNIRa4VRBWyhyy7Q==} dependencies: '@codemirror/state': 6.4.1 - '@codemirror/view': 6.29.1 + '@codemirror/view': 6.33.0 crelt: 1.0.6 dev: false @@ -1779,8 +1875,8 @@ packages: dependencies: '@codemirror/language': 6.10.2 '@codemirror/state': 6.4.1 - '@codemirror/view': 6.29.1 - '@lezer/highlight': 1.2.0 + '@codemirror/view': 6.33.0 + '@lezer/highlight': 1.2.1 dev: false /@codemirror/view@6.29.1: @@ -1791,6 +1887,14 @@ packages: w3c-keyname: 2.2.8 dev: false + /@codemirror/view@6.33.0: + resolution: {integrity: sha512-AroaR3BvnjRW8fiZBalAaK+ZzB5usGgI014YKElYZvQdNH5ZIidHlO+cyf/2rWzyBFRkvG6VhiXeAEbC53P2YQ==} + dependencies: + '@codemirror/state': 6.4.1 + style-mod: 4.1.2 + w3c-keyname: 2.2.8 + dev: false + /@colors/colors@1.5.0: resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} engines: {node: '>=0.1.90'} @@ -1878,9 +1982,9 @@ packages: peerDependencies: postcss: ^8.4 dependencies: - '@csstools/selector-specificity': 2.2.0(postcss-selector-parser@6.1.1) + '@csstools/selector-specificity': 2.2.0(postcss-selector-parser@6.1.2) postcss: 8.3.0 - postcss-selector-parser: 6.1.1 + postcss-selector-parser: 6.1.2 dev: true /@csstools/postcss-color-function@2.2.3(postcss@8.3.0): @@ -1961,9 +2065,9 @@ packages: peerDependencies: postcss: ^8.4 dependencies: - '@csstools/selector-specificity': 2.2.0(postcss-selector-parser@6.1.1) + '@csstools/selector-specificity': 2.2.0(postcss-selector-parser@6.1.2) postcss: 8.3.0 - postcss-selector-parser: 6.1.1 + postcss-selector-parser: 6.1.2 dev: true /@csstools/postcss-logical-float-and-clear@1.0.1(postcss@8.3.0): @@ -2070,7 +2174,7 @@ packages: postcss: ^8.4 dependencies: postcss: 8.3.0 - postcss-selector-parser: 6.1.1 + postcss-selector-parser: 6.1.2 dev: true /@csstools/postcss-stepped-value-functions@2.1.1(postcss@8.3.0): @@ -2117,13 +2221,13 @@ packages: postcss: 8.3.0 dev: true - /@csstools/selector-specificity@2.2.0(postcss-selector-parser@6.1.1): + /@csstools/selector-specificity@2.2.0(postcss-selector-parser@6.1.2): resolution: {integrity: sha512-+OJ9konv95ClSTOJCmMZqpd5+YGsB2S+x6w3E1oaM8UuR5j8nTNHYSz8c9BEPGDOCMQYIEEGlVPj/VY64iTbGw==} engines: {node: ^14 || ^16 || >=18} peerDependencies: postcss-selector-parser: ^6.0.10 dependencies: - postcss-selector-parser: 6.1.1 + postcss-selector-parser: 6.1.2 dev: true /@csstools/selector-specificity@3.1.1(postcss-selector-parser@6.1.1): @@ -2435,17 +2539,17 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /@graphql-codegen/add@5.0.3(graphql@15.9.0): + /@graphql-codegen/add@5.0.3(graphql@16.9.0): resolution: {integrity: sha512-SxXPmramkth8XtBlAHu4H4jYcYXM/o3p01+psU+0NADQowA8jtYkK6MW5rV6T+CxkEaNZItfSmZRPgIuypcqnA==} peerDependencies: graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 dependencies: - '@graphql-codegen/plugin-helpers': 5.0.4(graphql@15.9.0) - graphql: 15.9.0 + '@graphql-codegen/plugin-helpers': 5.0.4(graphql@16.9.0) + graphql: 16.9.0 tslib: 2.6.3 dev: true - /@graphql-codegen/cli@5.0.2(@types/node@20.11.6)(graphql@15.9.0)(typescript@5.0.4): + /@graphql-codegen/cli@5.0.2(@types/node@20.11.6)(graphql@16.9.0)(typescript@5.0.4): resolution: {integrity: sha512-MBIaFqDiLKuO4ojN6xxG9/xL9wmfD3ZjZ7RsPjwQnSHBCUXnEkdKvX+JVpx87Pq29Ycn8wTJUguXnTZ7Di0Mlw==} hasBin: true peerDependencies: @@ -2458,26 +2562,26 @@ packages: '@babel/generator': 7.25.0 '@babel/template': 7.25.0 '@babel/types': 7.25.2 - '@graphql-codegen/client-preset': 4.3.3(graphql@15.9.0) - '@graphql-codegen/core': 4.0.2(graphql@15.9.0) - '@graphql-codegen/plugin-helpers': 5.0.4(graphql@15.9.0) - '@graphql-tools/apollo-engine-loader': 8.0.1(graphql@15.9.0) - '@graphql-tools/code-file-loader': 8.1.3(graphql@15.9.0) - '@graphql-tools/git-loader': 8.0.7(graphql@15.9.0) - '@graphql-tools/github-loader': 8.0.1(@types/node@20.11.6)(graphql@15.9.0) - '@graphql-tools/graphql-file-loader': 8.0.1(graphql@15.9.0) - '@graphql-tools/json-file-loader': 8.0.1(graphql@15.9.0) - '@graphql-tools/load': 8.0.2(graphql@15.9.0) - '@graphql-tools/prisma-loader': 8.0.4(@types/node@20.11.6)(graphql@15.9.0) - '@graphql-tools/url-loader': 8.0.2(@types/node@20.11.6)(graphql@15.9.0) - '@graphql-tools/utils': 10.3.3(graphql@15.9.0) + '@graphql-codegen/client-preset': 4.3.3(graphql@16.9.0) + '@graphql-codegen/core': 4.0.2(graphql@16.9.0) + '@graphql-codegen/plugin-helpers': 5.0.4(graphql@16.9.0) + '@graphql-tools/apollo-engine-loader': 8.0.1(graphql@16.9.0) + '@graphql-tools/code-file-loader': 8.1.3(graphql@16.9.0) + '@graphql-tools/git-loader': 8.0.7(graphql@16.9.0) + '@graphql-tools/github-loader': 8.0.1(@types/node@20.11.6)(graphql@16.9.0) + '@graphql-tools/graphql-file-loader': 8.0.1(graphql@16.9.0) + '@graphql-tools/json-file-loader': 8.0.1(graphql@16.9.0) + '@graphql-tools/load': 8.0.2(graphql@16.9.0) + '@graphql-tools/prisma-loader': 8.0.4(@types/node@20.11.6)(graphql@16.9.0) + '@graphql-tools/url-loader': 8.0.2(@types/node@20.11.6)(graphql@16.9.0) + '@graphql-tools/utils': 10.3.3(graphql@16.9.0) '@whatwg-node/fetch': 0.8.8 chalk: 4.1.2 cosmiconfig: 8.3.6(typescript@5.0.4) debounce: 1.2.1 detect-indent: 6.1.0 - graphql: 15.9.0 - graphql-config: 5.1.0(@types/node@20.11.6)(graphql@15.9.0)(typescript@5.0.4) + graphql: 16.9.0 + graphql-config: 5.1.0(@types/node@20.11.6)(graphql@16.9.0)(typescript@5.0.4) inquirer: 8.2.6 is-glob: 4.0.3 jiti: 1.21.6 @@ -2502,159 +2606,145 @@ packages: - utf-8-validate dev: true - /@graphql-codegen/client-preset@4.3.3(graphql@15.9.0): + /@graphql-codegen/client-preset@4.3.3(graphql@16.9.0): resolution: {integrity: sha512-IrDsSVe8bkKtxgVfKPHzjL9tYlv7KEpA59R4gZLqx/t2WIJncW1i0OMvoz9tgoZsFEs8OKKgXZbnwPZ/Qf1kEw==} peerDependencies: graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 dependencies: '@babel/helper-plugin-utils': 7.24.8 '@babel/template': 7.25.0 - '@graphql-codegen/add': 5.0.3(graphql@15.9.0) - '@graphql-codegen/gql-tag-operations': 4.0.9(graphql@15.9.0) - '@graphql-codegen/plugin-helpers': 5.0.4(graphql@15.9.0) - '@graphql-codegen/typed-document-node': 5.0.9(graphql@15.9.0) - '@graphql-codegen/typescript': 4.0.9(graphql@15.9.0) - '@graphql-codegen/typescript-operations': 4.2.3(graphql@15.9.0) - '@graphql-codegen/visitor-plugin-common': 5.3.1(graphql@15.9.0) - '@graphql-tools/documents': 1.0.1(graphql@15.9.0) - '@graphql-tools/utils': 10.3.3(graphql@15.9.0) - '@graphql-typed-document-node/core': 3.2.0(graphql@15.9.0) - graphql: 15.9.0 + '@graphql-codegen/add': 5.0.3(graphql@16.9.0) + '@graphql-codegen/gql-tag-operations': 4.0.9(graphql@16.9.0) + '@graphql-codegen/plugin-helpers': 5.0.4(graphql@16.9.0) + '@graphql-codegen/typed-document-node': 5.0.9(graphql@16.9.0) + '@graphql-codegen/typescript': 4.0.9(graphql@16.9.0) + '@graphql-codegen/typescript-operations': 4.2.3(graphql@16.9.0) + '@graphql-codegen/visitor-plugin-common': 5.3.1(graphql@16.9.0) + '@graphql-tools/documents': 1.0.1(graphql@16.9.0) + '@graphql-tools/utils': 10.3.3(graphql@16.9.0) + '@graphql-typed-document-node/core': 3.2.0(graphql@16.9.0) + graphql: 16.9.0 tslib: 2.6.3 transitivePeerDependencies: - encoding - supports-color dev: true - /@graphql-codegen/core@4.0.2(graphql@15.9.0): + /@graphql-codegen/core@4.0.2(graphql@16.9.0): resolution: {integrity: sha512-IZbpkhwVqgizcjNiaVzNAzm/xbWT6YnGgeOLwVjm4KbJn3V2jchVtuzHH09G5/WkkLSk2wgbXNdwjM41JxO6Eg==} peerDependencies: graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 dependencies: - '@graphql-codegen/plugin-helpers': 5.0.4(graphql@15.9.0) - '@graphql-tools/schema': 10.0.4(graphql@15.9.0) - '@graphql-tools/utils': 10.3.3(graphql@15.9.0) - graphql: 15.9.0 + '@graphql-codegen/plugin-helpers': 5.0.4(graphql@16.9.0) + '@graphql-tools/schema': 10.0.4(graphql@16.9.0) + '@graphql-tools/utils': 10.3.3(graphql@16.9.0) + graphql: 16.9.0 tslib: 2.6.3 dev: true - /@graphql-codegen/gql-tag-operations@4.0.9(graphql@15.9.0): + /@graphql-codegen/gql-tag-operations@4.0.9(graphql@16.9.0): resolution: {integrity: sha512-lVgu1HClel896HqZAEjynatlU6eJrYOw+rh05DPgM150xvmb7Gz5TnRHA2vfwlDNIXDaToAIpz5RFfkjjnYM1Q==} peerDependencies: graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 dependencies: - '@graphql-codegen/plugin-helpers': 5.0.4(graphql@15.9.0) - '@graphql-codegen/visitor-plugin-common': 5.3.1(graphql@15.9.0) - '@graphql-tools/utils': 10.3.3(graphql@15.9.0) + '@graphql-codegen/plugin-helpers': 5.0.4(graphql@16.9.0) + '@graphql-codegen/visitor-plugin-common': 5.3.1(graphql@16.9.0) + '@graphql-tools/utils': 10.3.3(graphql@16.9.0) auto-bind: 4.0.0 - graphql: 15.9.0 + graphql: 16.9.0 tslib: 2.6.3 transitivePeerDependencies: - encoding - supports-color dev: true - /@graphql-codegen/introspection@4.0.3(graphql@15.9.0): - resolution: {integrity: sha512-4cHRG15Zu4MXMF4wTQmywNf4+fkDYv5lTbzraVfliDnB8rJKcaurQpRBi11KVuQUe24YTq/Cfk4uwewfNikWoA==} - peerDependencies: - graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 - dependencies: - '@graphql-codegen/plugin-helpers': 5.0.4(graphql@15.9.0) - '@graphql-codegen/visitor-plugin-common': 5.3.1(graphql@15.9.0) - graphql: 15.9.0 - tslib: 2.6.3 - transitivePeerDependencies: - - encoding - - supports-color - dev: true - - /@graphql-codegen/plugin-helpers@5.0.4(graphql@15.9.0): + /@graphql-codegen/plugin-helpers@5.0.4(graphql@16.9.0): resolution: {integrity: sha512-MOIuHFNWUnFnqVmiXtrI+4UziMTYrcquljaI5f/T/Bc7oO7sXcfkAvgkNWEEi9xWreYwvuer3VHCuPI/lAFWbw==} peerDependencies: graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 dependencies: - '@graphql-tools/utils': 10.3.3(graphql@15.9.0) + '@graphql-tools/utils': 10.3.3(graphql@16.9.0) change-case-all: 1.0.15 common-tags: 1.8.2 - graphql: 15.9.0 + graphql: 16.9.0 import-from: 4.0.0 lodash: 4.17.21 tslib: 2.6.3 dev: true - /@graphql-codegen/schema-ast@4.1.0(graphql@15.9.0): + /@graphql-codegen/schema-ast@4.1.0(graphql@16.9.0): resolution: {integrity: sha512-kZVn0z+th9SvqxfKYgztA6PM7mhnSZaj4fiuBWvMTqA+QqQ9BBed6Pz41KuD/jr0gJtnlr2A4++/0VlpVbCTmQ==} peerDependencies: graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 dependencies: - '@graphql-codegen/plugin-helpers': 5.0.4(graphql@15.9.0) - '@graphql-tools/utils': 10.3.3(graphql@15.9.0) - graphql: 15.9.0 + '@graphql-codegen/plugin-helpers': 5.0.4(graphql@16.9.0) + '@graphql-tools/utils': 10.3.3(graphql@16.9.0) + graphql: 16.9.0 tslib: 2.6.3 dev: true - /@graphql-codegen/typed-document-node@5.0.9(graphql@15.9.0): + /@graphql-codegen/typed-document-node@5.0.9(graphql@16.9.0): resolution: {integrity: sha512-Wx6fyA4vpfIbfNTMiWUECGnjqzKkJdEbZHxVMIegiCBPzBYPAJV4mZZcildLAfm2FtZcgW4YKtFoTbnbXqPB3w==} peerDependencies: graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 dependencies: - '@graphql-codegen/plugin-helpers': 5.0.4(graphql@15.9.0) - '@graphql-codegen/visitor-plugin-common': 5.3.1(graphql@15.9.0) + '@graphql-codegen/plugin-helpers': 5.0.4(graphql@16.9.0) + '@graphql-codegen/visitor-plugin-common': 5.3.1(graphql@16.9.0) auto-bind: 4.0.0 change-case-all: 1.0.15 - graphql: 15.9.0 + graphql: 16.9.0 tslib: 2.6.3 transitivePeerDependencies: - encoding - supports-color dev: true - /@graphql-codegen/typescript-operations@4.2.3(graphql@15.9.0): + /@graphql-codegen/typescript-operations@4.2.3(graphql@16.9.0): resolution: {integrity: sha512-6z7avSSOr03l5SyKbeDs7MzRyGwnQFSCqQm8Om5wIuoIgXVu2gXRmcJAY/I7SLdAy9xbF4Sho7XNqieFM2CAFQ==} peerDependencies: graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 dependencies: - '@graphql-codegen/plugin-helpers': 5.0.4(graphql@15.9.0) - '@graphql-codegen/typescript': 4.0.9(graphql@15.9.0) - '@graphql-codegen/visitor-plugin-common': 5.3.1(graphql@15.9.0) + '@graphql-codegen/plugin-helpers': 5.0.4(graphql@16.9.0) + '@graphql-codegen/typescript': 4.0.9(graphql@16.9.0) + '@graphql-codegen/visitor-plugin-common': 5.3.1(graphql@16.9.0) auto-bind: 4.0.0 - graphql: 15.9.0 + graphql: 16.9.0 tslib: 2.6.3 transitivePeerDependencies: - encoding - supports-color dev: true - /@graphql-codegen/typescript@4.0.9(graphql@15.9.0): + /@graphql-codegen/typescript@4.0.9(graphql@16.9.0): resolution: {integrity: sha512-0O35DMR4d/ctuHL1Zo6mRUUzp0BoszKfeWsa6sCm/g70+S98+hEfTwZNDkQHylLxapiyjssF9uw/F+sXqejqLw==} peerDependencies: graphql: ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 dependencies: - '@graphql-codegen/plugin-helpers': 5.0.4(graphql@15.9.0) - '@graphql-codegen/schema-ast': 4.1.0(graphql@15.9.0) - '@graphql-codegen/visitor-plugin-common': 5.3.1(graphql@15.9.0) + '@graphql-codegen/plugin-helpers': 5.0.4(graphql@16.9.0) + '@graphql-codegen/schema-ast': 4.1.0(graphql@16.9.0) + '@graphql-codegen/visitor-plugin-common': 5.3.1(graphql@16.9.0) auto-bind: 4.0.0 - graphql: 15.9.0 + graphql: 16.9.0 tslib: 2.6.3 transitivePeerDependencies: - encoding - supports-color dev: true - /@graphql-codegen/visitor-plugin-common@5.3.1(graphql@15.9.0): + /@graphql-codegen/visitor-plugin-common@5.3.1(graphql@16.9.0): resolution: {integrity: sha512-MktoBdNZhSmugiDjmFl1z6rEUUaqyxtFJYWnDilE7onkPgyw//O0M+TuPBJPBWdyV6J2ond0Hdqtq+rkghgSIQ==} peerDependencies: graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 dependencies: - '@graphql-codegen/plugin-helpers': 5.0.4(graphql@15.9.0) - '@graphql-tools/optimize': 2.0.0(graphql@15.9.0) - '@graphql-tools/relay-operation-optimizer': 7.0.1(graphql@15.9.0) - '@graphql-tools/utils': 10.3.3(graphql@15.9.0) + '@graphql-codegen/plugin-helpers': 5.0.4(graphql@16.9.0) + '@graphql-tools/optimize': 2.0.0(graphql@16.9.0) + '@graphql-tools/relay-operation-optimizer': 7.0.1(graphql@16.9.0) + '@graphql-tools/utils': 10.3.3(graphql@16.9.0) auto-bind: 4.0.0 change-case-all: 1.0.15 dependency-graph: 0.11.0 - graphql: 15.9.0 - graphql-tag: 2.12.6(graphql@15.9.0) + graphql: 16.9.0 + graphql-tag: 2.12.6(graphql@16.9.0) parse-filepath: 1.0.2 tslib: 2.6.3 transitivePeerDependencies: @@ -2662,86 +2752,86 @@ packages: - supports-color dev: true - /@graphql-tools/apollo-engine-loader@8.0.1(graphql@15.9.0): + /@graphql-tools/apollo-engine-loader@8.0.1(graphql@16.9.0): resolution: {integrity: sha512-NaPeVjtrfbPXcl+MLQCJLWtqe2/E4bbAqcauEOQ+3sizw1Fc2CNmhHRF8a6W4D0ekvTRRXAMptXYgA2uConbrA==} engines: {node: '>=16.0.0'} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: '@ardatan/sync-fetch': 0.0.1 - '@graphql-tools/utils': 10.3.3(graphql@15.9.0) + '@graphql-tools/utils': 10.3.3(graphql@16.9.0) '@whatwg-node/fetch': 0.9.19 - graphql: 15.9.0 + graphql: 16.9.0 tslib: 2.6.3 transitivePeerDependencies: - encoding dev: true - /@graphql-tools/batch-execute@9.0.4(graphql@15.9.0): + /@graphql-tools/batch-execute@9.0.4(graphql@16.9.0): resolution: {integrity: sha512-kkebDLXgDrep5Y0gK1RN3DMUlLqNhg60OAz0lTCqrYeja6DshxLtLkj+zV4mVbBA4mQOEoBmw6g1LZs3dA84/w==} engines: {node: '>=16.0.0'} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: - '@graphql-tools/utils': 10.3.3(graphql@15.9.0) + '@graphql-tools/utils': 10.3.3(graphql@16.9.0) dataloader: 2.2.2 - graphql: 15.9.0 + graphql: 16.9.0 tslib: 2.6.3 value-or-promise: 1.0.12 dev: true - /@graphql-tools/code-file-loader@8.1.3(graphql@15.9.0): + /@graphql-tools/code-file-loader@8.1.3(graphql@16.9.0): resolution: {integrity: sha512-Qoo8VyU0ux7k20DkzL5wFm7Y6iqlG1GQ0xA4T3EQbm4B/qbENsMc38l76QnXYIVmIlKAnD9EAvzxPEQ8iv+ZPA==} engines: {node: '>=16.0.0'} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: - '@graphql-tools/graphql-tag-pluck': 8.3.2(graphql@15.9.0) - '@graphql-tools/utils': 10.3.3(graphql@15.9.0) + '@graphql-tools/graphql-tag-pluck': 8.3.2(graphql@16.9.0) + '@graphql-tools/utils': 10.3.3(graphql@16.9.0) globby: 11.1.0 - graphql: 15.9.0 + graphql: 16.9.0 tslib: 2.6.3 unixify: 1.0.0 transitivePeerDependencies: - supports-color dev: true - /@graphql-tools/delegate@10.0.17(graphql@15.9.0): + /@graphql-tools/delegate@10.0.17(graphql@16.9.0): resolution: {integrity: sha512-YIJleGaSjYnqIcJ5uoBWVBBE3eP5h3CvEM9PiANHtRUBmoNBKdYstkrS3IqBSlgKLsboD5CTYfmXDVQAPfH+mw==} engines: {node: '>=16.0.0'} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: - '@graphql-tools/batch-execute': 9.0.4(graphql@15.9.0) - '@graphql-tools/executor': 1.3.0(graphql@15.9.0) - '@graphql-tools/schema': 10.0.4(graphql@15.9.0) - '@graphql-tools/utils': 10.3.3(graphql@15.9.0) + '@graphql-tools/batch-execute': 9.0.4(graphql@16.9.0) + '@graphql-tools/executor': 1.3.0(graphql@16.9.0) + '@graphql-tools/schema': 10.0.4(graphql@16.9.0) + '@graphql-tools/utils': 10.3.3(graphql@16.9.0) dataloader: 2.2.2 - graphql: 15.9.0 + graphql: 16.9.0 tslib: 2.6.3 dev: true - /@graphql-tools/documents@1.0.1(graphql@15.9.0): + /@graphql-tools/documents@1.0.1(graphql@16.9.0): resolution: {integrity: sha512-aweoMH15wNJ8g7b2r4C4WRuJxZ0ca8HtNO54rkye/3duxTkW4fGBEutCx03jCIr5+a1l+4vFJNP859QnAVBVCA==} engines: {node: '>=16.0.0'} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: - graphql: 15.9.0 + graphql: 16.9.0 lodash.sortby: 4.7.0 tslib: 2.6.3 dev: true - /@graphql-tools/executor-graphql-ws@1.2.0(graphql@15.9.0): + /@graphql-tools/executor-graphql-ws@1.2.0(graphql@16.9.0): resolution: {integrity: sha512-tSYC1QdrabWexLrYV0UI3uRGbde9WCY/bRhq6Jc+VXMZcfq6ea6pP5NEAVTfwbhUQ4xZvJABVVbKXtKb9uTg1w==} engines: {node: '>=16.0.0'} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: - '@graphql-tools/utils': 10.3.3(graphql@15.9.0) + '@graphql-tools/utils': 10.3.3(graphql@16.9.0) '@types/ws': 8.5.12 - graphql: 15.9.0 - graphql-ws: 5.16.0(graphql@15.9.0) + graphql: 16.9.0 + graphql-ws: 5.16.0(graphql@16.9.0) isomorphic-ws: 5.0.0(ws@8.18.0) tslib: 2.6.3 ws: 8.18.0 @@ -2750,17 +2840,17 @@ packages: - utf-8-validate dev: true - /@graphql-tools/executor-http@1.1.5(@types/node@20.11.6)(graphql@15.9.0): + /@graphql-tools/executor-http@1.1.5(@types/node@20.11.6)(graphql@16.9.0): resolution: {integrity: sha512-ZAsVGUwafPc1GapLA1yoJuRx7ihpVdAv7JDHmlI2eHRQsJnMVQwcxHnjfUb/id9YAEBrP86/s4pgEoRyad3Zng==} engines: {node: '>=16.0.0'} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: - '@graphql-tools/utils': 10.3.3(graphql@15.9.0) + '@graphql-tools/utils': 10.3.3(graphql@16.9.0) '@repeaterjs/repeater': 3.0.6 '@whatwg-node/fetch': 0.9.19 extract-files: 11.0.0 - graphql: 15.9.0 + graphql: 16.9.0 meros: 1.3.0(@types/node@20.11.6) tslib: 2.6.3 value-or-promise: 1.0.12 @@ -2768,15 +2858,15 @@ packages: - '@types/node' dev: true - /@graphql-tools/executor-legacy-ws@1.1.0(graphql@15.9.0): + /@graphql-tools/executor-legacy-ws@1.1.0(graphql@16.9.0): resolution: {integrity: sha512-k+6ZyiaAd8SmwuzbEOfA/LVkuI1nqidhoMw+CJ7c41QGOjSMzc0VS0UZbJyeitI0n7a+uP/Meln1wjzJ2ReDtQ==} engines: {node: '>=16.0.0'} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: - '@graphql-tools/utils': 10.3.3(graphql@15.9.0) + '@graphql-tools/utils': 10.3.3(graphql@16.9.0) '@types/ws': 8.5.12 - graphql: 15.9.0 + graphql: 16.9.0 isomorphic-ws: 5.0.0(ws@8.18.0) tslib: 2.6.3 ws: 8.18.0 @@ -2785,29 +2875,29 @@ packages: - utf-8-validate dev: true - /@graphql-tools/executor@1.3.0(graphql@15.9.0): + /@graphql-tools/executor@1.3.0(graphql@16.9.0): resolution: {integrity: sha512-e+rmEf/2EO4hDnbkO8mTS2FI+jGUNmYkSDKw5TgPVlO8VOKS+TXmJBK6E9v4Gc/39yVkZsffYfW/R8obJrA0mg==} engines: {node: '>=16.0.0'} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: - '@graphql-tools/utils': 10.3.3(graphql@15.9.0) - '@graphql-typed-document-node/core': 3.2.0(graphql@15.9.0) + '@graphql-tools/utils': 10.3.3(graphql@16.9.0) + '@graphql-typed-document-node/core': 3.2.0(graphql@16.9.0) '@repeaterjs/repeater': 3.0.6 - graphql: 15.9.0 + graphql: 16.9.0 tslib: 2.6.3 value-or-promise: 1.0.12 dev: true - /@graphql-tools/git-loader@8.0.7(graphql@15.9.0): + /@graphql-tools/git-loader@8.0.7(graphql@16.9.0): resolution: {integrity: sha512-+s23lxHR24+zLDk9/Hfl7/8Qcal8Q1yJ8armRp1fvcJyuc0RTZv97ZoZb0tArTfME74z+kJ92Mx4SfZMd7mHSQ==} engines: {node: '>=16.0.0'} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: - '@graphql-tools/graphql-tag-pluck': 8.3.2(graphql@15.9.0) - '@graphql-tools/utils': 10.3.3(graphql@15.9.0) - graphql: 15.9.0 + '@graphql-tools/graphql-tag-pluck': 8.3.2(graphql@16.9.0) + '@graphql-tools/utils': 10.3.3(graphql@16.9.0) + graphql: 16.9.0 is-glob: 4.0.3 micromatch: 4.0.7 tslib: 2.6.3 @@ -2816,18 +2906,18 @@ packages: - supports-color dev: true - /@graphql-tools/github-loader@8.0.1(@types/node@20.11.6)(graphql@15.9.0): + /@graphql-tools/github-loader@8.0.1(@types/node@20.11.6)(graphql@16.9.0): resolution: {integrity: sha512-W4dFLQJ5GtKGltvh/u1apWRFKBQOsDzFxO9cJkOYZj1VzHCpRF43uLST4VbCfWve+AwBqOuKr7YgkHoxpRMkcg==} engines: {node: '>=16.0.0'} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: '@ardatan/sync-fetch': 0.0.1 - '@graphql-tools/executor-http': 1.1.5(@types/node@20.11.6)(graphql@15.9.0) - '@graphql-tools/graphql-tag-pluck': 8.3.2(graphql@15.9.0) - '@graphql-tools/utils': 10.3.3(graphql@15.9.0) + '@graphql-tools/executor-http': 1.1.5(@types/node@20.11.6)(graphql@16.9.0) + '@graphql-tools/graphql-tag-pluck': 8.3.2(graphql@16.9.0) + '@graphql-tools/utils': 10.3.3(graphql@16.9.0) '@whatwg-node/fetch': 0.9.19 - graphql: 15.9.0 + graphql: 16.9.0 tslib: 2.6.3 value-or-promise: 1.0.12 transitivePeerDependencies: @@ -2836,112 +2926,112 @@ packages: - supports-color dev: true - /@graphql-tools/graphql-file-loader@8.0.1(graphql@15.9.0): + /@graphql-tools/graphql-file-loader@8.0.1(graphql@16.9.0): resolution: {integrity: sha512-7gswMqWBabTSmqbaNyWSmRRpStWlcCkBc73E6NZNlh4YNuiyKOwbvSkOUYFOqFMfEL+cFsXgAvr87Vz4XrYSbA==} engines: {node: '>=16.0.0'} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: - '@graphql-tools/import': 7.0.1(graphql@15.9.0) - '@graphql-tools/utils': 10.3.3(graphql@15.9.0) + '@graphql-tools/import': 7.0.1(graphql@16.9.0) + '@graphql-tools/utils': 10.3.3(graphql@16.9.0) globby: 11.1.0 - graphql: 15.9.0 + graphql: 16.9.0 tslib: 2.6.3 unixify: 1.0.0 dev: true - /@graphql-tools/graphql-tag-pluck@8.3.2(graphql@15.9.0): + /@graphql-tools/graphql-tag-pluck@8.3.2(graphql@16.9.0): resolution: {integrity: sha512-wJKkDjXRg2qJAVhAVE96zJGMli8Ity9mKUB7gTbvJwsAniaquRqLcTXUQ19X9qVT4ACzbbp+tAfk96b2U3tfog==} engines: {node: '>=16.0.0'} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: '@babel/core': 7.24.9 - '@babel/parser': 7.25.3 + '@babel/parser': 7.25.6 '@babel/plugin-syntax-import-assertions': 7.24.7(@babel/core@7.24.9) - '@babel/traverse': 7.25.3 - '@babel/types': 7.25.2 - '@graphql-tools/utils': 10.3.3(graphql@15.9.0) - graphql: 15.9.0 + '@babel/traverse': 7.25.6 + '@babel/types': 7.25.6 + '@graphql-tools/utils': 10.3.3(graphql@16.9.0) + graphql: 16.9.0 tslib: 2.6.3 transitivePeerDependencies: - supports-color dev: true - /@graphql-tools/import@7.0.1(graphql@15.9.0): + /@graphql-tools/import@7.0.1(graphql@16.9.0): resolution: {integrity: sha512-935uAjAS8UAeXThqHfYVr4HEAp6nHJ2sximZKO1RzUTq5WoALMAhhGARl0+ecm6X+cqNUwIChJbjtaa6P/ML0w==} engines: {node: '>=16.0.0'} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: - '@graphql-tools/utils': 10.3.3(graphql@15.9.0) - graphql: 15.9.0 + '@graphql-tools/utils': 10.3.3(graphql@16.9.0) + graphql: 16.9.0 resolve-from: 5.0.0 tslib: 2.6.3 dev: true - /@graphql-tools/json-file-loader@8.0.1(graphql@15.9.0): + /@graphql-tools/json-file-loader@8.0.1(graphql@16.9.0): resolution: {integrity: sha512-lAy2VqxDAHjVyqeJonCP6TUemrpYdDuKt25a10X6zY2Yn3iFYGnuIDQ64cv3ytyGY6KPyPB+Kp+ZfOkNDG3FQA==} engines: {node: '>=16.0.0'} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: - '@graphql-tools/utils': 10.3.3(graphql@15.9.0) + '@graphql-tools/utils': 10.3.3(graphql@16.9.0) globby: 11.1.0 - graphql: 15.9.0 + graphql: 16.9.0 tslib: 2.6.3 unixify: 1.0.0 dev: true - /@graphql-tools/load@8.0.2(graphql@15.9.0): + /@graphql-tools/load@8.0.2(graphql@16.9.0): resolution: {integrity: sha512-S+E/cmyVmJ3CuCNfDuNF2EyovTwdWfQScXv/2gmvJOti2rGD8jTt9GYVzXaxhblLivQR9sBUCNZu/w7j7aXUCA==} engines: {node: '>=16.0.0'} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: - '@graphql-tools/schema': 10.0.4(graphql@15.9.0) - '@graphql-tools/utils': 10.3.3(graphql@15.9.0) - graphql: 15.9.0 + '@graphql-tools/schema': 10.0.4(graphql@16.9.0) + '@graphql-tools/utils': 10.3.3(graphql@16.9.0) + graphql: 16.9.0 p-limit: 3.1.0 tslib: 2.6.3 dev: true - /@graphql-tools/merge@9.0.4(graphql@15.9.0): + /@graphql-tools/merge@9.0.4(graphql@16.9.0): resolution: {integrity: sha512-MivbDLUQ+4Q8G/Hp/9V72hbn810IJDEZQ57F01sHnlrrijyadibfVhaQfW/pNH+9T/l8ySZpaR/DpL5i+ruZ+g==} engines: {node: '>=16.0.0'} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: - '@graphql-tools/utils': 10.3.3(graphql@15.9.0) - graphql: 15.9.0 + '@graphql-tools/utils': 10.3.3(graphql@16.9.0) + graphql: 16.9.0 tslib: 2.6.3 dev: true - /@graphql-tools/optimize@2.0.0(graphql@15.9.0): + /@graphql-tools/optimize@2.0.0(graphql@16.9.0): resolution: {integrity: sha512-nhdT+CRGDZ+bk68ic+Jw1OZ99YCDIKYA5AlVAnBHJvMawSx9YQqQAIj4refNc1/LRieGiuWvhbG3jvPVYho0Dg==} engines: {node: '>=16.0.0'} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: - graphql: 15.9.0 + graphql: 16.9.0 tslib: 2.6.3 dev: true - /@graphql-tools/prisma-loader@8.0.4(@types/node@20.11.6)(graphql@15.9.0): + /@graphql-tools/prisma-loader@8.0.4(@types/node@20.11.6)(graphql@16.9.0): resolution: {integrity: sha512-hqKPlw8bOu/GRqtYr0+dINAI13HinTVYBDqhwGAPIFmLr5s+qKskzgCiwbsckdrb5LWVFmVZc+UXn80OGiyBzg==} engines: {node: '>=16.0.0'} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: - '@graphql-tools/url-loader': 8.0.2(@types/node@20.11.6)(graphql@15.9.0) - '@graphql-tools/utils': 10.3.3(graphql@15.9.0) + '@graphql-tools/url-loader': 8.0.2(@types/node@20.11.6)(graphql@16.9.0) + '@graphql-tools/utils': 10.3.3(graphql@16.9.0) '@types/js-yaml': 4.0.9 '@whatwg-node/fetch': 0.9.19 chalk: 4.1.2 debug: 4.3.5 dotenv: 16.4.5 - graphql: 15.9.0 - graphql-request: 6.1.0(graphql@15.9.0) + graphql: 16.9.0 + graphql-request: 6.1.0(graphql@16.9.0) http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.5 jose: 5.6.3 @@ -2958,50 +3048,50 @@ packages: - utf-8-validate dev: true - /@graphql-tools/relay-operation-optimizer@7.0.1(graphql@15.9.0): + /@graphql-tools/relay-operation-optimizer@7.0.1(graphql@16.9.0): resolution: {integrity: sha512-y0ZrQ/iyqWZlsS/xrJfSir3TbVYJTYmMOu4TaSz6F4FRDTQ3ie43BlKkhf04rC28pnUOS4BO9pDcAo1D30l5+A==} engines: {node: '>=16.0.0'} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: - '@ardatan/relay-compiler': 12.0.0(graphql@15.9.0) - '@graphql-tools/utils': 10.3.3(graphql@15.9.0) - graphql: 15.9.0 + '@ardatan/relay-compiler': 12.0.0(graphql@16.9.0) + '@graphql-tools/utils': 10.3.3(graphql@16.9.0) + graphql: 16.9.0 tslib: 2.6.3 transitivePeerDependencies: - encoding - supports-color dev: true - /@graphql-tools/schema@10.0.4(graphql@15.9.0): + /@graphql-tools/schema@10.0.4(graphql@16.9.0): resolution: {integrity: sha512-HuIwqbKxPaJujox25Ra4qwz0uQzlpsaBOzO6CVfzB/MemZdd+Gib8AIvfhQArK0YIN40aDran/yi+E5Xf0mQww==} engines: {node: '>=16.0.0'} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: - '@graphql-tools/merge': 9.0.4(graphql@15.9.0) - '@graphql-tools/utils': 10.3.3(graphql@15.9.0) - graphql: 15.9.0 + '@graphql-tools/merge': 9.0.4(graphql@16.9.0) + '@graphql-tools/utils': 10.3.3(graphql@16.9.0) + graphql: 16.9.0 tslib: 2.6.3 value-or-promise: 1.0.12 dev: true - /@graphql-tools/url-loader@8.0.2(@types/node@20.11.6)(graphql@15.9.0): + /@graphql-tools/url-loader@8.0.2(@types/node@20.11.6)(graphql@16.9.0): resolution: {integrity: sha512-1dKp2K8UuFn7DFo1qX5c1cyazQv2h2ICwA9esHblEqCYrgf69Nk8N7SODmsfWg94OEaI74IqMoM12t7eIGwFzQ==} engines: {node: '>=16.0.0'} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: '@ardatan/sync-fetch': 0.0.1 - '@graphql-tools/delegate': 10.0.17(graphql@15.9.0) - '@graphql-tools/executor-graphql-ws': 1.2.0(graphql@15.9.0) - '@graphql-tools/executor-http': 1.1.5(@types/node@20.11.6)(graphql@15.9.0) - '@graphql-tools/executor-legacy-ws': 1.1.0(graphql@15.9.0) - '@graphql-tools/utils': 10.3.3(graphql@15.9.0) - '@graphql-tools/wrap': 10.0.5(graphql@15.9.0) + '@graphql-tools/delegate': 10.0.17(graphql@16.9.0) + '@graphql-tools/executor-graphql-ws': 1.2.0(graphql@16.9.0) + '@graphql-tools/executor-http': 1.1.5(@types/node@20.11.6)(graphql@16.9.0) + '@graphql-tools/executor-legacy-ws': 1.1.0(graphql@16.9.0) + '@graphql-tools/utils': 10.3.3(graphql@16.9.0) + '@graphql-tools/wrap': 10.0.5(graphql@16.9.0) '@types/ws': 8.5.12 '@whatwg-node/fetch': 0.9.19 - graphql: 15.9.0 + graphql: 16.9.0 isomorphic-ws: 5.0.0(ws@8.18.0) tslib: 2.6.3 value-or-promise: 1.0.12 @@ -3013,39 +3103,39 @@ packages: - utf-8-validate dev: true - /@graphql-tools/utils@10.3.3(graphql@15.9.0): + /@graphql-tools/utils@10.3.3(graphql@16.9.0): resolution: {integrity: sha512-p0zCctE+kXsXb5FCJmA3DoucQmB5eSkrtyBAaEcjbnz8OVbriSJx2WNEyzttiHv2qanBe/AK/YiyHD/5Nsj76Q==} engines: {node: '>=16.0.0'} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: - '@graphql-typed-document-node/core': 3.2.0(graphql@15.9.0) + '@graphql-typed-document-node/core': 3.2.0(graphql@16.9.0) cross-inspect: 1.0.1 dset: 3.1.3 - graphql: 15.9.0 + graphql: 16.9.0 tslib: 2.6.3 dev: true - /@graphql-tools/wrap@10.0.5(graphql@15.9.0): + /@graphql-tools/wrap@10.0.5(graphql@16.9.0): resolution: {integrity: sha512-Cbr5aYjr3HkwdPvetZp1cpDWTGdD1Owgsb3z/ClzhmrboiK86EnQDxDvOJiQkDCPWE9lNBwj8Y4HfxroY0D9DQ==} engines: {node: '>=16.0.0'} peerDependencies: graphql: ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: - '@graphql-tools/delegate': 10.0.17(graphql@15.9.0) - '@graphql-tools/schema': 10.0.4(graphql@15.9.0) - '@graphql-tools/utils': 10.3.3(graphql@15.9.0) - graphql: 15.9.0 + '@graphql-tools/delegate': 10.0.17(graphql@16.9.0) + '@graphql-tools/schema': 10.0.4(graphql@16.9.0) + '@graphql-tools/utils': 10.3.3(graphql@16.9.0) + graphql: 16.9.0 tslib: 2.6.3 value-or-promise: 1.0.12 dev: true - /@graphql-typed-document-node/core@3.2.0(graphql@15.9.0): + /@graphql-typed-document-node/core@3.2.0(graphql@16.9.0): resolution: {integrity: sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ==} peerDependencies: graphql: ^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0 dependencies: - graphql: 15.9.0 + graphql: 16.9.0 dev: true /@humanwhocodes/config-array@0.11.14: @@ -3158,6 +3248,12 @@ packages: '@lezer/common': 1.2.1 dev: false + /@lezer/highlight@1.2.1: + resolution: {integrity: sha512-Z5duk4RN/3zuVO7Jq0pGLJ3qynpxUVsh7IbUbGj88+uV2ApSAn6kWg2au3iJb+0Zi7kKtqffIESgNcRXWZWmSA==} + dependencies: + '@lezer/common': 1.2.1 + dev: false + /@lezer/html@1.3.10: resolution: {integrity: sha512-dqpT8nISx/p9Do3AchvYGV3qYc4/rKr3IBZxlHmpIKam56P47RSHkSF5f13Vu9hebS1jM0HmtJIwLbWz1VIY6w==} dependencies: @@ -3277,7 +3373,7 @@ packages: resolution: {integrity: sha512-Javneu5lsuhwNCryN+pXH93VPQ8g0dBX7wItHFgYiwQmzE1sVdg5tWHiOgHywzL2W21XQopa7IwIEnNbmeUJYA==} dev: true - /@replit/codemirror-vim@6.2.1(@codemirror/commands@6.6.0)(@codemirror/language@6.10.2)(@codemirror/search@6.5.6)(@codemirror/state@6.4.1)(@codemirror/view@6.29.1): + /@replit/codemirror-vim@6.2.1(@codemirror/commands@6.6.1)(@codemirror/language@6.10.2)(@codemirror/search@6.5.6)(@codemirror/state@6.4.1)(@codemirror/view@6.33.0): resolution: {integrity: sha512-qDAcGSHBYU5RrdO//qCmD8K9t6vbP327iCj/iqrkVnjbrpFhrjOt92weGXGHmTNRh16cUtkUZ7Xq7rZf+8HVow==} peerDependencies: '@codemirror/commands': ^6.0.0 @@ -3286,14 +3382,14 @@ packages: '@codemirror/state': ^6.0.1 '@codemirror/view': ^6.0.3 dependencies: - '@codemirror/commands': 6.6.0 + '@codemirror/commands': 6.6.1 '@codemirror/language': 6.10.2 '@codemirror/search': 6.5.6 '@codemirror/state': 6.4.1 - '@codemirror/view': 6.29.1 + '@codemirror/view': 6.33.0 dev: false - /@rollup/plugin-babel@5.3.1(@babel/core@7.24.9)(rollup@2.79.1): + /@rollup/plugin-babel@5.3.1(@babel/core@7.25.2)(rollup@2.79.1): resolution: {integrity: sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==} engines: {node: '>= 10.0.0'} peerDependencies: @@ -3304,7 +3400,7 @@ packages: '@types/babel__core': optional: true dependencies: - '@babel/core': 7.24.9 + '@babel/core': 7.25.2 '@babel/helper-module-imports': 7.24.7 '@rollup/pluginutils': 3.1.0(rollup@2.79.1) rollup: 2.79.1 @@ -3352,7 +3448,7 @@ packages: rollup: 2.79.1 serialize-javascript: 6.0.2 smob: 1.5.0 - terser: 5.31.3 + terser: 5.31.6 dev: true /@rollup/pluginutils@3.1.0(rollup@2.79.1): @@ -3725,7 +3821,7 @@ packages: resolution: {integrity: sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q==} engines: {node: '>=14'} dependencies: - '@babel/types': 7.25.2 + '@babel/types': 7.25.6 entities: 4.5.0 dev: true @@ -4075,7 +4171,7 @@ packages: eslint-visitor-keys: 3.4.3 dev: true - /@uiw/codemirror-extensions-basic-setup@4.23.0(@codemirror/autocomplete@6.17.0)(@codemirror/commands@6.6.0)(@codemirror/language@6.10.2)(@codemirror/lint@6.8.1)(@codemirror/search@6.5.6)(@codemirror/state@6.4.1)(@codemirror/view@6.29.1): + /@uiw/codemirror-extensions-basic-setup@4.23.0(@codemirror/autocomplete@6.18.0)(@codemirror/commands@6.6.0)(@codemirror/language@6.10.2)(@codemirror/lint@6.8.1)(@codemirror/search@6.5.6)(@codemirror/state@6.4.1)(@codemirror/view@6.33.0): resolution: {integrity: sha512-+k5nkRpUWGaHr1JWT8jcKsVewlXw5qBgSopm9LW8fZ6KnSNZBycz8kHxh0+WSvckmXEESGptkIsb7dlkmJT/hQ==} peerDependencies: '@codemirror/autocomplete': '>=6.0.0' @@ -4086,26 +4182,26 @@ packages: '@codemirror/state': '>=6.0.0' '@codemirror/view': '>=6.0.0' dependencies: - '@codemirror/autocomplete': 6.17.0(@codemirror/language@6.10.2)(@codemirror/state@6.4.1)(@codemirror/view@6.29.1)(@lezer/common@1.2.1) + '@codemirror/autocomplete': 6.18.0(@codemirror/language@6.10.2)(@codemirror/state@6.4.1)(@codemirror/view@6.33.0)(@lezer/common@1.2.1) '@codemirror/commands': 6.6.0 '@codemirror/language': 6.10.2 '@codemirror/lint': 6.8.1 '@codemirror/search': 6.5.6 '@codemirror/state': 6.4.1 - '@codemirror/view': 6.29.1 + '@codemirror/view': 6.33.0 dev: false - /@uiw/codemirror-theme-github@4.23.0(@codemirror/language@6.10.2)(@codemirror/state@6.4.1)(@codemirror/view@6.29.1): + /@uiw/codemirror-theme-github@4.23.0(@codemirror/language@6.10.2)(@codemirror/state@6.4.1)(@codemirror/view@6.33.0): resolution: {integrity: sha512-1pJ9V7LQXoojfgYXgI4yn8CfaYBm9HS919xC32/rs81Wl1lhYEOhiYRmNcpnJQDu9ZMgO8ebPMgAVU21z/C76g==} dependencies: - '@uiw/codemirror-themes': 4.23.0(@codemirror/language@6.10.2)(@codemirror/state@6.4.1)(@codemirror/view@6.29.1) + '@uiw/codemirror-themes': 4.23.0(@codemirror/language@6.10.2)(@codemirror/state@6.4.1)(@codemirror/view@6.33.0) transitivePeerDependencies: - '@codemirror/language' - '@codemirror/state' - '@codemirror/view' dev: false - /@uiw/codemirror-themes@4.23.0(@codemirror/language@6.10.2)(@codemirror/state@6.4.1)(@codemirror/view@6.29.1): + /@uiw/codemirror-themes@4.23.0(@codemirror/language@6.10.2)(@codemirror/state@6.4.1)(@codemirror/view@6.33.0): resolution: {integrity: sha512-9fiji9xooZyBQozR1i6iTr56YP7j/Dr/VgsNWbqf5Szv+g+4WM1iZuiDGwNXmFMWX8gbkDzp6ASE21VCPSofWw==} peerDependencies: '@codemirror/language': '>=6.0.0' @@ -4114,10 +4210,10 @@ packages: dependencies: '@codemirror/language': 6.10.2 '@codemirror/state': 6.4.1 - '@codemirror/view': 6.29.1 + '@codemirror/view': 6.33.0 dev: false - /@uiw/react-codemirror@4.23.0(@babel/runtime@7.24.8)(@codemirror/autocomplete@6.17.0)(@codemirror/language@6.10.2)(@codemirror/lint@6.8.1)(@codemirror/search@6.5.6)(@codemirror/state@6.4.1)(@codemirror/theme-one-dark@6.1.2)(@codemirror/view@6.29.1)(codemirror@6.0.1)(react-dom@18.2.0)(react@18.2.0): + /@uiw/react-codemirror@4.23.0(@babel/runtime@7.25.6)(@codemirror/autocomplete@6.18.0)(@codemirror/language@6.10.2)(@codemirror/lint@6.8.1)(@codemirror/search@6.5.6)(@codemirror/state@6.4.1)(@codemirror/theme-one-dark@6.1.2)(@codemirror/view@6.33.0)(codemirror@6.0.1)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-MnqTXfgeLA3fsUUQjqjJgemEuNyoGALgsExVm0NQAllAAi1wfj+IoKFeK+h3XXMlTFRCFYOUh4AHDv0YXJLsOg==} peerDependencies: '@babel/runtime': '>=7.11.0' @@ -4128,12 +4224,12 @@ packages: react: '>=16.8.0' react-dom: '>=16.8.0' dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.25.6 '@codemirror/commands': 6.6.0 '@codemirror/state': 6.4.1 '@codemirror/theme-one-dark': 6.1.2 - '@codemirror/view': 6.29.1 - '@uiw/codemirror-extensions-basic-setup': 4.23.0(@codemirror/autocomplete@6.17.0)(@codemirror/commands@6.6.0)(@codemirror/language@6.10.2)(@codemirror/lint@6.8.1)(@codemirror/search@6.5.6)(@codemirror/state@6.4.1)(@codemirror/view@6.29.1) + '@codemirror/view': 6.33.0 + '@uiw/codemirror-extensions-basic-setup': 4.23.0(@codemirror/autocomplete@6.18.0)(@codemirror/commands@6.6.0)(@codemirror/language@6.10.2)(@codemirror/lint@6.8.1)(@codemirror/search@6.5.6)(@codemirror/state@6.4.1)(@codemirror/view@6.33.0) codemirror: 6.0.1(@lezer/common@1.2.1) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -4144,22 +4240,22 @@ packages: - '@codemirror/search' dev: false - /@urql/core@5.0.5(graphql@15.9.0): - resolution: {integrity: sha512-KmWRlN8dJz+XU21wmhcHcTV11n1K7zxaMtVwOhkH7b8H5Z5nuFKY5EkUsWqPlZl53YPiKwTtOMpptz5hamVVNQ==} + /@urql/core@5.0.6(graphql@16.9.0): + resolution: {integrity: sha512-38rgSDqVNihFDauw1Pm9V7XLWIKuK8V9CKgrUF7/xEKinze8ENKP1ZeBhkG+dxWzJan7CHK+SLl46kAdvZwIlA==} dependencies: - '@0no-co/graphql.web': 1.0.7(graphql@15.9.0) + '@0no-co/graphql.web': 1.0.8(graphql@16.9.0) wonka: 6.3.4 transitivePeerDependencies: - graphql dev: false - /@urql/exchange-graphcache@7.1.2(@urql/core@5.0.5)(graphql@15.9.0): + /@urql/exchange-graphcache@7.1.2(@urql/core@5.0.6)(graphql@16.9.0): resolution: {integrity: sha512-W2+lYYB/aW1xjPtrMO/Cuxnq3Wl+DuiySqbdw/II91G/NH8Axx2oxRLjWMeC5r/71RivJUrmf2FVzb4Yy1+qwQ==} peerDependencies: '@urql/core': ^5.0.0 dependencies: - '@0no-co/graphql.web': 1.0.7(graphql@15.9.0) - '@urql/core': 5.0.5(graphql@15.9.0) + '@0no-co/graphql.web': 1.0.7(graphql@16.9.0) + '@urql/core': 5.0.6(graphql@16.9.0) wonka: 6.3.4 transitivePeerDependencies: - graphql @@ -4216,7 +4312,7 @@ packages: std-env: 3.7.0 test-exclude: 6.0.0 v8-to-istanbul: 9.3.0 - vitest: 1.2.2(@types/node@20.11.6) + vitest: 1.2.2(@types/node@20.11.6)(happy-dom@15.7.3) transitivePeerDependencies: - supports-color dev: true @@ -4360,7 +4456,7 @@ packages: resolution: {integrity: sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==} engines: {node: '>= 14'} dependencies: - debug: 4.3.5 + debug: 4.3.7 transitivePeerDependencies: - supports-color dev: true @@ -4566,8 +4662,8 @@ packages: engines: {node: '>=8'} dev: true - /async@3.2.5: - resolution: {integrity: sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==} + /async@3.2.6: + resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==} dev: true /asynckit@0.4.0: @@ -4611,8 +4707,8 @@ packages: resolution: {integrity: sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==} dev: true - /aws4@1.13.0: - resolution: {integrity: sha512-3AungXC4I8kKsS9PuS4JH2nc+0bVY/mjgrephHTIi8fpEeGsTHBUJeosp0Wc1myYMElmD0B3Oc4XL/HVJ4PV2g==} + /aws4@1.13.2: + resolution: {integrity: sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==} dev: true /axe-core@4.9.1: @@ -4639,38 +4735,38 @@ packages: resolution: {integrity: sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg==} dev: true - /babel-plugin-polyfill-corejs2@0.4.11(@babel/core@7.24.9): + /babel-plugin-polyfill-corejs2@0.4.11(@babel/core@7.25.2): resolution: {integrity: sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 dependencies: - '@babel/compat-data': 7.25.2 - '@babel/core': 7.24.9 - '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.24.9) + '@babel/compat-data': 7.25.4 + '@babel/core': 7.25.2 + '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.25.2) semver: 6.3.1 transitivePeerDependencies: - supports-color dev: true - /babel-plugin-polyfill-corejs3@0.10.6(@babel/core@7.24.9): + /babel-plugin-polyfill-corejs3@0.10.6(@babel/core@7.25.2): resolution: {integrity: sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 dependencies: - '@babel/core': 7.24.9 - '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.24.9) - core-js-compat: 3.38.0 + '@babel/core': 7.25.2 + '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.25.2) + core-js-compat: 3.38.1 transitivePeerDependencies: - supports-color dev: true - /babel-plugin-polyfill-regenerator@0.6.2(@babel/core@7.24.9): + /babel-plugin-polyfill-regenerator@0.6.2(@babel/core@7.25.2): resolution: {integrity: sha512-2R25rQZWP63nGwaAswvDazbPXfrM3HwVoBXK6HcqeKrSrL/JqcC/rDcf95l4r7LXLyxDXc8uQDa064GubtCABg==} peerDependencies: '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 dependencies: - '@babel/core': 7.24.9 - '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.24.9) + '@babel/core': 7.25.2 + '@babel/helper-define-polyfill-provider': 0.6.2(@babel/core@7.25.2) transitivePeerDependencies: - supports-color dev: true @@ -4679,38 +4775,38 @@ packages: resolution: {integrity: sha512-Xj9XuRuz3nTSbaTXWv3itLOcxyF4oPD8douBBmj7U9BBC6nEBYfyOJYQMf/8PJAFotC62UY5dFfIGEPr7WswzQ==} dev: true - /babel-preset-fbjs@3.4.0(@babel/core@7.24.9): + /babel-preset-fbjs@3.4.0(@babel/core@7.25.2): resolution: {integrity: sha512-9ywCsCvo1ojrw0b+XYk7aFvTH6D9064t0RIL1rtMf3nsa02Xw41MS7sZw216Im35xj/UY0PDBQsa1brUDDF1Ow==} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.9 - '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.24.9) - '@babel/plugin-proposal-object-rest-spread': 7.20.7(@babel/core@7.24.9) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.24.9) - '@babel/plugin-syntax-flow': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.9) - '@babel/plugin-transform-arrow-functions': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-block-scoped-functions': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-block-scoping': 7.25.0(@babel/core@7.24.9) - '@babel/plugin-transform-classes': 7.25.0(@babel/core@7.24.9) - '@babel/plugin-transform-computed-properties': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-destructuring': 7.24.8(@babel/core@7.24.9) - '@babel/plugin-transform-flow-strip-types': 7.25.2(@babel/core@7.24.9) - '@babel/plugin-transform-for-of': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-function-name': 7.25.1(@babel/core@7.24.9) - '@babel/plugin-transform-literals': 7.25.2(@babel/core@7.24.9) - '@babel/plugin-transform-member-expression-literals': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-modules-commonjs': 7.24.8(@babel/core@7.24.9) - '@babel/plugin-transform-object-super': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-parameters': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-property-literals': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-react-display-name': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-react-jsx': 7.25.2(@babel/core@7.24.9) - '@babel/plugin-transform-shorthand-properties': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-spread': 7.24.7(@babel/core@7.24.9) - '@babel/plugin-transform-template-literals': 7.24.7(@babel/core@7.24.9) + '@babel/core': 7.25.2 + '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.25.2) + '@babel/plugin-proposal-object-rest-spread': 7.20.7(@babel/core@7.25.2) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.25.2) + '@babel/plugin-syntax-flow': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.25.2) + '@babel/plugin-transform-arrow-functions': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-block-scoped-functions': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-block-scoping': 7.25.0(@babel/core@7.25.2) + '@babel/plugin-transform-classes': 7.25.4(@babel/core@7.25.2) + '@babel/plugin-transform-computed-properties': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-destructuring': 7.24.8(@babel/core@7.25.2) + '@babel/plugin-transform-flow-strip-types': 7.25.2(@babel/core@7.25.2) + '@babel/plugin-transform-for-of': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-function-name': 7.25.1(@babel/core@7.25.2) + '@babel/plugin-transform-literals': 7.25.2(@babel/core@7.25.2) + '@babel/plugin-transform-member-expression-literals': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-modules-commonjs': 7.24.8(@babel/core@7.25.2) + '@babel/plugin-transform-object-super': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-parameters': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-property-literals': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-react-display-name': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-react-jsx': 7.25.2(@babel/core@7.25.2) + '@babel/plugin-transform-shorthand-properties': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-spread': 7.24.7(@babel/core@7.25.2) + '@babel/plugin-transform-template-literals': 7.24.7(@babel/core@7.25.2) babel-plugin-syntax-trailing-function-commas: 7.0.0-beta.0 transitivePeerDependencies: - supports-color @@ -4729,8 +4825,8 @@ packages: dev: true optional: true - /bare-fs@2.3.1: - resolution: {integrity: sha512-W/Hfxc/6VehXlsgFtbB5B4xFcsCl+pAh30cYhoFyXErf6oGrwjh8SwiPAdHgpmWonKuYpZgGywN0SXt7dgsADA==} + /bare-fs@2.3.3: + resolution: {integrity: sha512-7RYKL+vZVCyAsMLi5SPu7QGauGGT8avnP/HO571ndEuV4MYdGXvLhtW67FuLPeEI8EiIY7zbbRR9x7x7HU0kgw==} requiresBuild: true dependencies: bare-events: 2.4.2 @@ -5101,13 +5197,13 @@ packages: /codemirror@6.0.1(@lezer/common@1.2.1): resolution: {integrity: sha512-J8j+nZ+CdWmIeFIGXEFbFPtpiYacFMDR8GlHK3IyHQJMCaVRfGx9NT+Hxivv1ckLWPvNdZqndbr/7lVhrf/Svg==} dependencies: - '@codemirror/autocomplete': 6.17.0(@codemirror/language@6.10.2)(@codemirror/state@6.4.1)(@codemirror/view@6.29.1)(@lezer/common@1.2.1) - '@codemirror/commands': 6.6.0 + '@codemirror/autocomplete': 6.18.0(@codemirror/language@6.10.2)(@codemirror/state@6.4.1)(@codemirror/view@6.33.0)(@lezer/common@1.2.1) + '@codemirror/commands': 6.6.1 '@codemirror/language': 6.10.2 '@codemirror/lint': 6.8.1 '@codemirror/search': 6.5.6 '@codemirror/state': 6.4.1 - '@codemirror/view': 6.29.1 + '@codemirror/view': 6.33.0 transitivePeerDependencies: - '@lezer/common' dev: false @@ -5219,8 +5315,8 @@ packages: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} dev: true - /core-js-compat@3.38.0: - resolution: {integrity: sha512-75LAicdLa4OJVwFxFbQR3NdnZjNgX6ILpVcVzcC4T2smerB5lELMrJQQQoWV6TiuC/vlaFqgU2tKQx9w5s0e0A==} + /core-js-compat@3.38.1: + resolution: {integrity: sha512-JRH6gfXxGmrzF3tZ57lFx97YARxCXPaMzPo6jELZhv88pBH5VXpQ+y0znKGlFnzuaihqhLbefxSJxWJMPtfDzw==} dependencies: browserslist: 4.23.3 dev: true @@ -5306,7 +5402,7 @@ packages: postcss: ^8.4 dependencies: postcss: 8.3.0 - postcss-selector-parser: 6.1.1 + postcss-selector-parser: 6.1.2 dev: true /css-functions-list@3.2.2: @@ -5320,9 +5416,9 @@ packages: peerDependencies: postcss: ^8.4 dependencies: - '@csstools/selector-specificity': 2.2.0(postcss-selector-parser@6.1.1) + '@csstools/selector-specificity': 2.2.0(postcss-selector-parser@6.1.2) postcss: 8.3.0 - postcss-selector-parser: 6.1.1 + postcss-selector-parser: 6.1.2 postcss-value-parser: 4.2.0 dev: true @@ -5449,6 +5545,18 @@ packages: ms: 2.1.2 dev: true + /debug@4.3.7: + resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.3 + dev: true + /decamelize@1.2.0: resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} engines: {node: '>=0.10.0'} @@ -5933,13 +6041,6 @@ packages: - supports-color dev: true - /eslint-plugin-import-exports-imports-resolver@1.0.1: - resolution: {integrity: sha512-4Gqp25iQSS3k8o0/zKxymWbnDW8KIqkubrOOy67IU9Qmhmkq4AiuMXbjx9O9AhYG7Vl94ZQFBcpfwLaQkINv2w==} - dependencies: - resolve.exports: 1.1.1 - resolve.imports: 1.2.7 - dev: true - /eslint-plugin-import-newlines@1.3.4(eslint@8.40.0): resolution: {integrity: sha512-Lmf/BbK+EQKUfjKPcZpslE/KTGYlgaI8ZJ/sYzdbb3BVTg5+GmLBLHBjsUKNEVRM1SEhDTF/didtOSYKi4tSnQ==} engines: {node: '>=10.0.0'} @@ -6664,7 +6765,7 @@ packages: resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} dev: true - /graphql-config@5.1.0(@types/node@20.11.6)(graphql@15.9.0)(typescript@5.0.4): + /graphql-config@5.1.0(@types/node@20.11.6)(graphql@16.9.0)(typescript@5.0.4): resolution: {integrity: sha512-g4mNs1OZmZI+LHwRly3BbHO3mRZryyRCbmFKDGsFGde3U0F7TlIwJ0mhX1KTJlQzGQVDZDexZWnvIwodFERPvg==} engines: {node: '>= 16.0.0'} peerDependencies: @@ -6674,14 +6775,14 @@ packages: cosmiconfig-toml-loader: optional: true dependencies: - '@graphql-tools/graphql-file-loader': 8.0.1(graphql@15.9.0) - '@graphql-tools/json-file-loader': 8.0.1(graphql@15.9.0) - '@graphql-tools/load': 8.0.2(graphql@15.9.0) - '@graphql-tools/merge': 9.0.4(graphql@15.9.0) - '@graphql-tools/url-loader': 8.0.2(@types/node@20.11.6)(graphql@15.9.0) - '@graphql-tools/utils': 10.3.3(graphql@15.9.0) + '@graphql-tools/graphql-file-loader': 8.0.1(graphql@16.9.0) + '@graphql-tools/json-file-loader': 8.0.1(graphql@16.9.0) + '@graphql-tools/load': 8.0.2(graphql@16.9.0) + '@graphql-tools/merge': 9.0.4(graphql@16.9.0) + '@graphql-tools/url-loader': 8.0.2(@types/node@20.11.6)(graphql@16.9.0) + '@graphql-tools/utils': 10.3.3(graphql@16.9.0) cosmiconfig: 8.3.6(typescript@5.0.4) - graphql: 15.9.0 + graphql: 16.9.0 jiti: 1.21.6 minimatch: 4.2.3 string-env-interpolation: 1.0.1 @@ -6694,40 +6795,49 @@ packages: - utf-8-validate dev: true - /graphql-request@6.1.0(graphql@15.9.0): + /graphql-request@6.1.0(graphql@16.9.0): resolution: {integrity: sha512-p+XPfS4q7aIpKVcgmnZKhMNqhltk20hfXtkaIkTfjjmiKMJ5xrt5c743cL03y/K7y1rg3WrIC49xGiEQ4mxdNw==} peerDependencies: graphql: 14 - 16 dependencies: - '@graphql-typed-document-node/core': 3.2.0(graphql@15.9.0) + '@graphql-typed-document-node/core': 3.2.0(graphql@16.9.0) cross-fetch: 3.1.8 - graphql: 15.9.0 + graphql: 16.9.0 transitivePeerDependencies: - encoding dev: true - /graphql-tag@2.12.6(graphql@15.9.0): + /graphql-tag@2.12.6(graphql@16.9.0): resolution: {integrity: sha512-FdSNcu2QQcWnM2VNvSCCDCVS5PpPqpzgFT8+GXzqJuoDd0CBncxCY278u4mhRO7tMgo2JjgJA5aZ+nWSQ/Z+xg==} engines: {node: '>=10'} peerDependencies: graphql: ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 dependencies: - graphql: 15.9.0 + graphql: 16.9.0 tslib: 2.6.3 dev: true - /graphql-ws@5.16.0(graphql@15.9.0): + /graphql-ws@5.16.0(graphql@16.9.0): resolution: {integrity: sha512-Ju2RCU2dQMgSKtArPbEtsK5gNLnsQyTNIo/T7cZNp96niC1x0KdJNZV0TIoilceBPQwfb5itrGl8pkFeOUMl4A==} engines: {node: '>=10'} peerDependencies: graphql: '>=0.11 <=16' dependencies: - graphql: 15.9.0 + graphql: 16.9.0 dev: true - /graphql@15.9.0: - resolution: {integrity: sha512-GCOQdvm7XxV1S4U4CGrsdlEN37245eC8P9zaYCMr6K1BG0IPGy5lUwmJsEOGyl1GD6HXjOtl2keCP9asRBwNvA==} - engines: {node: '>= 10.x'} + /graphql@16.9.0: + resolution: {integrity: sha512-GGTKBX4SD7Wdb8mqeDLni2oaRGYQWjWHGKPQ24ZMnUtKfcsVoiv4uX8+LJr1K6U5VW2Lu1BwJnj7uiori0YtRw==} + engines: {node: ^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0} + + /happy-dom@15.7.3: + resolution: {integrity: sha512-w3RUaYNXFJX5LiNVhOJLK4GqCB1bFj1FvELtpon3HrN8gUpS09V0Vvm4/BBRRj7mLUE1+ch8PKv1JxEp/0IHjA==} + engines: {node: '>=18.0.0'} + dependencies: + entities: 4.5.0 + webidl-conversions: 7.0.0 + whatwg-mimetype: 3.0.0 + dev: true /har-schema@2.0.0: resolution: {integrity: sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==} @@ -6830,7 +6940,7 @@ packages: engines: {node: '>= 14'} dependencies: agent-base: 7.1.1 - debug: 4.3.5 + debug: 4.3.7 transitivePeerDependencies: - supports-color dev: true @@ -6849,7 +6959,7 @@ packages: engines: {node: '>= 14'} dependencies: agent-base: 7.1.1 - debug: 4.3.5 + debug: 4.3.7 transitivePeerDependencies: - supports-color dev: true @@ -7284,7 +7394,7 @@ packages: engines: {node: '>=10'} hasBin: true dependencies: - async: 3.2.5 + async: 3.2.6 chalk: 4.1.2 filelist: 1.0.4 minimatch: 3.1.2 @@ -7472,8 +7582,8 @@ packages: engines: {node: '>=6'} dev: true - /knip@5.27.3(@types/node@20.11.6)(typescript@5.0.4): - resolution: {integrity: sha512-X0zYs0viwENUtp+FZE2Ig6vQZYvKOz8TvuQkWSWMOXiEDoiMAF+NuDczVD9Dhupicfew0YKpYamHhKtNP+f8+g==} + /knip@5.29.2(@types/node@20.11.6)(typescript@5.0.4): + resolution: {integrity: sha512-NfJ3VDyV7gHvI4lVmr9PQCvC4lvrnTdaRMmtHIVBWB2GWWKj86uTw8Yfnp07M+fQeqOnX3AGPG8hjXHPlE1MEw==} engines: {node: '>=18.6.0'} hasBin: true peerDependencies: @@ -7694,7 +7804,7 @@ packages: /magicast@0.3.4: resolution: {integrity: sha512-TyDF/Pn36bBji9rWKHlZe+PZb6Mx5V8IHCSxk7X4aljM4e/vyDvZZYwHewdVaqiA0nb3ghfHU/6AUpDxWoER2Q==} dependencies: - '@babel/parser': 7.25.3 + '@babel/parser': 7.25.6 '@babel/types': 7.25.2 source-map-js: 1.2.0 dev: true @@ -8255,10 +8365,6 @@ packages: resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} dev: true - /pattern-key-compare@1.0.0: - resolution: {integrity: sha512-7wi8a7OFmdx4Hx31+KY9kcD7gO+MWWupXtlAx7ANqoE8Pypl501FsDAPX2tSYLOuafED82A0Mv3lzeNfn82Jlg==} - dev: true - /performance-now@2.1.0: resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} dev: true @@ -8305,7 +8411,7 @@ packages: postcss: ^8.4 dependencies: postcss: 8.3.0 - postcss-selector-parser: 6.1.1 + postcss-selector-parser: 6.1.2 dev: true /postcss-browser-comments@4.0.0(browserslist@4.23.3)(postcss@8.3.0): @@ -8398,7 +8504,7 @@ packages: '@csstools/css-parser-algorithms': 2.7.1(@csstools/css-tokenizer@2.4.1) '@csstools/css-tokenizer': 2.4.1 postcss: 8.3.0 - postcss-selector-parser: 6.1.1 + postcss-selector-parser: 6.1.2 dev: true /postcss-dir-pseudo-class@7.0.2(postcss@8.3.0): @@ -8408,7 +8514,7 @@ packages: postcss: ^8.4 dependencies: postcss: 8.3.0 - postcss-selector-parser: 6.1.1 + postcss-selector-parser: 6.1.2 dev: true /postcss-double-position-gradients@4.0.4(postcss@8.3.0): @@ -8429,7 +8535,7 @@ packages: postcss: ^8.4 dependencies: postcss: 8.3.0 - postcss-selector-parser: 6.1.1 + postcss-selector-parser: 6.1.2 dev: true /postcss-focus-within@7.0.2(postcss@8.3.0): @@ -8439,7 +8545,7 @@ packages: postcss: ^8.4 dependencies: postcss: 8.3.0 - postcss-selector-parser: 6.1.1 + postcss-selector-parser: 6.1.2 dev: true /postcss-font-variant@5.0.0(postcss@8.3.0): @@ -8516,9 +8622,9 @@ packages: peerDependencies: postcss: ^8.4 dependencies: - '@csstools/selector-specificity': 2.2.0(postcss-selector-parser@6.1.1) + '@csstools/selector-specificity': 2.2.0(postcss-selector-parser@6.1.2) postcss: 8.3.0 - postcss-selector-parser: 6.1.1 + postcss-selector-parser: 6.1.2 dev: true /postcss-normalize@10.0.1(browserslist@4.23.3)(postcss@8.3.0): @@ -8643,7 +8749,7 @@ packages: postcss: ^8.4 dependencies: postcss: 8.3.0 - postcss-selector-parser: 6.1.1 + postcss-selector-parser: 6.1.2 dev: true /postcss-replace-overflow-wrap@4.0.0(postcss@8.3.0): @@ -8658,6 +8764,10 @@ packages: resolution: {integrity: sha512-R6vHqZWgVnTAPq0C+xjyHfEZqfIYboCBVSy24MjxEDm+tIh1BU4O6o7DP7AA7kHzf136d+Qc5duI4tlpHjixDw==} dev: true + /postcss-resolve-nested-selector@0.1.6: + resolution: {integrity: sha512-0sglIs9Wmkzbr8lQwEyIzlDOOC9bGmfVKcJTaxv3vMmd3uo4o4DerC3En0bnmgceeql9BfC8hRkp7cg0fjdVqw==} + dev: true + /postcss-safe-parser@7.0.0(postcss@8.4.40): resolution: {integrity: sha512-ovehqRNVCpuFzbXoTb4qLtyzK3xn3t/CUBxOs8LsnQjQrShaB4lKiHoVqY8ANaC0hBMHq5QVWk77rwGklFUDrg==} engines: {node: '>=18.0'} @@ -8674,7 +8784,7 @@ packages: postcss: ^8.4 dependencies: postcss: 8.3.0 - postcss-selector-parser: 6.1.1 + postcss-selector-parser: 6.1.2 dev: true /postcss-selector-parser@6.1.1: @@ -8685,6 +8795,14 @@ packages: util-deprecate: 1.0.2 dev: true + /postcss-selector-parser@6.1.2: + resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} + engines: {node: '>=4'} + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + dev: true + /postcss-sorting@4.1.0: resolution: {integrity: sha512-r4T2oQd1giURJdHQ/RMb72dKZCuLOdWx2B/XhXN1Y1ZdnwXsKH896Qz6vD4tFy9xSjpKNYhlZoJmWyhH/7JUQw==} engines: {node: '>=6.14.3'} @@ -8723,11 +8841,6 @@ packages: source-map-js: 1.2.0 dev: true - /postinstall-postinstall@2.1.0: - resolution: {integrity: sha512-7hQX6ZlZXIoRiWNrbMQaLzUUfH+sSx39u8EJ9HYuDc1kLo9IXKWjM5RSquZN1ad5GnH8CGFM78fsAAQi3OKEEQ==} - requiresBuild: true - dev: true - /prebuild-install@7.1.2: resolution: {integrity: sha512-UnNke3IQb6sgarcZIDU3gbMeTp/9SSU1DAIkil7PrqG1vZlBtY5msYccSKSHDqa3hNg436IXK+SNImReuA1wEQ==} engines: {node: '>=10'} @@ -8954,7 +9067,7 @@ packages: /regenerator-transform@0.15.2: resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==} dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.25.6 dev: true /regexp.prototype.flags@1.5.2: @@ -8989,7 +9102,7 @@ packages: /relay-runtime@12.0.0: resolution: {integrity: sha512-QU6JKr1tMsry22DXNy9Whsq5rmvwr3LSZiiWV/9+DFpuTWvp+WFhobWMc8TC4OjKFfNhEZy7mOiqUAn5atQtug==} dependencies: - '@babel/runtime': 7.24.8 + '@babel/runtime': 7.25.6 fbjs: 3.0.5 invariant: 2.2.4 transitivePeerDependencies: @@ -9041,7 +9154,7 @@ packages: deprecated: request has been deprecated, see https://github.com/request/request/issues/3142 dependencies: aws-sign2: 0.7.0 - aws4: 1.13.0 + aws4: 1.13.2 caseless: 0.12.0 combined-stream: 1.0.8 extend: 3.0.2 @@ -9090,17 +9203,6 @@ packages: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} dev: true - /resolve.exports@1.1.1: - resolution: {integrity: sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ==} - engines: {node: '>=10'} - dev: true - - /resolve.imports@1.2.7: - resolution: {integrity: sha512-q+UNv8vIE8wiB3BYjN9cAEtx17TnV6PoQSBWLCWaI9DDumevUifHY5ocKL4S5qcETHm++Gia3EdNJO81IW3PaQ==} - dependencies: - pattern-key-compare: 1.0.0 - dev: true - /resolve@1.22.8: resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} hasBin: true @@ -9913,7 +10015,7 @@ packages: pump: 3.0.0 tar-stream: 3.1.7 optionalDependencies: - bare-fs: 2.3.1 + bare-fs: 2.3.3 bare-path: 2.1.3 dev: true @@ -9956,8 +10058,8 @@ packages: engines: {node: '>=18'} dev: true - /terser@5.31.3: - resolution: {integrity: sha512-pAfYn3NIZLyZpa83ZKigvj6Rn9c/vd5KfYGX7cN1mnzqgDcxWvrU5ZtAfIKhEXz9nRecw4z3LXkjaq96/qZqAA==} + /terser@5.31.6: + resolution: {integrity: sha512-PQ4DAriWzKj+qgehQ7LK5bQqCFNMmlhjR2PFFLuqGCpuCAauxemVBWwWOxo3UIwWQx8+Pr61Df++r76wDmkQBg==} engines: {node: '>=10'} hasBin: true dependencies: @@ -10349,13 +10451,13 @@ packages: resolution: {integrity: sha512-Qp95D4TPJl1kC9SKigDcqgyM2VDVO4RiJc2d4qe5GrYm+zbIQCWWKAFaJNQ4BhdFeDGwBmAxqJBwWSJDb9T3BQ==} dev: true - /urql@4.1.0(@urql/core@5.0.5)(react@18.2.0): + /urql@4.1.0(@urql/core@5.0.6)(react@18.2.0): resolution: {integrity: sha512-NfbfTvxy1sM89EQAJWm89qJZihUWk7BSMfrWgfljFXLOf+e7RK7DtV/Tbg2+82HnCG2x3LcEOJenxiFSYEC+bw==} peerDependencies: '@urql/core': ^5.0.0 react: '>= 16.8.0' dependencies: - '@urql/core': 5.0.5(graphql@15.9.0) + '@urql/core': 5.0.6(graphql@16.9.0) react: 18.2.0 wonka: 6.3.4 dev: false @@ -10404,7 +10506,7 @@ packages: hasBin: true dependencies: cac: 6.7.14 - debug: 4.3.5 + debug: 4.3.7 pathe: 1.1.2 picocolors: 1.0.1 vite: 5.0.10(@types/node@20.11.6) @@ -10586,7 +10688,7 @@ packages: fsevents: 2.3.3 dev: true - /vitest@1.2.2(@types/node@20.11.6): + /vitest@1.2.2(@types/node@20.11.6)(happy-dom@15.7.3): resolution: {integrity: sha512-d5Ouvrnms3GD9USIK36KG8OZ5bEvKEkITFtnGv56HFaSlbItJuYr7hv2Lkn903+AvRAgSixiamozUVfORUekjw==} engines: {node: ^18.0.0 || >=20.0.0} hasBin: true @@ -10622,6 +10724,7 @@ packages: chai: 4.4.1 debug: 4.3.5 execa: 8.0.1 + happy-dom: 15.7.3 local-pkg: 0.5.0 magic-string: 0.30.10 pathe: 1.1.2 @@ -10731,6 +10834,11 @@ packages: resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} dev: true + /webidl-conversions@7.0.0: + resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} + engines: {node: '>=12'} + dev: true + /whatwg-encoding@1.0.5: resolution: {integrity: sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==} dependencies: @@ -10741,6 +10849,11 @@ packages: resolution: {integrity: sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==} dev: true + /whatwg-mimetype@3.0.0: + resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==} + engines: {node: '>=12'} + dev: true + /whatwg-url@5.0.0: resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} dependencies: @@ -10836,10 +10949,10 @@ packages: engines: {node: '>=16.0.0'} dependencies: '@apideck/better-ajv-errors': 0.3.6(ajv@8.17.1) - '@babel/core': 7.24.9 - '@babel/preset-env': 7.25.3(@babel/core@7.24.9) - '@babel/runtime': 7.24.8 - '@rollup/plugin-babel': 5.3.1(@babel/core@7.24.9)(rollup@2.79.1) + '@babel/core': 7.25.2 + '@babel/preset-env': 7.25.4(@babel/core@7.25.2) + '@babel/runtime': 7.25.6 + '@rollup/plugin-babel': 5.3.1(@babel/core@7.25.2)(rollup@2.79.1) '@rollup/plugin-node-resolve': 15.2.3(rollup@2.79.1) '@rollup/plugin-replace': 2.4.2(rollup@2.79.1) '@rollup/plugin-terser': 0.4.4(rollup@2.79.1) @@ -11137,13 +11250,13 @@ packages: peerDependencies: stylelint: ^15.5.0 dependencies: - '@babel/parser': 7.25.3 - '@babel/traverse': 7.25.3 + '@babel/parser': 7.25.6 + '@babel/traverse': 7.25.6 array.prototype.flatmap: 1.3.2 jsdom: 15.2.1 option-t: 20.3.1 - postcss-resolve-nested-selector: 0.1.4 - postcss-selector-parser: 6.1.1 + postcss-resolve-nested-selector: 0.1.6 + postcss-selector-parser: 6.1.2 string-template: 1.0.0 stylelint: 16.7.0(typescript@5.0.4) transitivePeerDependencies: diff --git a/src/App/routes/SmartNavigate.tsx b/src/App/routes/SmartNavigate.tsx deleted file mode 100644 index e278fc0..0000000 --- a/src/App/routes/SmartNavigate.tsx +++ /dev/null @@ -1,49 +0,0 @@ -import { - Navigate, - type NavigateProps, - useLocation, -} from 'react-router-dom'; -import { - isDefined, - isTruthyString, -} from '@togglecorp/fujs'; - -type RouteKey = string; - -interface Props extends NavigateProps { - hashToRouteMap: Record; - forwardUnmatchedHashTo?: string; -} - -function SmartNavigate(props: Props) { - const { - hashToRouteMap, - forwardUnmatchedHashTo, - ...navigateProps - } = props; - - const location = useLocation(); - const newRoute = isTruthyString(location.hash) - ? (hashToRouteMap[location.hash] ?? forwardUnmatchedHashTo) - : undefined; - - if (isDefined(newRoute)) { - return ( - - ); - } - - return ( - - ); -} - -export default SmartNavigate; diff --git a/src/components/AvailabilityIndicator/index.tsx b/src/components/AvailabilityIndicator/index.tsx index 5773698..bf26eae 100644 --- a/src/components/AvailabilityIndicator/index.tsx +++ b/src/components/AvailabilityIndicator/index.tsx @@ -11,7 +11,7 @@ import { import styles from './styles.module.css'; -export interface Props { +interface Props { className?: string; wfhType: JournalWorkFromHomeTypeEnum | null | undefined; leaveType: JournalLeaveTypeEnum | null | undefined; diff --git a/src/components/CalendarInput/index.tsx b/src/components/CalendarInput/index.tsx index d784301..aa88e71 100644 --- a/src/components/CalendarInput/index.tsx +++ b/src/components/CalendarInput/index.tsx @@ -10,7 +10,7 @@ import MonthlyCalendar from '#components/MonthlyCalendar'; import styles from './styles.module.css'; -export interface Props extends Omit, 'onClick' | 'onChange'> { +interface Props extends Omit, 'onClick' | 'onChange'> { value: string | undefined, onChange: (value: string | undefined) => void; } diff --git a/src/components/DateInput/index.tsx b/src/components/DateInput/index.tsx deleted file mode 100644 index 287c568..0000000 --- a/src/components/DateInput/index.tsx +++ /dev/null @@ -1,63 +0,0 @@ -import { useId } from 'react'; - -import InputContainer, { Props as InputContainerProps } from '#components/InputContainer'; -import RawInput, { Props as RawInputProps } from '#components/RawInput'; - -type InheritedProps = (Omit & Omit, 'id'>); -export interface Props extends InheritedProps { - inputElementRef?: React.RefObject; - inputClassName?: string; -} - -function DateInput(props: Props) { - const { - className, - actions, - icons, - hint, - label, - disabled, - readOnly, - inputClassName, - withAsterisk, - inputSectionClassName, - labelClassName, - required, - variant, - inputElementRef, - ...otherInputProps - } = props; - - const inputId = useId(); - - return ( - - )} - /> - ); -} - -export default DateInput; diff --git a/src/components/Link/index.tsx b/src/components/Link/index.tsx index d86b5aa..ff8c25b 100644 --- a/src/components/Link/index.tsx +++ b/src/components/Link/index.tsx @@ -30,7 +30,7 @@ import { type WrappedRoutes } from '../../App/routes'; import styles from './styles.module.css'; -export interface UrlParams { +interface UrlParams { [key: string]: string | number | null | undefined; } diff --git a/src/components/NumberInput/index.tsx b/src/components/NumberInput/index.tsx deleted file mode 100644 index 6226023..0000000 --- a/src/components/NumberInput/index.tsx +++ /dev/null @@ -1,106 +0,0 @@ -import { - useCallback, - useEffect, - useId, - useState, -} from 'react'; -import { - isDefined, - isNotDefined, -} from '@togglecorp/fujs'; - -import InputContainer, { Props as InputContainerProps } from '#components/InputContainer'; -import RawInput, { Props as RawInputProps } from '#components/RawInput'; - -type InheritedProps = (Omit & Omit, 'onChange' | 'value' | 'id'>); - -export interface Props extends InheritedProps { - inputElementRef?: React.RefObject; - inputClassName?: string; - value: number | undefined | null; - onChange?: ( - value: number | undefined, - name: T, - e?: React.FormEvent | undefined, - ) => void; -} - -function NumberInput(props: Props) { - const { - className, - actions, - inputSectionClassName, - icons, - hint, - label, - disabled, - readOnly, - inputClassName, - value: valueFromProps, - withAsterisk, - labelClassName, - required, - variant, - onChange, - inputElementRef, - ...otherInputProps - } = props; - - const inputId = useId(); - - const [tempValue, setTempValue] = useState(String(valueFromProps ?? '')); - - useEffect(() => { - setTempValue(String(valueFromProps ?? '')); - }, [valueFromProps]); - - const handleChange: RawInputProps['onChange'] = useCallback((v, n, e) => { - setTempValue(v); - - if (isNotDefined(onChange)) { - return; - } - - if (isDefined(v)) { - const floatValue = +v; - if (!Number.isNaN(floatValue)) { - onChange(floatValue, n, e); - } - } else { - onChange(undefined, n, e); - } - }, [onChange]); - - return ( - - )} - /> - ); -} - -export default NumberInput; diff --git a/src/components/RadioInput/index.tsx b/src/components/RadioInput/index.tsx index a6230ca..64feaf8 100644 --- a/src/components/RadioInput/index.tsx +++ b/src/components/RadioInput/index.tsx @@ -10,7 +10,7 @@ import Radio, { Props as RadioProps } from './Radio'; import styles from './styles.module.css'; -export interface BaseProps> { +interface BaseProps> { className?: string; options: O[] | undefined; name: N; @@ -42,7 +42,7 @@ type ClearableProps = { onChange: (value: V | undefined, name: N) => void; } -export type Props, OMISSION extends string> = ( +type Props, OMISSION extends string> = ( Omit, OMISSION> & ( Omit, OMISSION> diff --git a/src/contexts/localStorage.tsx b/src/contexts/localStorage.tsx index 6c1ab2c..dea5b17 100644 --- a/src/contexts/localStorage.tsx +++ b/src/contexts/localStorage.tsx @@ -4,7 +4,7 @@ import { PutNull } from '#utils/common'; import { defaultConfigValue } from '#utils/constants'; import { ConfigStorage } from '#utils/types'; -export type StoredValue = { +type StoredValue = { value?: PutNull; defaultValue: VALUE; }; diff --git a/src/hooks/useFormattedRelativeTime.ts b/src/hooks/useFormattedRelativeTime.ts deleted file mode 100644 index ec55882..0000000 --- a/src/hooks/useFormattedRelativeTime.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { - useCallback, - useEffect, - useRef, - useState, -} from 'react'; -import { - isDefined, - isNotDefined, -} from '@togglecorp/fujs'; - -import { - formatRelativeTimeToString, - RelativeTime, - toRelativeTime, -} from '#utils/temporal'; - -function useFormattedRelativeTime(timestamp: number | undefined) { - const [relativeTime, setRelativeTime] = useState( - () => (isDefined(timestamp) ? toRelativeTime(timestamp) : undefined), - ); - - const updateTimeoutRef = useRef(); - - const update = useCallback(() => { - if (isDefined(timestamp)) { - setRelativeTime(toRelativeTime(timestamp)); - } - }, [timestamp]); - - useEffect(update, [update]); - - useEffect(() => { - window.clearTimeout(updateTimeoutRef.current); - if (isNotDefined(relativeTime)) { - return; - } - - const timeoutDuration = relativeTime.resolution === 'second' - ? (2000 + (500 * relativeTime.value)) - : (1000 * 60); - - updateTimeoutRef.current = window.setTimeout(update, timeoutDuration); - }, [relativeTime, update]); - - return isDefined(relativeTime) - ? formatRelativeTimeToString(relativeTime) - : 'never'; -} - -export default useFormattedRelativeTime; diff --git a/src/hooks/useRouting.ts b/src/hooks/useRouting.ts deleted file mode 100644 index 45a992e..0000000 --- a/src/hooks/useRouting.ts +++ /dev/null @@ -1,73 +0,0 @@ -import { - useCallback, - useContext, -} from 'react'; -import { - type NavigateOptions, - useLocation, - useNavigate, -} from 'react-router-dom'; - -import { - resolvePath, - UrlParams, -} from '#components/Link'; -import RouteContext from '#contexts/route'; - -import { type WrappedRoutes } from '../App/routes'; - -function useRouting() { - const location = useLocation(); - const navigateFromLib = useNavigate(); - const routes = useContext(RouteContext); - - const historyEntryExist = location.key !== 'default'; - - const navigate = useCallback( - ( - path: keyof WrappedRoutes, - options?: { - params?: UrlParams, - search?: string, - hash?: string, - }, - otherOptions?: NavigateOptions, - ) => { - const { resolvedPath } = resolvePath( - path, - routes, - options?.params, - ); - navigateFromLib({ - pathname: resolvedPath, - search: options?.search, - hash: options?.hash, - }, otherOptions); - }, - [navigateFromLib, routes], - ); - - const goBack = useCallback( - ( - fallbackPath: keyof WrappedRoutes = 'home', - options: { - params?: UrlParams, - search?: string, - hash?: string, - } = {}, - ) => { - if (historyEntryExist) { - navigateFromLib(-1); - } else if (fallbackPath) { - navigate(fallbackPath, options); - } else { - navigateFromLib('/'); - } - }, - [historyEntryExist, navigateFromLib, navigate], - ); - - return { navigate, goBack }; -} - -export default useRouting; diff --git a/src/hooks/useSizeTracking.ts b/src/hooks/useSizeTracking.ts deleted file mode 100644 index 709a894..0000000 --- a/src/hooks/useSizeTracking.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { - useEffect, - useState, -} from 'react'; -import { isDefined } from '@togglecorp/fujs'; - -import useDebouncedValue from '#hooks/useDebouncedValue'; - -function useSizeTracking(ref: React.RefObject, disabled = false) { - const [size, setSize] = useState(() => { - const bcr = ref.current?.getBoundingClientRect(); - - return { - width: bcr?.width ?? 0, - height: bcr?.height ?? 0, - }; - }); - - useEffect(() => { - const resizeObserver = new ResizeObserver((entries) => { - const entry = entries.at(0); - const contentRect = entry?.contentRect; - - if (contentRect) { - setSize({ - width: contentRect.width, - height: contentRect.height, - }); - } - }); - - const el = ref.current; - if (!disabled && isDefined(el)) { - resizeObserver.observe(el); - } - - return () => { - if (!disabled && isDefined(el)) { - resizeObserver.unobserve(el); - } - }; - }, [disabled, ref]); - - return useDebouncedValue(size); -} - -export default useSizeTracking; diff --git a/src/utils/colors.ts b/src/utils/colors.ts deleted file mode 100644 index bfced1e..0000000 --- a/src/utils/colors.ts +++ /dev/null @@ -1,137 +0,0 @@ -import { isNotDefined } from '@togglecorp/fujs'; - -import { isCallable } from '#utils/common'; - -export function hexToRgb(hex: string) { - return { - r: +`0x${hex[1]}${hex[2]}`, - g: +`0x${hex[3]}${hex[4]}`, - b: +`0x${hex[5]}${hex[6]}`, - }; -} - -export function hex255(n: number) { - return n.toString(16).padStart(2, '0'); -} - -export function rgbToHex(rgb: { r: number, g: number, b: number }) { - const { r, g, b } = rgb; - - return `#${hex255(r)}${hex255(g)}${hex255(b)}`; -} - -export function hslToRgb(hsl: { h: number, s: number, l: number }) { - const { h, s, l } = hsl; - - if (h === 0) { - const v = Math.round(l * 255); - return { - r: v, - g: v, - b: v, - }; - } - - const c = (1 - Math.abs(2 * l - 1)) * s; - const x = c * (1 - Math.abs(((h / 60) % 2) - 1)); - const m = l - c / 2; - - const lookUps = [ - [c, x, 0], - [x, c, 0], - [0, c, x], - [0, x, c], - [x, 0, c], - [c, 0, x], - ]; - - const i = Math.ceil(h / 60) - 1; - const [rp, gp, bp] = lookUps[i]; - - return { - r: Math.round((rp + m) * 255), - g: Math.round((gp + m) * 255), - b: Math.round((bp + m) * 255), - }; -} - -function getHue(r: number, g: number, b: number, max: number, diff: number) { - if (r === max) { - const hue = 60 * ((g - b) / diff); - if (hue > 0) { - return hue; - } - - return 360 + hue; - } - - if (g === max) { - return 60 * (2 + (b - r) / diff); - } - - if (b === max) { - return 60 * (4 + (r - g) / diff); - } - - return 0; -} - -function hexToHsl(hex: string) { - const c = hexToRgb(hex); - const r = c.r / 255; - const g = c.g / 255; - const b = c.b / 255; - - const min = Math.min(r, g, b); - const max = Math.max(r, g, b); - const diff = max - min; - const sum = max + min; - const l = sum / 2; - - if (diff === 0) { - return { h: 0, s: 0, l }; - } - - const s = diff / Math.abs(1 - (2 * l - 1)); - const h = getHue(r, g, b, max, diff); - return { h, s, l }; -} - -export function interpolate255(a: number, b: number, factor: number) { - return Math.min(Math.round(a + (b - a) * factor), 255); -} - -export function interpolateHexColor(ha: string, hb: string, factor: number) { - const ca = hexToRgb(ha); - const cb = hexToRgb(hb); - - const r = hex255(interpolate255(ca.r, cb.r, factor)); - const g = hex255(interpolate255(ca.g, cb.g, factor)); - const b = hex255(interpolate255(ca.b, cb.b, factor)); - - return `#${r}${g}${b}`; -} - -type Callable = T | ((t1: T, t2: T) => T); -export function resolveCallable(callable: Callable, arg1: T, arg2: T) { - if (!isCallable(callable)) { - return callable; - } - - return callable(arg1, arg2); -} - -export function modifyHexSL(hex: string, s?: Callable, l?: Callable) { - if (isNotDefined(s) && isNotDefined(l)) { - return hex; - } - - const hsl = hexToHsl(hex); - const rgb = hslToRgb({ - h: hsl.h, - s: Math.min(hsl.s * resolveCallable(s ?? 1, hsl.s, hsl.l), 1), - l: Math.min(hsl.l * resolveCallable(l ?? 1, hsl.l, hsl.s), 1), - }); - - return rgbToHex(rgb); -} diff --git a/src/utils/common.ts b/src/utils/common.ts index c0b96e9..82b6e8c 100644 --- a/src/utils/common.ts +++ b/src/utils/common.ts @@ -350,7 +350,7 @@ export function putNull(value: T) { return copy as PutNull; } -export type PutUndefined = { +type PutUndefined = { [key in keyof T]: T[key] extends null ? undefined : T[key]; } export function putUndefined(value: T) { diff --git a/src/utils/resolveUrl.ts b/src/utils/resolveUrl.ts deleted file mode 100644 index 8c6880a..0000000 --- a/src/utils/resolveUrl.ts +++ /dev/null @@ -1,9 +0,0 @@ -// eslint-disable-next-line import/prefer-default-export -export function resolveUrl(from: string, to: string) { - const resolvedUrl = new URL(to, new URL(from, 'resolve://')); - if (resolvedUrl.protocol === 'resolve:') { - const { pathname, search, hash } = resolvedUrl; - return pathname + search + hash; - } - return resolvedUrl.toString(); -} diff --git a/src/utils/temporal.ts b/src/utils/temporal.ts index e96d8a6..80e830b 100644 --- a/src/utils/temporal.ts +++ b/src/utils/temporal.ts @@ -1,11 +1,5 @@ import { isNotDefined } from '@togglecorp/fujs'; -export interface RelativeTime { - direction: 'past' | 'present' | 'future', - resolution: 'second' | 'minute' | 'hour' | 'day'; - value: number; -} - export interface RelativeDate { direction: 'past' | 'present' | 'future', resolution: 'day' | 'week' | 'month' | 'year'; @@ -14,22 +8,14 @@ export interface RelativeDate { export type DateLike = string | number | Date; -export function incrementDate(date: Date, days = 1) { +function incrementDate(date: Date, days = 1) { const newDate = new Date(date); newDate.setDate(date.getDate() + days); newDate.setHours(0, 0, 0, 0); return newDate; } -export function incrementMonth(date: Date, months = 1) { - const newDate = new Date(date); - newDate.setDate(1); - newDate.setMonth(date.getMonth() + months); - newDate.setHours(0, 0, 0, 0); - return newDate; -} - -export function getNumberOfDays(start: Date, end: Date) { +function getNumberOfDays(start: Date, end: Date) { const startDate = new Date(start); startDate.setHours(0, 0, 0, 0); @@ -44,7 +30,7 @@ export function getNumberOfDays(start: Date, end: Date) { return numDays; } -export function getNumberOfMonths(start: Date, end: Date) { +function getNumberOfMonths(start: Date, end: Date) { const monthDiff = Math.abs( ((12 * end.getFullYear()) + end.getMonth()) - ((12 * start.getFullYear()) + start.getMonth()), @@ -52,7 +38,7 @@ export function getNumberOfMonths(start: Date, end: Date) { return monthDiff; } -export function getTemporalDiff(min: DateLike, max: DateLike) { +function getTemporalDiff(min: DateLike, max: DateLike) { const minDate = new Date(min); const maxDate = new Date(max); @@ -160,72 +146,3 @@ export function formatRelativeDateToString(relativeDate: RelativeDate | undefine return value === 1 ? `In a ${resolution}` : `In ${value} ${resolution}s`; } - -export function toRelativeTime(timestamp: number): RelativeTime { - const now = Date.now(); - const diff = now - timestamp; - - if (diff === 0) { - return { - direction: 'present', - resolution: 'second', - value: 0, - }; - } - - const direction = diff < 0 ? 'future' : 'past'; - const absDiff = Math.abs(diff); - - const seconds = Math.floor((absDiff / 1000) % 60); - const minutes = Math.floor((absDiff / (1000 * 60)) % 60); - const hours = Math.floor((absDiff / (1000 * 60 * 60)) % 24); - const days = Math.floor(absDiff / (1000 * 60 * 60 * 24)); - - if (days > 0) { - return { - direction, - resolution: 'day', - value: days, - }; - } - - if (hours > 0) { - return { - direction, - resolution: 'hour', - value: hours, - }; - } - - if (minutes > 0) { - return { - direction, - resolution: 'minute', - value: minutes, - }; - } - - return { - direction, - resolution: 'second', - value: Math.max(1, seconds), - }; -} - -export function formatRelativeTimeToString(relativeTime: RelativeTime) { - const { - direction, - resolution, - value, - } = relativeTime; - - if (direction === 'present') { - return 'now'; - } - - if (direction === 'past') { - return value === 1 ? `A ${resolution} ago` : `${value} ${resolution}s ago`; - } - - return value === 1 ? `In a ${resolution}` : `In ${value} ${resolution}s`; -} diff --git a/src/utils/types.ts b/src/utils/types.ts index 5ee4a48..f9f0a07 100644 --- a/src/utils/types.ts +++ b/src/utils/types.ts @@ -16,20 +16,12 @@ export type SpacingVariant = 'xs' | 'sm' | 'md' | 'lg' | 'xl'; export type EditingMode = 'normal' | 'vim'; export type Task = EnumsQuery['private']['allActiveTasks'][number]; -export type Contract = Task['contract']; -export type Project = Contract['project']; type WorkItemType = TimeEntryTypeEnum; export type WorkItemStatus = TimeEntryStatusEnum; export type WorkItem = Omit & { clientId: string }; -export interface Note { - id: string; - date: string; - content: string | undefined; -} - export type DailyJournalAttributeKeys = 'project' | 'contract' | 'task' | 'status'; export interface DailyJournalAttributeOrder { key: DailyJournalAttributeKeys; diff --git a/src/views/DailyJournal/DayView/WorkItemRow/index.tsx b/src/views/DailyJournal/DayView/WorkItemRow/index.tsx index da0de34..f00888f 100644 --- a/src/views/DailyJournal/DayView/WorkItemRow/index.tsx +++ b/src/views/DailyJournal/DayView/WorkItemRow/index.tsx @@ -82,7 +82,7 @@ function defaultColorSelector(_: T, i: number): [string, string] { return colorscheme[i % colorscheme.length]; } -export interface Props { +interface Props { className?: string; workItem: WorkItem; contractId: string; diff --git a/src/views/DailyJournal/index.tsx b/src/views/DailyJournal/index.tsx index d57ec19..9060cd9 100644 --- a/src/views/DailyJournal/index.tsx +++ b/src/views/DailyJournal/index.tsx @@ -132,6 +132,7 @@ const BULK_TIME_ENTRY_MUTATION = gql` // TODO: Do not use JSON.stringify for comparison // TODO: use filtered localState instead of workItems +/** @knipignore */ // eslint-disable-next-line import/prefer-default-export export function Component() { const [workItems, setWorkItems] = useState([]); diff --git a/src/views/DailyStandup/index.tsx b/src/views/DailyStandup/index.tsx index 81c56ed..42dab77 100644 --- a/src/views/DailyStandup/index.tsx +++ b/src/views/DailyStandup/index.tsx @@ -96,6 +96,7 @@ const ALL_PROJECTS_AND_EVENTS_QUERY = gql` } `; +/** @knipignore */ // eslint-disable-next-line import/prefer-default-export export function Component() { const { date: dateFromParams } = useParams<{ date: string | undefined}>(); diff --git a/src/views/Home/index.tsx b/src/views/Home/index.tsx index 564068f..7144cea 100644 --- a/src/views/Home/index.tsx +++ b/src/views/Home/index.tsx @@ -20,6 +20,7 @@ import RouteContext from '#contexts/route'; import styles from './styles.module.css'; +/** @knipignore */ // eslint-disable-next-line import/prefer-default-export export function Component() { const routes = useContext(RouteContext); diff --git a/src/views/Settings/index.tsx b/src/views/Settings/index.tsx index c8178ef..01032e5 100644 --- a/src/views/Settings/index.tsx +++ b/src/views/Settings/index.tsx @@ -53,6 +53,7 @@ function defaultColorSelector(_: T, i: number): [string, string] { return colorscheme[i % colorscheme.length]; } +/** @knipignore */ // eslint-disable-next-line import/prefer-default-export export function Component() { const { enums } = useContext(EnumsContext); diff --git a/vite.config.ts b/vite.config.ts index 422e6a2..41b66f1 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -1,15 +1,20 @@ import { ValidateEnv as validateEnv } from '@julr/vite-plugin-validate-env'; -import { type HtmlTagDescriptor, defineConfig, loadEnv } from 'vite'; -import tsconfigPaths from 'vite-tsconfig-paths'; -import webfontDownload from 'vite-plugin-webfont-dl'; +import basicSsl from '@vitejs/plugin-basic-ssl'; import reactSwc from '@vitejs/plugin-react-swc'; import { execSync } from 'child_process'; import { visualizer } from 'rollup-plugin-visualizer'; +import { + defineConfig, + type HtmlTagDescriptor, + loadEnv, + type UserConfig, +} from 'vite'; import checker from 'vite-plugin-checker'; import { compression } from 'vite-plugin-compression2'; -import svgr from 'vite-plugin-svgr'; import { VitePWA } from 'vite-plugin-pwa'; -import basicSsl from '@vitejs/plugin-basic-ssl'; +import svgr from 'vite-plugin-svgr'; +import webfontDownload from 'vite-plugin-webfont-dl'; +import tsconfigPaths from 'vite-tsconfig-paths'; import envConfig from './env'; @@ -18,7 +23,7 @@ const commitHash = execSync('git rev-parse --short HEAD').toString(); function umamiPlugin(options: { id: string | undefined, src: string | undefined }) { return { - name: "html-transform", + name: 'html-transform', transformIndexHtml: () => { if (!options.id || !options.src) { console.warn('Umami src and id not set.'); @@ -28,24 +33,24 @@ function umamiPlugin(options: { id: string | undefined, src: string | undefined { tag: 'script', attrs: { - 'async': true, - 'defer': true, + async: true, + defer: true, 'data-website-id': options.id, - 'src': options.src, + src: options.src, }, - } + }, ]; return tags; }, }; -}; +} export default defineConfig(({ mode }) => { const isProd = mode === 'production'; console.log('Mode:', mode); - const env = loadEnv(mode, process.cwd(), '') + const env = loadEnv(mode, process.cwd(), ''); - return { + const config: UserConfig = { define: { 'import.meta.env.APP_COMMIT_HASH': JSON.stringify(commitHash), 'import.meta.env.APP_VERSION': JSON.stringify(env.npm_package_version), @@ -106,7 +111,6 @@ export default defineConfig(({ mode }) => { port: 3000, host: 'local.timur.dev.togglecorp.com', strictPort: true, - https: true, }, build: { outDir: './build', @@ -123,8 +127,8 @@ export default defineConfig(({ mode }) => { '@uiw/codemirror-theme-github', '@uiw/react-codemirror', ], - 'codemirror-vim-mode': ['@replit/codemirror-vim'] - } + 'codemirror-vim-mode': ['@replit/codemirror-vim'], + }, }, }, }, @@ -136,4 +140,5 @@ export default defineConfig(({ mode }) => { }, }, }; + return config; }); From b51113cfda06570aa2ad82396e61e0dec8fd6942 Mon Sep 17 00:00:00 2001 From: tnagorra Date: Fri, 6 Sep 2024 18:33:58 +0545 Subject: [PATCH 05/10] Show office for half day leave and wfh --- .../AvailabilityIndicator/index.tsx | 49 +++++++++++++------ .../AvailabilityIndicator/styles.module.css | 2 +- 2 files changed, 34 insertions(+), 17 deletions(-) diff --git a/src/components/AvailabilityIndicator/index.tsx b/src/components/AvailabilityIndicator/index.tsx index bf26eae..37af994 100644 --- a/src/components/AvailabilityIndicator/index.tsx +++ b/src/components/AvailabilityIndicator/index.tsx @@ -1,6 +1,7 @@ import { FcHome, FcLandscape, + FcOrganization, } from 'react-icons/fc'; import { _cs } from '@togglecorp/fujs'; @@ -33,27 +34,43 @@ function AvailabilityIndicator(props: Props) { return <>{fallback}; } - const wfhContent = !!wfhType && ; - const leaveContent = !!leaveType && ; + const wfhContent = ; + const leaveContent = ; + const officeContent = ; - let content = ( - <> - {leaveContent} - {wfhContent} - - ); - if (leaveType === 'SECOND_HALF') { - content = ( - <> - {wfhContent} - {leaveContent} - - ); + let firstContent; + let secondContent; + + if (wfhType === 'FULL') { + firstContent = wfhContent; + secondContent = null; + } else if (leaveType === 'FULL') { + firstContent = leaveContent; + secondContent = null; + } else if (wfhType === 'FIRST_HALF' && leaveType === 'SECOND_HALF') { + firstContent = wfhContent; + secondContent = leaveContent; + } else if (leaveType === 'FIRST_HALF' && wfhType === 'SECOND_HALF') { + firstContent = leaveContent; + secondContent = wfhContent; + } else if (wfhType === 'FIRST_HALF') { + firstContent = wfhContent; + secondContent = officeContent; + } else if (wfhType === 'SECOND_HALF') { + firstContent = officeContent; + secondContent = wfhContent; + } else if (leaveType === 'FIRST_HALF') { + firstContent = leaveContent; + secondContent = officeContent; + } else if (leaveType === 'SECOND_HALF') { + firstContent = officeContent; + secondContent = leaveContent; } return (
- {content} + {firstContent} + {secondContent}
); } diff --git a/src/components/AvailabilityIndicator/styles.module.css b/src/components/AvailabilityIndicator/styles.module.css index c7b6888..fce943d 100644 --- a/src/components/AvailabilityIndicator/styles.module.css +++ b/src/components/AvailabilityIndicator/styles.module.css @@ -1,4 +1,4 @@ .indicator { display: inline-flex; - gap: var(--spacing-xs); + gap: var(--spacing-2xs); } From ef0d21c8279d48f0fa4ebc8664244b8713661418 Mon Sep 17 00:00:00 2001 From: tnagorra Date: Fri, 6 Sep 2024 20:00:45 +0545 Subject: [PATCH 06/10] Add context for date --- src/App/index.tsx | 81 ++++++++++++++----- src/components/CalendarInput/index.tsx | 11 ++- src/components/Dialog/index.tsx | 4 +- src/components/Dialog/styles.module.css | 2 + src/components/DisplayPicture/index.tsx | 1 + src/components/MonthlyCalendar/index.tsx | 7 +- src/components/Popup/index.tsx | 22 ----- src/components/Popup/styles.module.css | 23 ------ src/components/RadioInput/index.tsx | 2 - src/components/SelectInputContainer/index.tsx | 24 ------ src/contexts/date.tsx | 20 +++++ src/utils/common.ts | 1 + src/utils/constants.ts | 1 + .../DailyJournal/AvailabilityDialog/index.tsx | 2 + .../DayView/WorkItemRow/index.tsx | 10 +-- src/views/DailyJournal/StartSidebar/index.tsx | 8 +- src/views/DailyJournal/index.tsx | 28 +++---- src/views/DailyStandup/index.tsx | 18 ++--- src/views/Home/index.tsx | 14 ++-- 19 files changed, 139 insertions(+), 140 deletions(-) create mode 100644 src/contexts/date.tsx diff --git a/src/App/index.tsx b/src/App/index.tsx index a468821..c350438 100644 --- a/src/App/index.tsx +++ b/src/App/index.tsx @@ -10,12 +10,16 @@ import { RouterProvider, } from 'react-router-dom'; import * as Sentry from '@sentry/react'; -import { listToMap } from '@togglecorp/fujs'; +import { + encodeDate, + listToMap, +} from '@togglecorp/fujs'; import { gql, useQuery, } from 'urql'; +import DateContext from '#contexts/date'; import EnumsContext, { EnumsContextProps } from '#contexts/enums'; import LocalStorageContext, { LocalStorageContextProps } from '#contexts/localStorage'; import NavbarContext, { NavbarContextProps } from '#contexts/navbar'; @@ -108,9 +112,44 @@ const sentryCreateBrowserRouter = Sentry.wrapCreateBrowserRouter( const router = sentryCreateBrowserRouter(unwrappedRoutes); function App() { - const [userAuth, setUserAuth] = useState(); - const [size, setSize] = useState(getWindowSize); - const [ready, setReady] = useState(false); + // Date + + const [date, setDate] = useState(() => { + const today = new Date(); + return { + fullDate: encodeDate(today), + year: today.getFullYear(), + month: today.getMonth(), + day: today.getDate(), + }; + }); + + useEffect( + () => { + const timeout = window.setInterval( + () => { + setDate((oldValue) => { + const today = new Date(); + const newDateString = encodeDate(today); + if (oldValue.fullDate === newDateString) { + return oldValue; + } + return { + fullDate: newDateString, + year: today.getFullYear(), + month: today.getMonth(), + day: today.getDate(), + }; + }); + }, + 2000, + ); + return () => { + window.clearInterval(timeout); + }; + }, + [], + ); // Local Storage @@ -127,6 +166,7 @@ function App() { // Device Size + const [size, setSize] = useState(getWindowSize); const throttledSize = useThrottledValue(size); useEffect(() => { function handleResize() { @@ -142,6 +182,9 @@ function App() { // Authentication + const [userAuth, setUserAuth] = useState(); + const [ready, setReady] = useState(false); + const [meResult] = useQuery( { query: ME_QUERY }, ); @@ -227,20 +270,22 @@ function App() { return ( - - - - - - - - - - - + + + + + + + + + + + + + ); } diff --git a/src/components/CalendarInput/index.tsx b/src/components/CalendarInput/index.tsx index aa88e71..1e9bf87 100644 --- a/src/components/CalendarInput/index.tsx +++ b/src/components/CalendarInput/index.tsx @@ -1,12 +1,13 @@ import { useCallback, + useContext, useState, } from 'react'; -import { isDefined } from '@togglecorp/fujs'; import Button, { Props as ButtonProps } from '#components//Button'; import Dialog from '#components/Dialog'; import MonthlyCalendar from '#components/MonthlyCalendar'; +import DateContext from '#contexts/date'; import styles from './styles.module.css'; @@ -23,6 +24,7 @@ function CalendarInput(props: Props) { } = props; const [confirmationShown, setConfirmationShown] = useState(false); + const { year, month } = useContext(DateContext); const handleModalOpen = useCallback( () => { @@ -46,9 +48,6 @@ function CalendarInput(props: Props) { [onChange], ); - const today = new Date(); - const selectedDate = isDefined(value) ? new Date(value) : today; - return ( <> )} - {/* !readOnly && ( - - ) */} )} input={( diff --git a/src/contexts/date.tsx b/src/contexts/date.tsx new file mode 100644 index 0000000..935e004 --- /dev/null +++ b/src/contexts/date.tsx @@ -0,0 +1,20 @@ +import { createContext } from 'react'; +import { encodeDate } from '@togglecorp/fujs'; + +interface DateContextType { + fullDate: string, + year: number, + month: number, + day: number, +} + +const today = new Date(); + +const DateContext = createContext({ + fullDate: encodeDate(today), + year: today.getFullYear(), + month: today.getMonth(), + day: today.getDate(), +}); + +export default DateContext; diff --git a/src/utils/common.ts b/src/utils/common.ts index 82b6e8c..5829791 100644 --- a/src/utils/common.ts +++ b/src/utils/common.ts @@ -36,6 +36,7 @@ function squash(items: T[]): T | undefined { if (items.length <= 1) { return items[0]; } + // NOTE: We should use items.slice(1) instead return items.reduce( (acc, val) => ({ ...acc, diff --git a/src/utils/constants.ts b/src/utils/constants.ts index 0b57fbf..734e401 100644 --- a/src/utils/constants.ts +++ b/src/utils/constants.ts @@ -45,6 +45,7 @@ export const colorscheme: [string, string][] = [ ['#7d5327', '#ecdecc'], ]; +// FIXME: We should instead generate these options export const numericOptions: NumericOption[] = [ { key: 1, label: '1' }, { key: 2, label: '2' }, diff --git a/src/views/DailyJournal/AvailabilityDialog/index.tsx b/src/views/DailyJournal/AvailabilityDialog/index.tsx index 9c7378d..60413d6 100644 --- a/src/views/DailyJournal/AvailabilityDialog/index.tsx +++ b/src/views/DailyJournal/AvailabilityDialog/index.tsx @@ -174,6 +174,8 @@ function AvailabilityDialog(props: Props) { }, [date, dialogState, handleModalClose, updateAvailability], ); + + // FIXME: Use memo const formattedDate = dateFormatter.format(new Date(date)); // FIXME: Use memo diff --git a/src/views/DailyJournal/DayView/WorkItemRow/index.tsx b/src/views/DailyJournal/DayView/WorkItemRow/index.tsx index f00888f..9278c80 100644 --- a/src/views/DailyJournal/DayView/WorkItemRow/index.tsx +++ b/src/views/DailyJournal/DayView/WorkItemRow/index.tsx @@ -32,6 +32,7 @@ import DurationInput from '#components/DurationInput'; import MonthlyCalendar from '#components/MonthlyCalendar'; import SelectInput from '#components/SelectInput'; import TextArea from '#components/TextArea'; +import DateContext from '#contexts/date'; import EnumsContext from '#contexts/enums'; import SizeContext from '#contexts/size'; import { EnumsQuery } from '#generated/types/graphql'; @@ -338,10 +339,7 @@ function WorkItemRow(props: Props) { ); - const today = new Date(); - const selectedDate = isDefined(workItem.date) - ? new Date(workItem.date) - : today; + const { year, month } = useContext(DateContext); return ( <> @@ -388,8 +386,8 @@ function WorkItemRow(props: Props) { > diff --git a/src/views/DailyJournal/StartSidebar/index.tsx b/src/views/DailyJournal/StartSidebar/index.tsx index a160674..66b88f2 100644 --- a/src/views/DailyJournal/StartSidebar/index.tsx +++ b/src/views/DailyJournal/StartSidebar/index.tsx @@ -1,5 +1,6 @@ import { useCallback, + useContext, useMemo, } from 'react'; import { MdDragIndicator } from 'react-icons/md'; @@ -26,6 +27,7 @@ import { import MonthlyCalendar from '#components/MonthlyCalendar'; import RadioInput from '#components/RadioInput'; +import DateContext from '#contexts/date'; import useLocalStorage from '#hooks/useLocalStorage'; import useSetFieldValue from '#hooks/useSetFieldValue'; import { @@ -167,7 +169,7 @@ function StartSidebar(props: Props) { const setConfigFieldValue = useSetFieldValue(setStoredConfig); - const date = new Date(selectedDate); + const { year, month } = useContext(DateContext); const updateJournalGrouping = useCallback((value: number, name: 'groupLevel' | 'joinLevel') => { const oldValue = storedConfig.dailyJournalGrouping @@ -226,8 +228,8 @@ function StartSidebar(props: Props) {
diff --git a/src/views/DailyJournal/index.tsx b/src/views/DailyJournal/index.tsx index 9060cd9..e4a4e50 100644 --- a/src/views/DailyJournal/index.tsx +++ b/src/views/DailyJournal/index.tsx @@ -41,6 +41,7 @@ import CalendarInput from '#components/CalendarInput'; import Link, { resolvePath } from '#components/Link'; import Page from '#components/Page'; import Portal from '#components/Portal'; +import DateContext from '#contexts/date'; import FocusContext from '#contexts/focus'; import NavbarContext from '#contexts/navbar'; import RouteContext from '#contexts/route'; @@ -146,6 +147,7 @@ export function Component() { } = useFocusManager(); const { date: dateFromParams } = useParams<{ date: string | undefined}>(); + const { fullDate } = useContext(DateContext); // NOTE: We are opening the dialog from this parent component const dialogOpenTriggerRef = useRef<(() => void) | undefined>(); @@ -157,20 +159,18 @@ export function Component() { >(null); const selectedDate = useMemo(() => { - const today = new Date(); - if (isNotDefined(dateFromParams)) { - return encodeDate(today); + return fullDate; } const date = new Date(dateFromParams); if (Number.isNaN(date.getTime())) { - return encodeDate(today); + return fullDate; } return encodeDate(date); - }, [dateFromParams]); + }, [dateFromParams, fullDate]); useEffect( () => { @@ -186,8 +186,7 @@ export function Component() { ); const setSelectedDate = useCallback((newDateStr: string | undefined) => { - const today = encodeDate(new Date()); - const newDate = newDateStr === today ? undefined : newDateStr; + const newDate = newDateStr === fullDate ? undefined : newDateStr; const { resolvedPath } = resolvePath('dailyJournal', routes, { date: newDate }); if (isNotDefined(resolvedPath)) { @@ -195,29 +194,27 @@ export function Component() { } navigate(resolvedPath); - }, [routes, navigate]); + }, [routes, navigate, fullDate]); const getNextDay = useCallback(() => { const nextDay = addDays(selectedDate, 1); - const today = encodeDate(new Date()); - if (today === nextDay) { + if (fullDate === nextDay) { return undefined; } return nextDay; - }, [selectedDate]); + }, [selectedDate, fullDate]); const getPrevDay = useCallback(() => { const prevDay = addDays(selectedDate, -1); - const today = encodeDate(new Date()); - if (today === prevDay) { + if (fullDate === prevDay) { return undefined; } return prevDay; - }, [selectedDate]); + }, [selectedDate, fullDate]); const [storedConfig] = useLocalStorage('timur-config'); @@ -531,7 +528,7 @@ export function Component() { } else if (event.ctrlKey && event.shiftKey && event.key === 'ArrowDown') { event.preventDefault(); event.stopPropagation(); - setSelectedDate(encodeDate(new Date())); + setSelectedDate(fullDate); } else if (event.ctrlKey && event.shiftKey && event.key === '?') { event.preventDefault(); event.stopPropagation(); @@ -539,6 +536,7 @@ export function Component() { } }, [ + fullDate, selectedDate, setSelectedDate, handleAddEntryClick, diff --git a/src/views/DailyStandup/index.tsx b/src/views/DailyStandup/index.tsx index 42dab77..2d2ecb3 100644 --- a/src/views/DailyStandup/index.tsx +++ b/src/views/DailyStandup/index.tsx @@ -36,6 +36,7 @@ import { import Button from '#components/Button'; import Page from '#components/Page'; import Portal from '#components/Portal'; +import DateContext from '#contexts/date'; import NavbarContext from '#contexts/navbar'; import { AllProjectsAndEventsQuery, @@ -56,9 +57,9 @@ const dateFormatter = new Intl.DateTimeFormat( [], { year: 'numeric', - month: 'long', + month: 'short', day: 'numeric', - weekday: 'long', + weekday: 'short', }, ); @@ -100,25 +101,24 @@ const ALL_PROJECTS_AND_EVENTS_QUERY = gql` // eslint-disable-next-line import/prefer-default-export export function Component() { const { date: dateFromParams } = useParams<{ date: string | undefined}>(); + const { fullDate } = useContext(DateContext); const { midActionsRef } = useContext(NavbarContext); const contentRef = useRef(null); const selectedDate = useMemo(() => { - const today = new Date(); - if (isNotDefined(dateFromParams)) { - return encodeDate(today); + return fullDate; } const date = new Date(dateFromParams); if (Number.isNaN(date.getTime())) { - return encodeDate(today); + return fullDate; } return encodeDate(date); - }, [dateFromParams]); + }, [dateFromParams, fullDate]); const [allProjectsResponse] = useQuery< AllProjectsAndEventsQuery, @@ -300,11 +300,11 @@ export function Component() { date: otherEvent.startDate, remainingDays: getDifferenceInDays( otherEvent.startDate, - encodeDate(new Date()), + fullDate, ), })) ?? []), ].sort((a, b) => compareDate(a.date, b.date)); - }, [allProjectsResponse]); + }, [allProjectsResponse, fullDate]); return ( { - const todayStr = encodeDate(new Date()); - const newDate = dateStr === todayStr ? undefined : dateStr; + const newDate = dateStr === fullDate ? undefined : dateStr; const { resolvedPath } = resolvePath('dailyJournal', routes, { date: newDate }); if (isNotDefined(resolvedPath)) { @@ -36,9 +38,7 @@ export function Component() { } navigate(resolvedPath); - }, [navigate, routes]); - - const today = new Date(); + }, [navigate, routes, fullDate]); return (
From 216a56fe9087725b30a86ff261b3fc72988735ef Mon Sep 17 00:00:00 2001 From: tnagorra Date: Fri, 6 Sep 2024 23:07:56 +0545 Subject: [PATCH 07/10] Add attendees section in daily standup - Move deadlines section to second page in daily standup - Use screen from SizeContext --- src/components/Page/index.tsx | 10 +- src/utils/common.ts | 4 + .../DayView/WorkItemRow/index.tsx | 8 +- src/views/DailyJournal/index.tsx | 8 +- .../DailyStandup/DeadlineSection/index.tsx | 162 +++++++++++++++++ .../DeadlineSection/styles.module.css | 30 +++ src/views/DailyStandup/Slide/index.tsx | 2 +- src/views/DailyStandup/StartSection/index.tsx | 130 +++++++++++++ .../StartSection/styles.module.css | 16 ++ src/views/DailyStandup/index.tsx | 172 ++++-------------- src/views/DailyStandup/styles.module.css | 30 --- src/views/Home/index.tsx | 5 +- 12 files changed, 396 insertions(+), 181 deletions(-) create mode 100644 src/views/DailyStandup/DeadlineSection/index.tsx create mode 100644 src/views/DailyStandup/DeadlineSection/styles.module.css create mode 100644 src/views/DailyStandup/StartSection/index.tsx create mode 100644 src/views/DailyStandup/StartSection/styles.module.css diff --git a/src/components/Page/index.tsx b/src/components/Page/index.tsx index 1919561..f4778d1 100644 --- a/src/components/Page/index.tsx +++ b/src/components/Page/index.tsx @@ -55,7 +55,7 @@ function Page(props: Props) { onSwipeRight, } = props; - const { width } = useContext(SizeContext); + const { screen } = useContext(SizeContext); const [storedConfig, setStoredConfig] = useLocalStorage('timur-config'); @@ -117,11 +117,11 @@ function Page(props: Props) { !startSidebarShown && styles.startSidebarCollapsed, debouncedStartSidebarCollapsed && styles.debouncedStartSidebarCollapsed, debouncedEndSidebarCollapsed && styles.debouncedEndSidebarCollapsed, - (!endSidebarShown || width <= 900) && styles.endSidebarCollapsed, + (!endSidebarShown || screen === 'mobile') && styles.endSidebarCollapsed, startSidebarShown && !!startAsideContent && styles.startSidebarVisible, endSidebarShown && !!endAsideContent - && width > 900 + && screen === 'desktop' && styles.endSidebarVisible, className, )} @@ -160,7 +160,7 @@ function Page(props: Props) { {children}
- {endAsideContent && width > 900 && ( + {endAsideContent && screen === 'desktop' && (
- {windowWidth >= 900 && ( + {screen === 'desktop' && ( <> } /> - {windowWidth >= 900 && ( + {screen === 'desktop' && ( )} - {windowWidth >= 900 && ( + {screen === 'desktop' && (
@@ -73,7 +76,7 @@ function PageError() { variant="transparent" onClick={setFullErrorVisible} title="Toggle error detail" - actions={fullErrorVisible ? : } + actions={fullErrorVisible ? : } > {fullErrorVisible ? 'Hide details' : 'Show details'} @@ -82,7 +85,7 @@ function PageError() { } + icons={} variant="quaternary" > Go to homepage @@ -91,7 +94,7 @@ function PageError() { name={undefined} title="Reload page" onClick={handleReloadButtonClick} - icons={} + icons={} > Reload diff --git a/src/components/Checkbox/Checkmark/index.tsx b/src/components/Checkbox/Checkmark/index.tsx index e6cec75..a1aba22 100644 --- a/src/components/Checkbox/Checkmark/index.tsx +++ b/src/components/Checkbox/Checkmark/index.tsx @@ -1,8 +1,8 @@ import { - IoCheckbox, - IoCreate, - IoSquareOutline, -} from 'react-icons/io5'; + RiCheckboxBlankLine, + RiCheckboxFill, + RiCheckboxIndeterminateFill, +} from 'react-icons/ri'; export interface CheckmarkProps { className?: string; @@ -20,13 +20,13 @@ function Checkmark(props: CheckmarkProps) { return ( <> {indeterminate && ( - + )} {value && !indeterminate && ( - + )} {!value && !indeterminate && ( - + )} ); diff --git a/src/components/Dialog/index.tsx b/src/components/Dialog/index.tsx index ab36463..2b38bc7 100644 --- a/src/components/Dialog/index.tsx +++ b/src/components/Dialog/index.tsx @@ -5,7 +5,7 @@ import { useMemo, useRef, } from 'react'; -import { IoCloseSharp } from 'react-icons/io5'; +import { RiCloseLine } from 'react-icons/ri'; import { _cs } from '@togglecorp/fujs'; import Button from '#components/Button'; @@ -107,7 +107,7 @@ function Dialog(props: Props) { title="Close dialog" variant="transparent" > - +
diff --git a/src/components/DropdownMenu/index.tsx b/src/components/DropdownMenu/index.tsx index a81ef6a..c87ebf3 100644 --- a/src/components/DropdownMenu/index.tsx +++ b/src/components/DropdownMenu/index.tsx @@ -6,9 +6,9 @@ import { useState, } from 'react'; import { - IoCaretDown, - IoCaretUp, -} from 'react-icons/io5'; + RiArrowDropDownLine, + RiArrowDropUpLine, +} from 'react-icons/ri'; import { _cs } from '@togglecorp/fujs'; import Button, { Props as ButtonProps } from '#components/Button'; @@ -126,8 +126,8 @@ function DropdownMenu(props: Props) { <> {actions} {!withoutDropdownIcon && (showDropdown - ? - : + ? + : )} ) : undefined} diff --git a/src/components/Link/index.tsx b/src/components/Link/index.tsx index ff8c25b..5b0e4d4 100644 --- a/src/components/Link/index.tsx +++ b/src/components/Link/index.tsx @@ -3,9 +3,9 @@ import { useMemo, } from 'react'; import { - IoChevronForward, - IoExit, -} from 'react-icons/io5'; + RiArrowRightWideLine, + RiExternalLinkLine, +} from 'react-icons/ri'; import { generatePath, Link as InternalLink, @@ -199,10 +199,10 @@ function Link(props: Props) { <> {actions} {withLinkIcon && external && ( - + )} {withLinkIcon && !external && ( - + )} ) : null, diff --git a/src/components/MonthlyCalendar/index.tsx b/src/components/MonthlyCalendar/index.tsx index 30f7aee..1bef486 100644 --- a/src/components/MonthlyCalendar/index.tsx +++ b/src/components/MonthlyCalendar/index.tsx @@ -6,9 +6,9 @@ import { useState, } from 'react'; import { - IoChevronBackSharp, - IoChevronForwardSharp, -} from 'react-icons/io5'; + RiArrowLeftSLine, + RiArrowRightSLine, +} from 'react-icons/ri'; import { _cs, encodeDate, @@ -139,7 +139,7 @@ function MonthlyCalendar(props: Props) { title="See previous month in calendar" spacing="xs" > - +
{year} diff --git a/src/components/Navbar/index.tsx b/src/components/Navbar/index.tsx index 8488ac9..6e11ead 100644 --- a/src/components/Navbar/index.tsx +++ b/src/components/Navbar/index.tsx @@ -3,10 +3,10 @@ import { useContext, } from 'react'; import { - IoExitOutline, - IoSettingsOutline, - IoShieldCheckmarkOutline, -} from 'react-icons/io5'; + RiAdminLine, + RiLogoutBoxLine, + RiSettings4Line, +} from 'react-icons/ri'; import { _cs, isDefined, @@ -128,7 +128,7 @@ function Navbar(props: Props) { type="link" external href={import.meta.env.APP_ADMIN_URL} - icons={} + icons={} > Admin Panel @@ -136,7 +136,7 @@ function Navbar(props: Props) { } + icons={} > Settings @@ -145,7 +145,7 @@ function Navbar(props: Props) { name={undefined} onClick={handleLogoutClick} disabled={fetching} - icons={} + icons={} title="Log out" > Log out diff --git a/src/components/Page/index.tsx b/src/components/Page/index.tsx index f4778d1..a1e73ff 100644 --- a/src/components/Page/index.tsx +++ b/src/components/Page/index.tsx @@ -5,10 +5,10 @@ import { useRef, } from 'react'; import { - IoChevronBack, - IoList, - IoMenu, -} from 'react-icons/io5'; + RiArrowLeftSLine, + RiListUnordered, + RiMenuLine, +} from 'react-icons/ri'; import { _cs, isDefined, @@ -135,7 +135,7 @@ function Page(props: Props) { variant="transparent" title="Toggle left pane" > - + )} @@ -150,7 +150,7 @@ function Page(props: Props) { variant="transparent" title="Close left pane" > - + )} @@ -168,7 +168,7 @@ function Page(props: Props) { variant="transparent" title="Toggle right pane" > - + )} diff --git a/src/components/RadioInput/Radio/index.tsx b/src/components/RadioInput/Radio/index.tsx index 68227c4..d268fa5 100644 --- a/src/components/RadioInput/Radio/index.tsx +++ b/src/components/RadioInput/Radio/index.tsx @@ -1,8 +1,8 @@ import React from 'react'; import { - IoRadioButtonOffOutline, - IoRadioButtonOnOutline, -} from 'react-icons/io5'; + RiCheckboxBlankCircleLine, + RiCheckboxCircleFill, +} from 'react-icons/ri'; import { _cs } from '@togglecorp/fujs'; import useBasicLayout from '#hooks/useBasicLayout'; @@ -47,9 +47,9 @@ function Radio(props: Props) { containerClassName, } = useBasicLayout({ icons: value ? ( - + ) : ( - + ), actions, childrenContainerClassName: styles.content, diff --git a/src/components/SearchSelectInput/Option/index.tsx b/src/components/SearchSelectInput/Option/index.tsx index 2910d05..b0e41fd 100644 --- a/src/components/SearchSelectInput/Option/index.tsx +++ b/src/components/SearchSelectInput/Option/index.tsx @@ -1,5 +1,5 @@ import type { ReactNode } from 'react'; -import { IoCheckmark } from 'react-icons/io5'; +import { RiCheckLine } from 'react-icons/ri'; import { _cs } from '@togglecorp/fujs'; import styles from './styles.module.css'; @@ -23,7 +23,7 @@ function Option(props: Props) { return (
- +
{ label } diff --git a/src/components/SelectInputContainer/index.tsx b/src/components/SelectInputContainer/index.tsx index 062c71e..028b4ff 100644 --- a/src/components/SelectInputContainer/index.tsx +++ b/src/components/SelectInputContainer/index.tsx @@ -4,9 +4,9 @@ import React, { useRef, } from 'react'; import { - IoCheckmarkDoneSharp, - IoCloseSharp, -} from 'react-icons/io5'; + RiCheckDoubleLine, + RiCloseLine, +} from 'react-icons/ri'; import { _cs, isTruthyString, @@ -292,7 +292,7 @@ function SelectInputContainer< name={undefined} title="Select all options" > - + )} {!readOnly && !nonClearable && hasValue && ( @@ -304,7 +304,7 @@ function SelectInputContainer< name={undefined} title="Clear all options" > - + )} diff --git a/src/utils/constants.ts b/src/utils/constants.ts index 734e401..3b4931c 100644 --- a/src/utils/constants.ts +++ b/src/utils/constants.ts @@ -9,7 +9,6 @@ export const defaultConfigValue: ConfigStorage = { editingMode: 'normal', compactTextArea: false, checkboxForStatus: false, - showInputIcons: false, startSidebarShown: window.innerWidth >= 900, endSidebarShown: false, dailyJournalGrouping: { diff --git a/src/utils/types.ts b/src/utils/types.ts index ac969f7..3c4b306 100644 --- a/src/utils/types.ts +++ b/src/utils/types.ts @@ -38,7 +38,6 @@ export type ConfigStorage = { defaultTaskStatus: WorkItemStatus, editingMode: EditingMode, checkboxForStatus: boolean, - showInputIcons: boolean, startSidebarShown: boolean, endSidebarShown: boolean, compactTextArea: boolean, diff --git a/src/views/DailyJournal/AddWorkItemDialog/index.tsx b/src/views/DailyJournal/AddWorkItemDialog/index.tsx index 22b4f3f..592623a 100644 --- a/src/views/DailyJournal/AddWorkItemDialog/index.tsx +++ b/src/views/DailyJournal/AddWorkItemDialog/index.tsx @@ -6,7 +6,7 @@ import { useRef, useState, } from 'react'; -import { IoSearch } from 'react-icons/io5'; +import { RiSearchLine } from 'react-icons/ri'; import { listToGroupList } from '@togglecorp/fujs'; import Dialog from '#components/Dialog'; @@ -104,7 +104,7 @@ function AddWorkItemDialog(props: Props) { variant="general" onChange={setSearchText} icons={( - + )} />
(_: T, i: number): [string, string] { interface Props { className?: string; workItem: WorkItem; - contractId: string; + contractId: string | undefined; - onClone: (clientId: string, override?: Partial) => void; - onChange: (clientId: string, ...entries: EntriesAsList) => void; - onDelete: (clientId: string) => void; + onClone?: (clientId: string, override?: Partial) => void; + onChange?: (clientId: string, ...entries: EntriesAsList) => void; + onDelete?: (clientId: string) => void; } function WorkItemRow(props: Props) { @@ -103,6 +96,8 @@ function WorkItemRow(props: Props) { onChange, } = props; + console.log(workItem, contractId); + const { enums } = useContext(EnumsContext); const { screen } = useContext(SizeContext); @@ -111,7 +106,9 @@ function WorkItemRow(props: Props) { const setFieldValue = useCallback( (...entries: EntriesAsList) => { - onChange(workItem.clientId, ...entries); + if (onChange) { + onChange(workItem.clientId, ...entries); + } }, [workItem.clientId, onChange], ); @@ -161,7 +158,7 @@ function WorkItemRow(props: Props) { (newValue: string) => { if (dialogState === 'move') { setFieldValue(newValue, 'date'); - } else if (dialogState === 'copy') { + } else if (dialogState === 'copy' && onClone) { onClone(workItem.clientId, { date: newValue }); } setDialogState(undefined); @@ -171,7 +168,9 @@ function WorkItemRow(props: Props) { const handleClone = useCallback( () => { - onClone(workItem.clientId); + if (onClone) { + onClone(workItem.clientId); + } }, [onClone, workItem.clientId], ); @@ -199,7 +198,6 @@ function WorkItemRow(props: Props) { onChange={setFieldValue} value={workItem.status} nonClearable - icons={config.showInputIcons && } /> ); @@ -214,12 +212,6 @@ function WorkItemRow(props: Props) { onChange={setFieldValue} value={workItem.task} nonClearable - icons={( - config.showInputIcons - // NOTE: hide/unhide icon wrt "checkbox for status" flag - && (screen === 'mobile' || !config.checkboxForStatus) - && - )} /> ); @@ -231,12 +223,6 @@ function WorkItemRow(props: Props) { title="Description" value={workItem.description} onChange={setFieldValue} - icons={( - config.showInputIcons - // NOTE: hide/unhide icon wrt "checkbox for status" flag - && (screen === 'desktop' || !config.checkboxForStatus) - && - )} placeholder="Description" compact={config.compactTextArea} /> @@ -253,7 +239,6 @@ function WorkItemRow(props: Props) { colorSelector={defaultColorSelector} onChange={setFieldValue} value={workItem.type} - icons={config.showInputIcons && } /> ); @@ -264,7 +249,6 @@ function WorkItemRow(props: Props) { title="Hours" value={workItem.duration} onChange={setFieldValue} - icons={config.showInputIcons && } placeholder="hh:mm" /> ); @@ -278,10 +262,10 @@ function WorkItemRow(props: Props) { onClick={handleClone} spacing="xs" > - + } + label={} withoutDropdownIcon variant="transparent" persistent @@ -292,7 +276,7 @@ function WorkItemRow(props: Props) { name={workItem.clientId} title="Edit this entry" onClick={undefined} - icons={} + icons={} disabled > Edit entry @@ -302,7 +286,7 @@ function WorkItemRow(props: Props) { name={workItem.clientId} title="Move this entry to another day" onClick={handleCopyDialogOpen} - icons={} + icons={} > Copy to another day @@ -311,7 +295,7 @@ function WorkItemRow(props: Props) { name={workItem.clientId} title="Move this entry to another day" onClick={handleMoveDialogOpen} - icons={} + icons={} > Move to another day @@ -331,7 +315,7 @@ function WorkItemRow(props: Props) {

)} - icons={} + icons={} > Delete entry @@ -348,7 +332,6 @@ function WorkItemRow(props: Props) { className={_cs( styles.workItemRow, config.checkboxForStatus && styles.checkboxForStatus, - config.showInputIcons && styles.withIcons, className, )} > diff --git a/src/views/DailyJournal/DayView/WorkItemRow/styles.module.css b/src/views/DailyJournal/DayView/WorkItemRow/styles.module.css index e21b83a..7568ef7 100644 --- a/src/views/DailyJournal/DayView/WorkItemRow/styles.module.css +++ b/src/views/DailyJournal/DayView/WorkItemRow/styles.module.css @@ -5,16 +5,8 @@ padding: var(--spacing-xs) var(--spacing-sm); gap: var(--spacing-xs); - &.with-icons { - grid-template-columns: 5.5rem 2fr 5fr 12rem 5rem 4rem; - } - &.checkbox-for-status { grid-template-columns: 1rem 2fr 5fr 10rem 4rem 4rem; - - &.with-icons { - grid-template-columns: 1rem 2fr 5fr 10rem 5rem 4rem; - } } .actions { @@ -49,16 +41,8 @@ grid-template-columns: auto; gap: var(--spacing-sm); - &.with-icons { - grid-template-columns: auto; - } - &.checkbox-for-status { grid-template-columns: 1rem 1fr; - - &.with-icons { - grid-template-columns: 1rem 1fr; - } } .compact-options { diff --git a/src/views/DailyJournal/DayView/index.tsx b/src/views/DailyJournal/DayView/index.tsx index 599990d..b3150a8 100644 --- a/src/views/DailyJournal/DayView/index.tsx +++ b/src/views/DailyJournal/DayView/index.tsx @@ -5,7 +5,6 @@ import { useContext, useMemo, } from 'react'; -import { FcClock } from 'react-icons/fc'; import { _cs, bound, @@ -168,14 +167,8 @@ function DayView(props: Props) { {isDefined(totalHours) && (
- {storedConfig.showInputIcons && ( - - )}
{getDurationString(totalHours)}
diff --git a/src/views/DailyJournal/DayView/styles.module.css b/src/views/DailyJournal/DayView/styles.module.css index ab0e2fc..a8a7767 100644 --- a/src/views/DailyJournal/DayView/styles.module.css +++ b/src/views/DailyJournal/DayView/styles.module.css @@ -31,20 +31,11 @@ font-weight: var(--font-weight-bold); gap: var(--spacing-2xs); - &.with-icon { - width: calc(9rem + 2 * var(--spacing-xs)); - } - @media screen and (max-width: 900px) { flex-grow: 1; justify-content: flex-end; padding: unset; width: unset; - - &.with-icon { - padding: unset; - width: unset; - } } } } diff --git a/src/views/DailyJournal/StartSidebar/index.tsx b/src/views/DailyJournal/StartSidebar/index.tsx index 66b88f2..9151840 100644 --- a/src/views/DailyJournal/StartSidebar/index.tsx +++ b/src/views/DailyJournal/StartSidebar/index.tsx @@ -3,7 +3,7 @@ import { useContext, useMemo, } from 'react'; -import { MdDragIndicator } from 'react-icons/md'; +import { RiDraggable } from 'react-icons/ri'; import { closestCenter, DndContext, @@ -88,7 +88,7 @@ function Item(props: ItemProps) { {...draggableListeners} className={styles.dragHandle} > - +
{dailyJournalAttributeDetails[attribute.key].label} diff --git a/src/views/DailyJournal/index.tsx b/src/views/DailyJournal/index.tsx index 282b39c..b8ae8b0 100644 --- a/src/views/DailyJournal/index.tsx +++ b/src/views/DailyJournal/index.tsx @@ -9,14 +9,14 @@ import { } from 'react'; import { FcHighPriority } from 'react-icons/fc'; import { - IoAdd, - IoCalendarOutline, - IoChevronBackSharp, - IoChevronForwardSharp, - IoNewspaperOutline, - IoStorefrontOutline, - IoTerminalOutline, -} from 'react-icons/io5'; + RiAddLine, + RiArrowLeftSLine, + RiArrowRightSLine, + RiCalendar2Line, + RiHomeOfficeLine, + RiStickyNoteAddLine, + RiTerminalBoxLine, +} from 'react-icons/ri'; import { useNavigate, useParams, @@ -639,7 +639,7 @@ export function Component() { variant="quaternary" title="Previous day" > - + - + )} @@ -658,7 +658,7 @@ export function Component() { value={selectedDate} onChange={setSelectedDate} > - + {entriesWithoutTask > 0 && (
@@ -686,7 +686,7 @@ export function Component() { } + fallback={} /> {screen === 'desktop' && ( @@ -696,7 +696,7 @@ export function Component() { title="Update Note" variant="quaternary" > - + )} {screen === 'desktop' && ( @@ -706,7 +706,7 @@ export function Component() { variant="quaternary" onClick={handleShortcutsButtonClick} > - + )}
@@ -728,7 +728,7 @@ export function Component() { diff --git a/src/views/Settings/index.tsx b/src/views/Settings/index.tsx index 01032e5..f8c6221 100644 --- a/src/views/Settings/index.tsx +++ b/src/views/Settings/index.tsx @@ -10,6 +10,8 @@ import useSetFieldValue from '#hooks/useSetFieldValue'; import { colorscheme } from '#utils/constants'; import { EditingMode } from '#utils/types'; +import WorkItemRow from '../DailyJournal/DayView/WorkItemRow'; + import styles from './styles.module.css'; type EditingOption = { key: EditingMode, label: string }; @@ -68,20 +70,14 @@ export function Component() { >

- Journal + Entry

- + +
+
+

+ Create Entry +

- Note + Create Notes

Date: Sat, 7 Sep 2024 09:17:29 +0545 Subject: [PATCH 10/10] Add indent settings for entry - Refactor list grouping --- src/utils/common.ts | 21 +-- src/utils/constants.ts | 1 + src/utils/types.ts | 13 +- .../DailyJournal/AddWorkItemDialog/index.tsx | 2 +- .../AddWorkItemDialog/styles.module.css | 2 +- .../DayView/WorkItemRow/index.tsx | 2 - src/views/DailyJournal/DayView/index.tsx | 133 ++++++++++-------- src/views/DailyJournal/StartSidebar/index.tsx | 11 +- src/views/DailyJournal/index.tsx | 18 +++ src/views/Settings/index.tsx | 6 + 10 files changed, 131 insertions(+), 78 deletions(-) diff --git a/src/utils/common.ts b/src/utils/common.ts index 88ea329..654d975 100644 --- a/src/utils/common.ts +++ b/src/utils/common.ts @@ -223,11 +223,13 @@ export function sortByAttributes( attributes: ATTRIBUTE[], sortFn: (a: LIST_ITEM, b: LIST_ITEM, attr: ATTRIBUTE) => number, ): LIST_ITEM[] { + if (attributes.length <= 0) { + return list; + } + const newList = [...list]; newList.sort( (a, b) => { - let sortResult = 0; - for (let i = 0; i < attributes.length; i += 1) { const currentSortResult = sortFn( a, @@ -236,12 +238,10 @@ export function sortByAttributes( ); if (currentSortResult !== 0) { - sortResult = currentSortResult; - break; + return currentSortResult; } } - - return sortResult; + return 0; }, ); @@ -249,7 +249,7 @@ export function sortByAttributes( } type GroupedItem = { - key: string; + groupKey: string; type: 'heading'; value: LIST_ITEM; attribute: ATTRIBUTE; @@ -265,6 +265,7 @@ export function groupListByAttributes( list: LIST_ITEM[], attributes: ATTRIBUTE[], compareItemAttributes: (a: LIST_ITEM, b: LIST_ITEM, attribute: ATTRIBUTE) => boolean, + getGroupKey: (item: LIST_ITEM, attributes: ATTRIBUTE[]) => string, ): GroupedItem[] { if (isNotDefined(list) || list.length === 0) { return []; @@ -272,12 +273,13 @@ export function groupListByAttributes( const groupedItems = list.flatMap((listItem, listIndex) => { if (listIndex === 0) { + const groupKey = getGroupKey(listItem, attributes); const headings = attributes.map((attribute, i) => ({ type: 'heading' as const, value: listItem, attribute, level: i, - key: `heading-${listIndex}-${i}`, + groupKey, })); return [ @@ -311,6 +313,7 @@ export function groupListByAttributes( ]; } + const groupKey = getGroupKey(listItem, attributes); const headings = attributes.map((attribute, i) => { if (i < attributeMismatchIndex) { return undefined; @@ -321,7 +324,7 @@ export function groupListByAttributes( value: listItem, attribute, level: i, - key: `heading-${listIndex}-${i}`, + groupKey, }; }).filter(isDefined); diff --git a/src/utils/constants.ts b/src/utils/constants.ts index 3b4931c..352e9ff 100644 --- a/src/utils/constants.ts +++ b/src/utils/constants.ts @@ -7,6 +7,7 @@ export const defaultConfigValue: ConfigStorage = { defaultTaskType: undefined, defaultTaskStatus: 'DONE', editingMode: 'normal', + indent: true, compactTextArea: false, checkboxForStatus: false, startSidebarShown: window.innerWidth >= 900, diff --git a/src/utils/types.ts b/src/utils/types.ts index 3c4b306..5c31fa9 100644 --- a/src/utils/types.ts +++ b/src/utils/types.ts @@ -23,7 +23,7 @@ export type WorkItemStatus = TimeEntryStatusEnum; export type WorkItem = Omit & { clientId: string }; export type DailyJournalAttributeKeys = 'project' | 'contract' | 'task' | 'status'; -export interface DailyJournalAttributeOrder { +export interface DailyJournalAttribute { key: DailyJournalAttributeKeys; sortDirection: number; } @@ -36,13 +36,18 @@ export interface DailyJournalGrouping { export type ConfigStorage = { defaultTaskType: WorkItemType | undefined, defaultTaskStatus: WorkItemStatus, + editingMode: EditingMode, + checkboxForStatus: boolean, - startSidebarShown: boolean, - endSidebarShown: boolean, compactTextArea: boolean, - dailyJournalAttributeOrder: DailyJournalAttributeOrder[]; + indent: boolean, + + dailyJournalAttributeOrder: DailyJournalAttribute[]; dailyJournalGrouping: DailyJournalGrouping; + + startSidebarShown: boolean, + endSidebarShown: boolean, } export interface GeneralEvent { diff --git a/src/views/DailyJournal/AddWorkItemDialog/index.tsx b/src/views/DailyJournal/AddWorkItemDialog/index.tsx index 592623a..089de64 100644 --- a/src/views/DailyJournal/AddWorkItemDialog/index.tsx +++ b/src/views/DailyJournal/AddWorkItemDialog/index.tsx @@ -94,7 +94,7 @@ function AddWorkItemDialog(props: Props) { focusElementRef={titleInputRef} >
- Please select a task to add the workitems + Please select a task to add new entry
{ if (attr.key === 'status') { return item.status; @@ -102,6 +102,7 @@ function DayView(props: Props) { const formattedDate = dateFormatter.format(new Date(selectedDate)); const formattedRelativeDate = useFormattedRelativeDate(selectedDate); + const totalHours = useMemo( () => { if (isDefined(workItems)) { @@ -115,11 +116,13 @@ function DayView(props: Props) { const { dailyJournalAttributeOrder, - dailyJournalGrouping, + dailyJournalGrouping: { + groupLevel, + joinLevel, + }, + indent, } = storedConfig; - const { groupLevel, joinLevel } = dailyJournalGrouping; - const groupedItems = useMemo(() => { if (isNotDefined(taskById) || isNotDefined(workItems)) { return []; @@ -130,8 +133,8 @@ function DayView(props: Props) { dailyJournalAttributeOrder, (a, b, attr) => ( compareString( - getWorkItemAttribute(a, attr), - getWorkItemAttribute(b, attr), + getWorkItemLabelFromAttr(a, attr), + getWorkItemLabelFromAttr(b, attr), attr.sortDirection, ) ), @@ -141,16 +144,20 @@ function DayView(props: Props) { sortedWorkItems, dailyJournalAttributeOrder.slice(0, groupLevel), (a, b, attr) => { - const aValue = getWorkItemAttribute(a, attr); - const bValue = getWorkItemAttribute(b, attr); + const aValue = getWorkItemLabelFromAttr(a, attr); + const bValue = getWorkItemLabelFromAttr(b, attr); return aValue === bValue; }, + (item, attrs) => { + const values = attrs.map((attr) => getWorkItemLabelFromAttr(item, attr)).join(';'); + return values; + }, ); }, [ taskById, workItems, - getWorkItemAttribute, + getWorkItemLabelFromAttr, dailyJournalAttributeOrder, groupLevel, ]); @@ -185,75 +192,87 @@ function DayView(props: Props) {
{groupedItems.map((groupedItem) => { if (groupedItem.type === 'heading') { - const levelDiff = groupLevel - joinLevel; - - const headingText = getWorkItemAttribute( - groupedItem.value, - groupedItem.attribute, - ); + // Main Heading + // NOTE: Need to add 1 as groupLevel and level starts from 1 and 0 resp. + if (groupedItem.level + 1 < (groupLevel - joinLevel + 1)) { + const headingText = getWorkItemLabelFromAttr( + groupedItem.value, + groupedItem.attribute, + ); - if (groupedItem.level < levelDiff) { const Heading = `h${bound(groupedItem.level + 2, 2, 4)}` as unknown as ElementType; return ( - + {indent && } {headingText} ); } - if (groupedItem.level < (groupLevel - 1)) { - return null; + // Sub Headings + // NOTE: We only need to show one subheading after the main headings + // NOTE: Need to add 1 as groupLevel and level starts from 1 and 0 resp. + if (groupedItem.level + 1 === groupLevel) { + return ( +

+ {indent && ( + + )} + {dailyJournalAttributeOrder.map((attribute, i) => { + if (i >= groupLevel) { + return null; + } + + const currentLabel = getWorkItemLabelFromAttr( + groupedItem.value, + attribute, + ); + + if (i < (groupLevel - joinLevel)) { + return null; + } + + return ( + + {i > (groupLevel - joinLevel) && ( +
+ )} +
{currentLabel}
+ + ); + })} +

+ ); } - return ( -

- - {dailyJournalAttributeOrder.map((attribute, i) => { - if (i >= groupLevel) { - return null; - } - - const currentLabel = getWorkItemAttribute( - groupedItem.value, - attribute, - ); - - if (i < (groupLevel - joinLevel)) { - return null; - } - - return ( - - {i > (groupLevel - joinLevel) && ( -
- )} -
{currentLabel}
- - ); - })} -

- ); + return null; } const taskDetails = taskById?.[groupedItem.value.task]; - if (!taskDetails) { return null; } return ( -
- +
+ {indent && ( + + )} void; draggableAttributes?: DraggableAttributes; draggableListeners?: SyntheticListenerMap | undefined; @@ -99,7 +99,7 @@ function Item(props: ItemProps) { interface SortableItemProps { className?: string; - attribute: DailyJournalAttributeOrder; + attribute: DailyJournalAttribute; } function SortableItem(props: SortableItemProps) { @@ -247,7 +247,10 @@ function StartSidebar(props: Props) { strategy={verticalListSortingStrategy} > {storedConfig.dailyJournalAttributeOrder.map((attribute) => ( - + ))} diff --git a/src/views/DailyJournal/index.tsx b/src/views/DailyJournal/index.tsx index b8ae8b0..fe0bb2d 100644 --- a/src/views/DailyJournal/index.tsx +++ b/src/views/DailyJournal/index.tsx @@ -103,6 +103,24 @@ const MY_TIME_ENTRIES_QUERY = gql` } `; +/* +query MyQuery { + private { + allTimeEntries(filters: {statuses: TODO, users: "9"}) { + clientId + id + description + date + startTime + duration + status + taskId + type + } + } +} +*/ + const BULK_TIME_ENTRY_MUTATION = gql` mutation BulkTimeEntry($timeEntries: [TimeEntryBulkCreateInput!], $deleteIds: [ID!]) { private { diff --git a/src/views/Settings/index.tsx b/src/views/Settings/index.tsx index f8c6221..d5a4841 100644 --- a/src/views/Settings/index.tsx +++ b/src/views/Settings/index.tsx @@ -85,6 +85,12 @@ export function Component() { value={storedConfig.checkboxForStatus} onChange={setConfigFieldValue} /> +