From a005fb0a15b7ac736cb8bd05c991a6584b768ee9 Mon Sep 17 00:00:00 2001 From: lafay <2021211506@stu.hit.edu.cn> Date: Fri, 20 Mar 2026 19:28:42 +0800 Subject: [PATCH] feat: add QR code login and enhance chat experience MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add QR code login flow with scanner and confirmation screens - Implement swipe-to-reply in chat with SwipeableMessageBubble - Replace FlatList with FlashList for chat performance optimization - Add Schedule stack navigator with CourseDetail screen support - Configure deep linking for QR code login (carrotbbs://qrcode/login/:sessionId) - Update branding from 胡萝卜 to 萝卜社区 - Display dynamic app version in settings --- package-lock.json | 2988 +++++++++-------- screenshots/after-fix.png | Bin 126583 -> 0 bytes screenshots/test-navigation-fix.png | Bin 2877 -> 0 bytes src/components/business/QRCodeScanner.tsx | 251 ++ src/navigation/MainNavigator.tsx | 3 +- src/navigation/RootNavigator.tsx | 10 + src/navigation/SimpleMobileTabNavigator.tsx | 49 +- src/navigation/types.ts | 1 + .../hooks/responsive/MIGRATION.md | 223 -- src/screens/auth/LoginScreen.tsx | 4 +- src/screens/auth/QRCodeConfirmScreen.tsx | 288 ++ src/screens/auth/RegisterScreen.tsx | 8 +- src/screens/message/ChatScreen.tsx | 25 +- src/screens/message/MessageListScreen.tsx | 14 +- .../components/ChatScreen/MessageBubble.tsx | 46 +- .../components/ChatScreen/SegmentRenderer.tsx | 1 + .../ChatScreen/SwipeableMessageBubble.tsx | 157 + .../components/ChatScreen/bubbleStyles.ts | 270 ++ .../message/components/ChatScreen/index.ts | 1 + .../message/components/ChatScreen/types.ts | 10 + .../components/ChatScreen/useChatScreen.ts | 35 +- src/screens/profile/SettingsScreen.tsx | 8 +- src/services/authService.ts | 58 + src/utils/__tests__/optimisticUpdate.test.ts | 287 -- 24 files changed, 2878 insertions(+), 1859 deletions(-) delete mode 100644 screenshots/after-fix.png delete mode 100644 screenshots/test-navigation-fix.png create mode 100644 src/components/business/QRCodeScanner.tsx delete mode 100644 src/presentation/hooks/responsive/MIGRATION.md create mode 100644 src/screens/auth/QRCodeConfirmScreen.tsx create mode 100644 src/screens/message/components/ChatScreen/SwipeableMessageBubble.tsx create mode 100644 src/screens/message/components/ChatScreen/bubbleStyles.ts delete mode 100644 src/utils/__tests__/optimisticUpdate.test.ts diff --git a/package-lock.json b/package-lock.json index 4756a76..586d224 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,6 +20,7 @@ "date-fns": "^4.1.0", "expo": "~55.0.4", "expo-background-fetch": "~55.0.9", + "expo-camera": "^55.0.10", "expo-constants": "~55.0.7", "expo-dev-client": "~55.0.10", "expo-file-system": "~55.0.10", @@ -112,15 +113,6 @@ "url": "https://opencollective.com/babel" } }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/@babel/generator": { "version": "7.29.1", "resolved": "https://registry.npmmirror.com/@babel/generator/-/generator-7.29.1.tgz", @@ -165,15 +157,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/@babel/helper-create-class-features-plugin": { "version": "7.28.6", "resolved": "https://registry.npmmirror.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.6.tgz", @@ -195,15 +178,6 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/@babel/helper-create-regexp-features-plugin": { "version": "7.28.5", "resolved": "https://registry.npmmirror.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.28.5.tgz", @@ -221,19 +195,10 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.6.6", - "resolved": "https://registry.npmmirror.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.6.tgz", - "integrity": "sha512-mOAsxeeKkUKayvZR3HeTYD/fICpCPLJrU5ZjelT/PA6WHtNDBOE436YiaEUvHN454bRM3CebhDsIpieCc4texA==", + "version": "0.6.8", + "resolved": "https://registry.npmmirror.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.8.tgz", + "integrity": "sha512-47UwBLPpQi1NoWzLuHNjRoHlYXMwIJoBf7MFou6viC/sIHWYygpvr0B6IAyh5sBdA2nr2LPIRww8lfaUVQINBA==", "license": "MIT", "dependencies": { "@babel/helper-compilation-targets": "^7.28.6", @@ -408,22 +373,22 @@ } }, "node_modules/@babel/helpers": { - "version": "7.28.6", - "resolved": "https://registry.npmmirror.com/@babel/helpers/-/helpers-7.28.6.tgz", - "integrity": "sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==", + "version": "7.29.2", + "resolved": "https://registry.npmmirror.com/@babel/helpers/-/helpers-7.29.2.tgz", + "integrity": "sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==", "license": "MIT", "dependencies": { "@babel/template": "^7.28.6", - "@babel/types": "^7.28.6" + "@babel/types": "^7.29.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.29.0", - "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.29.0.tgz", - "integrity": "sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==", + "version": "7.29.2", + "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.29.2.tgz", + "integrity": "sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==", "license": "MIT", "dependencies": { "@babel/types": "^7.29.0" @@ -1278,15 +1243,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/@babel/plugin-transform-shorthand-properties": { "version": "7.27.1", "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.27.1.tgz", @@ -1423,9 +1379,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.28.6", - "resolved": "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.28.6.tgz", - "integrity": "sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==", + "version": "7.29.2", + "resolved": "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.29.2.tgz", + "integrity": "sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -1530,9 +1486,9 @@ } }, "node_modules/@expo-google-fonts/material-symbols": { - "version": "0.4.25", - "resolved": "https://registry.npmmirror.com/@expo-google-fonts/material-symbols/-/material-symbols-0.4.25.tgz", - "integrity": "sha512-MlwOpcYPLYu2+aDAwqv29l3sknNNxA36Jcu07Tg9+MTEvXk2SPcO8eQmwwDeVBbv5Wb6ToD1LmE+e0lLv/9WvA==", + "version": "0.4.27", + "resolved": "https://registry.npmmirror.com/@expo-google-fonts/material-symbols/-/material-symbols-0.4.27.tgz", + "integrity": "sha512-cnb3DZnWUWpezGFkJ8y4MT5f/lw6FcgDzeJzic+T+vpQHLHG1cg3SC3i1w1i8Bk4xKR4HPY3t9iIRNvtr5ml8A==", "license": "MIT AND Apache-2.0" }, "node_modules/@expo/code-signing-certificates": { @@ -1545,15 +1501,15 @@ } }, "node_modules/@expo/config": { - "version": "55.0.8", - "resolved": "https://registry.npmmirror.com/@expo/config/-/config-55.0.8.tgz", - "integrity": "sha512-D7RYYHfErCgEllGxNwdYdkgzLna7zkzUECBV3snbUpf7RvIpB5l1LpCgzuVoc5KVew5h7N1Tn4LnT/tBSUZsQg==", + "version": "55.0.10", + "resolved": "https://registry.npmmirror.com/@expo/config/-/config-55.0.10.tgz", + "integrity": "sha512-qCHxo9H1ZoeW+y0QeMtVZ3JfGmumpGrgUFX60wLWMarraoQZSe47ZUm9kJSn3iyoPjUtUNanO3eXQg+K8k4rag==", "license": "MIT", "dependencies": { - "@expo/config-plugins": "~55.0.6", + "@expo/config-plugins": "~55.0.7", "@expo/config-types": "^55.0.5", "@expo/json-file": "^10.0.12", - "@expo/require-utils": "^55.0.2", + "@expo/require-utils": "^55.0.3", "deepmerge": "^4.3.1", "getenv": "^2.0.0", "glob": "^13.0.0", @@ -1564,9 +1520,9 @@ } }, "node_modules/@expo/config-plugins": { - "version": "55.0.6", - "resolved": "https://registry.npmmirror.com/@expo/config-plugins/-/config-plugins-55.0.6.tgz", - "integrity": "sha512-cIox6FjZlFaaX40rbQ3DvP9e87S5X85H9uw+BAxJE5timkMhuByy3GAlOsj1h96EyzSiol7Q6YIGgY1Jiz4M+A==", + "version": "55.0.7", + "resolved": "https://registry.npmmirror.com/@expo/config-plugins/-/config-plugins-55.0.7.tgz", + "integrity": "sha512-XZUoDWrsHEkH3yasnDSJABM/UxP5a1ixzRwU/M+BToyn/f0nTrSJJe/Ay/FpxkI4JSNz2n0e06I23b2bleXKVA==", "license": "MIT", "dependencies": { "@expo/config-types": "^55.0.5", @@ -1584,12 +1540,36 @@ "xml2js": "0.6.0" } }, + "node_modules/@expo/config-plugins/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmmirror.com/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@expo/config-types": { "version": "55.0.5", "resolved": "https://registry.npmmirror.com/@expo/config-types/-/config-types-55.0.5.tgz", "integrity": "sha512-sCmSUZG4mZ/ySXvfyyBdhjivz8Q539X1NondwDdYG7s3SBsk+wsgPJzYsqgAG/P9+l0xWjUD2F+kQ1cAJ6NNLg==", "license": "MIT" }, + "node_modules/@expo/config/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmmirror.com/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@expo/devcert": { "version": "1.2.1", "resolved": "https://registry.npmmirror.com/@expo/devcert/-/devcert-1.2.1.tgz", @@ -1656,9 +1636,9 @@ } }, "node_modules/@expo/fingerprint": { - "version": "0.16.5", - "resolved": "https://registry.npmmirror.com/@expo/fingerprint/-/fingerprint-0.16.5.tgz", - "integrity": "sha512-mLrcymtgkW9IJ/G1e8MH1Xt2VIb1MOS86ePY0ePcnV3nVyJqm7gfa/AXD1Hk+eZXvf8XhioYz6QZaamBdEzR3A==", + "version": "0.16.6", + "resolved": "https://registry.npmmirror.com/@expo/fingerprint/-/fingerprint-0.16.6.tgz", + "integrity": "sha512-nRITNbnu3RKSHPvKVehrSU4KG2VY9V8nvULOHBw98ukHCAU4bGrU5APvcblOkX3JAap+xEHsg/mZvqlvkLInmQ==", "license": "MIT", "dependencies": { "@expo/env": "^2.0.11", @@ -1677,6 +1657,18 @@ "fingerprint": "bin/cli.js" } }, + "node_modules/@expo/fingerprint/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmmirror.com/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@expo/image-utils": { "version": "0.8.12", "resolved": "https://registry.npmmirror.com/@expo/image-utils/-/image-utils-0.8.12.tgz", @@ -1692,6 +1684,18 @@ "semver": "^7.6.0" } }, + "node_modules/@expo/image-utils/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmmirror.com/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@expo/json-file": { "version": "10.0.12", "resolved": "https://registry.npmmirror.com/@expo/json-file/-/json-file-10.0.12.tgz", @@ -1703,12 +1707,12 @@ } }, "node_modules/@expo/local-build-cache-provider": { - "version": "55.0.6", - "resolved": "https://registry.npmmirror.com/@expo/local-build-cache-provider/-/local-build-cache-provider-55.0.6.tgz", - "integrity": "sha512-4kfdv48sKzokijMqi07fINYA9/XprshmPgSLf8i69XgzIv2YdRyBbb70SzrufB7PDneFoltz8N83icW8gOOj1g==", + "version": "55.0.7", + "resolved": "https://registry.npmmirror.com/@expo/local-build-cache-provider/-/local-build-cache-provider-55.0.7.tgz", + "integrity": "sha512-Qg9uNZn1buv4zJUA4ZQaz+ZnKDCipRgjoEg2Gcp8Qfy+2Gq5yZKX4YN1TThCJ01LJk/pvJsCRxXlXZSwdZppgg==", "license": "MIT", "dependencies": { - "@expo/config": "~55.0.8", + "@expo/config": "~55.0.10", "chalk": "^4.1.2" } }, @@ -1751,6 +1755,41 @@ "metro-transform-worker": "0.83.3" } }, + "node_modules/@expo/metro-config": { + "version": "55.0.11", + "resolved": "https://registry.npmmirror.com/@expo/metro-config/-/metro-config-55.0.11.tgz", + "integrity": "sha512-qGxq7RwWpj0zNvZO/e5aizKrOKYYBrVPShSbxPOVB1EXcexxTPTxnOe4pYFg/gKkLIJe0t3jSSF8IDWlGdaaOg==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.20.0", + "@babel/core": "^7.20.0", + "@babel/generator": "^7.20.5", + "@expo/config": "~55.0.10", + "@expo/env": "~2.1.1", + "@expo/json-file": "~10.0.12", + "@expo/metro": "~54.2.0", + "@expo/spawn-async": "^1.7.2", + "browserslist": "^4.25.0", + "chalk": "^4.1.0", + "debug": "^4.3.2", + "getenv": "^2.0.0", + "glob": "^13.0.0", + "hermes-parser": "^0.32.0", + "jsc-safe-url": "^0.2.4", + "lightningcss": "^1.30.1", + "picomatch": "^4.0.3", + "postcss": "~8.4.32", + "resolve-from": "^5.0.0" + }, + "peerDependencies": { + "expo": "*" + }, + "peerDependenciesMeta": { + "expo": { + "optional": true + } + } + }, "node_modules/@expo/metro-runtime": { "version": "55.0.6", "resolved": "https://registry.npmmirror.com/@expo/metro-runtime/-/metro-runtime-55.0.6.tgz", @@ -1801,6 +1840,166 @@ "resolve-workspace-root": "^2.0.0" } }, + "node_modules/@expo/package-manager/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@expo/package-manager/node_modules/cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", + "license": "MIT", + "dependencies": { + "restore-cursor": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@expo/package-manager/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@expo/package-manager/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "license": "MIT" + }, + "node_modules/@expo/package-manager/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@expo/package-manager/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/@expo/package-manager/node_modules/log-symbols": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/log-symbols/-/log-symbols-2.2.0.tgz", + "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", + "license": "MIT", + "dependencies": { + "chalk": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@expo/package-manager/node_modules/log-symbols/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmmirror.com/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@expo/package-manager/node_modules/mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/@expo/package-manager/node_modules/onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", + "license": "MIT", + "dependencies": { + "mimic-fn": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@expo/package-manager/node_modules/ora": { + "version": "3.4.0", + "resolved": "https://registry.npmmirror.com/ora/-/ora-3.4.0.tgz", + "integrity": "sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg==", + "license": "MIT", + "dependencies": { + "chalk": "^2.4.2", + "cli-cursor": "^2.1.0", + "cli-spinners": "^2.0.0", + "log-symbols": "^2.2.0", + "strip-ansi": "^5.2.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@expo/package-manager/node_modules/ora/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmmirror.com/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@expo/package-manager/node_modules/restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", + "license": "MIT", + "dependencies": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@expo/package-manager/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/@expo/plist": { "version": "0.5.2", "resolved": "https://registry.npmmirror.com/@expo/plist/-/plist-0.5.2.tgz", @@ -1812,10 +2011,43 @@ "xmlbuilder": "^15.1.1" } }, + "node_modules/@expo/prebuild-config": { + "version": "55.0.10", + "resolved": "https://registry.npmmirror.com/@expo/prebuild-config/-/prebuild-config-55.0.10.tgz", + "integrity": "sha512-AMylDld5G7YJGfEhEyXtgWRuBB83802QBoewF1vJ6NMDtufukuPhMJzOs9E4UXNsjLTaQcgT4yTWhsAWl7o1AQ==", + "license": "MIT", + "dependencies": { + "@expo/config": "~55.0.10", + "@expo/config-plugins": "~55.0.7", + "@expo/config-types": "^55.0.5", + "@expo/image-utils": "^0.8.12", + "@expo/json-file": "^10.0.12", + "@react-native/normalize-colors": "0.83.2", + "debug": "^4.3.1", + "resolve-from": "^5.0.0", + "semver": "^7.6.0", + "xml2js": "0.6.0" + }, + "peerDependencies": { + "expo": "*" + } + }, + "node_modules/@expo/prebuild-config/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmmirror.com/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@expo/require-utils": { - "version": "55.0.2", - "resolved": "https://registry.npmmirror.com/@expo/require-utils/-/require-utils-55.0.2.tgz", - "integrity": "sha512-dV5oCShQ1umKBKagMMT4B/N+SREsQe3lU4Zgmko5AO0rxKV0tynZT6xXs+e2JxuqT4Rz997atg7pki0BnZb4uw==", + "version": "55.0.3", + "resolved": "https://registry.npmmirror.com/@expo/require-utils/-/require-utils-55.0.3.tgz", + "integrity": "sha512-TS1m5tW45q4zoaTlt6DwmdYHxvFTIxoLrTHKOFrIirHIqIXnHCzpceg8wumiBi+ZXSaGY2gobTbfv+WVhJY6Fw==", "license": "MIT", "dependencies": { "@babel/code-frame": "^7.20.0", @@ -1892,24 +2124,6 @@ "excpretty": "build/cli.js" } }, - "node_modules/@expo/xcpretty/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "license": "Python-2.0" - }, - "node_modules/@expo/xcpretty/node_modules/js-yaml": { - "version": "4.1.1", - "resolved": "https://registry.npmmirror.com/js-yaml/-/js-yaml-4.1.1.tgz", - "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, "node_modules/@hapi/hoek": { "version": "9.3.0", "resolved": "https://registry.npmmirror.com/@hapi/hoek/-/hoek-9.3.0.tgz", @@ -1952,6 +2166,15 @@ "node": ">=8" } }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmmirror.com/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, "node_modules/@istanbuljs/load-nyc-config/node_modules/camelcase": { "version": "5.3.1", "resolved": "https://registry.npmmirror.com/camelcase/-/camelcase-5.3.1.tgz", @@ -1961,6 +2184,71 @@ "node": ">=6" } }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { + "version": "3.14.2", + "resolved": "https://registry.npmmirror.com/js-yaml/-/js-yaml-3.14.2.tgz", + "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/@istanbuljs/schema": { "version": "0.1.3", "resolved": "https://registry.npmmirror.com/@istanbuljs/schema/-/schema-0.1.3.tgz", @@ -2769,98 +3057,17 @@ "yaml": "^2.2.1" } }, - "node_modules/@react-native-community/cli-doctor/node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmmirror.com/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "node_modules/@react-native-community/cli-doctor/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmmirror.com/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", "devOptional": true, - "license": "MIT", - "dependencies": { - "restore-cursor": "^3.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@react-native-community/cli-doctor/node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmmirror.com/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" + "license": "ISC", + "bin": { + "semver": "bin/semver.js" }, "engines": { "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@react-native-community/cli-doctor/node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmmirror.com/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "devOptional": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/@react-native-community/cli-doctor/node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmmirror.com/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@react-native-community/cli-doctor/node_modules/ora": { - "version": "5.4.1", - "resolved": "https://registry.npmmirror.com/ora/-/ora-5.4.1.tgz", - "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "bl": "^4.1.0", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "is-unicode-supported": "^0.1.0", - "log-symbols": "^4.1.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@react-native-community/cli-doctor/node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmmirror.com/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8" } }, "node_modules/@react-native-community/cli-platform-android": { @@ -2921,39 +3128,6 @@ "ws": "^6.2.3" } }, - "node_modules/@react-native-community/cli-server-api/node_modules/is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmmirror.com/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==", - "devOptional": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/@react-native-community/cli-server-api/node_modules/open": { - "version": "6.4.0", - "resolved": "https://registry.npmmirror.com/open/-/open-6.4.0.tgz", - "integrity": "sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "is-wsl": "^1.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@react-native-community/cli-server-api/node_modules/ws": { - "version": "6.2.3", - "resolved": "https://registry.npmmirror.com/ws/-/ws-6.2.3.tgz", - "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "async-limiter": "~1.0.0" - } - }, "node_modules/@react-native-community/cli-tools": { "version": "20.1.2", "resolved": "https://registry.npmmirror.com/@react-native-community/cli-tools/-/cli-tools-20.1.2.tgz", @@ -2973,176 +3147,17 @@ "semver": "^7.5.2" } }, - "node_modules/@react-native-community/cli-tools/node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmmirror.com/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "node_modules/@react-native-community/cli-tools/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmmirror.com/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", "devOptional": true, - "license": "MIT", - "dependencies": { - "restore-cursor": "^3.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@react-native-community/cli-tools/node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmmirror.com/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@react-native-community/cli-tools/node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmmirror.com/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@react-native-community/cli-tools/node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmmirror.com/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@react-native-community/cli-tools/node_modules/mime": { - "version": "2.6.0", - "resolved": "https://registry.npmmirror.com/mime/-/mime-2.6.0.tgz", - "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", - "devOptional": true, - "license": "MIT", + "license": "ISC", "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/@react-native-community/cli-tools/node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmmirror.com/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "devOptional": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/@react-native-community/cli-tools/node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmmirror.com/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@react-native-community/cli-tools/node_modules/ora": { - "version": "5.4.1", - "resolved": "https://registry.npmmirror.com/ora/-/ora-5.4.1.tgz", - "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "bl": "^4.1.0", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "is-unicode-supported": "^0.1.0", - "log-symbols": "^4.1.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" + "semver": "bin/semver.js" }, "engines": { "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@react-native-community/cli-tools/node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmmirror.com/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@react-native-community/cli-tools/node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmmirror.com/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@react-native-community/cli-tools/node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmmirror.com/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8" } }, "node_modules/@react-native-community/cli-types": { @@ -3155,79 +3170,17 @@ "joi": "^17.2.1" } }, - "node_modules/@react-native-community/cli/node_modules/commander": { - "version": "9.5.0", - "resolved": "https://registry.npmmirror.com/commander/-/commander-9.5.0.tgz", - "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", + "node_modules/@react-native-community/cli/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmmirror.com/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", "devOptional": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || >=14" - } - }, - "node_modules/@react-native-community/cli/node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmmirror.com/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" + "license": "ISC", + "bin": { + "semver": "bin/semver.js" }, "engines": { "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@react-native-community/cli/node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmmirror.com/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@react-native-community/cli/node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmmirror.com/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@react-native-community/cli/node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmmirror.com/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/@react-native/assets-registry": { @@ -3311,6 +3264,30 @@ "@babel/core": "*" } }, + "node_modules/@react-native/babel-preset/node_modules/babel-plugin-syntax-hermes-parser": { + "version": "0.32.0", + "resolved": "https://registry.npmmirror.com/babel-plugin-syntax-hermes-parser/-/babel-plugin-syntax-hermes-parser-0.32.0.tgz", + "integrity": "sha512-m5HthL++AbyeEA2FcdwOLfVFvWYECOBObLHNqdR8ceY4TsEdn4LdX2oTvbB2QJSSElE2AWA/b2MXZ/PF/CqLZg==", + "license": "MIT", + "dependencies": { + "hermes-parser": "0.32.0" + } + }, + "node_modules/@react-native/babel-preset/node_modules/hermes-estree": { + "version": "0.32.0", + "resolved": "https://registry.npmmirror.com/hermes-estree/-/hermes-estree-0.32.0.tgz", + "integrity": "sha512-KWn3BqnlDOl97Xe1Yviur6NbgIZ+IP+UVSpshlZWkq+EtoHg6/cwiDj/osP9PCEgFE15KBm1O55JRwbMEm5ejQ==", + "license": "MIT" + }, + "node_modules/@react-native/babel-preset/node_modules/hermes-parser": { + "version": "0.32.0", + "resolved": "https://registry.npmmirror.com/hermes-parser/-/hermes-parser-0.32.0.tgz", + "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==", + "license": "MIT", + "dependencies": { + "hermes-estree": "0.32.0" + } + }, "node_modules/@react-native/codegen": { "version": "0.83.2", "resolved": "https://registry.npmmirror.com/@react-native/codegen/-/codegen-0.83.2.tgz", @@ -3369,6 +3346,21 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/@react-native/codegen/node_modules/hermes-estree": { + "version": "0.32.0", + "resolved": "https://registry.npmmirror.com/hermes-estree/-/hermes-estree-0.32.0.tgz", + "integrity": "sha512-KWn3BqnlDOl97Xe1Yviur6NbgIZ+IP+UVSpshlZWkq+EtoHg6/cwiDj/osP9PCEgFE15KBm1O55JRwbMEm5ejQ==", + "license": "MIT" + }, + "node_modules/@react-native/codegen/node_modules/hermes-parser": { + "version": "0.32.0", + "resolved": "https://registry.npmmirror.com/hermes-parser/-/hermes-parser-0.32.0.tgz", + "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==", + "license": "MIT", + "dependencies": { + "hermes-estree": "0.32.0" + } + }, "node_modules/@react-native/codegen/node_modules/minimatch": { "version": "3.1.5", "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.5.tgz", @@ -3411,6 +3403,18 @@ } } }, + "node_modules/@react-native/community-cli-plugin/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmmirror.com/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@react-native/debugger-frontend": { "version": "0.83.2", "resolved": "https://registry.npmmirror.com/@react-native/debugger-frontend/-/debugger-frontend-0.83.2.tgz", @@ -3456,6 +3460,55 @@ "node": ">= 20.19.4" } }, + "node_modules/@react-native/dev-middleware/node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@react-native/dev-middleware/node_modules/open": { + "version": "7.4.2", + "resolved": "https://registry.npmmirror.com/open/-/open-7.4.2.tgz", + "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@react-native/dev-middleware/node_modules/ws": { + "version": "7.5.10", + "resolved": "https://registry.npmmirror.com/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "license": "MIT", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/@react-native/gradle-plugin": { "version": "0.83.2", "resolved": "https://registry.npmmirror.com/@react-native/gradle-plugin/-/gradle-plugin-0.83.2.tgz", @@ -3481,17 +3534,17 @@ "license": "MIT" }, "node_modules/@react-navigation/bottom-tabs": { - "version": "7.15.2", - "resolved": "https://registry.npmmirror.com/@react-navigation/bottom-tabs/-/bottom-tabs-7.15.2.tgz", - "integrity": "sha512-xaSumZWE97P3j33guO7bh5dJ5IqR1bWiT+i17SUjsXxoI9xnNXWDm4dkTjzGuuT0BHcUVkzei0tjjCQmNg9cIQ==", + "version": "7.15.6", + "resolved": "https://registry.npmmirror.com/@react-navigation/bottom-tabs/-/bottom-tabs-7.15.6.tgz", + "integrity": "sha512-olB+s0ApMzWN9t5Bk5Mj6ntSlVRz3B8v+1LtwGS/29lyC311G5es0kgxyzpGKE9gy6Ef8W526QH5cIka2jh0kQ==", "license": "MIT", "dependencies": { - "@react-navigation/elements": "^2.9.8", + "@react-navigation/elements": "^2.9.11", "color": "^4.2.3", "sf-symbols-typescript": "^2.1.0" }, "peerDependencies": { - "@react-navigation/native": "^7.1.31", + "@react-navigation/native": "^7.1.34", "react": ">= 18.2.0", "react-native": "*", "react-native-safe-area-context": ">= 4.0.0", @@ -3499,9 +3552,9 @@ } }, "node_modules/@react-navigation/core": { - "version": "7.15.1", - "resolved": "https://registry.npmmirror.com/@react-navigation/core/-/core-7.15.1.tgz", - "integrity": "sha512-Fqr6qxfZJIC4ewho7LtTa9zz6hcOzohX7D1lcDfrkGaYkS5xBwEZViGNxCJK/czUc74ua8NThyrObQFjB6Q/RQ==", + "version": "7.16.2", + "resolved": "https://registry.npmmirror.com/@react-navigation/core/-/core-7.16.2.tgz", + "integrity": "sha512-0dbCC2aTjNW7MvG1fY7zeq6eYvmmaFCEnBDXPuMPJ8uKgfs9lFGXIQFIfBdmcBVX6vHhS+K213VCsuHSIv5jYw==", "license": "MIT", "dependencies": { "@react-navigation/routers": "^7.5.3", @@ -3517,16 +3570,10 @@ "react": ">= 18.2.0" } }, - "node_modules/@react-navigation/core/node_modules/react-is": { - "version": "19.2.4", - "resolved": "https://registry.npmmirror.com/react-is/-/react-is-19.2.4.tgz", - "integrity": "sha512-W+EWGn2v0ApPKgKKCy/7s7WHXkboGcsrXE+2joLyVxkbyVQfO3MUEaUQDHoSmb8TFFrSKYa9mw64WZHNHSDzYA==", - "license": "MIT" - }, "node_modules/@react-navigation/elements": { - "version": "2.9.8", - "resolved": "https://registry.npmmirror.com/@react-navigation/elements/-/elements-2.9.8.tgz", - "integrity": "sha512-3gpwUmVnDJYvK9nFmAA/YXw0hmT/C/lZx8RkRMK+ux9l1T+32EWnQFnn34Wa1BMDX8HN2r64yrlW93DIzKI7Uw==", + "version": "2.9.11", + "resolved": "https://registry.npmmirror.com/@react-navigation/elements/-/elements-2.9.11.tgz", + "integrity": "sha512-O5KiwaVCcEVuqZgQ77xiBFSl1sha77rNMTFlLWYnom33ZHPDarV3bM9WNyVnMZxU8ZVTi02X3+ZhO0fSn5QYyg==", "license": "MIT", "dependencies": { "color": "^4.2.3", @@ -3535,7 +3582,7 @@ }, "peerDependencies": { "@react-native-masked-view/masked-view": ">= 0.2.0", - "@react-navigation/native": "^7.1.31", + "@react-navigation/native": "^7.1.34", "react": ">= 18.2.0", "react-native": "*", "react-native-safe-area-context": ">= 4.0.0" @@ -3547,17 +3594,17 @@ } }, "node_modules/@react-navigation/material-top-tabs": { - "version": "7.4.16", - "resolved": "https://registry.npmmirror.com/@react-navigation/material-top-tabs/-/material-top-tabs-7.4.16.tgz", - "integrity": "sha512-Wy/NP17O948/4uUvzpPs5FkvhOCvojBJ320FxW5kUiUbaxde11LUJf9yhDJhScQ7pjHeT0NsMSc1uhbF8O1oFg==", + "version": "7.4.20", + "resolved": "https://registry.npmmirror.com/@react-navigation/material-top-tabs/-/material-top-tabs-7.4.20.tgz", + "integrity": "sha512-a4QToiT0gIfqjG8J/OaCSuEovFUfMyOo4VOMt2haHsymnM9cMXR7UQL4j7MsUOhaPo1wGsJ9QazeA4TcVJWRFA==", "license": "MIT", "dependencies": { - "@react-navigation/elements": "^2.9.8", + "@react-navigation/elements": "^2.9.11", "color": "^4.2.3", - "react-native-tab-view": "^4.2.2" + "react-native-tab-view": "^4.3.0" }, "peerDependencies": { - "@react-navigation/native": "^7.1.31", + "@react-navigation/native": "^7.1.34", "react": ">= 18.2.0", "react-native": "*", "react-native-pager-view": ">= 6.0.0", @@ -3565,12 +3612,12 @@ } }, "node_modules/@react-navigation/native": { - "version": "7.1.31", - "resolved": "https://registry.npmmirror.com/@react-navigation/native/-/native-7.1.31.tgz", - "integrity": "sha512-+YCUwtfDgsux59Q0LDHc3Zid9ih93ecUCFWZOH6/+eNoUGnWx77wjS6ZfvBO/7E+EiIup11IVShDzCHR4of8hw==", + "version": "7.1.34", + "resolved": "https://registry.npmmirror.com/@react-navigation/native/-/native-7.1.34.tgz", + "integrity": "sha512-zzQ0mKAhLsjTIsaoLfILKZVMObJzE0F+bOi0hl2Glt+1Rd2GtaWJ1Z024c3yLmX+Oc79pqoCQLBXpyxtrZu9NQ==", "license": "MIT", "dependencies": { - "@react-navigation/core": "^7.15.1", + "@react-navigation/core": "^7.16.2", "escape-string-regexp": "^4.0.0", "fast-deep-equal": "^3.1.3", "nanoid": "^3.3.11", @@ -3582,18 +3629,18 @@ } }, "node_modules/@react-navigation/native-stack": { - "version": "7.14.2", - "resolved": "https://registry.npmmirror.com/@react-navigation/native-stack/-/native-stack-7.14.2.tgz", - "integrity": "sha512-/nKxFAFSUSGV+NSXrXXcWEcGAHdyp8RyWjoGMDzVPdBhjCLblVSgHWx5y4mm+k0de9V1pkjsftUaroP7rQckzw==", + "version": "7.14.6", + "resolved": "https://registry.npmmirror.com/@react-navigation/native-stack/-/native-stack-7.14.6.tgz", + "integrity": "sha512-VRlC5mLanRPHK0E15Cild6U01Z5TDPBlmt5YcXRBc+hQTAMbMT9XcSTobf3sJXNY0zzDD1IpSs3Ynex/GU225g==", "license": "MIT", "dependencies": { - "@react-navigation/elements": "^2.9.8", + "@react-navigation/elements": "^2.9.11", "color": "^4.2.3", "sf-symbols-typescript": "^2.1.0", "warn-once": "^0.1.1" }, "peerDependencies": { - "@react-navigation/native": "^7.1.31", + "@react-navigation/native": "^7.1.34", "react": ">= 18.2.0", "react-native": "*", "react-native-safe-area-context": ">= 4.0.0", @@ -3672,9 +3719,9 @@ } }, "node_modules/@tanstack/query-core": { - "version": "5.90.20", - "resolved": "https://registry.npmmirror.com/@tanstack/query-core/-/query-core-5.90.20.tgz", - "integrity": "sha512-OMD2HLpNouXEfZJWcKeVKUgQ5n+n3A2JFmBaScpNDUqSrQSjiveC7dKMe53uJUg1nDG16ttFPz2xfilz6i2uVg==", + "version": "5.91.2", + "resolved": "https://registry.npmmirror.com/@tanstack/query-core/-/query-core-5.91.2.tgz", + "integrity": "sha512-Uz2pTgPC1mhqrrSGg18RKCWT/pkduAYtxbcyIyKBhw7dTWjXZIzqmpzO2lBkyWr4hlImQgpu1m1pei3UnkFRWw==", "license": "MIT", "funding": { "type": "github", @@ -3682,12 +3729,12 @@ } }, "node_modules/@tanstack/react-query": { - "version": "5.90.21", - "resolved": "https://registry.npmmirror.com/@tanstack/react-query/-/react-query-5.90.21.tgz", - "integrity": "sha512-0Lu6y5t+tvlTJMTO7oh5NSpJfpg/5D41LlThfepTixPYkJ0sE2Jj0m0f6yYqujBwIXlId87e234+MxG3D3g7kg==", + "version": "5.91.2", + "resolved": "https://registry.npmmirror.com/@tanstack/react-query/-/react-query-5.91.2.tgz", + "integrity": "sha512-GClLPzbM57iFXv+FlvOUL56XVe00PxuTaVEyj1zAObhRiKF008J5vedmaq7O6ehs+VmPHe8+PUQhMuEyv8d9wQ==", "license": "MIT", "dependencies": { - "@tanstack/query-core": "5.90.20" + "@tanstack/query-core": "5.91.2" }, "funding": { "type": "github", @@ -3738,6 +3785,12 @@ "@babel/types": "^7.28.2" } }, + "node_modules/@types/emscripten": { + "version": "1.41.5", + "resolved": "https://registry.npmmirror.com/@types/emscripten/-/emscripten-1.41.5.tgz", + "integrity": "sha512-cMQm7pxu6BxtHyqJ7mQZ2kXWV5SLmugybFdHCBbJ5eHzOo6VhBckEgAT3//rP5FwPHNPeEiq4SmQ5ucBwsOo4Q==", + "license": "MIT" + }, "node_modules/@types/graceful-fs": { "version": "4.1.9", "resolved": "https://registry.npmmirror.com/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", @@ -3778,9 +3831,9 @@ } }, "node_modules/@types/node": { - "version": "25.3.2", - "resolved": "https://registry.npmmirror.com/@types/node/-/node-25.3.2.tgz", - "integrity": "sha512-RpV6r/ij22zRRdyBPcxDeKAzH43phWVKEjL2iksqo1Vz3CuBUrgmPpPhALKiRfU7OMCmeeO9vECBMsV0hMTG8Q==", + "version": "25.5.0", + "resolved": "https://registry.npmmirror.com/@types/node/-/node-25.5.0.tgz", + "integrity": "sha512-jp2P3tQMSxWugkCUKLRPVUpGaL5MVFwF8RDuSRztfwgN1wmqJeMSbKlnEtQqU8UrhTmzEmZdu2I6v2dpp7XIxw==", "license": "MIT", "dependencies": { "undici-types": "~7.18.0" @@ -3885,6 +3938,15 @@ "node": ">= 0.6" } }, + "node_modules/accepts/node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmmirror.com/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/acorn": { "version": "8.16.0", "resolved": "https://registry.npmmirror.com/acorn/-/acorn-8.16.0.tgz", @@ -3951,29 +4013,6 @@ "strip-ansi": "^5.0.0" } }, - "node_modules/ansi-fragments/node_modules/ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "devOptional": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/ansi-fragments/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -4011,6 +4050,18 @@ "node": ">= 8" } }, + "node_modules/anymatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/appdirsjs": { "version": "1.2.7", "resolved": "https://registry.npmmirror.com/appdirsjs/-/appdirsjs-1.2.7.tgz", @@ -4025,13 +4076,10 @@ "license": "MIT" }, "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmmirror.com/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "license": "MIT", - "dependencies": { - "sprintf-js": "~1.0.2" - } + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" }, "node_modules/aria-hidden": { "version": "1.2.6", @@ -4144,28 +4192,19 @@ } }, "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.4.15", - "resolved": "https://registry.npmmirror.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.15.tgz", - "integrity": "sha512-hR3GwrRwHUfYwGfrisXPIDP3JcYfBrW7wKE7+Au6wDYl7fm/ka1NEII6kORzxNU556JjfidZeBsO10kYvtV1aw==", + "version": "0.4.17", + "resolved": "https://registry.npmmirror.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.17.tgz", + "integrity": "sha512-aTyf30K/rqAsNwN76zYrdtx8obu0E4KoUME29B1xj+B3WxgvWkp943vYQ+z8Mv3lw9xHXMHpvSPOBxzAkIa94w==", "license": "MIT", "dependencies": { "@babel/compat-data": "^7.28.6", - "@babel/helper-define-polyfill-provider": "^0.6.6", + "@babel/helper-define-polyfill-provider": "^0.6.8", "semver": "^6.3.1" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/babel-plugin-polyfill-corejs3": { "version": "0.13.0", "resolved": "https://registry.npmmirror.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.13.0.tgz", @@ -4180,12 +4219,12 @@ } }, "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.6.6", - "resolved": "https://registry.npmmirror.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.6.tgz", - "integrity": "sha512-hYm+XLYRMvupxiQzrvXUj7YyvFFVfv5gI0R71AJzudg1g2AI2vyCPPIFEBjk162/wFzti3inBHo7isWFuEVS/A==", + "version": "0.6.8", + "resolved": "https://registry.npmmirror.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.8.tgz", + "integrity": "sha512-M762rNHfSF1EV3SLtnCJXFoQbbIIz0OyRwnCmV0KPC7qosSfCO0QLTSuJX3ayAebubhE6oYBAYPrBA5ljowaZg==", "license": "MIT", "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.6.6" + "@babel/helper-define-polyfill-provider": "^0.6.8" }, "peerDependencies": { "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" @@ -4207,12 +4246,12 @@ "license": "MIT" }, "node_modules/babel-plugin-syntax-hermes-parser": { - "version": "0.32.0", - "resolved": "https://registry.npmmirror.com/babel-plugin-syntax-hermes-parser/-/babel-plugin-syntax-hermes-parser-0.32.0.tgz", - "integrity": "sha512-m5HthL++AbyeEA2FcdwOLfVFvWYECOBObLHNqdR8ceY4TsEdn4LdX2oTvbB2QJSSElE2AWA/b2MXZ/PF/CqLZg==", + "version": "0.32.1", + "resolved": "https://registry.npmmirror.com/babel-plugin-syntax-hermes-parser/-/babel-plugin-syntax-hermes-parser-0.32.1.tgz", + "integrity": "sha512-HgErPZTghW76Rkq9uqn5ESeiD97FbqpZ1V170T1RG2RDp+7pJVQV2pQJs7y5YzN0/gcT6GM5ci9apRnIwuyPdQ==", "license": "MIT", "dependencies": { - "hermes-parser": "0.32.0" + "hermes-parser": "0.32.1" } }, "node_modules/babel-plugin-transform-flow-enums": { @@ -4250,6 +4289,54 @@ "@babel/core": "^7.0.0 || ^8.0.0-0" } }, + "node_modules/babel-preset-expo": { + "version": "55.0.12", + "resolved": "https://registry.npmmirror.com/babel-preset-expo/-/babel-preset-expo-55.0.12.tgz", + "integrity": "sha512-oR46ExGZpRijmPUsr0rFH5X4lR/mvwqJAFXJRLpynZcvyv2pHPTeGMNfd/p5oPMbdbaeMS6G+3k18p48u2Qjbw==", + "license": "MIT", + "dependencies": { + "@babel/generator": "^7.20.5", + "@babel/helper-module-imports": "^7.25.9", + "@babel/plugin-proposal-decorators": "^7.12.9", + "@babel/plugin-proposal-export-default-from": "^7.24.7", + "@babel/plugin-syntax-export-default-from": "^7.24.7", + "@babel/plugin-transform-class-static-block": "^7.27.1", + "@babel/plugin-transform-export-namespace-from": "^7.25.9", + "@babel/plugin-transform-flow-strip-types": "^7.25.2", + "@babel/plugin-transform-modules-commonjs": "^7.24.8", + "@babel/plugin-transform-object-rest-spread": "^7.24.7", + "@babel/plugin-transform-parameters": "^7.24.7", + "@babel/plugin-transform-private-methods": "^7.24.7", + "@babel/plugin-transform-private-property-in-object": "^7.24.7", + "@babel/plugin-transform-runtime": "^7.24.7", + "@babel/preset-react": "^7.22.15", + "@babel/preset-typescript": "^7.23.0", + "@react-native/babel-preset": "0.83.2", + "babel-plugin-react-compiler": "^1.0.0", + "babel-plugin-react-native-web": "~0.21.0", + "babel-plugin-syntax-hermes-parser": "^0.32.0", + "babel-plugin-transform-flow-enums": "^0.0.2", + "debug": "^4.3.4", + "resolve-from": "^5.0.0" + }, + "peerDependencies": { + "@babel/runtime": "^7.20.0", + "expo": "*", + "expo-widgets": "^55.0.6", + "react-refresh": ">=0.14.0 <1.0.0" + }, + "peerDependenciesMeta": { + "@babel/runtime": { + "optional": true + }, + "expo": { + "optional": true + }, + "expo-widgets": { + "optional": true + } + } + }, "node_modules/babel-preset-jest": { "version": "29.6.3", "resolved": "https://registry.npmmirror.com/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", @@ -4281,6 +4368,15 @@ "node": "18 || 20 || >=22" } }, + "node_modules/barcode-detector": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/barcode-detector/-/barcode-detector-3.1.1.tgz", + "integrity": "sha512-ghWlEAV93ZCUniO7Co3ih/01XPm+U30CV+NoPbO6Chj5lZzHydDAqKlrBEd+37TkoR+QTH3tnnwd8k8epGTfIg==", + "license": "MIT", + "dependencies": { + "zxing-wasm": "3.0.1" + } + }, "node_modules/base64-js": { "version": "1.5.1", "resolved": "https://registry.npmmirror.com/base64-js/-/base64-js-1.5.1.tgz", @@ -4302,9 +4398,9 @@ "license": "MIT" }, "node_modules/baseline-browser-mapping": { - "version": "2.10.0", - "resolved": "https://registry.npmmirror.com/baseline-browser-mapping/-/baseline-browser-mapping-2.10.0.tgz", - "integrity": "sha512-lIyg0szRfYbiy67j9KN8IyeD7q7hcmqnJ1ddWmNt19ItGpNN64mnllmxUNFIOdOm6by97jlL6wfpTTJrmnjWAA==", + "version": "2.10.9", + "resolved": "https://registry.npmmirror.com/baseline-browser-mapping/-/baseline-browser-mapping-2.10.9.tgz", + "integrity": "sha512-OZd0e2mU11ClX8+IdXe3r0dbqMEznRiT4TfbhYIbcRPZkqJ7Qwer8ij3GZAmLsRKa+II9V1v5czCkvmHH3XZBg==", "license": "Apache-2.0", "bin": { "baseline-browser-mapping": "dist/cli.cjs" @@ -4325,6 +4421,18 @@ "node": ">=12.0.0" } }, + "node_modules/better-opn/node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/better-opn/node_modules/open": { "version": "8.4.2", "resolved": "https://registry.npmmirror.com/open/-/open-8.4.2.tgz", @@ -4388,19 +4496,6 @@ "url": "https://opencollective.com/express" } }, - "node_modules/body-parser/node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmmirror.com/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/bplist-creator": { "version": "0.1.0", "resolved": "https://registry.npmmirror.com/bplist-creator/-/bplist-creator-0.1.0.tgz", @@ -4581,9 +4676,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001774", - "resolved": "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001774.tgz", - "integrity": "sha512-DDdwPGz99nmIEv216hKSgLD+D4ikHQHjBC/seF98N9CPqRX4M5mSxT9eTV6oyisnJcuzxtZy4n17yKKQYmYQOA==", + "version": "1.0.30001780", + "resolved": "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001780.tgz", + "integrity": "sha512-llngX0E7nQci5BPJDqoZSbuZ5Bcs9F5db7EtgfwBerX9XGtkkiO4NwfDDIRzHTTwcYC8vC7bmeUEPGrKlR/TkQ==", "funding": [ { "type": "opencollective", @@ -4634,6 +4729,18 @@ "node": ">=12.13.0" } }, + "node_modules/chrome-launcher/node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/chromium-edge-launcher": { "version": "0.2.0", "resolved": "https://registry.npmmirror.com/chromium-edge-launcher/-/chromium-edge-launcher-0.2.0.tgz", @@ -4648,6 +4755,18 @@ "rimraf": "^3.0.2" } }, + "node_modules/chromium-edge-launcher/node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/ci-info": { "version": "2.0.0", "resolved": "https://registry.npmmirror.com/ci-info/-/ci-info-2.0.0.tgz", @@ -4655,15 +4774,16 @@ "license": "MIT" }, "node_modules/cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmmirror.com/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "devOptional": true, "license": "MIT", "dependencies": { - "restore-cursor": "^2.0.0" + "restore-cursor": "^3.1.0" }, "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/cli-spinners": { @@ -4698,6 +4818,18 @@ "node": ">=12" } }, + "node_modules/cliui/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/clone": { "version": "1.0.4", "resolved": "https://registry.npmmirror.com/clone/-/clone-1.0.4.tgz", @@ -4775,12 +4907,13 @@ "license": "MIT" }, "node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmmirror.com/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "version": "9.5.0", + "resolved": "https://registry.npmmirror.com/commander/-/commander-9.5.0.tgz", + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", + "devOptional": true, "license": "MIT", "engines": { - "node": ">= 10" + "node": "^12.20.0 || >=14" } }, "node_modules/compressible": { @@ -4828,15 +4961,6 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "license": "MIT" }, - "node_modules/compression/node_modules/negotiator": { - "version": "0.6.4", - "resolved": "https://registry.npmmirror.com/negotiator/-/negotiator-0.6.4.tgz", - "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmmirror.com/concat-map/-/concat-map-0.0.1.tgz", @@ -4890,9 +5014,9 @@ "license": "MIT" }, "node_modules/core-js-compat": { - "version": "3.48.0", - "resolved": "https://registry.npmmirror.com/core-js-compat/-/core-js-compat-3.48.0.tgz", - "integrity": "sha512-OM4cAF3D6VtH/WkLtWvyNC56EZVXsZdU3iqaMG2B4WvYrlqU831pc4UtG5yp0sE9z8Y02wVN7PjW5Zf9Gt0f1Q==", + "version": "3.49.0", + "resolved": "https://registry.npmmirror.com/core-js-compat/-/core-js-compat-3.49.0.tgz", + "integrity": "sha512-VQXt1jr9cBz03b331DFDCCP90b3fanciLkgiOoy8SBHy06gNf+vQ1A3WFLqG7I8TipYIKeYK9wxd0tUrvHcOZA==", "license": "MIT", "dependencies": { "browserslist": "^4.28.1" @@ -4929,26 +5053,6 @@ } } }, - "node_modules/cosmiconfig/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "devOptional": true, - "license": "Python-2.0" - }, - "node_modules/cosmiconfig/node_modules/js-yaml": { - "version": "4.1.1", - "resolved": "https://registry.npmmirror.com/js-yaml/-/js-yaml-4.1.1.tgz", - "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, "node_modules/cross-fetch": { "version": "3.2.0", "resolved": "https://registry.npmmirror.com/cross-fetch/-/cross-fetch-3.2.0.tgz", @@ -4999,9 +5103,9 @@ } }, "node_modules/dayjs": { - "version": "1.11.19", - "resolved": "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.19.tgz", - "integrity": "sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw==", + "version": "1.11.20", + "resolved": "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.20.tgz", + "integrity": "sha512-YbwwqR/uYpeoP4pu043q+LTDLFBLApUP6VxRihdfNTqu4ubqMlGDLd6ErXhEgsyvY0K6nCs7nggYumAN+9uEuQ==", "devOptional": true, "license": "MIT" }, @@ -5141,9 +5245,9 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.302", - "resolved": "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.5.302.tgz", - "integrity": "sha512-sM6HAN2LyK82IyPBpznDRqlTQAtuSaO+ShzFiWTvoMJLHyZ+Y39r8VMfHzwbU8MVBzQ4Wdn85+wlZl2TLGIlwg==", + "version": "1.5.321", + "resolved": "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.5.321.tgz", + "integrity": "sha512-L2C7Q279W2D/J4PLZLk7sebOILDSWos7bMsMNN06rK482umHUrh/3lM8G7IlHFOYip2oAg5nha1rCMxr/rs6ZQ==", "license": "ISC" }, "node_modules/emoji-regex": { @@ -5194,13 +5298,6 @@ "is-arrayish": "^0.2.1" } }, - "node_modules/error-ex/node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmmirror.com/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "devOptional": true, - "license": "MIT" - }, "node_modules/error-stack-parser": { "version": "2.1.4", "resolved": "https://registry.npmmirror.com/error-stack-parser/-/error-stack-parser-2.1.4.tgz", @@ -5355,58 +5452,32 @@ "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/execa/node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmmirror.com/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "devOptional": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/execa/node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmmirror.com/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/expo": { - "version": "55.0.4", - "resolved": "https://registry.npmmirror.com/expo/-/expo-55.0.4.tgz", - "integrity": "sha512-cbQBPYwmH6FRvh942KR8mSdEcrVdsIMkjdHthtf59zlpzgrk28FabhOdL/Pc9WuS+CsIP3EIQbZqmLkTjv6qPg==", + "version": "55.0.8", + "resolved": "https://registry.npmmirror.com/expo/-/expo-55.0.8.tgz", + "integrity": "sha512-sziDGiDmeRmaSpFwMuSxFhr4vfWrQS1UgVXSTovsUDY0ximABzYdnF5L2OwtD8zjtIww8x2oJGmD6mKS+AoVsw==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.20.0", - "@expo/cli": "55.0.14", - "@expo/config": "~55.0.8", - "@expo/config-plugins": "~55.0.6", + "@expo/cli": "55.0.18", + "@expo/config": "~55.0.10", + "@expo/config-plugins": "~55.0.7", "@expo/devtools": "55.0.2", - "@expo/fingerprint": "0.16.5", - "@expo/local-build-cache-provider": "55.0.6", + "@expo/fingerprint": "0.16.6", + "@expo/local-build-cache-provider": "55.0.7", "@expo/log-box": "55.0.7", "@expo/metro": "~54.2.0", - "@expo/metro-config": "55.0.9", + "@expo/metro-config": "55.0.11", "@expo/vector-icons": "^15.0.2", "@ungap/structured-clone": "^1.3.0", - "babel-preset-expo": "~55.0.10", - "expo-asset": "~55.0.8", - "expo-constants": "~55.0.7", - "expo-file-system": "~55.0.10", + "babel-preset-expo": "~55.0.12", + "expo-asset": "~55.0.10", + "expo-constants": "~55.0.9", + "expo-file-system": "~55.0.11", "expo-font": "~55.0.4", "expo-keep-awake": "~55.0.4", - "expo-modules-autolinking": "55.0.8", - "expo-modules-core": "55.0.13", + "expo-modules-autolinking": "55.0.11", + "expo-modules-core": "55.0.17", "pretty-format": "^29.7.0", "react-refresh": "^0.14.2", "whatwg-url-minimum": "^0.1.1" @@ -5436,33 +5507,68 @@ } }, "node_modules/expo-application": { - "version": "55.0.8", - "resolved": "https://registry.npmmirror.com/expo-application/-/expo-application-55.0.8.tgz", - "integrity": "sha512-PeZk4Zj8LlzRcRtK3J4ouSPBoi9lroYsRbbz/0HEvx+uB6HIaM1qfzgpcctvjkdJJfnidBQNyieW5BVO/qUQ6w==", + "version": "55.0.10", + "resolved": "https://registry.npmmirror.com/expo-application/-/expo-application-55.0.10.tgz", + "integrity": "sha512-5ccf+S6hsQz+doi907TOJxKzV5AKgAgw004z4FoDWSoGhfab0LUPg6uyvOspuU4cbNvqw8EAy08hZbVO8nKc9Q==", "license": "MIT", "peerDependencies": { "expo": "*" } }, - "node_modules/expo-background-fetch": { - "version": "55.0.9", - "resolved": "https://registry.npmmirror.com/expo-background-fetch/-/expo-background-fetch-55.0.9.tgz", - "integrity": "sha512-SIXlLyUsEgqZZ9RZBUAHMGudMYUco2LWbWJkC79PzkedSTRuhQUergFhVR+n+OFe/YYfw2l9Rk2KSwtN+1WcYA==", + "node_modules/expo-asset": { + "version": "55.0.10", + "resolved": "https://registry.npmmirror.com/expo-asset/-/expo-asset-55.0.10.tgz", + "integrity": "sha512-wxjNBKIaDyachq7oJgVlWVFzZ6SnNpJFJhkkcymXoTPt5O3XmDM+a6fT91xQQawCXTyZuCc1sNxKMetEofeYkg==", "license": "MIT", "dependencies": { - "expo-task-manager": "~55.0.9" + "@expo/image-utils": "^0.8.12", + "expo-constants": "~55.0.9" + }, + "peerDependencies": { + "expo": "*", + "react": "*", + "react-native": "*" + } + }, + "node_modules/expo-background-fetch": { + "version": "55.0.10", + "resolved": "https://registry.npmmirror.com/expo-background-fetch/-/expo-background-fetch-55.0.10.tgz", + "integrity": "sha512-JRSlQ2GEigUxKqHi11xLPz5/T02O7YzsV1xNKDOxr2SXSERmAN9WFD9l2F9SDw5tUz53ewI1kndHQ6FmSu+7Tw==", + "license": "MIT", + "dependencies": { + "expo-task-manager": "~55.0.10" }, "peerDependencies": { "expo": "*" } }, - "node_modules/expo-constants": { - "version": "55.0.7", - "resolved": "https://registry.npmmirror.com/expo-constants/-/expo-constants-55.0.7.tgz", - "integrity": "sha512-kdcO4TsQRRqt0USvjaY5vgQMO9H52K3kBZ/ejC7F6rz70mv08GoowrZ1CYOr5O4JpPDRlIpQfZJUucaS/c+KWQ==", + "node_modules/expo-camera": { + "version": "55.0.10", + "resolved": "https://registry.npmmirror.com/expo-camera/-/expo-camera-55.0.10.tgz", + "integrity": "sha512-ftDNJbGsAPNJ/QrM3j6g8/rQAOqTwZpqtvmzF7V9VX0movaCznZFdYsLi/Fff9WeEk1KzcnLIlmSz4Tj+BCrJA==", "license": "MIT", "dependencies": { - "@expo/config": "~55.0.8", + "barcode-detector": "^3.0.0" + }, + "peerDependencies": { + "expo": "*", + "react": "*", + "react-native": "*", + "react-native-web": "*" + }, + "peerDependenciesMeta": { + "react-native-web": { + "optional": true + } + } + }, + "node_modules/expo-constants": { + "version": "55.0.9", + "resolved": "https://registry.npmmirror.com/expo-constants/-/expo-constants-55.0.9.tgz", + "integrity": "sha512-iBiXjZeuU5S/8docQeNzsVvtDy4w0zlmXBpFEi1ypwugceEpdQQab65TVRbusXAcwpNVxCPMpNlDssYp0Pli2g==", + "license": "MIT", + "dependencies": { + "@expo/config": "~55.0.10", "@expo/env": "~2.1.1" }, "peerDependencies": { @@ -5471,15 +5577,15 @@ } }, "node_modules/expo-dev-client": { - "version": "55.0.10", - "resolved": "https://registry.npmmirror.com/expo-dev-client/-/expo-dev-client-55.0.10.tgz", - "integrity": "sha512-qclT+uDp5VjdHDrXkMus0d8ZpNq41CzOXWJq4UmlfsuFeY4b7v/vAI0OJTtScx/FSTkSkggRzjqm+EwnmIFRCg==", + "version": "55.0.18", + "resolved": "https://registry.npmmirror.com/expo-dev-client/-/expo-dev-client-55.0.18.tgz", + "integrity": "sha512-zQeCGk+doTMIKwPe9lNlGcUiBlMpJQNyrrsYc5eRdxuMwBrDVAU7zshARmamSw8zlAIHCsThJH2zeJg/lgQrKA==", "license": "MIT", "dependencies": { - "expo-dev-launcher": "55.0.11", - "expo-dev-menu": "55.0.10", + "expo-dev-launcher": "55.0.19", + "expo-dev-menu": "55.0.16", "expo-dev-menu-interface": "55.0.1", - "expo-manifests": "~55.0.9", + "expo-manifests": "~55.0.11", "expo-updates-interface": "~55.1.3" }, "peerDependencies": { @@ -5487,23 +5593,23 @@ } }, "node_modules/expo-dev-launcher": { - "version": "55.0.11", - "resolved": "https://registry.npmmirror.com/expo-dev-launcher/-/expo-dev-launcher-55.0.11.tgz", - "integrity": "sha512-u/8iVwD4VU2N5R5Tr32+yqT7Llm8K7VyfYB76Fe5apK97Ocpf2PR4Oqf8RbKc9DmqcbHEWfNriMGEW8U6FsaKA==", + "version": "55.0.19", + "resolved": "https://registry.npmmirror.com/expo-dev-launcher/-/expo-dev-launcher-55.0.19.tgz", + "integrity": "sha512-RtiC/K7Cg7RafNlq32GtilMEO5cy61HPBKASQHwLK6Gz5+FYepx0KSHIXIhWqekZMfpcj1w80tvEjMNFjUJ9Dg==", "license": "MIT", "dependencies": { "@expo/schema-utils": "^55.0.2", - "expo-dev-menu": "55.0.10", - "expo-manifests": "~55.0.9" + "expo-dev-menu": "55.0.16", + "expo-manifests": "~55.0.11" }, "peerDependencies": { "expo": "*" } }, "node_modules/expo-dev-menu": { - "version": "55.0.10", - "resolved": "https://registry.npmmirror.com/expo-dev-menu/-/expo-dev-menu-55.0.10.tgz", - "integrity": "sha512-gad31DFkRmEC6pj6sZLIv3HY14PR3X6SUwUTtilArF5eQK/Nr3dWhYFL/QHlrBkwTEDYeKKgcw3V6sZDfE6hcg==", + "version": "55.0.16", + "resolved": "https://registry.npmmirror.com/expo-dev-menu/-/expo-dev-menu-55.0.16.tgz", + "integrity": "sha512-UhduIh/6wQmFLIy1EeQJBCN09irOrC1kf/UMQ9CxXCkXit9SOtJx+26YfCmbrIRV/lYK2qZK8Y178/HNkt7yeA==", "license": "MIT", "dependencies": { "expo-dev-menu-interface": "55.0.1" @@ -5528,9 +5634,9 @@ "license": "MIT" }, "node_modules/expo-file-system": { - "version": "55.0.10", - "resolved": "https://registry.npmmirror.com/expo-file-system/-/expo-file-system-55.0.10.tgz", - "integrity": "sha512-ysFdVdUgtfj2ApY0Cn+pBg+yK4xp+SNwcaH8j2B91JJQ4OXJmnyCSmrNZYz7J4mdYVuv2GzxIP+N/IGlHQG3Yw==", + "version": "55.0.11", + "resolved": "https://registry.npmmirror.com/expo-file-system/-/expo-file-system-55.0.11.tgz", + "integrity": "sha512-KMUd6OY375J9WD79ZvjvCDZMveT7YfgiGWdi58/gfuTBsr14TRuoPk8RRQHAtc4UquzWViKcHwna9aPY7/XPpw==", "license": "MIT", "peerDependencies": { "expo": "*", @@ -5552,9 +5658,9 @@ } }, "node_modules/expo-glass-effect": { - "version": "55.0.7", - "resolved": "https://registry.npmmirror.com/expo-glass-effect/-/expo-glass-effect-55.0.7.tgz", - "integrity": "sha512-G7Q9rUaEY0YC36fGE6irDljfsfvzz/y49zagARAKvSJSyQMUSrhR25WOr5LK5Cw7gQNNBEy9U1ctlr7yCay/fQ==", + "version": "55.0.8", + "resolved": "https://registry.npmmirror.com/expo-glass-effect/-/expo-glass-effect-55.0.8.tgz", + "integrity": "sha512-IvUjHb/4t6r2H/LXDjcQ4uDoHrmO2cLOvEb9leLavQ4HX5+P4LRtQrMDMlkWAn5Wo5DkLcG8+1CrQU2nqgogTA==", "license": "MIT", "peerDependencies": { "expo": "*", @@ -5563,9 +5669,9 @@ } }, "node_modules/expo-haptics": { - "version": "55.0.8", - "resolved": "https://registry.npmmirror.com/expo-haptics/-/expo-haptics-55.0.8.tgz", - "integrity": "sha512-yVR6EsQwl1WuhFITc0PpfI/7dsBdjK/F2YA8xB80UUW9iTa+Tqz21FpH4n/vtbargpzFxkhl5WNYMa419+QWFQ==", + "version": "55.0.9", + "resolved": "https://registry.npmmirror.com/expo-haptics/-/expo-haptics-55.0.9.tgz", + "integrity": "sha512-KCRyHr/uu4syXmoq3aIQ6ahuaX6FGtlPkWGlLlHJ836WF3nG+5+oCaCQiI7qMTpml+Tp/V/zP4ZaowM2KHgLNA==", "license": "MIT", "peerDependencies": { "expo": "*" @@ -5601,9 +5707,9 @@ } }, "node_modules/expo-image-picker": { - "version": "55.0.10", - "resolved": "https://registry.npmmirror.com/expo-image-picker/-/expo-image-picker-55.0.10.tgz", - "integrity": "sha512-uspDWjNBNjUD//MLzu7oEtT9cuNgW5pd6HxPfAJffRIdkdCUCYxLYXRp5pfB6JtW640eCdvm2QEQrQC172Y62g==", + "version": "55.0.13", + "resolved": "https://registry.npmmirror.com/expo-image-picker/-/expo-image-picker-55.0.13.tgz", + "integrity": "sha512-G+W11rcoUi3rK+6cnKWkTfZilMkGVZnYe90TiM3R98nPSlzGBoto3a/TkGGTJXedz/dmMzr49L+STlWhuKKIFw==", "license": "MIT", "dependencies": { "expo-image-loader": "~55.0.0" @@ -5618,10 +5724,20 @@ "integrity": "sha512-aupt/o5PDAb8dXDCb0JcRdkqnTLxe/F+La7jrnyd/sXlYFfRgBJLFOa1SqVFXm1E/Xam1SE/yw6eAb+DGY7Arg==", "license": "MIT" }, + "node_modules/expo-keep-awake": { + "version": "55.0.4", + "resolved": "https://registry.npmmirror.com/expo-keep-awake/-/expo-keep-awake-55.0.4.tgz", + "integrity": "sha512-vwfdMtMS5Fxaon8gC0AiE70SpxTsHJ+rjeoVJl8kdfdbxczF7OIaVmfjFJ5Gfigd/WZiLqxhfZk34VAkXF4PNg==", + "license": "MIT", + "peerDependencies": { + "expo": "*", + "react": "*" + } + }, "node_modules/expo-linear-gradient": { - "version": "55.0.8", - "resolved": "https://registry.npmmirror.com/expo-linear-gradient/-/expo-linear-gradient-55.0.8.tgz", - "integrity": "sha512-nCMgZXcHesnFslH1TUFMdqlDiE4jYTTTSHb97g1jq1gyGX2xDEOyqBxQJmiIVGrZJ+kTWH6RljJ5tYyva9mrAg==", + "version": "55.0.9", + "resolved": "https://registry.npmmirror.com/expo-linear-gradient/-/expo-linear-gradient-55.0.9.tgz", + "integrity": "sha512-S82iF+CVoSBVHdwusLQGh6Th/kcWLHU47jZhBPwyTrYWnsHZtb0oCqU96YvhDYvhbTdsuOaKEi+Xu+r/I2R8ow==", "license": "MIT", "peerDependencies": { "expo": "*", @@ -5630,13 +5746,13 @@ } }, "node_modules/expo-linking": { - "version": "55.0.7", - "resolved": "https://registry.npmmirror.com/expo-linking/-/expo-linking-55.0.7.tgz", - "integrity": "sha512-MiGCedere1vzQTEi2aGrkzd7eh/rPSz4w6F3GMBuAJzYl+/0VhIuyhozpEGrueyDIXWfzaUVOcn3SfxVi+kwQQ==", + "version": "55.0.8", + "resolved": "https://registry.npmmirror.com/expo-linking/-/expo-linking-55.0.8.tgz", + "integrity": "sha512-O9QgKAfEqKfsjL6IKs5p7pFAjo/3/TQwjMzzNPl8BCndbxWMPQfMeViXPYYNS9bA2ujUqrtF1OYhO6woI7GNQQ==", "license": "MIT", "peer": true, "dependencies": { - "expo-constants": "~55.0.7", + "expo-constants": "~55.0.8", "invariant": "^2.2.4" }, "peerDependencies": { @@ -5645,12 +5761,12 @@ } }, "node_modules/expo-manifests": { - "version": "55.0.9", - "resolved": "https://registry.npmmirror.com/expo-manifests/-/expo-manifests-55.0.9.tgz", - "integrity": "sha512-i82j3X4hbxYDe6kxUw4u8WfvbvTj2w+9BD9WKuL0mFRy+MjvdzdyaqAjEViWCKo/alquP/hTApDTQBb3UmWhkg==", + "version": "55.0.11", + "resolved": "https://registry.npmmirror.com/expo-manifests/-/expo-manifests-55.0.11.tgz", + "integrity": "sha512-3+pFun4C9F/eFMVpwZgOBrBWq5sfu7rS1uxTrcg9G7jUFatNe5W6hr+M7z7aQPDf0J1afaSudUZPawx1LLf15w==", "license": "MIT", "dependencies": { - "@expo/config": "~55.0.8", + "@expo/config": "~55.0.10", "expo-json-utils": "~55.0.0" }, "peerDependencies": { @@ -5658,9 +5774,9 @@ } }, "node_modules/expo-media-library": { - "version": "55.0.9", - "resolved": "https://registry.npmmirror.com/expo-media-library/-/expo-media-library-55.0.9.tgz", - "integrity": "sha512-E12e4gjQEZNdAa7MHDLOAiOMQmhmOGHFMMU5DpiK6I01hPXyRcaxgAQQLpibIXNP4O5LjGi2psa3NBacjyjxkw==", + "version": "55.0.10", + "resolved": "https://registry.npmmirror.com/expo-media-library/-/expo-media-library-55.0.10.tgz", + "integrity": "sha512-xXmz8Do9BJSt1LrkC6r8l2HAXNdaAr2TdzCuiVo9u47Vuo54twlOgzLpdx4rIzODy/cclqbYb2tae4nCKHJLbw==", "license": "MIT", "peerDependencies": { "expo": "*", @@ -5668,12 +5784,12 @@ } }, "node_modules/expo-modules-autolinking": { - "version": "55.0.8", - "resolved": "https://registry.npmmirror.com/expo-modules-autolinking/-/expo-modules-autolinking-55.0.8.tgz", - "integrity": "sha512-nrWB1pkNp7bR8ECUTgYUiJ2Pyh6AvxCBXZ+lyPlfl1TzEIGhwU1Yqr+d78eJDueXaW+9zKeE0HqrTZoLS3ve4A==", + "version": "55.0.11", + "resolved": "https://registry.npmmirror.com/expo-modules-autolinking/-/expo-modules-autolinking-55.0.11.tgz", + "integrity": "sha512-9dqnPzQoIl1dIvEctMWpQ8eaiXDeBTgAwebCc1WF0BbEo+pcdKjZWoCSqlLj+d7IX+OnTgM+k6cY2kPDGIu4sg==", "license": "MIT", "dependencies": { - "@expo/require-utils": "^55.0.2", + "@expo/require-utils": "^55.0.3", "@expo/spawn-async": "^1.7.2", "chalk": "^4.1.0", "commander": "^7.2.0" @@ -5682,10 +5798,19 @@ "expo-modules-autolinking": "bin/expo-modules-autolinking.js" } }, + "node_modules/expo-modules-autolinking/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmmirror.com/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, "node_modules/expo-modules-core": { - "version": "55.0.13", - "resolved": "https://registry.npmmirror.com/expo-modules-core/-/expo-modules-core-55.0.13.tgz", - "integrity": "sha512-DYLQTOJAR7jD3M9S0sH9myZaPEtShdicHrPiWcupIXMeMkQxFzErx+adUI8gZPy4AU45BgeGgtaogRfT25iLfw==", + "version": "55.0.17", + "resolved": "https://registry.npmmirror.com/expo-modules-core/-/expo-modules-core-55.0.17.tgz", + "integrity": "sha512-pw3cZiaSlBrqRJUD/pHuMnKGsRTW6XJ255FrjDd3HC4QrqErCnfSQPmz+Sv4Qkelcvd9UGdAewyTqZdFwjLwOw==", "license": "MIT", "dependencies": { "invariant": "^2.2.4" @@ -5696,16 +5821,16 @@ } }, "node_modules/expo-notifications": { - "version": "55.0.10", - "resolved": "https://registry.npmmirror.com/expo-notifications/-/expo-notifications-55.0.10.tgz", - "integrity": "sha512-F+ozrVFthKCwfqz2cXmcqrqwzBMTAwoNBqTZERuFtgc+6I++mweVzLLTtbAy8kBDZ33MA13GKyeq7mw13/rDgw==", + "version": "55.0.13", + "resolved": "https://registry.npmmirror.com/expo-notifications/-/expo-notifications-55.0.13.tgz", + "integrity": "sha512-vbtSBcMkYtNTO+6WKdeOzysOqvtmiq/sQrUKJpYcB75m9hBFcAfI2klpXdUiGg5kMr/ygBmFENSolQt1B9QY8A==", "license": "MIT", "dependencies": { "@expo/image-utils": "^0.8.12", "abort-controller": "^3.0.0", "badgin": "^1.1.5", - "expo-application": "~55.0.8", - "expo-constants": "~55.0.7" + "expo-application": "~55.0.10", + "expo-constants": "~55.0.8" }, "peerDependencies": { "expo": "*", @@ -5714,22 +5839,22 @@ } }, "node_modules/expo-router": { - "version": "55.0.4", - "resolved": "https://registry.npmmirror.com/expo-router/-/expo-router-55.0.4.tgz", - "integrity": "sha512-wLKxc9l3IaE96UJFvwXKi2YYYjYK/VUttwAwcnljaUA2dLgDruNGmjsBS9A+g3aK3lt2/JJRu+cec7ZLJ9r6Wg==", + "version": "55.0.7", + "resolved": "https://registry.npmmirror.com/expo-router/-/expo-router-55.0.7.tgz", + "integrity": "sha512-UdraTi8/1LGCCEnq/3+wEVnM11b4ezFEIvMsWP9ajFvEhFGkcXlQitvSehT2yI5cbBrBaIMP2p/2naBiPyYVyw==", "license": "MIT", "dependencies": { "@expo/metro-runtime": "^55.0.6", "@expo/schema-utils": "^55.0.2", "@radix-ui/react-slot": "^1.2.0", "@radix-ui/react-tabs": "^1.1.12", - "@react-navigation/bottom-tabs": "^7.10.1", - "@react-navigation/native": "^7.1.28", - "@react-navigation/native-stack": "^7.10.1", + "@react-navigation/bottom-tabs": "^7.15.5", + "@react-navigation/native": "^7.1.33", + "@react-navigation/native-stack": "^7.14.5", "client-only": "^0.0.1", "debug": "^4.3.4", "escape-string-regexp": "^4.0.0", - "expo-glass-effect": "^55.0.7", + "expo-glass-effect": "^55.0.8", "expo-image": "^55.0.6", "expo-server": "^55.0.6", "expo-symbols": "^55.0.5", @@ -5749,11 +5874,11 @@ "peerDependencies": { "@expo/log-box": "55.0.7", "@expo/metro-runtime": "^55.0.6", - "@react-navigation/drawer": "^7.7.2", + "@react-navigation/drawer": "^7.9.4", "@testing-library/react-native": ">= 13.2.0", "expo": "*", - "expo-constants": "^55.0.7", - "expo-linking": "^55.0.7", + "expo-constants": "^55.0.8", + "expo-linking": "^55.0.8", "react": "*", "react-dom": "*", "react-native": "*", @@ -5810,9 +5935,9 @@ } }, "node_modules/expo-sqlite": { - "version": "55.0.10", - "resolved": "https://registry.npmmirror.com/expo-sqlite/-/expo-sqlite-55.0.10.tgz", - "integrity": "sha512-yLQXkwcA0OVSKuL4t+a6vv+H/Klh8147n7hH75AN0MkC48p3Go7+6GM+3SFENeaBUsmOnOS3XSFxMxxj6PIg4g==", + "version": "55.0.11", + "resolved": "https://registry.npmmirror.com/expo-sqlite/-/expo-sqlite-55.0.11.tgz", + "integrity": "sha512-lDGJrE0m1lw/3y1ZSsER2kfXnS+9WzgaKcIFp/RKbTfyhs0v8l86Ulqdr+6peRFOfzi0kdj4Ty0LzE2Adx93tg==", "license": "MIT", "dependencies": { "await-lock": "^2.2.2" @@ -5859,9 +5984,9 @@ } }, "node_modules/expo-system-ui": { - "version": "55.0.9", - "resolved": "https://registry.npmmirror.com/expo-system-ui/-/expo-system-ui-55.0.9.tgz", - "integrity": "sha512-8ygP1B0uFAFI8s7eHY2IcGnE83GhFeZYwHBr/fQ4dSXnc7iVT9zp2PvyTyiDiibQ69dBG+fauMQ4KlPcOO51kQ==", + "version": "55.0.10", + "resolved": "https://registry.npmmirror.com/expo-system-ui/-/expo-system-ui-55.0.10.tgz", + "integrity": "sha512-s0Fyf37ma3TaWhh18uocg914Uz0tKPaYBf+mEME7Tp88d3FxOTg+tTv1S9mUe4lJNXY+0KlWFz9J4SMNyjGRWQ==", "license": "MIT", "dependencies": { "@react-native/normalize-colors": "0.83.2", @@ -5879,9 +6004,9 @@ } }, "node_modules/expo-task-manager": { - "version": "55.0.9", - "resolved": "https://registry.npmmirror.com/expo-task-manager/-/expo-task-manager-55.0.9.tgz", - "integrity": "sha512-ABqEua5FCjXmzRB+OGKD2KcQL2gkh57nCwGnFGe5Km+/b+0uxIs0lq0L3PPyoYPs1tAWp5FKfn2jcnz1nbBCVA==", + "version": "55.0.10", + "resolved": "https://registry.npmmirror.com/expo-task-manager/-/expo-task-manager-55.0.10.tgz", + "integrity": "sha512-QjlVPiBqiDaALssZAQ9w14quELKQ9DBdV4sfmH6rICUbDvSBFiH91HbGxROXcQEDrU8lrVDObJQBxrJK9ucaaw==", "license": "MIT", "dependencies": { "unimodules-app-loader": "~55.0.2" @@ -5892,9 +6017,9 @@ } }, "node_modules/expo-updates": { - "version": "55.0.12", - "resolved": "https://registry.npmmirror.com/expo-updates/-/expo-updates-55.0.12.tgz", - "integrity": "sha512-20YTlmivT7pU8+jYMQHqHQmFTdNHHfIMXXVuFjQA31qCyAOwR32AvDn30IBpgn1Z7XJTX+Sr6cEoMhqz5IJfww==", + "version": "55.0.15", + "resolved": "https://registry.npmmirror.com/expo-updates/-/expo-updates-55.0.15.tgz", + "integrity": "sha512-UE9Ik56trq//kNeJ/BlC5vOTYdNTvsHwhfWFYMazP1UOQK4lnX59/t0qz8Ut+3aPXZZT7+B6mnbWtic0QqN1wA==", "license": "MIT", "dependencies": { "@expo/code-signing-certificates": "^0.0.6", @@ -5904,7 +6029,7 @@ "chalk": "^4.1.2", "debug": "^4.3.4", "expo-eas-client": "~55.0.2", - "expo-manifests": "~55.0.9", + "expo-manifests": "~55.0.11", "expo-structured-headers": "~55.0.0", "expo-updates-interface": "~55.1.3", "getenv": "^2.0.0", @@ -5937,9 +6062,9 @@ "license": "MIT" }, "node_modules/expo-video": { - "version": "55.0.10", - "resolved": "https://registry.npmmirror.com/expo-video/-/expo-video-55.0.10.tgz", - "integrity": "sha512-L3UXgvGjrJv4ym3PnIGPPQi4LlVHQSh89eYm2Q7Pn9iUy5ce98sAdqPIKV88bfdLAIWfmPecYUoOzozXBPmenw==", + "version": "55.0.11", + "resolved": "https://registry.npmmirror.com/expo-video/-/expo-video-55.0.11.tgz", + "integrity": "sha512-XCXcPfzVYx6CgXlbRPH2sgacsNT82T6+euyyFlZsG+iuF5tUOWnMgToTuCmktAkwKDe70pNonoQI9HtZjSfNXw==", "license": "MIT", "peerDependencies": { "expo": "*", @@ -5948,27 +6073,27 @@ } }, "node_modules/expo/node_modules/@expo/cli": { - "version": "55.0.14", - "resolved": "https://registry.npmmirror.com/@expo/cli/-/cli-55.0.14.tgz", - "integrity": "sha512-glXPSjjLCIz+KX/ezqLTGIF9eTE1lexiCxunvB3loRZNnGeBDGW3eF++cuPKudW26jeC6bqZkcqBG7Lp0Sp9qg==", + "version": "55.0.18", + "resolved": "https://registry.npmmirror.com/@expo/cli/-/cli-55.0.18.tgz", + "integrity": "sha512-3sJwu8KvCvQIXBnhUlHgLBZBe+ZK4Da9R5rgI4znaowJavYWMqzRClLzyE6Kri66WVoMX7Q4HUVIh8prRlO0XA==", "license": "MIT", "dependencies": { "@expo/code-signing-certificates": "^0.0.6", - "@expo/config": "~55.0.8", - "@expo/config-plugins": "~55.0.6", + "@expo/config": "~55.0.10", + "@expo/config-plugins": "~55.0.7", "@expo/devcert": "^1.2.1", "@expo/env": "~2.1.1", "@expo/image-utils": "^0.8.12", "@expo/json-file": "^10.0.12", "@expo/log-box": "55.0.7", "@expo/metro": "~54.2.0", - "@expo/metro-config": "~55.0.9", + "@expo/metro-config": "~55.0.11", "@expo/osascript": "^2.4.2", "@expo/package-manager": "^1.10.3", "@expo/plist": "^0.5.2", - "@expo/prebuild-config": "^55.0.8", - "@expo/require-utils": "^55.0.2", - "@expo/router-server": "^55.0.9", + "@expo/prebuild-config": "^55.0.10", + "@expo/require-utils": "^55.0.3", + "@expo/router-server": "^55.0.11", "@expo/schema-utils": "^55.0.2", "@expo/spawn-async": "^1.7.2", "@expo/ws-tunnel": "^1.0.1", @@ -6028,31 +6153,10 @@ } } }, - "node_modules/expo/node_modules/@expo/cli/node_modules/@expo/prebuild-config": { - "version": "55.0.8", - "resolved": "https://registry.npmmirror.com/@expo/prebuild-config/-/prebuild-config-55.0.8.tgz", - "integrity": "sha512-VJNJiOmmZgyDnR7JMmc3B8Z0ZepZ17I8Wtw+wAH/2+UCUsFg588XU+bwgYcFGw+is28kwGjY46z43kfufpxOnA==", - "license": "MIT", - "dependencies": { - "@expo/config": "~55.0.8", - "@expo/config-plugins": "~55.0.6", - "@expo/config-types": "^55.0.5", - "@expo/image-utils": "^0.8.12", - "@expo/json-file": "^10.0.12", - "@react-native/normalize-colors": "0.83.2", - "debug": "^4.3.1", - "resolve-from": "^5.0.0", - "semver": "^7.6.0", - "xml2js": "0.6.0" - }, - "peerDependencies": { - "expo": "*" - } - }, "node_modules/expo/node_modules/@expo/cli/node_modules/@expo/router-server": { - "version": "55.0.9", - "resolved": "https://registry.npmmirror.com/@expo/router-server/-/router-server-55.0.9.tgz", - "integrity": "sha512-LcCFi+P1qfZOsw0DO4JwNKRxtWt4u2bjTYj0PUe4WVf9NVG/NfUetAXYRbBS6P+gupfM6SC+/bdzdqCWQh7j8g==", + "version": "55.0.11", + "resolved": "https://registry.npmmirror.com/@expo/router-server/-/router-server-55.0.11.tgz", + "integrity": "sha512-Kd8J1OOlFR00DZxn+1KfiQiXZtRut6cj8+ynqHJa7dtt/lTL4tGkYistqmVhpKJ6w886eRY5WivKy7o0ZBFkJA==", "license": "MIT", "dependencies": { "debug": "^4.3.4" @@ -6060,7 +6164,7 @@ "peerDependencies": { "@expo/metro-runtime": "^55.0.6", "expo": "*", - "expo-constants": "^55.0.7", + "expo-constants": "^55.0.9", "expo-font": "^55.0.4", "expo-router": "*", "expo-server": "^55.0.6", @@ -6083,87 +6187,16 @@ } } }, - "node_modules/expo/node_modules/@expo/metro-config": { - "version": "55.0.9", - "resolved": "https://registry.npmmirror.com/@expo/metro-config/-/metro-config-55.0.9.tgz", - "integrity": "sha512-ZJFEfat/+dLUhFyFFWrzMjAqAwwUaJ3RD42QNqR7jh+RVYkAf6XYLynb5qrKJTHI1EcOx4KoO1717yXYYRFDBA==", + "node_modules/expo/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.20.0", - "@babel/core": "^7.20.0", - "@babel/generator": "^7.20.5", - "@expo/config": "~55.0.8", - "@expo/env": "~2.1.1", - "@expo/json-file": "~10.0.12", - "@expo/metro": "~54.2.0", - "@expo/spawn-async": "^1.7.2", - "browserslist": "^4.25.0", - "chalk": "^4.1.0", - "debug": "^4.3.2", - "getenv": "^2.0.0", - "glob": "^13.0.0", - "hermes-parser": "^0.32.0", - "jsc-safe-url": "^0.2.4", - "lightningcss": "^1.30.1", - "picomatch": "^4.0.3", - "postcss": "~8.4.32", - "resolve-from": "^5.0.0" + "color-convert": "^1.9.0" }, - "peerDependencies": { - "expo": "*" - }, - "peerDependenciesMeta": { - "expo": { - "optional": true - } - } - }, - "node_modules/expo/node_modules/babel-preset-expo": { - "version": "55.0.10", - "resolved": "https://registry.npmmirror.com/babel-preset-expo/-/babel-preset-expo-55.0.10.tgz", - "integrity": "sha512-aRtW7qJKohGU2V0LUJ6IeP7py3+kVUo9zcc8+v1Kix8jGGuIvqvpo9S6W1Fmn9VFP2DBwkFDLiyzkCZS85urVA==", - "license": "MIT", - "dependencies": { - "@babel/generator": "^7.20.5", - "@babel/helper-module-imports": "^7.25.9", - "@babel/plugin-proposal-decorators": "^7.12.9", - "@babel/plugin-proposal-export-default-from": "^7.24.7", - "@babel/plugin-syntax-export-default-from": "^7.24.7", - "@babel/plugin-transform-class-static-block": "^7.27.1", - "@babel/plugin-transform-export-namespace-from": "^7.25.9", - "@babel/plugin-transform-flow-strip-types": "^7.25.2", - "@babel/plugin-transform-modules-commonjs": "^7.24.8", - "@babel/plugin-transform-object-rest-spread": "^7.24.7", - "@babel/plugin-transform-parameters": "^7.24.7", - "@babel/plugin-transform-private-methods": "^7.24.7", - "@babel/plugin-transform-private-property-in-object": "^7.24.7", - "@babel/plugin-transform-runtime": "^7.24.7", - "@babel/preset-react": "^7.22.15", - "@babel/preset-typescript": "^7.23.0", - "@react-native/babel-preset": "0.83.2", - "babel-plugin-react-compiler": "^1.0.0", - "babel-plugin-react-native-web": "~0.21.0", - "babel-plugin-syntax-hermes-parser": "^0.32.0", - "babel-plugin-transform-flow-enums": "^0.0.2", - "debug": "^4.3.4", - "resolve-from": "^5.0.0" - }, - "peerDependencies": { - "@babel/runtime": "^7.20.0", - "expo": "*", - "expo-widgets": "^55.0.2", - "react-refresh": ">=0.14.0 <1.0.0" - }, - "peerDependenciesMeta": { - "@babel/runtime": { - "optional": true - }, - "expo": { - "optional": true - }, - "expo-widgets": { - "optional": true - } + "engines": { + "node": ">=4" } }, "node_modules/expo/node_modules/ci-info": { @@ -6181,41 +6214,164 @@ "node": ">=8" } }, - "node_modules/expo/node_modules/expo-asset": { - "version": "55.0.8", - "resolved": "https://registry.npmmirror.com/expo-asset/-/expo-asset-55.0.8.tgz", - "integrity": "sha512-yEz2svDX67R0yiW2skx6dJmcE0q7sj9ECpGMcxBExMCbctc+nMoZCnjUuhzPl5vhClUsO5HFFXS5vIGmf1bgHQ==", + "node_modules/expo/node_modules/cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", "license": "MIT", "dependencies": { - "@expo/image-utils": "^0.8.12", - "expo-constants": "~55.0.7" + "restore-cursor": "^2.0.0" }, - "peerDependencies": { - "expo": "*", - "react": "*", - "react-native": "*" + "engines": { + "node": ">=4" } }, - "node_modules/expo/node_modules/expo-keep-awake": { - "version": "55.0.4", - "resolved": "https://registry.npmmirror.com/expo-keep-awake/-/expo-keep-awake-55.0.4.tgz", - "integrity": "sha512-vwfdMtMS5Fxaon8gC0AiE70SpxTsHJ+rjeoVJl8kdfdbxczF7OIaVmfjFJ5Gfigd/WZiLqxhfZk34VAkXF4PNg==", + "node_modules/expo/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "license": "MIT", - "peerDependencies": { - "expo": "*", - "react": "*" + "dependencies": { + "color-name": "1.1.3" } }, - "node_modules/expo/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "node_modules/expo/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "license": "MIT" + }, + "node_modules/expo/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "license": "MIT", "engines": { - "node": ">=12" + "node": ">=0.8.0" + } + }, + "node_modules/expo/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/expo/node_modules/log-symbols": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/log-symbols/-/log-symbols-2.2.0.tgz", + "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", + "license": "MIT", + "dependencies": { + "chalk": "^2.0.1" }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" + "engines": { + "node": ">=4" + } + }, + "node_modules/expo/node_modules/log-symbols/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmmirror.com/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/expo/node_modules/mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/expo/node_modules/onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", + "license": "MIT", + "dependencies": { + "mimic-fn": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/expo/node_modules/ora": { + "version": "3.4.0", + "resolved": "https://registry.npmmirror.com/ora/-/ora-3.4.0.tgz", + "integrity": "sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg==", + "license": "MIT", + "dependencies": { + "chalk": "^2.4.2", + "cli-cursor": "^2.1.0", + "cli-spinners": "^2.0.0", + "log-symbols": "^2.2.0", + "strip-ansi": "^5.2.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/expo/node_modules/ora/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmmirror.com/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/expo/node_modules/restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", + "license": "MIT", + "dependencies": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/expo/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmmirror.com/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/expo/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" } }, "node_modules/expo/node_modules/ws": { @@ -6284,22 +6440,9 @@ "license": "MIT" }, "node_modules/fast-xml-builder": { - "version": "1.0.0", - "resolved": "https://registry.npmmirror.com/fast-xml-builder/-/fast-xml-builder-1.0.0.tgz", - "integrity": "sha512-fpZuDogrAgnyt9oDDz+5DBz0zgPdPZz6D4IR7iESxRXElrlGTRkHJ9eEt+SACRJwT0FNFrt71DFQIUFBJfX/uQ==", - "devOptional": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ], - "license": "MIT" - }, - "node_modules/fast-xml-parser": { - "version": "5.4.2", - "resolved": "https://registry.npmmirror.com/fast-xml-parser/-/fast-xml-parser-5.4.2.tgz", - "integrity": "sha512-pw/6pIl4k0CSpElPEJhDppLzaixDEuWui2CUQQBH/ECDf7+y6YwA4Gf7Tyb0Rfe4DIMuZipYj4AEL0nACKglvQ==", + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/fast-xml-builder/-/fast-xml-builder-1.1.4.tgz", + "integrity": "sha512-f2jhpN4Eccy0/Uz9csxh3Nu6q4ErKxf0XIsasomfOihuSUa3/xw6w8dnOtCDgEItQFJG8KyXPzQXzcODDrrbOg==", "devOptional": true, "funding": [ { @@ -6309,8 +6452,25 @@ ], "license": "MIT", "dependencies": { - "fast-xml-builder": "^1.0.0", - "strnum": "^2.1.2" + "path-expression-matcher": "^1.1.3" + } + }, + "node_modules/fast-xml-parser": { + "version": "5.5.7", + "resolved": "https://registry.npmmirror.com/fast-xml-parser/-/fast-xml-parser-5.5.7.tgz", + "integrity": "sha512-LteOsISQ2GEiDHZch6L9hB0+MLoYVLToR7xotrzU0opCICBkxOPgHAy1HxAvtxfJNXDJpgAsQN30mkrfpO2Prg==", + "devOptional": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "dependencies": { + "fast-xml-builder": "^1.1.4", + "path-expression-matcher": "^1.1.3", + "strnum": "^2.2.0" }, "bin": { "fxparser": "src/cli/cli.js" @@ -6378,9 +6538,9 @@ } }, "node_modules/fetch-nodeshim": { - "version": "0.4.8", - "resolved": "https://registry.npmmirror.com/fetch-nodeshim/-/fetch-nodeshim-0.4.8.tgz", - "integrity": "sha512-YW5vG33rabBq6JpYosLNoXoaMN69/WH26MeeX2hkDVjN6UlvRGq3Wkazl9H0kisH95aMu/HtHL64JUvv/+Nv/g==", + "version": "0.4.9", + "resolved": "https://registry.npmmirror.com/fetch-nodeshim/-/fetch-nodeshim-0.4.9.tgz", + "integrity": "sha512-XIQWlB2A4RZ7NebXWGxS0uDMdvRHkiUDTghBVJKFg9yEOd45w/PP8cZANuPf2H08W6Cor3+2n7Q6TTZgAS3Fkw==", "license": "MIT" }, "node_modules/fill-range": { @@ -6437,17 +6597,33 @@ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "license": "MIT" }, - "node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmmirror.com/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "node_modules/finalhandler/node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", "license": "MIT", "dependencies": { - "locate-path": "^5.0.0", + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", "path-exists": "^4.0.0" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/flow-enums-runtime": { @@ -6749,18 +6925,18 @@ "license": "MIT" }, "node_modules/hermes-estree": { - "version": "0.32.0", - "resolved": "https://registry.npmmirror.com/hermes-estree/-/hermes-estree-0.32.0.tgz", - "integrity": "sha512-KWn3BqnlDOl97Xe1Yviur6NbgIZ+IP+UVSpshlZWkq+EtoHg6/cwiDj/osP9PCEgFE15KBm1O55JRwbMEm5ejQ==", + "version": "0.32.1", + "resolved": "https://registry.npmmirror.com/hermes-estree/-/hermes-estree-0.32.1.tgz", + "integrity": "sha512-ne5hkuDxheNBAikDjqvCZCwihnz0vVu9YsBzAEO1puiyFR4F1+PAz/SiPHSsNTuOveCYGRMX8Xbx4LOubeC0Qg==", "license": "MIT" }, "node_modules/hermes-parser": { - "version": "0.32.0", - "resolved": "https://registry.npmmirror.com/hermes-parser/-/hermes-parser-0.32.0.tgz", - "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==", + "version": "0.32.1", + "resolved": "https://registry.npmmirror.com/hermes-parser/-/hermes-parser-0.32.1.tgz", + "integrity": "sha512-175dz634X/W5AiwrpLdoMl/MOb17poLHyIqgyExlE8D9zQ1OPnoORnGMB5ltRKnpvQzBjMYvT2rN/sHeIfZW5Q==", "license": "MIT", "dependencies": { - "hermes-estree": "0.32.0" + "hermes-estree": "0.32.1" } }, "node_modules/hoist-non-react-statics": { @@ -6988,9 +7164,10 @@ } }, "node_modules/is-arrayish": { - "version": "0.3.4", - "resolved": "https://registry.npmmirror.com/is-arrayish/-/is-arrayish-0.3.4.tgz", - "integrity": "sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA==", + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "devOptional": true, "license": "MIT" }, "node_modules/is-core-module": { @@ -7034,12 +7211,13 @@ } }, "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "devOptional": true, "license": "MIT", "engines": { - "node": ">=8" + "node": ">=4" } }, "node_modules/is-glob": { @@ -7110,15 +7288,13 @@ } }, "node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmmirror.com/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==", + "devOptional": true, "license": "MIT", - "dependencies": { - "is-docker": "^2.0.0" - }, "engines": { - "node": ">=8" + "node": ">=4" } }, "node_modules/isexe": { @@ -7152,15 +7328,6 @@ "node": ">=8" } }, - "node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/jest-environment-node": { "version": "29.7.0", "resolved": "https://registry.npmmirror.com/jest-environment-node/-/jest-environment-node-29.7.0.tgz", @@ -7287,6 +7454,18 @@ "node": ">=8" } }, + "node_modules/jest-util/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/jest-validate": { "version": "29.7.0", "resolved": "https://registry.npmmirror.com/jest-validate/-/jest-validate-29.7.0.tgz", @@ -7361,13 +7540,12 @@ "license": "MIT" }, "node_modules/js-yaml": { - "version": "3.14.2", - "resolved": "https://registry.npmmirror.com/js-yaml/-/js-yaml-3.14.2.tgz", - "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", + "version": "4.1.1", + "resolved": "https://registry.npmmirror.com/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", "license": "MIT", "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" @@ -7484,9 +7662,9 @@ "license": "MIT" }, "node_modules/lightningcss": { - "version": "1.31.1", - "resolved": "https://registry.npmmirror.com/lightningcss/-/lightningcss-1.31.1.tgz", - "integrity": "sha512-l51N2r93WmGUye3WuFoN5k10zyvrVs0qfKBhyC5ogUQ6Ew6JUSswh78mbSO+IU3nTWsyOArqPCcShdQSadghBQ==", + "version": "1.32.0", + "resolved": "https://registry.npmmirror.com/lightningcss/-/lightningcss-1.32.0.tgz", + "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", "license": "MPL-2.0", "dependencies": { "detect-libc": "^2.0.3" @@ -7499,23 +7677,23 @@ "url": "https://opencollective.com/parcel" }, "optionalDependencies": { - "lightningcss-android-arm64": "1.31.1", - "lightningcss-darwin-arm64": "1.31.1", - "lightningcss-darwin-x64": "1.31.1", - "lightningcss-freebsd-x64": "1.31.1", - "lightningcss-linux-arm-gnueabihf": "1.31.1", - "lightningcss-linux-arm64-gnu": "1.31.1", - "lightningcss-linux-arm64-musl": "1.31.1", - "lightningcss-linux-x64-gnu": "1.31.1", - "lightningcss-linux-x64-musl": "1.31.1", - "lightningcss-win32-arm64-msvc": "1.31.1", - "lightningcss-win32-x64-msvc": "1.31.1" + "lightningcss-android-arm64": "1.32.0", + "lightningcss-darwin-arm64": "1.32.0", + "lightningcss-darwin-x64": "1.32.0", + "lightningcss-freebsd-x64": "1.32.0", + "lightningcss-linux-arm-gnueabihf": "1.32.0", + "lightningcss-linux-arm64-gnu": "1.32.0", + "lightningcss-linux-arm64-musl": "1.32.0", + "lightningcss-linux-x64-gnu": "1.32.0", + "lightningcss-linux-x64-musl": "1.32.0", + "lightningcss-win32-arm64-msvc": "1.32.0", + "lightningcss-win32-x64-msvc": "1.32.0" } }, "node_modules/lightningcss-android-arm64": { - "version": "1.31.1", - "resolved": "https://registry.npmmirror.com/lightningcss-android-arm64/-/lightningcss-android-arm64-1.31.1.tgz", - "integrity": "sha512-HXJF3x8w9nQ4jbXRiNppBCqeZPIAfUo8zE/kOEGbW5NZvGc/K7nMxbhIr+YlFlHW5mpbg/YFPdbnCh1wAXCKFg==", + "version": "1.32.0", + "resolved": "https://registry.npmmirror.com/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", + "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", "cpu": [ "arm64" ], @@ -7533,9 +7711,9 @@ } }, "node_modules/lightningcss-darwin-arm64": { - "version": "1.31.1", - "resolved": "https://registry.npmmirror.com/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.31.1.tgz", - "integrity": "sha512-02uTEqf3vIfNMq3h/z2cJfcOXnQ0GRwQrkmPafhueLb2h7mqEidiCzkE4gBMEH65abHRiQvhdcQ+aP0D0g67sg==", + "version": "1.32.0", + "resolved": "https://registry.npmmirror.com/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", + "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", "cpu": [ "arm64" ], @@ -7553,9 +7731,9 @@ } }, "node_modules/lightningcss-darwin-x64": { - "version": "1.31.1", - "resolved": "https://registry.npmmirror.com/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.31.1.tgz", - "integrity": "sha512-1ObhyoCY+tGxtsz1lSx5NXCj3nirk0Y0kB/g8B8DT+sSx4G9djitg9ejFnjb3gJNWo7qXH4DIy2SUHvpoFwfTA==", + "version": "1.32.0", + "resolved": "https://registry.npmmirror.com/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", + "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", "cpu": [ "x64" ], @@ -7573,9 +7751,9 @@ } }, "node_modules/lightningcss-freebsd-x64": { - "version": "1.31.1", - "resolved": "https://registry.npmmirror.com/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.31.1.tgz", - "integrity": "sha512-1RINmQKAItO6ISxYgPwszQE1BrsVU5aB45ho6O42mu96UiZBxEXsuQ7cJW4zs4CEodPUioj/QrXW1r9pLUM74A==", + "version": "1.32.0", + "resolved": "https://registry.npmmirror.com/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", + "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", "cpu": [ "x64" ], @@ -7593,9 +7771,9 @@ } }, "node_modules/lightningcss-linux-arm-gnueabihf": { - "version": "1.31.1", - "resolved": "https://registry.npmmirror.com/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.31.1.tgz", - "integrity": "sha512-OOCm2//MZJ87CdDK62rZIu+aw9gBv4azMJuA8/KB74wmfS3lnC4yoPHm0uXZ/dvNNHmnZnB8XLAZzObeG0nS1g==", + "version": "1.32.0", + "resolved": "https://registry.npmmirror.com/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", + "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", "cpu": [ "arm" ], @@ -7613,9 +7791,9 @@ } }, "node_modules/lightningcss-linux-arm64-gnu": { - "version": "1.31.1", - "resolved": "https://registry.npmmirror.com/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.31.1.tgz", - "integrity": "sha512-WKyLWztD71rTnou4xAD5kQT+982wvca7E6QoLpoawZ1gP9JM0GJj4Tp5jMUh9B3AitHbRZ2/H3W5xQmdEOUlLg==", + "version": "1.32.0", + "resolved": "https://registry.npmmirror.com/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", + "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", "cpu": [ "arm64" ], @@ -7633,9 +7811,9 @@ } }, "node_modules/lightningcss-linux-arm64-musl": { - "version": "1.31.1", - "resolved": "https://registry.npmmirror.com/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.31.1.tgz", - "integrity": "sha512-mVZ7Pg2zIbe3XlNbZJdjs86YViQFoJSpc41CbVmKBPiGmC4YrfeOyz65ms2qpAobVd7WQsbW4PdsSJEMymyIMg==", + "version": "1.32.0", + "resolved": "https://registry.npmmirror.com/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", + "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", "cpu": [ "arm64" ], @@ -7653,9 +7831,9 @@ } }, "node_modules/lightningcss-linux-x64-gnu": { - "version": "1.31.1", - "resolved": "https://registry.npmmirror.com/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.31.1.tgz", - "integrity": "sha512-xGlFWRMl+0KvUhgySdIaReQdB4FNudfUTARn7q0hh/V67PVGCs3ADFjw+6++kG1RNd0zdGRlEKa+T13/tQjPMA==", + "version": "1.32.0", + "resolved": "https://registry.npmmirror.com/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", + "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", "cpu": [ "x64" ], @@ -7673,9 +7851,9 @@ } }, "node_modules/lightningcss-linux-x64-musl": { - "version": "1.31.1", - "resolved": "https://registry.npmmirror.com/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.31.1.tgz", - "integrity": "sha512-eowF8PrKHw9LpoZii5tdZwnBcYDxRw2rRCyvAXLi34iyeYfqCQNA9rmUM0ce62NlPhCvof1+9ivRaTY6pSKDaA==", + "version": "1.32.0", + "resolved": "https://registry.npmmirror.com/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", + "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", "cpu": [ "x64" ], @@ -7693,9 +7871,9 @@ } }, "node_modules/lightningcss-win32-arm64-msvc": { - "version": "1.31.1", - "resolved": "https://registry.npmmirror.com/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.31.1.tgz", - "integrity": "sha512-aJReEbSEQzx1uBlQizAOBSjcmr9dCdL3XuC/6HLXAxmtErsj2ICo5yYggg1qOODQMtnjNQv2UHb9NpOuFtYe4w==", + "version": "1.32.0", + "resolved": "https://registry.npmmirror.com/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", + "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", "cpu": [ "arm64" ], @@ -7713,9 +7891,9 @@ } }, "node_modules/lightningcss-win32-x64-msvc": { - "version": "1.31.1", - "resolved": "https://registry.npmmirror.com/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.31.1.tgz", - "integrity": "sha512-I9aiFrbd7oYHwlnQDqr1Roz+fTz61oDDJX7n9tYF9FJymH1cIN1DtKw3iYt6b8WZgEjoNwVSncwF4wx/ZedMhw==", + "version": "1.32.0", + "resolved": "https://registry.npmmirror.com/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", + "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", "cpu": [ "x64" ], @@ -7740,15 +7918,19 @@ "license": "MIT" }, "node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmmirror.com/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "devOptional": true, "license": "MIT", "dependencies": { - "p-locate": "^4.1.0" + "p-locate": "^5.0.0" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/lodash.debounce": { @@ -7764,86 +7946,20 @@ "license": "MIT" }, "node_modules/log-symbols": { - "version": "2.2.0", - "resolved": "https://registry.npmmirror.com/log-symbols/-/log-symbols-2.2.0.tgz", - "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "devOptional": true, "license": "MIT", "dependencies": { - "chalk": "^2.0.1" + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" }, "engines": { - "node": ">=4" - } - }, - "node_modules/log-symbols/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" + "node": ">=10" }, - "engines": { - "node": ">=4" - } - }, - "node_modules/log-symbols/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmmirror.com/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/log-symbols/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/log-symbols/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "license": "MIT" - }, - "node_modules/log-symbols/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/log-symbols/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/log-symbols/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/logkitty": { @@ -7883,6 +7999,75 @@ "wrap-ansi": "^6.2.0" } }, + "node_modules/logkitty/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/logkitty/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/logkitty/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/logkitty/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/logkitty/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/logkitty/node_modules/wrap-ansi": { "version": "6.2.0", "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz", @@ -8100,6 +8285,21 @@ "node": ">=20.19.4" } }, + "node_modules/metro-babel-transformer/node_modules/hermes-estree": { + "version": "0.32.0", + "resolved": "https://registry.npmmirror.com/hermes-estree/-/hermes-estree-0.32.0.tgz", + "integrity": "sha512-KWn3BqnlDOl97Xe1Yviur6NbgIZ+IP+UVSpshlZWkq+EtoHg6/cwiDj/osP9PCEgFE15KBm1O55JRwbMEm5ejQ==", + "license": "MIT" + }, + "node_modules/metro-babel-transformer/node_modules/hermes-parser": { + "version": "0.32.0", + "resolved": "https://registry.npmmirror.com/hermes-parser/-/hermes-parser-0.32.0.tgz", + "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==", + "license": "MIT", + "dependencies": { + "hermes-estree": "0.32.0" + } + }, "node_modules/metro-cache": { "version": "0.83.3", "resolved": "https://registry.npmmirror.com/metro-cache/-/metro-cache-0.83.3.tgz", @@ -8300,6 +8500,42 @@ "node": ">=20.19.4" } }, + "node_modules/metro/node_modules/hermes-estree": { + "version": "0.32.0", + "resolved": "https://registry.npmmirror.com/hermes-estree/-/hermes-estree-0.32.0.tgz", + "integrity": "sha512-KWn3BqnlDOl97Xe1Yviur6NbgIZ+IP+UVSpshlZWkq+EtoHg6/cwiDj/osP9PCEgFE15KBm1O55JRwbMEm5ejQ==", + "license": "MIT" + }, + "node_modules/metro/node_modules/hermes-parser": { + "version": "0.32.0", + "resolved": "https://registry.npmmirror.com/hermes-parser/-/hermes-parser-0.32.0.tgz", + "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==", + "license": "MIT", + "dependencies": { + "hermes-estree": "0.32.0" + } + }, + "node_modules/metro/node_modules/ws": { + "version": "7.5.10", + "resolved": "https://registry.npmmirror.com/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "license": "MIT", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/micromatch": { "version": "4.0.8", "resolved": "https://registry.npmmirror.com/micromatch/-/micromatch-4.0.8.tgz", @@ -8313,22 +8549,35 @@ "node": ">=8.6" } }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmmirror.com/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "version": "2.6.0", + "resolved": "https://registry.npmmirror.com/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "devOptional": true, "license": "MIT", "bin": { "mime": "cli.js" }, "engines": { - "node": ">=4" + "node": ">=4.0.0" } }, "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "version": "1.54.0", + "resolved": "https://registry.npmmirror.com/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -8346,13 +8595,23 @@ "node": ">= 0.6" } }, - "node_modules/mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmmirror.com/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "node_modules/mime-types/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "license": "MIT", "engines": { - "node": ">=4" + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=6" } }, "node_modules/minimatch": { @@ -8422,9 +8681,9 @@ } }, "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmmirror.com/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "version": "0.6.4", + "resolved": "https://registry.npmmirror.com/negotiator/-/negotiator-0.6.4.tgz", + "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", "license": "MIT", "engines": { "node": ">= 0.6" @@ -8476,9 +8735,9 @@ "license": "MIT" }, "node_modules/node-releases": { - "version": "2.0.27", - "resolved": "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.27.tgz", - "integrity": "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA==", + "version": "2.0.36", + "resolved": "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.36.tgz", + "integrity": "sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA==", "license": "MIT" }, "node_modules/node-stream-zip": { @@ -8519,6 +8778,18 @@ "node": "^16.14.0 || >=18.0.0" } }, + "node_modules/npm-package-arg/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmmirror.com/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/npm-run-path": { "version": "4.0.1", "resolved": "https://registry.npmmirror.com/npm-run-path/-/npm-run-path-4.0.1.tgz", @@ -8573,9 +8844,9 @@ } }, "node_modules/on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmmirror.com/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "version": "2.4.1", + "resolved": "https://registry.npmmirror.com/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "license": "MIT", "dependencies": { "ee-first": "1.1.1" @@ -8603,167 +8874,101 @@ } }, "node_modules/onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", + "version": "5.1.2", + "resolved": "https://registry.npmmirror.com/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "devOptional": true, "license": "MIT", "dependencies": { - "mimic-fn": "^1.0.0" + "mimic-fn": "^2.1.0" }, "engines": { - "node": ">=4" - } - }, - "node_modules/open": { - "version": "7.4.2", - "resolved": "https://registry.npmmirror.com/open/-/open-7.4.2.tgz", - "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", - "license": "MIT", - "dependencies": { - "is-docker": "^2.0.0", - "is-wsl": "^2.1.1" - }, - "engines": { - "node": ">=8" + "node": ">=6" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ora": { - "version": "3.4.0", - "resolved": "https://registry.npmmirror.com/ora/-/ora-3.4.0.tgz", - "integrity": "sha512-eNwHudNbO1folBP3JsZ19v9azXWtQZjICdr3Q0TDPIaeBQ3mXLrh54wM+er0+hSp+dWKf+Z8KM58CYzEyIYxYg==", + "node_modules/open": { + "version": "6.4.0", + "resolved": "https://registry.npmmirror.com/open/-/open-6.4.0.tgz", + "integrity": "sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==", + "devOptional": true, "license": "MIT", "dependencies": { - "chalk": "^2.4.2", - "cli-cursor": "^2.1.0", - "cli-spinners": "^2.0.0", - "log-symbols": "^2.2.0", - "strip-ansi": "^5.2.0", + "is-wsl": "^1.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ora": { + "version": "5.4.1", + "resolved": "https://registry.npmmirror.com/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", "wcwidth": "^1.0.1" }, "engines": { - "node": ">=6" - } - }, - "node_modules/ora/node_modules/ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/ora/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" + "node": ">=10" }, - "engines": { - "node": ">=4" - } - }, - "node_modules/ora/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmmirror.com/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/ora/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/ora/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "license": "MIT" - }, - "node_modules/ora/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/ora/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "license": "MIT", - "engines": { - "node": ">=4" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/ora/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "devOptional": true, "license": "MIT", "dependencies": { - "ansi-regex": "^4.1.0" + "ansi-regex": "^5.0.1" }, "engines": { - "node": ">=6" - } - }, - "node_modules/ora/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmmirror.com/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "devOptional": true, "license": "MIT", "dependencies": { - "p-try": "^2.0.0" + "yocto-queue": "^0.1.0" }, "engines": { - "node": ">=6" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmmirror.com/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "devOptional": true, "license": "MIT", "dependencies": { - "p-limit": "^2.2.0" + "p-limit": "^3.0.2" }, "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-try": { @@ -8837,6 +9042,22 @@ "node": ">=8" } }, + "node_modules/path-expression-matcher": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/path-expression-matcher/-/path-expression-matcher-1.2.0.tgz", + "integrity": "sha512-DwmPWeFn+tq7TiyJ2CxezCAirXjFxvaiD03npak3cRjlP9+OjTmSy1EpIrEbh+l6JgUundniloMLDQ/6VTdhLQ==", + "devOptional": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmmirror.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz", @@ -8878,9 +9099,9 @@ } }, "node_modules/path-scurry/node_modules/lru-cache": { - "version": "11.2.6", - "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-11.2.6.tgz", - "integrity": "sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ==", + "version": "11.2.7", + "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-11.2.7.tgz", + "integrity": "sha512-aY/R+aEsRelme17KGQa/1ZSIpLpNYYrhcrepKTZgE+W3WM16YMCaPwOHLHsmopZHELU0Ojin1lPVxKR0MihncA==", "license": "BlueOak-1.0.0", "engines": { "node": "20 || >=22" @@ -8893,12 +9114,12 @@ "license": "ISC" }, "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "license": "MIT", "engines": { - "node": ">=8.6" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/jonschlinkert" @@ -8996,6 +9217,12 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/pretty-format/node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmmirror.com/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "license": "MIT" + }, "node_modules/proc-log": { "version": "4.2.0", "resolved": "https://registry.npmmirror.com/proc-log/-/proc-log-4.2.0.tgz", @@ -9150,6 +9377,27 @@ "ws": "^7" } }, + "node_modules/react-devtools-core/node_modules/ws": { + "version": "7.5.10", + "resolved": "https://registry.npmmirror.com/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "license": "MIT", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/react-dom": { "version": "19.2.0", "resolved": "https://registry.npmmirror.com/react-dom/-/react-dom-19.2.0.tgz", @@ -9181,9 +9429,9 @@ } }, "node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmmirror.com/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "version": "19.2.4", + "resolved": "https://registry.npmmirror.com/react-is/-/react-is-19.2.4.tgz", + "integrity": "sha512-W+EWGn2v0ApPKgKKCy/7s7WHXkboGcsrXE+2joLyVxkbyVQfO3MUEaUQDHoSmb8TFFrSKYa9mw64WZHNHSDzYA==", "license": "MIT" }, "node_modules/react-native": { @@ -9260,9 +9508,9 @@ } }, "node_modules/react-native-is-edge-to-edge": { - "version": "1.2.1", - "resolved": "https://registry.npmmirror.com/react-native-is-edge-to-edge/-/react-native-is-edge-to-edge-1.2.1.tgz", - "integrity": "sha512-FLbPWl/MyYQWz+KwqOZsSyj2JmLKglHatd3xLZWskXOpRaio4LfEDEz8E/A6uD8QoTHW6Aobw1jbEwK7KMgR7Q==", + "version": "1.3.1", + "resolved": "https://registry.npmmirror.com/react-native-is-edge-to-edge/-/react-native-is-edge-to-edge-1.3.1.tgz", + "integrity": "sha512-NIXU/iT5+ORyCc7p0z2nnlkouYKX425vuU1OEm6bMMtWWR9yvb+Xg5AZmImTKoF9abxCPqrKC3rOZsKzUYgYZA==", "license": "MIT", "peerDependencies": { "react": "*", @@ -9325,9 +9573,9 @@ "license": "MIT" }, "node_modules/react-native-reanimated": { - "version": "4.2.1", - "resolved": "https://registry.npmmirror.com/react-native-reanimated/-/react-native-reanimated-4.2.1.tgz", - "integrity": "sha512-/NcHnZMyOvsD/wYXug/YqSKw90P9edN0kEPL5lP4PFf1aQ4F1V7MKe/E0tvfkXKIajy3Qocp5EiEnlcrK/+BZg==", + "version": "4.2.2", + "resolved": "https://registry.npmmirror.com/react-native-reanimated/-/react-native-reanimated-4.2.2.tgz", + "integrity": "sha512-o3kKvdD8cVlg12Z4u3jv0MFAt53QV4k7gD9OLwQqU8eZLyd8QvaOjVZIghMZhC2pjP93uUU44PlO5JgF8S4Vxw==", "license": "MIT", "dependencies": { "react-native-is-edge-to-edge": "1.2.1", @@ -9339,6 +9587,16 @@ "react-native-worklets": ">=0.7.0" } }, + "node_modules/react-native-reanimated/node_modules/react-native-is-edge-to-edge": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/react-native-is-edge-to-edge/-/react-native-is-edge-to-edge-1.2.1.tgz", + "integrity": "sha512-FLbPWl/MyYQWz+KwqOZsSyj2JmLKglHatd3xLZWskXOpRaio4LfEDEz8E/A6uD8QoTHW6Aobw1jbEwK7KMgR7Q==", + "license": "MIT", + "peerDependencies": { + "react": "*", + "react-native": "*" + } + }, "node_modules/react-native-reanimated/node_modules/semver": { "version": "7.7.3", "resolved": "https://registry.npmmirror.com/semver/-/semver-7.7.3.tgz", @@ -9382,9 +9640,9 @@ "license": "MIT" }, "node_modules/react-native-tab-view": { - "version": "4.2.2", - "resolved": "https://registry.npmmirror.com/react-native-tab-view/-/react-native-tab-view-4.2.2.tgz", - "integrity": "sha512-NXtrG6OchvbGjsvbySJGVocXxo4Y2vA17ph4rAaWtA2jh+AasD8OyikKBRg2SmllEfeQ+GEhcKe8kulHv8BhTg==", + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/react-native-tab-view/-/react-native-tab-view-4.3.0.tgz", + "integrity": "sha512-qPMF75uz/7+MuVG2g+YETdGMzlWZnhC6iI4h/7EBbwIBwNBIBi2z4OA6KhY3IOOBwGHXEIz5IyA6doDqifYBHg==", "license": "MIT", "dependencies": { "use-latest-callback": "^0.2.4" @@ -9572,6 +9830,15 @@ } } }, + "node_modules/react-native/node_modules/babel-plugin-syntax-hermes-parser": { + "version": "0.32.0", + "resolved": "https://registry.npmmirror.com/babel-plugin-syntax-hermes-parser/-/babel-plugin-syntax-hermes-parser-0.32.0.tgz", + "integrity": "sha512-m5HthL++AbyeEA2FcdwOLfVFvWYECOBObLHNqdR8ceY4TsEdn4LdX2oTvbB2QJSSElE2AWA/b2MXZ/PF/CqLZg==", + "license": "MIT", + "dependencies": { + "hermes-parser": "0.32.0" + } + }, "node_modules/react-native/node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz", @@ -9618,6 +9885,21 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/react-native/node_modules/hermes-estree": { + "version": "0.32.0", + "resolved": "https://registry.npmmirror.com/hermes-estree/-/hermes-estree-0.32.0.tgz", + "integrity": "sha512-KWn3BqnlDOl97Xe1Yviur6NbgIZ+IP+UVSpshlZWkq+EtoHg6/cwiDj/osP9PCEgFE15KBm1O55JRwbMEm5ejQ==", + "license": "MIT" + }, + "node_modules/react-native/node_modules/hermes-parser": { + "version": "0.32.0", + "resolved": "https://registry.npmmirror.com/hermes-parser/-/hermes-parser-0.32.0.tgz", + "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==", + "license": "MIT", + "dependencies": { + "hermes-estree": "0.32.0" + } + }, "node_modules/react-native/node_modules/minimatch": { "version": "3.1.5", "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.5.tgz", @@ -9630,6 +9912,39 @@ "node": "*" } }, + "node_modules/react-native/node_modules/semver": { + "version": "7.7.4", + "resolved": "https://registry.npmmirror.com/semver/-/semver-7.7.4.tgz", + "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/react-native/node_modules/ws": { + "version": "7.5.10", + "resolved": "https://registry.npmmirror.com/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "license": "MIT", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/react-refresh": { "version": "0.14.2", "resolved": "https://registry.npmmirror.com/react-refresh/-/react-refresh-0.14.2.tgz", @@ -9834,16 +10149,17 @@ "license": "MIT" }, "node_modules/restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "devOptional": true, "license": "MIT", "dependencies": { - "onetime": "^2.0.0", + "onetime": "^5.1.0", "signal-exit": "^3.0.2" }, "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/reusify": { @@ -9974,9 +10290,9 @@ "license": "MIT" }, "node_modules/sax": { - "version": "1.4.4", - "resolved": "https://registry.npmmirror.com/sax/-/sax-1.4.4.tgz", - "integrity": "sha512-1n3r/tGXO6b6VXMdFT54SHzT9ytu9yr7TaELowdYpMqY/Ao7EnlQGmAQ1+RatX7Tkkdm6hONI2owqNx2aZj5Sw==", + "version": "1.6.0", + "resolved": "https://registry.npmmirror.com/sax/-/sax-1.6.0.tgz", + "integrity": "sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==", "license": "BlueOak-1.0.0", "engines": { "node": ">=11.0.0" @@ -9989,15 +10305,12 @@ "license": "MIT" }, "node_modules/semver": { - "version": "7.7.4", - "resolved": "https://registry.npmmirror.com/semver/-/semver-7.7.4.tgz", - "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "version": "6.3.1", + "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "license": "ISC", "bin": { "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" } }, "node_modules/send": { @@ -10048,16 +10361,16 @@ "node": ">= 0.8" } }, - "node_modules/send/node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmmirror.com/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "node_modules/send/node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmmirror.com/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", "license": "MIT", - "dependencies": { - "ee-first": "1.1.1" + "bin": { + "mime": "cli.js" }, "engines": { - "node": ">= 0.8" + "node": ">=4" } }, "node_modules/send/node_modules/statuses": { @@ -10277,6 +10590,12 @@ "is-arrayish": "^0.3.1" } }, + "node_modules/simple-swizzle/node_modules/is-arrayish": { + "version": "0.3.4", + "resolved": "https://registry.npmmirror.com/is-arrayish/-/is-arrayish-0.3.4.tgz", + "integrity": "sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA==", + "license": "MIT" + }, "node_modules/sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmmirror.com/sisteransi/-/sisteransi-1.0.5.tgz", @@ -10337,20 +10656,10 @@ "devOptional": true, "license": "MIT" }, - "node_modules/slice-ansi/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", - "devOptional": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/slugify": { - "version": "1.6.6", - "resolved": "https://registry.npmmirror.com/slugify/-/slugify-1.6.6.tgz", - "integrity": "sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw==", + "version": "1.6.8", + "resolved": "https://registry.npmmirror.com/slugify/-/slugify-1.6.8.tgz", + "integrity": "sha512-HVk9X1E0gz3mSpoi60h/saazLKXKaZThMLU3u/aNwoYn8/xQyX2MGxL0ui2eaokkD7tF+Zo+cKTHUbe1mmmGzA==", "license": "MIT", "engines": { "node": ">=8.0.0" @@ -10505,7 +10814,16 @@ "node": ">=8" } }, - "node_modules/strip-ansi": { + "node_modules/string-width/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", @@ -10517,6 +10835,27 @@ "node": ">=8" } }, + "node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-ansi/node_modules/ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/strip-final-newline": { "version": "2.0.0", "resolved": "https://registry.npmmirror.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz", @@ -10528,9 +10867,9 @@ } }, "node_modules/strnum": { - "version": "2.2.0", - "resolved": "https://registry.npmmirror.com/strnum/-/strnum-2.2.0.tgz", - "integrity": "sha512-Y7Bj8XyJxnPAORMZj/xltsfo55uOiyHcU2tnAVzHUnSJR/KsEX+9RoDeXEnsXtl/CX4fAcrt64gZ13aGaWPeBg==", + "version": "2.2.1", + "resolved": "https://registry.npmmirror.com/strnum/-/strnum-2.2.1.tgz", + "integrity": "sha512-BwRvNd5/QoAtyW1na1y1LsJGQNvRlkde6Q/ipqqEaivoMdV+B1OMOTVdwR+N/cwVUcIt9PYyHmV8HyexCZSupg==", "devOptional": true, "funding": [ { @@ -10589,6 +10928,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/tagged-tag": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/tagged-tag/-/tagged-tag-1.0.0.tgz", + "integrity": "sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==", + "license": "MIT", + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/terminal-link": { "version": "2.1.1", "resolved": "https://registry.npmmirror.com/terminal-link/-/terminal-link-2.1.1.tgz", @@ -10606,9 +10957,9 @@ } }, "node_modules/terser": { - "version": "5.46.0", - "resolved": "https://registry.npmmirror.com/terser/-/terser-5.46.0.tgz", - "integrity": "sha512-jTwoImyr/QbOWFFso3YoU3ik0jBBDJ6JTOQiy/J2YxVJdZCc+5u7skhNwiOR3FQIygFqVUPHl7qbbxtjW2K3Qg==", + "version": "5.46.1", + "resolved": "https://registry.npmmirror.com/terser/-/terser-5.46.1.tgz", + "integrity": "sha512-vzCjQO/rgUuK9sf8VJZvjqiqiHFaZLnOiimmUuOKODxWL8mm/xua7viT7aqX7dgPY60otQjUotzFMmCB4VdmqQ==", "license": "BSD-2-Clause", "dependencies": { "@jridgewell/source-map": "^0.3.3", @@ -10776,16 +11127,6 @@ "node": ">= 0.6" } }, - "node_modules/type-is/node_modules/mime-db": { - "version": "1.54.0", - "resolved": "https://registry.npmmirror.com/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", - "devOptional": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/type-is/node_modules/mime-types": { "version": "3.0.2", "resolved": "https://registry.npmmirror.com/mime-types/-/mime-types-3.0.2.tgz", @@ -11158,6 +11499,18 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmmirror.com/wrappy/-/wrappy-1.0.2.tgz", @@ -11178,24 +11531,13 @@ } }, "node_modules/ws": { - "version": "7.5.10", - "resolved": "https://registry.npmmirror.com/ws/-/ws-7.5.10.tgz", - "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "version": "6.2.3", + "resolved": "https://registry.npmmirror.com/ws/-/ws-6.2.3.tgz", + "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", + "devOptional": true, "license": "MIT", - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } + "dependencies": { + "async-limiter": "~1.0.0" } }, "node_modules/xcode": { @@ -11322,9 +11664,9 @@ } }, "node_modules/zustand": { - "version": "5.0.11", - "resolved": "https://registry.npmmirror.com/zustand/-/zustand-5.0.11.tgz", - "integrity": "sha512-fdZY+dk7zn/vbWNCYmzZULHRrss0jx5pPFiOuMZ/5HJN6Yv3u+1Wswy/4MpZEkEGhtNH+pwxZB8OKgUBPzYAGg==", + "version": "5.0.12", + "resolved": "https://registry.npmmirror.com/zustand/-/zustand-5.0.12.tgz", + "integrity": "sha512-i77ae3aZq4dhMlRhJVCYgMLKuSiZAaUPAct2AksxQ+gOtimhGMdXljRT21P5BNpeT4kXlLIckvkPM029OljD7g==", "license": "MIT", "engines": { "node": ">=12.20.0" @@ -11349,6 +11691,34 @@ "optional": true } } + }, + "node_modules/zxing-wasm": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/zxing-wasm/-/zxing-wasm-3.0.1.tgz", + "integrity": "sha512-3CLj6iaGkpqPWXAB4pIWkFOR63MwqGekpMzaROFKto4dFowiPmLlC56KoMoOSXzqOCOpI5DAvMdB8ku2va6fUg==", + "license": "MIT", + "dependencies": { + "@types/emscripten": "^1.41.5", + "type-fest": "^5.4.4" + }, + "peerDependencies": { + "@types/emscripten": ">=1.39.6" + } + }, + "node_modules/zxing-wasm/node_modules/type-fest": { + "version": "5.5.0", + "resolved": "https://registry.npmmirror.com/type-fest/-/type-fest-5.5.0.tgz", + "integrity": "sha512-PlBfpQwiUvGViBNX84Yxwjsdhd1TUlXr6zjX7eoirtCPIr08NAmxwa+fcYBTeRQxHo9YC9wwF3m9i700sHma8g==", + "license": "(MIT OR CC0-1.0)", + "dependencies": { + "tagged-tag": "^1.0.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } } } } diff --git a/screenshots/after-fix.png b/screenshots/after-fix.png deleted file mode 100644 index 2c352368355bb76dc996383facff166a30a7cb03..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 126583 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 diff --git a/screenshots/test-navigation-fix.png b/screenshots/test-navigation-fix.png deleted file mode 100644 index 060a68050f33d4168d51b7bfe6d7a8745acf750c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2877 zcmeAS@N?(olHy`uVBq!ia0y~yU~XYxV2a>i0*Y*1zQ2cof$Ni}i(^Q|oHy4Tc^M2i z7z{U^*`GS0aDJHU|95;03?la!7#v*O7#U8S&|qMYlw@U4P+rWykdh+8(9qMv#4urE zAOnMu5f_7l+o+<^AQ(*rqZwheEEp{gM{9)9N^!JZFxoU4jIBdUVB7cq|NX~qJOMJ; dK&@Y9hNrvOH%M!>yab9cc)I$ztaD0e0sy-%b@l)N diff --git a/src/components/business/QRCodeScanner.tsx b/src/components/business/QRCodeScanner.tsx new file mode 100644 index 0000000..5a007e7 --- /dev/null +++ b/src/components/business/QRCodeScanner.tsx @@ -0,0 +1,251 @@ +import React, { useState, useEffect } from 'react'; +import { + View, + Text, + StyleSheet, + TouchableOpacity, + Alert, + Modal, + Dimensions, +} from 'react-native'; +import { CameraView, useCameraPermissions } from 'expo-camera'; +import { MaterialCommunityIcons } from '@expo/vector-icons'; +import { useNavigation } from '@react-navigation/native'; +import { NativeStackNavigationProp } from '@react-navigation/native-stack'; +import { RootStackParamList } from '../../navigation/types'; +import { colors, spacing, fontSizes, borderRadius } from '../../theme'; + +const { width, height } = Dimensions.get('window'); + +type NavigationProp = NativeStackNavigationProp; + +interface QRCodeScannerProps { + visible: boolean; + onClose: () => void; +} + +export const QRCodeScanner: React.FC = ({ visible, onClose }) => { + const navigation = useNavigation(); + const [permission, requestPermission] = useCameraPermissions(); + const [scanned, setScanned] = useState(false); + + useEffect(() => { + if (visible) { + // 重置扫描状态,确保每次打开都能重新扫描 + setScanned(false); + if (!permission?.granted) { + requestPermission(); + } + } + }, [visible]); + + const handleBarCodeScanned = ({ type, data }: { type: string; data: string }) => { + if (scanned) return; + setScanned(true); + + // 先关闭扫描界面,类似微信的做法 + onClose(); + + // 解析二维码内容 + // 格式: carrotbbs://qrcode/login?session_id=xxx + if (data.startsWith('carrotbbs://qrcode/login')) { + const sessionId = extractSessionId(data); + if (sessionId) { + // 跳转到确认页面 + navigation.navigate('QRCodeConfirm', { sessionId }); + } else { + Alert.alert('无效的二维码', '无法识别该二维码'); + } + } else { + Alert.alert('无效的二维码', '请扫描网页端的登录二维码'); + } + }; + + const extractSessionId = (url: string): string | null => { + try { + const sessionIdMatch = url.match(/session_id=([^&]+)/); + return sessionIdMatch ? sessionIdMatch[1] : null; + } catch { + return null; + } + }; + + if (!permission?.granted) { + return ( + + + + + + + 扫码登录 + + + + + 需要相机权限才能扫码 + + 授予权限 + + + + + ); + } + + return ( + + + + + + + + + 扫码登录 + + + + + + + + + + + 将二维码放入框内即可扫描 + + + + {}}> + + + + + + + + ); +}; + +const styles = StyleSheet.create({ + container: { + flex: 1, + backgroundColor: '#000', + }, + camera: { + flex: 1, + }, + overlay: { + flex: 1, + backgroundColor: 'rgba(0,0,0,0.5)', + }, + header: { + flexDirection: 'row', + alignItems: 'center', + justifyContent: 'space-between', + paddingHorizontal: spacing.md, + paddingTop: spacing.xl, + paddingBottom: spacing.md, + }, + closeButton: { + padding: spacing.sm, + }, + headerTitle: { + fontSize: fontSizes.lg, + fontWeight: '600', + color: '#fff', + }, + placeholder: { + width: 40, + }, + scanArea: { + flex: 1, + justifyContent: 'center', + alignItems: 'center', + }, + scanFrame: { + width: width * 0.7, + height: width * 0.7, + position: 'relative', + }, + corner: { + position: 'absolute', + width: 20, + height: 20, + borderColor: colors.primary.main, + borderWidth: 3, + }, + topLeft: { + top: 0, + left: 0, + borderRightWidth: 0, + borderBottomWidth: 0, + }, + topRight: { + top: 0, + right: 0, + borderLeftWidth: 0, + borderBottomWidth: 0, + }, + bottomLeft: { + bottom: 0, + left: 0, + borderRightWidth: 0, + borderTopWidth: 0, + }, + bottomRight: { + bottom: 0, + right: 0, + borderLeftWidth: 0, + borderTopWidth: 0, + }, + scanText: { + marginTop: spacing.lg, + fontSize: fontSizes.md, + color: '#fff', + textAlign: 'center', + }, + footer: { + padding: spacing.xl, + alignItems: 'center', + }, + flashButton: { + padding: spacing.md, + backgroundColor: 'rgba(255,255,255,0.2)', + borderRadius: borderRadius.full, + }, + permissionContainer: { + flex: 1, + justifyContent: 'center', + alignItems: 'center', + padding: spacing.xl, + }, + permissionText: { + marginTop: spacing.lg, + fontSize: fontSizes.md, + color: '#666', + textAlign: 'center', + }, + permissionButton: { + marginTop: spacing.xl, + paddingVertical: spacing.md, + paddingHorizontal: spacing.xl, + backgroundColor: colors.primary.main, + borderRadius: borderRadius.md, + }, + permissionButtonText: { + color: '#fff', + fontSize: fontSizes.md, + fontWeight: '600', + }, +}); + +export default QRCodeScanner; \ No newline at end of file diff --git a/src/navigation/MainNavigator.tsx b/src/navigation/MainNavigator.tsx index 4d0dbea..9f864c7 100644 --- a/src/navigation/MainNavigator.tsx +++ b/src/navigation/MainNavigator.tsx @@ -22,7 +22,7 @@ import { useAuthStore } from '../stores'; // Deep linking 配置 const linking: LinkingOptions = { - prefixes: [], + prefixes: ['carrotbbs://'], config: { screens: { Auth: { @@ -63,6 +63,7 @@ const linking: LinkingOptions = { CreatePost: 'posts/create', Chat: 'chat/:conversationId', FollowList: 'users/:userId/:type', + QRCodeConfirm: 'qrcode/login/:sessionId', }, }, }; diff --git a/src/navigation/RootNavigator.tsx b/src/navigation/RootNavigator.tsx index c996800..05d072a 100644 --- a/src/navigation/RootNavigator.tsx +++ b/src/navigation/RootNavigator.tsx @@ -23,6 +23,7 @@ import { PostDetailScreen } from '../screens/home'; import { UserScreen } from '../screens/profile'; import FollowListScreen from '../screens/profile/FollowListScreen'; import { CreatePostScreen } from '../screens/create'; +import { QRCodeConfirmScreen } from '../screens/auth/QRCodeConfirmScreen'; import { ChatScreen, CreateGroupScreen, @@ -210,6 +211,15 @@ const getAuthenticatedScreens = () => [ animation: 'slide_from_right', }} />, + , ]; export function RootNavigator({ isAuthenticated, isInitializing }: RootNavigatorProps) { diff --git a/src/navigation/SimpleMobileTabNavigator.tsx b/src/navigation/SimpleMobileTabNavigator.tsx index 4045aa6..1591417 100644 --- a/src/navigation/SimpleMobileTabNavigator.tsx +++ b/src/navigation/SimpleMobileTabNavigator.tsx @@ -1,6 +1,6 @@ /** * 简单的移动端 Tab Navigator - * + * * 不使用 React Navigation 的 Tab Navigator,而是使用一个简单的自定义实现 * 这样可以完全避免 React Navigation 状态恢复的问题 */ @@ -15,6 +15,7 @@ import { } from 'react-native'; import { useSafeAreaInsets } from 'react-native-safe-area-context'; import { MaterialCommunityIcons } from '@expo/vector-icons'; +import { createNativeStackNavigator } from '@react-navigation/native-stack'; import { colors, shadows } from '../theme'; import { useTotalUnreadCount } from '../stores'; @@ -33,6 +34,15 @@ import { ProfileScreen, SettingsScreen, EditProfileScreen, NotificationSettingsS // ==================== 类型定义 ==================== type TabName = 'HomeTab' | 'MessageTab' | 'ScheduleTab' | 'ProfileTab'; +// Schedule Stack 类型定义 +export type ScheduleStackParamList = { + Schedule: undefined; + CourseDetail: { course: any; relatedCourses?: any[] }; +}; + +// ==================== Stack Navigators ==================== +const ScheduleStack = createNativeStackNavigator(); + // ==================== 常量 ==================== const TAB_BAR_HEIGHT = 64; const TAB_BAR_MARGIN = 14; @@ -41,19 +51,32 @@ const TAB_BAR_FLOATING_MARGIN = 12; // ==================== 组件 ==================== /** - * 简化的 Stack Navigator 包装 + * Schedule Stack Navigator 组件 */ -function SimpleStackNavigator({ - children, - screenName -}: { - children: React.ReactNode; - screenName: string; -}) { +function ScheduleStackNavigatorComponent() { return ( - - {children} - + + + + ); } @@ -83,7 +106,7 @@ export function SimpleMobileTabNavigator() { case 'MessageTab': return ; case 'ScheduleTab': - return ; + return ; case 'ProfileTab': return ; default: diff --git a/src/navigation/types.ts b/src/navigation/types.ts index 450f8ef..c8c7862 100644 --- a/src/navigation/types.ts +++ b/src/navigation/types.ts @@ -106,6 +106,7 @@ export type RootStackParamList = { userName?: string; userAvatar?: string | null; }; + QRCodeConfirm: { sessionId: string }; }; // ==================== 全局类型声明 ==================== diff --git a/src/presentation/hooks/responsive/MIGRATION.md b/src/presentation/hooks/responsive/MIGRATION.md deleted file mode 100644 index 7eb181c..0000000 --- a/src/presentation/hooks/responsive/MIGRATION.md +++ /dev/null @@ -1,223 +0,0 @@ -# useResponsive 拆分迁移指南 - -## 概述 - -原有的 `useResponsive.ts` (485行) 已被拆分为多个专注的 hooks,以提高代码的可维护性和性能。 - -## 新目录结构 - -``` -src/presentation/hooks/responsive/ -├── types.ts # 共享类型定义 -├── useBreakpoint.ts # 断点检测 -├── useScreenSize.ts # 屏幕尺寸 -├── useOrientation.ts # 方向检测 -├── usePlatform.ts # 平台检测 -├── useResponsiveValue.ts # 响应式值映射 -├── useResponsiveSpacing.ts # 响应式间距 -├── useColumnCount.ts # 列数计算 -├── useMediaQuery.ts # 媒体查询 -├── useBreakpointCheck.ts # 断点范围检查 (兼容层) -├── useResponsive.ts # 兼容层 (保持向后兼容) -└── index.ts # 统一导出 -``` - -## 新 Hook API 说明 - -### useBreakpoint - 断点检测 - -```typescript -import { useBreakpoint, useFineBreakpoint } from '../presentation/hooks/responsive'; - -// 基础断点: 'mobile' | 'tablet' | 'desktop' | 'wide' -const breakpoint = useBreakpoint(); - -// 细粒度断点: 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl' | '4xl' -const fineBreakpoint = useFineBreakpoint(); -``` - -### useScreenSize - 屏幕尺寸 - -```typescript -import { useScreenSize, useWindowDimensions } from '../presentation/hooks/responsive'; - -// 完整屏幕尺寸信息 -const { - width, height, - breakpoint, fineBreakpoint, - isMobile, isTablet, isDesktop, isWide -} = useScreenSize(); - -// 仅获取窗口尺寸 -const { width, height, scale, fontScale } = useWindowDimensions(); -``` - -### useOrientation - 方向检测 - -```typescript -import { useOrientation } from '../presentation/hooks/responsive'; - -const { orientation, isPortrait, isLandscape } = useOrientation(); -``` - -### usePlatform - 平台检测 - -```typescript -import { usePlatform } from '../presentation/hooks/responsive'; - -const { OS, isWeb, isIOS, isAndroid, isNative } = usePlatform(); -``` - -### useResponsiveValue - 响应式值 - -```typescript -import { useResponsiveValue } from '../presentation/hooks/responsive'; - -// 根据断点返回不同值 -const padding = useResponsiveValue({ xs: 8, md: 16, lg: 24 }); - -// 响应式样式 -const style = useResponsiveStyle({ - padding: { xs: 8, md: 16, lg: 24 }, - fontSize: { xs: 14, lg: 16 } -}); -``` - -### useResponsiveSpacing - 响应式间距 - -```typescript -import { useResponsiveSpacing } from '../presentation/hooks/responsive'; - -const gap = useResponsiveSpacing({ xs: 8, md: 16, lg: 24 }); -``` - -### useColumnCount - 列数计算 - -```typescript -import { useColumnCount } from '../presentation/hooks/responsive'; - -const columns = useColumnCount({ xs: 1, sm: 2, md: 3, lg: 4 }); -``` - -### useBreakpointGTE / useBreakpointLT - 断点范围检查 - -```typescript -import { useBreakpointGTE, useBreakpointLT, useBreakpointBetween } from '../presentation/hooks/responsive'; - -const isMediumUp = useBreakpointGTE('md'); -const isMobileOnly = useBreakpointLT('lg'); -const isTabletRange = useBreakpointBetween('md', 'lg'); -``` - -### useMediaQuery - 媒体查询 - -```typescript -import { useMediaQuery } from '../presentation/hooks/responsive'; - -const isMinWidth768 = useMediaQuery({ minWidth: 768 }); -const isPortrait = useMediaQuery({ orientation: 'portrait' }); -``` - -## 迁移示例 - -### 示例 1: 使用 useResponsive (旧) - -```typescript -import { useResponsive, useResponsiveValue, useResponsiveSpacing } from '../hooks'; - -function Component() { - const { width, isMobile, isTablet, isDesktop, isWide } = useResponsive(); - const padding = useResponsiveSpacing({ xs: 8, md: 16 }); - - return ; -} -``` - -### 示例 2: 使用新专注 hooks (推荐) - -```typescript -import { - useScreenSize, - useResponsiveSpacing -} from '../presentation/hooks/responsive'; - -function Component() { - const { width, isMobile, isTablet, isDesktop, isWide } = useScreenSize(); - const padding = useResponsiveSpacing({ xs: 8, md: 16 }); - - return ; -} -``` - -### 示例 3: 仅使用部分功能 (性能优化) - -```typescript -import { useBreakpoint, usePlatform } from '../presentation/hooks/responsive'; - -function Component() { - // 只订阅断点变化,不订阅尺寸变化 - const breakpoint = useBreakpoint(); - const { isIOS } = usePlatform(); // 平台不会变化,只计算一次 - - return ; -} -``` - -## 性能优势 - -1. **按需订阅**: 只使用需要的功能,避免不必要的重渲染 -2. **细粒度更新**: 每个 hook 独立管理状态 -3. **平台常量**: usePlatform 返回常量,不会触发重渲染 - -## 向后兼容 - -原有的 `useResponsive` 仍然可用,但标记为 `@deprecated`: - -```typescript -import { useResponsive } from '../hooks'; // 仍然可用 - -function Component() { - const { width, height, isMobile, platform } = useResponsive(); // 仍然可用 - return ; -} -``` - -## 工具函数 - -```typescript -import { - getBreakpoint, - getFineBreakpoint, - isBreakpointGTE, - isBreakpointLT -} from '../presentation/hooks/responsive'; - -// 非 hooks 版本,用于工具函数 -const breakpoint = getBreakpoint(800); -const fineBreakpoint = getFineBreakpoint(800); -const isGTE = isBreakpointGTE('md', 'sm'); -``` - -## 类型导出 - -```typescript -import type { - BreakpointKey, - FineBreakpointKey, - ResponsiveValue, - Orientation, - PlatformInfo, - ScreenSize, - MediaQueryOptions, - ResponsiveInfo, // 兼容层 -} from '../presentation/hooks/responsive'; -``` - -## 常量 - -```typescript -import { BREAKPOINTS, FINE_BREAKPOINTS } from '../presentation/hooks/responsive'; - -// BREAKPOINTS = { mobile: 0, tablet: 768, desktop: 1024, wide: 1440 } -// FINE_BREAKPOINTS = { xs: 0, sm: 375, md: 414, lg: 768, xl: 1024, '2xl': 1280, '3xl': 1440, '4xl': 1920 } -``` diff --git a/src/screens/auth/LoginScreen.tsx b/src/screens/auth/LoginScreen.tsx index 711bcfb..000e7e6 100644 --- a/src/screens/auth/LoginScreen.tsx +++ b/src/screens/auth/LoginScreen.tsx @@ -188,7 +188,7 @@ export const LoginScreen: React.FC = () => { {/* 品牌名称 - 优化大屏排版 */} - 胡萝卜 + 萝卜社区 发现有趣的内容,结识志同道合的朋友 {/* 装饰元素 - 大屏模式改为水平排列 + 大幅放大 */} @@ -431,7 +431,7 @@ export const LoginScreen: React.FC = () => { color="#FFF" /> - 胡萝卜 + 萝卜社区 发现有趣的内容,结识志同道合的朋友 diff --git a/src/screens/auth/QRCodeConfirmScreen.tsx b/src/screens/auth/QRCodeConfirmScreen.tsx new file mode 100644 index 0000000..6d6ce38 --- /dev/null +++ b/src/screens/auth/QRCodeConfirmScreen.tsx @@ -0,0 +1,288 @@ +import React, { useState, useEffect } from 'react'; +import { + View, + Text, + StyleSheet, + TouchableOpacity, + Image, + ActivityIndicator, + Alert, +} from 'react-native'; +import { SafeAreaView } from 'react-native-safe-area-context'; +import { MaterialCommunityIcons } from '@expo/vector-icons'; +import { useRoute, useNavigation, RouteProp } from '@react-navigation/native'; +import { NativeStackNavigationProp } from '@react-navigation/native-stack'; +import { RootStackParamList } from '../../navigation/types'; +import { qrcodeApi } from '../../services/authService'; +import { colors, spacing, fontSizes, borderRadius } from '../../theme'; + +type QRCodeConfirmRouteProp = RouteProp; +type NavigationProp = NativeStackNavigationProp; + +export const QRCodeConfirmScreen: React.FC = () => { + const route = useRoute(); + const navigation = useNavigation(); + const { sessionId } = route.params; + + const [loading, setLoading] = useState(false); + const [userInfo, setUserInfo] = useState<{ id: string; nickname: string; avatar: string } | null>(null); + const [error, setError] = useState(null); + + useEffect(() => { + // 扫码 + handleScan(); + }, []); + + const handleScan = async () => { + try { + setLoading(true); + const response = await qrcodeApi.scan(sessionId); + setUserInfo(response.user); + } catch (err: any) { + const errorMsg = err.response?.data?.message || '扫码失败'; + setError(errorMsg); + Alert.alert('扫码失败', errorMsg, [ + { text: '确定', onPress: () => navigation.goBack() } + ]); + } finally { + setLoading(false); + } + }; + + const handleConfirm = async () => { + try { + setLoading(true); + await qrcodeApi.confirm(sessionId); + Alert.alert('登录成功', '网页端已登录', [ + { text: '确定', onPress: () => navigation.goBack() } + ]); + } catch (err: any) { + const errorMsg = err.response?.data?.message || '确认登录失败'; + Alert.alert('登录失败', errorMsg); + } finally { + setLoading(false); + } + }; + + const handleCancel = async () => { + try { + await qrcodeApi.cancel(sessionId); + } catch (err) { + // 忽略取消错误 + } + navigation.goBack(); + }; + + if (loading && !userInfo) { + return ( + + + + 正在扫码... + + + ); + } + + if (error) { + return ( + + + + {error} + navigation.goBack()}> + 返回 + + + + ); + } + + return ( + + + + + + 确认登录 + + + + + + 您正在登录网页端 + + {userInfo && ( + + {userInfo.avatar ? ( + + ) : ( + + + + )} + {userInfo.nickname} + + )} + + + + + {loading ? ( + + ) : ( + 确认登录 + )} + + + + 取消 + + + + + ); +}; + +const styles = StyleSheet.create({ + container: { + flex: 1, + backgroundColor: '#f5f5f5', + }, + header: { + flexDirection: 'row', + alignItems: 'center', + justifyContent: 'space-between', + paddingHorizontal: spacing.md, + paddingVertical: spacing.sm, + backgroundColor: '#fff', + borderBottomWidth: 1, + borderBottomColor: '#eee', + }, + closeButton: { + padding: spacing.sm, + }, + headerTitle: { + fontSize: fontSizes.lg, + fontWeight: '600', + color: '#333', + }, + placeholder: { + width: 40, + }, + content: { + flex: 1, + padding: spacing.lg, + justifyContent: 'center', + }, + infoCard: { + backgroundColor: '#fff', + borderRadius: borderRadius.lg, + padding: spacing.xl, + alignItems: 'center', + marginBottom: spacing.xl, + shadowColor: '#000', + shadowOffset: { width: 0, height: 2 }, + shadowOpacity: 0.1, + shadowRadius: 4, + elevation: 3, + }, + infoText: { + fontSize: fontSizes.md, + color: '#666', + marginBottom: spacing.lg, + }, + userInfo: { + alignItems: 'center', + }, + avatar: { + width: 80, + height: 80, + borderRadius: 40, + marginBottom: spacing.md, + }, + avatarPlaceholder: { + width: 80, + height: 80, + borderRadius: 40, + backgroundColor: '#f0f0f0', + justifyContent: 'center', + alignItems: 'center', + marginBottom: spacing.md, + }, + nickname: { + fontSize: fontSizes.lg, + fontWeight: '600', + color: '#333', + }, + buttonContainer: { + gap: spacing.md, + }, + button: { + paddingVertical: spacing.md, + paddingHorizontal: spacing.xl, + borderRadius: borderRadius.md, + alignItems: 'center', + }, + confirmButton: { + backgroundColor: colors.primary.main, + }, + confirmButtonText: { + color: '#fff', + fontSize: fontSizes.md, + fontWeight: '600', + }, + cancelButton: { + backgroundColor: '#fff', + borderWidth: 1, + borderColor: '#ddd', + }, + cancelButtonText: { + color: '#666', + fontSize: fontSizes.md, + }, + loadingContainer: { + flex: 1, + justifyContent: 'center', + alignItems: 'center', + }, + loadingText: { + marginTop: spacing.md, + fontSize: fontSizes.md, + color: '#666', + }, + errorContainer: { + flex: 1, + justifyContent: 'center', + alignItems: 'center', + padding: spacing.xl, + }, + errorText: { + marginTop: spacing.md, + fontSize: fontSizes.md, + color: '#666', + textAlign: 'center', + }, + backButton: { + marginTop: spacing.xl, + paddingVertical: spacing.md, + paddingHorizontal: spacing.xl, + backgroundColor: colors.primary.main, + borderRadius: borderRadius.md, + }, + backButtonText: { + color: '#fff', + fontSize: fontSizes.md, + fontWeight: '600', + }, +}); + +export default QRCodeConfirmScreen; \ No newline at end of file diff --git a/src/screens/auth/RegisterScreen.tsx b/src/screens/auth/RegisterScreen.tsx index 12f9794..d6fa740 100644 --- a/src/screens/auth/RegisterScreen.tsx +++ b/src/screens/auth/RegisterScreen.tsx @@ -268,8 +268,8 @@ export const RegisterScreen: React.FC = () => { {/* 品牌名称 - 优化大屏排版 */} - 创建账号 - 加入胡萝卜,开始你的旅程 + 加入萝卜社区 + 加入萝卜社区,发现有趣的内容 {/* 装饰元素 - 大屏模式改为水平排列 + 大幅放大 */} @@ -720,8 +720,8 @@ export const RegisterScreen: React.FC = () => { color="#FFF" /> - 创建账号 - 加入胡萝卜,开始你的旅程 + 加入萝卜社区 + 加入萝卜社区,发现有趣的内容 {/* 表单 */} diff --git a/src/screens/message/ChatScreen.tsx b/src/screens/message/ChatScreen.tsx index 3bf4b36..5dafe28 100644 --- a/src/screens/message/ChatScreen.tsx +++ b/src/screens/message/ChatScreen.tsx @@ -19,15 +19,15 @@ * - ChatInput.tsx: 输入框组件 */ -import React, { useState, useEffect, useMemo, useCallback } from 'react'; +import React, { useState, useEffect, useMemo, useCallback, useRef } from 'react'; import { View, - FlatList, TouchableWithoutFeedback, ActivityIndicator, KeyboardAvoidingView, Platform, } from 'react-native'; +import { FlashList } from "@shopify/flash-list"; import { useNavigation } from '@react-navigation/native'; import { StatusBar } from 'expo-status-bar'; import { useSafeAreaInsets } from 'react-native-safe-area-context'; @@ -224,6 +224,7 @@ export const ChatScreen: React.FC = () => { formatTime={formatTime} shouldShowTime={shouldShowTime} onImagePress={handleImagePress} + onReply={handleReplyMessage} /> ); @@ -268,25 +269,23 @@ export const ChatScreen: React.FC = () => { ) : ( - String(item.id)} - contentContainerStyle={listContentStyle} + keyExtractor={(item: any) => String(item.id)} + contentContainerStyle={listContentStyle as any} showsVerticalScrollIndicator={false} keyboardShouldPersistTaps="handled" refreshing={loadingMore} onRefresh={hasMoreHistory ? loadMoreHistory : undefined} - progressViewOffset={0} - onContentSizeChange={handleMessageListContentSizeChange} + // @ts-ignore FlashList 类型定义问题:estimatedItemSize 是必需属性但类型定义缺失 + estimatedItemSize={80} + maintainVisibleContentPosition={{ + minIndexForVisible: 0, + autoscrollToTopThreshold: undefined, + } as any} onScroll={handleMessageListScroll} - scrollEventThrottle={16} - // 优化渲染性能 - initialNumToRender={15} - maxToRenderPerBatch={10} - windowSize={10} - removeClippedSubviews={true} /> )} diff --git a/src/screens/message/MessageListScreen.tsx b/src/screens/message/MessageListScreen.tsx index 217ca1d..943538f 100644 --- a/src/screens/message/MessageListScreen.tsx +++ b/src/screens/message/MessageListScreen.tsx @@ -42,6 +42,8 @@ import { getUserCache } from '../../services/database'; import { EmbeddedChat } from './components/EmbeddedChat'; // 导入 NotificationsScreen 用于在内部显示 import { NotificationsScreen } from './NotificationsScreen'; +// 导入扫码组件 +import { QRCodeScanner } from '../../components/business/QRCodeScanner'; type NavigationProp = NativeStackNavigationProp; type MessageNavProp = NativeStackNavigationProp; @@ -182,6 +184,7 @@ export const MessageListScreen: React.FC = () => { const [isSearching, setIsSearching] = useState(false); const [activeSearchTab, setActiveSearchTab] = useState<'chat' | 'user'>('chat'); const [actionMenuVisible, setActionMenuVisible] = useState(false); + const [scannerVisible, setScannerVisible] = useState(false); // 系统通知显示状态 - 用于在移动端显示通知页面 const [showNotifications, setShowNotifications] = useState(false); @@ -356,7 +359,7 @@ export const MessageListScreen: React.FC = () => { setActionMenuVisible(true); }; - const runMenuAction = (action: 'join' | 'create' | 'readAll') => { + const runMenuAction = (action: 'join' | 'create' | 'readAll' | 'scanQRCode') => { setActionMenuVisible(false); if (action === 'join') { handleJoinGroup(); @@ -366,6 +369,10 @@ export const MessageListScreen: React.FC = () => { handleCreateGroup(); return; } + if (action === 'scanQRCode') { + setScannerVisible(true); + return; + } handleMarkAllRead(); }; @@ -911,6 +918,10 @@ export const MessageListScreen: React.FC = () => { setActionMenuVisible(false)}> setActionMenuVisible(false)}> + runMenuAction('scanQRCode')}> + + 扫码登录 + runMenuAction('join')}> 加入群聊 @@ -980,6 +991,7 @@ export const MessageListScreen: React.FC = () => { renderConversationList() )} {renderActionMenu()} + setScannerVisible(false)} /> ); }; diff --git a/src/screens/message/components/ChatScreen/MessageBubble.tsx b/src/screens/message/components/ChatScreen/MessageBubble.tsx index 8f39a5b..bd1ada6 100644 --- a/src/screens/message/components/ChatScreen/MessageBubble.tsx +++ b/src/screens/message/components/ChatScreen/MessageBubble.tsx @@ -4,7 +4,7 @@ * 支持响应式布局(宽屏下优化显示) */ -import React, { useRef, useMemo } from 'react'; +import React, { useRef, useMemo, useCallback } from 'react'; import { View, TouchableOpacity, @@ -22,6 +22,14 @@ import { useResponsive, useBreakpointGTE } from '../../../../hooks/useResponsive import { MessageBubbleProps, SenderInfo, MenuPosition, GroupMessage } from './types'; import { MessageSegmentsRenderer } from './SegmentRenderer'; import { MessageSegment, ImageSegmentData, extractTextFromSegments } from '../../../../types/dto'; +import { SwipeableMessageBubble } from './SwipeableMessageBubble'; +import { + getBubbleBorderRadius, + getMessageGroupPosition, + shouldShowSenderInfo, + bubbleColors, + bubbleStyles, +} from './bubbleStyles'; // 获取屏幕宽度 const { width: SCREEN_WIDTH } = Dimensions.get('window'); @@ -50,6 +58,7 @@ export const MessageBubble: React.FC = ({ formatTime, shouldShowTime, onImagePress, + onReply, }) => { const bubbleRef = useRef(null); const pressPositionRef = useRef({ x: 0, y: 0 }); @@ -343,6 +352,13 @@ export const MessageBubble: React.FC = ({ ); }; + // 处理滑动回复 + const handleSwipeReply = useCallback(() => { + if (onReply) { + onReply(message); + } + }, [onReply, message]); + // 系统通知消息渲染 if (isSystemNotice) { return ( @@ -361,7 +377,8 @@ export const MessageBubble: React.FC = ({ ); } - return ( + // 消息内容渲染 + const messageContent = ( = ({ ); + + // 使用 SwipeableMessageBubble 包裹消息内容 + return ( + + {messageContent} + + ); }; // Segment 消息的特殊样式 - 自适应宽度 @@ -460,4 +488,16 @@ const segmentStyles = StyleSheet.create({ }, }); -export default MessageBubble; +// 使用 React.memo 优化渲染性能 +export default React.memo(MessageBubble, (prevProps, nextProps) => { + // 自定义比较逻辑:只比较关键属性 + return ( + prevProps.message.id === nextProps.message.id && + prevProps.message.status === nextProps.message.status && + prevProps.selectedMessageId === nextProps.selectedMessageId && + prevProps.currentUserId === nextProps.currentUserId && + prevProps.isGroupChat === nextProps.isGroupChat && + prevProps.otherUserLastReadSeq === nextProps.otherUserLastReadSeq && + prevProps.index === nextProps.index + ); +}); diff --git a/src/screens/message/components/ChatScreen/SegmentRenderer.tsx b/src/screens/message/components/ChatScreen/SegmentRenderer.tsx index a7d92e0..a8eaa7c 100644 --- a/src/screens/message/components/ChatScreen/SegmentRenderer.tsx +++ b/src/screens/message/components/ChatScreen/SegmentRenderer.tsx @@ -290,6 +290,7 @@ const ImageSegment: React.FC<{ contentFit="cover" cachePolicy="disk" priority="normal" + transition={200} onError={() => { setLoadError(true); }} diff --git a/src/screens/message/components/ChatScreen/SwipeableMessageBubble.tsx b/src/screens/message/components/ChatScreen/SwipeableMessageBubble.tsx new file mode 100644 index 0000000..21dd0b6 --- /dev/null +++ b/src/screens/message/components/ChatScreen/SwipeableMessageBubble.tsx @@ -0,0 +1,157 @@ +/** + * 可滑动的消息气泡容器 + * 实现滑动回复手势功能 - 严格单向滑动,无抖动 + */ + +import React, { useRef, useCallback } from 'react'; +import { View, StyleSheet, Animated } from 'react-native'; +import { MaterialCommunityIcons } from '@expo/vector-icons'; +import { PanGestureHandler, State } from 'react-native-gesture-handler'; +import * as Haptics from 'expo-haptics'; +import { colors } from '../../../../theme'; + +// 滑动阈值 +const SWIPE_THRESHOLD = 30; +const MAX_SWIPE_DISTANCE = 50; + +interface SwipeableMessageBubbleProps { + children: React.ReactNode; + isMe: boolean; + onReply: () => void; + enabled?: boolean; +} + +export const SwipeableMessageBubble: React.FC = ({ + children, + isMe, + onReply, + enabled = true, +}) => { + const translateX = useRef(new Animated.Value(0)).current; + const hasTriggeredRef = useRef(false); + + // 处理手势事件 - 使用原生驱动,不干预值 + const onGestureEvent = Animated.event( + [{ nativeEvent: { translationX: translateX } }], + { useNativeDriver: true } + ); + + // 处理手势状态变化 + const onHandlerStateChange = useCallback((event: any) => { + const { nativeEvent } = event; + + if (nativeEvent.state === State.END) { + const translationX = nativeEvent.translationX; + + // 只允许特定方向的滑动 + const shouldTrigger = isMe + ? translationX < -SWIPE_THRESHOLD // 自己消息只能向左滑 + : translationX > SWIPE_THRESHOLD; // 对方消息只能向右滑 + + if (shouldTrigger && !hasTriggeredRef.current) { + hasTriggeredRef.current = true; + + // 触觉反馈 + Haptics.impactAsync(Haptics.ImpactFeedbackStyle.Light); + + // 立即触发回复 + onReply(); + + // 重置标记 + setTimeout(() => { + hasTriggeredRef.current = false; + }, 300); + } + + // 立即回到原位 + translateX.setValue(0); + } + }, [isMe, onReply]); + + // 计算回复图标的透明度 - 只在允许的方向显示 + const iconOpacity = translateX.interpolate({ + inputRange: isMe + ? [-MAX_SWIPE_DISTANCE, -SWIPE_THRESHOLD, 0, 10] + : [-10, 0, SWIPE_THRESHOLD, MAX_SWIPE_DISTANCE], + outputRange: isMe ? [1, 0.8, 0, 0] : [0, 0, 0.8, 1], + extrapolate: 'clamp', + }); + + // 计算消息的位移 - 限制在允许的方向 + const clampedTranslateX = translateX.interpolate({ + inputRange: isMe + ? [-MAX_SWIPE_DISTANCE - 10, -MAX_SWIPE_DISTANCE, 0, 10] + : [-10, 0, MAX_SWIPE_DISTANCE, MAX_SWIPE_DISTANCE + 10], + outputRange: isMe + ? [-MAX_SWIPE_DISTANCE, -MAX_SWIPE_DISTANCE, 0, 0] + : [0, 0, MAX_SWIPE_DISTANCE, MAX_SWIPE_DISTANCE], + extrapolate: 'clamp', + }); + + // 如果禁用手势,直接返回子元素 + if (!enabled) { + return <>{children}; + } + + return ( + + {/* 回复图标 - 在消息后面 */} + + + + + {/* 可滑动的消息内容 */} + + + {children} + + + + ); +}; + +const styles = StyleSheet.create({ + container: { + position: 'relative', + }, + replyIconContainer: { + position: 'absolute', + top: '50%', + marginTop: -15, + width: 30, + height: 30, + borderRadius: 15, + backgroundColor: 'rgba(255, 107, 53, 0.1)', + alignItems: 'center', + justifyContent: 'center', + }, + replyIconLeft: { + left: 8, + }, + replyIconRight: { + right: 8, + }, +}); + +export default SwipeableMessageBubble; \ No newline at end of file diff --git a/src/screens/message/components/ChatScreen/bubbleStyles.ts b/src/screens/message/components/ChatScreen/bubbleStyles.ts new file mode 100644 index 0000000..1739007 --- /dev/null +++ b/src/screens/message/components/ChatScreen/bubbleStyles.ts @@ -0,0 +1,270 @@ +/** + * 消息气泡样式工具 + * 参考 Element X 设计,实现动态圆角和现代化气泡样式 + */ + +import { StyleSheet, ViewStyle, TextStyle } from 'react-native'; +import { colors, spacing } from '../../../../theme'; + +// 气泡圆角大小(参考 Element X: 12pt) +export const BUBBLE_RADIUS = 16; + +// 气泡颜色方案(参考 Element X 的语义化颜色) +export const bubbleColors = { + // 自己发送的消息 + outgoing: { + background: '#E8E8E8', // Element X 风格:灰色系 + text: '#1A1A1A', + }, + // 收到的消息 + incoming: { + background: '#FFFFFF', + text: '#1A1A1A', + }, + // 被回复的消息高亮 + replyHighlight: { + background: 'rgba(255, 107, 53, 0.08)', + borderLeft: '#FF6B35', + }, +}; + +// 消息在组中的位置类型 +export type MessageGroupPosition = 'single' | 'first' | 'middle' | 'last'; + +/** + * 根据消息在组中的位置获取圆角样式 + * 参考 Element X 的动态圆角逻辑 + */ +export const getBubbleBorderRadius = ( + isMe: boolean, + position: MessageGroupPosition +): ViewStyle => { + const radius = BUBBLE_RADIUS; + + if (isMe) { + // 自己发送的消息 + switch (position) { + case 'single': + return { + borderTopLeftRadius: radius, + borderTopRightRadius: radius, + borderBottomLeftRadius: radius, + borderBottomRightRadius: 4, // 尖角在右下 + }; + case 'first': + return { + borderTopLeftRadius: radius, + borderTopRightRadius: radius, + borderBottomLeftRadius: radius, + borderBottomRightRadius: 4, + }; + case 'middle': + return { + borderTopLeftRadius: radius, + borderTopRightRadius: 4, + borderBottomLeftRadius: radius, + borderBottomRightRadius: 4, + }; + case 'last': + return { + borderTopLeftRadius: radius, + borderTopRightRadius: 4, + borderBottomLeftRadius: radius, + borderBottomRightRadius: radius, + }; + } + } else { + // 收到的消息 + switch (position) { + case 'single': + return { + borderTopLeftRadius: 4, // 尖角在左上 + borderTopRightRadius: radius, + borderBottomLeftRadius: radius, + borderBottomRightRadius: radius, + }; + case 'first': + return { + borderTopLeftRadius: 4, + borderTopRightRadius: radius, + borderBottomLeftRadius: 4, + borderBottomRightRadius: radius, + }; + case 'middle': + return { + borderTopLeftRadius: 4, + borderTopRightRadius: radius, + borderBottomLeftRadius: 4, + borderBottomRightRadius: radius, + }; + case 'last': + return { + borderTopLeftRadius: radius, + borderTopRightRadius: radius, + borderBottomLeftRadius: radius, + borderBottomRightRadius: radius, + }; + } + } +}; + +/** + * 判断消息在组中的位置 + */ +export const getMessageGroupPosition = ( + index: number, + messages: Array<{ sender_id: string }>, + currentUserId: string +): MessageGroupPosition => { + const currentMessage = messages[index]; + if (!currentMessage) return 'single'; + + const prevMessage = index > 0 ? messages[index - 1] : null; + const nextMessage = index < messages.length - 1 ? messages[index + 1] : null; + + const isSameSenderAsPrev = prevMessage && prevMessage.sender_id === currentMessage.sender_id; + const isSameSenderAsNext = nextMessage && nextMessage.sender_id === currentMessage.sender_id; + + if (!isSameSenderAsPrev && !isSameSenderAsNext) { + return 'single'; + } else if (!isSameSenderAsPrev && isSameSenderAsNext) { + return 'first'; + } else if (isSameSenderAsPrev && isSameSenderAsNext) { + return 'middle'; + } else { + return 'last'; + } +}; + +/** + * 判断是否显示发送者信息(只在组的第一条消息显示) + */ +export const shouldShowSenderInfo = ( + index: number, + messages: Array<{ sender_id: string }>, +): boolean => { + if (index === 0) return true; + + const currentMessage = messages[index]; + const prevMessage = messages[index - 1]; + + return prevMessage.sender_id !== currentMessage.sender_id; +}; + +/** + * 获取气泡基础样式 + */ +export const getBubbleBaseStyle = (isMe: boolean): ViewStyle => ({ + paddingHorizontal: spacing.md, + paddingVertical: spacing.sm + 4, + minWidth: 60, + maxWidth: '75%', + backgroundColor: isMe ? bubbleColors.outgoing.background : bubbleColors.incoming.background, + // Element X 风格的微妙阴影 + shadowColor: '#000', + shadowOffset: { width: 0, height: 1 }, + shadowOpacity: 0.06, + shadowRadius: 2, + elevation: 2, +}); + +/** + * 获取文本样式 + */ +export const getBubbleTextStyle = (isMe: boolean): TextStyle => ({ + color: isMe ? bubbleColors.outgoing.text : bubbleColors.incoming.text, + fontSize: 16, + lineHeight: 23, + letterSpacing: 0.2, + fontWeight: '400', +}); + +/** + * 消息气泡样式集合 + */ +export const bubbleStyles = StyleSheet.create({ + // 基础气泡 + bubble: { + paddingHorizontal: spacing.md, + paddingVertical: spacing.sm + 4, + minWidth: 60, + }, + + // 自己发送的消息 + outgoing: { + backgroundColor: bubbleColors.outgoing.background, + }, + + // 收到的消息 + incoming: { + backgroundColor: bubbleColors.incoming.background, + }, + + // 文本样式 + text: { + fontSize: 16, + lineHeight: 23, + letterSpacing: 0.2, + fontWeight: '400', + }, + + // 阴影样式(Element X 风格) + shadow: { + shadowColor: '#000', + shadowOffset: { width: 0, height: 1 }, + shadowOpacity: 0.06, + shadowRadius: 2, + elevation: 2, + }, + + // 长按反馈阴影 + longPressShadow: { + shadowColor: '#000', + shadowOffset: { width: 0, height: 3 }, + shadowOpacity: 0.12, + shadowRadius: 8, + elevation: 6, + }, + + // 被回复消息的高亮边框 + replyHighlight: { + borderLeftWidth: 3, + borderLeftColor: colors.primary.main, + backgroundColor: bubbleColors.replyHighlight.background, + }, + + // 已撤回消息 + recalled: { + backgroundColor: '#F5F7FA', + borderWidth: 1, + borderColor: '#E8E8E8', + borderStyle: 'dashed', + borderRadius: 12, + }, + + // 系统通知 + systemNotice: { + alignItems: 'center', + marginVertical: spacing.sm, + }, + systemNoticeText: { + fontSize: 12, + color: '#8E8E93', + backgroundColor: 'rgba(142, 142, 147, 0.12)', + paddingHorizontal: spacing.md, + paddingVertical: spacing.xs, + borderRadius: 12, + overflow: 'hidden', + }, +}); + +export default { + BUBBLE_RADIUS, + bubbleColors, + getBubbleBorderRadius, + getMessageGroupPosition, + shouldShowSenderInfo, + getBubbleBaseStyle, + getBubbleTextStyle, + bubbleStyles, +}; \ No newline at end of file diff --git a/src/screens/message/components/ChatScreen/index.ts b/src/screens/message/components/ChatScreen/index.ts index c905b0f..10661fb 100644 --- a/src/screens/message/components/ChatScreen/index.ts +++ b/src/screens/message/components/ChatScreen/index.ts @@ -20,6 +20,7 @@ export { ChatHeader } from './ChatHeader'; export { MessageBubble } from './MessageBubble'; export { ChatInput } from './ChatInput'; export { GroupInfoPanel } from './GroupInfoPanel'; +export { SwipeableMessageBubble } from './SwipeableMessageBubble'; // Segment 渲染组件 export { diff --git a/src/screens/message/components/ChatScreen/types.ts b/src/screens/message/components/ChatScreen/types.ts index ea704fa..191e43a 100644 --- a/src/screens/message/components/ChatScreen/types.ts +++ b/src/screens/message/components/ChatScreen/types.ts @@ -86,6 +86,8 @@ export interface MessageBubbleProps { shouldShowTime: (index: number) => boolean; // 图片点击回调 onImagePress?: (images: { id: string; url: string; thumbnail_url?: string; width?: number; height?: number }[], index: number) => void; + // 滑动回复回调 + onReply?: (message: GroupMessage) => void; } // 输入框 Props @@ -180,6 +182,14 @@ export interface ReplyPreviewProps { onCancel: () => void; } +// 可滑动消息气泡 Props +export interface SwipeableMessageBubbleProps { + children: React.ReactNode; + isMe: boolean; + onReply: () => void; + enabled?: boolean; +} + // ChatScreen 状态接口 export interface ChatScreenState { // 基础状态 diff --git a/src/screens/message/components/ChatScreen/useChatScreen.ts b/src/screens/message/components/ChatScreen/useChatScreen.ts index 33ab6e7..77351b6 100644 --- a/src/screens/message/components/ChatScreen/useChatScreen.ts +++ b/src/screens/message/components/ChatScreen/useChatScreen.ts @@ -390,6 +390,16 @@ export const useChatScreen = () => { return; } + // 禁用自动滚动到底部,防止加载历史消息后滚动位置跳转 + shouldAutoScrollOnEnterRef.current = false; + // 清除所有待执行的自动滚动定时器 + autoScrollTimersRef.current.forEach(clearTimeout); + autoScrollTimersRef.current = []; + + // 保存加载前的滚动位置和内容高度 + const scrollYBefore = scrollPositionRef.current.scrollY; + const contentHeightBefore = scrollPositionRef.current.contentHeight; + setLoadingMore(true); try { @@ -400,6 +410,23 @@ export const useChatScreen = () => { const minSeq = Math.min(...messages.map(m => m.seq)); setFirstSeq(minSeq); } + + // 加载完成后,恢复滚动位置 + // 使用 setTimeout 确保 FlashList 已经更新 + setTimeout(() => { + if (flatListRef.current) { + // 计算新的滚动位置,保持相对位置不变 + const newContentHeight = scrollPositionRef.current.contentHeight; + const heightDiff = newContentHeight - contentHeightBefore; + const newScrollY = scrollYBefore + heightDiff; + + // 滚动到计算后的位置 + flatListRef.current.scrollToOffset({ + offset: newScrollY, + animated: false, + }); + } + }, 100); } catch (error) { console.error('加载历史消息失败:', error); } finally { @@ -409,13 +436,19 @@ export const useChatScreen = () => { // 列表内容尺寸变化后触发首次自动滚动 const handleMessageListContentSizeChange = useCallback((contentWidth: number, contentHeight: number) => { + // 如果是加载更多历史消息,不要自动滚动 + if (loadingMore) { + return; + } + if (!shouldAutoScrollOnEnterRef.current) return; - if (loading || loadingMore) return; + if (loading) return; if (messages.length === 0) return; const prevContentHeight = scrollPositionRef.current.contentHeight; scrollPositionRef.current.contentHeight = contentHeight; + // 如果内容高度增加(加载了更多消息),不要自动滚动到底部 if (prevContentHeight > 0 && contentHeight > prevContentHeight) { return; } diff --git a/src/screens/profile/SettingsScreen.tsx b/src/screens/profile/SettingsScreen.tsx index 4273225..e61abc4 100644 --- a/src/screens/profile/SettingsScreen.tsx +++ b/src/screens/profile/SettingsScreen.tsx @@ -15,6 +15,7 @@ import { import { SafeAreaView } from 'react-native-safe-area-context'; import { useNavigation } from '@react-navigation/native'; import { MaterialCommunityIcons } from '@expo/vector-icons'; +import Constants from 'expo-constants'; import { colors, spacing, fontSizes, borderRadius } from '../../theme'; import { useAuthStore } from '../../stores'; import { Text, ResponsiveContainer } from '../../components/common'; @@ -30,6 +31,9 @@ interface SettingsItem { subtitle?: string; } +// 获取应用版本号 +const APP_VERSION = Constants.expoConfig?.version || '1.0.0'; + // 设置分组配置 const SETTINGS_GROUPS = [ { @@ -53,7 +57,7 @@ const SETTINGS_GROUPS = [ title: '关于与帮助', icon: 'information-outline', items: [ - { key: 'about', title: '关于我们', icon: 'information-outline', showArrow: true, subtitle: '版本 1.0.2' }, + { key: 'about', title: '关于我们', icon: 'information-outline', showArrow: true, subtitle: `版本 ${APP_VERSION}` }, { key: 'help', title: '帮助与反馈', icon: 'help-circle-outline', showArrow: true }, ], }, @@ -183,7 +187,7 @@ export const SettingsScreen: React.FC = () => { {/* 底部版权信息 */} - 萝卜社区 v1.0.2 + 萝卜社区 v{APP_VERSION} © 2024 Carrot BBS. All rights reserved. diff --git a/src/services/authService.ts b/src/services/authService.ts index c4055d5..fa28a9d 100644 --- a/src/services/authService.ts +++ b/src/services/authService.ts @@ -432,5 +432,63 @@ class AuthService { } } +// ── 二维码登录相关接口 ── + +export interface QRCodeSession { + session_id: string; + qrcode_url: string; + expires_in: number; + expires_at: number; +} + +export interface ScanResponse { + user: { + id: string; + nickname: string; + avatar: string; + }; +} + +// 二维码登录 API(扩展 AuthService) +export const qrcodeApi = { + /** + * 获取二维码 + */ + getQRCode: async (): Promise => { + const response = await api.get('/auth/qrcode'); + return response.data; + }, + + /** + * 扫描二维码 + */ + scan: async (sessionId: string): Promise => { + const response = await api.post('/auth/qrcode/scan', { + session_id: sessionId, + }); + return response.data; + }, + + /** + * 确认登录 + */ + confirm: async (sessionId: string): Promise<{ success: boolean }> => { + const response = await api.post<{ success: boolean }>('/auth/qrcode/confirm', { + session_id: sessionId, + }); + return response.data; + }, + + /** + * 取消登录 + */ + cancel: async (sessionId: string): Promise<{ success: boolean }> => { + const response = await api.post<{ success: boolean }>('/auth/qrcode/cancel', { + session_id: sessionId, + }); + return response.data; + }, +}; + // 导出认证服务实例 export const authService = new AuthService(); diff --git a/src/utils/__tests__/optimisticUpdate.test.ts b/src/utils/__tests__/optimisticUpdate.test.ts deleted file mode 100644 index 39081d7..0000000 --- a/src/utils/__tests__/optimisticUpdate.test.ts +++ /dev/null @@ -1,287 +0,0 @@ -/** - * 乐观更新工具函数测试 - */ - -import { optimisticUpdate, simpleOptimisticUpdate, createOptimisticUpdaterFactory } from '../optimisticUpdate'; - -// 模拟数据 -interface TestState { - posts: Array<{ id: string; likes: number; isLiked: boolean }>; - users: Array<{ id: string; isFollowing: boolean }>; -} - -const initialState: TestState = { - posts: [ - { id: '1', likes: 10, isLiked: false }, - { id: '2', likes: 5, isLiked: true }, - ], - users: [ - { id: 'user1', isFollowing: false }, - { id: 'user2', isFollowing: true }, - ], -}; - -describe('optimisticUpdate', () => { - let currentState: TestState; - - beforeEach(() => { - currentState = JSON.parse(JSON.stringify(initialState)); - }); - - describe('成功场景', () => { - it('应该执行乐观更新并在API成功后保持更新', async () => { - const mockApiCall = jest.fn().mockResolvedValue({ success: true, likes: 11 }); - - const result = await optimisticUpdate({ - getState: () => currentState, - optimisticUpdate: (state) => ({ - ...state, - posts: state.posts.map((p) => - p.id === '1' ? { ...p, likes: p.likes + 1, isLiked: true } : p - ), - }), - apiCall: mockApiCall, - onSuccess: (result, current) => ({ - ...current, - posts: current.posts.map((p) => - p.id === '1' ? { ...p, likes: result.likes } : p - ), - }), - }); - - // 验证API被调用 - expect(mockApiCall).toHaveBeenCalledTimes(1); - // 验证返回结果 - expect(result).toEqual({ success: true, likes: 11 }); - }); - - it('应该在乐观更新后立即改变状态', async () => { - const mockApiCall = jest.fn().mockImplementation(() => { - // 在API调用期间验证状态已被乐观更新 - expect(currentState.posts[0].isLiked).toBe(true); - expect(currentState.posts[0].likes).toBe(11); - return Promise.resolve({ success: true }); - }); - - await optimisticUpdate({ - getState: () => currentState, - optimisticUpdate: (state) => { - const newState = { - ...state, - posts: state.posts.map((p) => - p.id === '1' ? { ...p, likes: p.likes + 1, isLiked: true } : p - ), - }; - currentState = newState; // 模拟状态更新 - return newState; - }, - apiCall: mockApiCall, - }); - }); - }); - - describe('失败回滚场景', () => { - it('应该在API失败时回滚到原始状态', async () => { - const mockApiCall = jest.fn().mockRejectedValue(new Error('Network error')); - const onError = jest.fn((error, original) => original); - - const result = await optimisticUpdate({ - getState: () => currentState, - optimisticUpdate: (state) => ({ - ...state, - posts: state.posts.map((p) => - p.id === '1' ? { ...p, likes: p.likes + 1, isLiked: true } : p - ), - }), - apiCall: mockApiCall, - onError, - errorMessage: '点赞失败', - }); - - // 验证API被调用 - expect(mockApiCall).toHaveBeenCalledTimes(1); - // 验证onError被调用 - expect(onError).toHaveBeenCalledTimes(1); - expect(onError).toHaveBeenCalledWith( - expect.any(Error), - initialState - ); - // 验证返回undefined(因为失败了) - expect(result).toBeUndefined(); - }); - - it('应该在静默模式下不抛出错误', async () => { - const mockApiCall = jest.fn().mockRejectedValue(new Error('Network error')); - - // 不应该抛出错误 - await expect( - optimisticUpdate({ - getState: () => currentState, - optimisticUpdate: (state) => state, - apiCall: mockApiCall, - silent: true, - }) - ).resolves.toBeUndefined(); - }); - - it('应该在非静默模式下抛出错误', async () => { - const mockApiCall = jest.fn().mockRejectedValue(new Error('Network error')); - - // 应该抛出错误 - await expect( - optimisticUpdate({ - getState: () => currentState, - optimisticUpdate: (state) => state, - apiCall: mockApiCall, - silent: false, - }) - ).rejects.toThrow('Network error'); - }); - }); - - describe('错误处理', () => { - it('应该记录错误日志', async () => { - const consoleSpy = jest.spyOn(console, 'error').mockImplementation(); - const mockApiCall = jest.fn().mockRejectedValue(new Error('API Error')); - - await optimisticUpdate({ - getState: () => currentState, - optimisticUpdate: (state) => state, - apiCall: mockApiCall, - errorMessage: '自定义错误消息', - silent: true, - }); - - expect(consoleSpy).toHaveBeenCalledWith('自定义错误消息:', expect.any(Error)); - - consoleSpy.mockRestore(); - }); - }); -}); - -describe('simpleOptimisticUpdate', () => { - let currentState: TestState; - let setStateMock: jest.Mock; - - beforeEach(() => { - currentState = JSON.parse(JSON.stringify(initialState)); - setStateMock = jest.fn((newState) => { - currentState = newState; - }); - }); - - it('应该成功执行乐观更新', async () => { - const mockApiCall = jest.fn().mockResolvedValue(undefined); - - await simpleOptimisticUpdate({ - getState: () => currentState, - setState: setStateMock, - optimisticUpdate: (state) => ({ - ...state, - posts: state.posts.map((p) => - p.id === '1' ? { ...p, likes: p.likes + 1 } : p - ), - }), - rollbackState: (original) => original, - apiCall: mockApiCall, - }); - - expect(mockApiCall).toHaveBeenCalledTimes(1); - expect(setStateMock).toHaveBeenCalledTimes(1); - }); - - it('应该在失败时回滚状态', async () => { - const mockApiCall = jest.fn().mockRejectedValue(new Error('Error')); - const rollbackMock = jest.fn((original) => original); - - await simpleOptimisticUpdate({ - getState: () => currentState, - setState: setStateMock, - optimisticUpdate: (state) => ({ - ...state, - posts: state.posts.map((p) => - p.id === '1' ? { ...p, likes: p.likes + 1 } : p - ), - }), - rollbackState: rollbackMock, - apiCall: mockApiCall, - silent: true, - }); - - // 验证乐观更新和回滚都被调用 - expect(setStateMock).toHaveBeenCalledTimes(2); - expect(rollbackMock).toHaveBeenCalledWith(initialState); - }); -}); - -describe('createOptimisticUpdaterFactory', () => { - interface StoreState { - posts: Array<{ id: string; likes: number }>; - count: number; - } - - let storeState: StoreState; - let setMock: jest.Mock; - let getMock: jest.Mock; - - beforeEach(() => { - storeState = { - posts: [{ id: '1', likes: 10 }], - count: 0, - }; - setMock = jest.fn((fn) => { - storeState = fn(storeState); - }); - getMock = jest.fn(() => storeState); - }); - - it('应该创建乐观更新器并正常工作', async () => { - const optimisticUpdater = createOptimisticUpdaterFactory(setMock, getMock); - const mockApiCall = jest.fn().mockResolvedValue(undefined); - - await optimisticUpdater({ - key: 'posts', - optimisticUpdate: (posts) => - posts.map((p) => (p.id === '1' ? { ...p, likes: p.likes + 1 } : p)), - rollbackState: (original) => original, - apiCall: mockApiCall, - }); - - expect(mockApiCall).toHaveBeenCalledTimes(1); - expect(setMock).toHaveBeenCalledTimes(1); - expect(storeState.posts[0].likes).toBe(11); - }); - - it('应该在API失败时回滚状态', async () => { - const optimisticUpdater = createOptimisticUpdaterFactory(setMock, getMock); - const mockApiCall = jest.fn().mockRejectedValue(new Error('Error')); - - await optimisticUpdater({ - key: 'posts', - optimisticUpdate: (posts) => - posts.map((p) => (p.id === '1' ? { ...p, likes: p.likes + 1 } : p)), - rollbackState: (original) => original, - apiCall: mockApiCall, - silent: true, - }); - - // 乐观更新 + 回滚 = 2次set调用 - expect(setMock).toHaveBeenCalledTimes(2); - // 最终状态应该和初始状态一样 - expect(storeState.posts[0].likes).toBe(10); - }); - - it('应该处理不同的state key', async () => { - const optimisticUpdater = createOptimisticUpdaterFactory(setMock, getMock); - const mockApiCall = jest.fn().mockResolvedValue(undefined); - - await optimisticUpdater({ - key: 'count', - optimisticUpdate: (count) => count + 1, - rollbackState: (original) => original, - apiCall: mockApiCall, - }); - - expect(storeState.count).toBe(1); - }); -});