diff --git a/flatpak/com.github.ransome1.sleek.appdata.xml b/flatpak/com.github.ransome1.sleek.appdata.xml index e1e43550..f465e8f5 100755 --- a/flatpak/com.github.ransome1.sleek.appdata.xml +++ b/flatpak/com.github.ransome1.sleek.appdata.xml @@ -9,7 +9,7 @@ Robin Ahle - + https://github.com/ransome1/sleek https://github.com/ransome1/sleek/issues diff --git a/package.json b/package.json index 6b92deb7..08376029 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "sleek", - "version": "2.0.12-rc.1", + "version": "2.0.12-rc.2", "main": "./src/main/main.tsx", "scripts": { "build": "concurrently \"yarn run peggy\" \"yarn run build:main\" \"yarn run build:renderer\"", diff --git a/release/app/package.json b/release/app/package.json index bc7807bf..ae5eceba 100644 --- a/release/app/package.json +++ b/release/app/package.json @@ -1,6 +1,6 @@ { "name": "sleek", - "version": "2.0.12-rc.1", + "version": "2.0.12-rc.2", "description": "todo.txt manager for Linux, Windows and MacOS, free and open-source (FOSS)", "synopsis": "todo.txt manager for Linux, Windows and MacOS, free and open-source (FOSS)", "keywords": [ diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml index 2cb77488..3a5e73d7 100644 --- a/snap/snapcraft.yaml +++ b/snap/snapcraft.yaml @@ -1,6 +1,6 @@ name: sleek base: core20 -version: "2.0.12-rc.1" +version: "2.0.12-rc.2" summary: todo.txt manager for Linux, free and open-source (FOSS) description: | sleek is an open-source (FOSS) todo manager based on the todo.txt syntax. Stripped down to only the most necessary features, and with a clean and simple interface, sleek aims to help you focus on getting things done. diff --git a/src/__tests__/__mock__/recurrence.txt b/src/__tests__/__mock__/recurrence.txt index a47d0eec..bec7ccec 100644 --- a/src/__tests__/__mock__/recurrence.txt +++ b/src/__tests__/__mock__/recurrence.txt @@ -1,15 +1,15 @@ -2024-02-26 Line 1 rec:1d due:2024-02-27 -2024-02-26 Line 1 rec:w due:2024-03-04 -2024-02-26 Line 1 rec:2m due:2024-04-26 -2024-02-26 Line 1 rec:+1d due:2024-02-28 -2024-02-26 Line 1 rec:7w due:2024-04-15 -2024-02-26 Line 1 due:2023-07-24 rec:+1b -2024-02-26 taxes are due in one year t:2022-03-30 due:2022-04-30 rec:+1y -2024-02-26 Water plants @home +quick due:2024-03-04 t:2024-02-23 rec:1w -2024-02-26 Line 1 rec:+1d t:2023-09-20 -2024-02-26 Line 1 rec:1d pri:A due:2024-02-27 -2024-02-26 (A) Do something rec:d t:2024-02-27 @SomeContext -2024-02-26 Do something rec:0d -2024-02-26 Do something rec:0d due:2024-02-26 -2024-02-26 Do something rec:0d due:2024-02-26 t:2024-02-26 \ No newline at end of file +2024-02-27 Line 1 rec:1d due:2024-02-28 +2024-02-27 Line 1 rec:w due:2024-03-05 +2024-02-27 Line 1 rec:2m due:2024-04-27 +2024-02-27 Line 1 rec:+1d due:2024-02-29 +2024-02-27 Line 1 rec:7w due:2024-04-16 +2024-02-27 Line 1 due:2023-07-24 rec:+1b +2024-02-27 taxes are due in one year t:2022-03-30 due:2022-04-30 rec:+1y +2024-02-27 Water plants @home +quick due:2024-03-05 t:2024-02-24 rec:1w +2024-02-27 Line 1 rec:+1d t:2023-09-20 +2024-02-27 Line 1 rec:1d pri:A due:2024-02-28 +2024-02-27 (A) Do something rec:d t:2024-02-28 @SomeContext +2024-02-27 Do something rec:0d +2024-02-27 Do something rec:0d due:2024-02-27 +2024-02-27 Do something rec:0d due:2024-02-27 t:2024-02-27 \ No newline at end of file diff --git a/src/__tests__/main/Filters.tsx b/src/__tests__/main/Filters.tsx index f8a943e4..d81e1067 100644 --- a/src/__tests__/main/Filters.tsx +++ b/src/__tests__/main/Filters.tsx @@ -15,7 +15,7 @@ describe('Should filter todos based on passed filters', () => { test('should filter todo objects based on project filter', () => { const filters = { - projects: [ { value: 'Project 1', exclude: false } ] + projects: [ { values: ['Project 1'], exclude: false } ] } const expected = [ { id: 1, body: 'Test', created: null, complete: false, completed: null, priority: null, contexts: null, projects: ['Project 1'], due: '2023-01-01', dueString: '2023-01-01', t: null, tString: null, rec: null, hidden: false, pm: null, visible: true, string: '' }, diff --git a/src/main/main.tsx b/src/main/main.tsx index 0313d7ee..ee4384ae 100644 --- a/src/main/main.tsx +++ b/src/main/main.tsx @@ -12,7 +12,7 @@ import './modules/IpcMain'; const environment: string | undefined = process.env.NODE_ENV; let mainWindow: BrowserWindow | null = null; let eventListeners: Record = {}; -let resizeTimeout; +let resizeTimeout: NodeJS.Timeout | undefined; const handleCreateWindow = () => { if(mainWindow) { @@ -131,8 +131,7 @@ const createMainWindow = () => { handleWindowSizeAndPosition(); - const colorTheme = config.get('colorTheme'); - nativeTheme.themeSource = colorTheme; + nativeTheme.themeSource = config.get('colorTheme'); mainWindow .on('resize', handleResize) diff --git a/src/main/modules/Filters/Filters.tsx b/src/main/modules/Filters/Filters.tsx index 6f1aaccc..e7ece2db 100644 --- a/src/main/modules/Filters/Filters.tsx +++ b/src/main/modules/Filters/Filters.tsx @@ -22,7 +22,7 @@ function applyFilters(todoObjects: TodoObject[], filters: Filters | null): TodoO const hasMatchingValue = Array.isArray(attributeValues) ? attributeValues.some((val) => values.includes(val)) - : values.includes(attributeValues); + : attributeValues !== undefined && values.includes(attributeValues); return exclude ? !hasMatchingValue : hasMatchingValue; }); diff --git a/src/main/util.tsx b/src/main/util.tsx index bf702225..eb9f41d9 100644 --- a/src/main/util.tsx +++ b/src/main/util.tsx @@ -21,23 +21,22 @@ function resolveHtmlPath(htmlFileName: string): string { } function getChannel(): string { - switch (true) { - case process.env.APPIMAGE: - return "AppImage"; - case process.windowsStore: - return "Windows Store"; - case process.mas: - return "Mac App Store"; - case process.env.SNAP: - return "Snap Store"; - case process.env.FLATPAK_ID: - return "Flathub"; - case process.env.AUR: - return "AUR"; - case process.env.PORTABLE_EXECUTABLE_DIR: - return "Portable"; - default: - return "Misc"; + if (process.env.APPIMAGE) { + return "AppImage"; + } else if (process.windowsStore) { + return "Windows Store"; + } else if (process.mas) { + return "Mac App Store"; + } else if (process.env.SNAP) { + return "Snap Store"; + } else if (process.env.FLATPAK_ID) { + return "Flathub"; + } else if (process.env.AUR) { + return "AUR"; + } else if (process.env.PORTABLE_EXECUTABLE_DIR) { + return "Portable"; + } else { + return "Misc"; } } diff --git a/src/renderer/App.tsx b/src/renderer/App.tsx index 0ac54e31..bbfda3fd 100644 --- a/src/renderer/App.tsx +++ b/src/renderer/App.tsx @@ -24,18 +24,6 @@ import './App.scss'; const { ipcRenderer, store } = window.api; -const translatedAttributes = (t: typeof i18n.t) => ({ - t: t('shared.attributeMapping.t'), - due: t('shared.attributeMapping.due'), - projects: t('shared.attributeMapping.projects'), - contexts: t('shared.attributeMapping.contexts'), - priority: t('shared.attributeMapping.priority'), - rec: t('shared.attributeMapping.rec'), - pm: t('shared.attributeMapping.pm'), - created: t('shared.attributeMapping.created'), - completed: t('shared.attributeMapping.completed'), -}); - const App = () => { const [settings, setSettings] = useState(store.getConfig()); const [snackBarOpen, setSnackBarOpen] = useState(false); @@ -55,7 +43,6 @@ const App = () => { const [promptItem, setPromptItem] = useState(null); const [triggerArchiving, setTriggerArchiving] = useState(false); const searchFieldRef = useRef(null); - const [attributeMapping] = useState(translatedAttributes(i18n.t) || {}); const [visibleRowCount, setVisibleRowCount] = useState(50); const [loadMoreRows, setLoadMoreRows] = useState(true); @@ -123,7 +110,6 @@ const App = () => { attributes={attributes} filters={filters} searchFieldRef={searchFieldRef} - attributeMapping={attributeMapping} /> )}
diff --git a/src/renderer/Drawer/Attributes.tsx b/src/renderer/Drawer/Attributes.tsx index 05b78b99..92b9c497 100644 --- a/src/renderer/Drawer/Attributes.tsx +++ b/src/renderer/Drawer/Attributes.tsx @@ -7,24 +7,17 @@ import Badge from '@mui/material/Badge'; import ExpandMoreIcon from '@mui/icons-material/ExpandMore'; import VisibilityOffIcon from '@mui/icons-material/VisibilityOff'; import AirIcon from '@mui/icons-material/Air'; -import { handleFilterSelect } from '../Shared'; +import { handleFilterSelect, friendlyDate, translatedAttributes } from '../Shared'; import { withTranslation, WithTranslation } from 'react-i18next'; import { i18n } from '../Settings/LanguageSelector'; -import dayjs from 'dayjs'; -import relativeTime from 'dayjs/plugin/relativeTime'; -import duration from 'dayjs/plugin/duration'; -import calendar from 'dayjs/plugin/calendar'; import './Attributes.scss'; -dayjs.extend(relativeTime); -dayjs.extend(duration); -dayjs.extend(calendar); + const { store } = window.api; interface DrawerAttributesProps extends WithTranslation { settings: Settings; attributes: Attributes | null; - attributeMapping: TranslatedAttributes; filters: Filters | null; t: typeof i18n.t; } @@ -32,38 +25,24 @@ interface DrawerAttributesProps extends WithTranslation { const DrawerAttributes: React.FC = memo(({ settings, attributes, - attributeMapping, filters, t, }) => { const firstTabbableElementRef = useRef(null); const [hovered, setHovered] = useState(null); - const friendlyDate = (value: string) => { - dayjs.locale(settings.language); - return dayjs(value).calendar(null, { - sameDay: `[${t(`drawer.attributes.today`)}]`, - nextDay: `[${t(`drawer.attributes.tomorrow`)}]`, - nextWeek: `[${t(`drawer.attributes.nextWeek`)}]`, - lastDay: `[${t(`drawer.attributes.yesterday`)}]`, - lastWeek: `[${t(`drawer.attributes.lastWeek`)}]`, - sameElse: function () { - return dayjs(this).fromNow(); - }, - }); - }; - const preprocessAttributes = (attributeKey, attributes) => { if (!attributes) { return null; } + const isDate: boolean = ['due', 't', 'completed', 'created'].includes(attributeKey); const processedAttributes = {}; Object.keys(attributes).forEach((key) => { if (attributes[key]) { const count = attributes[key].count; - const formattedValue = settings.useHumanFriendlyDates && dayjs(key).isValid() ? friendlyDate(key) : key; + const formattedValue = settings.useHumanFriendlyDates && isDate ? friendlyDate(key, t) : key; if (!processedAttributes[formattedValue]) { processedAttributes[formattedValue] = { @@ -166,7 +145,8 @@ const DrawerAttributes: React.FC = memo(({ {!isAttributesEmpty ? ( Object.keys(attributes).map((key, index) => { - const preprocessedAttributes = attributes[key] ? preprocessAttributes(key, attributes[key]) : attributes[key]; + const preprocessedAttributes: Attributes = preprocessAttributes(key, attributes[key]); + const attributeHeadline: string = translatedAttributes(t)[key]; return Object.keys(preprocessedAttributes).length > 0 ? ( = memo(({ }> attribute.notify))}>

- {attributeMapping[key]} + {attributeHeadline}

@@ -199,4 +179,4 @@ const DrawerAttributes: React.FC = memo(({ ); }); -export default withTranslation()(DrawerAttributes); +export default withTranslation()(DrawerAttributes); \ No newline at end of file diff --git a/src/renderer/Drawer/Drawer.tsx b/src/renderer/Drawer/Drawer.tsx index 765335d1..68c47a93 100644 --- a/src/renderer/Drawer/Drawer.tsx +++ b/src/renderer/Drawer/Drawer.tsx @@ -19,7 +19,6 @@ interface Props extends WithTranslation { attributes: Attributes | null; filters: Filters | null; searchFieldRef: React.RefObject; - attributeMapping: TranslatedAttributes; t: typeof i18n.t; } @@ -28,7 +27,6 @@ const DrawerComponent: React.FC = memo(({ attributes, filters, searchFieldRef, - attributeMapping, t }) => { const [activeTab, setActiveTab] = useState('attributes'); @@ -97,13 +95,12 @@ const DrawerComponent: React.FC = memo(({ )} {settings.isDrawerOpen && activeTab === 'filters' && } {settings.isDrawerOpen && activeTab === 'sorting' && ( - + )} ); diff --git a/src/renderer/Drawer/Sorting/DraggableList.tsx b/src/renderer/Drawer/Sorting/DraggableList.tsx index e1a163c0..433d790e 100644 --- a/src/renderer/Drawer/Sorting/DraggableList.tsx +++ b/src/renderer/Drawer/Sorting/DraggableList.tsx @@ -7,12 +7,10 @@ const { store } = window.api; type DraggableListProps = { settings: Settings; - attributeMapping: TranslatedAttributes; }; const DraggableList: React.FC = ({ settings, - attributeMapping, }) => { const [accordionOrder, setAccordionOrder] = useState(settings.sorting); const reorder = (list: Sorting[], startIndex: number, endIndex: number): Sorting[] => { @@ -44,7 +42,6 @@ const DraggableList: React.FC = ({ key={item.id} settings={settings} setAccordionOrder={setAccordionOrder} - attributeMapping={attributeMapping} /> ))} {provided.placeholder} diff --git a/src/renderer/Drawer/Sorting/DraggableListItem.tsx b/src/renderer/Drawer/Sorting/DraggableListItem.tsx index 49aaf029..381cba25 100644 --- a/src/renderer/Drawer/Sorting/DraggableListItem.tsx +++ b/src/renderer/Drawer/Sorting/DraggableListItem.tsx @@ -4,22 +4,25 @@ import ListItem from '@mui/material/ListItem'; import Button from '@mui/material/Button'; import SortIcon from '@mui/icons-material/Sort'; import DragHandleIcon from '@mui/icons-material/DragHandle'; +import { withTranslation } from 'react-i18next'; +import { i18n } from '../../Settings/LanguageSelector'; +import { translatedAttributes } from '../../Shared'; import './DraggableListItem.scss'; type DraggableListItemProps = { item: Sorting; index: number; settings: Settings; - attributeMapping: TranslatedAttributes; setAccordionOrder: React.Dispatch>; + t: typeof i18n.t; }; const DraggableListItem: React.FC = ({ item, index, settings, - attributeMapping, setAccordionOrder, + t, }) => { const updatedSorting = settings.sorting.map((sortingItem: Sorting) => { if(sortingItem.id === item.id) { @@ -31,6 +34,8 @@ const DraggableListItem: React.FC = ({ setAccordionOrder(updatedSorting); }; + const attributeHeadline: string = translatedAttributes(t)[item.value]; + return ( {(provided, snapshot) => ( @@ -42,7 +47,7 @@ const DraggableListItem: React.FC = ({ data-testid={`drawer-sorting-draggable-list-item-${item.value}`} >
- {attributeMapping[item.value]} + {attributeHeadline} + + + ); }; return ( diff --git a/src/renderer/Grid/Grid.tsx b/src/renderer/Grid/Grid.tsx index 183c5f75..a3db1bda 100644 --- a/src/renderer/Grid/Grid.tsx +++ b/src/renderer/Grid/Grid.tsx @@ -38,8 +38,8 @@ const GridComponent: React.FC = memo(({ const visibleTodoObjects = todoObjects?.filter(todoObject => todoObject.visible)?.slice(0, visibleRowCount); const totalRowCount = todoObjects?.length || 0; - const handleButtonClick = (key: string, value: string) => { - handleFilterSelect(key, value, filters, false); + const handleButtonClick = (key: string, name: string, values: string[]) => { + handleFilterSelect(key, name, values, filters, false); }; const handleKeyUp = (event: KeyboardEvent) => { diff --git a/src/renderer/Grid/Group.tsx b/src/renderer/Grid/Group.tsx index 86203cab..6ccf350b 100644 --- a/src/renderer/Grid/Group.tsx +++ b/src/renderer/Grid/Group.tsx @@ -22,7 +22,7 @@ const Group: React.FC = memo(({ return ; } const selected: boolean = filters && (filters[group as keyof Filters] || []).some( - (filter: Filter) => filter && filter.value === value.trim() + (filter: Filter) => filter && filter.name === value.trim() ); return (
= memo(({ data-todotxt-attribute={group} data-todotxt-value={value} > -
diff --git a/src/renderer/Grid/Renderer.tsx b/src/renderer/Grid/Renderer.tsx index 391d00c3..7d717427 100644 --- a/src/renderer/Grid/Renderer.tsx +++ b/src/renderer/Grid/Renderer.tsx @@ -40,8 +40,9 @@ const RendererComponent: React.FC = memo(({ const replacements: { [key: string]: (value: string, type: string) => React.ReactNode; } = { - due: (_value,type) => ( + due: (value, type) => ( = memo(({ settings={settings} /> ), - t: (_value, type) => ( + t: (value, type) => ( = memo(({ /> ), contexts: (value, type) => ( - ), projects: (value, type) => ( - ), rec: (value, type) => ( - ), pm: (value, type) => ( - @@ -94,7 +96,9 @@ const RendererComponent: React.FC = memo(({ let modifiedChild = child.split(/(\S+\s*)/).filter(Boolean); expressions.forEach(({ pattern, type }) => { modifiedChild = reactStringReplace(modifiedChild, pattern, (match) => { - const selected = filters && type !== null && (filters[type as keyof Filters] || []).some((filter: Filter) => filter.value === match); + const selected = filters && type !== null && (filters[type as keyof Filters] || []).some((filter: Filter) => { + return filter.name === match + }); return ( {replacements[type](match, type)} diff --git a/src/renderer/Grid/Row.scss b/src/renderer/Grid/Row.scss index 116624e6..44670530 100644 --- a/src/renderer/Grid/Row.scss +++ b/src/renderer/Grid/Row.scss @@ -52,6 +52,9 @@ &[data-hidden=true] { filter: opacity(50%) grayscale(100%); } + &:last-child { + border-bottom-left-radius: 0.25em; + } &.group { margin-top: 1em; padding-left: 0; diff --git a/src/renderer/Shared.tsx b/src/renderer/Shared.tsx index 38f1f165..4bbe2962 100644 --- a/src/renderer/Shared.tsx +++ b/src/renderer/Shared.tsx @@ -1,3 +1,11 @@ +import dayjs from 'dayjs'; +import relativeTime from 'dayjs/plugin/relativeTime'; +import duration from 'dayjs/plugin/duration'; +import calendar from 'dayjs/plugin/calendar'; +dayjs.extend(relativeTime); +dayjs.extend(duration); +dayjs.extend(calendar); + const { store, ipcRenderer } = window.api; export const handleFilterSelect = (key: string, name: string, values: string | string[] | null, filters: Filters | null, exclude: boolean) => { @@ -31,4 +39,32 @@ export const handleLinkClick = (event: MouseEvent, url: string) => { if(url) { ipcRenderer.send('openInBrowser', url) } +}; + +export const translatedAttributes = (t: typeof i18n.t) => { + return { + t: t('shared.attributeMapping.t'), + due: t('shared.attributeMapping.due'), + projects: t('shared.attributeMapping.projects'), + contexts: t('shared.attributeMapping.contexts'), + priority: t('shared.attributeMapping.priority'), + rec: t('shared.attributeMapping.rec'), + pm: t('shared.attributeMapping.pm'), + created: t('shared.attributeMapping.created'), + completed: t('shared.attributeMapping.completed'), + } +}; + +export const friendlyDate = (value: string, t: typeof i18n.t) => { + //dayjs.locale(language); + return dayjs(value).calendar(null, { + sameDay: `[${t(`drawer.attributes.today`)}]`, + nextDay: `[${t(`drawer.attributes.tomorrow`)}]`, + nextWeek: `[${t(`drawer.attributes.nextWeek`)}]`, + lastDay: `[${t(`drawer.attributes.yesterday`)}]`, + lastWeek: `[${t(`drawer.attributes.lastWeek`)}]`, + sameElse: function () { + return dayjs(this).fromNow(); + }, + }); }; \ No newline at end of file diff --git a/src/types.tsx b/src/types.tsx index daa79191..5197fba7 100644 --- a/src/types.tsx +++ b/src/types.tsx @@ -81,6 +81,7 @@ declare global { multilineTextField: boolean; useMultilineForBulkTodoCreation: boolean; useHumanFriendlyDates: boolean; + channel: string; __internal__: { migrations: { version: string }}; } diff --git a/yarn.lock b/yarn.lock index 879d5de1..c6cc6ef5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1192,9 +1192,9 @@ integrity sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ== "@emotion/is-prop-valid@^1.2.1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-1.2.1.tgz#23116cf1ed18bfeac910ec6436561ecb1a3885cc" - integrity sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw== + version "1.2.2" + resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-1.2.2.tgz#d4175076679c6a26faa92b03bb786f9e52612337" + integrity sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw== dependencies: "@emotion/memoize" "^0.8.1" @@ -1204,9 +1204,9 @@ integrity sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA== "@emotion/react@^11.11.3": - version "11.11.3" - resolved "https://registry.yarnpkg.com/@emotion/react/-/react-11.11.3.tgz#96b855dc40a2a55f52a72f518a41db4f69c31a25" - integrity sha512-Cnn0kuq4DoONOMcnoVsTOR8E+AdnKFf//6kUWc4LCdnxj31pZWn7rIULd6Y7/Js1PiPHzn7SKCM9vB/jBni8eA== + version "11.11.4" + resolved "https://registry.yarnpkg.com/@emotion/react/-/react-11.11.4.tgz#3a829cac25c1f00e126408fab7f891f00ecc3c1d" + integrity sha512-t8AjMlF0gHpvvxk5mAtCqR4vmxiGHCeJBaQO6gncUSdklELOgtwjerNY2yuJNfwnc6vi16U/+uMF+afIawJ9iw== dependencies: "@babel/runtime" "^7.18.3" "@emotion/babel-plugin" "^11.11.0" @@ -2435,9 +2435,9 @@ "@types/react" "*" "@types/react@*", "@types/react@^18.2.52": - version "18.2.59" - resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.59.tgz#14c7bcab22e2ce71d9eaa02f78d3d55067724d7f" - integrity sha512-DE+F6BYEC8VtajY85Qr7mmhTd/79rJKIHCg99MU9SWPB4xvLb6D1za2vYflgZfmPqQVEr6UqJTnLXEwzpVPuOg== + version "18.2.60" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.60.tgz#df026eaef1100b6dafe420f36fecb1d209a8cee1" + integrity sha512-dfiPj9+k20jJrLGOu9Nf6eqxm2EyJRrq2NvwOFsfbb7sFExZ9WELPs67UImHj3Ayxg8ruTtKtNnbjaF8olPq0A== dependencies: "@types/prop-types" "*" "@types/scheduler" "*" @@ -3448,9 +3448,9 @@ caniuse-api@^3.0.0: lodash.uniq "^4.5.0" caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001587: - version "1.0.30001589" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001589.tgz#7ad6dba4c9bf6561aec8291976402339dc157dfb" - integrity sha512-vNQWS6kI+q6sBlHbh71IIeC+sRwK2N3EDySc/updIGhIee2x5z00J4c1242/5/d6EpEMdOnk/m+6tuk4/tcsqg== + version "1.0.30001591" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001591.tgz#16745e50263edc9f395895a7cd468b9f3767cf33" + integrity sha512-PCzRMei/vXjJyL5mJtzNiUCKP59dm8Apqc3PH8gJkMnMXZGox93RbE76jHsmLwmIo6/3nsYIpJtx0O7u5PqFuQ== ccount@^2.0.0: version "2.0.1" @@ -4622,9 +4622,9 @@ end-of-stream@^1.1.0: once "^1.4.0" enhanced-resolve@^5.0.0, enhanced-resolve@^5.15.0, enhanced-resolve@^5.7.0: - version "5.15.0" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz#1af946c7d93603eb88e9896cee4904dc012e9c35" - integrity sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg== + version "5.15.1" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.15.1.tgz#384391e025f099e67b4b00bfd7f0906a408214e1" + integrity sha512-3d3JRbwsCLJsYgvb6NuWEG44jjPSOMuS73L/6+7BZuoKm3W+qXnSoIYVHi8dG7Qcg4inAY4jbzkZ7MnskePeDg== dependencies: graceful-fs "^4.2.4" tapable "^2.2.0"