gitshark

Clone repository

git clone https://git.vilip.de/git/vilip/taskflow.git
git clone git@git.vilip.de:vilip/taskflow.git

← Commits

✨ Add customizable daily reminder time with task count

0568c69f4b97f89ea778d118cea5247721639cea · Phillip Souza Furtner · 2026-06-18T18:41:52Z

Changes

8 files changed, +2683 -139

MODIFY README.md +1 -1
diff --git a/README.md b/README.md
index 606f527..b73bd61 100644
--- a/README.md
+++ b/README.md
@@ -12,7 +12,7 @@
12 12 - **Local persistence** via AsyncStorage (JSON)
13 13 - **Export / import** as a JSON file using the native share sheet
14 14 - **WebDAV / Nextcloud sync** with last-write-wins conflict resolution; supports force-push and force-pull
15 -- **Daily task reminder** notification at noon (native platforms only, includes today's task count)
15 +- **Daily task reminder** notification at a configurable time (native platforms only); the reminder shows how many tasks are scheduled for today and the count refreshes on app launch
16 16 - **Light / dark / system** theme, persisted across sessions
17 17
18 18 ## Tech Stack
MODIFY app/(tabs)/settings.tsx +84 -12
diff --git "a/app/\050tabs\051/settings.tsx" "b/app/\050tabs\051/settings.tsx"
index e3455fe..ad616e7 100644
--- "a/app/\050tabs\051/settings.tsx"
+++ "b/app/\050tabs\051/settings.tsx"
@@ -1,19 +1,23 @@
1 1 import React, { useState } from 'react';
2 -import { StyleSheet, Alert, TouchableOpacity, ScrollView, Switch } from 'react-native';
2 +import { StyleSheet, Alert, TouchableOpacity, ScrollView, Switch, Platform } from 'react-native';
3 3 import { SafeAreaView } from 'react-native-safe-area-context';
4 4 import { router, useFocusEffect } from 'expo-router';
5 5 import * as DocumentPicker from 'expo-document-picker';
6 +import DateTimePicker from '@react-native-community/datetimepicker';
6 7 import { ThemedView } from '@/components/themed-view';
7 8 import { ThemedText } from '@/components/themed-text';
8 9 import { storageService, taskService, webdavService, notificationService } from '@/services';
9 10 import { useTheme } from '@/contexts/theme-context';
10 11 import { Colors } from '@/constants/theme';
11 12 import { useColorScheme } from '@/hooks/use-color-scheme';
13 +import { DEFAULT_REMINDER_TIME, ReminderTime, formatReminderTime } from '@/utils/reminder';
12 14
13 15 export default function SettingsScreen() {
14 16 const [syncing, setSyncing] = useState(false);
15 17 const [autoArchive, setAutoArchive] = useState(false);
16 18 const [dailyNotifications, setDailyNotifications] = useState(false);
19 + const [reminderTime, setReminderTime] = useState<ReminderTime>(DEFAULT_REMINDER_TIME);
20 + const [showTimePicker, setShowTimePicker] = useState(false);
17 21 const [webdavConfigured, setWebdavConfigured] = useState(false);
18 22 const [webdavInfo, setWebdavInfo] = useState<{ url: string; username: string } | null>(null);
19 23 const { themeMode, setThemeMode } = useTheme();
@@ -40,6 +44,7 @@
40 44 // Check if there are scheduled notifications
41 45 const scheduled = await notificationService.getScheduledNotifications();
42 46 setDailyNotifications(scheduled.length > 0);
47 + setReminderTime(await notificationService.getReminderTime());
43 48 };
44 49
45 50 const handleExport = async () => {
@@ -212,7 +217,7 @@
212 217 setDailyNotifications(true);
213 218 Alert.alert(
214 219 'Notifications Enabled',
215 - 'You will receive a daily reminder at 12:00 PM'
220 + `You will receive a daily reminder at ${formatReminderTime(reminderTime)}`
216 221 );
217 222 }
218 223 } else {
@@ -222,6 +227,32 @@
222 227 }
223 228 };
224 229
230 + const handleReminderTimeChange = async (
231 + event: { type: string },
232 + selectedDate?: Date
233 + ) => {
234 + setShowTimePicker(Platform.OS === 'ios');
235 + if (event.type === 'dismissed' || !selectedDate) {
236 + return;
237 + }
238 + const newTime: ReminderTime = {
239 + hour: selectedDate.getHours(),
240 + minute: selectedDate.getMinutes(),
241 + };
242 + setReminderTime(newTime);
243 + try {
244 + await notificationService.setReminderTime(newTime);
245 + } catch {
246 + Alert.alert('Error', 'Failed to update reminder time');
247 + }
248 + };
249 +
250 + const reminderDate = (() => {
251 + const date = new Date();
252 + date.setHours(reminderTime.hour, reminderTime.minute, 0, 0);
253 + return date;
254 + })();
255 +
225 256 const handleTestNotification = async () => {
226 257 const hasPermission = await notificationService.requestPermissions();
227 258 if (!hasPermission) {
@@ -301,7 +332,7 @@
301 332 <ThemedView style={styles.optionTextContainer}>
302 333 <ThemedText style={styles.optionText}>Daily Reminder</ThemedText>
303 334 <ThemedText style={styles.optionDescription}>
304 - Get notified daily at 12:00 PM
335 + Get notified daily at {formatReminderTime(reminderTime)} with your task count
305 336 </ThemedText>
306 337 </ThemedView>
307 338 <Switch
@@ -312,15 +343,46 @@
312 343 </ThemedView>
313 344
314 345 {dailyNotifications && (
315 - <TouchableOpacity
316 - style={[styles.option, { borderBottomColor: colors.border }]}
317 - onPress={handleTestNotification}
318 - >
319 - <ThemedText style={styles.optionText}>Send Test Notification</ThemedText>
320 - <ThemedText style={styles.optionDescription}>
321 - Test your notification settings
322 - </ThemedText>
323 - </TouchableOpacity>
346 + <>
347 + <ThemedView style={[styles.option, { borderBottomColor: colors.border }]}>
348 + <ThemedView style={styles.optionWithSwitch}>
349 + <ThemedView style={styles.optionTextContainer}>
350 + <ThemedText style={styles.optionText}>Reminder Time</ThemedText>
351 + <ThemedText style={styles.optionDescription}>
352 + When the daily reminder is sent
353 + </ThemedText>
354 + </ThemedView>
355 + <TouchableOpacity
356 + style={[styles.timeButton, { borderColor: colors.border }]}
357 + onPress={() => setShowTimePicker(true)}
358 + >
359 + <ThemedText style={[styles.timeButtonText, { color: colors.tint }]}>
360 + {formatReminderTime(reminderTime)}
361 + </ThemedText>
362 + </TouchableOpacity>
363 + </ThemedView>
364 + </ThemedView>
365 +
366 + {showTimePicker && (
367 + <DateTimePicker
368 + value={reminderDate}
369 + mode="time"
370 + is24Hour
371 + display={Platform.OS === 'ios' ? 'spinner' : 'default'}
372 + onChange={handleReminderTimeChange}
373 + />
374 + )}
375 +
376 + <TouchableOpacity
377 + style={[styles.option, { borderBottomColor: colors.border }]}
378 + onPress={handleTestNotification}
379 + >
380 + <ThemedText style={styles.optionText}>Send Test Notification</ThemedText>
381 + <ThemedText style={styles.optionDescription}>
382 + Test your notification settings
383 + </ThemedText>
384 + </TouchableOpacity>
385 + </>
324 386 )}
325 387 </ThemedView>
326 388
@@ -503,6 +565,16 @@
503 565 justifyContent: 'space-between',
504 566 alignItems: 'center',
505 567 },
568 + timeButton: {
569 + paddingVertical: 8,
570 + paddingHorizontal: 16,
571 + borderRadius: 8,
572 + borderWidth: 1,
573 + },
574 + timeButtonText: {
575 + fontSize: 16,
576 + fontWeight: '600',
577 + },
506 578 optionTextContainer: {
507 579 flex: 1,
508 580 },
MODIFY app/_layout.tsx +8 -0
diff --git a/app/_layout.tsx b/app/_layout.tsx
index 6745fc7..d50fb12 100644
--- a/app/_layout.tsx
+++ b/app/_layout.tsx
@@ -1,12 +1,14 @@
1 1 import { DarkTheme, DefaultTheme, ThemeProvider as NavigationThemeProvider } from '@react-navigation/native';
2 2 import { Stack } from 'expo-router';
3 3 import { StatusBar } from 'expo-status-bar';
4 +import { useEffect } from 'react';
4 5 import { SafeAreaProvider } from 'react-native-safe-area-context';
5 6 import 'react-native-reanimated';
6 7 import { GestureHandlerRootView } from 'react-native-gesture-handler';
7 8
8 9 import { useColorScheme } from '@/hooks/use-color-scheme';
9 10 import { ThemeProvider } from '@/contexts/theme-context';
11 +import { notificationService } from '@/services';
10 12
11 13 function RootLayoutNav() {
12 14 const colorScheme = useColorScheme();
@@ -41,6 +43,12 @@
41 43 }
42 44
43 45 export default function RootLayout() {
46 + useEffect(() => {
47 + // Refresh the daily reminder on launch so its task count and time stay
48 + // current if one is already scheduled.
49 + notificationService.refreshDailyNotificationIfEnabled();
50 + }, []);
51 +
44 52 return (
45 53 <GestureHandlerRootView style={{ flex: 1 }}>
46 54 <SafeAreaProvider>
MODIFY package-lock.json +2414 -68
diff --git a/package-lock.json b/package-lock.json
index 2c45111..0c9e83c 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -47,9 +47,12 @@
47 47 "webdav": "^5.8.0"
48 48 },
49 49 "devDependencies": {
50 + "@types/jest": "^29.5.12",
50 51 "@types/react": "~19.1.0",
51 52 "eslint": "^9.25.0",
52 53 "eslint-config-expo": "~10.0.0",
54 + "jest": "^29.7.0",
55 + "jest-expo": "~54.0.0",
53 56 "typescript": "~5.9.2"
54 57 }
55 58 },
@@ -95,7 +98,6 @@
95 98 "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz",
96 99 "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==",
97 100 "license": "MIT",
98 - "peer": true,
99 101 "dependencies": {
100 102 "@babel/code-frame": "^7.27.1",
101 103 "@babel/generator": "^7.28.5",
@@ -349,9 +351,9 @@
349 351 }
350 352 },
351 353 "node_modules/@babel/helper-validator-identifier": {
352 - "version": "7.28.5",
353 - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz",
354 - "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==",
354 + "version": "7.29.7",
355 + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz",
356 + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==",
355 357 "license": "MIT",
356 358 "engines": {
357 359 "node": ">=6.9.0"
@@ -1477,7 +1479,6 @@
1477 1479 "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.4.tgz",
1478 1480 "integrity": "sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==",
1479 1481 "license": "MIT",
1480 - "peer": true,
1481 1482 "engines": {
1482 1483 "node": ">=6.9.0"
1483 1484 }
@@ -1546,6 +1547,13 @@
1546 1547 "node": ">=6.9.0"
1547 1548 }
1548 1549 },
1550 + "node_modules/@bcoe/v8-coverage": {
1551 + "version": "0.2.3",
1552 + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz",
1553 + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==",
1554 + "dev": true,
1555 + "license": "MIT"
1556 + },
1549 1557 "node_modules/@buttercup/fetch": {
1550 1558 "version": "0.2.1",
1551 1559 "resolved": "https://registry.npmjs.org/@buttercup/fetch/-/fetch-0.2.1.tgz",
@@ -1775,40 +1783,40 @@
1775 1783 }
1776 1784 },
1777 1785 "node_modules/@expo/config": {
1778 - "version": "12.0.10",
1779 - "resolved": "https://registry.npmjs.org/@expo/config/-/config-12.0.10.tgz",
1780 - "integrity": "sha512-lJMof5Nqakq1DxGYlghYB/ogSBjmv4Fxn1ovyDmcjlRsQdFCXgu06gEUogkhPtc9wBt9WlTTfqENln5HHyLW6w==",
1786 + "version": "12.0.13",
1787 + "resolved": "https://registry.npmjs.org/@expo/config/-/config-12.0.13.tgz",
1788 + "integrity": "sha512-Cu52arBa4vSaupIWsF0h7F/Cg//N374nYb7HAxV0I4KceKA7x2UXpYaHOL7EEYYvp7tZdThBjvGpVmr8ScIvaQ==",
1781 1789 "license": "MIT",
1782 1790 "dependencies": {
1783 1791 "@babel/code-frame": "~7.10.4",
1784 - "@expo/config-plugins": "~54.0.2",
1785 - "@expo/config-types": "^54.0.8",
1786 - "@expo/json-file": "^10.0.7",
1792 + "@expo/config-plugins": "~54.0.4",
1793 + "@expo/config-types": "^54.0.10",
1794 + "@expo/json-file": "^10.0.8",
1787 1795 "deepmerge": "^4.3.1",
1788 1796 "getenv": "^2.0.0",
1789 - "glob": "^10.4.2",
1797 + "glob": "^13.0.0",
1790 1798 "require-from-string": "^2.0.2",
1791 1799 "resolve-from": "^5.0.0",
1792 1800 "resolve-workspace-root": "^2.0.0",
1793 1801 "semver": "^7.6.0",
1794 1802 "slugify": "^1.3.4",
1795 - "sucrase": "3.35.0"
1803 + "sucrase": "~3.35.1"
1796 1804 }
1797 1805 },
1798 1806 "node_modules/@expo/config-plugins": {
1799 - "version": "54.0.2",
1800 - "resolved": "https://registry.npmjs.org/@expo/config-plugins/-/config-plugins-54.0.2.tgz",
1801 - "integrity": "sha512-jD4qxFcURQUVsUFGMcbo63a/AnviK8WUGard+yrdQE3ZrB/aurn68SlApjirQQLEizhjI5Ar2ufqflOBlNpyPg==",
1807 + "version": "54.0.4",
1808 + "resolved": "https://registry.npmjs.org/@expo/config-plugins/-/config-plugins-54.0.4.tgz",
1809 + "integrity": "sha512-g2yXGICdoOw5i3LkQSDxl2Q5AlQCrG7oniu0pCPPO+UxGb7He4AFqSvPSy8HpRUj55io17hT62FTjYRD+d6j3Q==",
1802 1810 "license": "MIT",
1803 1811 "dependencies": {
1804 - "@expo/config-types": "^54.0.8",
1805 - "@expo/json-file": "~10.0.7",
1806 - "@expo/plist": "^0.4.7",
1812 + "@expo/config-types": "^54.0.10",
1813 + "@expo/json-file": "~10.0.8",
1814 + "@expo/plist": "^0.4.8",
1807 1815 "@expo/sdk-runtime-versions": "^1.0.0",
1808 1816 "chalk": "^4.1.2",
1809 1817 "debug": "^4.3.5",
1810 1818 "getenv": "^2.0.0",
1811 - "glob": "^10.4.2",
1819 + "glob": "^13.0.0",
1812 1820 "resolve-from": "^5.0.0",
1813 1821 "semver": "^7.5.4",
1814 1822 "slash": "^3.0.0",
@@ -1817,6 +1825,84 @@
1817 1825 "xml2js": "0.6.0"
1818 1826 }
1819 1827 },
1828 + "node_modules/@expo/config-plugins/node_modules/balanced-match": {
1829 + "version": "4.0.4",
1830 + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz",
1831 + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==",
1832 + "license": "MIT",
1833 + "engines": {
1834 + "node": "18 || 20 || >=22"
1835 + }
1836 + },
1837 + "node_modules/@expo/config-plugins/node_modules/brace-expansion": {
1838 + "version": "5.0.6",
1839 + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz",
1840 + "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==",
1841 + "license": "MIT",
1842 + "dependencies": {
1843 + "balanced-match": "^4.0.2"
1844 + },
1845 + "engines": {
1846 + "node": "18 || 20 || >=22"
1847 + }
1848 + },
1849 + "node_modules/@expo/config-plugins/node_modules/glob": {
1850 + "version": "13.0.6",
1851 + "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz",
1852 + "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==",
1853 + "license": "BlueOak-1.0.0",
1854 + "dependencies": {
1855 + "minimatch": "^10.2.2",
1856 + "minipass": "^7.1.3",
1857 + "path-scurry": "^2.0.2"
1858 + },
1859 + "engines": {
1860 + "node": "18 || 20 || >=22"
1861 + },
1862 + "funding": {
1863 + "url": "https://github.com/sponsors/isaacs"
1864 + }
1865 + },
1866 + "node_modules/@expo/config-plugins/node_modules/lru-cache": {
1867 + "version": "11.5.1",
1868 + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.1.tgz",
1869 + "integrity": "sha512-RPimw/7aMdv2oqRrxKwvZXcPfwBrn/JZ2xYcY9Hus/6LaS3VOAKVWKWgNLCFSiOm1ESXinjsDlidVU7JlnCN2A==",
1870 + "license": "BlueOak-1.0.0",
1871 + "engines": {
1872 + "node": "20 || >=22"
1873 + }
1874 + },
1875 + "node_modules/@expo/config-plugins/node_modules/minimatch": {
1876 + "version": "10.2.5",
1877 + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz",
1878 + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==",
1879 + "license": "BlueOak-1.0.0",
1880 + "dependencies": {
1881 + "brace-expansion": "^5.0.5"
1882 + },
1883 + "engines": {
1884 + "node": "18 || 20 || >=22"
1885 + },
1886 + "funding": {
1887 + "url": "https://github.com/sponsors/isaacs"
1888 + }
1889 + },
1890 + "node_modules/@expo/config-plugins/node_modules/path-scurry": {
1891 + "version": "2.0.2",
1892 + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz",
1893 + "integrity": "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==",
1894 + "license": "BlueOak-1.0.0",
1895 + "dependencies": {
1896 + "lru-cache": "^11.0.0",
1897 + "minipass": "^7.1.2"
1898 + },
1899 + "engines": {
1900 + "node": "18 || 20 || >=22"
1901 + },
1902 + "funding": {
1903 + "url": "https://github.com/sponsors/isaacs"
1904 + }
1905 + },
1820 1906 "node_modules/@expo/config-plugins/node_modules/semver": {
1821 1907 "version": "7.7.3",
1822 1908 "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz",
@@ -1830,9 +1916,9 @@
1830 1916 }
1831 1917 },
1832 1918 "node_modules/@expo/config-types": {
1833 - "version": "54.0.8",
1834 - "resolved": "https://registry.npmjs.org/@expo/config-types/-/config-types-54.0.8.tgz",
1835 - "integrity": "sha512-lyIn/x/Yz0SgHL7IGWtgTLg6TJWC9vL7489++0hzCHZ4iGjVcfZmPTUfiragZ3HycFFj899qN0jlhl49IHa94A==",
1919 + "version": "54.0.10",
1920 + "resolved": "https://registry.npmjs.org/@expo/config-types/-/config-types-54.0.10.tgz",
1921 + "integrity": "sha512-/J16SC2an1LdtCZ67xhSkGXpALYUVUNyZws7v+PVsFZxClYehDSoKLqyRaGkpHlYrCc08bS0RF5E0JV6g50psA==",
1836 1922 "license": "MIT"
1837 1923 },
1838 1924 "node_modules/@expo/config/node_modules/@babel/code-frame": {
@@ -1844,6 +1930,108 @@
1844 1930 "@babel/highlight": "^7.10.4"
1845 1931 }
1846 1932 },
1933 + "node_modules/@expo/config/node_modules/@expo/json-file": {
1934 + "version": "10.2.0",
1935 + "resolved": "https://registry.npmjs.org/@expo/json-file/-/json-file-10.2.0.tgz",
1936 + "integrity": "sha512-S6XzKe3R9GQeHiUPXc3xJjOv2VJhOEwFYf7xdC2z2cUqt3kZJ9mSO877sNQloVdnW/SUCtPY3bexlM7nwq+CAQ==",
1937 + "license": "MIT",
1938 + "dependencies": {
1939 + "@babel/code-frame": "^7.20.0",
1940 + "json5": "^2.2.3"
1941 + }
1942 + },
1943 + "node_modules/@expo/config/node_modules/@expo/json-file/node_modules/@babel/code-frame": {
1944 + "version": "7.29.7",
1945 + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz",
1946 + "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==",
1947 + "license": "MIT",
1948 + "dependencies": {
1949 + "@babel/helper-validator-identifier": "^7.29.7",
1950 + "js-tokens": "^4.0.0",
1951 + "picocolors": "^1.1.1"
1952 + },
1953 + "engines": {
1954 + "node": ">=6.9.0"
1955 + }
1956 + },
1957 + "node_modules/@expo/config/node_modules/balanced-match": {
1958 + "version": "4.0.4",
1959 + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz",
1960 + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==",
1961 + "license": "MIT",
1962 + "engines": {
1963 + "node": "18 || 20 || >=22"
1964 + }
1965 + },
1966 + "node_modules/@expo/config/node_modules/brace-expansion": {
1967 + "version": "5.0.6",
1968 + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz",
1969 + "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==",
1970 + "license": "MIT",
1971 + "dependencies": {
1972 + "balanced-match": "^4.0.2"
1973 + },
1974 + "engines": {
1975 + "node": "18 || 20 || >=22"
1976 + }
1977 + },
1978 + "node_modules/@expo/config/node_modules/glob": {
1979 + "version": "13.0.6",
1980 + "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz",
1981 + "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==",
1982 + "license": "BlueOak-1.0.0",
1983 + "dependencies": {
1984 + "minimatch": "^10.2.2",
1985 + "minipass": "^7.1.3",
1986 + "path-scurry": "^2.0.2"
1987 + },
1988 + "engines": {
1989 + "node": "18 || 20 || >=22"
1990 + },
1991 + "funding": {
1992 + "url": "https://github.com/sponsors/isaacs"
1993 + }
1994 + },
1995 + "node_modules/@expo/config/node_modules/lru-cache": {
1996 + "version": "11.5.1",
1997 + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.1.tgz",
1998 + "integrity": "sha512-RPimw/7aMdv2oqRrxKwvZXcPfwBrn/JZ2xYcY9Hus/6LaS3VOAKVWKWgNLCFSiOm1ESXinjsDlidVU7JlnCN2A==",
1999 + "license": "BlueOak-1.0.0",
2000 + "engines": {
2001 + "node": "20 || >=22"
2002 + }
2003 + },
2004 + "node_modules/@expo/config/node_modules/minimatch": {
2005 + "version": "10.2.5",
2006 + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz",
2007 + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==",
2008 + "license": "BlueOak-1.0.0",
2009 + "dependencies": {
2010 + "brace-expansion": "^5.0.5"
2011 + },
2012 + "engines": {
2013 + "node": "18 || 20 || >=22"
2014 + },
2015 + "funding": {
2016 + "url": "https://github.com/sponsors/isaacs"
2017 + }
2018 + },
2019 + "node_modules/@expo/config/node_modules/path-scurry": {
2020 + "version": "2.0.2",
2021 + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz",
2022 + "integrity": "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==",
2023 + "license": "BlueOak-1.0.0",
2024 + "dependencies": {
2025 + "lru-cache": "^11.0.0",
2026 + "minipass": "^7.1.2"
2027 + },
2028 + "engines": {
2029 + "node": "18 || 20 || >=22"
2030 + },
2031 + "funding": {
2032 + "url": "https://github.com/sponsors/isaacs"
2033 + }
2034 + },
1847 2035 "node_modules/@expo/config/node_modules/semver": {
1848 2036 "version": "7.7.3",
1849 2037 "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz",
@@ -1999,9 +2187,9 @@
1999 2187 }
2000 2188 },
2001 2189 "node_modules/@expo/json-file": {
2002 - "version": "10.0.7",
2003 - "resolved": "https://registry.npmjs.org/@expo/json-file/-/json-file-10.0.7.tgz",
2004 - "integrity": "sha512-z2OTC0XNO6riZu98EjdNHC05l51ySeTto6GP7oSQrCvQgG9ARBwD1YvMQaVZ9wU7p/4LzSf1O7tckL3B45fPpw==",
2190 + "version": "10.0.16",
2191 + "resolved": "https://registry.npmjs.org/@expo/json-file/-/json-file-10.0.16.tgz",
2192 + "integrity": "sha512-fcVkWEj+hLuP2yt5W0aw6LmDRqSPWDLUSxOMcmFeV+algmIF59sQVKCwB9btjQLd4V6x9N0pISkQEkBubUHrCw==",
2005 2193 "license": "MIT",
2006 2194 "dependencies": {
2007 2195 "@babel/code-frame": "~7.10.4",
@@ -2189,9 +2377,9 @@
2189 2377 }
2190 2378 },
2191 2379 "node_modules/@expo/plist": {
2192 - "version": "0.4.7",
2193 - "resolved": "https://registry.npmjs.org/@expo/plist/-/plist-0.4.7.tgz",
2194 - "integrity": "sha512-dGxqHPvCZKeRKDU1sJZMmuyVtcASuSYh1LPFVaM1DuffqPL36n6FMEL0iUqq2Tx3xhWk8wCnWl34IKplUjJDdA==",
2380 + "version": "0.4.9",
2381 + "resolved": "https://registry.npmjs.org/@expo/plist/-/plist-0.4.9.tgz",
2382 + "integrity": "sha512-MPVpmKGfnQEnrCzgxuXcmPP/y/t6AVm+DcSb2Myp21LKWv1N3l8uFxMggesfF4ixAxkRlGmMMx9GyDC9M+XklQ==",
2195 2383 "license": "MIT",
2196 2384 "dependencies": {
2197 2385 "@xmldom/xmldom": "^0.8.8",
@@ -2507,6 +2695,101 @@
2507 2695 "node": ">=8"
2508 2696 }
2509 2697 },
2698 + "node_modules/@jest/console": {
2699 + "version": "29.7.0",
2700 + "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz",
2701 + "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==",
2702 + "dev": true,
2703 + "license": "MIT",
2704 + "dependencies": {
2705 + "@jest/types": "^29.6.3",
2706 + "@types/node": "*",
2707 + "chalk": "^4.0.0",
2708 + "jest-message-util": "^29.7.0",
2709 + "jest-util": "^29.7.0",
2710 + "slash": "^3.0.0"
2711 + },
2712 + "engines": {
2713 + "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
2714 + }
2715 + },
2716 + "node_modules/@jest/core": {
2717 + "version": "29.7.0",
2718 + "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz",
2719 + "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==",
2720 + "dev": true,
2721 + "license": "MIT",
2722 + "dependencies": {
2723 + "@jest/console": "^29.7.0",
2724 + "@jest/reporters": "^29.7.0",
2725 + "@jest/test-result": "^29.7.0",
2726 + "@jest/transform": "^29.7.0",
2727 + "@jest/types": "^29.6.3",
2728 + "@types/node": "*",
2729 + "ansi-escapes": "^4.2.1",
2730 + "chalk": "^4.0.0",
2731 + "ci-info": "^3.2.0",
2732 + "exit": "^0.1.2",
2733 + "graceful-fs": "^4.2.9",
2734 + "jest-changed-files": "^29.7.0",
2735 + "jest-config": "^29.7.0",
2736 + "jest-haste-map": "^29.7.0",
2737 + "jest-message-util": "^29.7.0",
2738 + "jest-regex-util": "^29.6.3",
2739 + "jest-resolve": "^29.7.0",
2740 + "jest-resolve-dependencies": "^29.7.0",
2741 + "jest-runner": "^29.7.0",
2742 + "jest-runtime": "^29.7.0",
2743 + "jest-snapshot": "^29.7.0",
2744 + "jest-util": "^29.7.0",
2745 + "jest-validate": "^29.7.0",
2746 + "jest-watcher": "^29.7.0",
2747 + "micromatch": "^4.0.4",
2748 + "pretty-format": "^29.7.0",
2749 + "slash": "^3.0.0",
2750 + "strip-ansi": "^6.0.0"
2751 + },
2752 + "engines": {
2753 + "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
2754 + },
2755 + "peerDependencies": {
2756 + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
2757 + },
2758 + "peerDependenciesMeta": {
2759 + "node-notifier": {
2760 + "optional": true
2761 + }
2762 + }
2763 + },
2764 + "node_modules/@jest/core/node_modules/ci-info": {
2765 + "version": "3.9.0",
2766 + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz",
2767 + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==",
2768 + "dev": true,
2769 + "funding": [
2770 + {
2771 + "type": "github",
2772 + "url": "https://github.com/sponsors/sibiraj-s"
2773 + }
2774 + ],
2775 + "license": "MIT",
2776 + "engines": {
2777 + "node": ">=8"
2778 + }
2779 + },
2780 + "node_modules/@jest/core/node_modules/strip-ansi": {
2781 + "version": "6.0.1",
2782 + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
2783 + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
2784 + "dev": true,
2785 + "license": "MIT",
2786 + "dependencies": {
2787 + "ansi-regex": "^5.0.1"
2788 + },
2789 + "engines": {
2790 + "node": ">=8"
2791 + }
2792 + },
2510 2793 "node_modules/@jest/create-cache-key-function": {
2511 2794 "version": "29.7.0",
2512 2795 "resolved": "https://registry.npmjs.org/@jest/create-cache-key-function/-/create-cache-key-function-29.7.0.tgz",
@@ -2534,6 +2817,33 @@
2534 2817 "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
2535 2818 }
2536 2819 },
2820 + "node_modules/@jest/expect": {
2821 + "version": "29.7.0",
2822 + "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz",
2823 + "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==",
2824 + "dev": true,
2825 + "license": "MIT",
2826 + "dependencies": {
2827 + "expect": "^29.7.0",
2828 + "jest-snapshot": "^29.7.0"
2829 + },
2830 + "engines": {
2831 + "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
2832 + }
2833 + },
2834 + "node_modules/@jest/expect-utils": {
2835 + "version": "29.7.0",
2836 + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz",
2837 + "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==",
2838 + "dev": true,
2839 + "license": "MIT",
2840 + "dependencies": {
2841 + "jest-get-type": "^29.6.3"
2842 + },
2843 + "engines": {
2844 + "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
2845 + }
2846 + },
2537 2847 "node_modules/@jest/fake-timers": {
2538 2848 "version": "29.7.0",
2539 2849 "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz",
@@ -2551,6 +2861,131 @@
2551 2861 "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
2552 2862 }
2553 2863 },
2864 + "node_modules/@jest/globals": {
2865 + "version": "29.7.0",
2866 + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz",
2867 + "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==",
2868 + "dev": true,
2869 + "license": "MIT",
2870 + "dependencies": {
2871 + "@jest/environment": "^29.7.0",
2872 + "@jest/expect": "^29.7.0",
2873 + "@jest/types": "^29.6.3",
2874 + "jest-mock": "^29.7.0"
2875 + },
2876 + "engines": {
2877 + "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
2878 + }
2879 + },
2880 + "node_modules/@jest/reporters": {
2881 + "version": "29.7.0",
2882 + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz",
2883 + "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==",
2884 + "dev": true,
2885 + "license": "MIT",
2886 + "dependencies": {
2887 + "@bcoe/v8-coverage": "^0.2.3",
2888 + "@jest/console": "^29.7.0",
2889 + "@jest/test-result": "^29.7.0",
2890 + "@jest/transform": "^29.7.0",
2891 + "@jest/types": "^29.6.3",
2892 + "@jridgewell/trace-mapping": "^0.3.18",
2893 + "@types/node": "*",
2894 + "chalk": "^4.0.0",
2895 + "collect-v8-coverage": "^1.0.0",
2896 + "exit": "^0.1.2",
2897 + "glob": "^7.1.3",
2898 + "graceful-fs": "^4.2.9",
2899 + "istanbul-lib-coverage": "^3.0.0",
2900 + "istanbul-lib-instrument": "^6.0.0",
2901 + "istanbul-lib-report": "^3.0.0",
2902 + "istanbul-lib-source-maps": "^4.0.0",
2903 + "istanbul-reports": "^3.1.3",
2904 + "jest-message-util": "^29.7.0",
2905 + "jest-util": "^29.7.0",
2906 + "jest-worker": "^29.7.0",
2907 + "slash": "^3.0.0",
2908 + "string-length": "^4.0.1",
2909 + "strip-ansi": "^6.0.0",
2910 + "v8-to-istanbul": "^9.0.1"
2911 + },
2912 + "engines": {
2913 + "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
2914 + },
2915 + "peerDependencies": {
2916 + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
2917 + },
2918 + "peerDependenciesMeta": {
2919 + "node-notifier": {
2920 + "optional": true
2921 + }
2922 + }
2923 + },
2924 + "node_modules/@jest/reporters/node_modules/glob": {
2925 + "version": "7.2.3",
2926 + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
2927 + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
2928 + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me",
2929 + "dev": true,
2930 + "license": "ISC",
2931 + "dependencies": {
2932 + "fs.realpath": "^1.0.0",
2933 + "inflight": "^1.0.4",
2934 + "inherits": "2",
2935 + "minimatch": "^3.1.1",
2936 + "once": "^1.3.0",
2937 + "path-is-absolute": "^1.0.0"
2938 + },
2939 + "engines": {
2940 + "node": "*"
2941 + },
2942 + "funding": {
2943 + "url": "https://github.com/sponsors/isaacs"
2944 + }
2945 + },
2946 + "node_modules/@jest/reporters/node_modules/istanbul-lib-instrument": {
2947 + "version": "6.0.3",
2948 + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz",
2949 + "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==",
2950 + "dev": true,
2951 + "license": "BSD-3-Clause",
2952 + "dependencies": {
2953 + "@babel/core": "^7.23.9",
2954 + "@babel/parser": "^7.23.9",
2955 + "@istanbuljs/schema": "^0.1.3",
2956 + "istanbul-lib-coverage": "^3.2.0",
2957 + "semver": "^7.5.4"
2958 + },
2959 + "engines": {
2960 + "node": ">=10"
2961 + }
2962 + },
2963 + "node_modules/@jest/reporters/node_modules/semver": {
2964 + "version": "7.8.4",
2965 + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.4.tgz",
2966 + "integrity": "sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA==",
2967 + "dev": true,
2968 + "license": "ISC",
2969 + "bin": {
2970 + "semver": "bin/semver.js"
2971 + },
2972 + "engines": {
2973 + "node": ">=10"
2974 + }
2975 + },
2976 + "node_modules/@jest/reporters/node_modules/strip-ansi": {
2977 + "version": "6.0.1",
2978 + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
2979 + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
2980 + "dev": true,
2981 + "license": "MIT",
2982 + "dependencies": {
2983 + "ansi-regex": "^5.0.1"
2984 + },
2985 + "engines": {
2986 + "node": ">=8"
2987 + }
2988 + },
2554 2989 "node_modules/@jest/schemas": {
2555 2990 "version": "29.6.3",
2556 2991 "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz",
@@ -2563,6 +2998,53 @@
2563 2998 "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
2564 2999 }
2565 3000 },
3001 + "node_modules/@jest/source-map": {
3002 + "version": "29.6.3",
3003 + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz",
3004 + "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==",
3005 + "dev": true,
3006 + "license": "MIT",
3007 + "dependencies": {
3008 + "@jridgewell/trace-mapping": "^0.3.18",
3009 + "callsites": "^3.0.0",
3010 + "graceful-fs": "^4.2.9"
3011 + },
3012 + "engines": {
3013 + "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
3014 + }
3015 + },
3016 + "node_modules/@jest/test-result": {
3017 + "version": "29.7.0",
3018 + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz",
3019 + "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==",
3020 + "dev": true,
3021 + "license": "MIT",
3022 + "dependencies": {
3023 + "@jest/console": "^29.7.0",
3024 + "@jest/types": "^29.6.3",
3025 + "@types/istanbul-lib-coverage": "^2.0.0",
3026 + "collect-v8-coverage": "^1.0.0"
3027 + },
3028 + "engines": {
3029 + "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
3030 + }
3031 + },
3032 + "node_modules/@jest/test-sequencer": {
3033 + "version": "29.7.0",
3034 + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz",
3035 + "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==",
3036 + "dev": true,
3037 + "license": "MIT",
3038 + "dependencies": {
3039 + "@jest/test-result": "^29.7.0",
3040 + "graceful-fs": "^4.2.9",
3041 + "jest-haste-map": "^29.7.0",
3042 + "slash": "^3.0.0"
3043 + },
3044 + "engines": {
3045 + "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
3046 + }
3047 + },
2566 3048 "node_modules/@jest/transform": {
2567 3049 "version": "29.7.0",
2568 3050 "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz",
@@ -3266,7 +3748,6 @@
3266 3748 "resolved": "https://registry.npmjs.org/@react-navigation/native/-/native-7.1.20.tgz",
3267 3749 "integrity": "sha512-15luFq+35M2IOMHgbTJ0XDkPY7gm3YlR3yQKTuOTOHs+EeAUX71DlUuqcWMRqB0tt+OT6HimDQR7OboTB0N30g==",
3268 3750 "license": "MIT",
3269 - "peer": true,
3270 3751 "dependencies": {
3271 3752 "@react-navigation/core": "^7.13.1",
3272 3753 "escape-string-regexp": "^4.0.0",
@@ -3338,6 +3819,16 @@
3338 3819 "@sinonjs/commons": "^3.0.0"
3339 3820 }
3340 3821 },
3822 + "node_modules/@tootallnate/once": {
3823 + "version": "2.0.1",
3824 + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.1.tgz",
3825 + "integrity": "sha512-HqmEUIGRJ5fSXchkVgR5F7qn48bDBzv0kWj/Kfu5e6uci4UlEeng4331LnBkWffb++Ei3FOVLxo8JJWMFBDMeQ==",
3826 + "dev": true,
3827 + "license": "MIT",
3828 + "engines": {
3829 + "node": ">= 10"
3830 + }
3831 + },
3341 3832 "node_modules/@tybys/wasm-util": {
3342 3833 "version": "0.10.1",
3343 3834 "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz",
@@ -3436,6 +3927,29 @@
3436 3927 "@types/istanbul-lib-report": "*"
3437 3928 }
3438 3929 },
3930 + "node_modules/@types/jest": {
3931 + "version": "29.5.14",
3932 + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.14.tgz",
3933 + "integrity": "sha512-ZN+4sdnLUbo8EVvVc2ao0GFW6oVrQRPn4K2lglySj7APvSrgzxHiNNK99us4WDMi57xxA2yggblIAMNhXOotLQ==",
3934 + "dev": true,
3935 + "license": "MIT",
3936 + "dependencies": {
3937 + "expect": "^29.0.0",
3938 + "pretty-format": "^29.0.0"
3939 + }
3940 + },
3941 + "node_modules/@types/jsdom": {
3942 + "version": "20.0.1",
3943 + "resolved": "https://registry.npmjs.org/@types/jsdom/-/jsdom-20.0.1.tgz",
3944 + "integrity": "sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ==",
3945 + "dev": true,
3946 + "license": "MIT",
3947 + "dependencies": {
3948 + "@types/node": "*",
3949 + "@types/tough-cookie": "*",
3950 + "parse5": "^7.0.0"
3951 + }
3952 + },
3439 3953 "node_modules/@types/json-schema": {
3440 3954 "version": "7.0.15",
3441 3955 "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
@@ -3465,7 +3979,6 @@
3465 3979 "integrity": "sha512-Qec1E3mhALmaspIrhWt9jkQMNdw6bReVu64mjvhbhq2NFPftLPVr+l1SZgmw/66WwBNpDh7ao5AT6gF5v41PFA==",
3466 3980 "devOptional": true,
3467 3981 "license": "MIT",
3468 - "peer": true,
3469 3982 "dependencies": {
3470 3983 "csstype": "^3.0.2"
3471 3984 }
@@ -3476,6 +3989,13 @@
3476 3989 "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==",
3477 3990 "license": "MIT"
3478 3991 },
3992 + "node_modules/@types/tough-cookie": {
3993 + "version": "4.0.5",
3994 + "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz",
3995 + "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==",
3996 + "dev": true,
3997 + "license": "MIT"
3998 + },
3479 3999 "node_modules/@types/yargs": {
3480 4000 "version": "17.0.34",
3481 4001 "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.34.tgz",
@@ -3537,7 +4057,6 @@
3537 4057 "integrity": "sha512-6m1I5RmHBGTnUGS113G04DMu3CpSdxCAU/UvtjNWL4Nuf3MW9tQhiJqRlHzChIkhy6kZSAQmc+I1bcGjE3yNKg==",
3538 4058 "dev": true,
3539 4059 "license": "MIT",
3540 - "peer": true,
3541 4060 "dependencies": {
3542 4061 "@typescript-eslint/scope-manager": "8.46.3",
3543 4062 "@typescript-eslint/types": "8.46.3",
@@ -4070,6 +4589,14 @@
4070 4589 "node": ">=10.0.0"
4071 4590 }
4072 4591 },
4592 + "node_modules/abab": {
4593 + "version": "2.0.6",
4594 + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz",
4595 + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==",
4596 + "deprecated": "Use your platform's native atob() and btoa() methods instead",
4597 + "dev": true,
4598 + "license": "BSD-3-Clause"
4599 + },
4073 4600 "node_modules/abort-controller": {
4074 4601 "version": "3.0.0",
4075 4602 "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz",
@@ -4100,7 +4627,6 @@
4100 4627 "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz",
4101 4628 "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==",
4102 4629 "license": "MIT",
4103 - "peer": true,
4104 4630 "bin": {
4105 4631 "acorn": "bin/acorn"
4106 4632 },
@@ -4108,6 +4634,17 @@
4108 4634 "node": ">=0.4.0"
4109 4635 }
4110 4636 },
4637 + "node_modules/acorn-globals": {
4638 + "version": "7.0.1",
4639 + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-7.0.1.tgz",
4640 + "integrity": "sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==",
4641 + "dev": true,
4642 + "license": "MIT",
4643 + "dependencies": {
4644 + "acorn": "^8.1.0",
4645 + "acorn-walk": "^8.0.2"
4646 + }
4647 + },
4111 4648 "node_modules/acorn-jsx": {
4112 4649 "version": "5.3.2",
4113 4650 "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
@@ -4118,6 +4655,19 @@
4118 4655 "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
4119 4656 }
4120 4657 },
4658 + "node_modules/acorn-walk": {
4659 + "version": "8.3.5",
4660 + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.5.tgz",
4661 + "integrity": "sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==",
4662 + "dev": true,
4663 + "license": "MIT",
4664 + "dependencies": {
4665 + "acorn": "^8.11.0"
4666 + },
4667 + "engines": {
4668 + "node": ">=0.4.0"
4669 + }
4670 + },
4121 4671 "node_modules/agent-base": {
4122 4672 "version": "7.1.4",
4123 4673 "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz",
@@ -4439,6 +4989,13 @@
4439 4989 "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==",
4440 4990 "license": "MIT"
4441 4991 },
4992 + "node_modules/asynckit": {
4993 + "version": "0.4.0",
4994 + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
4995 + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
4996 + "dev": true,
4997 + "license": "MIT"
4998 + },
4442 4999 "node_modules/available-typed-arrays": {
4443 5000 "version": "1.0.7",
4444 5001 "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz",
@@ -4810,7 +5367,6 @@
4810 5367 }
4811 5368 ],
4812 5369 "license": "MIT",
4813 - "peer": true,
4814 5370 "dependencies": {
4815 5371 "baseline-browser-mapping": "^2.8.19",
4816 5372 "caniuse-lite": "^1.0.30001751",
@@ -4984,6 +5540,16 @@
4984 5540 "url": "https://github.com/chalk/chalk?sponsor=1"
4985 5541 }
4986 5542 },
5543 + "node_modules/char-regex": {
5544 + "version": "1.0.2",
5545 + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz",
5546 + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==",
5547 + "dev": true,
5548 + "license": "MIT",
5549 + "engines": {
5550 + "node": ">=10"
5551 + }
5552 + },
4987 5553 "node_modules/charenc": {
4988 5554 "version": "0.0.2",
4989 5555 "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz",
@@ -5040,6 +5606,13 @@
5040 5606 "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==",
5041 5607 "license": "MIT"
5042 5608 },
5609 + "node_modules/cjs-module-lexer": {
5610 + "version": "1.4.3",
5611 + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz",
5612 + "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==",
5613 + "dev": true,
5614 + "license": "MIT"
5615 + },
5043 5616 "node_modules/cli-cursor": {
5044 5617 "version": "2.1.0",
5045 5618 "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz",
@@ -5142,6 +5715,24 @@
5142 5715 "node": ">=0.8"
5143 5716 }
5144 5717 },
5718 + "node_modules/co": {
5719 + "version": "4.6.0",
5720 + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
5721 + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==",
5722 + "dev": true,
5723 + "license": "MIT",
5724 + "engines": {
5725 + "iojs": ">= 1.0.0",
5726 + "node": ">= 0.12.0"
5727 + }
5728 + },
5729 + "node_modules/collect-v8-coverage": {
5730 + "version": "1.0.3",
5731 + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.3.tgz",
5732 + "integrity": "sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw==",
5733 + "dev": true,
5734 + "license": "MIT"
5735 + },
5145 5736 "node_modules/color": {
5146 5737 "version": "4.2.3",
5147 5738 "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz",
@@ -5183,6 +5774,19 @@
5183 5774 "simple-swizzle": "^0.2.2"
5184 5775 }
5185 5776 },
5777 + "node_modules/combined-stream": {
5778 + "version": "1.0.8",
5779 + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
5780 + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
5781 + "dev": true,
5782 + "license": "MIT",
5783 + "dependencies": {
5784 + "delayed-stream": "~1.0.0"
5785 + },
5786 + "engines": {
5787 + "node": ">= 0.8"
5788 + }
5789 + },
5186 5790 "node_modules/commander": {
5187 5791 "version": "7.2.0",
5188 5792 "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz",
@@ -5301,6 +5905,28 @@
5301 5905 "url": "https://opencollective.com/core-js"
5302 5906 }
5303 5907 },
5908 + "node_modules/create-jest": {
5909 + "version": "29.7.0",
5910 + "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz",
5911 + "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==",
5912 + "dev": true,
5913 + "license": "MIT",
5914 + "dependencies": {
5915 + "@jest/types": "^29.6.3",
5916 + "chalk": "^4.0.0",
5917 + "exit": "^0.1.2",
5918 + "graceful-fs": "^4.2.9",
5919 + "jest-config": "^29.7.0",
5920 + "jest-util": "^29.7.0",
5921 + "prompts": "^2.0.1"
5922 + },
5923 + "bin": {
5924 + "create-jest": "bin/create-jest.js"
5925 + },
5926 + "engines": {
5927 + "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
5928 + }
5929 + },
5304 5930 "node_modules/cross-fetch": {
5305 5931 "version": "3.2.0",
5306 5932 "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.2.0.tgz",
@@ -5351,6 +5977,33 @@
5351 5977 "hyphenate-style-name": "^1.0.3"
5352 5978 }
5353 5979 },
5980 + "node_modules/cssom": {
5981 + "version": "0.5.0",
5982 + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz",
5983 + "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==",
5984 + "dev": true,
5985 + "license": "MIT"
5986 + },
5987 + "node_modules/cssstyle": {
5988 + "version": "2.3.0",
5989 + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz",
5990 + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==",
5991 + "dev": true,
5992 + "license": "MIT",
5993 + "dependencies": {
5994 + "cssom": "~0.3.6"
5995 + },
5996 + "engines": {
5997 + "node": ">=8"
5998 + }
5999 + },
6000 + "node_modules/cssstyle/node_modules/cssom": {
6001 + "version": "0.3.8",
6002 + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz",
6003 + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==",
6004 + "dev": true,
6005 + "license": "MIT"
6006 + },
5354 6007 "node_modules/csstype": {
5355 6008 "version": "3.1.3",
5356 6009 "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
@@ -5367,6 +6020,58 @@
5367 6020 "node": ">= 12"
5368 6021 }
5369 6022 },
6023 + "node_modules/data-urls": {
6024 + "version": "3.0.2",
6025 + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz",
6026 + "integrity": "sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==",
6027 + "dev": true,
6028 + "license": "MIT",
6029 + "dependencies": {
6030 + "abab": "^2.0.6",
6031 + "whatwg-mimetype": "^3.0.0",
6032 + "whatwg-url": "^11.0.0"
6033 + },
6034 + "engines": {
6035 + "node": ">=12"
6036 + }
6037 + },
6038 + "node_modules/data-urls/node_modules/tr46": {
6039 + "version": "3.0.0",
6040 + "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz",
6041 + "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==",
6042 + "dev": true,
6043 + "license": "MIT",
6044 + "dependencies": {
6045 + "punycode": "^2.1.1"
6046 + },
6047 + "engines": {
6048 + "node": ">=12"
6049 + }
6050 + },
6051 + "node_modules/data-urls/node_modules/webidl-conversions": {
6052 + "version": "7.0.0",
6053 + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz",
6054 + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==",
6055 + "dev": true,
6056 + "license": "BSD-2-Clause",
6057 + "engines": {
6058 + "node": ">=12"
6059 + }
6060 + },
6061 + "node_modules/data-urls/node_modules/whatwg-url": {
6062 + "version": "11.0.0",
6063 + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz",
6064 + "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==",
6065 + "dev": true,
6066 + "license": "MIT",
6067 + "dependencies": {
6068 + "tr46": "^3.0.0",
6069 + "webidl-conversions": "^7.0.0"
6070 + },
6071 + "engines": {
6072 + "node": ">=12"
6073 + }
6074 + },
5370 6075 "node_modules/data-view-buffer": {
5371 6076 "version": "1.0.2",
5372 6077 "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz",
@@ -5438,6 +6143,13 @@
5438 6143 }
5439 6144 }
5440 6145 },
6146 + "node_modules/decimal.js": {
6147 + "version": "10.6.0",
6148 + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz",
6149 + "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==",
6150 + "dev": true,
6151 + "license": "MIT"
6152 + },
5441 6153 "node_modules/decode-uri-component": {
5442 6154 "version": "0.2.2",
5443 6155 "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz",
@@ -5447,6 +6159,21 @@
5447 6159 "node": ">=0.10"
5448 6160 }
5449 6161 },
6162 + "node_modules/dedent": {
6163 + "version": "1.7.2",
6164 + "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.2.tgz",
6165 + "integrity": "sha512-WzMx3mW98SN+zn3hgemf4OzdmyNhhhKz5Ay0pUfQiMQ3e1g+xmTJWp/pKdwKVXhdSkAEGIIzqeuWrL3mV/AXbA==",
6166 + "dev": true,
6167 + "license": "MIT",
6168 + "peerDependencies": {
6169 + "babel-plugin-macros": "^3.1.0"
6170 + },
6171 + "peerDependenciesMeta": {
6172 + "babel-plugin-macros": {
6173 + "optional": true
6174 + }
6175 + }
6176 + },
5450 6177 "node_modules/deep-extend": {
5451 6178 "version": "0.6.0",
5452 6179 "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
@@ -5527,6 +6254,16 @@
5527 6254 "url": "https://github.com/sponsors/ljharb"
5528 6255 }
5529 6256 },
6257 + "node_modules/delayed-stream": {
6258 + "version": "1.0.0",
6259 + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
6260 + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
6261 + "dev": true,
6262 + "license": "MIT",
6263 + "engines": {
6264 + "node": ">=0.4.0"
6265 + }
6266 + },
5530 6267 "node_modules/depd": {
5531 6268 "version": "2.0.0",
5532 6269 "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
@@ -5555,12 +6292,32 @@
5555 6292 "node": ">=8"
5556 6293 }
5557 6294 },
6295 + "node_modules/detect-newline": {
6296 + "version": "3.1.0",
6297 + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz",
6298 + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==",
6299 + "dev": true,
6300 + "license": "MIT",
6301 + "engines": {
6302 + "node": ">=8"
6303 + }
6304 + },
5558 6305 "node_modules/detect-node-es": {
5559 6306 "version": "1.1.0",
5560 6307 "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz",
5561 6308 "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==",
5562 6309 "license": "MIT"
5563 6310 },
6311 + "node_modules/diff-sequences": {
6312 + "version": "29.6.3",
6313 + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz",
6314 + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==",
6315 + "dev": true,
6316 + "license": "MIT",
6317 + "engines": {
6318 + "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
6319 + }
6320 + },
5564 6321 "node_modules/doctrine": {
5565 6322 "version": "2.1.0",
5566 6323 "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
@@ -5574,6 +6331,30 @@
5574 6331 "node": ">=0.10.0"
5575 6332 }
5576 6333 },
6334 + "node_modules/domexception": {
6335 + "version": "4.0.0",
6336 + "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz",
6337 + "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==",
6338 + "deprecated": "Use your platform's native DOMException instead",
6339 + "dev": true,
6340 + "license": "MIT",
6341 + "dependencies": {
6342 + "webidl-conversions": "^7.0.0"
6343 + },
6344 + "engines": {
6345 + "node": ">=12"
6346 + }
6347 + },
6348 + "node_modules/domexception/node_modules/webidl-conversions": {
6349 + "version": "7.0.0",
6350 + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz",
6351 + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==",
6352 + "dev": true,
6353 + "license": "BSD-2-Clause",
6354 + "engines": {
6355 + "node": ">=12"
6356 + }
6357 + },
5577 6358 "node_modules/dotenv": {
5578 6359 "version": "16.4.7",
5579 6360 "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz",
@@ -5633,6 +6414,19 @@
5633 6414 "integrity": "sha512-OszpBN7xZX4vWMPJwB9illkN/znA8M36GQqQxi6MNy9axWxhOfJyZZJtSLQCpEFLHP2xK33BiWx9aIuIEXVCcw==",
5634 6415 "license": "ISC"
5635 6416 },
6417 + "node_modules/emittery": {
6418 + "version": "0.13.1",
6419 + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz",
6420 + "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==",
6421 + "dev": true,
6422 + "license": "MIT",
6423 + "engines": {
6424 + "node": ">=12"
6425 + },
6426 + "funding": {
6427 + "url": "https://github.com/sindresorhus/emittery?sponsor=1"
6428 + }
6429 + },
5636 6430 "node_modules/emoji-regex": {
5637 6431 "version": "9.2.2",
5638 6432 "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
@@ -5669,6 +6463,23 @@
5669 6463 "node": ">=8"
5670 6464 }
5671 6465 },
6466 + "node_modules/error-ex": {
6467 + "version": "1.3.4",
6468 + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz",
6469 + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==",
6470 + "dev": true,
6471 + "license": "MIT",
6472 + "dependencies": {
6473 + "is-arrayish": "^0.2.1"
6474 + }
6475 + },
6476 + "node_modules/error-ex/node_modules/is-arrayish": {
6477 + "version": "0.2.1",
6478 + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
6479 + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==",
6480 + "dev": true,
6481 + "license": "MIT"
6482 + },
5672 6483 "node_modules/error-stack-parser": {
5673 6484 "version": "2.1.4",
5674 6485 "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz",
@@ -5879,13 +6690,45 @@
5879 6690 "url": "https://github.com/sponsors/sindresorhus"
5880 6691 }
5881 6692 },
6693 + "node_modules/escodegen": {
6694 + "version": "2.1.0",
6695 + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz",
6696 + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==",
6697 + "dev": true,
6698 + "license": "BSD-2-Clause",
6699 + "dependencies": {
6700 + "esprima": "^4.0.1",
6701 + "estraverse": "^5.2.0",
6702 + "esutils": "^2.0.2"
6703 + },
6704 + "bin": {
6705 + "escodegen": "bin/escodegen.js",
6706 + "esgenerate": "bin/esgenerate.js"
6707 + },
6708 + "engines": {
6709 + "node": ">=6.0"
6710 + },
6711 + "optionalDependencies": {
6712 + "source-map": "~0.6.1"
6713 + }
6714 + },
6715 + "node_modules/escodegen/node_modules/source-map": {
6716 + "version": "0.6.1",
6717 + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
6718 + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
6719 + "dev": true,
6720 + "license": "BSD-3-Clause",
6721 + "optional": true,
6722 + "engines": {
6723 + "node": ">=0.10.0"
6724 + }
6725 + },
5882 6726 "node_modules/eslint": {
5883 6727 "version": "9.39.1",
5884 6728 "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.1.tgz",
5885 6729 "integrity": "sha512-BhHmn2yNOFA9H9JmmIVKJmd288g9hrVRDkdoIgRCRuSySRUHH7r/DI6aAXW9T1WwUuY3DFgrcaqB+deURBLR5g==",
5886 6730 "dev": true,
5887 6731 "license": "MIT",
5888 - "peer": true,
5889 6732 "dependencies": {
5890 6733 "@eslint-community/eslint-utils": "^4.8.0",
5891 6734 "@eslint-community/regexpp": "^4.12.1",
@@ -6082,7 +6925,6 @@
6082 6925 "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==",
6083 6926 "dev": true,
6084 6927 "license": "MIT",
6085 - "peer": true,
6086 6928 "dependencies": {
6087 6929 "@rtsao/scc": "^1.1.0",
6088 6930 "array-includes": "^3.1.9",
@@ -6316,12 +7158,94 @@
6316 7158 "integrity": "sha512-87OpwcEiMia/DeiKFzaQNBNFeN3XkkpYIh9FyOqq5mS2oKv3CBE67PXoEKcr6nodWdXNogTiQ0jE2NGuoffXPw==",
6317 7159 "license": "MIT"
6318 7160 },
7161 + "node_modules/execa": {
7162 + "version": "5.1.1",
7163 + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
7164 + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
7165 + "dev": true,
7166 + "license": "MIT",
7167 + "dependencies": {
7168 + "cross-spawn": "^7.0.3",
7169 + "get-stream": "^6.0.0",
7170 + "human-signals": "^2.1.0",
7171 + "is-stream": "^2.0.0",
7172 + "merge-stream": "^2.0.0",
7173 + "npm-run-path": "^4.0.1",
7174 + "onetime": "^5.1.2",
7175 + "signal-exit": "^3.0.3",
7176 + "strip-final-newline": "^2.0.0"
7177 + },
7178 + "engines": {
7179 + "node": ">=10"
7180 + },
7181 + "funding": {
7182 + "url": "https://github.com/sindresorhus/execa?sponsor=1"
7183 + }
7184 + },
7185 + "node_modules/execa/node_modules/mimic-fn": {
7186 + "version": "2.1.0",
7187 + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
7188 + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
7189 + "dev": true,
7190 + "license": "MIT",
7191 + "engines": {
7192 + "node": ">=6"
7193 + }
7194 + },
7195 + "node_modules/execa/node_modules/onetime": {
7196 + "version": "5.1.2",
7197 + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
7198 + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
7199 + "dev": true,
7200 + "license": "MIT",
7201 + "dependencies": {
7202 + "mimic-fn": "^2.1.0"
7203 + },
7204 + "engines": {
7205 + "node": ">=6"
7206 + },
7207 + "funding": {
7208 + "url": "https://github.com/sponsors/sindresorhus"
7209 + }
7210 + },
7211 + "node_modules/execa/node_modules/signal-exit": {
7212 + "version": "3.0.7",
7213 + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
7214 + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
7215 + "dev": true,
7216 + "license": "ISC"
7217 + },
7218 + "node_modules/exit": {
7219 + "version": "0.1.2",
7220 + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz",
7221 + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==",
7222 + "dev": true,
7223 + "engines": {
7224 + "node": ">= 0.8.0"
7225 + }
7226 + },
7227 + "node_modules/expect": {
7228 + "version": "29.7.0",
7229 + "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz",
7230 + "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==",
7231 + "dev": true,
7232 + "license": "MIT",
7233 + "dependencies": {
7234 + "@jest/expect-utils": "^29.7.0",
7235 + "jest-get-type": "^29.6.3",
7236 + "jest-matcher-utils": "^29.7.0",
7237 + "jest-message-util": "^29.7.0",
7238 + "jest-util": "^29.7.0"
7239 + },
7240 + "engines": {
7241 + "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
7242 + }
7243 + },
6319 7244 "node_modules/expo": {
6320 7245 "version": "54.0.23",
6321 7246 "resolved": "https://registry.npmjs.org/expo/-/expo-54.0.23.tgz",
6322 7247 "integrity": "sha512-b4uQoiRwQ6nwqsT2709RS15CWYNGF3eJtyr1KyLw9WuMAK7u4jjofkhRiO0+3o1C2NbV+WooyYTOZGubQQMBaQ==",
6323 7248 "license": "MIT",
6324 - "peer": true,
6325 7249 "dependencies": {
6326 7250 "@babel/runtime": "^7.20.0",
6327 7251 "@expo/cli": "54.0.16",
@@ -6398,7 +7322,6 @@
6398 7322 "resolved": "https://registry.npmjs.org/expo-constants/-/expo-constants-18.0.10.tgz",
6399 7323 "integrity": "sha512-Rhtv+X974k0Cahmvx6p7ER5+pNhBC0XbP1lRviL2J1Xl4sT2FBaIuIxF/0I0CbhOsySf0ksqc5caFweAy9Ewiw==",
6400 7324 "license": "MIT",
6401 - "peer": true,
6402 7325 "dependencies": {
6403 7326 "@expo/config": "~12.0.10",
6404 7327 "@expo/env": "~2.0.7"
@@ -6482,7 +7405,6 @@
6482 7405 "resolved": "https://registry.npmjs.org/expo-font/-/expo-font-14.0.9.tgz",
6483 7406 "integrity": "sha512-xCoQbR/36qqB6tew/LQ6GWICpaBmHLhg/Loix5Rku/0ZtNaXMJv08M9o1AcrdiGTn/Xf/BnLu6DgS45cWQEHZg==",
6484 7407 "license": "MIT",
6485 - "peer": true,
6486 7408 "dependencies": {
6487 7409 "fontfaceobserver": "^2.1.0"
6488 7410 },
@@ -6539,7 +7461,6 @@
6539 7461 "resolved": "https://registry.npmjs.org/expo-linking/-/expo-linking-8.0.8.tgz",
6540 7462 "integrity": "sha512-MyeMcbFDKhXh4sDD1EHwd0uxFQNAc6VCrwBkNvvvufUsTYFq3glTA9Y8a+x78CPpjNqwNAamu74yIaIz7IEJyg==",
6541 7463 "license": "MIT",
6542 - "peer": true,
6543 7464 "dependencies": {
6544 7465 "expo-constants": "~18.0.8",
6545 7466 "invariant": "^2.2.4"
@@ -7472,6 +8393,23 @@
7472 8393 "url": "https://github.com/sponsors/isaacs"
7473 8394 }
7474 8395 },
8396 + "node_modules/form-data": {
8397 + "version": "4.0.6",
8398 + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.6.tgz",
8399 + "integrity": "sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==",
8400 + "dev": true,
8401 + "license": "MIT",
8402 + "dependencies": {
8403 + "asynckit": "^0.4.0",
8404 + "combined-stream": "^1.0.8",
8405 + "es-set-tostringtag": "^2.1.0",
8406 + "hasown": "^2.0.4",
8407 + "mime-types": "^2.1.35"
8408 + },
8409 + "engines": {
8410 + "node": ">= 6"
8411 + }
8412 + },
7475 8413 "node_modules/formdata-polyfill": {
7476 8414 "version": "4.0.10",
7477 8415 "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz",
@@ -7644,6 +8582,19 @@
7644 8582 "node": ">= 0.4"
7645 8583 }
7646 8584 },
8585 + "node_modules/get-stream": {
8586 + "version": "6.0.1",
8587 + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
8588 + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
8589 + "dev": true,
8590 + "license": "MIT",
8591 + "engines": {
8592 + "node": ">=10"
8593 + },
8594 + "funding": {
8595 + "url": "https://github.com/sponsors/sindresorhus"
8596 + }
8597 + },
7647 8598 "node_modules/get-symbol-description": {
7648 8599 "version": "1.1.0",
7649 8600 "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz",
@@ -7886,9 +8837,9 @@
7886 8837 }
7887 8838 },
7888 8839 "node_modules/hasown": {
7889 - "version": "2.0.2",
7890 - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
7891 - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
8840 + "version": "2.0.4",
8841 + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz",
8842 + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==",
7892 8843 "license": "MIT",
7893 8844 "dependencies": {
7894 8845 "function-bind": "^1.1.2"
@@ -7951,6 +8902,26 @@
7951 8902 "integrity": "sha512-ECg1JFG0YzehicQaogenlcs2qg6WsXQsxtnbr1i696u5tLUjtJdQAh0u2g0Q5YV45f263Ta1GnUJsc8WIfJf4Q==",
7952 8903 "license": "MIT"
7953 8904 },
8905 + "node_modules/html-encoding-sniffer": {
8906 + "version": "3.0.0",
8907 + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz",
8908 + "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==",
8909 + "dev": true,
8910 + "license": "MIT",
8911 + "dependencies": {
8912 + "whatwg-encoding": "^2.0.0"
8913 + },
8914 + "engines": {
8915 + "node": ">=12"
8916 + }
8917 + },
8918 + "node_modules/html-escaper": {
8919 + "version": "2.0.2",
8920 + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz",
8921 + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==",
8922 + "dev": true,
8923 + "license": "MIT"
8924 + },
7954 8925 "node_modules/http-errors": {
7955 8926 "version": "2.0.0",
7956 8927 "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
@@ -7976,6 +8947,34 @@
7976 8947 "node": ">= 0.8"
7977 8948 }
7978 8949 },
8950 + "node_modules/http-proxy-agent": {
8951 + "version": "5.0.0",
8952 + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz",
8953 + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==",
8954 + "dev": true,
8955 + "license": "MIT",
8956 + "dependencies": {
8957 + "@tootallnate/once": "2",
8958 + "agent-base": "6",
8959 + "debug": "4"
8960 + },
8961 + "engines": {
8962 + "node": ">= 6"
8963 + }
8964 + },
8965 + "node_modules/http-proxy-agent/node_modules/agent-base": {
8966 + "version": "6.0.2",
8967 + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
8968 + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
8969 + "dev": true,
8970 + "license": "MIT",
8971 + "dependencies": {
8972 + "debug": "4"
8973 + },
8974 + "engines": {
8975 + "node": ">= 6.0.0"
8976 + }
8977 + },
7979 8978 "node_modules/https-proxy-agent": {
7980 8979 "version": "7.0.6",
7981 8980 "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz",
@@ -7989,12 +8988,35 @@
7989 8988 "node": ">= 14"
7990 8989 }
7991 8990 },
8991 + "node_modules/human-signals": {
8992 + "version": "2.1.0",
8993 + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
8994 + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
8995 + "dev": true,
8996 + "license": "Apache-2.0",
8997 + "engines": {
8998 + "node": ">=10.17.0"
8999 + }
9000 + },
7992 9001 "node_modules/hyphenate-style-name": {
7993 9002 "version": "1.1.0",
7994 9003 "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.1.0.tgz",
7995 9004 "integrity": "sha512-WDC/ui2VVRrz3jOVi+XtjqkDjiVjTtFaAGiW37k6b+ohyQ5wYDOGkvCZa8+H0nx3gyvv0+BST9xuOgIyGQ00gw==",
7996 9005 "license": "BSD-3-Clause"
7997 9006 },
9007 + "node_modules/iconv-lite": {
9008 + "version": "0.6.3",
9009 + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
9010 + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
9011 + "dev": true,
9012 + "license": "MIT",
9013 + "dependencies": {
9014 + "safer-buffer": ">= 2.1.2 < 3.0.0"
9015 + },
9016 + "engines": {
9017 + "node": ">=0.10.0"
9018 + }
9019 + },
7998 9020 "node_modules/ieee754": {
7999 9021 "version": "1.2.1",
8000 9022 "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
@@ -8066,6 +9088,26 @@
8066 9088 "node": ">=4"
8067 9089 }
8068 9090 },
9091 + "node_modules/import-local": {
9092 + "version": "3.2.0",
9093 + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz",
9094 + "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==",
9095 + "dev": true,
9096 + "license": "MIT",
9097 + "dependencies": {
9098 + "pkg-dir": "^4.2.0",
9099 + "resolve-cwd": "^3.0.0"
9100 + },
9101 + "bin": {
9102 + "import-local-fixture": "fixtures/cli.js"
9103 + },
9104 + "engines": {
9105 + "node": ">=8"
9106 + },
9107 + "funding": {
9108 + "url": "https://github.com/sponsors/sindresorhus"
9109 + }
9110 + },
8069 9111 "node_modules/imurmurhash": {
8070 9112 "version": "0.1.4",
8071 9113 "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
@@ -8365,6 +9407,16 @@
8365 9407 "node": ">=8"
8366 9408 }
8367 9409 },
9410 + "node_modules/is-generator-fn": {
9411 + "version": "2.1.0",
9412 + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz",
9413 + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==",
9414 + "dev": true,
9415 + "license": "MIT",
9416 + "engines": {
9417 + "node": ">=6"
9418 + }
9419 + },
8368 9420 "node_modules/is-generator-function": {
8369 9421 "version": "1.1.2",
8370 9422 "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz",
@@ -8474,6 +9526,13 @@
8474 9526 "node": ">=8"
8475 9527 }
8476 9528 },
9529 + "node_modules/is-potential-custom-element-name": {
9530 + "version": "1.0.1",
9531 + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz",
9532 + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==",
9533 + "dev": true,
9534 + "license": "MIT"
9535 + },
8477 9536 "node_modules/is-regex": {
8478 9537 "version": "1.2.1",
8479 9538 "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz",
@@ -8521,6 +9580,19 @@
8521 9580 "url": "https://github.com/sponsors/ljharb"
8522 9581 }
8523 9582 },
9583 + "node_modules/is-stream": {
9584 + "version": "2.0.1",
9585 + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
9586 + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
9587 + "dev": true,
9588 + "license": "MIT",
9589 + "engines": {
9590 + "node": ">=8"
9591 + },
9592 + "funding": {
9593 + "url": "https://github.com/sponsors/sindresorhus"
9594 + }
9595 + },
8524 9596 "node_modules/is-string": {
8525 9597 "version": "1.1.1",
8526 9598 "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz",
@@ -8667,6 +9739,60 @@
8667 9739 "node": ">=8"
8668 9740 }
8669 9741 },
9742 + "node_modules/istanbul-lib-report": {
9743 + "version": "3.0.1",
9744 + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz",
9745 + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==",
9746 + "dev": true,
9747 + "license": "BSD-3-Clause",
9748 + "dependencies": {
9749 + "istanbul-lib-coverage": "^3.0.0",
9750 + "make-dir": "^4.0.0",
9751 + "supports-color": "^7.1.0"
9752 + },
9753 + "engines": {
9754 + "node": ">=10"
9755 + }
9756 + },
9757 + "node_modules/istanbul-lib-source-maps": {
9758 + "version": "4.0.1",
9759 + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz",
9760 + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==",
9761 + "dev": true,
9762 + "license": "BSD-3-Clause",
9763 + "dependencies": {
9764 + "debug": "^4.1.1",
9765 + "istanbul-lib-coverage": "^3.0.0",
9766 + "source-map": "^0.6.1"
9767 + },
9768 + "engines": {
9769 + "node": ">=10"
9770 + }
9771 + },
9772 + "node_modules/istanbul-lib-source-maps/node_modules/source-map": {
9773 + "version": "0.6.1",
9774 + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
9775 + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
9776 + "dev": true,
9777 + "license": "BSD-3-Clause",
9778 + "engines": {
9779 + "node": ">=0.10.0"
9780 + }
9781 + },
9782 + "node_modules/istanbul-reports": {
9783 + "version": "3.2.0",
9784 + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz",
9785 + "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==",
9786 + "dev": true,
9787 + "license": "BSD-3-Clause",
9788 + "dependencies": {
9789 + "html-escaper": "^2.0.0",
9790 + "istanbul-lib-report": "^3.0.0"
9791 + },
9792 + "engines": {
9793 + "node": ">=8"
9794 + }
9795 + },
8670 9796 "node_modules/iterator.prototype": {
8671 9797 "version": "1.1.5",
8672 9798 "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz",
@@ -8700,6 +9826,272 @@
8700 9826 "@pkgjs/parseargs": "^0.11.0"
8701 9827 }
8702 9828 },
9829 + "node_modules/jest": {
9830 + "version": "29.7.0",
9831 + "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz",
9832 + "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==",
9833 + "dev": true,
9834 + "license": "MIT",
9835 + "dependencies": {
9836 + "@jest/core": "^29.7.0",
9837 + "@jest/types": "^29.6.3",
9838 + "import-local": "^3.0.2",
9839 + "jest-cli": "^29.7.0"
9840 + },
9841 + "bin": {
9842 + "jest": "bin/jest.js"
9843 + },
9844 + "engines": {
9845 + "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
9846 + },
9847 + "peerDependencies": {
9848 + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
9849 + },
9850 + "peerDependenciesMeta": {
9851 + "node-notifier": {
9852 + "optional": true
9853 + }
9854 + }
9855 + },
9856 + "node_modules/jest-changed-files": {
9857 + "version": "29.7.0",
9858 + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz",
9859 + "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==",
9860 + "dev": true,
9861 + "license": "MIT",
9862 + "dependencies": {
9863 + "execa": "^5.0.0",
9864 + "jest-util": "^29.7.0",
9865 + "p-limit": "^3.1.0"
9866 + },
9867 + "engines": {
9868 + "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
9869 + }
9870 + },
9871 + "node_modules/jest-circus": {
9872 + "version": "29.7.0",
9873 + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz",
9874 + "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==",
9875 + "dev": true,
9876 + "license": "MIT",
9877 + "dependencies": {
9878 + "@jest/environment": "^29.7.0",
9879 + "@jest/expect": "^29.7.0",
9880 + "@jest/test-result": "^29.7.0",
9881 + "@jest/types": "^29.6.3",
9882 + "@types/node": "*",
9883 + "chalk": "^4.0.0",
9884 + "co": "^4.6.0",
9885 + "dedent": "^1.0.0",
9886 + "is-generator-fn": "^2.0.0",
9887 + "jest-each": "^29.7.0",
9888 + "jest-matcher-utils": "^29.7.0",
9889 + "jest-message-util": "^29.7.0",
9890 + "jest-runtime": "^29.7.0",
9891 + "jest-snapshot": "^29.7.0",
9892 + "jest-util": "^29.7.0",
9893 + "p-limit": "^3.1.0",
9894 + "pretty-format": "^29.7.0",
9895 + "pure-rand": "^6.0.0",
9896 + "slash": "^3.0.0",
9897 + "stack-utils": "^2.0.3"
9898 + },
9899 + "engines": {
9900 + "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
9901 + }
9902 + },
9903 + "node_modules/jest-cli": {
9904 + "version": "29.7.0",
9905 + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz",
9906 + "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==",
9907 + "dev": true,
9908 + "license": "MIT",
9909 + "dependencies": {
9910 + "@jest/core": "^29.7.0",
9911 + "@jest/test-result": "^29.7.0",
9912 + "@jest/types": "^29.6.3",
9913 + "chalk": "^4.0.0",
9914 + "create-jest": "^29.7.0",
9915 + "exit": "^0.1.2",
9916 + "import-local": "^3.0.2",
9917 + "jest-config": "^29.7.0",
9918 + "jest-util": "^29.7.0",
9919 + "jest-validate": "^29.7.0",
9920 + "yargs": "^17.3.1"
9921 + },
9922 + "bin": {
9923 + "jest": "bin/jest.js"
9924 + },
9925 + "engines": {
9926 + "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
9927 + },
9928 + "peerDependencies": {
9929 + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
9930 + },
9931 + "peerDependenciesMeta": {
9932 + "node-notifier": {
9933 + "optional": true
9934 + }
9935 + }
9936 + },
9937 + "node_modules/jest-config": {
9938 + "version": "29.7.0",
9939 + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz",
9940 + "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==",
9941 + "dev": true,
9942 + "license": "MIT",
9943 + "dependencies": {
9944 + "@babel/core": "^7.11.6",
9945 + "@jest/test-sequencer": "^29.7.0",
9946 + "@jest/types": "^29.6.3",
9947 + "babel-jest": "^29.7.0",
9948 + "chalk": "^4.0.0",
9949 + "ci-info": "^3.2.0",
9950 + "deepmerge": "^4.2.2",
9951 + "glob": "^7.1.3",
9952 + "graceful-fs": "^4.2.9",
9953 + "jest-circus": "^29.7.0",
9954 + "jest-environment-node": "^29.7.0",
9955 + "jest-get-type": "^29.6.3",
9956 + "jest-regex-util": "^29.6.3",
9957 + "jest-resolve": "^29.7.0",
9958 + "jest-runner": "^29.7.0",
9959 + "jest-util": "^29.7.0",
9960 + "jest-validate": "^29.7.0",
9961 + "micromatch": "^4.0.4",
9962 + "parse-json": "^5.2.0",
9963 + "pretty-format": "^29.7.0",
9964 + "slash": "^3.0.0",
9965 + "strip-json-comments": "^3.1.1"
9966 + },
9967 + "engines": {
9968 + "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
9969 + },
9970 + "peerDependencies": {
9971 + "@types/node": "*",
9972 + "ts-node": ">=9.0.0"
9973 + },
9974 + "peerDependenciesMeta": {
9975 + "@types/node": {
9976 + "optional": true
9977 + },
9978 + "ts-node": {
9979 + "optional": true
9980 + }
9981 + }
9982 + },
9983 + "node_modules/jest-config/node_modules/ci-info": {
9984 + "version": "3.9.0",
9985 + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz",
9986 + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==",
9987 + "dev": true,
9988 + "funding": [
9989 + {
9990 + "type": "github",
9991 + "url": "https://github.com/sponsors/sibiraj-s"
9992 + }
9993 + ],
9994 + "license": "MIT",
9995 + "engines": {
9996 + "node": ">=8"
9997 + }
9998 + },
9999 + "node_modules/jest-config/node_modules/glob": {
10000 + "version": "7.2.3",
10001 + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
10002 + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
10003 + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me",
10004 + "dev": true,
10005 + "license": "ISC",
10006 + "dependencies": {
10007 + "fs.realpath": "^1.0.0",
10008 + "inflight": "^1.0.4",
10009 + "inherits": "2",
10010 + "minimatch": "^3.1.1",
10011 + "once": "^1.3.0",
10012 + "path-is-absolute": "^1.0.0"
10013 + },
10014 + "engines": {
10015 + "node": "*"
10016 + },
10017 + "funding": {
10018 + "url": "https://github.com/sponsors/isaacs"
10019 + }
10020 + },
10021 + "node_modules/jest-diff": {
10022 + "version": "29.7.0",
10023 + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz",
10024 + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==",
10025 + "dev": true,
10026 + "license": "MIT",
10027 + "dependencies": {
10028 + "chalk": "^4.0.0",
10029 + "diff-sequences": "^29.6.3",
10030 + "jest-get-type": "^29.6.3",
10031 + "pretty-format": "^29.7.0"
10032 + },
10033 + "engines": {
10034 + "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
10035 + }
10036 + },
10037 + "node_modules/jest-docblock": {
10038 + "version": "29.7.0",
10039 + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz",
10040 + "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==",
10041 + "dev": true,
10042 + "license": "MIT",
10043 + "dependencies": {
10044 + "detect-newline": "^3.0.0"
10045 + },
10046 + "engines": {
10047 + "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
10048 + }
10049 + },
10050 + "node_modules/jest-each": {
10051 + "version": "29.7.0",
10052 + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz",
10053 + "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==",
10054 + "dev": true,
10055 + "license": "MIT",
10056 + "dependencies": {
10057 + "@jest/types": "^29.6.3",
10058 + "chalk": "^4.0.0",
10059 + "jest-get-type": "^29.6.3",
10060 + "jest-util": "^29.7.0",
10061 + "pretty-format": "^29.7.0"
10062 + },
10063 + "engines": {
10064 + "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
10065 + }
10066 + },
10067 + "node_modules/jest-environment-jsdom": {
10068 + "version": "29.7.0",
10069 + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-29.7.0.tgz",
10070 + "integrity": "sha512-k9iQbsf9OyOfdzWH8HDmrRT0gSIcX+FLNW7IQq94tFX0gynPwqDTW0Ho6iMVNjGz/nb+l/vW3dWM2bbLLpkbXA==",
10071 + "dev": true,
10072 + "license": "MIT",
10073 + "dependencies": {
10074 + "@jest/environment": "^29.7.0",
10075 + "@jest/fake-timers": "^29.7.0",
10076 + "@jest/types": "^29.6.3",
10077 + "@types/jsdom": "^20.0.0",
10078 + "@types/node": "*",
10079 + "jest-mock": "^29.7.0",
10080 + "jest-util": "^29.7.0",
10081 + "jsdom": "^20.0.0"
10082 + },
10083 + "engines": {
10084 + "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
10085 + },
10086 + "peerDependencies": {
10087 + "canvas": "^2.5.0"
10088 + },
10089 + "peerDependenciesMeta": {
10090 + "canvas": {
10091 + "optional": true
10092 + }
10093 + }
10094 + },
8703 10095 "node_modules/jest-environment-node": {
8704 10096 "version": "29.7.0",
8705 10097 "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz",
@@ -8717,6 +10109,53 @@
8717 10109 "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
8718 10110 }
8719 10111 },
10112 + "node_modules/jest-expo": {
10113 + "version": "54.0.17",
10114 + "resolved": "https://registry.npmjs.org/jest-expo/-/jest-expo-54.0.17.tgz",
10115 + "integrity": "sha512-LyIhrsP4xvHEEcR1R024u/LBj3uPpAgB+UljgV+YXWkEHjprnr0KpE4tROsMNYCVTM1pPlAnPuoBmn5gnAN9KA==",
10116 + "dev": true,
10117 + "license": "MIT",
10118 + "dependencies": {
10119 + "@expo/config": "~12.0.13",
10120 + "@expo/json-file": "^10.0.8",
10121 + "@jest/create-cache-key-function": "^29.2.1",
10122 + "@jest/globals": "^29.2.1",
10123 + "babel-jest": "^29.2.1",
10124 + "jest-environment-jsdom": "^29.2.1",
10125 + "jest-snapshot": "^29.2.1",
10126 + "jest-watch-select-projects": "^2.0.0",
10127 + "jest-watch-typeahead": "2.2.1",
10128 + "json5": "^2.2.3",
10129 + "lodash": "^4.17.19",
10130 + "react-test-renderer": "19.1.0",
10131 + "server-only": "^0.0.1",
10132 + "stacktrace-js": "^2.0.2"
10133 + },
10134 + "bin": {
10135 + "jest": "bin/jest.js"
10136 + },
10137 + "peerDependencies": {
10138 + "expo": "*",
10139 + "react-native": "*",
10140 + "react-server-dom-webpack": "~19.0.4 || ~19.1.5 || ~19.2.4"
10141 + },
10142 + "peerDependenciesMeta": {
10143 + "react-server-dom-webpack": {
10144 + "optional": true
10145 + }
10146 + }
10147 + },
10148 + "node_modules/jest-expo/node_modules/@expo/json-file": {
10149 + "version": "10.2.0",
10150 + "resolved": "https://registry.npmjs.org/@expo/json-file/-/json-file-10.2.0.tgz",
10151 + "integrity": "sha512-S6XzKe3R9GQeHiUPXc3xJjOv2VJhOEwFYf7xdC2z2cUqt3kZJ9mSO877sNQloVdnW/SUCtPY3bexlM7nwq+CAQ==",
10152 + "dev": true,
10153 + "license": "MIT",
10154 + "dependencies": {
10155 + "@babel/code-frame": "^7.20.0",
10156 + "json5": "^2.2.3"
10157 + }
10158 + },
8720 10159 "node_modules/jest-get-type": {
8721 10160 "version": "29.6.3",
8722 10161 "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz",
@@ -8751,6 +10190,36 @@
8751 10190 "fsevents": "^2.3.2"
8752 10191 }
8753 10192 },
10193 + "node_modules/jest-leak-detector": {
10194 + "version": "29.7.0",
10195 + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz",
10196 + "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==",
10197 + "dev": true,
10198 + "license": "MIT",
10199 + "dependencies": {
10200 + "jest-get-type": "^29.6.3",
10201 + "pretty-format": "^29.7.0"
10202 + },
10203 + "engines": {
10204 + "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
10205 + }
10206 + },
10207 + "node_modules/jest-matcher-utils": {
10208 + "version": "29.7.0",
10209 + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz",
10210 + "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==",
10211 + "dev": true,
10212 + "license": "MIT",
10213 + "dependencies": {
10214 + "chalk": "^4.0.0",
10215 + "jest-diff": "^29.7.0",
10216 + "jest-get-type": "^29.6.3",
10217 + "pretty-format": "^29.7.0"
10218 + },
10219 + "engines": {
10220 + "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
10221 + }
10222 + },
8754 10223 "node_modules/jest-message-util": {
8755 10224 "version": "29.7.0",
8756 10225 "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz",
@@ -8785,6 +10254,24 @@
8785 10254 "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
8786 10255 }
8787 10256 },
10257 + "node_modules/jest-pnp-resolver": {
10258 + "version": "1.2.3",
10259 + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz",
10260 + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==",
10261 + "dev": true,
10262 + "license": "MIT",
10263 + "engines": {
10264 + "node": ">=6"
10265 + },
10266 + "peerDependencies": {
10267 + "jest-resolve": "*"
10268 + },
10269 + "peerDependenciesMeta": {
10270 + "jest-resolve": {
10271 + "optional": true
10272 + }
10273 + }
10274 + },
8788 10275 "node_modules/jest-regex-util": {
8789 10276 "version": "29.6.3",
8790 10277 "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz",
@@ -8794,6 +10281,206 @@
8794 10281 "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
8795 10282 }
8796 10283 },
10284 + "node_modules/jest-resolve": {
10285 + "version": "29.7.0",
10286 + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz",
10287 + "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==",
10288 + "dev": true,
10289 + "license": "MIT",
10290 + "dependencies": {
10291 + "chalk": "^4.0.0",
10292 + "graceful-fs": "^4.2.9",
10293 + "jest-haste-map": "^29.7.0",
10294 + "jest-pnp-resolver": "^1.2.2",
10295 + "jest-util": "^29.7.0",
10296 + "jest-validate": "^29.7.0",
10297 + "resolve": "^1.20.0",
10298 + "resolve.exports": "^2.0.0",
10299 + "slash": "^3.0.0"
10300 + },
10301 + "engines": {
10302 + "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
10303 + }
10304 + },
10305 + "node_modules/jest-resolve-dependencies": {
10306 + "version": "29.7.0",
10307 + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz",
10308 + "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==",
10309 + "dev": true,
10310 + "license": "MIT",
10311 + "dependencies": {
10312 + "jest-regex-util": "^29.6.3",
10313 + "jest-snapshot": "^29.7.0"
10314 + },
10315 + "engines": {
10316 + "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
10317 + }
10318 + },
10319 + "node_modules/jest-runner": {
10320 + "version": "29.7.0",
10321 + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz",
10322 + "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==",
10323 + "dev": true,
10324 + "license": "MIT",
10325 + "dependencies": {
10326 + "@jest/console": "^29.7.0",
10327 + "@jest/environment": "^29.7.0",
10328 + "@jest/test-result": "^29.7.0",
10329 + "@jest/transform": "^29.7.0",
10330 + "@jest/types": "^29.6.3",
10331 + "@types/node": "*",
10332 + "chalk": "^4.0.0",
10333 + "emittery": "^0.13.1",
10334 + "graceful-fs": "^4.2.9",
10335 + "jest-docblock": "^29.7.0",
10336 + "jest-environment-node": "^29.7.0",
10337 + "jest-haste-map": "^29.7.0",
10338 + "jest-leak-detector": "^29.7.0",
10339 + "jest-message-util": "^29.7.0",
10340 + "jest-resolve": "^29.7.0",
10341 + "jest-runtime": "^29.7.0",
10342 + "jest-util": "^29.7.0",
10343 + "jest-watcher": "^29.7.0",
10344 + "jest-worker": "^29.7.0",
10345 + "p-limit": "^3.1.0",
10346 + "source-map-support": "0.5.13"
10347 + },
10348 + "engines": {
10349 + "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
10350 + }
10351 + },
10352 + "node_modules/jest-runner/node_modules/source-map": {
10353 + "version": "0.6.1",
10354 + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
10355 + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
10356 + "dev": true,
10357 + "license": "BSD-3-Clause",
10358 + "engines": {
10359 + "node": ">=0.10.0"
10360 + }
10361 + },
10362 + "node_modules/jest-runner/node_modules/source-map-support": {
10363 + "version": "0.5.13",
10364 + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz",
10365 + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==",
10366 + "dev": true,
10367 + "license": "MIT",
10368 + "dependencies": {
10369 + "buffer-from": "^1.0.0",
10370 + "source-map": "^0.6.0"
10371 + }
10372 + },
10373 + "node_modules/jest-runtime": {
10374 + "version": "29.7.0",
10375 + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz",
10376 + "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==",
10377 + "dev": true,
10378 + "license": "MIT",
10379 + "dependencies": {
10380 + "@jest/environment": "^29.7.0",
10381 + "@jest/fake-timers": "^29.7.0",
10382 + "@jest/globals": "^29.7.0",
10383 + "@jest/source-map": "^29.6.3",
10384 + "@jest/test-result": "^29.7.0",
10385 + "@jest/transform": "^29.7.0",
10386 + "@jest/types": "^29.6.3",
10387 + "@types/node": "*",
10388 + "chalk": "^4.0.0",
10389 + "cjs-module-lexer": "^1.0.0",
10390 + "collect-v8-coverage": "^1.0.0",
10391 + "glob": "^7.1.3",
10392 + "graceful-fs": "^4.2.9",
10393 + "jest-haste-map": "^29.7.0",
10394 + "jest-message-util": "^29.7.0",
10395 + "jest-mock": "^29.7.0",
10396 + "jest-regex-util": "^29.6.3",
10397 + "jest-resolve": "^29.7.0",
10398 + "jest-snapshot": "^29.7.0",
10399 + "jest-util": "^29.7.0",
10400 + "slash": "^3.0.0",
10401 + "strip-bom": "^4.0.0"
10402 + },
10403 + "engines": {
10404 + "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
10405 + }
10406 + },
10407 + "node_modules/jest-runtime/node_modules/glob": {
10408 + "version": "7.2.3",
10409 + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
10410 + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
10411 + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me",
10412 + "dev": true,
10413 + "license": "ISC",
10414 + "dependencies": {
10415 + "fs.realpath": "^1.0.0",
10416 + "inflight": "^1.0.4",
10417 + "inherits": "2",
10418 + "minimatch": "^3.1.1",
10419 + "once": "^1.3.0",
10420 + "path-is-absolute": "^1.0.0"
10421 + },
10422 + "engines": {
10423 + "node": "*"
10424 + },
10425 + "funding": {
10426 + "url": "https://github.com/sponsors/isaacs"
10427 + }
10428 + },
10429 + "node_modules/jest-runtime/node_modules/strip-bom": {
10430 + "version": "4.0.0",
10431 + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz",
10432 + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==",
10433 + "dev": true,
10434 + "license": "MIT",
10435 + "engines": {
10436 + "node": ">=8"
10437 + }
10438 + },
10439 + "node_modules/jest-snapshot": {
10440 + "version": "29.7.0",
10441 + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz",
10442 + "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==",
10443 + "dev": true,
10444 + "license": "MIT",
10445 + "dependencies": {
10446 + "@babel/core": "^7.11.6",
10447 + "@babel/generator": "^7.7.2",
10448 + "@babel/plugin-syntax-jsx": "^7.7.2",
10449 + "@babel/plugin-syntax-typescript": "^7.7.2",
10450 + "@babel/types": "^7.3.3",
10451 + "@jest/expect-utils": "^29.7.0",
10452 + "@jest/transform": "^29.7.0",
10453 + "@jest/types": "^29.6.3",
10454 + "babel-preset-current-node-syntax": "^1.0.0",
10455 + "chalk": "^4.0.0",
10456 + "expect": "^29.7.0",
10457 + "graceful-fs": "^4.2.9",
10458 + "jest-diff": "^29.7.0",
10459 + "jest-get-type": "^29.6.3",
10460 + "jest-matcher-utils": "^29.7.0",
10461 + "jest-message-util": "^29.7.0",
10462 + "jest-util": "^29.7.0",
10463 + "natural-compare": "^1.4.0",
10464 + "pretty-format": "^29.7.0",
10465 + "semver": "^7.5.3"
10466 + },
10467 + "engines": {
10468 + "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
10469 + }
10470 + },
10471 + "node_modules/jest-snapshot/node_modules/semver": {
10472 + "version": "7.8.4",
10473 + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.4.tgz",
10474 + "integrity": "sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA==",
10475 + "dev": true,
10476 + "license": "ISC",
10477 + "bin": {
10478 + "semver": "bin/semver.js"
10479 + },
10480 + "engines": {
10481 + "node": ">=10"
10482 + }
10483 + },
8797 10484 "node_modules/jest-util": {
8798 10485 "version": "29.7.0",
8799 10486 "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz",
@@ -8843,6 +10530,127 @@
8843 10530 "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
8844 10531 }
8845 10532 },
10533 + "node_modules/jest-watch-select-projects": {
10534 + "version": "2.0.0",
10535 + "resolved": "https://registry.npmjs.org/jest-watch-select-projects/-/jest-watch-select-projects-2.0.0.tgz",
10536 + "integrity": "sha512-j00nW4dXc2NiCW6znXgFLF9g8PJ0zP25cpQ1xRro/HU2GBfZQFZD0SoXnAlaoKkIY4MlfTMkKGbNXFpvCdjl1w==",
10537 + "dev": true,
10538 + "license": "MIT",
10539 + "dependencies": {
10540 + "ansi-escapes": "^4.3.0",
10541 + "chalk": "^3.0.0",
10542 + "prompts": "^2.2.1"
10543 + }
10544 + },
10545 + "node_modules/jest-watch-select-projects/node_modules/chalk": {
10546 + "version": "3.0.0",
10547 + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
10548 + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
10549 + "dev": true,
10550 + "license": "MIT",
10551 + "dependencies": {
10552 + "ansi-styles": "^4.1.0",
10553 + "supports-color": "^7.1.0"
10554 + },
10555 + "engines": {
10556 + "node": ">=8"
10557 + }
10558 + },
10559 + "node_modules/jest-watch-typeahead": {
10560 + "version": "2.2.1",
10561 + "resolved": "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-2.2.1.tgz",
10562 + "integrity": "sha512-jYpYmUnTzysmVnwq49TAxlmtOAwp8QIqvZyoofQFn8fiWhEDZj33ZXzg3JA4nGnzWFm1hbWf3ADpteUokvXgFA==",
10563 + "dev": true,
10564 + "license": "MIT",
10565 + "dependencies": {
10566 + "ansi-escapes": "^6.0.0",
10567 + "chalk": "^4.0.0",
10568 + "jest-regex-util": "^29.0.0",
10569 + "jest-watcher": "^29.0.0",
10570 + "slash": "^5.0.0",
10571 + "string-length": "^5.0.1",
10572 + "strip-ansi": "^7.0.1"
10573 + },
10574 + "engines": {
10575 + "node": "^14.17.0 || ^16.10.0 || >=18.0.0"
10576 + },
10577 + "peerDependencies": {
10578 + "jest": "^27.0.0 || ^28.0.0 || ^29.0.0"
10579 + }
10580 + },
10581 + "node_modules/jest-watch-typeahead/node_modules/ansi-escapes": {
10582 + "version": "6.2.1",
10583 + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-6.2.1.tgz",
10584 + "integrity": "sha512-4nJ3yixlEthEJ9Rk4vPcdBRkZvQZlYyu8j4/Mqz5sgIkddmEnH2Yj2ZrnP9S3tQOvSNRUIgVNF/1yPpRAGNRig==",
10585 + "dev": true,
10586 + "license": "MIT",
10587 + "engines": {
10588 + "node": ">=14.16"
10589 + },
10590 + "funding": {
10591 + "url": "https://github.com/sponsors/sindresorhus"
10592 + }
10593 + },
10594 + "node_modules/jest-watch-typeahead/node_modules/char-regex": {
10595 + "version": "2.0.2",
10596 + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-2.0.2.tgz",
10597 + "integrity": "sha512-cbGOjAptfM2LVmWhwRFHEKTPkLwNddVmuqYZQt895yXwAsWsXObCG+YN4DGQ/JBtT4GP1a1lPPdio2z413LmTg==",
10598 + "dev": true,
10599 + "license": "MIT",
10600 + "engines": {
10601 + "node": ">=12.20"
10602 + }
10603 + },
10604 + "node_modules/jest-watch-typeahead/node_modules/slash": {
10605 + "version": "5.1.0",
10606 + "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz",
10607 + "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==",
10608 + "dev": true,
10609 + "license": "MIT",
10610 + "engines": {
10611 + "node": ">=14.16"
10612 + },
10613 + "funding": {
10614 + "url": "https://github.com/sponsors/sindresorhus"
10615 + }
10616 + },
10617 + "node_modules/jest-watch-typeahead/node_modules/string-length": {
10618 + "version": "5.0.1",
10619 + "resolved": "https://registry.npmjs.org/string-length/-/string-length-5.0.1.tgz",
10620 + "integrity": "sha512-9Ep08KAMUn0OadnVaBuRdE2l615CQ508kr0XMadjClfYpdCyvrbFp6Taebo8yyxokQ4viUd/xPPUA4FGgUa0ow==",
10621 + "dev": true,
10622 + "license": "MIT",
10623 + "dependencies": {
10624 + "char-regex": "^2.0.0",
10625 + "strip-ansi": "^7.0.1"
10626 + },
10627 + "engines": {
10628 + "node": ">=12.20"
10629 + },
10630 + "funding": {
10631 + "url": "https://github.com/sponsors/sindresorhus"
10632 + }
10633 + },
10634 + "node_modules/jest-watcher": {
10635 + "version": "29.7.0",
10636 + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz",
10637 + "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==",
10638 + "dev": true,
10639 + "license": "MIT",
10640 + "dependencies": {
10641 + "@jest/test-result": "^29.7.0",
10642 + "@jest/types": "^29.6.3",
10643 + "@types/node": "*",
10644 + "ansi-escapes": "^4.2.1",
10645 + "chalk": "^4.0.0",
10646 + "emittery": "^0.13.1",
10647 + "jest-util": "^29.7.0",
10648 + "string-length": "^4.0.1"
10649 + },
10650 + "engines": {
10651 + "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
10652 + }
10653 + },
8846 10654 "node_modules/jest-worker": {
8847 10655 "version": "29.7.0",
8848 10656 "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz",
@@ -8903,6 +10711,138 @@
8903 10711 "integrity": "sha512-0wM3YBWtYePOjfyXQH5MWQ8H7sdk5EXSwZvmSLKk2RboVQ2Bu239jycHDz5J/8Blf3K0Qnoy2b6xD+z10MFB+Q==",
8904 10712 "license": "0BSD"
8905 10713 },
10714 + "node_modules/jsdom": {
10715 + "version": "20.0.3",
10716 + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-20.0.3.tgz",
10717 + "integrity": "sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ==",
10718 + "dev": true,
10719 + "license": "MIT",
10720 + "dependencies": {
10721 + "abab": "^2.0.6",
10722 + "acorn": "^8.8.1",
10723 + "acorn-globals": "^7.0.0",
10724 + "cssom": "^0.5.0",
10725 + "cssstyle": "^2.3.0",
10726 + "data-urls": "^3.0.2",
10727 + "decimal.js": "^10.4.2",
10728 + "domexception": "^4.0.0",
10729 + "escodegen": "^2.0.0",
10730 + "form-data": "^4.0.0",
10731 + "html-encoding-sniffer": "^3.0.0",
10732 + "http-proxy-agent": "^5.0.0",
10733 + "https-proxy-agent": "^5.0.1",
10734 + "is-potential-custom-element-name": "^1.0.1",
10735 + "nwsapi": "^2.2.2",
10736 + "parse5": "^7.1.1",
10737 + "saxes": "^6.0.0",
10738 + "symbol-tree": "^3.2.4",
10739 + "tough-cookie": "^4.1.2",
10740 + "w3c-xmlserializer": "^4.0.0",
10741 + "webidl-conversions": "^7.0.0",
10742 + "whatwg-encoding": "^2.0.0",
10743 + "whatwg-mimetype": "^3.0.0",
10744 + "whatwg-url": "^11.0.0",
10745 + "ws": "^8.11.0",
10746 + "xml-name-validator": "^4.0.0"
10747 + },
10748 + "engines": {
10749 + "node": ">=14"
10750 + },
10751 + "peerDependencies": {
10752 + "canvas": "^2.5.0"
10753 + },
10754 + "peerDependenciesMeta": {
10755 + "canvas": {
10756 + "optional": true
10757 + }
10758 + }
10759 + },
10760 + "node_modules/jsdom/node_modules/agent-base": {
10761 + "version": "6.0.2",
10762 + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
10763 + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
10764 + "dev": true,
10765 + "license": "MIT",
10766 + "dependencies": {
10767 + "debug": "4"
10768 + },
10769 + "engines": {
10770 + "node": ">= 6.0.0"
10771 + }
10772 + },
10773 + "node_modules/jsdom/node_modules/https-proxy-agent": {
10774 + "version": "5.0.1",
10775 + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
10776 + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
10777 + "dev": true,
10778 + "license": "MIT",
10779 + "dependencies": {
10780 + "agent-base": "6",
10781 + "debug": "4"
10782 + },
10783 + "engines": {
10784 + "node": ">= 6"
10785 + }
10786 + },
10787 + "node_modules/jsdom/node_modules/tr46": {
10788 + "version": "3.0.0",
10789 + "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz",
10790 + "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==",
10791 + "dev": true,
10792 + "license": "MIT",
10793 + "dependencies": {
10794 + "punycode": "^2.1.1"
10795 + },
10796 + "engines": {
10797 + "node": ">=12"
10798 + }
10799 + },
10800 + "node_modules/jsdom/node_modules/webidl-conversions": {
10801 + "version": "7.0.0",
10802 + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz",
10803 + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==",
10804 + "dev": true,
10805 + "license": "BSD-2-Clause",
10806 + "engines": {
10807 + "node": ">=12"
10808 + }
10809 + },
10810 + "node_modules/jsdom/node_modules/whatwg-url": {
10811 + "version": "11.0.0",
10812 + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz",
10813 + "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==",
10814 + "dev": true,
10815 + "license": "MIT",
10816 + "dependencies": {
10817 + "tr46": "^3.0.0",
10818 + "webidl-conversions": "^7.0.0"
10819 + },
10820 + "engines": {
10821 + "node": ">=12"
10822 + }
10823 + },
10824 + "node_modules/jsdom/node_modules/ws": {
10825 + "version": "8.21.0",
10826 + "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.0.tgz",
10827 + "integrity": "sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==",
10828 + "dev": true,
10829 + "license": "MIT",
10830 + "engines": {
10831 + "node": ">=10.0.0"
10832 + },
10833 + "peerDependencies": {
10834 + "bufferutil": "^4.0.1",
10835 + "utf-8-validate": ">=5.0.2"
10836 + },
10837 + "peerDependenciesMeta": {
10838 + "bufferutil": {
10839 + "optional": true
10840 + },
10841 + "utf-8-validate": {
10842 + "optional": true
10843 + }
10844 + }
10845 + },
8906 10846 "node_modules/jsesc": {
8907 10847 "version": "3.1.0",
8908 10848 "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz",
@@ -8922,6 +10862,13 @@
8922 10862 "dev": true,
8923 10863 "license": "MIT"
8924 10864 },
10865 + "node_modules/json-parse-even-better-errors": {
10866 + "version": "2.3.1",
10867 + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
10868 + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
10869 + "dev": true,
10870 + "license": "MIT"
10871 + },
8925 10872 "node_modules/json-schema-traverse": {
8926 10873 "version": "0.4.1",
8927 10874 "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
@@ -9316,6 +11263,13 @@
9316 11263 "url": "https://github.com/sponsors/sindresorhus"
9317 11264 }
9318 11265 },
11266 + "node_modules/lodash": {
11267 + "version": "4.18.1",
11268 + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz",
11269 + "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==",
11270 + "dev": true,
11271 + "license": "MIT"
11272 + },
9319 11273 "node_modules/lodash.debounce": {
9320 11274 "version": "4.0.8",
9321 11275 "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
@@ -9439,6 +11393,35 @@
9439 11393 "yallist": "^3.0.2"
9440 11394 }
9441 11395 },
11396 + "node_modules/make-dir": {
11397 + "version": "4.0.0",
11398 + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz",
11399 + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==",
11400 + "dev": true,
11401 + "license": "MIT",
11402 + "dependencies": {
11403 + "semver": "^7.5.3"
11404 + },
11405 + "engines": {
11406 + "node": ">=10"
11407 + },
11408 + "funding": {
11409 + "url": "https://github.com/sponsors/sindresorhus"
11410 + }
11411 + },
11412 + "node_modules/make-dir/node_modules/semver": {
11413 + "version": "7.8.4",
11414 + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.4.tgz",
11415 + "integrity": "sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA==",
11416 + "dev": true,
11417 + "license": "ISC",
11418 + "bin": {
11419 + "semver": "bin/semver.js"
11420 + },
11421 + "engines": {
11422 + "node": ">=10"
11423 + }
11424 + },
9442 11425 "node_modules/makeerror": {
9443 11426 "version": "1.0.12",
9444 11427 "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz",
@@ -9884,10 +11867,10 @@
9884 11867 }
9885 11868 },
9886 11869 "node_modules/minipass": {
9887 - "version": "7.1.2",
9888 - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
9889 - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
9890 - "license": "ISC",
11870 + "version": "7.1.3",
11871 + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz",
11872 + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==",
11873 + "license": "BlueOak-1.0.0",
9891 11874 "engines": {
9892 11875 "node": ">=16 || 14 >=14.17"
9893 11876 }
@@ -10092,12 +12075,32 @@
10092 12075 "node": ">=10"
10093 12076 }
10094 12077 },
12078 + "node_modules/npm-run-path": {
12079 + "version": "4.0.1",
12080 + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
12081 + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
12082 + "dev": true,
12083 + "license": "MIT",
12084 + "dependencies": {
12085 + "path-key": "^3.0.0"
12086 + },
12087 + "engines": {
12088 + "node": ">=8"
12089 + }
12090 + },
10095 12091 "node_modules/nullthrows": {
10096 12092 "version": "1.1.1",
10097 12093 "resolved": "https://registry.npmjs.org/nullthrows/-/nullthrows-1.1.1.tgz",
10098 12094 "integrity": "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==",
10099 12095 "license": "MIT"
10100 12096 },
12097 + "node_modules/nwsapi": {
12098 + "version": "2.2.24",
12099 + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.24.tgz",
12100 + "integrity": "sha512-7YRhZ3jS45LwmSCT4b2sVFHt/WuovaktDU07QrtOBY2PXskss5a9jfmR9jptyumwXST+rFjrmppMY1KT/yn35A==",
12101 + "dev": true,
12102 + "license": "MIT"
12103 + },
10101 12104 "node_modules/ob1": {
10102 12105 "version": "0.83.2",
10103 12106 "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.83.2.tgz",
@@ -10507,6 +12510,25 @@
10507 12510 "node": ">=6"
10508 12511 }
10509 12512 },
12513 + "node_modules/parse-json": {
12514 + "version": "5.2.0",
12515 + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
12516 + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
12517 + "dev": true,
12518 + "license": "MIT",
12519 + "dependencies": {
12520 + "@babel/code-frame": "^7.0.0",
12521 + "error-ex": "^1.3.1",
12522 + "json-parse-even-better-errors": "^2.3.0",
12523 + "lines-and-columns": "^1.1.6"
12524 + },
12525 + "engines": {
12526 + "node": ">=8"
12527 + },
12528 + "funding": {
12529 + "url": "https://github.com/sponsors/sindresorhus"
12530 + }
12531 + },
10510 12532 "node_modules/parse-png": {
10511 12533 "version": "2.1.0",
10512 12534 "resolved": "https://registry.npmjs.org/parse-png/-/parse-png-2.1.0.tgz",
@@ -10519,6 +12541,19 @@
10519 12541 "node": ">=10"
10520 12542 }
10521 12543 },
12544 + "node_modules/parse5": {
12545 + "version": "7.3.0",
12546 + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.3.0.tgz",
12547 + "integrity": "sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==",
12548 + "dev": true,
12549 + "license": "MIT",
12550 + "dependencies": {
12551 + "entities": "^6.0.0"
12552 + },
12553 + "funding": {
12554 + "url": "https://github.com/inikulin/parse5?sponsor=1"
12555 + }
12556 + },
10522 12557 "node_modules/parseurl": {
10523 12558 "version": "1.3.3",
10524 12559 "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
@@ -10616,6 +12651,75 @@
10616 12651 "node": ">= 6"
10617 12652 }
10618 12653 },
12654 + "node_modules/pkg-dir": {
12655 + "version": "4.2.0",
12656 + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
12657 + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
12658 + "dev": true,
12659 + "license": "MIT",
12660 + "dependencies": {
12661 + "find-up": "^4.0.0"
12662 + },
12663 + "engines": {
12664 + "node": ">=8"
12665 + }
12666 + },
12667 + "node_modules/pkg-dir/node_modules/find-up": {
12668 + "version": "4.1.0",
12669 + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
12670 + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
12671 + "dev": true,
12672 + "license": "MIT",
12673 + "dependencies": {
12674 + "locate-path": "^5.0.0",
12675 + "path-exists": "^4.0.0"
12676 + },
12677 + "engines": {
12678 + "node": ">=8"
12679 + }
12680 + },
12681 + "node_modules/pkg-dir/node_modules/locate-path": {
12682 + "version": "5.0.0",
12683 + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
12684 + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
12685 + "dev": true,
12686 + "license": "MIT",
12687 + "dependencies": {
12688 + "p-locate": "^4.1.0"
12689 + },
12690 + "engines": {
12691 + "node": ">=8"
12692 + }
12693 + },
12694 + "node_modules/pkg-dir/node_modules/p-limit": {
12695 + "version": "2.3.0",
12696 + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
12697 + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
12698 + "dev": true,
12699 + "license": "MIT",
12700 + "dependencies": {
12701 + "p-try": "^2.0.0"
12702 + },
12703 + "engines": {
12704 + "node": ">=6"
12705 + },
12706 + "funding": {
12707 + "url": "https://github.com/sponsors/sindresorhus"
12708 + }
12709 + },
12710 + "node_modules/pkg-dir/node_modules/p-locate": {
12711 + "version": "4.1.0",
12712 + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
12713 + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
12714 + "dev": true,
12715 + "license": "MIT",
12716 + "dependencies": {
12717 + "p-limit": "^2.2.0"
12718 + },
12719 + "engines": {
12720 + "node": ">=8"
12721 + }
12722 + },
10619 12723 "node_modules/plist": {
10620 12724 "version": "3.1.0",
10621 12725 "resolved": "https://registry.npmjs.org/plist/-/plist-3.1.0.tgz",
@@ -10795,6 +12899,19 @@
10795 12899 "dev": true,
10796 12900 "license": "MIT"
10797 12901 },
12902 + "node_modules/psl": {
12903 + "version": "1.15.0",
12904 + "resolved": "https://registry.npmjs.org/psl/-/psl-1.15.0.tgz",
12905 + "integrity": "sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==",
12906 + "dev": true,
12907 + "license": "MIT",
12908 + "dependencies": {
12909 + "punycode": "^2.3.1"
12910 + },
12911 + "funding": {
12912 + "url": "https://github.com/sponsors/lupomontero"
12913 + }
12914 + },
10798 12915 "node_modules/punycode": {
10799 12916 "version": "2.3.1",
10800 12917 "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
@@ -10804,6 +12921,23 @@
10804 12921 "node": ">=6"
10805 12922 }
10806 12923 },
12924 + "node_modules/pure-rand": {
12925 + "version": "6.1.0",
12926 + "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz",
12927 + "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==",
12928 + "dev": true,
12929 + "funding": [
12930 + {
12931 + "type": "individual",
12932 + "url": "https://github.com/sponsors/dubzzz"
12933 + },
12934 + {
12935 + "type": "opencollective",
12936 + "url": "https://opencollective.com/fast-check"
12937 + }
12938 + ],
12939 + "license": "MIT"
12940 + },
10807 12941 "node_modules/qrcode-terminal": {
10808 12942 "version": "0.11.0",
10809 12943 "resolved": "https://registry.npmjs.org/qrcode-terminal/-/qrcode-terminal-0.11.0.tgz",
@@ -10904,7 +13038,6 @@
10904 13038 "resolved": "https://registry.npmjs.org/react/-/react-19.1.0.tgz",
10905 13039 "integrity": "sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==",
10906 13040 "license": "MIT",
10907 - "peer": true,
10908 13041 "engines": {
10909 13042 "node": ">=0.10.0"
10910 13043 }
@@ -10924,7 +13057,6 @@
10924 13057 "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.0.tgz",
10925 13058 "integrity": "sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==",
10926 13059 "license": "MIT",
10927 - "peer": true,
10928 13060 "dependencies": {
10929 13061 "scheduler": "^0.26.0"
10930 13062 },
@@ -10961,7 +13093,6 @@
10961 13093 "resolved": "https://registry.npmjs.org/react-native/-/react-native-0.81.5.tgz",
10962 13094 "integrity": "sha512-1w+/oSjEXZjMqsIvmkCRsOc8UBYv163bTWKTI8+1mxztvQPhCRYGTvZ/PL1w16xXHneIj/SLGfxWg2GWN2uexw==",
10963 13095 "license": "MIT",
10964 - "peer": true,
10965 13096 "dependencies": {
10966 13097 "@jest/create-cache-key-function": "^29.7.0",
10967 13098 "@react-native/assets-registry": "0.81.5",
@@ -11019,7 +13150,6 @@
11019 13150 "resolved": "https://registry.npmjs.org/react-native-gesture-handler/-/react-native-gesture-handler-2.28.0.tgz",
11020 13151 "integrity": "sha512-0msfJ1vRxXKVgTgvL+1ZOoYw3/0z1R+Ked0+udoJhyplC2jbVKIJ8Z1bzWdpQRCV3QcQ87Op0zJVE5DhKK2A0A==",
11021 13152 "license": "MIT",
11022 - "peer": true,
11023 13153 "dependencies": {
11024 13154 "@egjs/hammerjs": "^2.0.17",
11025 13155 "hoist-non-react-statics": "^3.3.0",
@@ -11045,7 +13175,6 @@
11045 13175 "resolved": "https://registry.npmjs.org/react-native-pager-view/-/react-native-pager-view-6.9.1.tgz",
11046 13176 "integrity": "sha512-uUT0MMMbNtoSbxe9pRvdJJKEi9snjuJ3fXlZhG8F2vVMOBJVt/AFtqMPUHu9yMflmqOr08PewKzj9EPl/Yj+Gw==",
11047 13177 "license": "MIT",
11048 - "peer": true,
11049 13178 "peerDependencies": {
11050 13179 "react": "*",
11051 13180 "react-native": "*"
@@ -11056,7 +13185,6 @@
11056 13185 "resolved": "https://registry.npmjs.org/react-native-reanimated/-/react-native-reanimated-4.1.3.tgz",
11057 13186 "integrity": "sha512-GP8wsi1u3nqvC1fMab/m8gfFwFyldawElCcUSBJQgfrXeLmsPPUOpDw44lbLeCpcwUuLa05WTVePdTEwCLTUZg==",
11058 13187 "license": "MIT",
11059 - "peer": true,
11060 13188 "dependencies": {
11061 13189 "react-native-is-edge-to-edge": "^1.2.1",
11062 13190 "semver": "7.7.2"
@@ -11085,7 +13213,6 @@
11085 13213 "resolved": "https://registry.npmjs.org/react-native-safe-area-context/-/react-native-safe-area-context-5.6.2.tgz",
11086 13214 "integrity": "sha512-4XGqMNj5qjUTYywJqpdWZ9IG8jgkS3h06sfVjfw5yZQZfWnRFXczi0GnYyFyCc2EBps/qFmoCH8fez//WumdVg==",
11087 13215 "license": "MIT",
11088 - "peer": true,
11089 13216 "peerDependencies": {
11090 13217 "react": "*",
11091 13218 "react-native": "*"
@@ -11096,7 +13223,6 @@
11096 13223 "resolved": "https://registry.npmjs.org/react-native-screens/-/react-native-screens-4.16.0.tgz",
11097 13224 "integrity": "sha512-yIAyh7F/9uWkOzCi1/2FqvNvK6Wb9Y1+Kzn16SuGfN9YFJDTbwlzGRvePCNTOX0recpLQF3kc2FmvMUhyTCH1Q==",
11098 13225 "license": "MIT",
11099 - "peer": true,
11100 13226 "dependencies": {
11101 13227 "react-freeze": "^1.0.0",
11102 13228 "react-native-is-edge-to-edge": "^1.2.1",
@@ -11126,7 +13252,6 @@
11126 13252 "resolved": "https://registry.npmjs.org/react-native-web/-/react-native-web-0.21.2.tgz",
11127 13253 "integrity": "sha512-SO2t9/17zM4iEnFvlu2DA9jqNbzNhoUP+AItkoCOyFmDMOhUnBBznBDCYN92fGdfAkfQlWzPoez6+zLxFNsZEg==",
11128 13254 "license": "MIT",
11129 - "peer": true,
11130 13255 "dependencies": {
11131 13256 "@babel/runtime": "^7.18.6",
11132 13257 "@react-native/normalize-colors": "^0.74.1",
@@ -11159,7 +13284,6 @@
11159 13284 "resolved": "https://registry.npmjs.org/react-native-worklets/-/react-native-worklets-0.5.1.tgz",
11160 13285 "integrity": "sha512-lJG6Uk9YuojjEX/tQrCbcbmpdLCSFxDK1rJlkDhgqkVi1KZzG7cdcBFQRqyNOOzR9Y0CXNuldmtWTGOyM0k0+w==",
11161 13286 "license": "MIT",
11162 - "peer": true,
11163 13287 "dependencies": {
11164 13288 "@babel/plugin-transform-arrow-functions": "^7.0.0-0",
11165 13289 "@babel/plugin-transform-class-properties": "^7.0.0-0",
@@ -11270,7 +13394,6 @@
11270 13394 "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz",
11271 13395 "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==",
11272 13396 "license": "MIT",
11273 - "peer": true,
11274 13397 "engines": {
11275 13398 "node": ">=0.10.0"
11276 13399 }
@@ -11344,6 +13467,20 @@
11344 13467 }
11345 13468 }
11346 13469 },
13470 + "node_modules/react-test-renderer": {
13471 + "version": "19.1.0",
13472 + "resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-19.1.0.tgz",
13473 + "integrity": "sha512-jXkSl3CpvPYEF+p/eGDLB4sPoDX8pKkYvRl9+rR8HxLY0X04vW7hCm1/0zHoUSjPZ3bDa+wXWNTDVIw/R8aDVw==",
13474 + "dev": true,
13475 + "license": "MIT",
13476 + "dependencies": {
13477 + "react-is": "^19.1.0",
13478 + "scheduler": "^0.26.0"
13479 + },
13480 + "peerDependencies": {
13481 + "react": "^19.1.0"
13482 + }
13483 + },
11347 13484 "node_modules/reflect.getprototypeof": {
11348 13485 "version": "1.0.10",
11349 13486 "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz",
@@ -11513,6 +13650,19 @@
11513 13650 "url": "https://github.com/sponsors/ljharb"
11514 13651 }
11515 13652 },
13653 + "node_modules/resolve-cwd": {
13654 + "version": "3.0.0",
13655 + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz",
13656 + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==",
13657 + "dev": true,
13658 + "license": "MIT",
13659 + "dependencies": {
13660 + "resolve-from": "^5.0.0"
13661 + },
13662 + "engines": {
13663 + "node": ">=8"
13664 + }
13665 + },
11516 13666 "node_modules/resolve-from": {
11517 13667 "version": "5.0.0",
11518 13668 "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
@@ -11724,12 +13874,32 @@
11724 13874 "url": "https://github.com/sponsors/ljharb"
11725 13875 }
11726 13876 },
13877 + "node_modules/safer-buffer": {
13878 + "version": "2.1.2",
13879 + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
13880 + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
13881 + "dev": true,
13882 + "license": "MIT"
13883 + },
11727 13884 "node_modules/sax": {
11728 13885 "version": "1.4.2",
11729 13886 "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.2.tgz",
11730 13887 "integrity": "sha512-FySGAa0RGcFiN6zfrO9JvK1r7TB59xuzCcTHOBXBNoKgDejlOQCR2KL/FGk3/iDlsqyYg1ELZpOmlg09B01Czw==",
11731 13888 "license": "BlueOak-1.0.0"
11732 13889 },
13890 + "node_modules/saxes": {
13891 + "version": "6.0.0",
13892 + "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz",
13893 + "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==",
13894 + "dev": true,
13895 + "license": "ISC",
13896 + "dependencies": {
13897 + "xmlchars": "^2.2.0"
13898 + },
13899 + "engines": {
13900 + "node": ">=v12.22.7"
13901 + }
13902 + },
11733 13903 "node_modules/scheduler": {
11734 13904 "version": "0.26.0",
11735 13905 "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz",
@@ -12143,6 +14313,16 @@
12143 14313 "dev": true,
12144 14314 "license": "MIT"
12145 14315 },
14316 + "node_modules/stack-generator": {
14317 + "version": "2.0.10",
14318 + "resolved": "https://registry.npmjs.org/stack-generator/-/stack-generator-2.0.10.tgz",
14319 + "integrity": "sha512-mwnua/hkqM6pF4k8SnmZ2zfETsRUpWXREfA/goT8SLCV4iOFa4bzOX2nDipWAZFPTjLvQB82f5yaodMVhK0yJQ==",
14320 + "dev": true,
14321 + "license": "MIT",
14322 + "dependencies": {
14323 + "stackframe": "^1.3.4"
14324 + }
14325 + },
12146 14326 "node_modules/stack-utils": {
12147 14327 "version": "2.0.6",
12148 14328 "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz",
@@ -12170,6 +14350,39 @@
12170 14350 "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==",
12171 14351 "license": "MIT"
12172 14352 },
14353 + "node_modules/stacktrace-gps": {
14354 + "version": "3.1.2",
14355 + "resolved": "https://registry.npmjs.org/stacktrace-gps/-/stacktrace-gps-3.1.2.tgz",
14356 + "integrity": "sha512-GcUgbO4Jsqqg6RxfyTHFiPxdPqF+3LFmQhm7MgCuYQOYuWyqxo5pwRPz5d/u6/WYJdEnWfK4r+jGbyD8TSggXQ==",
14357 + "dev": true,
14358 + "license": "MIT",
14359 + "dependencies": {
14360 + "source-map": "0.5.6",
14361 + "stackframe": "^1.3.4"
14362 + }
14363 + },
14364 + "node_modules/stacktrace-gps/node_modules/source-map": {
14365 + "version": "0.5.6",
14366 + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz",
14367 + "integrity": "sha512-MjZkVp0NHr5+TPihLcadqnlVoGIoWo4IBHptutGh9wI3ttUYvCG26HkSuDi+K6lsZ25syXJXcctwgyVCt//xqA==",
14368 + "dev": true,
14369 + "license": "BSD-3-Clause",
14370 + "engines": {
14371 + "node": ">=0.10.0"
14372 + }
14373 + },
14374 + "node_modules/stacktrace-js": {
14375 + "version": "2.0.2",
14376 + "resolved": "https://registry.npmjs.org/stacktrace-js/-/stacktrace-js-2.0.2.tgz",
14377 + "integrity": "sha512-Je5vBeY4S1r/RnLydLl0TBTi3F2qdfWmYsGvtfZgEI+SCprPppaIhQf5nGcal4gI4cGpCV/duLcAzT1np6sQqg==",
14378 + "dev": true,
14379 + "license": "MIT",
14380 + "dependencies": {
14381 + "error-stack-parser": "^2.0.6",
14382 + "stack-generator": "^2.0.5",
14383 + "stacktrace-gps": "^3.0.4"
14384 + }
14385 + },
12173 14386 "node_modules/stacktrace-parser": {
12174 14387 "version": "0.1.11",
12175 14388 "resolved": "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.11.tgz",
@@ -12223,6 +14436,33 @@
12223 14436 "node": ">=4"
12224 14437 }
12225 14438 },
14439 + "node_modules/string-length": {
14440 + "version": "4.0.2",
14441 + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz",
14442 + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==",
14443 + "dev": true,
14444 + "license": "MIT",
14445 + "dependencies": {
14446 + "char-regex": "^1.0.2",
14447 + "strip-ansi": "^6.0.0"
14448 + },
14449 + "engines": {
14450 + "node": ">=10"
14451 + }
14452 + },
14453 + "node_modules/string-length/node_modules/strip-ansi": {
14454 + "version": "6.0.1",
14455 + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
14456 + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
14457 + "dev": true,
14458 + "license": "MIT",
14459 + "dependencies": {
14460 + "ansi-regex": "^5.0.1"
14461 + },
14462 + "engines": {
14463 + "node": ">=8"
14464 + }
14465 + },
12226 14466 "node_modules/string-width": {
12227 14467 "version": "5.1.2",
12228 14468 "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
@@ -12421,6 +14661,16 @@
12421 14661 "node": ">=4"
12422 14662 }
12423 14663 },
14664 + "node_modules/strip-final-newline": {
14665 + "version": "2.0.0",
14666 + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
14667 + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
14668 + "dev": true,
14669 + "license": "MIT",
14670 + "engines": {
14671 + "node": ">=6"
14672 + }
14673 + },
12424 14674 "node_modules/strip-json-comments": {
12425 14675 "version": "3.1.1",
12426 14676 "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
@@ -12459,17 +14709,17 @@
12459 14709 "license": "MIT"
12460 14710 },
12461 14711 "node_modules/sucrase": {
12462 - "version": "3.35.0",
12463 - "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz",
12464 - "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==",
14712 + "version": "3.35.1",
14713 + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.1.tgz",
14714 + "integrity": "sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==",
12465 14715 "license": "MIT",
12466 14716 "dependencies": {
12467 14717 "@jridgewell/gen-mapping": "^0.3.2",
12468 14718 "commander": "^4.0.0",
12469 - "glob": "^10.3.10",
12470 14719 "lines-and-columns": "^1.1.6",
12471 14720 "mz": "^2.7.0",
12472 14721 "pirates": "^4.0.1",
14722 + "tinyglobby": "^0.2.11",
12473 14723 "ts-interface-checker": "^0.1.9"
12474 14724 },
12475 14725 "bin": {
@@ -12526,6 +14776,13 @@
12526 14776 "url": "https://github.com/sponsors/ljharb"
12527 14777 }
12528 14778 },
14779 + "node_modules/symbol-tree": {
14780 + "version": "3.2.4",
14781 + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz",
14782 + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==",
14783 + "dev": true,
14784 + "license": "MIT"
14785 + },
12529 14786 "node_modules/tar": {
12530 14787 "version": "7.5.2",
12531 14788 "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.2.tgz",
@@ -12666,7 +14923,6 @@
12666 14923 "version": "0.2.15",
12667 14924 "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz",
12668 14925 "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==",
12669 - "dev": true,
12670 14926 "license": "MIT",
12671 14927 "dependencies": {
12672 14928 "fdir": "^6.5.0",
@@ -12683,7 +14939,6 @@
12683 14939 "version": "6.5.0",
12684 14940 "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
12685 14941 "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
12686 - "dev": true,
12687 14942 "license": "MIT",
12688 14943 "engines": {
12689 14944 "node": ">=12.0.0"
@@ -12701,9 +14956,7 @@
12701 14956 "version": "4.0.3",
12702 14957 "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz",
12703 14958 "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
12704 - "dev": true,
12705 14959 "license": "MIT",
12706 - "peer": true,
12707 14960 "engines": {
12708 14961 "node": ">=12"
12709 14962 },
@@ -12738,6 +14991,22 @@
12738 14991 "node": ">=0.6"
12739 14992 }
12740 14993 },
14994 + "node_modules/tough-cookie": {
14995 + "version": "4.1.4",
14996 + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz",
14997 + "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==",
14998 + "dev": true,
14999 + "license": "BSD-3-Clause",
15000 + "dependencies": {
15001 + "psl": "^1.1.33",
15002 + "punycode": "^2.1.1",
15003 + "universalify": "^0.2.0",
15004 + "url-parse": "^1.5.3"
15005 + },
15006 + "engines": {
15007 + "node": ">=6"
15008 + }
15009 + },
12741 15010 "node_modules/tr46": {
12742 15011 "version": "0.0.3",
12743 15012 "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
@@ -12910,7 +15179,6 @@
12910 15179 "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
12911 15180 "dev": true,
12912 15181 "license": "Apache-2.0",
12913 - "peer": true,
12914 15182 "bin": {
12915 15183 "tsc": "bin/tsc",
12916 15184 "tsserver": "bin/tsserver"
@@ -13031,6 +15299,16 @@
13031 15299 "node": ">=8"
13032 15300 }
13033 15301 },
15302 + "node_modules/universalify": {
15303 + "version": "0.2.0",
15304 + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz",
15305 + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==",
15306 + "dev": true,
15307 + "license": "MIT",
15308 + "engines": {
15309 + "node": ">= 4.0.0"
15310 + }
15311 + },
13034 15312 "node_modules/unpipe": {
13035 15313 "version": "1.0.0",
13036 15314 "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
@@ -13226,6 +15504,21 @@
13226 15504 "uuid": "dist/bin/uuid"
13227 15505 }
13228 15506 },
15507 + "node_modules/v8-to-istanbul": {
15508 + "version": "9.3.0",
15509 + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz",
15510 + "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==",
15511 + "dev": true,
15512 + "license": "ISC",
15513 + "dependencies": {
15514 + "@jridgewell/trace-mapping": "^0.3.12",
15515 + "@types/istanbul-lib-coverage": "^2.0.1",
15516 + "convert-source-map": "^2.0.0"
15517 + },
15518 + "engines": {
15519 + "node": ">=10.12.0"
15520 + }
15521 + },
13229 15522 "node_modules/validate-npm-package-name": {
13230 15523 "version": "5.0.1",
13231 15524 "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.1.tgz",
@@ -13440,6 +15733,19 @@
13440 15733 "integrity": "sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==",
13441 15734 "license": "MIT"
13442 15735 },
15736 + "node_modules/w3c-xmlserializer": {
15737 + "version": "4.0.0",
15738 + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz",
15739 + "integrity": "sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==",
15740 + "dev": true,
15741 + "license": "MIT",
15742 + "dependencies": {
15743 + "xml-name-validator": "^4.0.0"
15744 + },
15745 + "engines": {
15746 + "node": ">=14"
15747 + }
15748 + },
13443 15749 "node_modules/walker": {
13444 15750 "version": "1.0.8",
13445 15751 "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz",
@@ -13546,12 +15852,36 @@
13546 15852 "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==",
13547 15853 "license": "BSD-2-Clause"
13548 15854 },
15855 + "node_modules/whatwg-encoding": {
15856 + "version": "2.0.0",
15857 + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz",
15858 + "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==",
15859 + "deprecated": "Use @exodus/bytes instead for a more spec-conformant and faster implementation",
15860 + "dev": true,
15861 + "license": "MIT",
15862 + "dependencies": {
15863 + "iconv-lite": "0.6.3"
15864 + },
15865 + "engines": {
15866 + "node": ">=12"
15867 + }
15868 + },
13549 15869 "node_modules/whatwg-fetch": {
13550 15870 "version": "3.6.20",
13551 15871 "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz",
13552 15872 "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==",
13553 15873 "license": "MIT"
13554 15874 },
15875 + "node_modules/whatwg-mimetype": {
15876 + "version": "3.0.0",
15877 + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz",
15878 + "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==",
15879 + "dev": true,
15880 + "license": "MIT",
15881 + "engines": {
15882 + "node": ">=12"
15883 + }
15884 + },
13555 15885 "node_modules/whatwg-url": {
13556 15886 "version": "5.0.0",
13557 15887 "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
@@ -13842,6 +16172,16 @@
13842 16172 "node": ">=10.0.0"
13843 16173 }
13844 16174 },
16175 + "node_modules/xml-name-validator": {
16176 + "version": "4.0.0",
16177 + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz",
16178 + "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==",
16179 + "dev": true,
16180 + "license": "Apache-2.0",
16181 + "engines": {
16182 + "node": ">=12"
16183 + }
16184 + },
13845 16185 "node_modules/xml2js": {
13846 16186 "version": "0.6.0",
13847 16187 "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.0.tgz",
@@ -13873,6 +16213,13 @@
13873 16213 "node": ">=8.0"
13874 16214 }
13875 16215 },
16216 + "node_modules/xmlchars": {
16217 + "version": "2.2.0",
16218 + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz",
16219 + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==",
16220 + "dev": true,
16221 + "license": "MIT"
16222 + },
13876 16223 "node_modules/y18n": {
13877 16224 "version": "5.0.8",
13878 16225 "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
@@ -13976,7 +16323,6 @@
13976 16323 "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz",
13977 16324 "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==",
13978 16325 "license": "MIT",
13979 - "peer": true,
13980 16326 "funding": {
13981 16327 "url": "https://github.com/sponsors/colinhacks"
13982 16328 }
MODIFY package.json +8 -1
diff --git a/package.json b/package.json
index 36ae26c..faf0069 100644
--- a/package.json
+++ b/package.json
@@ -8,7 +8,11 @@
8 8 "android": "expo start --android",
9 9 "ios": "expo start --ios",
10 10 "web": "expo start --web",
11 - "lint": "expo lint"
11 + "lint": "expo lint",
12 + "test": "jest"
13 + },
14 + "jest": {
15 + "preset": "jest-expo"
12 16 },
13 17 "dependencies": {
14 18 "@expo/vector-icons": "^15.0.3",
@@ -50,9 +54,12 @@
50 54 "webdav": "^5.8.0"
51 55 },
52 56 "devDependencies": {
57 + "@types/jest": "^29.5.12",
53 58 "@types/react": "~19.1.0",
54 59 "eslint": "^9.25.0",
55 60 "eslint-config-expo": "~10.0.0",
61 + "jest": "^29.7.0",
62 + "jest-expo": "~54.0.0",
56 63 "typescript": "~5.9.2"
57 64 },
58 65 "private": true
MODIFY services/notification.service.ts +68 -57
diff --git a/services/notification.service.ts b/services/notification.service.ts
index 9e221e5..acca0ac 100644
--- a/services/notification.service.ts
+++ b/services/notification.service.ts
@@ -4,8 +4,17 @@
4 4 */
5 5
6 6 import { Platform } from 'react-native';
7 +import AsyncStorage from '@react-native-async-storage/async-storage';
7 8 import type { NotificationRequest } from 'expo-notifications';
8 9 import taskService from './task.service';
10 +import {
11 + DEFAULT_REMINDER_TIME,
12 + ReminderTime,
13 + buildReminderBody,
14 + isValidReminderTime,
15 +} from '../utils/reminder';
16 +
17 +const REMINDER_TIME_KEY = '@taskflow_reminder_time';
9 18
10 19 // Only import notifications on native platforms
11 20 let Notifications: any;
@@ -64,44 +73,43 @@
64 73 }
65 74
66 75 /**
67 - * Schedule daily notification at noon
76 + * Get the configured daily reminder time (falls back to the default).
68 77 */
69 - async scheduleDailyNotification(): Promise<boolean> {
70 - if (Platform.OS === 'web') {
71 - return false;
72 - }
78 + async getReminderTime(): Promise<ReminderTime> {
73 79 try {
74 - // Cancel existing notification if any
75 - if (this.notificationId) {
76 - await Notifications.cancelScheduledNotificationAsync(this.notificationId);
80 + const json = await AsyncStorage.getItem(REMINDER_TIME_KEY);
81 + if (json) {
82 + const parsed = JSON.parse(json) as ReminderTime;
83 + if (isValidReminderTime(parsed)) {
84 + return parsed;
85 + }
77 86 }
78 -
79 - // Schedule notification for noon every day
80 - this.notificationId = await Notifications.scheduleNotificationAsync({
81 - content: {
82 - title: 'Daily Task Reminder',
83 - body: 'Check your tasks for today',
84 - sound: true,
85 - priority: Notifications.AndroidNotificationPriority.HIGH,
86 - },
87 - trigger: {
88 - type: Notifications.SchedulableTriggerInputTypes.DAILY,
89 - hour: 12,
90 - minute: 0,
91 - repeats: true,
92 - } as any,
93 - });
94 -
95 - console.log('Daily notification scheduled:', this.notificationId);
96 - return true;
97 87 } catch (error) {
98 - console.error('Failed to schedule notification:', error);
99 - return false;
88 + console.error('Failed to load reminder time:', error);
89 + }
90 + return DEFAULT_REMINDER_TIME;
91 + }
92 +
93 + /**
94 + * Persist a new reminder time. If a daily reminder is currently scheduled,
95 + * it is rescheduled at the new time.
96 + */
97 + async setReminderTime(time: ReminderTime): Promise<void> {
98 + if (!isValidReminderTime(time)) {
99 + throw new Error('Invalid reminder time');
100 + }
101 + await AsyncStorage.setItem(REMINDER_TIME_KEY, JSON.stringify(time));
102 + if (Platform.OS !== 'web') {
103 + const scheduled = await this.getScheduledNotifications();
104 + if (scheduled.length > 0) {
105 + await this.scheduleDailyNotificationWithCount();
106 + }
100 107 }
101 108 }
102 109
103 110 /**
104 - * Schedule notification with task count
111 + * Schedule the daily reminder at the configured time, with a body that
112 + * reflects how many tasks are scheduled for today.
105 113 */
106 114 async scheduleDailyNotificationWithCount(): Promise<boolean> {
107 115 if (Platform.OS === 'web') {
@@ -113,21 +121,15 @@
113 121 return false;
114 122 }
115 123
116 - // Cancel existing notification if any
117 - if (this.notificationId) {
118 - await Notifications.cancelScheduledNotificationAsync(this.notificationId);
119 - }
124 + // Cancel any previously scheduled reminder. We cancel all (rather than
125 + // by id) so duplicates can't pile up across app restarts, where the
126 + // in-memory notificationId is lost.
127 + await Notifications.cancelAllScheduledNotificationsAsync();
120 128
121 - // Get today's task count
122 129 const todayTasks = await taskService.getTodayTasks();
123 - const taskCount = todayTasks.length;
130 + const body = buildReminderBody(todayTasks.length);
131 + const { hour, minute } = await this.getReminderTime();
124 132
125 - let body = 'Check your tasks for today';
126 - if (taskCount > 0) {
127 - body = `You have ${taskCount} task${taskCount > 1 ? 's' : ''} scheduled for today`;
128 - }
129 -
130 - // Schedule notification for noon every day
131 133 this.notificationId = await Notifications.scheduleNotificationAsync({
132 134 content: {
133 135 title: '📋 Daily Task Reminder',
@@ -138,13 +140,12 @@
138 140 },
139 141 trigger: {
140 142 type: Notifications.SchedulableTriggerInputTypes.DAILY,
141 - hour: 12,
142 - minute: 0,
143 + hour,
144 + minute,
143 145 repeats: true,
144 146 } as any,
145 147 });
146 148
147 - console.log('Daily notification scheduled with count:', this.notificationId);
148 149 return true;
149 150 } catch (error) {
150 151 console.error('Failed to schedule notification with count:', error);
@@ -153,18 +154,33 @@
153 154 }
154 155
155 156 /**
156 - * Cancel daily notification
157 + * Re-schedule the daily reminder if one is already active, so the task
158 + * count and configured time stay current. Safe to call on app start.
159 + */
160 + async refreshDailyNotificationIfEnabled(): Promise<void> {
161 + if (Platform.OS === 'web') {
162 + return;
163 + }
164 + try {
165 + const scheduled = await this.getScheduledNotifications();
166 + if (scheduled.length > 0) {
167 + await this.scheduleDailyNotificationWithCount();
168 + }
169 + } catch (error) {
170 + console.error('Failed to refresh daily notification:', error);
171 + }
172 + }
173 +
174 + /**
175 + * Cancel the daily reminder.
157 176 */
158 177 async cancelDailyNotification(): Promise<void> {
159 178 if (Platform.OS === 'web') {
160 179 return;
161 180 }
162 181 try {
163 - if (this.notificationId) {
164 - await Notifications.cancelScheduledNotificationAsync(this.notificationId);
165 - this.notificationId = null;
166 - console.log('Daily notification cancelled');
167 - }
182 + await Notifications.cancelAllScheduledNotificationsAsync();
183 + this.notificationId = null;
168 184 } catch (error) {
169 185 console.error('Failed to cancel notification:', error);
170 186 }
@@ -216,12 +232,7 @@
216 232 async sendTestNotification(): Promise<void> {
217 233 try {
218 234 const todayTasks = await taskService.getTodayTasks();
219 - const taskCount = todayTasks.length;
220 -
221 - let body = 'No tasks scheduled for today';
222 - if (taskCount > 0) {
223 - body = `You have ${taskCount} task${taskCount > 1 ? 's' : ''} scheduled for today`;
224 - }
235 + const body = buildReminderBody(todayTasks.length);
225 236
226 237 await Notifications.scheduleNotificationAsync({
227 238 content: {
ADD utils/__tests__/reminder.test.ts +52 -0
diff --git a/utils/__tests__/reminder.test.ts b/utils/__tests__/reminder.test.ts
new file mode 100644
index 0000000..d778da8
--- /dev/null
+++ b/utils/__tests__/reminder.test.ts
@@ -0,0 +1,52 @@
1 +import {
2 + DEFAULT_REMINDER_TIME,
3 + buildReminderBody,
4 + formatReminderTime,
5 + isValidReminderTime,
6 +} from '../reminder';
7 +
8 +describe('buildReminderBody', () => {
9 + it('reports when there are no tasks for today', () => {
10 + expect(buildReminderBody(0)).toBe('No tasks scheduled for today');
11 + });
12 +
13 + it('uses the singular form for exactly one task', () => {
14 + expect(buildReminderBody(1)).toBe('You have 1 task scheduled for today');
15 + });
16 +
17 + it('uses the plural form for multiple tasks', () => {
18 + expect(buildReminderBody(5)).toBe('You have 5 tasks scheduled for today');
19 + });
20 +
21 + it('treats negative counts as zero', () => {
22 + expect(buildReminderBody(-3)).toBe('No tasks scheduled for today');
23 + });
24 +});
25 +
26 +describe('formatReminderTime', () => {
27 + it('zero-pads hours and minutes (24h format)', () => {
28 + expect(formatReminderTime({ hour: 8, minute: 5 })).toBe('08:05');
29 + });
30 +
31 + it('formats the noon default', () => {
32 + expect(formatReminderTime(DEFAULT_REMINDER_TIME)).toBe('12:00');
33 + });
34 +
35 + it('formats late evening times', () => {
36 + expect(formatReminderTime({ hour: 23, minute: 59 })).toBe('23:59');
37 + });
38 +});
39 +
40 +describe('isValidReminderTime', () => {
41 + it('accepts valid times', () => {
42 + expect(isValidReminderTime({ hour: 0, minute: 0 })).toBe(true);
43 + expect(isValidReminderTime({ hour: 23, minute: 59 })).toBe(true);
44 + });
45 +
46 + it('rejects out-of-range or non-integer values', () => {
47 + expect(isValidReminderTime({ hour: 24, minute: 0 })).toBe(false);
48 + expect(isValidReminderTime({ hour: -1, minute: 0 })).toBe(false);
49 + expect(isValidReminderTime({ hour: 12, minute: 60 })).toBe(false);
50 + expect(isValidReminderTime({ hour: 12.5, minute: 0 })).toBe(false);
51 + });
52 +});
ADD utils/reminder.ts +48 -0
diff --git a/utils/reminder.ts b/utils/reminder.ts
new file mode 100644
index 0000000..c40c3be
--- /dev/null
+++ b/utils/reminder.ts
@@ -0,0 +1,48 @@
1 +/**
2 + * Daily reminder helpers
3 + *
4 + * Pure, platform-independent logic for the daily task reminder so it can be
5 + * unit-tested without the native notifications module.
6 + */
7 +
8 +export interface ReminderTime {
9 + /** Hour of day in 24h format (0-23). */
10 + hour: number;
11 + /** Minute of hour (0-59). */
12 + minute: number;
13 +}
14 +
15 +/** Default reminder time: 12:00 (noon). */
16 +export const DEFAULT_REMINDER_TIME: ReminderTime = { hour: 12, minute: 0 };
17 +
18 +/**
19 + * Build the reminder notification body, reflecting how many tasks are
20 + * scheduled for today.
21 + */
22 +export function buildReminderBody(taskCount: number): string {
23 + if (!Number.isFinite(taskCount) || taskCount <= 0) {
24 + return 'No tasks scheduled for today';
25 + }
26 + const noun = taskCount === 1 ? 'task' : 'tasks';
27 + return `You have ${taskCount} ${noun} scheduled for today`;
28 +}
29 +
30 +/** Format a reminder time as a zero-padded 24h string, e.g. "08:05". */
31 +export function formatReminderTime({ hour, minute }: ReminderTime): string {
32 + const hh = String(hour).padStart(2, '0');
33 + const mm = String(minute).padStart(2, '0');
34 + return `${hh}:${mm}`;
35 +}
36 +
37 +/** Validate that a reminder time has in-range, integer hour and minute. */
38 +export function isValidReminderTime(time: ReminderTime): boolean {
39 + const { hour, minute } = time;
40 + return (
41 + Number.isInteger(hour) &&
42 + Number.isInteger(minute) &&
43 + hour >= 0 &&
44 + hour <= 23 &&
45 + minute >= 0 &&
46 + minute <= 59
47 + );
48 +}

Keyboard shortcuts

?Show this help
g hGo home
EscClose dialog