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) {