diff --git a/apps/mobile/package.json b/apps/mobile/package.json index 89e5421..c8c269b 100644 --- a/apps/mobile/package.json +++ b/apps/mobile/package.json @@ -32,6 +32,7 @@ "expo-splash-screen": "~31.0.13", "expo-status-bar": "~3.0.9", "expo-system-ui": "~6.0.9", + "firebase": "^12.17.1", "i18next": "^26.3.6", "react": "19.1.0", "react-dom": "19.1.0", diff --git a/apps/mobile/src/lib/auth-provider/firebase.ts b/apps/mobile/src/lib/auth-provider/firebase.ts new file mode 100644 index 0000000..be42b81 --- /dev/null +++ b/apps/mobile/src/lib/auth-provider/firebase.ts @@ -0,0 +1,88 @@ +import { initializeApp, getApps, getApp } from "firebase/app"; +import { + initializeAuth, + getAuth, + onAuthStateChanged as fbOnAuthStateChanged, + signInWithEmailAndPassword, + createUserWithEmailAndPassword, + signOut as fbSignOut, + type Auth, + type User, + type Persistence, +} from "firebase/auth"; +import * as fbAuth from "firebase/auth"; +import AsyncStorage from "@react-native-async-storage/async-storage"; +import type { AuthProvider, AuthUser, Unsubscribe } from "./types"; + +/** + * ENDA mobilfilen som importerar Firebase. App-koden använder bara + * AuthProvider-gränssnittet. Byt till Zitadel => byt bara denna fil. + * Publik klient-config (identifierare, ingen hemlighet). + */ +const firebaseConfig = { + apiKey: "AIzaSyAH2F-aZRvZXQtGD7X8cF9Zp3yXUhEl3sM", + authDomain: "cibello-c2ff3.firebaseapp.com", + projectId: "cibello-c2ff3", + storageBucket: "cibello-c2ff3.firebasestorage.app", + messagingSenderId: "1034102905039", + appId: "1:1034102905039:web:12e31120989655f34affba", +}; + +const app = getApps().length ? getApp() : initializeApp(firebaseConfig); + +// getReactNativePersistence finns i runtime men saknas ibland i typerna +// (firebase-js-sdk#9316) – hämtas därför via en typsäker modul-cast. +const getReactNativePersistence = ( + fbAuth as unknown as { getReactNativePersistence: (storage: unknown) => Persistence } +).getReactNativePersistence; + +// AsyncStorage-persistens så inloggningen överlever app-omstart. +let auth: Auth; +try { + auth = initializeAuth(app, { persistence: getReactNativePersistence(AsyncStorage) }); +} catch { + // initializeAuth kastar om den redan körts (Fast Refresh) – återanvänd instansen. + auth = getAuth(app); +} + +function toAuthUser(u: User | null): AuthUser | null { + if (!u) return null; + return { + uid: u.uid, + email: u.email, + emailVerified: u.emailVerified, + displayName: u.displayName, + providerId: u.providerData[0]?.providerId ?? null, + }; +} + +export const firebaseAuthProvider: AuthProvider = { + async signUpWithEmail(email, password) { + const cred = await createUserWithEmailAndPassword(auth, email, password); + return toAuthUser(cred.user)!; + }, + async signInWithEmail(email, password) { + const cred = await signInWithEmailAndPassword(auth, email, password); + return toAuthUser(cred.user)!; + }, + async signInWithGoogle(): Promise { + throw new Error("Google-inloggning läggs till i AUTH-6."); + }, + async signInWithApple(): Promise { + throw new Error("Apple-inloggning läggs till i AUTH-6."); + }, + async signOut() { + await fbSignOut(auth); + }, + currentUser() { + return toAuthUser(auth.currentUser); + }, + onAuthStateChanged(callback): Unsubscribe { + return fbOnAuthStateChanged(auth, (u) => callback(toAuthUser(u))); + }, + async getIdToken(forceRefresh = false) { + const u = auth.currentUser; + if (!u) return null; + return u.getIdToken(forceRefresh); + }, +}; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8ba1d95..a911b97 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -134,7 +134,7 @@ importers: version: 5.1.0 firebase-admin: specifier: ^14.2.0 - version: 14.2.0 + version: 14.2.0(@firebase/app-compat@0.5.16)(@firebase/app@0.16.0) ioredis: specifier: ^6.0.0 version: 6.0.0 @@ -223,6 +223,9 @@ importers: expo-system-ui: specifier: ~6.0.9 version: 6.0.9(expo@54.0.36)(react-native-web@0.21.2(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.7)(@react-native/metro-config@0.86.2(@babel/core@7.29.7))(@types/react@19.1.17)(react@19.1.0)) + firebase: + specifier: ^12.17.1 + version: 12.17.1(@react-native-async-storage/async-storage@2.2.0(react-native@0.81.5(@babel/core@7.29.7)(@react-native/metro-config@0.86.2(@babel/core@7.29.7))(@types/react@19.1.17)(react@19.1.0))) i18next: specifier: ^26.3.6 version: 26.3.6(typescript@5.9.3) @@ -1940,19 +1943,92 @@ packages: '@fastify/rate-limit@10.3.0': resolution: {integrity: sha512-eIGkG9XKQs0nyynatApA3EVrojHOuq4l6fhB4eeCk4PIOeadvOJz9/4w3vGI44Go17uaXOWEcPkaD8kuKm7g6Q==} + '@firebase/ai@2.14.0': + resolution: {integrity: sha512-TYEQqCQUTyVHuG/HVi9vau6F9kvEaS49o/hmdn/yUuN6ZXQkwIml2nNJTIBfjNl/r9LOxwUNILgcOY16nxObug==} + engines: {node: '>=20.0.0'} + peerDependencies: + '@firebase/app': 0.x + '@firebase/app-types': 0.x + + '@firebase/analytics-compat@0.2.29': + resolution: {integrity: sha512-allztvCvCUlItZzD97TiRAtGoFJzR1FQFmLxbaLc6PvgscqD9cl5NdKPTtka6keShVYXvCZJpzWcRoH4TME8rw==} + peerDependencies: + '@firebase/app': 0.x + '@firebase/app-compat': 0.x + + '@firebase/analytics-types@0.8.4': + resolution: {integrity: sha512-zQ+XTgkwH6CY/eUSHJRP7e4LxM30RCxlCmob5sy2axs25GE3Ny0XdgpDscMTHHQIGqWkxPXad4w2Mw9sCgT8zQ==} + + '@firebase/analytics@0.10.23': + resolution: {integrity: sha512-34ALWXzWA6PTRUA5hipZmsm1RKzeecw5J1+qTCXsiMzwLqONC+GuTIQSdmm91MmTAEA+wG1Q5t0IFahcYQOqAA==} + peerDependencies: + '@firebase/app': 0.x + + '@firebase/app-check-compat@0.4.6': + resolution: {integrity: sha512-2pzNEZEkX84jSqy6TH6FI1HSLA1lc7kakRUybBbKjg9YhIttPlW/XX3N9CDtChji2PTTPWVPZiWhB10exHfA+A==} + engines: {node: '>=20.0.0'} + peerDependencies: + '@firebase/app': 0.x + '@firebase/app-compat': 0.x + '@firebase/app-check-interop-types@0.3.4': resolution: {integrity: sha512-zz3i6e13B8BfWiLy8MABtTh8aGIACgKbf9UVnyHcWs+yQzJXgQcl8A46b0zfaiJHdQ+niF0ouAfcpuf+3LMPQg==} + '@firebase/app-check-types@0.5.4': + resolution: {integrity: sha512-xV7JsIyzVr15aA7f3Pi0rB9gdBuVubs89FGA8VkRYA4g0l78poADgdfrScgf7NndSg9mm7cR7PJyY0+t22KaGw==} + + '@firebase/app-check@0.13.0': + resolution: {integrity: sha512-AbMttBKazQvGVXBZhQdVAdPzRhwHyJAY3Ghu5y2C7IZKIDIppzNYz0shTZ1mP4FBJa+28BuC4t+5h1Q6pT3Asg==} + engines: {node: '>=20.0.0'} + peerDependencies: + '@firebase/app': 0.x + + '@firebase/app-compat@0.5.16': + resolution: {integrity: sha512-shQq37O8qELDzvsVwYPlDXwD1zlcrZ0m2bpBF5ov2HSbY8x+AHsnL5TtJ2e1JAfkQN05qHao1AfabS69PN6GiA==} + engines: {node: '>=20.0.0'} + '@firebase/app-types@0.9.5': resolution: {integrity: sha512-YevqTjvo7Iujsa9Dwowmd6dSoElhzmD63ZSrq6bzjvQ6POjYgNjOFHLmNIgJs48eNO093NCERibuFnxbfOvU7A==} + '@firebase/app@0.16.0': + resolution: {integrity: sha512-G+ZGEyVP8YTb3ay6A+XpcYgFH3sTESHcnHU/EyTktodqhz2BHkLq+QEP7IVwjiMX0cxYwpVKip0/wC0KZcn9vQ==} + engines: {node: '>=20.0.0'} + + '@firebase/auth-compat@0.6.9': + resolution: {integrity: sha512-/hHeTBmQ61+N5J1RECls+WfskZTY78JXr7aO5EMOfUpqJvDqvoS+568k0rp6Ss/4UWwBjadILs+H+SGy1zCS3A==} + engines: {node: '>=20.0.0'} + peerDependencies: + '@firebase/app': 0.x + '@firebase/app-compat': 0.x + '@firebase/auth-interop-types@0.2.5': resolution: {integrity: sha512-1Li/YuBDBAXcKv7BzY4U28gontUmAaw53sYiqbaVOMCFb2lFKK/c3CGMUWqtwe7+TXrl3poWnTCL5umYBg85Eg==} + '@firebase/auth-types@0.13.1': + resolution: {integrity: sha512-0c1Mnid0uMDfGJHeUS4zfvBa4/CedJXotGy/n/NZJnBjwiJawt0ZYU+wH2VAVLiRCEfG2ncCkAX3yd1/2nrB7g==} + peerDependencies: + '@firebase/app-types': 0.x + '@firebase/util': 1.x + + '@firebase/auth@1.13.4': + resolution: {integrity: sha512-s+NS1aV0DDyyfoIMeSz53HXnVTv7ufJjJfrP63XyaWHweJ5vOoxKWrTm5tO7S7PDqvyOa/Wi3oP0dgAo6JTMMA==} + engines: {node: '>=20.0.0'} + peerDependencies: + '@firebase/app': 0.x + '@react-native-async-storage/async-storage': ^2.2.0 || ^3.0.0 + peerDependenciesMeta: + '@react-native-async-storage/async-storage': + optional: true + '@firebase/component@0.7.4': resolution: {integrity: sha512-tLpOaaCol9ugUIYp2R3CbWPPA8Ajg/papX/XHEy8U52b/QXH3BbX8tTJX9aShDCjp+9sMAxMLD94i7lresdugQ==} engines: {node: '>=20.0.0'} + '@firebase/data-connect@0.7.3': + resolution: {integrity: sha512-nHBFk3Ntl+NZCRIUG2d5j7I69P0otjyQ/duhVKLbw4+5cNke/F6RK1pdE5Jnf831/QOTs2Bd00LlxlZ+jNsb9w==} + peerDependencies: + '@firebase/app': 0.x + '@firebase/database-compat@2.1.6': resolution: {integrity: sha512-mu7S/75UIajB1A5M9Vfojk69LttW55uABp9nHEtWrV/mIaSEwvoaIe9GySsEzS2EKFK5/3f5okcAuUbihhYeJg==} engines: {node: '>=20.0.0'} @@ -1972,14 +2048,129 @@ packages: resolution: {integrity: sha512-D+j4+8uhGtNd1tVD+X+c8JrC4ppStGJKyujSQt2NPwdN26QcCk0BeIxue+UqspHkHiFHyQOimwlzjLewGq6S+A==} engines: {node: '>=20.0.0'} + '@firebase/firestore-compat@0.4.12': + resolution: {integrity: sha512-k2uX81Ao/S0jnFcWGPOQpKK1cPlJHvD9WIqh/RE1XBDP2yg5zhE4rHhSg1rtB11k39q3nKon9XLNDDrPjGclag==} + engines: {node: '>=20.0.0'} + peerDependencies: + '@firebase/app': 0.x + '@firebase/app-compat': 0.x + + '@firebase/firestore-types@3.0.4': + resolution: {integrity: sha512-jGn+JSS4X9zZsrfu7Yw66v5YRdOLD1oyQh4USR0xWl4CUqV/DA6bNIXRPpxH/cUl3iVTNiP6MN7g+EL42A4qfA==} + peerDependencies: + '@firebase/app-types': 0.x + '@firebase/util': 1.x + + '@firebase/firestore@4.17.0': + resolution: {integrity: sha512-P9tof6pyO1bnLlMWbux+5O7WFJqlb7OTPMKxxOiXKYiQl7mxykAvxr1BFCgWeEXUU7DZxQncyJ040B0IhFVZCg==} + engines: {node: '>=20.0.0'} + peerDependencies: + '@firebase/app': 0.x + + '@firebase/functions-compat@0.4.6': + resolution: {integrity: sha512-dj9sOet+FIU91jeU4A3vGJoXHty7NqkSfjRLCwLgJXPDk1m72KFuxD3nlFgw/yXx/Fr7UjqzbxZ0LrIOdpx7+w==} + engines: {node: '>=20.0.0'} + peerDependencies: + '@firebase/app': 0.x + '@firebase/app-compat': 0.x + + '@firebase/functions-types@0.6.4': + resolution: {integrity: sha512-zV6kgqtduR4rUAdC/ilS7kmb93XD7bEZoJDlVBZqlOw2uGGGCNBQBuleww2rr0Ulr3L9o2TDjumEt68/l1f9DQ==} + + '@firebase/functions@0.13.6': + resolution: {integrity: sha512-9obLnzeQUivK5lmtGFOU2ucQ38BjTp+jpPtbfFp/mDsdVCvEpRqdWNvMMQ6aQwR4vcVc/utsvngm5BRkXbc7ZA==} + engines: {node: '>=20.0.0'} + peerDependencies: + '@firebase/app': 0.x + + '@firebase/installations-compat@0.2.23': + resolution: {integrity: sha512-isaXmjb9roM83eVeXAe+ZRNKYNsSo2s0aNM+cy04AAGEyVL/d8Aa11GwEXovRFeYjl9+1yRAOxRDTOukZRwTxA==} + peerDependencies: + '@firebase/app': 0.x + '@firebase/app-compat': 0.x + + '@firebase/installations-types@0.5.4': + resolution: {integrity: sha512-U2eFapdHwjb43Vx9o+Pmj4dFfvcHEK1IirEFLqMtWrTHvmdrS3gBpBD1kmJk/9HjsOtoHZxJ2Paoe79e+L1ZPg==} + peerDependencies: + '@firebase/app-types': 0.x + + '@firebase/installations@0.6.23': + resolution: {integrity: sha512-MBkbcQfd+3qHjW+slsH4s7jH5qTdGlYpwqmxEZ7QcIpgDxu1SKyU0f+mCZhCt1BCacLNiOWF5L0R06N0LtlfMg==} + peerDependencies: + '@firebase/app': 0.x + '@firebase/logger@0.5.1': resolution: {integrity: sha512-vZKLsqE1ABOy8OjQiE7cUTFn4gvaqlk88yp8N94Pk/sDpq61YqZGqmVFZTvOyflTwuYFcWirBdYGoJgbDaXKYQ==} engines: {node: '>=20.0.0'} + '@firebase/messaging-compat@0.2.28': + resolution: {integrity: sha512-/AmMqHRnSQhPsdeED3ocs+s30/tpFvZDiiwIYY2uXFRvLujo1fnbPOeCFoe4Y+dRy1LCSjpvJf+dy5ZTsxi1yg==} + peerDependencies: + '@firebase/app': 0.x + '@firebase/app-compat': 0.x + + '@firebase/messaging-interop-types@0.2.5': + resolution: {integrity: sha512-tUEKnaAP2Y/MNIqgnriPpV6e5l13Vs/+p2yrd6NGlncPJT9O3a8muYZtdnWe+IJ4fgKLHJVC79n/asxk/N5Msw==} + + '@firebase/messaging@0.13.1': + resolution: {integrity: sha512-kL8fdjbNBI7hprlXJrUjktDWosrpT4JtfwXtVVevImPF/rBRAsC+LS/jIs+kgQVuotnvMhaBCgAFipBoY9YU9g==} + peerDependencies: + '@firebase/app': 0.x + + '@firebase/performance-compat@0.2.26': + resolution: {integrity: sha512-jgoocXLN6ao26xWQ8pzosmzQ33uLzGBJQPNK0NTbVy1XvIHr5pfgBf9hWLOxsWe+R7sJq5bjD+8ybXprmt61mA==} + peerDependencies: + '@firebase/app': 0.x + '@firebase/app-compat': 0.x + + '@firebase/performance-types@0.2.4': + resolution: {integrity: sha512-kJSEk7b0uhpcPRyL4SQ/GPujLqk52XNKcXlnsKDbWGAb9vugcLvOU3u6zfEdwd+d8hWJb5S5ZizV1JFFI0nkKg==} + + '@firebase/performance@0.7.13': + resolution: {integrity: sha512-1u6fuXP9cj0s+lkTFAspr/ttfPebPbEdpx+5Wdr4mPZbp8qH2KCMxOddEAR1ZMRa5GI0E7hDYSnolEmbqOFOAg==} + peerDependencies: + '@firebase/app': 0.x + + '@firebase/remote-config-compat@0.2.28': + resolution: {integrity: sha512-kEO9Gn6fbmVj7eNUtZ6d59mLgUDUD0qo7aCicGOWNfuRWTaUv3CF9DMYychO61zaEQ3cfA+CEny4V1E8A1gRGA==} + peerDependencies: + '@firebase/app': 0.x + '@firebase/app-compat': 0.x + + '@firebase/remote-config-types@0.5.1': + resolution: {integrity: sha512-cX/1LT6KQwkXzck2eSzeKnuvXZCyr8qaPpDcikoJs7jmI+oBOXixpDLeDtWj1U6GNMkIoXrEDNoyT2Ypcyp5/A==} + + '@firebase/remote-config@0.9.1': + resolution: {integrity: sha512-nzQUSJnk1zAZEl2Q5O3I7Z61cYLK5JI4H6wyyOiHkVZ+bmgy1YXNNMptNbVjixMQ/eCzgA6nZRaC+1eBcJGUFA==} + peerDependencies: + '@firebase/app': 0.x + + '@firebase/storage-compat@0.4.4': + resolution: {integrity: sha512-qSRgCB9f2R/nCp8t/8OC101cIFBFeUazlRInOMdzbnLzvrQBzEfx19SrR4pvdj/0+M+P/y8AK/a2s+3EB+B1Pw==} + engines: {node: '>=20.0.0'} + peerDependencies: + '@firebase/app': 0.x + '@firebase/app-compat': 0.x + + '@firebase/storage-types@0.8.4': + resolution: {integrity: sha512-BT7cwxJOx8SWwlQfrlC+bD/Sk3Cw+1odCi8UZNFNWTVZoPsBnA5W+mqtZzVnvsdJpXCFGSGQ7R7vOR6dtM/BRA==} + peerDependencies: + '@firebase/app-types': 0.x + '@firebase/util': 1.x + + '@firebase/storage@0.14.4': + resolution: {integrity: sha512-jfzEWZb3Fpsq3FwAB2ifoc8mcSh935qXdDou3TpyjDWa45hhNcZUv8/w28/10njByhfK7snbakKN30nwnzQ3/w==} + engines: {node: '>=20.0.0'} + peerDependencies: + '@firebase/app': 0.x + '@firebase/util@1.15.2': resolution: {integrity: sha512-974pWIZVLDMc5GW5YAsj8y0XxULxIy/sPUy7tsxmWbF93KRIyh9xpuHlh0zDL+shUcf5nHDjFOg9YLiQ763eiA==} engines: {node: '>=20.0.0'} + '@firebase/webchannel-wrapper@1.0.6': + resolution: {integrity: sha512-Vr/Mqu79dMwGRAyGbJ4uN4+BtXB3/mRTdzetD1daWNeG8QaWuzhhbG77GltO5c0yYmYls8i250iX73624GJd7Q==} + '@google-cloud/firestore@8.7.1': resolution: {integrity: sha512-Hp/WI8sH569ANitsko6RNvCUkzTCYudHoINOkQjiJq2FBG6kKnofBAW7PtS823cu6RMxHqK2RxRcspdjrRpUFA==} engines: {node: '>=18'} @@ -2004,6 +2195,15 @@ packages: resolution: {integrity: sha512-k9Dj3DV/itK9D06Y8f190Qgop7/Ui+D0njFV3LHMPwPT75DpXLQohE9Wmz0QElrJnzsjB7KPWiKJbOl7IPDArQ==} engines: {node: '>=12.10.0'} + '@grpc/grpc-js@1.9.16': + resolution: {integrity: sha512-wE4Ut/olIzfKqp631XrG+wbF0v1vWFN4YL9FyXC2LJiG33DsV7PLzURjrCvY/6je2ntdRkeLpPDluzSRGaVltQ==} + engines: {node: ^8.13.0 || >=10.10.0} + + '@grpc/proto-loader@0.7.15': + resolution: {integrity: sha512-tMXdRCfYVixjuFK+Hk0Q1s38gV9zDiDJfWL3h1rv4Qc39oILCu1TRTDt7+fGUI8K4G1Fj125Hx/ru3azECWTyQ==} + engines: {node: '>=6'} + hasBin: true + '@grpc/proto-loader@0.8.1': resolution: {integrity: sha512-wtF6h+DY6M3YaDBPAmvuuA6jV8Sif9MjtOI5euKFWRgCDl5PeDpPsHR9u2l6St5ceY8AZgoNDww5+HvEsXFsGg==} engines: {node: '>=6'} @@ -4095,6 +4295,9 @@ packages: resolution: {integrity: sha512-zfs5PdccEgjX479bbMmz95Rqc7ttQ4LV3qkGFlPiqOaOu/suBZc3fG52Qzn2hQjiSHkBM4NP2AZV5r2NvAt0TQ==} engines: {node: '>=22'} + firebase@12.17.1: + resolution: {integrity: sha512-dhp41ye9jMQvhx5FwjMkf/hjDHJApl7gXmvzOZGvP0M7c/GZGUnQ4qvsvlOBkF0Pa7wAwHMdcpL0ON2pXCQ4Sw==} + fix-dts-default-cjs-exports@1.0.1: resolution: {integrity: sha512-pVIECanWFC61Hzl2+oOCtoJ3F17kglZC/6N94eRWycFgBH35hHx0Li604ZIzhseh97mf2p0cv7vVrOZGoqhlEg==} @@ -4365,6 +4568,9 @@ packages: typescript: optional: true + idb@7.1.1: + resolution: {integrity: sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==} + ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} @@ -5363,6 +5569,10 @@ packages: resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} hasBin: true + re2js@2.8.6: + resolution: {integrity: sha512-xLgQil4kIUCrAzVk9fRSkxkFNwmygLFjVxXrLc65aE1F0+Zsb8rxumFBy4XKyvgMCTL6kilDq3EZ0piE2dP/Dg==} + engines: {node: '>=18.0.0'} + react-devtools-core@6.1.5: resolution: {integrity: sha512-ePrwPfxAnB+7hgnEr8vpKxL9cmnp7F322t8oqcPshbIQQhDKgFDW4tjhF2wjVbdXF9O/nyuy3sQWd9JGpiLPvA==} @@ -6250,6 +6460,9 @@ packages: resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} engines: {node: '>= 8'} + web-vitals@4.2.4: + resolution: {integrity: sha512-r4DIlprAGwJ7YM11VZp4R884m0Vmgr6EAKe3P+kO0PPj3Unqyvv59rczf6UiGcb9Z8QxZVcqKNwv/g0WNdWwsw==} + webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} @@ -7949,20 +8162,125 @@ snapshots: fastify-plugin: 5.1.0 toad-cache: 3.7.4 + '@firebase/ai@2.14.0(@firebase/app-types@0.9.5)(@firebase/app@0.16.0)': + dependencies: + '@firebase/app': 0.16.0 + '@firebase/app-check-interop-types': 0.3.4 + '@firebase/app-types': 0.9.5 + '@firebase/component': 0.7.4 + '@firebase/logger': 0.5.1 + '@firebase/util': 1.15.2 + tslib: 2.8.1 + + '@firebase/analytics-compat@0.2.29(@firebase/app-compat@0.5.16)(@firebase/app@0.16.0)': + dependencies: + '@firebase/analytics': 0.10.23(@firebase/app@0.16.0) + '@firebase/analytics-types': 0.8.4 + '@firebase/app': 0.16.0 + '@firebase/app-compat': 0.5.16 + '@firebase/component': 0.7.4 + '@firebase/util': 1.15.2 + tslib: 2.8.1 + + '@firebase/analytics-types@0.8.4': {} + + '@firebase/analytics@0.10.23(@firebase/app@0.16.0)': + dependencies: + '@firebase/app': 0.16.0 + '@firebase/component': 0.7.4 + '@firebase/installations': 0.6.23(@firebase/app@0.16.0) + '@firebase/logger': 0.5.1 + '@firebase/util': 1.15.2 + tslib: 2.8.1 + + '@firebase/app-check-compat@0.4.6(@firebase/app-compat@0.5.16)(@firebase/app@0.16.0)': + dependencies: + '@firebase/app': 0.16.0 + '@firebase/app-check': 0.13.0(@firebase/app@0.16.0) + '@firebase/app-check-types': 0.5.4 + '@firebase/app-compat': 0.5.16 + '@firebase/component': 0.7.4 + '@firebase/logger': 0.5.1 + '@firebase/util': 1.15.2 + tslib: 2.8.1 + '@firebase/app-check-interop-types@0.3.4': {} + '@firebase/app-check-types@0.5.4': {} + + '@firebase/app-check@0.13.0(@firebase/app@0.16.0)': + dependencies: + '@firebase/app': 0.16.0 + '@firebase/component': 0.7.4 + '@firebase/logger': 0.5.1 + '@firebase/util': 1.15.2 + tslib: 2.8.1 + + '@firebase/app-compat@0.5.16': + dependencies: + '@firebase/app': 0.16.0 + '@firebase/component': 0.7.4 + '@firebase/logger': 0.5.1 + '@firebase/util': 1.15.2 + tslib: 2.8.1 + '@firebase/app-types@0.9.5': dependencies: '@firebase/logger': 0.5.1 + '@firebase/app@0.16.0': + dependencies: + '@firebase/component': 0.7.4 + '@firebase/logger': 0.5.1 + '@firebase/util': 1.15.2 + idb: 7.1.1 + tslib: 2.8.1 + + '@firebase/auth-compat@0.6.9(@firebase/app-compat@0.5.16)(@firebase/app-types@0.9.5)(@firebase/app@0.16.0)(@react-native-async-storage/async-storage@2.2.0(react-native@0.81.5(@babel/core@7.29.7)(@react-native/metro-config@0.86.2(@babel/core@7.29.7))(@types/react@19.1.17)(react@19.1.0)))': + dependencies: + '@firebase/app': 0.16.0 + '@firebase/app-compat': 0.5.16 + '@firebase/auth': 1.13.4(@firebase/app@0.16.0)(@react-native-async-storage/async-storage@2.2.0(react-native@0.81.5(@babel/core@7.29.7)(@react-native/metro-config@0.86.2(@babel/core@7.29.7))(@types/react@19.1.17)(react@19.1.0))) + '@firebase/auth-types': 0.13.1(@firebase/app-types@0.9.5)(@firebase/util@1.15.2) + '@firebase/component': 0.7.4 + '@firebase/util': 1.15.2 + tslib: 2.8.1 + transitivePeerDependencies: + - '@firebase/app-types' + - '@react-native-async-storage/async-storage' + '@firebase/auth-interop-types@0.2.5': {} + '@firebase/auth-types@0.13.1(@firebase/app-types@0.9.5)(@firebase/util@1.15.2)': + dependencies: + '@firebase/app-types': 0.9.5 + '@firebase/util': 1.15.2 + + '@firebase/auth@1.13.4(@firebase/app@0.16.0)(@react-native-async-storage/async-storage@2.2.0(react-native@0.81.5(@babel/core@7.29.7)(@react-native/metro-config@0.86.2(@babel/core@7.29.7))(@types/react@19.1.17)(react@19.1.0)))': + dependencies: + '@firebase/app': 0.16.0 + '@firebase/component': 0.7.4 + '@firebase/logger': 0.5.1 + '@firebase/util': 1.15.2 + tslib: 2.8.1 + optionalDependencies: + '@react-native-async-storage/async-storage': 2.2.0(react-native@0.81.5(@babel/core@7.29.7)(@react-native/metro-config@0.86.2(@babel/core@7.29.7))(@types/react@19.1.17)(react@19.1.0)) + '@firebase/component@0.7.4': dependencies: '@firebase/util': 1.15.2 tslib: 2.8.1 - '@firebase/database-compat@2.1.6': + '@firebase/data-connect@0.7.3(@firebase/app@0.16.0)': + dependencies: + '@firebase/app': 0.16.0 + '@firebase/auth-interop-types': 0.2.5 + '@firebase/component': 0.7.4 + '@firebase/logger': 0.5.1 + '@firebase/util': 1.15.2 + tslib: 2.8.1 + + '@firebase/database-compat@2.1.6(@firebase/app-compat@0.5.16)(@firebase/app@0.16.0)': dependencies: '@firebase/component': 0.7.4 '@firebase/database': 1.1.4 @@ -7970,6 +8288,9 @@ snapshots: '@firebase/logger': 0.5.1 '@firebase/util': 1.15.2 tslib: 2.8.1 + optionalDependencies: + '@firebase/app': 0.16.0 + '@firebase/app-compat': 0.5.16 '@firebase/database-types@1.0.21': dependencies: @@ -7986,14 +8307,181 @@ snapshots: faye-websocket: 0.11.4 tslib: 2.8.1 + '@firebase/firestore-compat@0.4.12(@firebase/app-compat@0.5.16)(@firebase/app-types@0.9.5)(@firebase/app@0.16.0)': + dependencies: + '@firebase/app': 0.16.0 + '@firebase/app-compat': 0.5.16 + '@firebase/component': 0.7.4 + '@firebase/firestore': 4.17.0(@firebase/app@0.16.0) + '@firebase/firestore-types': 3.0.4(@firebase/app-types@0.9.5)(@firebase/util@1.15.2) + '@firebase/util': 1.15.2 + tslib: 2.8.1 + transitivePeerDependencies: + - '@firebase/app-types' + + '@firebase/firestore-types@3.0.4(@firebase/app-types@0.9.5)(@firebase/util@1.15.2)': + dependencies: + '@firebase/app-types': 0.9.5 + '@firebase/util': 1.15.2 + + '@firebase/firestore@4.17.0(@firebase/app@0.16.0)': + dependencies: + '@firebase/app': 0.16.0 + '@firebase/component': 0.7.4 + '@firebase/logger': 0.5.1 + '@firebase/util': 1.15.2 + '@firebase/webchannel-wrapper': 1.0.6 + '@grpc/grpc-js': 1.9.16 + '@grpc/proto-loader': 0.7.15 + re2js: 2.8.6 + tslib: 2.8.1 + + '@firebase/functions-compat@0.4.6(@firebase/app-compat@0.5.16)(@firebase/app@0.16.0)': + dependencies: + '@firebase/app': 0.16.0 + '@firebase/app-compat': 0.5.16 + '@firebase/component': 0.7.4 + '@firebase/functions': 0.13.6(@firebase/app@0.16.0) + '@firebase/functions-types': 0.6.4 + '@firebase/util': 1.15.2 + tslib: 2.8.1 + + '@firebase/functions-types@0.6.4': {} + + '@firebase/functions@0.13.6(@firebase/app@0.16.0)': + dependencies: + '@firebase/app': 0.16.0 + '@firebase/app-check-interop-types': 0.3.4 + '@firebase/auth-interop-types': 0.2.5 + '@firebase/component': 0.7.4 + '@firebase/messaging-interop-types': 0.2.5 + '@firebase/util': 1.15.2 + tslib: 2.8.1 + + '@firebase/installations-compat@0.2.23(@firebase/app-compat@0.5.16)(@firebase/app-types@0.9.5)(@firebase/app@0.16.0)': + dependencies: + '@firebase/app': 0.16.0 + '@firebase/app-compat': 0.5.16 + '@firebase/component': 0.7.4 + '@firebase/installations': 0.6.23(@firebase/app@0.16.0) + '@firebase/installations-types': 0.5.4(@firebase/app-types@0.9.5) + '@firebase/util': 1.15.2 + tslib: 2.8.1 + transitivePeerDependencies: + - '@firebase/app-types' + + '@firebase/installations-types@0.5.4(@firebase/app-types@0.9.5)': + dependencies: + '@firebase/app-types': 0.9.5 + + '@firebase/installations@0.6.23(@firebase/app@0.16.0)': + dependencies: + '@firebase/app': 0.16.0 + '@firebase/component': 0.7.4 + '@firebase/util': 1.15.2 + idb: 7.1.1 + tslib: 2.8.1 + '@firebase/logger@0.5.1': dependencies: tslib: 2.8.1 + '@firebase/messaging-compat@0.2.28(@firebase/app-compat@0.5.16)(@firebase/app@0.16.0)': + dependencies: + '@firebase/app': 0.16.0 + '@firebase/app-compat': 0.5.16 + '@firebase/component': 0.7.4 + '@firebase/messaging': 0.13.1(@firebase/app@0.16.0) + '@firebase/util': 1.15.2 + tslib: 2.8.1 + + '@firebase/messaging-interop-types@0.2.5': {} + + '@firebase/messaging@0.13.1(@firebase/app@0.16.0)': + dependencies: + '@firebase/app': 0.16.0 + '@firebase/component': 0.7.4 + '@firebase/installations': 0.6.23(@firebase/app@0.16.0) + '@firebase/messaging-interop-types': 0.2.5 + '@firebase/util': 1.15.2 + idb: 7.1.1 + tslib: 2.8.1 + + '@firebase/performance-compat@0.2.26(@firebase/app-compat@0.5.16)(@firebase/app@0.16.0)': + dependencies: + '@firebase/app': 0.16.0 + '@firebase/app-compat': 0.5.16 + '@firebase/component': 0.7.4 + '@firebase/logger': 0.5.1 + '@firebase/performance': 0.7.13(@firebase/app@0.16.0) + '@firebase/performance-types': 0.2.4 + '@firebase/util': 1.15.2 + tslib: 2.8.1 + + '@firebase/performance-types@0.2.4': {} + + '@firebase/performance@0.7.13(@firebase/app@0.16.0)': + dependencies: + '@firebase/app': 0.16.0 + '@firebase/component': 0.7.4 + '@firebase/installations': 0.6.23(@firebase/app@0.16.0) + '@firebase/logger': 0.5.1 + '@firebase/util': 1.15.2 + tslib: 2.8.1 + web-vitals: 4.2.4 + + '@firebase/remote-config-compat@0.2.28(@firebase/app-compat@0.5.16)(@firebase/app@0.16.0)': + dependencies: + '@firebase/app': 0.16.0 + '@firebase/app-compat': 0.5.16 + '@firebase/component': 0.7.4 + '@firebase/logger': 0.5.1 + '@firebase/remote-config': 0.9.1(@firebase/app@0.16.0) + '@firebase/remote-config-types': 0.5.1 + '@firebase/util': 1.15.2 + tslib: 2.8.1 + + '@firebase/remote-config-types@0.5.1': {} + + '@firebase/remote-config@0.9.1(@firebase/app@0.16.0)': + dependencies: + '@firebase/app': 0.16.0 + '@firebase/component': 0.7.4 + '@firebase/installations': 0.6.23(@firebase/app@0.16.0) + '@firebase/logger': 0.5.1 + '@firebase/util': 1.15.2 + tslib: 2.8.1 + + '@firebase/storage-compat@0.4.4(@firebase/app-compat@0.5.16)(@firebase/app-types@0.9.5)(@firebase/app@0.16.0)': + dependencies: + '@firebase/app': 0.16.0 + '@firebase/app-compat': 0.5.16 + '@firebase/component': 0.7.4 + '@firebase/storage': 0.14.4(@firebase/app@0.16.0) + '@firebase/storage-types': 0.8.4(@firebase/app-types@0.9.5)(@firebase/util@1.15.2) + '@firebase/util': 1.15.2 + tslib: 2.8.1 + transitivePeerDependencies: + - '@firebase/app-types' + + '@firebase/storage-types@0.8.4(@firebase/app-types@0.9.5)(@firebase/util@1.15.2)': + dependencies: + '@firebase/app-types': 0.9.5 + '@firebase/util': 1.15.2 + + '@firebase/storage@0.14.4(@firebase/app@0.16.0)': + dependencies: + '@firebase/app': 0.16.0 + '@firebase/component': 0.7.4 + '@firebase/util': 1.15.2 + tslib: 2.8.1 + '@firebase/util@1.15.2': dependencies: tslib: 2.8.1 + '@firebase/webchannel-wrapper@1.0.6': {} + '@google-cloud/firestore@8.7.1': dependencies: '@opentelemetry/api': 1.9.1 @@ -8044,6 +8532,18 @@ snapshots: '@js-sdsl/ordered-map': 4.4.2 optional: true + '@grpc/grpc-js@1.9.16': + dependencies: + '@grpc/proto-loader': 0.7.15 + '@types/node': 22.20.1 + + '@grpc/proto-loader@0.7.15': + dependencies: + lodash.camelcase: 4.3.0 + long: 5.3.2 + protobufjs: 7.6.5 + yargs: 17.7.3 + '@grpc/proto-loader@0.8.1': dependencies: lodash.camelcase: 4.3.0 @@ -8198,34 +8698,25 @@ snapshots: '@pkgjs/parseargs@0.11.0': optional: true - '@protobufjs/aspromise@1.1.2': - optional: true + '@protobufjs/aspromise@1.1.2': {} - '@protobufjs/base64@1.1.2': - optional: true + '@protobufjs/base64@1.1.2': {} - '@protobufjs/codegen@2.0.5': - optional: true + '@protobufjs/codegen@2.0.5': {} - '@protobufjs/eventemitter@1.1.1': - optional: true + '@protobufjs/eventemitter@1.1.1': {} '@protobufjs/fetch@1.1.1': dependencies: '@protobufjs/aspromise': 1.1.2 - optional: true - '@protobufjs/float@1.0.2': - optional: true + '@protobufjs/float@1.0.2': {} - '@protobufjs/path@1.1.2': - optional: true + '@protobufjs/path@1.1.2': {} - '@protobufjs/pool@1.1.0': - optional: true + '@protobufjs/pool@1.1.0': {} - '@protobufjs/utf8@1.1.2': - optional: true + '@protobufjs/utf8@1.1.2': {} '@radix-ui/primitive@1.1.7': {} @@ -10273,10 +10764,10 @@ snapshots: locate-path: 5.0.0 path-exists: 4.0.0 - firebase-admin@14.2.0: + firebase-admin@14.2.0(@firebase/app-compat@0.5.16)(@firebase/app@0.16.0): dependencies: '@fastify/busboy': 3.2.1 - '@firebase/database-compat': 2.1.6 + '@firebase/database-compat': 2.1.6(@firebase/app-compat@0.5.16)(@firebase/app@0.16.0) '@firebase/database-types': 1.0.21 fast-deep-equal: 3.1.3 google-auth-library: 10.9.1 @@ -10291,6 +10782,39 @@ snapshots: - encoding - supports-color + firebase@12.17.1(@react-native-async-storage/async-storage@2.2.0(react-native@0.81.5(@babel/core@7.29.7)(@react-native/metro-config@0.86.2(@babel/core@7.29.7))(@types/react@19.1.17)(react@19.1.0))): + dependencies: + '@firebase/ai': 2.14.0(@firebase/app-types@0.9.5)(@firebase/app@0.16.0) + '@firebase/analytics': 0.10.23(@firebase/app@0.16.0) + '@firebase/analytics-compat': 0.2.29(@firebase/app-compat@0.5.16)(@firebase/app@0.16.0) + '@firebase/app': 0.16.0 + '@firebase/app-check': 0.13.0(@firebase/app@0.16.0) + '@firebase/app-check-compat': 0.4.6(@firebase/app-compat@0.5.16)(@firebase/app@0.16.0) + '@firebase/app-compat': 0.5.16 + '@firebase/app-types': 0.9.5 + '@firebase/auth': 1.13.4(@firebase/app@0.16.0)(@react-native-async-storage/async-storage@2.2.0(react-native@0.81.5(@babel/core@7.29.7)(@react-native/metro-config@0.86.2(@babel/core@7.29.7))(@types/react@19.1.17)(react@19.1.0))) + '@firebase/auth-compat': 0.6.9(@firebase/app-compat@0.5.16)(@firebase/app-types@0.9.5)(@firebase/app@0.16.0)(@react-native-async-storage/async-storage@2.2.0(react-native@0.81.5(@babel/core@7.29.7)(@react-native/metro-config@0.86.2(@babel/core@7.29.7))(@types/react@19.1.17)(react@19.1.0))) + '@firebase/data-connect': 0.7.3(@firebase/app@0.16.0) + '@firebase/database': 1.1.4 + '@firebase/database-compat': 2.1.6(@firebase/app-compat@0.5.16)(@firebase/app@0.16.0) + '@firebase/firestore': 4.17.0(@firebase/app@0.16.0) + '@firebase/firestore-compat': 0.4.12(@firebase/app-compat@0.5.16)(@firebase/app-types@0.9.5)(@firebase/app@0.16.0) + '@firebase/functions': 0.13.6(@firebase/app@0.16.0) + '@firebase/functions-compat': 0.4.6(@firebase/app-compat@0.5.16)(@firebase/app@0.16.0) + '@firebase/installations': 0.6.23(@firebase/app@0.16.0) + '@firebase/installations-compat': 0.2.23(@firebase/app-compat@0.5.16)(@firebase/app-types@0.9.5)(@firebase/app@0.16.0) + '@firebase/messaging': 0.13.1(@firebase/app@0.16.0) + '@firebase/messaging-compat': 0.2.28(@firebase/app-compat@0.5.16)(@firebase/app@0.16.0) + '@firebase/performance': 0.7.13(@firebase/app@0.16.0) + '@firebase/performance-compat': 0.2.26(@firebase/app-compat@0.5.16)(@firebase/app@0.16.0) + '@firebase/remote-config': 0.9.1(@firebase/app@0.16.0) + '@firebase/remote-config-compat': 0.2.28(@firebase/app-compat@0.5.16)(@firebase/app@0.16.0) + '@firebase/storage': 0.14.4(@firebase/app@0.16.0) + '@firebase/storage-compat': 0.4.4(@firebase/app-compat@0.5.16)(@firebase/app-types@0.9.5)(@firebase/app@0.16.0) + '@firebase/util': 1.15.2 + transitivePeerDependencies: + - '@react-native-async-storage/async-storage' + fix-dts-default-cjs-exports@1.0.1: dependencies: magic-string: 0.30.21 @@ -10679,6 +11203,8 @@ snapshots: optionalDependencies: typescript: 5.9.3 + idb@7.1.1: {} + ieee754@1.2.1: {} ignore@5.3.2: {} @@ -10990,8 +11516,7 @@ snapshots: dependencies: p-locate: 4.1.0 - lodash.camelcase@4.3.0: - optional: true + lodash.camelcase@4.3.0: {} lodash.chunk@4.2.0: {} @@ -11021,8 +11546,7 @@ snapshots: dependencies: chalk: 2.4.2 - long@5.3.2: - optional: true + long@5.3.2: {} loose-envify@1.4.0: dependencies: @@ -11842,7 +12366,6 @@ snapshots: '@protobufjs/utf8': 1.1.2 '@types/node': 22.20.1 long: 5.3.2 - optional: true pump@3.0.4: dependencies: @@ -11877,6 +12400,8 @@ snapshots: minimist: 1.2.8 strip-json-comments: 2.0.1 + re2js@2.8.6: {} + react-devtools-core@6.1.5: dependencies: shell-quote: 1.10.0 @@ -12745,6 +13270,8 @@ snapshots: web-streams-polyfill@3.3.3: {} + web-vitals@4.2.4: {} + webidl-conversions@3.0.1: {} webidl-conversions@5.0.0: {}