diff --git a/App.js b/App.js index b4cc909..cbfb115 100644 --- a/App.js +++ b/App.js @@ -1,29 +1,21 @@ import 'react-native-gesture-handler'; -import React, { useEffect } from 'react'; +import React from 'react'; import { LogBox } from 'react-native'; import { GestureHandlerRootView } from 'react-native-gesture-handler'; import { SafeAreaProvider } from 'react-native-safe-area-context'; -import ErrorBoundary from './src/components/ErrorBoundary'; import NovaAlertProvider from './src/components/NovaAlert'; import AppNavigator from './src/navigation/AppNavigator'; -import { initCrashlytics } from './src/services/crashlytics'; LogBox.ignoreLogs(['TypeError: Network request failed']); export default function App() { - useEffect(() => { - initCrashlytics(); - }, []); - return ( - - - - - - - - - + + + + + + + ); } diff --git a/app.json b/app.json index 601d973..0023b22 100644 --- a/app.json +++ b/app.json @@ -14,16 +14,14 @@ }, "ios": { "supportsTablet": true, - "bundleIdentifier": "com.nova40.app", - "googleServicesFile": "./GoogleService-Info.plist" + "bundleIdentifier": "com.heyaciell.nova40" }, "android": { "adaptiveIcon": { "foregroundImage": "./assets/adaptive-icon.png", "backgroundColor": "#0A0E1A" }, - "package": "com.nova40.app", - "googleServicesFile": "./google-services.json", + "package": "com.heyaciell.nova40", "permissions": [ "WRITE_EXTERNAL_STORAGE", "READ_EXTERNAL_STORAGE" @@ -33,9 +31,18 @@ "favicon": "./assets/favicon.png" }, "plugins": [ - "@react-native-firebase/app", - "@react-native-firebase/crashlytics", - "expo-web-browser" + "expo-web-browser", + "@react-native-google-signin/google-signin", + [ + "react-native-fbsdk-next", + { + "appID": "1003904135650335", + "clientToken": "7d79de6ad89e838d6f452feabdbaeb7f", + "displayName": "Nova40", + "scheme": "fb1003904135650335" + } + ], + "expo-sharing" ], "extra": { "eas": { diff --git a/assets/adaptive-icon.png b/assets/adaptive-icon.png index 9997193..3a62fb3 100644 Binary files a/assets/adaptive-icon.png and b/assets/adaptive-icon.png differ diff --git a/assets/favicon.png b/assets/favicon.png index 51ea185..158a3ed 100644 Binary files a/assets/favicon.png and b/assets/favicon.png differ diff --git a/assets/icon.png b/assets/icon.png index 9997193..3a62fb3 100644 Binary files a/assets/icon.png and b/assets/icon.png differ diff --git a/assets/icon_square.png b/assets/icon_square.png index 9997193..3a62fb3 100644 Binary files a/assets/icon_square.png and b/assets/icon_square.png differ diff --git a/assets/splash-icon.png b/assets/splash-icon.png index 070d568..3a62fb3 100644 Binary files a/assets/splash-icon.png and b/assets/splash-icon.png differ diff --git a/package-lock.json b/package-lock.json index 079f1c8..146f78b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,55 +10,39 @@ "dependencies": { "@expo/config-plugins": "^55.0.8", "@react-native-async-storage/async-storage": "2.2.0", - "@react-native-firebase/analytics": "^24.0.0", - "@react-native-firebase/app": "^24.0.0", - "@react-native-firebase/crashlytics": "^24.0.0", + "@react-native-google-signin/google-signin": "^16.1.2", "@react-navigation/bottom-tabs": "^7.15.9", "@react-navigation/native": "^7.2.2", "@react-navigation/native-stack": "^7.14.11", "@supabase/ssr": "^0.10.2", "@supabase/supabase-js": "^2.103.0", - "babel-preset-expo": "~54.0.10", - "expo": "~54.0.0", - "expo-auth-session": "~7.0.11", - "expo-crypto": "~15.0.9", - "expo-dev-client": "~6.0.21", - "expo-image-picker": "~17.0.11", - "expo-linear-gradient": "~15.0.8", - "expo-media-library": "~18.2.1", - "expo-print": "~15.0.8", - "expo-sharing": "~14.0.8", - "expo-status-bar": "~3.0.9", - "expo-web-browser": "~15.0.11", - "react": "19.1.0", - "react-native": "0.81.5", - "react-native-gesture-handler": "~2.28.0", - "react-native-reanimated": "~4.1.1", + "babel-preset-expo": "~55.0.8", + "expo": "^55.0.23", + "expo-auth-session": "~55.0.15", + "expo-crypto": "~55.0.14", + "expo-dev-client": "~55.0.32", + "expo-image-picker": "~55.0.20", + "expo-linear-gradient": "~55.0.13", + "expo-media-library": "~55.0.16", + "expo-print": "~55.0.14", + "expo-sharing": "~55.0.18", + "expo-status-bar": "~55.0.6", + "expo-web-browser": "~55.0.15", + "react": "19.2.0", + "react-native": "0.83.6", + "react-native-fbsdk-next": "^13.4.3", + "react-native-gesture-handler": "~2.30.0", "react-native-safe-area-context": "~5.6.0", - "react-native-screens": "~4.16.0", + "react-native-screens": "~4.23.0", "react-native-url-polyfill": "^3.0.0", "react-native-view-shot": "4.0.3", "zustand": "^5.0.12" }, "devDependencies": { - "@types/react": "~19.1.10", + "@types/react": "~19.2.10", "typescript": "~5.9.2" } }, - "node_modules/@0no-co/graphql.web": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@0no-co/graphql.web/-/graphql.web-1.2.0.tgz", - "integrity": "sha512-/1iHy9TTr63gE1YcR5idjx8UREz1s0kFhydf3bBLCXyqjhkIc6igAzTOx3zPifCwFR87tsh/4Pa9cNts6d2otw==", - "license": "MIT", - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0" - }, - "peerDependenciesMeta": { - "graphql": { - "optional": true - } - } - }, "node_modules/@babel/code-frame": { "version": "7.29.0", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", @@ -420,83 +404,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/highlight": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.25.9.tgz", - "integrity": "sha512-llL88JShoCsth8fF8R4SJnIn+WLvR6ccFxu1H3FlMhDontdcmZWf2HgIZ7AIqV3Xcck1idlohrN4EUBQz6klbw==", - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.25.9", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/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/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/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/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/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/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "license": "MIT" - }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/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/@babel/parser": { "version": "7.29.2", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.2.tgz", @@ -1410,22 +1317,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.27.1.tgz", - "integrity": "sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-transform-typescript": { "version": "7.28.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.28.6.tgz", @@ -1541,25 +1432,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/traverse--for-generate-function-map": { - "name": "@babel/traverse", - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", - "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.29.0", - "@babel/generator": "^7.29.0", - "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.29.0", - "@babel/template": "^7.28.6", - "@babel/types": "^7.29.0", - "debug": "^4.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/types": { "version": "7.29.0", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", @@ -1594,27 +1466,6 @@ "node-forge": "^1.3.3" } }, - "node_modules/@expo/config": { - "version": "12.0.13", - "resolved": "https://registry.npmjs.org/@expo/config/-/config-12.0.13.tgz", - "integrity": "sha512-Cu52arBa4vSaupIWsF0h7F/Cg//N374nYb7HAxV0I4KceKA7x2UXpYaHOL7EEYYvp7tZdThBjvGpVmr8ScIvaQ==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "~7.10.4", - "@expo/config-plugins": "~54.0.4", - "@expo/config-types": "^54.0.10", - "@expo/json-file": "^10.0.8", - "deepmerge": "^4.3.1", - "getenv": "^2.0.0", - "glob": "^13.0.0", - "require-from-string": "^2.0.2", - "resolve-from": "^5.0.0", - "resolve-workspace-root": "^2.0.0", - "semver": "^7.6.0", - "slugify": "^1.3.4", - "sucrase": "~3.35.1" - } - }, "node_modules/@expo/config-plugins": { "version": "55.0.8", "resolved": "https://registry.npmjs.org/@expo/config-plugins/-/config-plugins-55.0.8.tgz", @@ -1642,54 +1493,6 @@ "integrity": "sha512-sCmSUZG4mZ/ySXvfyyBdhjivz8Q539X1NondwDdYG7s3SBsk+wsgPJzYsqgAG/P9+l0xWjUD2F+kQ1cAJ6NNLg==", "license": "MIT" }, - "node_modules/@expo/config/node_modules/@babel/code-frame": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", - "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", - "license": "MIT", - "dependencies": { - "@babel/highlight": "^7.10.4" - } - }, - "node_modules/@expo/config/node_modules/@expo/config-plugins": { - "version": "54.0.4", - "resolved": "https://registry.npmjs.org/@expo/config-plugins/-/config-plugins-54.0.4.tgz", - "integrity": "sha512-g2yXGICdoOw5i3LkQSDxl2Q5AlQCrG7oniu0pCPPO+UxGb7He4AFqSvPSy8HpRUj55io17hT62FTjYRD+d6j3Q==", - "license": "MIT", - "dependencies": { - "@expo/config-types": "^54.0.10", - "@expo/json-file": "~10.0.8", - "@expo/plist": "^0.4.8", - "@expo/sdk-runtime-versions": "^1.0.0", - "chalk": "^4.1.2", - "debug": "^4.3.5", - "getenv": "^2.0.0", - "glob": "^13.0.0", - "resolve-from": "^5.0.0", - "semver": "^7.5.4", - "slash": "^3.0.0", - "slugify": "^1.6.6", - "xcode": "^3.0.1", - "xml2js": "0.6.0" - } - }, - "node_modules/@expo/config/node_modules/@expo/config-types": { - "version": "54.0.10", - "resolved": "https://registry.npmjs.org/@expo/config-types/-/config-types-54.0.10.tgz", - "integrity": "sha512-/J16SC2an1LdtCZ67xhSkGXpALYUVUNyZws7v+PVsFZxClYehDSoKLqyRaGkpHlYrCc08bS0RF5E0JV6g50psA==", - "license": "MIT" - }, - "node_modules/@expo/config/node_modules/@expo/plist": { - "version": "0.4.8", - "resolved": "https://registry.npmjs.org/@expo/plist/-/plist-0.4.8.tgz", - "integrity": "sha512-pfNtErGGzzRwHP+5+RqswzPDKkZrx+Cli0mzjQaus1ZWFsog5ibL+nVT3NcporW51o8ggnt7x813vtRbPiyOrQ==", - "license": "MIT", - "dependencies": { - "@xmldom/xmldom": "^0.8.8", - "base64-js": "^1.2.3", - "xmlbuilder": "^15.1.1" - } - }, "node_modules/@expo/devcert": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/@expo/devcert/-/devcert-1.2.1.tgz", @@ -1710,9 +1513,9 @@ } }, "node_modules/@expo/devtools": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/@expo/devtools/-/devtools-0.1.8.tgz", - "integrity": "sha512-SVLxbuanDjJPgc0sy3EfXUMLb/tXzp6XIHkhtPVmTWJAp+FOr6+5SeiCfJrCzZFet0Ifyke2vX3sFcKwEvCXwQ==", + "version": "55.0.3", + "resolved": "https://registry.npmjs.org/@expo/devtools/-/devtools-55.0.3.tgz", + "integrity": "sha512-KoIDgo0NoXeWLsIcOdZqtAG/1LlsM+JL0DA3bo0vCYaOYTBLXi/ZvRBqa20Ub8D2vKLNa+FgRQW0gRg04Ps1Pg==", "license": "MIT", "dependencies": { "chalk": "^4.1.2" @@ -1731,24 +1534,26 @@ } }, "node_modules/@expo/env": { - "version": "2.0.11", - "resolved": "https://registry.npmjs.org/@expo/env/-/env-2.0.11.tgz", - "integrity": "sha512-xV+ps6YCW7XIPVUwFVCRN2nox09dnRwy8uIjwHWTODu0zFw4kp4omnVkl0OOjuu2XOe7tdgAHxikrkJt9xB/7Q==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@expo/env/-/env-2.1.2.tgz", + "integrity": "sha512-RJtGFfj/ygO/6zcVbV3cckHf4THcEkv5IZft1GjCB3dfT6axvzvIwXE9EiQqQYmGHcQ+ZrvC8xZcIhiHba0pYg==", "license": "MIT", "dependencies": { "chalk": "^4.0.0", "debug": "^4.3.4", - "dotenv": "~16.4.5", - "dotenv-expand": "~11.0.6", "getenv": "^2.0.0" + }, + "engines": { + "node": ">=20.12.0" } }, "node_modules/@expo/fingerprint": { - "version": "0.15.5", - "resolved": "https://registry.npmjs.org/@expo/fingerprint/-/fingerprint-0.15.5.tgz", - "integrity": "sha512-mdVoAMcux1WlM6kd1RoWiHRNqKqS+J6mKmWQ/BKgeh937S/fcW58EE68O6nc4KDXtWi3PBeNHskOFcgyIuD4hw==", + "version": "0.16.7", + "resolved": "https://registry.npmjs.org/@expo/fingerprint/-/fingerprint-0.16.7.tgz", + "integrity": "sha512-BH8sicYOqZ1iBMwCVEGIz6uTTfylosjc49FoMmCYIzKOiYdiVehsfoYBwyfxwWIiya1VMhm1gv0cgOP8fxHpDw==", "license": "MIT", "dependencies": { + "@expo/env": "^2.1.2", "@expo/spawn-async": "^1.7.2", "arg": "^5.0.2", "chalk": "^4.1.2", @@ -1757,7 +1562,6 @@ "glob": "^13.0.0", "ignore": "^5.3.1", "minimatch": "^10.2.2", - "p-limit": "^3.1.0", "resolve-from": "^5.0.0", "semver": "^7.6.0" }, @@ -1766,12 +1570,12 @@ } }, "node_modules/@expo/image-utils": { - "version": "0.8.13", - "resolved": "https://registry.npmjs.org/@expo/image-utils/-/image-utils-0.8.13.tgz", - "integrity": "sha512-1I//yBQeTY6p0u1ihqGNDAr35EbSG8uFEupFrIF0jd++h9EWH33521yZJU1yE+mwGlzCb61g3ehu78siMhXBlA==", + "version": "0.8.14", + "resolved": "https://registry.npmjs.org/@expo/image-utils/-/image-utils-0.8.14.tgz", + "integrity": "sha512-5Sn+jG4Cw+shC2wDMXoqSAJnvERbiwzHn05FpWtD5IBflfTIs5gUmjzwiGVyjOdlMSQhgRrw/AymPbmO9h9mpQ==", "license": "MIT", "dependencies": { - "@expo/require-utils": "^55.0.4", + "@expo/require-utils": "^55.0.5", "@expo/spawn-async": "^1.7.2", "chalk": "^4.0.0", "getenv": "^2.0.0", @@ -1781,322 +1585,69 @@ } }, "node_modules/@expo/json-file": { - "version": "10.0.13", - "resolved": "https://registry.npmjs.org/@expo/json-file/-/json-file-10.0.13.tgz", - "integrity": "sha512-pX/XjQn7tgNw6zuuV2ikmegmwe/S7uiwhrs2wXrANMkq7ozrA+JcZwgW9Q/8WZgciBzfAhNp5hnackHcrmapQA==", + "version": "10.0.14", + "resolved": "https://registry.npmjs.org/@expo/json-file/-/json-file-10.0.14.tgz", + "integrity": "sha512-yWwBFywFv+SxkJp/pIzzA416JVYflNUh7pqQzgaA6nXDqRyK7KfrqVzk8PdUfDnqbBcaZZxpzNssfQZzp5KHrA==", "license": "MIT", "dependencies": { "@babel/code-frame": "^7.20.0", "json5": "^2.2.3" } }, + "node_modules/@expo/local-build-cache-provider": { + "version": "55.0.12", + "resolved": "https://registry.npmjs.org/@expo/local-build-cache-provider/-/local-build-cache-provider-55.0.12.tgz", + "integrity": "sha512-Wqhe7ajt6lyIEQvqDC1zm0MQ1RqQLlM9awCepY9pz+tm9rvhuxGPZTSddWeD8k4kolinBlDbLDFnNi06XgaDWQ==", + "license": "MIT", + "dependencies": { + "@expo/config": "~55.0.16", + "chalk": "^4.1.2" + } + }, + "node_modules/@expo/local-build-cache-provider/node_modules/@expo/config": { + "version": "55.0.16", + "resolved": "https://registry.npmjs.org/@expo/config/-/config-55.0.16.tgz", + "integrity": "sha512-H5dpQv5TfyZDNheZAWO3SmP10diGWZwN5QOUsArkDJih0QKNtahQBOmrV2xbhgln/nrUGoy41U/ZIY/MEx63Ug==", + "license": "MIT", + "dependencies": { + "@expo/config-plugins": "~55.0.8", + "@expo/config-types": "^55.0.5", + "@expo/json-file": "^10.0.14", + "@expo/require-utils": "^55.0.5", + "deepmerge": "^4.3.1", + "getenv": "^2.0.0", + "glob": "^13.0.0", + "resolve-workspace-root": "^2.0.0", + "semver": "^7.6.0", + "slugify": "^1.3.4" + } + }, "node_modules/@expo/metro": { - "version": "54.2.0", - "resolved": "https://registry.npmjs.org/@expo/metro/-/metro-54.2.0.tgz", - "integrity": "sha512-h68TNZPGsk6swMmLm9nRSnE2UXm48rWwgcbtAHVMikXvbxdS41NDHHeqg1rcQ9AbznDRp6SQVC2MVpDnsRKU1w==", + "version": "55.1.1", + "resolved": "https://registry.npmjs.org/@expo/metro/-/metro-55.1.1.tgz", + "integrity": "sha512-/wfXo5hTuAVpVLG/4hzlmD9NBGJkzkmBEMm/4VICajYRbj7y8OmqqPWbbymzHiBiHB6tI9BnsyXpQM6zVZEECg==", "license": "MIT", "dependencies": { - "metro": "0.83.3", - "metro-babel-transformer": "0.83.3", - "metro-cache": "0.83.3", - "metro-cache-key": "0.83.3", - "metro-config": "0.83.3", - "metro-core": "0.83.3", - "metro-file-map": "0.83.3", - "metro-minify-terser": "0.83.3", - "metro-resolver": "0.83.3", - "metro-runtime": "0.83.3", - "metro-source-map": "0.83.3", - "metro-symbolicate": "0.83.3", - "metro-transform-plugins": "0.83.3", - "metro-transform-worker": "0.83.3" - } - }, - "node_modules/@expo/metro/node_modules/metro": { - "version": "0.83.3", - "resolved": "https://registry.npmjs.org/metro/-/metro-0.83.3.tgz", - "integrity": "sha512-+rP+/GieOzkt97hSJ0MrPOuAH/jpaS21ZDvL9DJ35QYRDlQcwzcvUlGUf79AnQxq/2NPiS/AULhhM4TKutIt8Q==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/core": "^7.25.2", - "@babel/generator": "^7.25.0", - "@babel/parser": "^7.25.3", - "@babel/template": "^7.25.0", - "@babel/traverse": "^7.25.3", - "@babel/types": "^7.25.2", - "accepts": "^1.3.7", - "chalk": "^4.0.0", - "ci-info": "^2.0.0", - "connect": "^3.6.5", - "debug": "^4.4.0", - "error-stack-parser": "^2.0.6", - "flow-enums-runtime": "^0.0.6", - "graceful-fs": "^4.2.4", - "hermes-parser": "0.32.0", - "image-size": "^1.0.2", - "invariant": "^2.2.4", - "jest-worker": "^29.7.0", - "jsc-safe-url": "^0.2.2", - "lodash.throttle": "^4.1.1", - "metro-babel-transformer": "0.83.3", - "metro-cache": "0.83.3", - "metro-cache-key": "0.83.3", - "metro-config": "0.83.3", - "metro-core": "0.83.3", - "metro-file-map": "0.83.3", - "metro-resolver": "0.83.3", - "metro-runtime": "0.83.3", - "metro-source-map": "0.83.3", - "metro-symbolicate": "0.83.3", - "metro-transform-plugins": "0.83.3", - "metro-transform-worker": "0.83.3", - "mime-types": "^2.1.27", - "nullthrows": "^1.1.1", - "serialize-error": "^2.1.0", - "source-map": "^0.5.6", - "throat": "^5.0.0", - "ws": "^7.5.10", - "yargs": "^17.6.2" - }, - "bin": { - "metro": "src/cli.js" - }, - "engines": { - "node": ">=20.19.4" - } - }, - "node_modules/@expo/metro/node_modules/metro-babel-transformer": { - "version": "0.83.3", - "resolved": "https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.83.3.tgz", - "integrity": "sha512-1vxlvj2yY24ES1O5RsSIvg4a4WeL7PFXgKOHvXTXiW0deLvQr28ExXj6LjwCCDZ4YZLhq6HddLpZnX4dEdSq5g==", - "license": "MIT", - "dependencies": { - "@babel/core": "^7.25.2", - "flow-enums-runtime": "^0.0.6", - "hermes-parser": "0.32.0", - "nullthrows": "^1.1.1" - }, - "engines": { - "node": ">=20.19.4" - } - }, - "node_modules/@expo/metro/node_modules/metro-cache": { - "version": "0.83.3", - "resolved": "https://registry.npmjs.org/metro-cache/-/metro-cache-0.83.3.tgz", - "integrity": "sha512-3jo65X515mQJvKqK3vWRblxDEcgY55Sk3w4xa6LlfEXgQ9g1WgMh9m4qVZVwgcHoLy0a2HENTPCCX4Pk6s8c8Q==", - "license": "MIT", - "dependencies": { - "exponential-backoff": "^3.1.1", - "flow-enums-runtime": "^0.0.6", - "https-proxy-agent": "^7.0.5", - "metro-core": "0.83.3" - }, - "engines": { - "node": ">=20.19.4" - } - }, - "node_modules/@expo/metro/node_modules/metro-cache-key": { - "version": "0.83.3", - "resolved": "https://registry.npmjs.org/metro-cache-key/-/metro-cache-key-0.83.3.tgz", - "integrity": "sha512-59ZO049jKzSmvBmG/B5bZ6/dztP0ilp0o988nc6dpaDsU05Cl1c/lRf+yx8m9WW/JVgbmfO5MziBU559XjI5Zw==", - "license": "MIT", - "dependencies": { - "flow-enums-runtime": "^0.0.6" - }, - "engines": { - "node": ">=20.19.4" - } - }, - "node_modules/@expo/metro/node_modules/metro-config": { - "version": "0.83.3", - "resolved": "https://registry.npmjs.org/metro-config/-/metro-config-0.83.3.tgz", - "integrity": "sha512-mTel7ipT0yNjKILIan04bkJkuCzUUkm2SeEaTads8VfEecCh+ltXchdq6DovXJqzQAXuR2P9cxZB47Lg4klriA==", - "license": "MIT", - "dependencies": { - "connect": "^3.6.5", - "flow-enums-runtime": "^0.0.6", - "jest-validate": "^29.7.0", - "metro": "0.83.3", - "metro-cache": "0.83.3", - "metro-core": "0.83.3", - "metro-runtime": "0.83.3", - "yaml": "^2.6.1" - }, - "engines": { - "node": ">=20.19.4" - } - }, - "node_modules/@expo/metro/node_modules/metro-core": { - "version": "0.83.3", - "resolved": "https://registry.npmjs.org/metro-core/-/metro-core-0.83.3.tgz", - "integrity": "sha512-M+X59lm7oBmJZamc96usuF1kusd5YimqG/q97g4Ac7slnJ3YiGglW5CsOlicTR5EWf8MQFxxjDoB6ytTqRe8Hw==", - "license": "MIT", - "dependencies": { - "flow-enums-runtime": "^0.0.6", - "lodash.throttle": "^4.1.1", - "metro-resolver": "0.83.3" - }, - "engines": { - "node": ">=20.19.4" - } - }, - "node_modules/@expo/metro/node_modules/metro-file-map": { - "version": "0.83.3", - "resolved": "https://registry.npmjs.org/metro-file-map/-/metro-file-map-0.83.3.tgz", - "integrity": "sha512-jg5AcyE0Q9Xbbu/4NAwwZkmQn7doJCKGW0SLeSJmzNB9Z24jBe0AL2PHNMy4eu0JiKtNWHz9IiONGZWq7hjVTA==", - "license": "MIT", - "dependencies": { - "debug": "^4.4.0", - "fb-watchman": "^2.0.0", - "flow-enums-runtime": "^0.0.6", - "graceful-fs": "^4.2.4", - "invariant": "^2.2.4", - "jest-worker": "^29.7.0", - "micromatch": "^4.0.4", - "nullthrows": "^1.1.1", - "walker": "^1.0.7" - }, - "engines": { - "node": ">=20.19.4" - } - }, - "node_modules/@expo/metro/node_modules/metro-minify-terser": { - "version": "0.83.3", - "resolved": "https://registry.npmjs.org/metro-minify-terser/-/metro-minify-terser-0.83.3.tgz", - "integrity": "sha512-O2BmfWj6FSfzBLrNCXt/rr2VYZdX5i6444QJU0fFoc7Ljg+Q+iqebwE3K0eTvkI6TRjELsXk1cjU+fXwAR4OjQ==", - "license": "MIT", - "dependencies": { - "flow-enums-runtime": "^0.0.6", - "terser": "^5.15.0" - }, - "engines": { - "node": ">=20.19.4" - } - }, - "node_modules/@expo/metro/node_modules/metro-resolver": { - "version": "0.83.3", - "resolved": "https://registry.npmjs.org/metro-resolver/-/metro-resolver-0.83.3.tgz", - "integrity": "sha512-0js+zwI5flFxb1ktmR///bxHYg7OLpRpWZlBBruYG8OKYxeMP7SV0xQ/o/hUelrEMdK4LJzqVtHAhBm25LVfAQ==", - "license": "MIT", - "dependencies": { - "flow-enums-runtime": "^0.0.6" - }, - "engines": { - "node": ">=20.19.4" - } - }, - "node_modules/@expo/metro/node_modules/metro-runtime": { - "version": "0.83.3", - "resolved": "https://registry.npmjs.org/metro-runtime/-/metro-runtime-0.83.3.tgz", - "integrity": "sha512-JHCJb9ebr9rfJ+LcssFYA2x1qPYuSD/bbePupIGhpMrsla7RCwC/VL3yJ9cSU+nUhU4c9Ixxy8tBta+JbDeZWw==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.25.0", - "flow-enums-runtime": "^0.0.6" - }, - "engines": { - "node": ">=20.19.4" - } - }, - "node_modules/@expo/metro/node_modules/metro-source-map": { - "version": "0.83.3", - "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.83.3.tgz", - "integrity": "sha512-xkC3qwUBh2psVZgVavo8+r2C9Igkk3DibiOXSAht1aYRRcztEZNFtAMtfSB7sdO2iFMx2Mlyu++cBxz/fhdzQg==", - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.25.3", - "@babel/traverse--for-generate-function-map": "npm:@babel/traverse@^7.25.3", - "@babel/types": "^7.25.2", - "flow-enums-runtime": "^0.0.6", - "invariant": "^2.2.4", - "metro-symbolicate": "0.83.3", - "nullthrows": "^1.1.1", - "ob1": "0.83.3", - "source-map": "^0.5.6", - "vlq": "^1.0.0" - }, - "engines": { - "node": ">=20.19.4" - } - }, - "node_modules/@expo/metro/node_modules/metro-symbolicate": { - "version": "0.83.3", - "resolved": "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.83.3.tgz", - "integrity": "sha512-F/YChgKd6KbFK3eUR5HdUsfBqVsanf5lNTwFd4Ca7uuxnHgBC3kR/Hba/RGkenR3pZaGNp5Bu9ZqqP52Wyhomw==", - "license": "MIT", - "dependencies": { - "flow-enums-runtime": "^0.0.6", - "invariant": "^2.2.4", - "metro-source-map": "0.83.3", - "nullthrows": "^1.1.1", - "source-map": "^0.5.6", - "vlq": "^1.0.0" - }, - "bin": { - "metro-symbolicate": "src/index.js" - }, - "engines": { - "node": ">=20.19.4" - } - }, - "node_modules/@expo/metro/node_modules/metro-transform-plugins": { - "version": "0.83.3", - "resolved": "https://registry.npmjs.org/metro-transform-plugins/-/metro-transform-plugins-0.83.3.tgz", - "integrity": "sha512-eRGoKJU6jmqOakBMH5kUB7VitEWiNrDzBHpYbkBXW7C5fUGeOd2CyqrosEzbMK5VMiZYyOcNFEphvxk3OXey2A==", - "license": "MIT", - "dependencies": { - "@babel/core": "^7.25.2", - "@babel/generator": "^7.25.0", - "@babel/template": "^7.25.0", - "@babel/traverse": "^7.25.3", - "flow-enums-runtime": "^0.0.6", - "nullthrows": "^1.1.1" - }, - "engines": { - "node": ">=20.19.4" - } - }, - "node_modules/@expo/metro/node_modules/metro-transform-worker": { - "version": "0.83.3", - "resolved": "https://registry.npmjs.org/metro-transform-worker/-/metro-transform-worker-0.83.3.tgz", - "integrity": "sha512-Ztekew9t/gOIMZX1tvJOgX7KlSLL5kWykl0Iwu2cL2vKMKVALRl1hysyhUw0vjpAvLFx+Kfq9VLjnHIkW32fPA==", - "license": "MIT", - "dependencies": { - "@babel/core": "^7.25.2", - "@babel/generator": "^7.25.0", - "@babel/parser": "^7.25.3", - "@babel/types": "^7.25.2", - "flow-enums-runtime": "^0.0.6", - "metro": "0.83.3", - "metro-babel-transformer": "0.83.3", - "metro-cache": "0.83.3", - "metro-cache-key": "0.83.3", - "metro-minify-terser": "0.83.3", - "metro-source-map": "0.83.3", - "metro-transform-plugins": "0.83.3", - "nullthrows": "^1.1.1" - }, - "engines": { - "node": ">=20.19.4" - } - }, - "node_modules/@expo/metro/node_modules/ob1": { - "version": "0.83.3", - "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.83.3.tgz", - "integrity": "sha512-egUxXCDwoWG06NGCS5s5AdcpnumHKJlfd3HH06P3m9TEMwwScfcY35wpQxbm9oHof+dM/lVH9Rfyu1elTVelSA==", - "license": "MIT", - "dependencies": { - "flow-enums-runtime": "^0.0.6" - }, - "engines": { - "node": ">=20.19.4" + "metro": "0.83.7", + "metro-babel-transformer": "0.83.7", + "metro-cache": "0.83.7", + "metro-cache-key": "0.83.7", + "metro-config": "0.83.7", + "metro-core": "0.83.7", + "metro-file-map": "0.83.7", + "metro-minify-terser": "0.83.7", + "metro-resolver": "0.83.7", + "metro-runtime": "0.83.7", + "metro-source-map": "0.83.7", + "metro-symbolicate": "0.83.7", + "metro-transform-plugins": "0.83.7", + "metro-transform-worker": "0.83.7" } }, "node_modules/@expo/osascript": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/@expo/osascript/-/osascript-2.4.2.tgz", - "integrity": "sha512-/XP7PSYF2hzOZzqfjgkoWtllyeTN8dW3aM4P6YgKcmmPikKL5FdoyQhti4eh6RK5a5VrUXJTOlTNIpIHsfB5Iw==", + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/@expo/osascript/-/osascript-2.4.3.tgz", + "integrity": "sha512-wbuj3EebM7W9hN/Wp4xTzKd6rQ2zKJzAxkFxkOOwyysLp0HOAgQ4/5RINyoS241pZUX2rUHq7mAJ7pcCQ8U0Ow==", "license": "MIT", "dependencies": { "@expo/spawn-async": "^1.7.2" @@ -2106,12 +1657,12 @@ } }, "node_modules/@expo/package-manager": { - "version": "1.10.4", - "resolved": "https://registry.npmjs.org/@expo/package-manager/-/package-manager-1.10.4.tgz", - "integrity": "sha512-y9Mr4Kmpk4abAVZrNNPCdzOZr8nLLyi18p1SXr0RCVA8IfzqZX/eY4H+50a0HTmXqIsPZrQdcdb4I3ekMS9GvQ==", + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/@expo/package-manager/-/package-manager-1.10.5.tgz", + "integrity": "sha512-nCP9Mebfl3jvOr0/P6VAuyah6PAtun+aihIL2zAtuE8uSe94JWkVZ7051i0MUVO+y3gFpBqnr8IIH5ch+VJjHA==", "license": "MIT", "dependencies": { - "@expo/json-file": "^10.0.13", + "@expo/json-file": "^10.0.14", "@expo/spawn-async": "^1.7.2", "chalk": "^4.0.0", "npm-package-arg": "^11.0.0", @@ -2120,9 +1671,9 @@ } }, "node_modules/@expo/plist": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@expo/plist/-/plist-0.5.2.tgz", - "integrity": "sha512-o4xdVdBpe4aTl3sPMZ2u3fJH4iG1I768EIRk1xRZP+GaFI93MaR3JvoFibYqxeTmLQ1p1kNEVqylfUjezxx45g==", + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/@expo/plist/-/plist-0.5.3.tgz", + "integrity": "sha512-jz5oPcPDd3fygwVxwSwmO6wodTwm0Qa14NUyPy0ka7H8sFmCtNZUI2+DzVe/EXjOhq1FbEjrwl89gdlWYOnVjQ==", "license": "MIT", "dependencies": { "@xmldom/xmldom": "^0.8.8", @@ -2131,9 +1682,9 @@ } }, "node_modules/@expo/require-utils": { - "version": "55.0.4", - "resolved": "https://registry.npmjs.org/@expo/require-utils/-/require-utils-55.0.4.tgz", - "integrity": "sha512-JAANvXqV7MOysWeVWgaiDzikoyDjJWOV/ulOW60Zb3kXJfrx2oZOtGtDXDFKD1mXuahQgoM5QOjuZhF7gFRNjA==", + "version": "55.0.5", + "resolved": "https://registry.npmjs.org/@expo/require-utils/-/require-utils-55.0.5.tgz", + "integrity": "sha512-U4K/CQ2VpXuwfNGsN+daKmYOt15hCP8v/pXaYH6eut7kdYZo6SfJ1yr67BIcJ+1Gzzs+QzTxswAZChKpXmceyw==", "license": "MIT", "dependencies": { "@babel/code-frame": "^7.20.0", @@ -2150,9 +1701,9 @@ } }, "node_modules/@expo/schema-utils": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/@expo/schema-utils/-/schema-utils-0.1.8.tgz", - "integrity": "sha512-9I6ZqvnAvKKDiO+ZF8BpQQFYWXOJvTAL5L/227RUbWG1OVZDInFifzCBiqAZ3b67NRfeAgpgvbA7rejsqhY62A==", + "version": "55.0.4", + "resolved": "https://registry.npmjs.org/@expo/schema-utils/-/schema-utils-55.0.4.tgz", + "integrity": "sha512-65IdeeE8dAZR3n3J5Eq7LYiQ8BFGeEYCWPBCzycvafL7PkskbCyIclTQarRwf/HXFoRvezKCjaLwy/8v9Prk6g==", "license": "MIT" }, "node_modules/@expo/sdk-runtime-versions": { @@ -2186,9 +1737,9 @@ "license": "MIT" }, "node_modules/@expo/xcpretty": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/@expo/xcpretty/-/xcpretty-4.4.3.tgz", - "integrity": "sha512-wC562eD3gS6vO2tWHToFhlFnmHKfKHgF1oyvojeSkLK/ZYop1bMU+7cOMiF9Sq70CzcsLy/EMRy/uRc76QmNRw==", + "version": "4.4.4", + "resolved": "https://registry.npmjs.org/@expo/xcpretty/-/xcpretty-4.4.4.tgz", + "integrity": "sha512-4aQzz9vgxcNXFfo/iyNgDDYfsU5XGKKxWxZopw0cVotHiW+U8IJbIxMaxsINs6bHhtkG3StKNPcOrn3eBuxKPw==", "license": "BSD-3-Clause", "dependencies": { "@babel/code-frame": "^7.20.0", @@ -2217,657 +1768,6 @@ "js-yaml": "bin/js-yaml.js" } }, - "node_modules/@firebase/ai": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/@firebase/ai/-/ai-2.9.0.tgz", - "integrity": "sha512-NPvBBuvdGo9x3esnABAucFYmqbBmXvyTMimBq2PCuLZbdANZoHzGlx7vfzbwNDaEtCBq4RGGNMliLIv6bZ+PtA==", - "license": "Apache-2.0", - "dependencies": { - "@firebase/app-check-interop-types": "0.3.3", - "@firebase/component": "0.7.1", - "@firebase/logger": "0.5.0", - "@firebase/util": "1.14.0", - "tslib": "^2.1.0" - }, - "engines": { - "node": ">=20.0.0" - }, - "peerDependencies": { - "@firebase/app": "0.x", - "@firebase/app-types": "0.x" - } - }, - "node_modules/@firebase/analytics": { - "version": "0.10.20", - "resolved": "https://registry.npmjs.org/@firebase/analytics/-/analytics-0.10.20.tgz", - "integrity": "sha512-adGTNVUWH5q66tI/OQuKLSN6mamPpfYhj0radlH2xt+3eL6NFPtXoOs+ulvs+UsmK27vNFx5FjRDfWk+TyduHg==", - "license": "Apache-2.0", - "dependencies": { - "@firebase/component": "0.7.1", - "@firebase/installations": "0.6.20", - "@firebase/logger": "0.5.0", - "@firebase/util": "1.14.0", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app": "0.x" - } - }, - "node_modules/@firebase/analytics-compat": { - "version": "0.2.26", - "resolved": "https://registry.npmjs.org/@firebase/analytics-compat/-/analytics-compat-0.2.26.tgz", - "integrity": "sha512-0j2ruLOoVSwwcXAF53AMoniJKnkwiTjGVfic5LDzqiRkR13vb5j6TXMeix787zbLeQtN/m1883Yv1TxI0gItbA==", - "license": "Apache-2.0", - "dependencies": { - "@firebase/analytics": "0.10.20", - "@firebase/analytics-types": "0.8.3", - "@firebase/component": "0.7.1", - "@firebase/util": "1.14.0", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app-compat": "0.x" - } - }, - "node_modules/@firebase/analytics-types": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/@firebase/analytics-types/-/analytics-types-0.8.3.tgz", - "integrity": "sha512-VrIp/d8iq2g501qO46uGz3hjbDb8xzYMrbu8Tp0ovzIzrvJZ2fvmj649gTjge/b7cCCcjT0H37g1gVtlNhnkbg==", - "license": "Apache-2.0" - }, - "node_modules/@firebase/app": { - "version": "0.14.9", - "resolved": "https://registry.npmjs.org/@firebase/app/-/app-0.14.9.tgz", - "integrity": "sha512-3gtUX0e584MYkKBQMgSECMvE1Dwzg+eONefDQ0wxVSe5YMBsZwdN5pL7UapwWBlV8+i8QCztF9TP947tEjZAGA==", - "license": "Apache-2.0", - "dependencies": { - "@firebase/component": "0.7.1", - "@firebase/logger": "0.5.0", - "@firebase/util": "1.14.0", - "idb": "7.1.1", - "tslib": "^2.1.0" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@firebase/app-check": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/@firebase/app-check/-/app-check-0.11.1.tgz", - "integrity": "sha512-gmKfwQ2k8aUQlOyRshc+fOQLq0OwUmibIZvpuY1RDNu2ho0aTMlwxOuEiJeYOs7AxzhSx7gnXPFNsXCFbnvXUQ==", - "license": "Apache-2.0", - "dependencies": { - "@firebase/component": "0.7.1", - "@firebase/logger": "0.5.0", - "@firebase/util": "1.14.0", - "tslib": "^2.1.0" - }, - "engines": { - "node": ">=20.0.0" - }, - "peerDependencies": { - "@firebase/app": "0.x" - } - }, - "node_modules/@firebase/app-check-compat": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@firebase/app-check-compat/-/app-check-compat-0.4.1.tgz", - "integrity": "sha512-yjSvSl5B1u4CirnxhzirN1uiTRCRfx+/qtfbyeyI+8Cx8Cw1RWAIO/OqytPSVwLYbJJ1vEC3EHfxazRaMoWKaA==", - "license": "Apache-2.0", - "dependencies": { - "@firebase/app-check": "0.11.1", - "@firebase/app-check-types": "0.5.3", - "@firebase/component": "0.7.1", - "@firebase/logger": "0.5.0", - "@firebase/util": "1.14.0", - "tslib": "^2.1.0" - }, - "engines": { - "node": ">=20.0.0" - }, - "peerDependencies": { - "@firebase/app-compat": "0.x" - } - }, - "node_modules/@firebase/app-check-interop-types": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@firebase/app-check-interop-types/-/app-check-interop-types-0.3.3.tgz", - "integrity": "sha512-gAlxfPLT2j8bTI/qfe3ahl2I2YcBQ8cFIBdhAQA4I2f3TndcO+22YizyGYuttLHPQEpWkhmpFW60VCFEPg4g5A==", - "license": "Apache-2.0" - }, - "node_modules/@firebase/app-check-types": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/@firebase/app-check-types/-/app-check-types-0.5.3.tgz", - "integrity": "sha512-hyl5rKSj0QmwPdsAxrI5x1otDlByQ7bvNvVt8G/XPO2CSwE++rmSVf3VEhaeOR4J8ZFaF0Z0NDSmLejPweZ3ng==", - "license": "Apache-2.0" - }, - "node_modules/@firebase/app-compat": { - "version": "0.5.9", - "resolved": "https://registry.npmjs.org/@firebase/app-compat/-/app-compat-0.5.9.tgz", - "integrity": "sha512-e5LzqjO69/N2z7XcJeuMzIp4wWnW696dQeaHAUpQvGk89gIWHAIvG6W+mA3UotGW6jBoqdppEJ9DnuwbcBByug==", - "license": "Apache-2.0", - "dependencies": { - "@firebase/app": "0.14.9", - "@firebase/component": "0.7.1", - "@firebase/logger": "0.5.0", - "@firebase/util": "1.14.0", - "tslib": "^2.1.0" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@firebase/app-types": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.9.3.tgz", - "integrity": "sha512-kRVpIl4vVGJ4baogMDINbyrIOtOxqhkZQg4jTq3l8Lw6WSk0xfpEYzezFu+Kl4ve4fbPl79dvwRtaFqAC/ucCw==", - "license": "Apache-2.0" - }, - "node_modules/@firebase/auth": { - "version": "1.12.1", - "resolved": "https://registry.npmjs.org/@firebase/auth/-/auth-1.12.1.tgz", - "integrity": "sha512-nXKj7d5bMBlnq6XpcQQpmnSVwEeHBkoVbY/+Wk0P1ebLSICoH4XPtvKOFlXKfIHmcS84mLQ99fk3njlDGKSDtw==", - "license": "Apache-2.0", - "dependencies": { - "@firebase/component": "0.7.1", - "@firebase/logger": "0.5.0", - "@firebase/util": "1.14.0", - "tslib": "^2.1.0" - }, - "engines": { - "node": ">=20.0.0" - }, - "peerDependencies": { - "@firebase/app": "0.x", - "@react-native-async-storage/async-storage": "^2.2.0" - }, - "peerDependenciesMeta": { - "@react-native-async-storage/async-storage": { - "optional": true - } - } - }, - "node_modules/@firebase/auth-compat": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/@firebase/auth-compat/-/auth-compat-0.6.3.tgz", - "integrity": "sha512-nHOkupcYuGVxI1AJJ/OBhLPaRokbP14Gq4nkkoVvf1yvuREEWqdnrYB/CdsSnPxHMAnn5wJIKngxBF9jNX7s/Q==", - "license": "Apache-2.0", - "dependencies": { - "@firebase/auth": "1.12.1", - "@firebase/auth-types": "0.13.0", - "@firebase/component": "0.7.1", - "@firebase/util": "1.14.0", - "tslib": "^2.1.0" - }, - "engines": { - "node": ">=20.0.0" - }, - "peerDependencies": { - "@firebase/app-compat": "0.x" - } - }, - "node_modules/@firebase/auth-interop-types": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@firebase/auth-interop-types/-/auth-interop-types-0.2.4.tgz", - "integrity": "sha512-JPgcXKCuO+CWqGDnigBtvo09HeBs5u/Ktc2GaFj2m01hLarbxthLNm7Fk8iOP1aqAtXV+fnnGj7U28xmk7IwVA==", - "license": "Apache-2.0" - }, - "node_modules/@firebase/auth-types": { - "version": "0.13.0", - "resolved": "https://registry.npmjs.org/@firebase/auth-types/-/auth-types-0.13.0.tgz", - "integrity": "sha512-S/PuIjni0AQRLF+l9ck0YpsMOdE8GO2KU6ubmBB7P+7TJUCQDa3R1dlgYm9UzGbbePMZsp0xzB93f2b/CgxMOg==", - "license": "Apache-2.0", - "peerDependencies": { - "@firebase/app-types": "0.x", - "@firebase/util": "1.x" - } - }, - "node_modules/@firebase/component": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.7.1.tgz", - "integrity": "sha512-mFzsm7CLHR60o08S23iLUY8m/i6kLpOK87wdEFPLhdlCahaxKmWOwSVGiWoENYSmFJJoDhrR3gKSCxz7ENdIww==", - "license": "Apache-2.0", - "dependencies": { - "@firebase/util": "1.14.0", - "tslib": "^2.1.0" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@firebase/data-connect": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@firebase/data-connect/-/data-connect-0.4.0.tgz", - "integrity": "sha512-vLXM6WHNIR3VtEeYNUb/5GTsUOyl3Of4iWNZHBe1i9f88sYFnxybJNWVBjvJ7flhCyF8UdxGpzWcUnv6F5vGfg==", - "license": "Apache-2.0", - "dependencies": { - "@firebase/auth-interop-types": "0.2.4", - "@firebase/component": "0.7.1", - "@firebase/logger": "0.5.0", - "@firebase/util": "1.14.0", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app": "0.x" - } - }, - "node_modules/@firebase/database": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@firebase/database/-/database-1.1.1.tgz", - "integrity": "sha512-LwIXe8+mVHY5LBPulWECOOIEXDiatyECp/BOlu0gOhe+WOcKjWHROaCbLlkFTgHMY7RHr5MOxkLP/tltWAH3dA==", - "license": "Apache-2.0", - "dependencies": { - "@firebase/app-check-interop-types": "0.3.3", - "@firebase/auth-interop-types": "0.2.4", - "@firebase/component": "0.7.1", - "@firebase/logger": "0.5.0", - "@firebase/util": "1.14.0", - "faye-websocket": "0.11.4", - "tslib": "^2.1.0" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@firebase/database-compat": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@firebase/database-compat/-/database-compat-2.1.1.tgz", - "integrity": "sha512-heAEVZ9Z8c8PnBUcmGh91JHX0cXcVa1yESW/xkLuwaX7idRFyLiN8sl73KXpR8ZArGoPXVQDanBnk6SQiekRCQ==", - "license": "Apache-2.0", - "dependencies": { - "@firebase/component": "0.7.1", - "@firebase/database": "1.1.1", - "@firebase/database-types": "1.0.17", - "@firebase/logger": "0.5.0", - "@firebase/util": "1.14.0", - "tslib": "^2.1.0" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@firebase/database-types": { - "version": "1.0.17", - "resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-1.0.17.tgz", - "integrity": "sha512-4eWaM5fW3qEIHjGzfi3cf0Jpqi1xQsAdT6rSDE1RZPrWu8oGjgrq6ybMjobtyHQFgwGCykBm4YM89qDzc+uG/w==", - "license": "Apache-2.0", - "dependencies": { - "@firebase/app-types": "0.9.3", - "@firebase/util": "1.14.0" - } - }, - "node_modules/@firebase/firestore": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@firebase/firestore/-/firestore-4.12.0.tgz", - "integrity": "sha512-PM47OyiiAAoAMB8kkq4Je14mTciaRoAPDd3ng3Ckqz9i2TX9D9LfxIRcNzP/OxzNV4uBKRq6lXoOggkJBQR3Gw==", - "license": "Apache-2.0", - "dependencies": { - "@firebase/component": "0.7.1", - "@firebase/logger": "0.5.0", - "@firebase/util": "1.14.0", - "@firebase/webchannel-wrapper": "1.0.5", - "@grpc/grpc-js": "~1.9.0", - "@grpc/proto-loader": "^0.7.8", - "tslib": "^2.1.0" - }, - "engines": { - "node": ">=20.0.0" - }, - "peerDependencies": { - "@firebase/app": "0.x" - } - }, - "node_modules/@firebase/firestore-compat": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/@firebase/firestore-compat/-/firestore-compat-0.4.6.tgz", - "integrity": "sha512-NgVyR4hHHN2FvSNQOtbgBOuVsEdD/in30d9FKbEvvITiAChrBN2nBstmhfjI4EOTnHaP8zigwvkNYFI9yKGAkQ==", - "license": "Apache-2.0", - "dependencies": { - "@firebase/component": "0.7.1", - "@firebase/firestore": "4.12.0", - "@firebase/firestore-types": "3.0.3", - "@firebase/util": "1.14.0", - "tslib": "^2.1.0" - }, - "engines": { - "node": ">=20.0.0" - }, - "peerDependencies": { - "@firebase/app-compat": "0.x" - } - }, - "node_modules/@firebase/firestore-types": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@firebase/firestore-types/-/firestore-types-3.0.3.tgz", - "integrity": "sha512-hD2jGdiWRxB/eZWF89xcK9gF8wvENDJkzpVFb4aGkzfEaKxVRD1kjz1t1Wj8VZEp2LCB53Yx1zD8mrhQu87R6Q==", - "license": "Apache-2.0", - "peerDependencies": { - "@firebase/app-types": "0.x", - "@firebase/util": "1.x" - } - }, - "node_modules/@firebase/functions": { - "version": "0.13.2", - "resolved": "https://registry.npmjs.org/@firebase/functions/-/functions-0.13.2.tgz", - "integrity": "sha512-tHduUD+DeokM3NB1QbHCvEMoL16e8Z8JSkmuVA4ROoJKPxHn8ibnecHPO2e3nVCJR1D9OjuKvxz4gksfq92/ZQ==", - "license": "Apache-2.0", - "dependencies": { - "@firebase/app-check-interop-types": "0.3.3", - "@firebase/auth-interop-types": "0.2.4", - "@firebase/component": "0.7.1", - "@firebase/messaging-interop-types": "0.2.3", - "@firebase/util": "1.14.0", - "tslib": "^2.1.0" - }, - "engines": { - "node": ">=20.0.0" - }, - "peerDependencies": { - "@firebase/app": "0.x" - } - }, - "node_modules/@firebase/functions-compat": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/@firebase/functions-compat/-/functions-compat-0.4.2.tgz", - "integrity": "sha512-YNxgnezvZDkqxqXa6cT7/oTeD4WXbxgIP7qZp4LFnathQv5o2omM6EoIhXiT9Ie5AoQDcIhG9Y3/dj+DFJGaGQ==", - "license": "Apache-2.0", - "dependencies": { - "@firebase/component": "0.7.1", - "@firebase/functions": "0.13.2", - "@firebase/functions-types": "0.6.3", - "@firebase/util": "1.14.0", - "tslib": "^2.1.0" - }, - "engines": { - "node": ">=20.0.0" - }, - "peerDependencies": { - "@firebase/app-compat": "0.x" - } - }, - "node_modules/@firebase/functions-types": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/@firebase/functions-types/-/functions-types-0.6.3.tgz", - "integrity": "sha512-EZoDKQLUHFKNx6VLipQwrSMh01A1SaL3Wg6Hpi//x6/fJ6Ee4hrAeswK99I5Ht8roiniKHw4iO0B1Oxj5I4plg==", - "license": "Apache-2.0" - }, - "node_modules/@firebase/installations": { - "version": "0.6.20", - "resolved": "https://registry.npmjs.org/@firebase/installations/-/installations-0.6.20.tgz", - "integrity": "sha512-LOzvR7XHPbhS0YB5ANXhqXB5qZlntPpwU/4KFwhSNpXNsGk/sBQ9g5hepi0y0/MfenJLe2v7t644iGOOElQaHQ==", - "license": "Apache-2.0", - "dependencies": { - "@firebase/component": "0.7.1", - "@firebase/util": "1.14.0", - "idb": "7.1.1", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app": "0.x" - } - }, - "node_modules/@firebase/installations-compat": { - "version": "0.2.20", - "resolved": "https://registry.npmjs.org/@firebase/installations-compat/-/installations-compat-0.2.20.tgz", - "integrity": "sha512-9C9pL/DIEGucmoPj8PlZTnztbX3nhNj5RTYVpUM7wQq/UlHywaYv99969JU/WHLvi9ptzIogXYS9d1eZ6XFe9g==", - "license": "Apache-2.0", - "dependencies": { - "@firebase/component": "0.7.1", - "@firebase/installations": "0.6.20", - "@firebase/installations-types": "0.5.3", - "@firebase/util": "1.14.0", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app-compat": "0.x" - } - }, - "node_modules/@firebase/installations-types": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/@firebase/installations-types/-/installations-types-0.5.3.tgz", - "integrity": "sha512-2FJI7gkLqIE0iYsNQ1P751lO3hER+Umykel+TkLwHj6plzWVxqvfclPUZhcKFVQObqloEBTmpi2Ozn7EkCABAA==", - "license": "Apache-2.0", - "peerDependencies": { - "@firebase/app-types": "0.x" - } - }, - "node_modules/@firebase/logger": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.5.0.tgz", - "integrity": "sha512-cGskaAvkrnh42b3BA3doDWeBmuHFO/Mx5A83rbRDYakPjO9bJtRL3dX7javzc2Rr/JHZf4HlterTW2lUkfeN4g==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.1.0" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@firebase/messaging": { - "version": "0.12.24", - "resolved": "https://registry.npmjs.org/@firebase/messaging/-/messaging-0.12.24.tgz", - "integrity": "sha512-UtKoubegAhHyehcB7iQjvQ8OVITThPbbWk3g2/2ze42PrQr6oe6OmCElYQkBrE5RDCeMTNucXejbdulrQ2XwVg==", - "license": "Apache-2.0", - "dependencies": { - "@firebase/component": "0.7.1", - "@firebase/installations": "0.6.20", - "@firebase/messaging-interop-types": "0.2.3", - "@firebase/util": "1.14.0", - "idb": "7.1.1", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app": "0.x" - } - }, - "node_modules/@firebase/messaging-compat": { - "version": "0.2.24", - "resolved": "https://registry.npmjs.org/@firebase/messaging-compat/-/messaging-compat-0.2.24.tgz", - "integrity": "sha512-wXH8FrKbJvFuFe6v98TBhAtvgknxKIZtGM/wCVsfpOGmaAE80bD8tBxztl+uochjnFb9plihkd6mC4y7sZXSpA==", - "license": "Apache-2.0", - "dependencies": { - "@firebase/component": "0.7.1", - "@firebase/messaging": "0.12.24", - "@firebase/util": "1.14.0", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app-compat": "0.x" - } - }, - "node_modules/@firebase/messaging-interop-types": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@firebase/messaging-interop-types/-/messaging-interop-types-0.2.3.tgz", - "integrity": "sha512-xfzFaJpzcmtDjycpDeCUj0Ge10ATFi/VHVIvEEjDNc3hodVBQADZ7BWQU7CuFpjSHE+eLuBI13z5F/9xOoGX8Q==", - "license": "Apache-2.0" - }, - "node_modules/@firebase/performance": { - "version": "0.7.10", - "resolved": "https://registry.npmjs.org/@firebase/performance/-/performance-0.7.10.tgz", - "integrity": "sha512-8nRFld+Ntzp5cLKzZuG9g+kBaSn8Ks9dmn87UQGNFDygbmR6ebd8WawauEXiJjMj1n70ypkvAOdE+lzeyfXtGA==", - "license": "Apache-2.0", - "dependencies": { - "@firebase/component": "0.7.1", - "@firebase/installations": "0.6.20", - "@firebase/logger": "0.5.0", - "@firebase/util": "1.14.0", - "tslib": "^2.1.0", - "web-vitals": "^4.2.4" - }, - "peerDependencies": { - "@firebase/app": "0.x" - } - }, - "node_modules/@firebase/performance-compat": { - "version": "0.2.23", - "resolved": "https://registry.npmjs.org/@firebase/performance-compat/-/performance-compat-0.2.23.tgz", - "integrity": "sha512-c7qOAGBUAOpIuUlHu1axWcrCVtIYKPMhH0lMnoCDWnPwn1HcPuPUBVTWETbC7UWw71RMJF8DpirfWXzMWJQfgA==", - "license": "Apache-2.0", - "dependencies": { - "@firebase/component": "0.7.1", - "@firebase/logger": "0.5.0", - "@firebase/performance": "0.7.10", - "@firebase/performance-types": "0.2.3", - "@firebase/util": "1.14.0", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app-compat": "0.x" - } - }, - "node_modules/@firebase/performance-types": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@firebase/performance-types/-/performance-types-0.2.3.tgz", - "integrity": "sha512-IgkyTz6QZVPAq8GSkLYJvwSLr3LS9+V6vNPQr0x4YozZJiLF5jYixj0amDtATf1X0EtYHqoPO48a9ija8GocxQ==", - "license": "Apache-2.0" - }, - "node_modules/@firebase/remote-config": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@firebase/remote-config/-/remote-config-0.8.1.tgz", - "integrity": "sha512-L86TReBnPiiJOWd7k9iaiE9f7rHtMpjAoYN0fH2ey2ZRzsOChHV0s5sYf1+IIUYzplzsE46pjlmAUNkRRKwHSQ==", - "license": "Apache-2.0", - "dependencies": { - "@firebase/component": "0.7.1", - "@firebase/installations": "0.6.20", - "@firebase/logger": "0.5.0", - "@firebase/util": "1.14.0", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app": "0.x" - } - }, - "node_modules/@firebase/remote-config-compat": { - "version": "0.2.22", - "resolved": "https://registry.npmjs.org/@firebase/remote-config-compat/-/remote-config-compat-0.2.22.tgz", - "integrity": "sha512-uW/eNKKtRBot2gnCC5mnoy5Voo2wMzZuQ7dwqqGHU176fO9zFgMwKiRzk+aaC99NLrFk1KOmr0ZVheD+zdJmjQ==", - "license": "Apache-2.0", - "dependencies": { - "@firebase/component": "0.7.1", - "@firebase/logger": "0.5.0", - "@firebase/remote-config": "0.8.1", - "@firebase/remote-config-types": "0.5.0", - "@firebase/util": "1.14.0", - "tslib": "^2.1.0" - }, - "peerDependencies": { - "@firebase/app-compat": "0.x" - } - }, - "node_modules/@firebase/remote-config-types": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@firebase/remote-config-types/-/remote-config-types-0.5.0.tgz", - "integrity": "sha512-vI3bqLoF14L/GchtgayMiFpZJF+Ao3uR8WCde0XpYNkSokDpAKca2DxvcfeZv7lZUqkUwQPL2wD83d3vQ4vvrg==", - "license": "Apache-2.0" - }, - "node_modules/@firebase/storage": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/@firebase/storage/-/storage-0.14.1.tgz", - "integrity": "sha512-uIpYgBBsv1vIET+5xV20XT7wwqV+H4GFp6PBzfmLUcEgguS4SWNFof56Z3uOC2lNDh0KDda1UflYq2VwD9Nefw==", - "license": "Apache-2.0", - "dependencies": { - "@firebase/component": "0.7.1", - "@firebase/util": "1.14.0", - "tslib": "^2.1.0" - }, - "engines": { - "node": ">=20.0.0" - }, - "peerDependencies": { - "@firebase/app": "0.x" - } - }, - "node_modules/@firebase/storage-compat": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@firebase/storage-compat/-/storage-compat-0.4.1.tgz", - "integrity": "sha512-bgl3FHHfXAmBgzIK/Fps6Xyv2HiAQlSTov07CBL+RGGhrC5YIk4lruS8JVIC+UkujRdYvnf8cpQFGn2RCilJ/A==", - "license": "Apache-2.0", - "dependencies": { - "@firebase/component": "0.7.1", - "@firebase/storage": "0.14.1", - "@firebase/storage-types": "0.8.3", - "@firebase/util": "1.14.0", - "tslib": "^2.1.0" - }, - "engines": { - "node": ">=20.0.0" - }, - "peerDependencies": { - "@firebase/app-compat": "0.x" - } - }, - "node_modules/@firebase/storage-types": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/@firebase/storage-types/-/storage-types-0.8.3.tgz", - "integrity": "sha512-+Muk7g9uwngTpd8xn9OdF/D48uiQ7I1Fae7ULsWPuKoCH3HU7bfFPhxtJYzyhjdniowhuDpQcfPmuNRAqZEfvg==", - "license": "Apache-2.0", - "peerDependencies": { - "@firebase/app-types": "0.x", - "@firebase/util": "1.x" - } - }, - "node_modules/@firebase/util": { - "version": "1.14.0", - "resolved": "https://registry.npmjs.org/@firebase/util/-/util-1.14.0.tgz", - "integrity": "sha512-/gnejm7MKkVIXnSJGpc9L2CvvvzJvtDPeAEq5jAwgVlf/PeNxot+THx/bpD20wQ8uL5sz0xqgXy1nisOYMU+mw==", - "hasInstallScript": true, - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.1.0" - }, - "engines": { - "node": ">=20.0.0" - } - }, - "node_modules/@firebase/webchannel-wrapper": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@firebase/webchannel-wrapper/-/webchannel-wrapper-1.0.5.tgz", - "integrity": "sha512-+uGNN7rkfn41HLO0vekTFhTxk61eKa8mTpRGLO0QSqlQdKvIoGAvLp3ppdVIWbTGYJWM6Kp0iN+PjMIOcnVqTw==", - "license": "Apache-2.0" - }, - "node_modules/@grpc/grpc-js": { - "version": "1.9.15", - "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.9.15.tgz", - "integrity": "sha512-nqE7Hc0AzI+euzUwDAy0aY5hCp10r734gMGRdU+qOPX0XSceI2ULrcXB5U2xSc5VkWwalCj4M7GzCAygZl2KoQ==", - "license": "Apache-2.0", - "dependencies": { - "@grpc/proto-loader": "^0.7.8", - "@types/node": ">=12.12.47" - }, - "engines": { - "node": "^8.13.0 || >=10.10.0" - } - }, - "node_modules/@grpc/proto-loader": { - "version": "0.7.15", - "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.15.tgz", - "integrity": "sha512-tMXdRCfYVixjuFK+Hk0Q1s38gV9zDiDJfWL3h1rv4Qc39oILCu1TRTDt7+fGUI8K4G1Fj125Hx/ru3azECWTyQ==", - "license": "Apache-2.0", - "dependencies": { - "lodash.camelcase": "^4.3.0", - "long": "^5.0.0", - "protobufjs": "^7.2.5", - "yargs": "^17.7.2" - }, - "bin": { - "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@isaacs/fs-minipass": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", - "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", - "license": "ISC", - "dependencies": { - "minipass": "^7.0.4" - }, - "engines": { - "node": ">=18.0.0" - } - }, "node_modules/@isaacs/ttlcache": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/@isaacs/ttlcache/-/ttlcache-1.4.1.tgz", @@ -3065,70 +1965,6 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@protobufjs/aspromise": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", - "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/base64": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/codegen": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.5.tgz", - "integrity": "sha512-zgXFLzW3Ap33e6d0Wlj4MGIm6Ce8O89n/apUaGNB/jx+hw+ruWEp7EwGUshdLKVRCxZW12fp9r40E1mQrf/34g==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/eventemitter": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", - "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/fetch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", - "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", - "license": "BSD-3-Clause", - "dependencies": { - "@protobufjs/aspromise": "^1.1.1", - "@protobufjs/inquire": "^1.1.0" - } - }, - "node_modules/@protobufjs/float": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", - "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/inquire": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.1.tgz", - "integrity": "sha512-mnzgDV26ueAvk7rsbt9L7bE0SuAoqyuys/sMMrmVcN5x9VsxpcG3rqAUSgDyLp0UZlmNfIbQ4fHfCtreVBk8Ew==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/path": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", - "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/pool": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", - "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/utf8": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.1.tgz", - "integrity": "sha512-oOAWABowe8EAbMyWKM0tYDKi8Yaox52D+HWZhAIJqQXbqe0xI/GV7FhLWqlEKreMkfDjshR5FKgi3mnle0h6Eg==", - "license": "BSD-3-Clause" - }, "node_modules/@react-native-async-storage/async-storage": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/@react-native-async-storage/async-storage/-/async-storage-2.2.0.tgz", @@ -3141,28 +1977,16 @@ "react-native": "^0.0.0-0 || >=0.65 <1.0" } }, - "node_modules/@react-native-firebase/analytics": { - "version": "24.0.0", - "resolved": "https://registry.npmjs.org/@react-native-firebase/analytics/-/analytics-24.0.0.tgz", - "integrity": "sha512-Hg8xbnpjn56L7uwYKZ9QIffx5YTsqtPUS5C7Y207MSwi+qVFp0GHWJ/onAk5JOvPPPtM3pVm3Nn+b/EQomFOcA==", - "license": "Apache-2.0", - "dependencies": { - "superstruct": "^2.0.2" + "node_modules/@react-native-google-signin/google-signin": { + "version": "16.1.2", + "resolved": "https://registry.npmjs.org/@react-native-google-signin/google-signin/-/google-signin-16.1.2.tgz", + "integrity": "sha512-1hf4pRmpnS5t0dHtqU72Q1FmWzsCZR2Sm3uVQbbfMKeNPl5TKjpAsP6F8QTZ9L+Q6Cnn9tL9BXpDCb1nyutdCQ==", + "license": "MIT", + "funding": { + "url": "https://universal-sign-in.com" }, "peerDependencies": { - "@react-native-firebase/app": "24.0.0" - } - }, - "node_modules/@react-native-firebase/app": { - "version": "24.0.0", - "resolved": "https://registry.npmjs.org/@react-native-firebase/app/-/app-24.0.0.tgz", - "integrity": "sha512-rLWNd8/4FjKYV7PeDR9uiT5vwYWdJ7dJ1yiIIaZ/eL+Y56Ij2iXbqRCUu4zWkvu/ZrJfaGOyT12Vhy1SLy0NMg==", - "license": "Apache-2.0", - "dependencies": { - "firebase": "12.10.0" - }, - "peerDependencies": { - "expo": ">=47.0.0", + "expo": ">=52.0.40", "react": "*", "react-native": "*" }, @@ -3172,50 +1996,32 @@ } } }, - "node_modules/@react-native-firebase/crashlytics": { - "version": "24.0.0", - "resolved": "https://registry.npmjs.org/@react-native-firebase/crashlytics/-/crashlytics-24.0.0.tgz", - "integrity": "sha512-slNW6ood4SO9J15OLv2HjWLIsKlVT4VVGew7OacRql0VNDFDxjPwqPDrPus4lCz2oJWS6DQZ+tzZ2BEdT0irSA==", - "license": "Apache-2.0", - "dependencies": { - "stacktrace-js": "^2.0.2" - }, - "peerDependencies": { - "@react-native-firebase/app": "24.0.0", - "expo": ">=47.0.0" - }, - "peerDependenciesMeta": { - "expo": { - "optional": true - } - } - }, "node_modules/@react-native/assets-registry": { - "version": "0.81.5", - "resolved": "https://registry.npmjs.org/@react-native/assets-registry/-/assets-registry-0.81.5.tgz", - "integrity": "sha512-705B6x/5Kxm1RKRvSv0ADYWm5JOnoiQ1ufW7h8uu2E6G9Of/eE6hP/Ivw3U5jI16ERqZxiKQwk34VJbB0niX9w==", + "version": "0.83.6", + "resolved": "https://registry.npmjs.org/@react-native/assets-registry/-/assets-registry-0.83.6.tgz", + "integrity": "sha512-iljb4ue1yWJ3EhySz7EjV6CzSVrI2uNtR8BI2jzP5+QS5E4Cl3fdIJRmVwDEx1pu8uE97PGEusGRHnoaZ9Q3jg==", "license": "MIT", "engines": { "node": ">= 20.19.4" } }, "node_modules/@react-native/babel-plugin-codegen": { - "version": "0.81.5", - "resolved": "https://registry.npmjs.org/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.81.5.tgz", - "integrity": "sha512-oF71cIH6je3fSLi6VPjjC3Sgyyn57JLHXs+mHWc9MoCiJJcM4nqsS5J38zv1XQ8d3zOW2JtHro+LF0tagj2bfQ==", + "version": "0.83.6", + "resolved": "https://registry.npmjs.org/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.83.6.tgz", + "integrity": "sha512-qfRXsHGeucT5c6mK+8Q7v4Ly3zmygfVmFlEtkiq7q07W1OTreld6nib4rJ/DBEeNiKBoBTuHjWliYGNuDjLFQA==", "license": "MIT", "dependencies": { "@babel/traverse": "^7.25.3", - "@react-native/codegen": "0.81.5" + "@react-native/codegen": "0.83.6" }, "engines": { "node": ">= 20.19.4" } }, "node_modules/@react-native/babel-preset": { - "version": "0.81.5", - "resolved": "https://registry.npmjs.org/@react-native/babel-preset/-/babel-preset-0.81.5.tgz", - "integrity": "sha512-UoI/x/5tCmi+pZ3c1+Ypr1DaRMDLI3y+Q70pVLLVgrnC3DHsHRIbHcCHIeG/IJvoeFqFM2sTdhSOLJrf8lOPrA==", + "version": "0.83.6", + "resolved": "https://registry.npmjs.org/@react-native/babel-preset/-/babel-preset-0.83.6.tgz", + "integrity": "sha512-4/fXFDUvGOObETZq4+SUFkafld6OGgQWut5cQiqVghlhCB5z/p2lVhPgEUr/aTxTzeS3AmN+ztC+GpYPQ7tsTw==", "license": "MIT", "dependencies": { "@babel/core": "^7.25.2", @@ -3259,8 +2065,8 @@ "@babel/plugin-transform-typescript": "^7.25.2", "@babel/plugin-transform-unicode-regex": "^7.24.7", "@babel/template": "^7.25.0", - "@react-native/babel-plugin-codegen": "0.81.5", - "babel-plugin-syntax-hermes-parser": "0.29.1", + "@react-native/babel-plugin-codegen": "0.83.6", + "babel-plugin-syntax-hermes-parser": "0.32.0", "babel-plugin-transform-flow-enums": "^0.0.2", "react-refresh": "^0.14.0" }, @@ -3271,16 +2077,40 @@ "@babel/core": "*" } }, + "node_modules/@react-native/babel-preset/node_modules/babel-plugin-syntax-hermes-parser": { + "version": "0.32.0", + "resolved": "https://registry.npmjs.org/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.npmjs.org/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.npmjs.org/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.81.5", - "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.81.5.tgz", - "integrity": "sha512-a2TDA03Up8lpSa9sh5VRGCQDXgCTOyDOFH+aqyinxp1HChG8uk89/G+nkJ9FPd0rqgi25eCTR16TWdS3b+fA6g==", + "version": "0.83.6", + "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.83.6.tgz", + "integrity": "sha512-doB/Pq6Cf6IjF3wlQXTIiZOnsX9X8mEEk+CdGfyuCwZjWrf7IB8KaZEXXckJmfUcIwvJ9u/a72ZoTTCIoxAc9A==", "license": "MIT", "dependencies": { "@babel/core": "^7.25.2", "@babel/parser": "^7.25.3", "glob": "^7.1.1", - "hermes-parser": "0.29.1", + "hermes-parser": "0.32.0", "invariant": "^2.2.4", "nullthrows": "^1.1.1", "yargs": "^17.6.2" @@ -3324,18 +2154,18 @@ } }, "node_modules/@react-native/codegen/node_modules/hermes-estree": { - "version": "0.29.1", - "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.29.1.tgz", - "integrity": "sha512-jl+x31n4/w+wEqm0I2r4CMimukLbLQEYpisys5oCre611CI5fc9TxhqkBBCJ1edDG4Kza0f7CgNz8xVMLZQOmQ==", + "version": "0.32.0", + "resolved": "https://registry.npmjs.org/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.29.1", - "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.29.1.tgz", - "integrity": "sha512-xBHWmUtRC5e/UL0tI7Ivt2riA/YBq9+SiYFU7C1oBa/j2jYGlIF9043oak1F47ihuDIxQ5nbsKueYJDRY02UgA==", + "version": "0.32.0", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.32.0.tgz", + "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==", "license": "MIT", "dependencies": { - "hermes-estree": "0.29.1" + "hermes-estree": "0.32.0" } }, "node_modules/@react-native/codegen/node_modules/minimatch": { @@ -3351,17 +2181,17 @@ } }, "node_modules/@react-native/community-cli-plugin": { - "version": "0.81.5", - "resolved": "https://registry.npmjs.org/@react-native/community-cli-plugin/-/community-cli-plugin-0.81.5.tgz", - "integrity": "sha512-yWRlmEOtcyvSZ4+OvqPabt+NS36vg0K/WADTQLhrYrm9qdZSuXmq8PmdJWz/68wAqKQ+4KTILiq2kjRQwnyhQw==", + "version": "0.83.6", + "resolved": "https://registry.npmjs.org/@react-native/community-cli-plugin/-/community-cli-plugin-0.83.6.tgz", + "integrity": "sha512-Mko6mywoHYJmpBnjwAC95vQWaUUh//71knFadH0BrhHDq2m7i/IrpLwcQsPAy8855ucXflBs5zQyGTpNbPBAaw==", "license": "MIT", "dependencies": { - "@react-native/dev-middleware": "0.81.5", + "@react-native/dev-middleware": "0.83.6", "debug": "^4.4.0", "invariant": "^2.2.4", - "metro": "^0.83.1", - "metro-config": "^0.83.1", - "metro-core": "^0.83.1", + "metro": "^0.83.6", + "metro-config": "^0.83.6", + "metro-core": "^0.83.6", "semver": "^7.1.3" }, "engines": { @@ -3381,22 +2211,36 @@ } }, "node_modules/@react-native/debugger-frontend": { - "version": "0.81.5", - "resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.81.5.tgz", - "integrity": "sha512-bnd9FSdWKx2ncklOetCgrlwqSGhMHP2zOxObJbOWXoj7GHEmih4MKarBo5/a8gX8EfA1EwRATdfNBQ81DY+h+w==", + "version": "0.83.6", + "resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.83.6.tgz", + "integrity": "sha512-TyWXEpAjVundrc87fPWg91piOUg75+X9iutcfDe7cO3NrAEYCsl7Z09rKHuiAGkxfG9/rFD13dPsYIixUFkSFA==", "license": "BSD-3-Clause", "engines": { "node": ">= 20.19.4" } }, + "node_modules/@react-native/debugger-shell": { + "version": "0.83.6", + "resolved": "https://registry.npmjs.org/@react-native/debugger-shell/-/debugger-shell-0.83.6.tgz", + "integrity": "sha512-684TJMBCU0l0ZjJWzrnK0HH+ERaM9KLyxyArE1k7BrP+gVl4X9GO0Pi94RoInOxvW/nyV65sOU6Ip1F3ygS0cg==", + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.6", + "fb-dotslash": "0.5.8" + }, + "engines": { + "node": ">= 20.19.4" + } + }, "node_modules/@react-native/dev-middleware": { - "version": "0.81.5", - "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.81.5.tgz", - "integrity": "sha512-WfPfZzboYgo/TUtysuD5xyANzzfka8Ebni6RIb2wDxhb56ERi7qDrE4xGhtPsjCL4pQBXSVxyIlCy0d8I6EgGA==", + "version": "0.83.6", + "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.83.6.tgz", + "integrity": "sha512-22xoddLTelpcVnF385SNH2hdP7X2av5pu7yRl/WnM5jBznbcl0+M9Ce94cj+WVeomsoUF/vlfuB0Ooy+RMlRiA==", "license": "MIT", "dependencies": { "@isaacs/ttlcache": "^1.4.1", - "@react-native/debugger-frontend": "0.81.5", + "@react-native/debugger-frontend": "0.83.6", + "@react-native/debugger-shell": "0.83.6", "chrome-launcher": "^0.15.2", "chromium-edge-launcher": "^0.2.0", "connect": "^3.6.5", @@ -3405,43 +2249,34 @@ "nullthrows": "^1.1.1", "open": "^7.0.3", "serve-static": "^1.16.2", - "ws": "^6.2.3" + "ws": "^7.5.10" }, "engines": { "node": ">= 20.19.4" } }, - "node_modules/@react-native/dev-middleware/node_modules/ws": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.3.tgz", - "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", - "license": "MIT", - "dependencies": { - "async-limiter": "~1.0.0" - } - }, "node_modules/@react-native/gradle-plugin": { - "version": "0.81.5", - "resolved": "https://registry.npmjs.org/@react-native/gradle-plugin/-/gradle-plugin-0.81.5.tgz", - "integrity": "sha512-hORRlNBj+ReNMLo9jme3yQ6JQf4GZpVEBLxmTXGGlIL78MAezDZr5/uq9dwElSbcGmLEgeiax6e174Fie6qPLg==", + "version": "0.83.6", + "resolved": "https://registry.npmjs.org/@react-native/gradle-plugin/-/gradle-plugin-0.83.6.tgz", + "integrity": "sha512-5prXv7WWR1RgZ/kWGZP+mi7/y/IE2ymfOHIZO5Pv14tMOmRAcQSgSYogcRmOiWw5mJs2K0UFeMiQD49ZO9oCug==", "license": "MIT", "engines": { "node": ">= 20.19.4" } }, "node_modules/@react-native/js-polyfills": { - "version": "0.81.5", - "resolved": "https://registry.npmjs.org/@react-native/js-polyfills/-/js-polyfills-0.81.5.tgz", - "integrity": "sha512-fB7M1CMOCIUudTRuj7kzxIBTVw2KXnsgbQ6+4cbqSxo8NmRRhA0Ul4ZUzZj3rFd3VznTL4Brmocv1oiN0bWZ8w==", + "version": "0.83.6", + "resolved": "https://registry.npmjs.org/@react-native/js-polyfills/-/js-polyfills-0.83.6.tgz", + "integrity": "sha512-VSev0LV2i5X0ibduHBSLqKj0YU2F+waCgjl2uvaGHMGCSV1ZRKNFX/vJFqvLwjvdzLbkAZoFT1Rg7k7jDv44UA==", "license": "MIT", "engines": { "node": ">= 20.19.4" } }, "node_modules/@react-native/normalize-colors": { - "version": "0.81.5", - "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.81.5.tgz", - "integrity": "sha512-0HuJ8YtqlTVRXGZuGeBejLE04wSQsibpTI+RGOyVqxZvgtlLLC/Ssw0UmbHhT4lYMp2fhdtvKZSs5emWB1zR/g==", + "version": "0.83.6", + "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.83.6.tgz", + "integrity": "sha512-bTM24b5v4qN3h52oflnv+OujFORn/kVi06WaWhnQQw14/ycilPqIsqsa+DpIBqdBrXxvLa9fXtCRrQtGATZCEw==", "license": "MIT" }, "node_modules/@react-navigation/bottom-tabs": { @@ -3812,13 +2647,13 @@ } }, "node_modules/@types/react": { - "version": "19.1.17", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.17.tgz", - "integrity": "sha512-Qec1E3mhALmaspIrhWt9jkQMNdw6bReVu64mjvhbhq2NFPftLPVr+l1SZgmw/66WwBNpDh7ao5AT6gF5v41PFA==", + "version": "19.2.14", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz", + "integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==", "devOptional": true, "license": "MIT", "dependencies": { - "csstype": "^3.0.2" + "csstype": "^3.2.2" } }, "node_modules/@types/stack-utils": { @@ -3857,29 +2692,6 @@ "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", "license": "ISC" }, - "node_modules/@urql/core": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@urql/core/-/core-5.2.0.tgz", - "integrity": "sha512-/n0ieD0mvvDnVAXEQgX/7qJiVcvYvNkOHeBvkwtylfjydar123caCXcl58PXFY11oU1oquJocVXHxLAbtv4x1A==", - "license": "MIT", - "dependencies": { - "@0no-co/graphql.web": "^1.0.13", - "wonka": "^6.3.2" - } - }, - "node_modules/@urql/exchange-retry": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@urql/exchange-retry/-/exchange-retry-1.3.2.tgz", - "integrity": "sha512-TQMCz2pFJMfpNxmSfX1VSfTjwUIFx/mL+p1bnfM1xjjdla7Z+KnGMW/EhFbpckp3LyWAH4PgOsMwOMnIN+MBFg==", - "license": "MIT", - "dependencies": { - "@urql/core": "^5.1.2", - "wonka": "^6.3.2" - }, - "peerDependencies": { - "@urql/core": "^5.0.0" - } - }, "node_modules/@xmldom/xmldom": { "version": "0.8.12", "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.12.tgz", @@ -3902,13 +2714,13 @@ } }, "node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", + "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", "license": "MIT", "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" + "mime-types": "^3.0.0", + "negotiator": "^1.0.0" }, "engines": { "node": ">= 0.6" @@ -3935,22 +2747,6 @@ "node": ">= 14" } }, - "node_modules/ajv": { - "version": "8.20.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", - "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, "node_modules/anser": { "version": "1.4.10", "resolved": "https://registry.npmjs.org/anser/-/anser-1.4.10.tgz", @@ -4008,12 +2804,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", - "license": "MIT" - }, "node_modules/anymatch": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", @@ -4048,12 +2838,6 @@ "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", "license": "MIT" }, - "node_modules/async-limiter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", - "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", - "license": "MIT" - }, "node_modules/babel-jest": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", @@ -4170,27 +2954,27 @@ "license": "MIT" }, "node_modules/babel-plugin-syntax-hermes-parser": { - "version": "0.29.1", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-hermes-parser/-/babel-plugin-syntax-hermes-parser-0.29.1.tgz", - "integrity": "sha512-2WFYnoWGdmih1I1J5eIqxATOeycOqRwYxAQBu3cUu/rhwInwHUg7k60AFNbuGjSDL8tje5GDrAnxzRLcu2pYcA==", + "version": "0.32.1", + "resolved": "https://registry.npmjs.org/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.29.1" + "hermes-parser": "0.32.1" } }, "node_modules/babel-plugin-syntax-hermes-parser/node_modules/hermes-estree": { - "version": "0.29.1", - "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.29.1.tgz", - "integrity": "sha512-jl+x31n4/w+wEqm0I2r4CMimukLbLQEYpisys5oCre611CI5fc9TxhqkBBCJ1edDG4Kza0f7CgNz8xVMLZQOmQ==", + "version": "0.32.1", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.32.1.tgz", + "integrity": "sha512-ne5hkuDxheNBAikDjqvCZCwihnz0vVu9YsBzAEO1puiyFR4F1+PAz/SiPHSsNTuOveCYGRMX8Xbx4LOubeC0Qg==", "license": "MIT" }, "node_modules/babel-plugin-syntax-hermes-parser/node_modules/hermes-parser": { - "version": "0.29.1", - "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.29.1.tgz", - "integrity": "sha512-xBHWmUtRC5e/UL0tI7Ivt2riA/YBq9+SiYFU7C1oBa/j2jYGlIF9043oak1F47ihuDIxQ5nbsKueYJDRY02UgA==", + "version": "0.32.1", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.32.1.tgz", + "integrity": "sha512-175dz634X/W5AiwrpLdoMl/MOb17poLHyIqgyExlE8D9zQ1OPnoORnGMB5ltRKnpvQzBjMYvT2rN/sHeIfZW5Q==", "license": "MIT", "dependencies": { - "hermes-estree": "0.29.1" + "hermes-estree": "0.32.1" } }, "node_modules/babel-plugin-transform-flow-enums": { @@ -4229,11 +3013,12 @@ } }, "node_modules/babel-preset-expo": { - "version": "54.0.10", - "resolved": "https://registry.npmjs.org/babel-preset-expo/-/babel-preset-expo-54.0.10.tgz", - "integrity": "sha512-wTt7POavLFypLcPW/uC5v8y+mtQKDJiyGLzYCjqr9tx0Qc3vCXcDKk1iCFIj/++Iy5CWhhTflEa7VvVPNWeCfw==", + "version": "55.0.21", + "resolved": "https://registry.npmjs.org/babel-preset-expo/-/babel-preset-expo-55.0.21.tgz", + "integrity": "sha512-anXoUZBcxydLdVs2L+r3bWKGUvZv2FtgOl8xRJ12i/YfKICBpwTGZWSTiEYTqBByZ6GkA3mE9+3TW97X2ocFTQ==", "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", @@ -4249,10 +3034,10 @@ "@babel/plugin-transform-runtime": "^7.24.7", "@babel/preset-react": "^7.22.15", "@babel/preset-typescript": "^7.23.0", - "@react-native/babel-preset": "0.81.5", + "@react-native/babel-preset": "0.83.6", "babel-plugin-react-compiler": "^1.0.0", "babel-plugin-react-native-web": "~0.21.0", - "babel-plugin-syntax-hermes-parser": "^0.29.1", + "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" @@ -4260,6 +3045,7 @@ "peerDependencies": { "@babel/runtime": "^7.20.0", "expo": "*", + "expo-widgets": "^55.0.17", "react-refresh": ">=0.14.0 <1.0.0" }, "peerDependenciesMeta": { @@ -4268,6 +3054,9 @@ }, "expo": { "optional": true + }, + "expo-widgets": { + "optional": true } } }, @@ -4555,15 +3344,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/chownr": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", - "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=18" - } - }, "node_modules/chrome-launcher": { "version": "0.15.2", "resolved": "https://registry.npmjs.org/chrome-launcher/-/chrome-launcher-0.15.2.tgz", @@ -4901,15 +3681,6 @@ "node": ">=0.10" } }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "license": "MIT", - "engines": { - "node": ">=4.0.0" - } - }, "node_modules/deepmerge": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", @@ -4968,32 +3739,11 @@ "node": ">=8" } }, - "node_modules/dotenv": { - "version": "16.4.7", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz", - "integrity": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://dotenvx.com" - } - }, - "node_modules/dotenv-expand": { - "version": "11.0.7", - "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-11.0.7.tgz", - "integrity": "sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==", - "license": "BSD-2-Clause", - "dependencies": { - "dotenv": "^16.4.5" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://dotenvx.com" - } + "node_modules/dnssd-advertise": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/dnssd-advertise/-/dnssd-advertise-1.1.4.tgz", + "integrity": "sha512-AmGyK9WpNf06WeP5TjHZq/wNzP76OuEeaiTlKr9E/EEelYLczywUKoqRz+DPRq/ErssjT4lU+/W7wzJW+7K/ZA==", + "license": "MIT" }, "node_modules/ee-first": { "version": "1.1.1", @@ -5022,15 +3772,6 @@ "node": ">= 0.8" } }, - "node_modules/env-editor": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/env-editor/-/env-editor-0.4.2.tgz", - "integrity": "sha512-ObFo8v4rQJAE59M69QzwloxPZtd33TpYEIjtKD1rrFDcM1Gd7IkDxEBU+HriziN6HSHQnBJi8Dmy+JWkav5HKA==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/error-stack-parser": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", @@ -5105,32 +3846,34 @@ } }, "node_modules/expo": { - "version": "54.0.34", - "resolved": "https://registry.npmjs.org/expo/-/expo-54.0.34.tgz", - "integrity": "sha512-XkVHguZZDC8BcTQxHAd14/TQFbDp1Wt0Z/KApO9t68Ll5A127hLCPzU+a9gytfCIiyL/V1IpF1vIcOLKEVAoNQ==", + "version": "55.0.23", + "resolved": "https://registry.npmjs.org/expo/-/expo-55.0.23.tgz", + "integrity": "sha512-b+lKwfzJzFiSm9G0wVGWw3c2YoZyubbl9gHOF1ZFuK8FqtxSge8pDDJMuEFmTi14dbKwh/tirB7MiORq54r7CQ==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.20.0", - "@expo/cli": "54.0.24", - "@expo/config": "~12.0.13", - "@expo/config-plugins": "~54.0.4", - "@expo/devtools": "0.1.8", - "@expo/fingerprint": "0.15.5", - "@expo/metro": "~54.2.0", - "@expo/metro-config": "54.0.15", - "@expo/vector-icons": "^15.0.3", + "@expo/cli": "55.0.29", + "@expo/config": "~55.0.16", + "@expo/config-plugins": "~55.0.8", + "@expo/devtools": "55.0.3", + "@expo/fingerprint": "0.16.7", + "@expo/local-build-cache-provider": "55.0.12", + "@expo/log-box": "55.0.12", + "@expo/metro": "~55.1.1", + "@expo/metro-config": "55.0.20", + "@expo/vector-icons": "^15.0.2", "@ungap/structured-clone": "^1.3.0", - "babel-preset-expo": "~54.0.10", - "expo-asset": "~12.0.13", - "expo-constants": "~18.0.13", - "expo-file-system": "~19.0.22", - "expo-font": "~14.0.11", - "expo-keep-awake": "~15.0.8", - "expo-modules-autolinking": "3.0.25", - "expo-modules-core": "3.0.30", + "babel-preset-expo": "~55.0.21", + "expo-asset": "~55.0.17", + "expo-constants": "~55.0.16", + "expo-file-system": "~55.0.19", + "expo-font": "~55.0.7", + "expo-keep-awake": "~55.0.8", + "expo-modules-autolinking": "55.0.21", + "expo-modules-core": "55.0.25", "pretty-format": "^29.7.0", "react-refresh": "^0.14.2", - "whatwg-url-without-unicode": "8.0.0-3" + "whatwg-url-minimum": "^0.1.1" }, "bin": { "expo": "bin/cli", @@ -5157,16 +3900,16 @@ } }, "node_modules/expo-auth-session": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/expo-auth-session/-/expo-auth-session-7.0.11.tgz", - "integrity": "sha512-AhWtt/m9rb1Po77X/VBFbeE6UTgbm2vXP2iCblUSRsHCw2qD6lO0ulKUB8Xyxy9FtoI9yrNQ1iwCNgIIgo8VYQ==", + "version": "55.0.15", + "resolved": "https://registry.npmjs.org/expo-auth-session/-/expo-auth-session-55.0.15.tgz", + "integrity": "sha512-RPnoLs6+FY2MMWnV0cqz4uNzi2b1dwjqE6vv7Izb5vWI2RCFUnBSMy1fgXp4BSWaFm0VZzeMl6UjsgVh2QFe0g==", "license": "MIT", "dependencies": { - "expo-application": "~7.0.8", - "expo-constants": "~18.0.13", - "expo-crypto": "~15.0.9", - "expo-linking": "~8.0.12", - "expo-web-browser": "~15.0.11", + "expo-application": "~55.0.14", + "expo-constants": "~55.0.15", + "expo-crypto": "~55.0.14", + "expo-linking": "~55.0.14", + "expo-web-browser": "~55.0.14", "invariant": "^2.2.4" }, "peerDependencies": { @@ -5175,22 +3918,21 @@ } }, "node_modules/expo-auth-session/node_modules/expo-application": { - "version": "7.0.8", - "resolved": "https://registry.npmjs.org/expo-application/-/expo-application-7.0.8.tgz", - "integrity": "sha512-qFGyxk7VJbrNOQWBbE09XUuGuvkOgFS9QfToaK2FdagM2aQ+x3CvGV2DuVgl/l4ZxPgIf3b/MNh9xHpwSwn74Q==", + "version": "55.0.14", + "resolved": "https://registry.npmjs.org/expo-application/-/expo-application-55.0.14.tgz", + "integrity": "sha512-NgqDIt3eCf4aVLp1L6AcEanCYoyJeuBsGrgGSzOIvxAsOvp5X3SYKW3ROgpKUnLQEKMWlzwETpjsUGszcqkk8g==", "license": "MIT", "peerDependencies": { "expo": "*" } }, "node_modules/expo-auth-session/node_modules/expo-constants": { - "version": "18.0.13", - "resolved": "https://registry.npmjs.org/expo-constants/-/expo-constants-18.0.13.tgz", - "integrity": "sha512-FnZn12E1dRYKDHlAdIyNFhBurKTS3F9CrfrBDJI5m3D7U17KBHMQ6JEfYlSj7LG7t+Ulr+IKaj58L1k5gBwTcQ==", + "version": "55.0.16", + "resolved": "https://registry.npmjs.org/expo-constants/-/expo-constants-55.0.16.tgz", + "integrity": "sha512-Z15/No94UHoogD+pulxjudGAeOHTEIWZgb/vnX48Wx5D+apWTeCbnKxQZZtGQlosvduYL5kaic2/W8U+NHfBQQ==", "license": "MIT", "dependencies": { - "@expo/config": "~12.0.13", - "@expo/env": "~2.0.8" + "@expo/env": "~2.1.2" }, "peerDependencies": { "expo": "*", @@ -5198,99 +3940,96 @@ } }, "node_modules/expo-crypto": { - "version": "15.0.9", - "resolved": "https://registry.npmjs.org/expo-crypto/-/expo-crypto-15.0.9.tgz", - "integrity": "sha512-SNWKa2fXx7v9gkp1h/7nqXY5XN7qgNDn3yRc2aO0gWGbeMbvob/haMxxsPFe9f51aqH5NjNCqHf2kvLhvAd8KQ==", + "version": "55.0.14", + "resolved": "https://registry.npmjs.org/expo-crypto/-/expo-crypto-55.0.14.tgz", + "integrity": "sha512-TfAADBGZNNv9OOmdKFJCz54wDj87ufxtzQNSY+Roycpm8e5tuCnDIL7EjqUOmNTGH99Jj8ftPGFt4KGG2Ii2fg==", "license": "MIT", - "dependencies": { - "base64-js": "^1.3.0" - }, "peerDependencies": { "expo": "*" } }, "node_modules/expo-dev-client": { - "version": "6.0.21", - "resolved": "https://registry.npmjs.org/expo-dev-client/-/expo-dev-client-6.0.21.tgz", - "integrity": "sha512-SWI6HD0pa4eJujkYFkvvpezUE1zmJXGLu+34azpu7+QJgO+FLutDYDj8BSTdeH/NYDEClDFjCGqVMcWETvmsCQ==", + "version": "55.0.32", + "resolved": "https://registry.npmjs.org/expo-dev-client/-/expo-dev-client-55.0.32.tgz", + "integrity": "sha512-rfZ0Xpgbw3RPymkivvLSQ2Koqefj+oVOReqNLN3JXDlqdC2jOr3MCqfTaJs5VFNzFKk7pOPyE60jh03UdvsHCQ==", "license": "MIT", "dependencies": { - "expo-dev-launcher": "6.0.21", - "expo-dev-menu": "7.0.19", - "expo-dev-menu-interface": "2.0.0", - "expo-manifests": "~1.0.11", - "expo-updates-interface": "~2.0.0" + "expo-dev-launcher": "55.0.33", + "expo-dev-menu": "55.0.27", + "expo-dev-menu-interface": "55.0.2", + "expo-manifests": "~55.0.16", + "expo-updates-interface": "~55.1.6" }, "peerDependencies": { "expo": "*" } }, "node_modules/expo-dev-launcher": { - "version": "6.0.21", - "resolved": "https://registry.npmjs.org/expo-dev-launcher/-/expo-dev-launcher-6.0.21.tgz", - "integrity": "sha512-QZ9gcKMZbp6EsIhzS0QoGB8Cf4xeVJhjbNgWUwcoBIk8gshoFz8CkCQOnX+HNv2sSY3rdCaNpx3Xo0Rflyq7rA==", + "version": "55.0.33", + "resolved": "https://registry.npmjs.org/expo-dev-launcher/-/expo-dev-launcher-55.0.33.tgz", + "integrity": "sha512-WZsTtyEVgCBMj3vlgbDSKbYbUbAwijNhJY9jBqqlmbPLHtLE+Wc6nCTafb0dWY6+Si+afF98lvPyz6WSAu59uA==", "license": "MIT", "dependencies": { - "ajv": "^8.11.0", - "expo-dev-menu": "7.0.19", - "expo-manifests": "~1.0.11" + "@expo/schema-utils": "^55.0.3", + "expo-dev-menu": "55.0.27", + "expo-manifests": "~55.0.16" }, "peerDependencies": { "expo": "*" } }, "node_modules/expo-dev-menu": { - "version": "7.0.19", - "resolved": "https://registry.npmjs.org/expo-dev-menu/-/expo-dev-menu-7.0.19.tgz", - "integrity": "sha512-ju5MZiBCPhUKKvHy0ElZdnlhq01mkEEiR8jfrgQVvW26aWjzjLiOhppNAyXtvGbhk7WxJim3wYMiqFFrjGdfKA==", + "version": "55.0.27", + "resolved": "https://registry.npmjs.org/expo-dev-menu/-/expo-dev-menu-55.0.27.tgz", + "integrity": "sha512-Il+kkIXlPDfZ/Z3ZquV1r5niECEByJObUMkB24c0B4N4693f0SDoKyyaRqcGRsRCVXW9r0eAoTeEnXl1revQdA==", "license": "MIT", "dependencies": { - "expo-dev-menu-interface": "2.0.0" + "expo-dev-menu-interface": "55.0.2" }, "peerDependencies": { "expo": "*" } }, "node_modules/expo-dev-menu-interface": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/expo-dev-menu-interface/-/expo-dev-menu-interface-2.0.0.tgz", - "integrity": "sha512-BvAMPt6x+vyXpThsyjjOYyjwfjREV4OOpQkZ0tNl+nGpsPfcY9mc6DRACoWnH9KpLzyIt3BOgh3cuy/h/OxQjw==", + "version": "55.0.2", + "resolved": "https://registry.npmjs.org/expo-dev-menu-interface/-/expo-dev-menu-interface-55.0.2.tgz", + "integrity": "sha512-DomUNvGzY/xliwnMdbAYY780sCv19N7zIbifc0ClcoCzJZpNSCkvJ2qGIFRPyM/7DmqmlHGCKi8di7kYYLKNEg==", "license": "MIT", "peerDependencies": { "expo": "*" } }, "node_modules/expo-image-loader": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/expo-image-loader/-/expo-image-loader-6.0.0.tgz", - "integrity": "sha512-nKs/xnOGw6ACb4g26xceBD57FKLFkSwEUTDXEDF3Gtcu3MqF3ZIYd3YM+sSb1/z9AKV1dYT7rMSGVNgsveXLIQ==", + "version": "55.0.0", + "resolved": "https://registry.npmjs.org/expo-image-loader/-/expo-image-loader-55.0.0.tgz", + "integrity": "sha512-NOjp56wDrfuA5aiNAybBIjqIn1IxKeGJ8CECWZncQ/GzjZfyTYAHTCyeApYkdKkMBLHINzI4BbTGSlbCa0fXXQ==", "license": "MIT", "peerDependencies": { "expo": "*" } }, "node_modules/expo-image-picker": { - "version": "17.0.11", - "resolved": "https://registry.npmjs.org/expo-image-picker/-/expo-image-picker-17.0.11.tgz", - "integrity": "sha512-/apkoyukDvsCHHb9fzP+F34A1uQqSzUtYH/2P/xJACNEwq+mwEXjXvVU8bzlJq6ih0Qo1+tpVivIa7B9kYSwOQ==", + "version": "55.0.20", + "resolved": "https://registry.npmjs.org/expo-image-picker/-/expo-image-picker-55.0.20.tgz", + "integrity": "sha512-lfWt/0rPWdKz8AdDEGmGHZIJSNlVc720Dlx5bfou10FU16ZV5wAbTU63nm2jkXd8hbXke4a/2Ha1dzxCVA+LQQ==", "license": "MIT", "dependencies": { - "expo-image-loader": "~6.0.0" + "expo-image-loader": "~55.0.0" }, "peerDependencies": { "expo": "*" } }, "node_modules/expo-json-utils": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/expo-json-utils/-/expo-json-utils-0.15.0.tgz", - "integrity": "sha512-duRT6oGl80IDzH2LD2yEFWNwGIC2WkozsB6HF3cDYNoNNdUvFk6uN3YiwsTsqVM/D0z6LEAQ01/SlYvN+Fw0JQ==", + "version": "55.0.2", + "resolved": "https://registry.npmjs.org/expo-json-utils/-/expo-json-utils-55.0.2.tgz", + "integrity": "sha512-QJMOZOPOG7CTnKcrdVaiummn2va1MCO56z++eyWkDv3GBRODldM6MFMDf/jTREWthFc2Nxo6TuyWRrEV9S6n/Q==", "license": "MIT" }, "node_modules/expo-linear-gradient": { - "version": "15.0.8", - "resolved": "https://registry.npmjs.org/expo-linear-gradient/-/expo-linear-gradient-15.0.8.tgz", - "integrity": "sha512-V2d8Wjn0VzhPHO+rrSBtcl+Fo+jUUccdlmQ6OoL9/XQB7Qk3d9lYrqKDJyccwDxmQT10JdST3Tmf2K52NLc3kw==", + "version": "55.0.13", + "resolved": "https://registry.npmjs.org/expo-linear-gradient/-/expo-linear-gradient-55.0.13.tgz", + "integrity": "sha512-Qz2T4jpkA15RIk29DBqI1TwW+8O9AN8MyC4TJPbh/5UnihH0yNNz3waplUO8Szh5OZ3czTGvtPQU4ysF3RDxwQ==", "license": "MIT", "peerDependencies": { "expo": "*", @@ -5299,12 +4038,12 @@ } }, "node_modules/expo-linking": { - "version": "8.0.12", - "resolved": "https://registry.npmjs.org/expo-linking/-/expo-linking-8.0.12.tgz", - "integrity": "sha512-FpXeIpFgZuxihwT9lBo86YD3y6LphBuAhN680MMxm/Y7fmsc57vimn2d3vFu68VI0+Z9w457t494mu2wvlgWTQ==", + "version": "55.0.15", + "resolved": "https://registry.npmjs.org/expo-linking/-/expo-linking-55.0.15.tgz", + "integrity": "sha512-/RQh2vkNqV8Bim9Owm/evVqn2fqTvCDYHkpYPoSKbLAdydSGdHC2xZNw7Odl4wu1i1/3L4Xz//LKd3NsPWYWBQ==", "license": "MIT", "dependencies": { - "expo-constants": "~18.0.13", + "expo-constants": "~55.0.16", "invariant": "^2.2.4" }, "peerDependencies": { @@ -5313,13 +4052,12 @@ } }, "node_modules/expo-linking/node_modules/expo-constants": { - "version": "18.0.13", - "resolved": "https://registry.npmjs.org/expo-constants/-/expo-constants-18.0.13.tgz", - "integrity": "sha512-FnZn12E1dRYKDHlAdIyNFhBurKTS3F9CrfrBDJI5m3D7U17KBHMQ6JEfYlSj7LG7t+Ulr+IKaj58L1k5gBwTcQ==", + "version": "55.0.16", + "resolved": "https://registry.npmjs.org/expo-constants/-/expo-constants-55.0.16.tgz", + "integrity": "sha512-Z15/No94UHoogD+pulxjudGAeOHTEIWZgb/vnX48Wx5D+apWTeCbnKxQZZtGQlosvduYL5kaic2/W8U+NHfBQQ==", "license": "MIT", "dependencies": { - "@expo/config": "~12.0.13", - "@expo/env": "~2.0.8" + "@expo/env": "~2.1.2" }, "peerDependencies": { "expo": "*", @@ -5327,22 +4065,21 @@ } }, "node_modules/expo-manifests": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/expo-manifests/-/expo-manifests-1.0.11.tgz", - "integrity": "sha512-6zItytTewN37Cjhp3glUg0ozrgW2GwB8x9wtfzUNoJIMmxO38nnGdTLMaotYhRqdf5PP2Dzdmej1HDHXVNUpRw==", + "version": "55.0.16", + "resolved": "https://registry.npmjs.org/expo-manifests/-/expo-manifests-55.0.16.tgz", + "integrity": "sha512-BR9BPcNsSnCKlQ/d7ECywr+2T54+bTSr26HjRjSua949o4mO/iPIrLjK0lOAa1oIczju6a6oUFckZD2OljxP0g==", "license": "MIT", "dependencies": { - "@expo/config": "~12.0.13", - "expo-json-utils": "~0.15.0" + "expo-json-utils": "~55.0.2" }, "peerDependencies": { "expo": "*" } }, "node_modules/expo-media-library": { - "version": "18.2.1", - "resolved": "https://registry.npmjs.org/expo-media-library/-/expo-media-library-18.2.1.tgz", - "integrity": "sha512-dV1acx6Aseu+I5hmF61wY8UkD4vdt8d7YXHDfgNp6ZSs06qxayUxgrBsiG2eigLe54VLm3ycbFBbWi31lhfsCA==", + "version": "55.0.16", + "resolved": "https://registry.npmjs.org/expo-media-library/-/expo-media-library-55.0.16.tgz", + "integrity": "sha512-ZSo5hkLiPXZUQ7TdJfG3N5xh9HVwTwGoLMom2lxHUJs4+4nHMO0D/A1n2aH6+ZGAqqvpL0GcNHLB0xWk0VdO5A==", "license": "MIT", "peerDependencies": { "expo": "*", @@ -5350,38 +4087,43 @@ } }, "node_modules/expo-modules-autolinking": { - "version": "3.0.25", - "resolved": "https://registry.npmjs.org/expo-modules-autolinking/-/expo-modules-autolinking-3.0.25.tgz", - "integrity": "sha512-YmHWctJlwvOuLZccg3cOXvSiXVJrPMKl7g2YR0YHWoGL9v2RvcmgaPJWPSLVW+voNEgEPsbo5UmUrAqbnYcBeg==", + "version": "55.0.21", + "resolved": "https://registry.npmjs.org/expo-modules-autolinking/-/expo-modules-autolinking-55.0.21.tgz", + "integrity": "sha512-P9KsJgOwI7JVwxmGfRvcXkXO4LNRvHRdWmb4ukLmX15G/vZ7b6SM17yiYkPceWq1F5KeeZ11KFjEcl0y17xy7w==", "license": "MIT", "dependencies": { + "@expo/require-utils": "^55.0.5", "@expo/spawn-async": "^1.7.2", "chalk": "^4.1.0", - "commander": "^7.2.0", - "require-from-string": "^2.0.2", - "resolve-from": "^5.0.0" + "commander": "^7.2.0" }, "bin": { "expo-modules-autolinking": "bin/expo-modules-autolinking.js" } }, "node_modules/expo-modules-core": { - "version": "3.0.30", - "resolved": "https://registry.npmjs.org/expo-modules-core/-/expo-modules-core-3.0.30.tgz", - "integrity": "sha512-a6IrpAn/Jbmwxi9L+hMmXKpNqnkUpoF7WHOpn02rVLyax2J0gB1vvCVE5rNydplEnt41Q6WxQwvcOjZaIkcSUg==", + "version": "55.0.25", + "resolved": "https://registry.npmjs.org/expo-modules-core/-/expo-modules-core-55.0.25.tgz", + "integrity": "sha512-yXpfg7aHLbuqoXocK34Vua6Aey5SCyqLygAsXAMbul9P8vfBjLpaOPiTJ5cLVF7Drfq8ownqVJO6qpGEtZ6GOw==", "license": "MIT", "dependencies": { "invariant": "^2.2.4" }, "peerDependencies": { "react": "*", - "react-native": "*" + "react-native": "*", + "react-native-worklets": "^0.7.4 || ^0.8.0" + }, + "peerDependenciesMeta": { + "react-native-worklets": { + "optional": true + } } }, "node_modules/expo-print": { - "version": "15.0.8", - "resolved": "https://registry.npmjs.org/expo-print/-/expo-print-15.0.8.tgz", - "integrity": "sha512-4O0Qzm0On5AmJIl9d+BT+ieTipFp658nHI4aX7vKEFPfj3dfQxG6rDJJpca+rrc9c4Ha8ZFYGvxJG5+4lFq2Pw==", + "version": "55.0.14", + "resolved": "https://registry.npmjs.org/expo-print/-/expo-print-55.0.14.tgz", + "integrity": "sha512-GNznEjRHUjJj3GRRElHff3t2xtarO1zakEBdlxuYBoY0G/Ae59XaBQdlpzTjhceAdASlqsrnugHlQz6bsZRDnw==", "license": "MIT", "peerDependencies": { "expo": "*", @@ -5389,27 +4131,34 @@ } }, "node_modules/expo-server": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/expo-server/-/expo-server-1.0.6.tgz", - "integrity": "sha512-vb5TBtskvEdzYuW79lATXutOEBfW5m6U4EFpNjCVZTnI7S//SAsLQkYEpn+EDfn84m6VQfzSGkIVR6YPaScKFA==", + "version": "55.0.9", + "resolved": "https://registry.npmjs.org/expo-server/-/expo-server-55.0.9.tgz", + "integrity": "sha512-N5Ipn1NwqaJzEm+G97o0Jbe4g/th3R/16N1DabnYryXKCiZwDkK13/w3VfGkQN9LOOaBP+JIRxGf4M8lQKPzyA==", "license": "MIT", "engines": { "node": ">=20.16.0" } }, "node_modules/expo-sharing": { - "version": "14.0.8", - "resolved": "https://registry.npmjs.org/expo-sharing/-/expo-sharing-14.0.8.tgz", - "integrity": "sha512-A1pPr2iBrxypFDCWVAESk532HK+db7MFXbvO2sCV9ienaFXAk7lIBm6bkqgE6vzRd9O3RGdEGzYx80cYlc089Q==", + "version": "55.0.18", + "resolved": "https://registry.npmjs.org/expo-sharing/-/expo-sharing-55.0.18.tgz", + "integrity": "sha512-Tqy4LXRLw/UEg5mT7BKhx8y4ReNz8fVldvhHJV5cesH3kRgEerHkYxVwid2vd7v34KnNp0RH1OqUyDlzZTQ9AQ==", "license": "MIT", + "dependencies": { + "@expo/config-plugins": "^55.0.8", + "@expo/config-types": "^55.0.5", + "@expo/plist": "^0.5.2" + }, "peerDependencies": { - "expo": "*" + "expo": "*", + "react": "*", + "react-native": "*" } }, "node_modules/expo-status-bar": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/expo-status-bar/-/expo-status-bar-3.0.9.tgz", - "integrity": "sha512-xyYyVg6V1/SSOZWh4Ni3U129XHCnFHBTcUo0dhWtFDrZbNp/duw5AGsQfb2sVeU0gxWHXSY1+5F0jnKYC7WuOw==", + "version": "55.0.6", + "resolved": "https://registry.npmjs.org/expo-status-bar/-/expo-status-bar-55.0.6.tgz", + "integrity": "sha512-ijOUptfdiqYt7rObZ6jrPQ8sE5YN/8MxKCIJx0b7TY4nGkSJxhPIxeoW4GXcXCA8mTQ9PiOHH/ThLZgRVZvUlQ==", "license": "MIT", "dependencies": { "react-native-is-edge-to-edge": "^1.2.1" @@ -5420,18 +4169,18 @@ } }, "node_modules/expo-updates-interface": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/expo-updates-interface/-/expo-updates-interface-2.0.0.tgz", - "integrity": "sha512-pTzAIufEZdVPKql6iMi5ylVSPqV1qbEopz9G6TSECQmnNde2nwq42PxdFBaUEd8IZJ/fdJLQnOT3m6+XJ5s7jg==", + "version": "55.1.6", + "resolved": "https://registry.npmjs.org/expo-updates-interface/-/expo-updates-interface-55.1.6.tgz", + "integrity": "sha512-evxNpagCkjT3lE6bGV570TFzRtKuIuLY8I37RYHoriXCJ+ZKCN1hbmklK29uAixya+BxGpeTI2K4FqYeJLvfrw==", "license": "MIT", "peerDependencies": { "expo": "*" } }, "node_modules/expo-web-browser": { - "version": "15.0.11", - "resolved": "https://registry.npmjs.org/expo-web-browser/-/expo-web-browser-15.0.11.tgz", - "integrity": "sha512-r2LS4Ro6DgUPZkcaEfgt8mp9eJuoA93x11Jh7S6utFe0FEzvUNn2yFhxg8XVwESaaHGt2k5V8LuK36rsp0BeIw==", + "version": "55.0.15", + "resolved": "https://registry.npmjs.org/expo-web-browser/-/expo-web-browser-55.0.15.tgz", + "integrity": "sha512-6hwZQob3EF+RWwZ+IvWLZjj2wI1frqx21+m/uzBqdUEHUhp2cVJi7kmxDolDmrve+ZldryZi1qfN78ALdvjHSA==", "license": "MIT", "peerDependencies": { "expo": "*", @@ -5439,32 +4188,32 @@ } }, "node_modules/expo/node_modules/@expo/cli": { - "version": "54.0.24", - "resolved": "https://registry.npmjs.org/@expo/cli/-/cli-54.0.24.tgz", - "integrity": "sha512-5xse1bEgnVUBhOrtttc6xTNJVvjyTRavpzuF0/0nuj+312vfSbk7EiRbG+xJ2pW/iZxnhLPJkFCrPYG0nmheAQ==", + "version": "55.0.29", + "resolved": "https://registry.npmjs.org/@expo/cli/-/cli-55.0.29.tgz", + "integrity": "sha512-r2dXQ82e/3nwxS7faLRL6HBD8UWDo/IyptQ0Vg6Z5Bgyp2Kd24h8xPn3RHfY3LLJ3wfEXglf4E79/Dqkm1Z6WA==", "license": "MIT", "dependencies": { - "@0no-co/graphql.web": "^1.0.8", "@expo/code-signing-certificates": "^0.0.6", - "@expo/config": "~12.0.13", - "@expo/config-plugins": "~54.0.4", + "@expo/config": "~55.0.16", + "@expo/config-plugins": "~55.0.8", "@expo/devcert": "^1.2.1", - "@expo/env": "~2.0.8", - "@expo/image-utils": "^0.8.8", - "@expo/json-file": "^10.0.8", - "@expo/metro": "~54.2.0", - "@expo/metro-config": "~54.0.15", - "@expo/osascript": "^2.3.8", - "@expo/package-manager": "^1.9.10", - "@expo/plist": "^0.4.8", - "@expo/prebuild-config": "^54.0.8", - "@expo/schema-utils": "^0.1.8", + "@expo/env": "~2.1.2", + "@expo/image-utils": "^0.8.14", + "@expo/json-file": "^10.0.14", + "@expo/log-box": "55.0.12", + "@expo/metro": "~55.1.1", + "@expo/metro-config": "~55.0.20", + "@expo/osascript": "^2.4.3", + "@expo/package-manager": "^1.10.5", + "@expo/plist": "^0.5.3", + "@expo/prebuild-config": "^55.0.17", + "@expo/require-utils": "^55.0.5", + "@expo/router-server": "^55.0.16", + "@expo/schema-utils": "^55.0.4", "@expo/spawn-async": "^1.7.2", "@expo/ws-tunnel": "^1.0.1", - "@expo/xcpretty": "^4.3.0", - "@react-native/dev-middleware": "0.81.5", - "@urql/core": "^5.0.6", - "@urql/exchange-retry": "^1.3.0", + "@expo/xcpretty": "^4.4.0", + "@react-native/dev-middleware": "0.83.6", "accepts": "^1.3.8", "arg": "^5.0.2", "better-opn": "~3.0.2", @@ -5475,38 +4224,32 @@ "compression": "^1.7.4", "connect": "^3.7.0", "debug": "^4.3.4", - "env-editor": "^0.4.1", - "expo-server": "^1.0.6", - "freeport-async": "^2.0.0", + "dnssd-advertise": "^1.1.4", + "expo-server": "^55.0.9", + "fetch-nodeshim": "^0.4.10", "getenv": "^2.0.0", "glob": "^13.0.0", "lan-network": "^0.2.1", - "minimatch": "^9.0.0", + "multitars": "^1.0.0", "node-forge": "^1.3.3", "npm-package-arg": "^11.0.0", "ora": "^3.4.0", "picomatch": "^4.0.3", - "pretty-bytes": "^5.6.0", "pretty-format": "^29.7.0", "progress": "^2.0.3", "prompts": "^2.3.2", - "qrcode-terminal": "0.11.0", - "require-from-string": "^2.0.2", - "requireg": "^0.2.2", - "resolve": "^1.22.2", "resolve-from": "^5.0.0", - "resolve.exports": "^2.0.3", "semver": "^7.6.0", "send": "^0.19.0", "slugify": "^1.3.4", "source-map-support": "~0.5.21", "stacktrace-parser": "^0.1.10", "structured-headers": "^0.4.1", - "tar": "^7.5.2", "terminal-link": "^2.1.1", - "undici": "^6.18.2", + "toqr": "^0.1.1", "wrap-ansi": "^7.0.0", - "ws": "^8.12.1" + "ws": "^8.12.1", + "zod": "^3.25.76" }, "bin": { "expo-internal": "build/bin/cli" @@ -5526,17 +4269,17 @@ } }, "node_modules/expo/node_modules/@expo/cli/node_modules/@expo/prebuild-config": { - "version": "54.0.8", - "resolved": "https://registry.npmjs.org/@expo/prebuild-config/-/prebuild-config-54.0.8.tgz", - "integrity": "sha512-EA7N4dloty2t5Rde+HP0IEE+nkAQiu4A/+QGZGT9mFnZ5KKjPPkqSyYcRvP5bhQE10D+tvz6X0ngZpulbMdbsg==", + "version": "55.0.17", + "resolved": "https://registry.npmjs.org/@expo/prebuild-config/-/prebuild-config-55.0.17.tgz", + "integrity": "sha512-Mcs+dg4Ripu0yCtzf66KZr18PehI1O8HxzJw+G5SUF8VWX+ic99aci1PltvmydWepLwTQL6ykmpXicAUA31IqA==", "license": "MIT", "dependencies": { - "@expo/config": "~12.0.13", - "@expo/config-plugins": "~54.0.4", - "@expo/config-types": "^54.0.10", - "@expo/image-utils": "^0.8.8", - "@expo/json-file": "^10.0.8", - "@react-native/normalize-colors": "0.81.5", + "@expo/config": "~55.0.16", + "@expo/config-plugins": "~55.0.8", + "@expo/config-types": "^55.0.5", + "@expo/image-utils": "^0.8.14", + "@expo/json-file": "^10.0.14", + "@react-native/normalize-colors": "0.83.6", "debug": "^4.3.1", "resolve-from": "^5.0.0", "semver": "^7.6.0", @@ -5546,223 +4289,41 @@ "expo": "*" } }, - "node_modules/expo/node_modules/@expo/config-plugins": { - "version": "54.0.4", - "resolved": "https://registry.npmjs.org/@expo/config-plugins/-/config-plugins-54.0.4.tgz", - "integrity": "sha512-g2yXGICdoOw5i3LkQSDxl2Q5AlQCrG7oniu0pCPPO+UxGb7He4AFqSvPSy8HpRUj55io17hT62FTjYRD+d6j3Q==", + "node_modules/expo/node_modules/@expo/cli/node_modules/@expo/router-server": { + "version": "55.0.16", + "resolved": "https://registry.npmjs.org/@expo/router-server/-/router-server-55.0.16.tgz", + "integrity": "sha512-LvAdrm039nQBG+95+ff5Rc4CsBuoc/giDhjQrgxB9lKJqC/ZTq1xbwfEZFNq6yokX6fOCs/vlxdhmSkOjMIrvg==", "license": "MIT", "dependencies": { - "@expo/config-types": "^54.0.10", - "@expo/json-file": "~10.0.8", - "@expo/plist": "^0.4.8", - "@expo/sdk-runtime-versions": "^1.0.0", - "chalk": "^4.1.2", - "debug": "^4.3.5", - "getenv": "^2.0.0", - "glob": "^13.0.0", - "resolve-from": "^5.0.0", - "semver": "^7.5.4", - "slash": "^3.0.0", - "slugify": "^1.6.6", - "xcode": "^3.0.1", - "xml2js": "0.6.0" - } - }, - "node_modules/expo/node_modules/@expo/config-types": { - "version": "54.0.10", - "resolved": "https://registry.npmjs.org/@expo/config-types/-/config-types-54.0.10.tgz", - "integrity": "sha512-/J16SC2an1LdtCZ67xhSkGXpALYUVUNyZws7v+PVsFZxClYehDSoKLqyRaGkpHlYrCc08bS0RF5E0JV6g50psA==", - "license": "MIT" - }, - "node_modules/expo/node_modules/@expo/metro-config": { - "version": "54.0.15", - "resolved": "https://registry.npmjs.org/@expo/metro-config/-/metro-config-54.0.15.tgz", - "integrity": "sha512-SqIya4VZ9KHM1S9g+xR0A+QKw1Tfs7Gacx6bQNJ98vs4+O7I5+QP5mHZIB0QSZLUV8opiXebHYTiTu+0OAsIUw==", - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.20.0", - "@babel/core": "^7.20.0", - "@babel/generator": "^7.20.5", - "@expo/config": "~12.0.13", - "@expo/env": "~2.0.8", - "@expo/json-file": "~10.0.8", - "@expo/metro": "~54.2.0", - "@expo/spawn-async": "^1.7.2", - "browserslist": "^4.25.0", - "chalk": "^4.1.0", - "debug": "^4.3.2", - "dotenv": "~16.4.5", - "dotenv-expand": "~11.0.6", - "getenv": "^2.0.0", - "glob": "^13.0.0", - "hermes-parser": "^0.29.1", - "jsc-safe-url": "^0.2.4", - "lightningcss": "^1.30.1", - "picomatch": "^4.0.3", - "postcss": "~8.4.32", - "resolve-from": "^5.0.0" + "debug": "^4.3.4" }, "peerDependencies": { - "expo": "*" + "@expo/metro-runtime": "^55.0.11", + "expo": "*", + "expo-constants": "^55.0.16", + "expo-font": "^55.0.7", + "expo-router": "*", + "expo-server": "^55.0.9", + "react": "*", + "react-dom": "*", + "react-server-dom-webpack": "~19.0.1 || ~19.1.2 || ~19.2.1" }, "peerDependenciesMeta": { - "expo": { + "@expo/metro-runtime": { + "optional": true + }, + "expo-router": { + "optional": true + }, + "react-dom": { + "optional": true + }, + "react-server-dom-webpack": { "optional": true } } }, - "node_modules/expo/node_modules/@expo/plist": { - "version": "0.4.8", - "resolved": "https://registry.npmjs.org/@expo/plist/-/plist-0.4.8.tgz", - "integrity": "sha512-pfNtErGGzzRwHP+5+RqswzPDKkZrx+Cli0mzjQaus1ZWFsog5ibL+nVT3NcporW51o8ggnt7x813vtRbPiyOrQ==", - "license": "MIT", - "dependencies": { - "@xmldom/xmldom": "^0.8.8", - "base64-js": "^1.2.3", - "xmlbuilder": "^15.1.1" - } - }, - "node_modules/expo/node_modules/@expo/vector-icons": { - "version": "15.1.1", - "resolved": "https://registry.npmjs.org/@expo/vector-icons/-/vector-icons-15.1.1.tgz", - "integrity": "sha512-Iu2VkcoI5vygbtYngm7jb4ifxElNVXQYdDrYkT7UCEIiKLeWnQY0wf2ZhHZ+Wro6Sc5TaumpKUOqDRpLi5rkvw==", - "license": "MIT", - "peerDependencies": { - "expo-font": ">=14.0.4", - "react": "*", - "react-native": "*" - } - }, - "node_modules/expo/node_modules/brace-expansion": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz", - "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/expo/node_modules/ci-info": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", - "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/expo/node_modules/expo-asset": { - "version": "12.0.13", - "resolved": "https://registry.npmjs.org/expo-asset/-/expo-asset-12.0.13.tgz", - "integrity": "sha512-x/p7WvQUnkn6K43b9eL6SPeq5Vnf1E8BDe9bDrWrvMqzyUvJnUFvl+ctg3034s/+UHe7Ne2pAmc0+yzbl8CrDQ==", - "license": "MIT", - "dependencies": { - "@expo/image-utils": "^0.8.8", - "expo-constants": "~18.0.13" - }, - "peerDependencies": { - "expo": "*", - "react": "*", - "react-native": "*" - } - }, - "node_modules/expo/node_modules/expo-constants": { - "version": "18.0.13", - "resolved": "https://registry.npmjs.org/expo-constants/-/expo-constants-18.0.13.tgz", - "integrity": "sha512-FnZn12E1dRYKDHlAdIyNFhBurKTS3F9CrfrBDJI5m3D7U17KBHMQ6JEfYlSj7LG7t+Ulr+IKaj58L1k5gBwTcQ==", - "license": "MIT", - "dependencies": { - "@expo/config": "~12.0.13", - "@expo/env": "~2.0.8" - }, - "peerDependencies": { - "expo": "*", - "react-native": "*" - } - }, - "node_modules/expo/node_modules/expo-file-system": { - "version": "19.0.22", - "resolved": "https://registry.npmjs.org/expo-file-system/-/expo-file-system-19.0.22.tgz", - "integrity": "sha512-l9pgahSc7sJD0bP9vBNeXvZjy8QKDpVHVxWmei/ESQOrzmoj5BidziqLVsyZdxsi+PfdbTtttLTAmddH/JafYA==", - "license": "MIT", - "peerDependencies": { - "expo": "*", - "react-native": "*" - } - }, - "node_modules/expo/node_modules/expo-font": { - "version": "14.0.11", - "resolved": "https://registry.npmjs.org/expo-font/-/expo-font-14.0.11.tgz", - "integrity": "sha512-ga0q61ny4s/kr4k8JX9hVH69exVSIfcIc19+qZ7gt71Mqtm7xy2c6kwsPTCyhBW2Ro5yXTT8EaZOpuRi35rHbg==", - "license": "MIT", - "dependencies": { - "fontfaceobserver": "^2.1.0" - }, - "peerDependencies": { - "expo": "*", - "react": "*", - "react-native": "*" - } - }, - "node_modules/expo/node_modules/expo-keep-awake": { - "version": "15.0.8", - "resolved": "https://registry.npmjs.org/expo-keep-awake/-/expo-keep-awake-15.0.8.tgz", - "integrity": "sha512-YK9M1VrnoH1vLJiQzChZgzDvVimVoriibiDIFLbQMpjYBnvyfUeHJcin/Gx1a+XgupNXy92EQJLgI/9ZuXajYQ==", - "license": "MIT", - "peerDependencies": { - "expo": "*", - "react": "*" - } - }, - "node_modules/expo/node_modules/hermes-estree": { - "version": "0.29.1", - "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.29.1.tgz", - "integrity": "sha512-jl+x31n4/w+wEqm0I2r4CMimukLbLQEYpisys5oCre611CI5fc9TxhqkBBCJ1edDG4Kza0f7CgNz8xVMLZQOmQ==", - "license": "MIT" - }, - "node_modules/expo/node_modules/hermes-parser": { - "version": "0.29.1", - "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.29.1.tgz", - "integrity": "sha512-xBHWmUtRC5e/UL0tI7Ivt2riA/YBq9+SiYFU7C1oBa/j2jYGlIF9043oak1F47ihuDIxQ5nbsKueYJDRY02UgA==", - "license": "MIT", - "dependencies": { - "hermes-estree": "0.29.1" - } - }, - "node_modules/expo/node_modules/minimatch": { - "version": "9.0.9", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", - "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.2" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/expo/node_modules/picomatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", - "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/expo/node_modules/ws": { + "node_modules/expo/node_modules/@expo/cli/node_modules/ws": { "version": "8.20.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.20.0.tgz", "integrity": "sha512-sAt8BhgNbzCtgGbt2OxmpuryO63ZoDk/sqaB/znQm94T4fCEsy/yV+7CdC1kJhOU9lboAEU7R3kquuycDoibVA==", @@ -5783,6 +4344,245 @@ } } }, + "node_modules/expo/node_modules/@expo/config": { + "version": "55.0.16", + "resolved": "https://registry.npmjs.org/@expo/config/-/config-55.0.16.tgz", + "integrity": "sha512-H5dpQv5TfyZDNheZAWO3SmP10diGWZwN5QOUsArkDJih0QKNtahQBOmrV2xbhgln/nrUGoy41U/ZIY/MEx63Ug==", + "license": "MIT", + "dependencies": { + "@expo/config-plugins": "~55.0.8", + "@expo/config-types": "^55.0.5", + "@expo/json-file": "^10.0.14", + "@expo/require-utils": "^55.0.5", + "deepmerge": "^4.3.1", + "getenv": "^2.0.0", + "glob": "^13.0.0", + "resolve-workspace-root": "^2.0.0", + "semver": "^7.6.0", + "slugify": "^1.3.4" + } + }, + "node_modules/expo/node_modules/@expo/log-box": { + "version": "55.0.12", + "resolved": "https://registry.npmjs.org/@expo/log-box/-/log-box-55.0.12.tgz", + "integrity": "sha512-f9ARS8J60cq3LLNdIqmUjYwyerBzVS5Ecp7KjIf3GOIPjW0571rkcwLz4/U18l/1DeSkSzIkYsNl2TC9oTdWaQ==", + "license": "MIT", + "dependencies": { + "@expo/dom-webview": "^55.0.6", + "anser": "^1.4.9", + "stacktrace-parser": "^0.1.10" + }, + "peerDependencies": { + "@expo/dom-webview": "^55.0.6", + "expo": "*", + "react": "*", + "react-native": "*" + } + }, + "node_modules/expo/node_modules/@expo/log-box/node_modules/@expo/dom-webview": { + "version": "55.0.6", + "resolved": "https://registry.npmjs.org/@expo/dom-webview/-/dom-webview-55.0.6.tgz", + "integrity": "sha512-ZNm8tiNEZysxrr36J0x4mOCGyJDcaIvL/3tMxBz0VJIJDcV19xjuJAhJQxHovu+jKx6s9tRyEAINa1mdrzV39g==", + "license": "MIT", + "peerDependencies": { + "expo": "*", + "react": "*", + "react-native": "*" + } + }, + "node_modules/expo/node_modules/@expo/metro-config": { + "version": "55.0.20", + "resolved": "https://registry.npmjs.org/@expo/metro-config/-/metro-config-55.0.20.tgz", + "integrity": "sha512-dUv0simEyPbN2wbOjI+BdEZyXdghgCZD0+3rrA1WxXZN1lRofUx6g2+Nik2Qg61v/BXFrCTh8reYEzQPzHOhdQ==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.20.0", + "@babel/core": "^7.20.0", + "@babel/generator": "^7.20.5", + "@expo/config": "~55.0.16", + "@expo/env": "~2.1.2", + "@expo/json-file": "~10.0.14", + "@expo/metro": "~55.1.1", + "@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/node_modules/@expo/vector-icons": { + "version": "15.1.1", + "resolved": "https://registry.npmjs.org/@expo/vector-icons/-/vector-icons-15.1.1.tgz", + "integrity": "sha512-Iu2VkcoI5vygbtYngm7jb4ifxElNVXQYdDrYkT7UCEIiKLeWnQY0wf2ZhHZ+Wro6Sc5TaumpKUOqDRpLi5rkvw==", + "license": "MIT", + "peerDependencies": { + "expo-font": ">=14.0.4", + "react": "*", + "react-native": "*" + } + }, + "node_modules/expo/node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/expo/node_modules/ci-info": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/expo/node_modules/expo-asset": { + "version": "55.0.17", + "resolved": "https://registry.npmjs.org/expo-asset/-/expo-asset-55.0.17.tgz", + "integrity": "sha512-pK9HHJuFqjE8kDUcbMFsZj3Cz8WdXpvZHZmYl7ouFQp59P83BvHln6VnqPDGlO+/4929G0Lm8ZUzbONuNRhi9w==", + "license": "MIT", + "dependencies": { + "@expo/image-utils": "^0.8.14", + "expo-constants": "~55.0.16" + }, + "peerDependencies": { + "expo": "*", + "react": "*", + "react-native": "*" + } + }, + "node_modules/expo/node_modules/expo-constants": { + "version": "55.0.16", + "resolved": "https://registry.npmjs.org/expo-constants/-/expo-constants-55.0.16.tgz", + "integrity": "sha512-Z15/No94UHoogD+pulxjudGAeOHTEIWZgb/vnX48Wx5D+apWTeCbnKxQZZtGQlosvduYL5kaic2/W8U+NHfBQQ==", + "license": "MIT", + "dependencies": { + "@expo/env": "~2.1.2" + }, + "peerDependencies": { + "expo": "*", + "react-native": "*" + } + }, + "node_modules/expo/node_modules/expo-file-system": { + "version": "55.0.19", + "resolved": "https://registry.npmjs.org/expo-file-system/-/expo-file-system-55.0.19.tgz", + "integrity": "sha512-c4smCbMqELLI3YQrGpw21MwZIREXM2e53vQD/+KWQcae1q+hgw8J2TroEqcQ/jVOtFpZYVvyVfgu4HDKNEKmNw==", + "license": "MIT", + "peerDependencies": { + "expo": "*", + "react-native": "*" + } + }, + "node_modules/expo/node_modules/expo-font": { + "version": "55.0.7", + "resolved": "https://registry.npmjs.org/expo-font/-/expo-font-55.0.7.tgz", + "integrity": "sha512-oH39Xb+3i6Y69b7YRP+P+5WLx7621t+ep/RAgLwJJYpTjs7CnSohUG+873rEtqsTAuQGi63ms7x9ZeHj1E9LYw==", + "license": "MIT", + "dependencies": { + "fontfaceobserver": "^2.1.0" + }, + "peerDependencies": { + "expo": "*", + "react": "*", + "react-native": "*" + } + }, + "node_modules/expo/node_modules/expo-keep-awake": { + "version": "55.0.8", + "resolved": "https://registry.npmjs.org/expo-keep-awake/-/expo-keep-awake-55.0.8.tgz", + "integrity": "sha512-PfIpMfM+STOBwkR5XOE+yVtER86c44MD+W8QD8JxuO0sT9pF7Y1SJYakWlpvX8xsGA+bjKLxftm9403s9kQhKA==", + "license": "MIT", + "peerDependencies": { + "expo": "*", + "react": "*" + } + }, + "node_modules/expo/node_modules/hermes-estree": { + "version": "0.32.1", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.32.1.tgz", + "integrity": "sha512-ne5hkuDxheNBAikDjqvCZCwihnz0vVu9YsBzAEO1puiyFR4F1+PAz/SiPHSsNTuOveCYGRMX8Xbx4LOubeC0Qg==", + "license": "MIT" + }, + "node_modules/expo/node_modules/hermes-parser": { + "version": "0.32.1", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.32.1.tgz", + "integrity": "sha512-175dz634X/W5AiwrpLdoMl/MOb17poLHyIqgyExlE8D9zQ1OPnoORnGMB5ltRKnpvQzBjMYvT2rN/sHeIfZW5Q==", + "license": "MIT", + "dependencies": { + "hermes-estree": "0.32.1" + } + }, + "node_modules/expo/node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/expo/node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/expo/node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/expo/node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/exponential-backoff": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.3.tgz", @@ -5801,32 +4601,16 @@ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "license": "MIT" }, - "node_modules/fast-uri": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.1.tgz", - "integrity": "sha512-h2r7rcm6Ee/J8o0LD5djLuFVcfbZxhvho4vvsbeV0aMvXjUgqv4YpxpkEx0d68l6+IleVfLAdVEfhR7QNMkGHQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ], - "license": "BSD-3-Clause" - }, - "node_modules/faye-websocket": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", - "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", - "license": "Apache-2.0", - "dependencies": { - "websocket-driver": ">=0.5.1" + "node_modules/fb-dotslash": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/fb-dotslash/-/fb-dotslash-0.5.8.tgz", + "integrity": "sha512-XHYLKk9J4BupDxi9bSEhkfss0m+Vr9ChTrjhf9l2iw3jB5C7BnY4GVPoMcqbrTutsKJso6yj2nAB6BI/F2oZaA==", + "license": "(MIT OR Apache-2.0)", + "bin": { + "dotslash": "bin/dotslash" }, "engines": { - "node": ">=0.8.0" + "node": ">=20" } }, "node_modules/fb-watchman": { @@ -5838,6 +4622,12 @@ "bser": "2.1.1" } }, + "node_modules/fetch-nodeshim": { + "version": "0.4.10", + "resolved": "https://registry.npmjs.org/fetch-nodeshim/-/fetch-nodeshim-0.4.10.tgz", + "integrity": "sha512-m6I8ALe4L4XpdETy7MJZWs6L1IVMbjs99bwbpIKphxX+0CTns4IKDWJY0LWfr4YsFjfg+z1TjzTMU8lKl8rG0w==", + "license": "MIT" + }, "node_modules/fill-range": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", @@ -5905,42 +4695,6 @@ "node": ">=8" } }, - "node_modules/firebase": { - "version": "12.10.0", - "resolved": "https://registry.npmjs.org/firebase/-/firebase-12.10.0.tgz", - "integrity": "sha512-tAjHnEirksqWpa+NKDUSUMjulOnsTcsPC1X1rQ+gwPtjlhJS572na91CwaBXQJHXharIrfj7sw/okDkXOsphjA==", - "license": "Apache-2.0", - "dependencies": { - "@firebase/ai": "2.9.0", - "@firebase/analytics": "0.10.20", - "@firebase/analytics-compat": "0.2.26", - "@firebase/app": "0.14.9", - "@firebase/app-check": "0.11.1", - "@firebase/app-check-compat": "0.4.1", - "@firebase/app-compat": "0.5.9", - "@firebase/app-types": "0.9.3", - "@firebase/auth": "1.12.1", - "@firebase/auth-compat": "0.6.3", - "@firebase/data-connect": "0.4.0", - "@firebase/database": "1.1.1", - "@firebase/database-compat": "2.1.1", - "@firebase/firestore": "4.12.0", - "@firebase/firestore-compat": "0.4.6", - "@firebase/functions": "0.13.2", - "@firebase/functions-compat": "0.4.2", - "@firebase/installations": "0.6.20", - "@firebase/installations-compat": "0.2.20", - "@firebase/messaging": "0.12.24", - "@firebase/messaging-compat": "0.2.24", - "@firebase/performance": "0.7.10", - "@firebase/performance-compat": "0.2.23", - "@firebase/remote-config": "0.8.1", - "@firebase/remote-config-compat": "0.2.22", - "@firebase/storage": "0.14.1", - "@firebase/storage-compat": "0.4.1", - "@firebase/util": "1.14.0" - } - }, "node_modules/flow-enums-runtime": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/flow-enums-runtime/-/flow-enums-runtime-0.0.6.tgz", @@ -5953,15 +4707,6 @@ "integrity": "sha512-6FPvD/IVyT4ZlNe7Wcn5Fb/4ChigpucKYSvD6a+0iMoLn2inpo711eyIcKjmDtE5XNcgAkSH9uN/nfAeZzHEfg==", "license": "BSD-2-Clause" }, - "node_modules/freeport-async": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/freeport-async/-/freeport-async-2.0.0.tgz", - "integrity": "sha512-K7od3Uw45AJg00XUmy15+Hae2hOcgKcmN3/EF6Y7i01O0gaqiRx8sUSpsb9+BRNL8RPBrhzPsVfy8q9ADlJuWQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", @@ -6080,21 +4825,12 @@ "node": ">= 0.4" } }, - "node_modules/hermes-estree": { - "version": "0.32.0", - "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.32.0.tgz", - "integrity": "sha512-KWn3BqnlDOl97Xe1Yviur6NbgIZ+IP+UVSpshlZWkq+EtoHg6/cwiDj/osP9PCEgFE15KBm1O55JRwbMEm5ejQ==", + "node_modules/hermes-compiler": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/hermes-compiler/-/hermes-compiler-0.14.1.tgz", + "integrity": "sha512-+RPPQlayoZ9n6/KXKt5SFILWXCGJ/LV5d24L5smXrvTDrPS4L6dSctPczXauuvzFP3QEJbD1YO7Z3Ra4a+4IhA==", "license": "MIT" }, - "node_modules/hermes-parser": { - "version": "0.32.0", - "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.32.0.tgz", - "integrity": "sha512-g4nBOWFpuiTqjR3LZdRxKUkij9iyveWeuks7INEsMX741f3r9xxrOe8TeQfUxtda0eXmiIFiMQzoeSQEno33Hw==", - "license": "MIT", - "dependencies": { - "hermes-estree": "0.32.0" - } - }, "node_modules/hoist-non-react-statics": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", @@ -6170,12 +4906,6 @@ "node": ">= 0.8" } }, - "node_modules/http-parser-js": { - "version": "0.5.10", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.10.tgz", - "integrity": "sha512-Pysuw9XpUq5dVc/2SMHpuTY01RFl8fttgcyunjL7eEMhGM3cI4eOmiCycJDVCo/7O7ClfQD3SaI6ftDzqOXYMA==", - "license": "MIT" - }, "node_modules/https-proxy-agent": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", @@ -6198,12 +4928,6 @@ "node": ">=20.0.0" } }, - "node_modules/idb": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz", - "integrity": "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==", - "license": "ISC" - }, "node_modules/ieee754": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", @@ -6274,12 +4998,6 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "license": "ISC" }, - "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "license": "ISC" - }, "node_modules/invariant": { "version": "2.2.4", "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", @@ -6620,12 +5338,6 @@ "node": ">=6" } }, - "node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "license": "MIT" - }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", @@ -6939,12 +5651,6 @@ "url": "https://opencollective.com/parcel" } }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "license": "MIT" - }, "node_modules/locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", @@ -6957,12 +5663,6 @@ "node": ">=8" } }, - "node_modules/lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==", - "license": "MIT" - }, "node_modules/lodash.debounce": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", @@ -7049,12 +5749,6 @@ "node": ">=4" } }, - "node_modules/long": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz", - "integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==", - "license": "Apache-2.0" - }, "node_modules/loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -7398,19 +6092,6 @@ "node": ">=20.19.4" } }, - "node_modules/metro/node_modules/accepts": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", - "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", - "license": "MIT", - "dependencies": { - "mime-types": "^3.0.0", - "negotiator": "^1.0.0" - }, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/metro/node_modules/hermes-estree": { "version": "0.35.0", "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.35.0.tgz", @@ -7426,40 +6107,6 @@ "hermes-estree": "0.35.0" } }, - "node_modules/metro/node_modules/mime-db": { - "version": "1.54.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/metro/node_modules/mime-types": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", - "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", - "license": "MIT", - "dependencies": { - "mime-db": "^1.54.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/metro/node_modules/negotiator": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", - "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/micromatch": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", @@ -7486,24 +6133,28 @@ } }, "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "version": "1.54.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", + "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", + "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", "license": "MIT", "dependencies": { - "mime-db": "1.52.0" + "mime-db": "^1.54.0" }, "engines": { - "node": ">= 0.6" + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/mimic-fn": { @@ -7530,15 +6181,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/minipass": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", @@ -7548,18 +6190,6 @@ "node": ">=16 || 14 >=14.17" } }, - "node_modules/minizlib": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.1.0.tgz", - "integrity": "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==", - "license": "MIT", - "dependencies": { - "minipass": "^7.1.2" - }, - "engines": { - "node": ">= 18" - } - }, "node_modules/mkdirp": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", @@ -7578,16 +6208,11 @@ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "license": "MIT" }, - "node_modules/mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "license": "MIT", - "dependencies": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" - } + "node_modules/multitars": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/multitars/-/multitars-1.0.0.tgz", + "integrity": "sha512-H/J4fMLedtudftaYMOg7ajzLYgT3/rwbWVJbqr/iUgB8DQztn38ys5HOqI1CzSxx8QhXXwOOnnBvd4v3jG5+Mg==", + "license": "MIT" }, "node_modules/nanoid": { "version": "3.3.11", @@ -7608,20 +6233,14 @@ } }, "node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", + "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", "license": "MIT", "engines": { "node": ">= 0.6" } }, - "node_modules/nested-error-stacks": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-2.0.1.tgz", - "integrity": "sha512-SrQrok4CATudVzBS7coSz26QRSmlK9TzzoFbeKfcPBUFPjcQM9Rqvr/DlJkOrwI/0KcgvMub1n1g5Jt9EgRn4A==", - "license": "MIT" - }, "node_modules/node-forge": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.4.0.tgz", @@ -7685,15 +6304,6 @@ "node": ">=20.19.4" } }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/on-finished": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", @@ -7852,21 +6462,6 @@ "node": ">=4" } }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "license": "MIT", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/p-locate": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", @@ -8060,18 +6655,6 @@ "node": "^10 || ^12 || >=14" } }, - "node_modules/pretty-bytes": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", - "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", - "license": "MIT", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/pretty-format": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", @@ -8138,30 +6721,6 @@ "node": ">= 6" } }, - "node_modules/protobufjs": { - "version": "7.5.6", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.5.6.tgz", - "integrity": "sha512-M71sTMB146U3u0di3yup8iM+zv8yPRNQVr1KK4tyBitl3qFvEGucq/rGDRShD2rsJhtN02RJaJ7j5X5hmy8SJg==", - "hasInstallScript": true, - "license": "BSD-3-Clause", - "dependencies": { - "@protobufjs/aspromise": "^1.1.2", - "@protobufjs/base64": "^1.1.2", - "@protobufjs/codegen": "^2.0.5", - "@protobufjs/eventemitter": "^1.1.0", - "@protobufjs/fetch": "^1.1.0", - "@protobufjs/float": "^1.0.2", - "@protobufjs/inquire": "^1.1.1", - "@protobufjs/path": "^1.1.2", - "@protobufjs/pool": "^1.1.0", - "@protobufjs/utf8": "^1.1.1", - "@types/node": ">=13.7.0", - "long": "^5.0.0" - }, - "engines": { - "node": ">=12.0.0" - } - }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", @@ -8171,14 +6730,6 @@ "node": ">=6" } }, - "node_modules/qrcode-terminal": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/qrcode-terminal/-/qrcode-terminal-0.11.0.tgz", - "integrity": "sha512-Uu7ii+FQy4Qf82G4xu7ShHhjhGahEpCWc3x8UavY3CTcWV+ufmmCtwkr7ZKsX42jdL0kr1B5FKUeqJvAn51jzQ==", - "bin": { - "qrcode-terminal": "bin/qrcode-terminal.js" - } - }, "node_modules/query-string": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/query-string/-/query-string-7.1.3.tgz", @@ -8215,25 +6766,10 @@ "node": ">= 0.6" } }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "bin": { - "rc": "cli.js" - } - }, "node_modules/react": { - "version": "19.1.0", - "resolved": "https://registry.npmjs.org/react/-/react-19.1.0.tgz", - "integrity": "sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==", + "version": "19.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.0.tgz", + "integrity": "sha512-tmbWg6W31tQLeB5cdIBOicJDJRR2KzXsV7uSK9iNfLWQ5bIZfxuPEHp7M8wiHyHnn0DD1i7w3Zmin0FtkrwoCQ==", "license": "MIT", "engines": { "node": ">=0.10.0" @@ -8268,44 +6804,45 @@ "license": "MIT" }, "node_modules/react-native": { - "version": "0.81.5", - "resolved": "https://registry.npmjs.org/react-native/-/react-native-0.81.5.tgz", - "integrity": "sha512-1w+/oSjEXZjMqsIvmkCRsOc8UBYv163bTWKTI8+1mxztvQPhCRYGTvZ/PL1w16xXHneIj/SLGfxWg2GWN2uexw==", + "version": "0.83.6", + "resolved": "https://registry.npmjs.org/react-native/-/react-native-0.83.6.tgz", + "integrity": "sha512-H513+8VzviNFXOdPnStRzX9S3/jiJGg++QZ1zd+ROyAvBEKqFqKUPHH0d82y3QyRPct5qKjdOa7J6vNehCvXYA==", "license": "MIT", "dependencies": { "@jest/create-cache-key-function": "^29.7.0", - "@react-native/assets-registry": "0.81.5", - "@react-native/codegen": "0.81.5", - "@react-native/community-cli-plugin": "0.81.5", - "@react-native/gradle-plugin": "0.81.5", - "@react-native/js-polyfills": "0.81.5", - "@react-native/normalize-colors": "0.81.5", - "@react-native/virtualized-lists": "0.81.5", + "@react-native/assets-registry": "0.83.6", + "@react-native/codegen": "0.83.6", + "@react-native/community-cli-plugin": "0.83.6", + "@react-native/gradle-plugin": "0.83.6", + "@react-native/js-polyfills": "0.83.6", + "@react-native/normalize-colors": "0.83.6", + "@react-native/virtualized-lists": "0.83.6", "abort-controller": "^3.0.0", "anser": "^1.4.9", "ansi-regex": "^5.0.0", "babel-jest": "^29.7.0", - "babel-plugin-syntax-hermes-parser": "0.29.1", + "babel-plugin-syntax-hermes-parser": "0.32.0", "base64-js": "^1.5.1", "commander": "^12.0.0", "flow-enums-runtime": "^0.0.6", "glob": "^7.1.1", + "hermes-compiler": "0.14.1", "invariant": "^2.2.4", "jest-environment-node": "^29.7.0", "memoize-one": "^5.0.0", - "metro-runtime": "^0.83.1", - "metro-source-map": "^0.83.1", + "metro-runtime": "^0.83.6", + "metro-source-map": "^0.83.6", "nullthrows": "^1.1.1", "pretty-format": "^29.7.0", "promise": "^8.3.0", "react-devtools-core": "^6.1.5", "react-refresh": "^0.14.0", "regenerator-runtime": "^0.13.2", - "scheduler": "0.26.0", + "scheduler": "0.27.0", "semver": "^7.1.3", "stacktrace-parser": "^0.1.10", "whatwg-fetch": "^3.0.0", - "ws": "^6.2.3", + "ws": "^7.5.10", "yargs": "^17.6.2" }, "bin": { @@ -8315,8 +6852,8 @@ "node": ">= 20.19.4" }, "peerDependencies": { - "@types/react": "^19.1.0", - "react": "^19.1.0" + "@types/react": "^19.1.1", + "react": "^19.2.0" }, "peerDependenciesMeta": { "@types/react": { @@ -8324,10 +6861,28 @@ } } }, + "node_modules/react-native-fbsdk-next": { + "version": "13.4.3", + "resolved": "https://registry.npmjs.org/react-native-fbsdk-next/-/react-native-fbsdk-next-13.4.3.tgz", + "integrity": "sha512-xGymFmocik7/159i6x/bGx4AHuEk3MFMkVl4MlW7JDuN8LIpbGU76WljEOO+Ucdn248nDlo1EG//CXHMGxZTMg==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "expo": ">=47.0.0", + "react-native": ">=0.63.3" + }, + "peerDependenciesMeta": { + "expo": { + "optional": true + } + } + }, "node_modules/react-native-gesture-handler": { - "version": "2.28.0", - "resolved": "https://registry.npmjs.org/react-native-gesture-handler/-/react-native-gesture-handler-2.28.0.tgz", - "integrity": "sha512-0msfJ1vRxXKVgTgvL+1ZOoYw3/0z1R+Ked0+udoJhyplC2jbVKIJ8Z1bzWdpQRCV3QcQ87Op0zJVE5DhKK2A0A==", + "version": "2.30.1", + "resolved": "https://registry.npmjs.org/react-native-gesture-handler/-/react-native-gesture-handler-2.30.1.tgz", + "integrity": "sha512-xIUBDo5ktmJs++0fZlavQNvDEE4PsihWhSeJsJtoz4Q6p0MiTM9TgrTgfEgzRR36qGPytFoeq+ShLrVwGdpUdA==", "license": "MIT", "dependencies": { "@egjs/hammerjs": "^2.0.17", @@ -8349,21 +6904,6 @@ "react-native": "*" } }, - "node_modules/react-native-reanimated": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/react-native-reanimated/-/react-native-reanimated-4.1.7.tgz", - "integrity": "sha512-Q4H6xA3Tn7QL0/E/KjI86I1KK4tcf+ErRE04LH34Etka2oVQhW6oXQ+Q8ZcDCVxiWp5vgbBH6XcH8BOo4w/Rhg==", - "license": "MIT", - "dependencies": { - "react-native-is-edge-to-edge": "^1.2.1", - "semver": "^7.7.2" - }, - "peerDependencies": { - "react": "*", - "react-native": "0.78 - 0.82", - "react-native-worklets": "0.5 - 0.8" - } - }, "node_modules/react-native-safe-area-context": { "version": "5.6.2", "resolved": "https://registry.npmjs.org/react-native-safe-area-context/-/react-native-safe-area-context-5.6.2.tgz", @@ -8375,13 +6915,12 @@ } }, "node_modules/react-native-screens": { - "version": "4.16.0", - "resolved": "https://registry.npmjs.org/react-native-screens/-/react-native-screens-4.16.0.tgz", - "integrity": "sha512-yIAyh7F/9uWkOzCi1/2FqvNvK6Wb9Y1+Kzn16SuGfN9YFJDTbwlzGRvePCNTOX0recpLQF3kc2FmvMUhyTCH1Q==", + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/react-native-screens/-/react-native-screens-4.23.0.tgz", + "integrity": "sha512-XhO3aK0UeLpBn4kLecd+J+EDeRRJlI/Ro9Fze06vo1q163VeYtzfU9QS09/VyDFMWR1qxDC1iazCArTPSFFiPw==", "license": "MIT", "dependencies": { "react-freeze": "^1.0.0", - "react-native-is-edge-to-edge": "^1.2.1", "warn-once": "^0.1.0" }, "peerDependencies": { @@ -8414,48 +6953,10 @@ "react-native": "*" } }, - "node_modules/react-native-worklets": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/react-native-worklets/-/react-native-worklets-0.5.1.tgz", - "integrity": "sha512-lJG6Uk9YuojjEX/tQrCbcbmpdLCSFxDK1rJlkDhgqkVi1KZzG7cdcBFQRqyNOOzR9Y0CXNuldmtWTGOyM0k0+w==", - "license": "MIT", - "peer": true, - "dependencies": { - "@babel/plugin-transform-arrow-functions": "^7.0.0-0", - "@babel/plugin-transform-class-properties": "^7.0.0-0", - "@babel/plugin-transform-classes": "^7.0.0-0", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.0.0-0", - "@babel/plugin-transform-optional-chaining": "^7.0.0-0", - "@babel/plugin-transform-shorthand-properties": "^7.0.0-0", - "@babel/plugin-transform-template-literals": "^7.0.0-0", - "@babel/plugin-transform-unicode-regex": "^7.0.0-0", - "@babel/preset-typescript": "^7.16.7", - "convert-source-map": "^2.0.0", - "semver": "7.7.2" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0", - "react": "*", - "react-native": "*" - } - }, - "node_modules/react-native-worklets/node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", - "license": "ISC", - "peer": true, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/react-native/node_modules/@react-native/virtualized-lists": { - "version": "0.81.5", - "resolved": "https://registry.npmjs.org/@react-native/virtualized-lists/-/virtualized-lists-0.81.5.tgz", - "integrity": "sha512-UVXgV/db25OPIvwZySeToXD/9sKKhOdkcWmmf4Jh8iBZuyfML+/5CasaZ1E7Lqg6g3uqVQq75NqIwkYmORJMPw==", + "version": "0.83.6", + "resolved": "https://registry.npmjs.org/@react-native/virtualized-lists/-/virtualized-lists-0.83.6.tgz", + "integrity": "sha512-gNSFXeb4P7qHtauLvl+zESroULIyX6Ltpvau3dhwy/QmfanBv0KUcrIU/7aVXxtWcXgp+54oWJyu2LIrsZ9+LQ==", "license": "MIT", "dependencies": { "invariant": "^2.2.4", @@ -8465,7 +6966,7 @@ "node": ">= 20.19.4" }, "peerDependencies": { - "@types/react": "^19.1.0", + "@types/react": "^19.2.0", "react": "*", "react-native": "*" }, @@ -8475,6 +6976,15 @@ } } }, + "node_modules/react-native/node_modules/babel-plugin-syntax-hermes-parser": { + "version": "0.32.0", + "resolved": "https://registry.npmjs.org/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/brace-expansion": { "version": "1.1.14", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", @@ -8515,6 +7025,21 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/react-native/node_modules/hermes-estree": { + "version": "0.32.0", + "resolved": "https://registry.npmjs.org/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.npmjs.org/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.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", @@ -8527,15 +7052,6 @@ "node": "*" } }, - "node_modules/react-native/node_modules/ws": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.3.tgz", - "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", - "license": "MIT", - "dependencies": { - "async-limiter": "~1.0.0" - } - }, "node_modules/react-refresh": { "version": "0.14.2", "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", @@ -8613,37 +7129,6 @@ "node": ">=0.10.0" } }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/requireg": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/requireg/-/requireg-0.2.2.tgz", - "integrity": "sha512-nYzyjnFcPNGR3lx9lwPPPnuQxv6JWEZd2Ci0u9opN7N5zUEPIhY/GbL3vMGOr2UXwEg9WwSyV9X9Y/kLFgPsOg==", - "dependencies": { - "nested-error-stacks": "~2.0.1", - "rc": "~1.2.7", - "resolve": "~1.7.1" - }, - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/requireg/node_modules/resolve": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.7.1.tgz", - "integrity": "sha512-c7rwLofp8g1U+h1KNyHL/jicrKg1Ek4q+Lr33AL65uZTinUZHe30D5HlyN5V9NW0JX1D5dXQ4jqW5l7Sy/kGfw==", - "license": "MIT", - "dependencies": { - "path-parse": "^1.0.5" - } - }, "node_modules/resolve": { "version": "1.22.12", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", @@ -8680,15 +7165,6 @@ "integrity": "sha512-nR23LHAvaI6aHtMg6RWoaHpdR4D881Nydkzi2CixINyg9T00KgaJdJI6Vwty+Ps8WLxZHuxsS0BseWjxSA4C+w==", "license": "MIT" }, - "node_modules/resolve.exports": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.3.tgz", - "integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==", - "license": "MIT", - "engines": { - "node": ">=10" - } - }, "node_modules/restore-cursor": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", @@ -8791,9 +7267,9 @@ } }, "node_modules/scheduler": { - "version": "0.26.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz", - "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==", + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", "license": "MIT" }, "node_modules/semver": { @@ -9060,15 +7536,6 @@ "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", "license": "BSD-3-Clause" }, - "node_modules/stack-generator": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/stack-generator/-/stack-generator-2.0.10.tgz", - "integrity": "sha512-mwnua/hkqM6pF4k8SnmZ2zfETsRUpWXREfA/goT8SLCV4iOFa4bzOX2nDipWAZFPTjLvQB82f5yaodMVhK0yJQ==", - "license": "MIT", - "dependencies": { - "stackframe": "^1.3.4" - } - }, "node_modules/stack-utils": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", @@ -9096,36 +7563,6 @@ "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==", "license": "MIT" }, - "node_modules/stacktrace-gps": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/stacktrace-gps/-/stacktrace-gps-3.1.2.tgz", - "integrity": "sha512-GcUgbO4Jsqqg6RxfyTHFiPxdPqF+3LFmQhm7MgCuYQOYuWyqxo5pwRPz5d/u6/WYJdEnWfK4r+jGbyD8TSggXQ==", - "license": "MIT", - "dependencies": { - "source-map": "0.5.6", - "stackframe": "^1.3.4" - } - }, - "node_modules/stacktrace-gps/node_modules/source-map": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", - "integrity": "sha512-MjZkVp0NHr5+TPihLcadqnlVoGIoWo4IBHptutGh9wI3ttUYvCG26HkSuDi+K6lsZ25syXJXcctwgyVCt//xqA==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/stacktrace-js": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/stacktrace-js/-/stacktrace-js-2.0.2.tgz", - "integrity": "sha512-Je5vBeY4S1r/RnLydLl0TBTi3F2qdfWmYsGvtfZgEI+SCprPppaIhQf5nGcal4gI4cGpCV/duLcAzT1np6sQqg==", - "license": "MIT", - "dependencies": { - "error-stack-parser": "^2.0.6", - "stack-generator": "^2.0.5", - "stacktrace-gps": "^3.0.4" - } - }, "node_modules/stacktrace-parser": { "version": "0.1.11", "resolved": "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.11.tgz", @@ -9191,61 +7628,12 @@ "node": ">=8" } }, - "node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/structured-headers": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/structured-headers/-/structured-headers-0.4.1.tgz", "integrity": "sha512-0MP/Cxx5SzeeZ10p/bZI0S6MpgD+yxAhi1BOQ34jgnMXsCq3j1t6tQnZu+KdlL7dvJTLT3g9xN8tl10TqgFMcg==", "license": "MIT" }, - "node_modules/sucrase": { - "version": "3.35.1", - "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.1.tgz", - "integrity": "sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==", - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.2", - "commander": "^4.0.0", - "lines-and-columns": "^1.1.6", - "mz": "^2.7.0", - "pirates": "^4.0.1", - "tinyglobby": "^0.2.11", - "ts-interface-checker": "^0.1.9" - }, - "bin": { - "sucrase": "bin/sucrase", - "sucrase-node": "bin/sucrase-node" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/sucrase/node_modules/commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/superstruct": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-2.0.2.tgz", - "integrity": "sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A==", - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -9283,31 +7671,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/tar": { - "version": "7.5.13", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.5.13.tgz", - "integrity": "sha512-tOG/7GyXpFevhXVh8jOPJrmtRpOTsYqUIkVdVooZYJS/z8WhfQUX8RJILmeuJNinGAMSu1veBr4asSHFt5/hng==", - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/fs-minipass": "^4.0.0", - "chownr": "^3.0.0", - "minipass": "^7.1.2", - "minizlib": "^3.1.0", - "yallist": "^5.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/tar/node_modules/yallist": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", - "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=18" - } - }, "node_modules/terminal-link": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", @@ -9414,78 +7777,12 @@ "utrie": "^1.0.2" } }, - "node_modules/thenify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - "license": "MIT", - "dependencies": { - "any-promise": "^1.0.0" - } - }, - "node_modules/thenify-all": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", - "license": "MIT", - "dependencies": { - "thenify": ">= 3.1.0 < 4" - }, - "engines": { - "node": ">=0.8" - } - }, "node_modules/throat": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==", "license": "MIT" }, - "node_modules/tinyglobby": { - "version": "0.2.16", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz", - "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==", - "license": "MIT", - "dependencies": { - "fdir": "^6.5.0", - "picomatch": "^4.0.4" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" - } - }, - "node_modules/tinyglobby/node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/tinyglobby/node_modules/picomatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", - "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/tmpl": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", @@ -9513,11 +7810,11 @@ "node": ">=0.6" } }, - "node_modules/ts-interface-checker": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", - "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", - "license": "Apache-2.0" + "node_modules/toqr": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/toqr/-/toqr-0.1.1.tgz", + "integrity": "sha512-FWAPzCIHZHnrE/5/w9MPk0kK25hSQSH2IKhYh9PyjS3SG/+IEMvlwIHbhz+oF7xl54I+ueZlVnMjyzdSwLmAwA==", + "license": "MIT" }, "node_modules/tslib": { "version": "2.8.1", @@ -9557,15 +7854,6 @@ "node": ">=14.17" } }, - "node_modules/undici": { - "version": "6.25.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-6.25.0.tgz", - "integrity": "sha512-ZgpWDC5gmNiuY9CnLVXEH8rl50xhRCuLNA97fAUnKi8RRuV4E6KG31pDTsLVUKnohJE0I3XDrTeEydAXRw47xg==", - "license": "MIT", - "engines": { - "node": ">=18.17" - } - }, "node_modules/undici-types": { "version": "7.19.2", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.19.2.tgz", @@ -9744,12 +8032,6 @@ "defaults": "^1.0.3" } }, - "node_modules/web-vitals": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-4.2.4.tgz", - "integrity": "sha512-r4DIlprAGwJ7YM11VZp4R884m0Vmgr6EAKe3P+kO0PPj3Unqyvv59rczf6UiGcb9Z8QxZVcqKNwv/g0WNdWwsw==", - "license": "Apache-2.0" - }, "node_modules/webidl-conversions": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", @@ -9759,35 +8041,18 @@ "node": ">=8" } }, - "node_modules/websocket-driver": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", - "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", - "license": "Apache-2.0", - "dependencies": { - "http-parser-js": ">=0.5.1", - "safe-buffer": ">=5.1.0", - "websocket-extensions": ">=0.1.1" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/websocket-extensions": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", - "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", - "license": "Apache-2.0", - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/whatwg-fetch": { "version": "3.6.20", "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.20.tgz", "integrity": "sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==", "license": "MIT" }, + "node_modules/whatwg-url-minimum": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/whatwg-url-minimum/-/whatwg-url-minimum-0.1.2.tgz", + "integrity": "sha512-XPEm0XFQWNVG292lII1PrRRJl3sItrs7CettZ4ncYxuDVpLyy+NwlGyut2hXI0JswcJUxeCH+CyOJK0ZzAXD6A==", + "license": "MIT" + }, "node_modules/whatwg-url-without-unicode": { "version": "8.0.0-3", "resolved": "https://registry.npmjs.org/whatwg-url-without-unicode/-/whatwg-url-without-unicode-8.0.0-3.tgz", @@ -9817,12 +8082,6 @@ "node": ">= 8" } }, - "node_modules/wonka": { - "version": "6.3.6", - "resolved": "https://registry.npmjs.org/wonka/-/wonka-6.3.6.tgz", - "integrity": "sha512-MXH+6mDHAZ2GuMpgKS055FR6v0xVP3XwquxIMYXgiW+FejHQlMGlvVRZT4qMCxR+bEo/FCtIdKxwej9WV3YQag==", - "license": "MIT" - }, "node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", @@ -9981,16 +8240,13 @@ "node": ">=12" } }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "node_modules/zod": { + "version": "3.25.76", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", "license": "MIT", - "engines": { - "node": ">=10" - }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/colinhacks" } }, "node_modules/zustand": { diff --git a/package.json b/package.json index 608b583..df47cea 100644 --- a/package.json +++ b/package.json @@ -4,46 +4,44 @@ "main": "index.js", "scripts": { "start": "expo start", - "android": "expo start --android", - "ios": "expo start --ios", + "android": "expo run:android", + "ios": "expo run:ios", "web": "expo start --web" }, "dependencies": { "@expo/config-plugins": "^55.0.8", "@react-native-async-storage/async-storage": "2.2.0", - "@react-native-firebase/analytics": "^24.0.0", - "@react-native-firebase/app": "^24.0.0", - "@react-native-firebase/crashlytics": "^24.0.0", + "@react-native-google-signin/google-signin": "^16.1.2", "@react-navigation/bottom-tabs": "^7.15.9", "@react-navigation/native": "^7.2.2", "@react-navigation/native-stack": "^7.14.11", "@supabase/ssr": "^0.10.2", "@supabase/supabase-js": "^2.103.0", - "babel-preset-expo": "~54.0.10", - "expo": "~54.0.0", - "expo-auth-session": "~7.0.11", - "expo-crypto": "~15.0.9", - "expo-dev-client": "~6.0.21", - "expo-image-picker": "~17.0.11", - "expo-linear-gradient": "~15.0.8", - "expo-media-library": "~18.2.1", - "expo-print": "~15.0.8", - "expo-sharing": "~14.0.8", - "expo-status-bar": "~3.0.9", - "expo-web-browser": "~15.0.11", - "react": "19.1.0", - "react-native": "0.81.5", - "react-native-gesture-handler": "~2.28.0", - "react-native-reanimated": "~4.1.1", + "babel-preset-expo": "~55.0.8", + "expo": "^55.0.23", + "expo-auth-session": "~55.0.15", + "expo-crypto": "~55.0.14", + "expo-dev-client": "~55.0.32", + "expo-image-picker": "~55.0.20", + "expo-linear-gradient": "~55.0.13", + "expo-media-library": "~55.0.16", + "expo-print": "~55.0.14", + "expo-sharing": "~55.0.18", + "expo-status-bar": "~55.0.6", + "expo-web-browser": "~55.0.15", + "react": "19.2.0", + "react-native": "0.83.6", + "react-native-fbsdk-next": "^13.4.3", + "react-native-gesture-handler": "~2.30.0", "react-native-safe-area-context": "~5.6.0", - "react-native-screens": "~4.16.0", + "react-native-screens": "~4.23.0", "react-native-url-polyfill": "^3.0.0", "react-native-view-shot": "4.0.3", "zustand": "^5.0.12" }, "private": true, "devDependencies": { - "@types/react": "~19.1.10", + "@types/react": "~19.2.10", "typescript": "~5.9.2" } } diff --git a/src/components/PlanetCore.js b/src/components/PlanetCore.js index b91c81c..0cec9fe 100644 --- a/src/components/PlanetCore.js +++ b/src/components/PlanetCore.js @@ -64,8 +64,8 @@ export default function PlanetCore({ size = 90, glowIntensity = 0.5 }) { {/* Planet image */} ); diff --git a/src/config/keys.js b/src/config/keys.js index 1f098b0..17300b0 100644 --- a/src/config/keys.js +++ b/src/config/keys.js @@ -2,3 +2,6 @@ export const BACKEND_URL = 'https://acil.imola.ai'; export const AI_SERVICE_URL = 'http://182.23.12.142:3106'; export const AI_MODEL = 'claude-haiku-4-5-20251001'; + +// Google Sign-In +export const GOOGLE_WEB_CLIENT_ID = '112566583381-29vsg1bg7ifnq5csg5o8fisdgtllb2sn.apps.googleusercontent.com'; diff --git a/src/screens/LoginScreen.js b/src/screens/LoginScreen.js index d0494f1..1ef4861 100644 --- a/src/screens/LoginScreen.js +++ b/src/screens/LoginScreen.js @@ -12,8 +12,7 @@ import useAuthStore from '../store/useAuthStore'; import { colors, fonts, spacing, borderRadius } from '../utils/theme'; const REMEMBER_KEY = 'remember_email'; -const DEMO_EMAIL = 'demo@nova40.app'; -const DEMO_PASSWORD = '123456'; +const LAST_OAUTH_KEY = 'nova40_last_oauth'; export default function LoginScreen({ navigation }) { const [email, setEmail] = useState(''); @@ -21,31 +20,31 @@ export default function LoginScreen({ navigation }) { const [showPassword, setShowPassword] = useState(false); const [rememberMe, setRememberMe] = useState(false); const [loading, setLoading] = useState(false); - const [demoLoading, setDemoLoading] = useState(false); const [googleLoading, setGoogleLoading] = useState(false); const [facebookLoading, setFacebookLoading] = useState(false); + const [lastOAuth, setLastOAuth] = useState(null); // { provider, email, name } const login = useAuthStore((s) => s.login); - const loginAsDemo = useAuthStore((s) => s.loginAsDemo); const loginWithGoogle = useAuthStore((s) => s.loginWithGoogle); const loginWithFacebook = useAuthStore((s) => s.loginWithFacebook); - // Load remembered email on mount + // Load remembered email + last OAuth on mount useEffect(() => { const load = async () => { try { + // Check last OAuth login + const oauthRaw = await AsyncStorage.getItem(LAST_OAUTH_KEY); + if (oauthRaw) { + setLastOAuth(JSON.parse(oauthRaw)); + } + + // Check remembered email const saved = await AsyncStorage.getItem(REMEMBER_KEY); if (saved) { setEmail(saved); setRememberMe(true); - } else { - setEmail(DEMO_EMAIL); - setPassword(DEMO_PASSWORD); } - } catch (_) { - setEmail(DEMO_EMAIL); - setPassword(DEMO_PASSWORD); - } + } catch (_) {} }; load(); }, []); @@ -82,22 +81,17 @@ export default function LoginScreen({ navigation }) { } }; - const handleDemoLogin = async () => { - setDemoLoading(true); - try { - await loginAsDemo(); - goToApp(); - } catch (error) { - showAlert("Demo didn't work", error.message); - } finally { - setDemoLoading(false); - } - }; - const handleGoogleLogin = async () => { setGoogleLoading(true); try { - await loginWithGoogle(); + const result = await loginWithGoogle(); + const userEmail = result?.user?.email || result?.session?.user?.email; + const userName = result?.user?.name || userEmail?.split('@')[0]; + if (userEmail) { + await AsyncStorage.setItem(LAST_OAUTH_KEY, JSON.stringify({ + provider: 'google', email: userEmail, name: userName, + })); + } goToApp(); } catch (error) { if (!error.message?.includes('cancel')) { @@ -111,7 +105,14 @@ export default function LoginScreen({ navigation }) { const handleFacebookLogin = async () => { setFacebookLoading(true); try { - await loginWithFacebook(); + const result = await loginWithFacebook(); + const userEmail = result?.user?.email || result?.session?.user?.email; + const userName = result?.user?.name || userEmail?.split('@')[0]; + if (userEmail) { + await AsyncStorage.setItem(LAST_OAUTH_KEY, JSON.stringify({ + provider: 'facebook', email: userEmail, name: userName, + })); + } goToApp(); } catch (error) { if (!error.message?.includes('cancel')) { @@ -122,7 +123,7 @@ export default function LoginScreen({ navigation }) { } }; - const anyLoading = loading || demoLoading || googleLoading || facebookLoading; + const anyLoading = loading || googleLoading || facebookLoading; return ( @@ -182,7 +183,6 @@ export default function LoginScreen({ navigation }) { style={styles.loginBtn} /> - {/* Divider */} or @@ -351,6 +351,51 @@ const styles = StyleSheet.create({ }, // App info + // Last OAuth card + lastOAuthCard: { + flexDirection: 'row', + alignItems: 'center', + justifyContent: 'space-between', + backgroundColor: colors.surface, + borderRadius: borderRadius.md, + padding: spacing.md, + borderWidth: 1, + borderColor: colors.primary, + marginBottom: spacing.xl, + }, + lastOAuthLeft: { + flexDirection: 'row', + alignItems: 'center', + flex: 1, + }, + lastOAuthIcon: { + fontSize: 18, + fontWeight: fonts.weights.bold, + color: '#4285F4', + width: 36, + height: 36, + borderRadius: 18, + backgroundColor: 'rgba(66, 133, 244, 0.1)', + textAlign: 'center', + lineHeight: 36, + marginRight: spacing.md, + }, + lastOAuthName: { + color: colors.text, + fontSize: fonts.sizes.md, + fontWeight: fonts.weights.semibold, + }, + lastOAuthEmail: { + color: colors.textMuted, + fontSize: fonts.sizes.xs, + marginTop: 2, + }, + lastOAuthAction: { + color: colors.primary, + fontSize: fonts.sizes.sm, + fontWeight: fonts.weights.semibold, + }, + appInfo: { alignItems: 'center', paddingTop: spacing.xl, diff --git a/src/screens/OnboardingScreen.js b/src/screens/OnboardingScreen.js index d12fe0f..12298fc 100644 --- a/src/screens/OnboardingScreen.js +++ b/src/screens/OnboardingScreen.js @@ -107,8 +107,8 @@ function PageContent({ item, isActive }) { )} diff --git a/src/screens/SplashScreen.js b/src/screens/SplashScreen.js index b6d65ad..bab4f12 100644 --- a/src/screens/SplashScreen.js +++ b/src/screens/SplashScreen.js @@ -96,7 +96,7 @@ export default function SplashScreen({ navigation }) { @@ -119,7 +119,7 @@ const styles = StyleSheet.create({ width: 200, height: 200, borderRadius: 100, backgroundColor: colors.planetGlow, opacity: 0.4, position: 'absolute', }, - logo: { width: 160, height: 160, borderRadius: 80, overflow: 'hidden' }, + logo: { width: 160, height: 140 }, title: { color: colors.text, fontSize: fonts.sizes.hero, fontWeight: fonts.weights.bold, letterSpacing: 8, marginBottom: 16, diff --git a/src/services/aiService.js b/src/services/aiService.js index 0512a36..ac91530 100644 --- a/src/services/aiService.js +++ b/src/services/aiService.js @@ -1,5 +1,5 @@ import safeParseAI from '../utils/safeParseAI'; -import { getSuggestionsForIdentity } from '../utils/helpers'; +import { getSuggestionsForIdentity, isIndonesian, setStoryLanguage } from '../utils/helpers'; import { AI_SERVICE_URL, AI_MODEL } from '../config/keys'; function buildPrompt(story) { @@ -108,7 +108,7 @@ async function callAI(prompt) { headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ model: AI_MODEL, - max_tokens: 2048, + max_tokens: 4096, messages: [{ role: 'user', content: prompt }], }), }); @@ -128,6 +128,9 @@ async function callAI(prompt) { * Falls back to local generation if AI fails. */ export async function generateFromStory(story) { + // Set language detection from the full story BEFORE anything else + setStoryLanguage(story); + try { const rawText = await callAI(buildPrompt(story)); const parsed = safeParseAI(rawText); @@ -186,30 +189,46 @@ function generateFallback(story) { } } - // Generate varied habits from the story text and convert to rich objects - let habitTitles = getSuggestionsForIdentity(words); - if (habitTitles.length < 8) { - const titleHabits = getSuggestionsForIdentity(title); - titleHabits.forEach((h) => { if (!habitTitles.includes(h)) habitTitles.push(h); }); + // Generate bilingual habits — pass story as both search text AND language text + const { generateHabitsFromIdentity } = require('../utils/helpers'); + let allHabits = generateHabitsFromIdentity(story, story); + + // If not enough from story keywords, also try title keywords + if (allHabits.length < 20) { + const titleHabits = generateHabitsFromIdentity(title, story); + titleHabits.forEach((h) => { + if (!allHabits.some((a) => a.title === h.title)) allHabits.push(h); + }); } + // Ensure at least 20 + allHabits = allHabits.slice(0, 20); + + const useId = isIndonesian(story); const times = ['06:00', '06:30', '07:00', '07:30', '08:00', '12:00', '17:00', '18:00', '19:00', '20:00', '21:00', '21:30']; const durations = [5, 10, 15, 20, 30, 10, 15, 20, 5, 10]; - const toRichHabit = (t, i) => ({ - title: t, + + const toRichHabit = (h, i) => ({ + title: h.title || h, best_time: times[i % times.length], duration: durations[i % durations.length], - frequency: i < 5 ? 'Every day' : ['Every day', '3x per week', 'Every morning', 'Every evening', 'Weekdays only'][i % 5], + frequency: i < 5 + ? (useId ? 'Setiap hari' : 'Every day') + : [useId ? 'Setiap hari' : 'Every day', '3x per week', useId ? 'Setiap pagi' : 'Every morning', useId ? 'Setiap malam' : 'Every evening', useId ? 'Hari kerja' : 'Weekdays only'][i % 5], category: ['Discipline', 'Body', 'Mind', 'Emotion', 'Health', 'Skill', 'Social', 'Creative'][i % 8], difficulty: i < 3 ? 'Easy' : i < 7 ? 'Medium' : 'Hard', - why: '', + why: h.description || '', }); + const summary = useId + ? `Berdasarkan ceritamu, perjalanan ini tentang menjadi ${title.toLowerCase()}. Setiap hari adalah langkah lebih dekat menuju dirimu yang baru.` + : `Based on your story, this journey is about becoming ${title.toLowerCase()}. Every day is a step closer to the person you described.`; + return { identity_title: title, - identity_summary: `Based on your story, this journey is about becoming ${title.toLowerCase()}. Every day is a step closer to the person you described.`, - priority_habits: habitTitles.slice(0, 5).map(toRichHabit), - suggested_habits: habitTitles.slice(5, 20).map((t, i) => toRichHabit(t, i + 5)), + identity_summary: summary, + priority_habits: allHabits.slice(0, 5).map((h, i) => toRichHabit(h, i)), + suggested_habits: allHabits.slice(5, 20).map((h, i) => toRichHabit(h, i + 5)), source: 'fallback', }; } diff --git a/src/services/analytics.js b/src/services/analytics.js index fb22e8a..26e62b3 100644 --- a/src/services/analytics.js +++ b/src/services/analytics.js @@ -1,94 +1,11 @@ -let analytics = null; - -try { - analytics = require('@react-native-firebase/analytics').default; - analytics(); -} catch (_) { - analytics = null; -} - -const isAvailable = !!analytics; - -/** - * Log a screen view. - */ -export function logScreenView(screenName) { - if (!isAvailable) return; - try { - analytics().logScreenView({ screen_name: screenName, screen_class: screenName }); - } catch (_) {} -} - -/** - * Log a custom event. - */ -export function logEvent(name, params = {}) { - if (!isAvailable) return; - try { - analytics().logEvent(name, params); - } catch (_) {} -} - -/** - * Set user ID for analytics. - */ -export function setAnalyticsUser(userId) { - if (!isAvailable) return; - try { - analytics().setUserId(userId); - } catch (_) {} -} - -/** - * Set user property. - */ -export function setUserProperty(name, value) { - if (!isAvailable) return; - try { - analytics().setUserProperty(name, value); - } catch (_) {} -} - -// ============================ -// Pre-defined event helpers -// ============================ - -export function trackSignUp(method) { - logEvent('sign_up', { method }); -} - -export function trackLogin(method) { - logEvent('login', { method }); -} - -export function trackIdentityCreated(title, source) { - logEvent('identity_created', { title, source }); -} - -export function trackHabitCompleted(habitTitle) { - logEvent('habit_completed', { habit: habitTitle }); -} - -export function trackDayCompleted(dayNumber, identityCheck, mood) { - logEvent('day_completed', { day: dayNumber, identity_check: identityCheck, mood }); -} - -export function trackGamePlayed(gameType, score) { - logEvent('game_played', { game_type: gameType, score }); -} - -export function trackJournalSaved(dayNumber) { - logEvent('journal_saved', { day: dayNumber }); -} - -export function trackJourneyCompleted(totalScore, daysLogged) { - logEvent('journey_completed', { total_score: totalScore, days_logged: daysLogged }); -} - -export function trackShare(contentType) { - logEvent('share', { content_type: contentType }); -} - -export function trackJourneyReset(reason) { - logEvent('journey_reset', { reason }); -} +// Analytics stub — Firebase removed, all functions are no-ops +export function setAnalyticsUser() {} +export function trackSignUp() {} +export function trackLogin() {} +export function trackIdentityCreated() {} +export function trackDayCompleted() {} +export function trackJournalSaved() {} +export function trackGamePlayed() {} +export function trackJourneyCompleted() {} +export function trackShare() {} +export function logScreenView() {} diff --git a/src/services/authService.js b/src/services/authService.js index 9d1e2e7..0e8324c 100644 --- a/src/services/authService.js +++ b/src/services/authService.js @@ -1,10 +1,6 @@ import AsyncStorage from '@react-native-async-storage/async-storage'; -import * as AuthSession from 'expo-auth-session'; -import * as WebBrowser from 'expo-web-browser'; import { supabase } from './supabase'; -WebBrowser.maybeCompleteAuthSession(); - // ============================================ // OFFLINE-FIRST AUTH (dummy mode) // Uses AsyncStorage when Supabase is unreachable. @@ -224,145 +220,71 @@ async function createOAuthSession(email, provider, name, picture) { } // ============================================ -// Google OAuth -// To setup: -// 1. Go to https://console.cloud.google.com/apis/credentials -// 2. Create OAuth 2.0 Client ID (Web application) -// 3. Add redirect URI: https://auth.expo.io/@heyaciell/Nova40 -// 4. Paste Client ID below +// Native Google Sign-In (requires development build) // ============================================ -const GOOGLE_CLIENT_ID = '112566583381-29vsg1bg7ifnq5csg5o8fisdgtllb2sn.apps.googleusercontent.com'; +import { GoogleSignin } from '@react-native-google-signin/google-signin'; -// Parse params from redirect URL (both ? and # fragments) -function parseUrlParams(url) { - const params = {}; - // Try query string first (?code=xxx&...) - const query = url.split('?')[1]?.split('#')[0]; - if (query) { - query.split('&').forEach((part) => { - const [k, v] = part.split('='); - if (k) params[decodeURIComponent(k)] = decodeURIComponent(v || ''); - }); - } - // Also try hash fragment (#access_token=xxx&...) - const hash = url.split('#')[1]; - if (hash) { - hash.split('&').forEach((part) => { - const [k, v] = part.split('='); - if (k) params[decodeURIComponent(k)] = decodeURIComponent(v || ''); - }); - } - return params; -} +const GOOGLE_WEB_CLIENT_ID = '112566583381-29vsg1bg7ifnq5csg5o8fisdgtllb2sn.apps.googleusercontent.com'; -// Generate random string for PKCE -function generateRandom(length) { - const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~'; - let result = ''; - for (let i = 0; i < length; i++) result += chars.charAt(Math.floor(Math.random() * chars.length)); - return result; -} +GoogleSignin.configure({ + webClientId: GOOGLE_WEB_CLIENT_ID, + offlineAccess: true, +}); export async function signInWithGoogle() { try { - const redirectUri = AuthSession.makeRedirectUri({ preferLocalhost: false }); + await GoogleSignin.hasPlayServices(); + const response = await GoogleSignin.signIn(); + const user = response?.data?.user || response?.user; - // Use authorization code flow with PKCE (required by Google for mobile) - const state = generateRandom(16); - const codeVerifier = generateRandom(64); + if (!user?.email) throw new Error('No email returned from Google.'); - // For S256 we need crypto, but plain is simpler and works - const authUrl = - `https://accounts.google.com/o/oauth2/v2/auth` + - `?client_id=${GOOGLE_CLIENT_ID}` + - `&redirect_uri=${encodeURIComponent(redirectUri)}` + - `&response_type=code` + - `&scope=${encodeURIComponent('openid profile email')}` + - `&state=${state}` + - `&code_challenge=${codeVerifier}` + - `&code_challenge_method=plain` + - `&access_type=offline`; - - const result = await WebBrowser.openAuthSessionAsync(authUrl, redirectUri); - - if (result.type === 'success' && result.url) { - const params = parseUrlParams(result.url); - - if (params.code) { - // Exchange code for tokens - const tokenRes = await fetch('https://oauth2.googleapis.com/token', { - method: 'POST', - headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, - body: [ - `code=${encodeURIComponent(params.code)}`, - `client_id=${encodeURIComponent(GOOGLE_CLIENT_ID)}`, - `redirect_uri=${encodeURIComponent(redirectUri)}`, - `grant_type=authorization_code`, - `code_verifier=${encodeURIComponent(codeVerifier)}`, - ].join('&'), - }); - - const tokens = await tokenRes.json(); - - if (tokens.access_token) { - const userInfo = await fetch('https://www.googleapis.com/userinfo/v2/me', { - headers: { Authorization: `Bearer ${tokens.access_token}` }, - }).then((r) => r.json()); - - const email = userInfo.email || 'google-user@nova40.app'; - return await createOAuthSession(email, 'google', userInfo.name, userInfo.picture); - } - - throw new Error(tokens.error_description || 'Failed to exchange code for token.'); - } - } - - if (result.type === 'cancel' || result.type === 'dismiss') throw new Error('Google sign-in was cancelled.'); - throw new Error('Google sign-in failed.'); + return await createOAuthSession( + user.email, + 'google', + user.name || user.givenName, + user.photo + ); } catch (e) { - if (e.message?.includes('cancel')) throw e; + console.warn('Google sign-in error:', e.code, e.message); + if (e.code === 'SIGN_IN_CANCELLED' || e.message?.includes('cancel')) { + throw new Error('Google sign-in was cancelled.'); + } throw new Error(e.message || 'Google sign-in failed. Please try again.'); } } // ============================================ -// Facebook OAuth -// To setup: -// 1. Go to https://developers.facebook.com -// 2. Create app → Facebook Login -// 3. Add redirect URI: https://auth.expo.io/@heyaciell/Nova40 -// 4. Paste App ID below +// Native Facebook Login (requires development build) // ============================================ -const FACEBOOK_APP_ID = '1696508695097482'; +import { LoginManager, AccessToken, Profile } from 'react-native-fbsdk-next'; export async function signInWithFacebook() { try { - const redirectUri = AuthSession.makeRedirectUri({ preferLocalhost: false }); + // Reset previous login + LoginManager.logOut(); - const authUrl = - `https://www.facebook.com/v18.0/dialog/oauth` + - `?client_id=${FACEBOOK_APP_ID}` + - `&redirect_uri=${encodeURIComponent(redirectUri)}` + - `&response_type=token` + - `&scope=email,public_profile`; + const result = await LoginManager.logInWithPermissions(['public_profile', 'email']); - const result = await WebBrowser.openAuthSessionAsync(authUrl, redirectUri); + if (result.isCancelled) throw new Error('Facebook sign-in was cancelled.'); - if (result.type === 'success' && result.url) { - const params = parseUrlParams(result.url); - if (params.access_token) { - const userInfo = await fetch( - `https://graph.facebook.com/me?fields=id,name,email,picture&access_token=${params.access_token}` - ).then((r) => r.json()); + const tokenData = await AccessToken.getCurrentAccessToken(); + if (!tokenData?.accessToken) throw new Error('No access token from Facebook.'); - const email = userInfo.email || `fb-${userInfo.id}@nova40.app`; - return await createOAuthSession(email, 'facebook', userInfo.name, userInfo.picture?.data?.url); - } - } + // Get user info + const userInfo = await fetch( + `https://graph.facebook.com/me?fields=id,name,email,picture.type(large)&access_token=${tokenData.accessToken}` + ).then((r) => r.json()); - if (result.type === 'cancel' || result.type === 'dismiss') throw new Error('Facebook sign-in was cancelled.'); - throw new Error('Facebook sign-in failed.'); + const email = userInfo.email || `fb-${userInfo.id}@nova40.app`; + return await createOAuthSession( + email, + 'facebook', + userInfo.name, + userInfo.picture?.data?.url + ); } catch (e) { + console.warn('Facebook sign-in error:', e.message); if (e.message?.includes('cancel')) throw e; throw new Error(e.message || 'Facebook sign-in failed. Please try again.'); } diff --git a/src/services/crashlytics.js b/src/services/crashlytics.js index 1011d43..c68b43a 100644 --- a/src/services/crashlytics.js +++ b/src/services/crashlytics.js @@ -1,61 +1,6 @@ -let crashlytics = null; - -try { - crashlytics = require('@react-native-firebase/crashlytics').default; - // Test if native module is available - crashlytics(); -} catch (_) { - crashlytics = null; -} - -const isAvailable = !!crashlytics; - -export function initCrashlytics() { - if (!isAvailable) { - console.log('Crashlytics: native module not available (Expo Go). Skipping.'); - return; - } - try { - crashlytics().setCrashlyticsCollectionEnabled(true); - - const originalHandler = ErrorUtils.getGlobalHandler(); - ErrorUtils.setGlobalHandler((error, isFatal) => { - crashlytics().recordError(error); - if (isFatal) crashlytics().log(`Fatal: ${error.message}`); - if (originalHandler) originalHandler(error, isFatal); - }); - - console.log('Crashlytics initialized'); - } catch (e) { - console.warn('Crashlytics init failed:', e.message); - } -} - -export function setUser(userId, email) { - if (!isAvailable) return; - try { - if (userId) crashlytics().setUserId(userId); - if (email) crashlytics().setAttribute('email', email); - } catch (_) {} -} - -export function log(message) { - if (!isAvailable) return; - try { crashlytics().log(message); } catch (_) {} -} - -export function recordError(error, context) { - if (!isAvailable) return; - try { - if (context) crashlytics().log(context); - crashlytics().recordError(error instanceof Error ? error : new Error(String(error))); - } catch (_) {} -} - -export function testCrash() { - if (!isAvailable) { - console.warn('Crashlytics not available in Expo Go'); - return; - } - crashlytics().crash(); -} +// Crashlytics stub — Firebase removed, all functions are no-ops +export function initCrashlytics() {} +export function setUser() {} +export function log() {} +export function recordError() {} +export function testCrash() {} diff --git a/src/services/identityService.js b/src/services/identityService.js index 20bf7df..e062864 100644 --- a/src/services/identityService.js +++ b/src/services/identityService.js @@ -1,6 +1,6 @@ import { supabase } from './supabase'; import * as offline from './offlineStorage'; -import { generateHabitsFromIdentity } from '../utils/helpers'; +import { generateHabitsFromIdentity, setStoryLanguage } from '../utils/helpers'; import { todayISO, addDays } from '../utils/date'; // Must match authService.js @@ -30,6 +30,9 @@ export async function getIdentity(userId) { // CREATE IDENTITY // ======================== export async function createIdentity(userId, title, description, customHabits, storyText) { + // Set language detection from story or title for habit generation + setStoryLanguage(storyText || title || ''); + const startDate = todayISO(); const endDate = addDays(new Date(), 40); @@ -46,7 +49,7 @@ export async function createIdentity(userId, title, description, customHabits, s const habitsList = customHabits && customHabits.length > 0 ? customHabits - : generateHabitsFromIdentity(title); + : generateHabitsFromIdentity(title, storyText || title); const habitsToInsert = habitsList.map((h) => ({ identity_id: identity.id, diff --git a/src/utils/helpers.js b/src/utils/helpers.js index d73ebd6..581e2aa 100644 --- a/src/utils/helpers.js +++ b/src/utils/helpers.js @@ -95,203 +95,243 @@ function shuffle(arr) { return a; } -// Habit pool — each keyword maps to many habits, pick random subset -const HABIT_POOL = { - // Fitness / Body - 'fit,gym,exercise,workout,body,weight,muscle,run,jog,active': [ - { title: 'Move your body 30 minutes', description: 'Walk, run, lift — just move' }, - { title: 'Take 10,000 steps', description: 'Stay active throughout the day' }, - { title: 'Do a morning stretch', description: '10 minutes to wake your body up' }, - { title: 'No elevator — take stairs', description: 'Small movement adds up' }, - { title: 'Try a new workout', description: 'Keep your body guessing' }, - { title: 'Track your workout', description: 'Log sets, reps, or distance' }, - { title: 'Cool down after exercise', description: '5 min stretch post-workout' }, +// Detect if text is Indonesian +export function isIndonesian(text) { + if (!text) return false; + // Use word boundary matching to avoid false positives (e.g. "dance" matching "dan") + const idWords = [ + 'saya','ingin','menjadi','yang','dan','untuk','dengan','tidak','bisa', + 'aku','mau','lebih','hari','hidup','diri','sudah','akan','harus', + 'masih','dari','juga','ini','itu','sangat','perlu','merasa','seperti', + 'karena','tapi','setiap','selalu','waktu','pagi','malam','belajar', + 'kerja','sehat','fokus','malas','takut','capek','lelah','semangat', + 'kebiasaan','olahraga','tidur','makan','menulis','membaca','berdoa', + 'sedang','sekali','banyak','sering','jarang','kadang','belum','lagi', + 'kalau','kalian','kita','mereka','sendiri','baru','lama','terlalu', + 'rasanya','pengen','banget','gak','nggak','gue','gw','lo','lu', + ]; + + // Split into words and match whole words only + const words = text.toLowerCase().split(/[\s\.,!?\-;:'"()]+/); + let count = 0; + const matched = new Set(); + words.forEach((w) => { + if (w.length >= 2 && idWords.includes(w) && !matched.has(w)) { + count++; + matched.add(w); + } + }); + + console.log(`isIndonesian: found ${count} ID words in "${text.slice(0, 50)}..."`); + return count >= 2; +} + +// Bilingual habit pool — EN + ID per entry +const HABIT_POOL_BILINGUAL = { + 'fit,gym,exercise,workout,body,weight,muscle,run,jog,active,olahraga,tubuh,badan,lari,sehat,otot,kurus,gemuk': [ + { en: 'Move your body 30 minutes', id: 'Gerakkan tubuh 30 menit', desc_en: 'Walk, run, lift — just move', desc_id: 'Jalan, lari, angkat beban — yang penting gerak' }, + { en: 'Take 10,000 steps', id: 'Jalan 10.000 langkah', desc_en: 'Stay active throughout the day', desc_id: 'Tetap aktif sepanjang hari' }, + { en: 'Do a morning stretch', id: 'Peregangan pagi 10 menit', desc_en: '10 minutes to wake your body up', desc_id: '10 menit untuk bangunkan tubuh' }, + { en: 'No elevator — take stairs', id: 'Naik tangga, bukan lift', desc_en: 'Small movement adds up', desc_id: 'Gerakan kecil menumpuk jadi besar' }, + { en: 'Try a new workout', id: 'Coba olahraga baru', desc_en: 'Keep your body guessing', desc_id: 'Tantang tubuhmu dengan hal baru' }, + { en: 'Track your workout', id: 'Catat latihan hari ini', desc_en: 'Log sets, reps, or distance', desc_id: 'Catat set, repetisi, atau jarak' }, + { en: 'Cool down after exercise', id: 'Pendinginan setelah olahraga', desc_en: '5 min stretch post-workout', desc_id: '5 menit peregangan setelah latihan' }, ], - // Health / Nutrition - 'health,eat,food,diet,nutrition,sugar,meal,cook,clean': [ - { title: 'Eat one clean meal', description: 'Whole foods, no processed stuff' }, - { title: 'Drink 2L of water', description: 'Hydrate before you caffeinate' }, - { title: 'No junk food today', description: 'Choose fuel over comfort' }, - { title: 'Eat a fruit or vegetable', description: 'Add color to your plate' }, - { title: 'Cook one meal at home', description: 'Control what goes in your body' }, - { title: 'Skip sugar after 6pm', description: 'Let your body rest clean' }, - { title: 'Eat slowly — no screen', description: 'Be present with your meal' }, + 'health,eat,food,diet,nutrition,sugar,meal,cook,clean,makan,masak,sehat,diet,gula,sayur,buah': [ + { en: 'Eat one clean meal', id: 'Makan satu porsi makanan bersih', desc_en: 'Whole foods, no processed stuff', desc_id: 'Makanan utuh, tanpa olahan' }, + { en: 'Drink 2L of water', id: 'Minum 2 liter air putih', desc_en: 'Hydrate before you caffeinate', desc_id: 'Hidrasi sebelum kafein' }, + { en: 'No junk food today', id: 'Tidak makan junk food hari ini', desc_en: 'Choose fuel over comfort', desc_id: 'Pilih nutrisi, bukan kenyamanan' }, + { en: 'Eat a fruit or vegetable', id: 'Makan buah atau sayur', desc_en: 'Add color to your plate', desc_id: 'Tambahkan warna di piringmu' }, + { en: 'Cook one meal at home', id: 'Masak satu kali di rumah', desc_en: 'Control what goes in your body', desc_id: 'Kendalikan apa yang masuk ke tubuh' }, + { en: 'Skip sugar after 6pm', id: 'Tanpa gula setelah jam 6 sore', desc_en: 'Let your body rest clean', desc_id: 'Biarkan tubuh istirahat bersih' }, + { en: 'Eat slowly — no screen', id: 'Makan pelan tanpa layar', desc_en: 'Be present with your meal', desc_id: 'Hadir sepenuhnya saat makan' }, ], - // Sleep / Rest - 'sleep,rest,tired,exhaust,energy,insomnia,bed': [ - { title: 'Sleep by 11pm', description: 'Protect your rest window' }, - { title: 'No screens 30min before bed', description: 'Let your brain wind down' }, - { title: 'Sleep 7+ hours', description: 'Make rest non-negotiable' }, - { title: 'Create a bedtime ritual', description: 'Tea, book, stretch — your call' }, - { title: 'Wake at the same time daily', description: 'Consistency over alarm snoozing' }, - { title: 'No caffeine after 2pm', description: 'Protect your sleep quality' }, + 'sleep,rest,tired,exhaust,energy,insomnia,bed,tidur,istirahat,capek,lelah,energi,bangun': [ + { en: 'Sleep by 11pm', id: 'Tidur sebelum jam 11 malam', desc_en: 'Protect your rest window', desc_id: 'Lindungi waktu istirahatmu' }, + { en: 'No screens 30min before bed', id: 'Tanpa layar 30 menit sebelum tidur', desc_en: 'Let your brain wind down', desc_id: 'Biarkan otak beristirahat' }, + { en: 'Sleep 7+ hours', id: 'Tidur minimal 7 jam', desc_en: 'Make rest non-negotiable', desc_id: 'Jadikan istirahat tidak bisa ditawar' }, + { en: 'Wake at the same time daily', id: 'Bangun di jam yang sama tiap hari', desc_en: 'Consistency over alarm snoozing', desc_id: 'Konsistensi lebih penting dari snooze' }, + { en: 'Create a bedtime ritual', id: 'Buat ritual sebelum tidur', desc_en: 'Tea, book, stretch — your call', desc_id: 'Teh, buku, peregangan — pilihanmu' }, + { en: 'No caffeine after 2pm', id: 'Tanpa kafein setelah jam 2 siang', desc_en: 'Protect your sleep quality', desc_id: 'Jaga kualitas tidurmu' }, ], - // Reading / Learning - 'read,book,learn,study,knowledge,smart,curious,educat': [ - { title: 'Read 15 pages', description: 'A small chapter changes everything' }, - { title: 'Listen to a podcast', description: 'Learn while you commute' }, - { title: 'Write one thing you learned', description: 'Retention through reflection' }, - { title: 'Replace 30min scrolling with reading', description: 'Swap consumption types' }, - { title: 'Teach someone what you learned', description: 'Teaching deepens understanding' }, - { title: 'Read before bed instead of phone', description: 'End the day growing' }, - { title: 'Take handwritten notes', description: 'Pen to paper locks it in' }, + 'read,book,learn,study,knowledge,smart,curious,educat,baca,buku,belajar,ilmu,pintar,kuliah': [ + { en: 'Read 15 pages', id: 'Baca 15 halaman', desc_en: 'A small chapter changes everything', desc_id: 'Satu bab kecil mengubah segalanya' }, + { en: 'Listen to a podcast', id: 'Dengarkan podcast', desc_en: 'Learn while you commute', desc_id: 'Belajar sambil perjalanan' }, + { en: 'Write one thing you learned', id: 'Tulis satu hal yang kamu pelajari', desc_en: 'Retention through reflection', desc_id: 'Ingatan lewat refleksi' }, + { en: 'Teach someone what you learned', id: 'Ajarkan sesuatu ke orang lain', desc_en: 'Teaching deepens understanding', desc_id: 'Mengajar memperdalam pemahaman' }, + { en: 'Read before bed instead of phone', id: 'Baca buku sebelum tidur, bukan HP', desc_en: 'End the day growing', desc_id: 'Akhiri hari dengan bertumbuh' }, + { en: 'Take handwritten notes', id: 'Tulis catatan tangan', desc_en: 'Pen to paper locks it in', desc_id: 'Menulis tangan mengunci ingatan' }, ], - // Discipline / Routine - 'disciplin,routine,consist,habit,lazy,procrastinat,structure': [ - { title: 'Wake up at the same time', description: 'Discipline starts with your alarm' }, - { title: 'Make your bed immediately', description: 'First win of the day' }, - { title: 'Follow a written schedule', description: 'Plan it, then do it' }, - { title: 'Do the hardest task first', description: 'Eat the frog before noon' }, - { title: 'No snooze button', description: 'Rise when the alarm rings' }, - { title: 'End the day with a review', description: 'What went well? What to fix?' }, - { title: 'Say no to one distraction', description: 'Guard your time like your life' }, + 'disciplin,routine,consist,habit,lazy,procrastinat,structure,disiplin,rutin,konsisten,kebiasaan,malas,menunda,teratur': [ + { en: 'Wake up at the same time', id: 'Bangun di jam yang sama', desc_en: 'Discipline starts with your alarm', desc_id: 'Disiplin dimulai dari alarm' }, + { en: 'Make your bed immediately', id: 'Rapikan tempat tidur langsung', desc_en: 'First win of the day', desc_id: 'Kemenangan pertama hari ini' }, + { en: 'Follow a written schedule', id: 'Ikuti jadwal tertulis', desc_en: 'Plan it, then do it', desc_id: 'Rencanakan, lalu kerjakan' }, + { en: 'Do the hardest task first', id: 'Kerjakan tugas tersulit duluan', desc_en: 'Eat the frog before noon', desc_id: 'Selesaikan yang berat sebelum siang' }, + { en: 'No snooze button', id: 'Jangan pencet snooze', desc_en: 'Rise when the alarm rings', desc_id: 'Bangun saat alarm berbunyi' }, + { en: 'End the day with a review', id: 'Akhiri hari dengan evaluasi', desc_en: 'What went well? What to fix?', desc_id: 'Apa yang baik? Apa yang perlu diperbaiki?' }, + { en: 'Say no to one distraction', id: 'Tolak satu gangguan', desc_en: 'Guard your time like your life', desc_id: 'Jaga waktumu seperti nyawamu' }, ], - // Focus / Productivity - 'focus,product,distract,attention,deep work,concentrat,procrast': [ - { title: 'One 90-min deep work block', description: 'Phone off, door closed, create' }, - { title: 'Use a Pomodoro timer', description: '25 on, 5 off — repeat' }, - { title: 'Plan your top 3 tasks tonight', description: 'Wake up with clarity' }, - { title: 'Clear your workspace', description: 'Clean space, clear mind' }, - { title: 'Single-task for 1 hour', description: 'No tabs, no switching' }, - { title: 'Delete one app that wastes time', description: 'Remove temptation at the source' }, - { title: 'Review your week every Sunday', description: 'Reflect and recalibrate' }, + 'focus,product,distract,attention,concentrat,procrast,fokus,produktif,konsentrasi,perhatian,terganggu': [ + { en: 'One 90-min deep work block', id: 'Satu sesi deep work 90 menit', desc_en: 'Phone off, door closed, create', desc_id: 'HP mati, pintu tutup, berkarya' }, + { en: 'Use a Pomodoro timer', id: 'Gunakan timer Pomodoro', desc_en: '25 on, 5 off — repeat', desc_id: '25 menit kerja, 5 menit istirahat' }, + { en: 'Plan your top 3 tasks tonight', id: 'Rencanakan 3 tugas utama malam ini', desc_en: 'Wake up with clarity', desc_id: 'Bangun dengan kejelasan' }, + { en: 'Clear your workspace', id: 'Bersihkan meja kerja', desc_en: 'Clean space, clear mind', desc_id: 'Ruang bersih, pikiran jernih' }, + { en: 'Single-task for 1 hour', id: 'Fokus satu tugas selama 1 jam', desc_en: 'No tabs, no switching', desc_id: 'Tanpa berpindah tab' }, + { en: 'Delete one app that wastes time', id: 'Hapus satu aplikasi pembuang waktu', desc_en: 'Remove temptation at the source', desc_id: 'Hilangkan godaan dari sumbernya' }, ], - // Confidence / Social - 'confiden,shy,social,anxi,fear,brave,courage,speak,voice': [ - { title: 'Give one genuine compliment', description: 'Kindness builds confidence' }, - { title: 'Speak up once in a group', description: 'Your voice matters' }, - { title: 'Make eye contact with strangers', description: 'Presence over avoidance' }, - { title: 'Write 3 wins from today', description: 'Train your brain to see strength' }, - { title: 'Say no to something you don\'t want', description: 'Boundaries are self-respect' }, - { title: 'Do one thing that scares you', description: 'Growth lives outside comfort' }, - { title: 'Record a voice note to yourself', description: 'Hear your own conviction' }, + 'confiden,shy,social,anxi,fear,brave,courage,speak,voice,percaya diri,malu,takut,berani,bicara,gugup,cemas': [ + { en: 'Give one genuine compliment', id: 'Berikan satu pujian tulus', desc_en: 'Kindness builds confidence', desc_id: 'Kebaikan membangun kepercayaan diri' }, + { en: 'Speak up once in a group', id: 'Bicara satu kali di grup', desc_en: 'Your voice matters', desc_id: 'Suaramu penting' }, + { en: 'Write 3 wins from today', id: 'Tulis 3 pencapaian hari ini', desc_en: 'Train your brain to see strength', desc_id: 'Latih otak melihat kekuatan' }, + { en: 'Do one thing that scares you', id: 'Lakukan satu hal yang menakutkan', desc_en: 'Growth lives outside comfort', desc_id: 'Pertumbuhan ada di luar zona nyaman' }, + { en: 'Make eye contact with strangers', id: 'Tatap mata orang yang baru kamu temui', desc_en: 'Presence over avoidance', desc_id: 'Hadir, bukan menghindar' }, + { en: 'Record a voice note to yourself', id: 'Rekam pesan suara untuk dirimu', desc_en: 'Hear your own conviction', desc_id: 'Dengarkan keyakinanmu sendiri' }, ], - // Calm / Mental health - 'calm,stress,anxious,peace,mental,meditat,mindful,relax,overwhelm,worry': [ - { title: 'Meditate for 10 minutes', description: 'Sit still. Breathe. That\'s enough' }, - { title: 'Write in a gratitude journal', description: '3 things you\'re thankful for' }, - { title: 'Take a walk in nature', description: 'No phone, just presence' }, - { title: 'Do a 5-minute breathing exercise', description: 'Inhale 4, hold 4, exhale 4' }, - { title: 'Digital detox for 1 hour', description: 'Unplug and reconnect with yourself' }, - { title: 'Stretch for 10 minutes', description: 'Release tension from your body' }, - { title: 'Listen to calming music', description: 'Let sound reset your mood' }, + 'calm,stress,anxious,peace,mental,meditat,mindful,relax,overwhelm,worry,tenang,stres,cemas,damai,meditasi,rileks,khawatir': [ + { en: 'Meditate for 10 minutes', id: 'Meditasi 10 menit', desc_en: 'Sit still. Breathe.', desc_id: 'Duduk tenang. Bernapas.' }, + { en: 'Write in a gratitude journal', id: 'Tulis jurnal syukur', desc_en: '3 things you\'re thankful for', desc_id: '3 hal yang kamu syukuri' }, + { en: 'Take a walk in nature', id: 'Jalan-jalan di alam', desc_en: 'No phone, just presence', desc_id: 'Tanpa HP, hanya hadir' }, + { en: 'Do a 5-minute breathing exercise', id: 'Latihan napas 5 menit', desc_en: 'Inhale 4, hold 4, exhale 4', desc_id: 'Hirup 4, tahan 4, hembuskan 4' }, + { en: 'Digital detox for 1 hour', id: 'Detoks digital 1 jam', desc_en: 'Unplug and reconnect with yourself', desc_id: 'Lepaskan gadget, sambungkan diri' }, + { en: 'Stretch for 10 minutes', id: 'Peregangan 10 menit', desc_en: 'Release tension from your body', desc_id: 'Lepaskan ketegangan dari tubuh' }, + { en: 'Listen to calming music', id: 'Dengarkan musik yang menenangkan', desc_en: 'Let sound reset your mood', desc_id: 'Biarkan musik mereset suasana hati' }, ], - // Creative / Art - 'creat,art,music,draw,paint,design,write,craft,imagin,innovat': [ - { title: 'Create something for 20 minutes', description: 'Draw, write, build — anything' }, - { title: 'Brainstorm 5 ideas', description: 'Quantity unlocks quality' }, - { title: 'Practice your craft', description: 'Show up even without inspiration' }, - { title: 'Consume inspiring work', description: 'Study someone you admire' }, - { title: 'Share one thing you made', description: 'Put your work into the world' }, - { title: 'Try a new creative technique', description: 'Experiment without pressure' }, - { title: 'Freewrite for 10 minutes', description: 'No editing, just flow' }, + 'creat,art,music,draw,paint,design,write,craft,imagin,innovat,kreatif,seni,musik,gambar,tulis,desain,cipta': [ + { en: 'Create something for 20 minutes', id: 'Ciptakan sesuatu selama 20 menit', desc_en: 'Draw, write, build — anything', desc_id: 'Gambar, tulis, bangun — apa saja' }, + { en: 'Brainstorm 5 ideas', id: 'Brainstorm 5 ide', desc_en: 'Quantity unlocks quality', desc_id: 'Kuantitas membuka kualitas' }, + { en: 'Practice your craft', id: 'Latih keahlianmu', desc_en: 'Show up even without inspiration', desc_id: 'Hadir walau tanpa inspirasi' }, + { en: 'Share one thing you made', id: 'Bagikan satu karya yang kamu buat', desc_en: 'Put your work into the world', desc_id: 'Taruh karyamu ke dunia' }, + { en: 'Freewrite for 10 minutes', id: 'Menulis bebas 10 menit', desc_en: 'No editing, just flow', desc_id: 'Tanpa edit, mengalir saja' }, ], - // Finance / Career - 'money,financ,save,earn,career,business,invest,rich,wealth,job,work': [ - { title: 'Track every expense today', description: 'Awareness is the first step' }, - { title: 'Save before you spend', description: 'Pay yourself first' }, - { title: 'Learn one new skill for your career', description: '15 minutes of growth' }, - { title: 'Review your financial goals', description: 'Are you on track?' }, - { title: 'Avoid one impulse purchase', description: 'Ask: do I need this or want this?' }, - { title: 'Network — reach out to someone', description: 'Opportunities come through people' }, - { title: 'Read about your industry', description: 'Stay sharp and informed' }, + 'money,financ,save,earn,career,business,invest,rich,wealth,job,work,uang,keuangan,tabung,hemat,karir,bisnis,investasi,kerja,gaji': [ + { en: 'Track every expense today', id: 'Catat semua pengeluaran hari ini', desc_en: 'Awareness is the first step', desc_id: 'Kesadaran adalah langkah pertama' }, + { en: 'Save before you spend', id: 'Menabung sebelum belanja', desc_en: 'Pay yourself first', desc_id: 'Bayar dirimu dulu' }, + { en: 'Learn one new skill for your career', id: 'Pelajari satu skill baru untuk karir', desc_en: '15 minutes of growth', desc_id: '15 menit pertumbuhan' }, + { en: 'Avoid one impulse purchase', id: 'Hindari satu pembelian impulsif', desc_en: 'Ask: do I need this?', desc_id: 'Tanya: apakah aku butuh ini?' }, + { en: 'Network — reach out to someone', id: 'Jaringan — hubungi seseorang', desc_en: 'Opportunities come through people', desc_id: 'Peluang datang dari koneksi' }, + { en: 'Read about your industry', id: 'Baca tentang industrimu', desc_en: 'Stay sharp and informed', desc_id: 'Tetap tajam dan terinformasi' }, ], - // Relationships - 'relationship,friend,family,love,connect,lonel,kind,empath,partner': [ - { title: 'Call or text someone you care about', description: 'Connection takes 2 minutes' }, - { title: 'Practice active listening', description: 'Listen to understand, not to reply' }, - { title: 'Give an unexpected compliment', description: 'Brighten someone\'s day' }, - { title: 'Be fully present in a conversation', description: 'Phone down, eyes up' }, - { title: 'Write a thank-you message', description: 'Gratitude strengthens bonds' }, - { title: 'Forgive one small thing', description: 'Carrying grudges weighs you down' }, - { title: 'Plan quality time with someone', description: 'Make people a priority, not an afterthought' }, + 'relationship,friend,family,love,connect,lonel,kind,empath,partner,hubungan,teman,keluarga,cinta,sahabat,kesepian,pasangan': [ + { en: 'Call or text someone you care about', id: 'Hubungi seseorang yang kamu sayangi', desc_en: 'Connection takes 2 minutes', desc_id: 'Koneksi hanya butuh 2 menit' }, + { en: 'Practice active listening', id: 'Latih mendengarkan aktif', desc_en: 'Listen to understand, not to reply', desc_id: 'Dengarkan untuk mengerti, bukan menjawab' }, + { en: 'Give an unexpected compliment', id: 'Berikan pujian tak terduga', desc_en: 'Brighten someone\'s day', desc_id: 'Cerahkan hari seseorang' }, + { en: 'Be fully present in a conversation', id: 'Hadir sepenuhnya saat ngobrol', desc_en: 'Phone down, eyes up', desc_id: 'HP turun, mata ke atas' }, + { en: 'Write a thank-you message', id: 'Tulis pesan terima kasih', desc_en: 'Gratitude strengthens bonds', desc_id: 'Rasa syukur memperkuat ikatan' }, + { en: 'Plan quality time with someone', id: 'Rencanakan waktu berkualitas', desc_en: 'Make people a priority', desc_id: 'Jadikan orang lain prioritas' }, ], - // Morning / Routine - 'morn,wake,alarm,sunrise,start,begin,early': [ - { title: 'Wake before 6:30 AM', description: 'Own the morning, own the day' }, - { title: 'No phone for first 30 minutes', description: 'Your mind deserves a slow start' }, - { title: 'Drink water before coffee', description: 'Rehydrate first' }, - { title: 'Move your body within 15 min of waking', description: 'Jumpstart your energy' }, - { title: 'Set 3 intentions for the day', description: 'Know what matters before you start' }, - { title: 'Eat a real breakfast', description: 'Fuel, not just caffeine' }, + 'morn,wake,alarm,sunrise,start,begin,early,pagi,bangun,subuh,awal': [ + { en: 'Wake before 6:30 AM', id: 'Bangun sebelum jam 6:30', desc_en: 'Own the morning', desc_id: 'Kuasai pagi hari' }, + { en: 'No phone for first 30 minutes', id: 'Tanpa HP 30 menit pertama', desc_en: 'Your mind deserves a slow start', desc_id: 'Pikiranmu butuh awal yang tenang' }, + { en: 'Drink water before coffee', id: 'Minum air sebelum kopi', desc_en: 'Rehydrate first', desc_id: 'Hidrasi dulu' }, + { en: 'Set 3 intentions for the day', id: 'Tetapkan 3 niat hari ini', desc_en: 'Know what matters before you start', desc_id: 'Ketahui apa yang penting sebelum mulai' }, + { en: 'Eat a real breakfast', id: 'Makan sarapan yang benar', desc_en: 'Fuel, not just caffeine', desc_id: 'Bahan bakar, bukan hanya kafein' }, + { en: 'Move your body within 15 min of waking', id: 'Gerakkan tubuh dalam 15 menit setelah bangun', desc_en: 'Jumpstart your energy', desc_id: 'Awali energimu' }, ], - // Spiritual / Purpose - 'spirit,purpose,meaning,faith,pray,god,soul,grateful,thank': [ - { title: 'Spend 10 minutes in stillness', description: 'Prayer, meditation, or silence' }, - { title: 'Write what you\'re grateful for', description: 'Gratitude changes your lens' }, - { title: 'Read something that feeds your soul', description: 'A verse, a poem, a passage' }, - { title: 'Reflect on your purpose', description: 'Why are you here? What matters?' }, - { title: 'Do one act of kindness', description: 'Give without expecting return' }, - { title: 'Forgive yourself for something', description: 'Grace is a daily practice' }, + 'spirit,purpose,meaning,faith,pray,god,soul,grateful,thank,ibadah,doa,tuhan,syukur,iman,sholat,rohani,bermakna': [ + { en: 'Spend 10 minutes in stillness', id: 'Habiskan 10 menit dalam keheningan', desc_en: 'Prayer, meditation, or silence', desc_id: 'Doa, meditasi, atau keheningan' }, + { en: 'Write what you\'re grateful for', id: 'Tulis hal yang kamu syukuri', desc_en: 'Gratitude changes your lens', desc_id: 'Rasa syukur mengubah sudut pandang' }, + { en: 'Read something that feeds your soul', id: 'Baca sesuatu yang menyentuh jiwa', desc_en: 'A verse, a poem, a passage', desc_id: 'Ayat, puisi, atau bacaan bermakna' }, + { en: 'Reflect on your purpose', id: 'Renungkan tujuan hidupmu', desc_en: 'Why are you here?', desc_id: 'Kenapa kamu ada di sini?' }, + { en: 'Do one act of kindness', id: 'Lakukan satu kebaikan', desc_en: 'Give without expecting return', desc_id: 'Memberi tanpa mengharap balasan' }, + { en: 'Forgive yourself for something', id: 'Maafkan dirimu atas sesuatu', desc_en: 'Grace is a daily practice', desc_id: 'Mengampuni adalah latihan harian' }, ], }; -// Universal habits that apply to anyone -const UNIVERSAL_HABITS = [ - { title: 'Journal for 5 minutes', description: 'Put your thoughts on paper' }, - { title: 'Drink a full glass of water first thing', description: 'Start clean' }, - { title: 'Take a 10-minute walk', description: 'Movement clears the mind' }, - { title: 'Do one thing outside your comfort zone', description: 'Growth is on the other side' }, - { title: 'Spend 5 minutes planning tomorrow', description: 'Never wake up without a plan' }, - { title: 'Say something kind to yourself', description: 'You talk to yourself more than anyone' }, - { title: 'Avoid complaining for 1 hour', description: 'Replace complaints with solutions' }, - { title: 'Tidy one small area', description: 'Order outside creates order inside' }, - { title: 'Do something you\'ve been avoiding', description: 'The relief is worth the effort' }, - { title: 'Go to bed 15 minutes earlier', description: 'Small shifts, big impact' }, +// Universal habits — bilingual +const UNIVERSAL_BILINGUAL = [ + { en: 'Journal for 5 minutes', id: 'Jurnal 5 menit', desc_en: 'Put your thoughts on paper', desc_id: 'Tuangkan pikiranmu di kertas' }, + { en: 'Drink a full glass of water first thing', id: 'Minum segelas penuh air putih pertama kali', desc_en: 'Start clean', desc_id: 'Mulai dengan bersih' }, + { en: 'Take a 10-minute walk', id: 'Jalan kaki 10 menit', desc_en: 'Movement clears the mind', desc_id: 'Gerakan menjernihkan pikiran' }, + { en: 'Do one thing outside your comfort zone', id: 'Lakukan satu hal di luar zona nyaman', desc_en: 'Growth is on the other side', desc_id: 'Pertumbuhan ada di sisi lain' }, + { en: 'Spend 5 minutes planning tomorrow', id: 'Habiskan 5 menit merencanakan besok', desc_en: 'Never wake up without a plan', desc_id: 'Jangan bangun tanpa rencana' }, + { en: 'Say something kind to yourself', id: 'Katakan sesuatu yang baik untuk dirimu', desc_en: 'You talk to yourself more than anyone', desc_id: 'Kamu bicara pada dirimu lebih dari siapa pun' }, + { en: 'Avoid complaining for 1 hour', id: 'Hindari mengeluh selama 1 jam', desc_en: 'Replace complaints with solutions', desc_id: 'Ganti keluhan dengan solusi' }, + { en: 'Tidy one small area', id: 'Rapikan satu area kecil', desc_en: 'Order outside creates order inside', desc_id: 'Kerapian luar menciptakan kerapian dalam' }, + { en: 'Do something you\'ve been avoiding', id: 'Lakukan sesuatu yang kamu hindari', desc_en: 'The relief is worth the effort', desc_id: 'Lega-nya sepadan dengan usaha' }, + { en: 'Go to bed 15 minutes earlier', id: 'Tidur 15 menit lebih awal', desc_en: 'Small shifts, big impact', desc_id: 'Perubahan kecil, dampak besar' }, ]; -export function generateHabitsFromIdentity(title) { - const text = (title || '').toLowerCase(); - const matched = []; - - // Collect all matching habits from the pool - for (const [keys, habits] of Object.entries(HABIT_POOL)) { - const keyList = keys.split(','); - if (keyList.some((k) => text.includes(k.trim()))) { - habits.forEach((h) => { - if (!matched.some((m) => m.title === h.title)) matched.push(h); - }); - } - } - - // Shuffle matched and pick 3-5 - if (matched.length > 0) { - const picked = shuffle(matched).slice(0, 3 + Math.floor(Math.random() * 2)); - return picked; - } - - // No keyword match — return random universal habits - return shuffle(UNIVERSAL_HABITS).slice(0, 3); +// Convert bilingual entry to habit object based on language +function toHabit(entry, useId) { + return { + title: useId ? entry.id : entry.en, + description: useId ? entry.desc_id : entry.desc_en, + }; } -export function getSuggestionsForIdentity(title) { - if (!title || title.trim().length < 2) return []; - const text = title.toLowerCase(); +// No module state — detect language from text directly every time + +// Build habits from bilingual pool, matching keywords in searchText +// useId determined from langText (the full story) +function getPoolHabits(searchText, langText) { + const useId = isIndonesian(langText || searchText); + const lower = searchText.toLowerCase(); const matched = []; - for (const [keys, habits] of Object.entries(HABIT_POOL)) { + for (const [keys, habits] of Object.entries(HABIT_POOL_BILINGUAL)) { const keyList = keys.split(','); - if (keyList.some((k) => text.includes(k.trim()))) { + if (keyList.some((k) => lower.includes(k.trim()))) { habits.forEach((h) => { - if (!matched.includes(h.title)) matched.push(h.title); + const habit = toHabit(h, useId); + if (!matched.some((m) => m.title === habit.title)) matched.push(habit); }); } } - // Shuffle so same input doesn't always show same order + return matched; +} + +function getUniversalHabits(langText) { + const useId = isIndonesian(langText); + return UNIVERSAL_BILINGUAL.map((h) => toHabit(h, useId)); +} + +/** + * Generate up to 20 bilingual habits. + * @param {string} searchText - text to match keywords against + * @param {string} [langText] - full story text for language detection (optional, defaults to searchText) + */ +export function generateHabitsFromIdentity(searchText, langText) { + const text = (searchText || '').toLowerCase(); + const lang = langText || searchText || ''; + const matched = getPoolHabits(text, lang); + + const shuffled = shuffle(matched); + if (shuffled.length < 20) { + const universals = getUniversalHabits(lang); + universals.forEach((h) => { + if (!shuffled.some((m) => m.title === h.title)) shuffled.push(h); + }); + } + + return shuffled.length > 0 ? shuffled.slice(0, 20) : getUniversalHabits(lang).slice(0, 5); +} + +/** + * Get habit title suggestions (strings). + * @param {string} searchText - text to match keywords against + * @param {string} [langText] - full story for language detection + */ +export function getSuggestionsForIdentity(searchText, langText) { + if (!searchText || searchText.trim().length < 2) return []; + const text = searchText.toLowerCase(); + const lang = langText || searchText || ''; + const matched = getPoolHabits(text, lang).map((h) => h.title); const shuffled = shuffle(matched); - // If few matches, pad with universal habits if (shuffled.length < 5) { - const universalTitles = shuffle(UNIVERSAL_HABITS).map((h) => h.title); - universalTitles.forEach((t) => { + const universals = getUniversalHabits(lang).map((h) => h.title); + universals.forEach((t) => { if (!shuffled.includes(t)) shuffled.push(t); }); } - return shuffled.slice(0, 8); + return shuffled.slice(0, 20); } +// Keep for backward compat — no-op now +export function setStoryLanguage() {} + export function formatDate(date) { return new Date(date).toLocaleDateString('en-US', { month: 'short', diff --git a/src/utils/safeParseAI.js b/src/utils/safeParseAI.js index 8c53fe1..6b3504e 100644 --- a/src/utils/safeParseAI.js +++ b/src/utils/safeParseAI.js @@ -18,7 +18,23 @@ const FALLBACK = { { title: 'Move your body for 20 minutes', best_time: '06:30', duration: 20, frequency: 'Every day', category: 'Body', difficulty: 'Easy', why: 'Movement lifts everything' }, { title: 'Write one thing you are grateful for', best_time: '06:00', duration: 2, frequency: 'Every morning', category: 'Emotion', difficulty: 'Easy', why: 'Gratitude shifts perspective' }, ], - suggested_habits: [], + suggested_habits: [ + { title: 'Read 15 pages', best_time: '07:00', duration: 20, frequency: 'Every day', category: 'Mind', difficulty: 'Easy', why: 'A chapter a day compounds into wisdom' }, + { title: 'Drink 2L of water', best_time: '08:00', duration: 0, frequency: 'Every day', category: 'Health', difficulty: 'Easy', why: 'Hydration fuels everything' }, + { title: 'Take a 10-minute walk', best_time: '12:00', duration: 10, frequency: 'Every day', category: 'Body', difficulty: 'Easy', why: 'Movement clears the mind' }, + { title: 'Plan your top 3 tasks tonight', best_time: '21:00', duration: 5, frequency: 'Every evening', category: 'Discipline', difficulty: 'Easy', why: 'Wake up with clarity' }, + { title: 'No phone first 30 minutes', best_time: '06:00', duration: 30, frequency: 'Every morning', category: 'Discipline', difficulty: 'Medium', why: 'Your mind deserves a slow start' }, + { title: 'Deep focus block 1 hour', best_time: '09:00', duration: 60, frequency: 'Weekdays only', category: 'Skill', difficulty: 'Medium', why: 'Deep work builds mastery' }, + { title: 'Journal for 5 minutes', best_time: '21:30', duration: 5, frequency: 'Every evening', category: 'Mind', difficulty: 'Easy', why: 'Put your thoughts on paper' }, + { title: 'Stretch for 10 minutes', best_time: '06:30', duration: 10, frequency: 'Every morning', category: 'Body', difficulty: 'Easy', why: 'Release tension from your body' }, + { title: 'Practice saying no once', best_time: '—', duration: 0, frequency: 'Every day', category: 'Social', difficulty: 'Medium', why: 'Boundaries are self-respect' }, + { title: 'Cook one meal at home', best_time: '18:00', duration: 30, frequency: '3x per week', category: 'Health', difficulty: 'Medium', why: 'Control what goes in your body' }, + { title: 'Call or text someone you care about', best_time: '19:00', duration: 5, frequency: '3x per week', category: 'Social', difficulty: 'Easy', why: 'Connection takes 2 minutes' }, + { title: 'Create something for 20 minutes', best_time: '17:00', duration: 20, frequency: 'Every day', category: 'Creative', difficulty: 'Medium', why: 'Show up even without inspiration' }, + { title: 'Meditate for 10 minutes', best_time: '06:00', duration: 10, frequency: 'Every morning', category: 'Mind', difficulty: 'Easy', why: 'Stillness sharpens everything' }, + { title: 'Track every expense today', best_time: '20:00', duration: 5, frequency: 'Every day', category: 'Discipline', difficulty: 'Easy', why: 'Awareness is the first step' }, + { title: 'Sleep by 11pm', best_time: '22:30', duration: 0, frequency: 'Every day', category: 'Health', difficulty: 'Medium', why: 'Protect your rest window' }, + ], }; function parseDuration(val) {