@sudobility/auth_lib 0.0.80 → 0.0.82

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/dist/auth/context.d.ts +10 -0
  2. package/dist/auth/context.d.ts.map +1 -0
  3. package/dist/auth/context.js +17 -0
  4. package/dist/auth/context.js.map +1 -0
  5. package/dist/auth/index.d.ts +4 -0
  6. package/dist/auth/index.d.ts.map +1 -0
  7. package/dist/auth/index.js +4 -0
  8. package/dist/auth/index.js.map +1 -0
  9. package/dist/auth/index.rn.d.ts +4 -0
  10. package/dist/auth/index.rn.d.ts.map +1 -0
  11. package/dist/auth/index.rn.js +4 -0
  12. package/dist/auth/index.rn.js.map +1 -0
  13. package/dist/auth/types.d.ts +91 -0
  14. package/dist/auth/types.d.ts.map +1 -0
  15. package/dist/auth/types.js +2 -0
  16. package/dist/auth/types.js.map +1 -0
  17. package/dist/auth/useFirebaseAuth.d.ts +3 -0
  18. package/dist/auth/useFirebaseAuth.d.ts.map +1 -0
  19. package/dist/auth/useFirebaseAuth.js +264 -0
  20. package/dist/auth/useFirebaseAuth.js.map +1 -0
  21. package/dist/auth/useFirebaseAuth.rn.d.ts +3 -0
  22. package/dist/auth/useFirebaseAuth.rn.d.ts.map +1 -0
  23. package/dist/auth/useFirebaseAuth.rn.js +268 -0
  24. package/dist/auth/useFirebaseAuth.rn.js.map +1 -0
  25. package/dist/oauth/credentials.d.ts +12 -0
  26. package/dist/oauth/credentials.d.ts.map +1 -0
  27. package/dist/oauth/credentials.js +25 -0
  28. package/dist/oauth/credentials.js.map +1 -0
  29. package/dist/oauth/google.d.ts +4 -0
  30. package/dist/oauth/google.d.ts.map +1 -0
  31. package/dist/oauth/google.js +12 -0
  32. package/dist/oauth/google.js.map +1 -0
  33. package/dist/oauth/index.d.ts +6 -0
  34. package/dist/oauth/index.d.ts.map +1 -0
  35. package/dist/oauth/index.js +6 -0
  36. package/dist/oauth/index.js.map +1 -0
  37. package/dist/oauth/pkce.d.ts +16 -0
  38. package/dist/oauth/pkce.d.ts.map +1 -0
  39. package/dist/oauth/pkce.js +33 -0
  40. package/dist/oauth/pkce.js.map +1 -0
  41. package/dist/oauth/providers.d.ts +5 -0
  42. package/dist/oauth/providers.d.ts.map +1 -0
  43. package/dist/oauth/providers.js +23 -0
  44. package/dist/oauth/providers.js.map +1 -0
  45. package/dist/oauth/webAuthFlow.d.ts +21 -0
  46. package/dist/oauth/webAuthFlow.d.ts.map +1 -0
  47. package/dist/oauth/webAuthFlow.js +56 -0
  48. package/dist/oauth/webAuthFlow.js.map +1 -0
  49. package/package.json +13 -1
@@ -0,0 +1,10 @@
1
+ import { type ReactNode } from 'react';
2
+ import type { AuthContextValue, FirebaseAuthConfig } from './types';
3
+ export interface FirebaseAuthContext {
4
+ AuthProvider: (props: {
5
+ children: ReactNode;
6
+ }) => ReactNode;
7
+ useAuth: () => AuthContextValue;
8
+ }
9
+ export declare function createFirebaseAuthContext(useAuthHook: (config: FirebaseAuthConfig) => AuthContextValue, config: FirebaseAuthConfig): FirebaseAuthContext;
10
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/auth/context.ts"],"names":[],"mappings":"AAOA,OAAO,EAGL,KAAK,SAAS,EAEf,MAAM,OAAO,CAAC;AACf,OAAO,KAAK,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAEpE,MAAM,WAAW,mBAAmB;IAClC,YAAY,EAAE,CAAC,KAAK,EAAE;QAAE,QAAQ,EAAE,SAAS,CAAA;KAAE,KAAK,SAAS,CAAC;IAC5D,OAAO,EAAE,MAAM,gBAAgB,CAAC;CACjC;AAQD,wBAAgB,yBAAyB,CACvC,WAAW,EAAE,CAAC,MAAM,EAAE,kBAAkB,KAAK,gBAAgB,EAC7D,MAAM,EAAE,kBAAkB,GACzB,mBAAmB,CAiBrB"}
@@ -0,0 +1,17 @@
1
+ import { createContext, createElement, useContext, } from 'react';
2
+ export function createFirebaseAuthContext(useAuthHook, config) {
3
+ const Context = createContext(null);
4
+ function AuthProvider({ children }) {
5
+ const value = useAuthHook(config);
6
+ return createElement(Context.Provider, { value }, children);
7
+ }
8
+ function useAuth() {
9
+ const ctx = useContext(Context);
10
+ if (!ctx) {
11
+ throw new Error('useAuth must be used within an AuthProvider');
12
+ }
13
+ return ctx;
14
+ }
15
+ return { AuthProvider, useAuth };
16
+ }
17
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/auth/context.ts"],"names":[],"mappings":"AAOA,OAAO,EACL,aAAa,EACb,aAAa,EAEb,UAAU,GACX,MAAM,OAAO,CAAC;AAcf,MAAM,UAAU,yBAAyB,CACvC,WAA6D,EAC7D,MAA0B;IAE1B,MAAM,OAAO,GAAG,aAAa,CAA0B,IAAI,CAAC,CAAC;IAE7D,SAAS,YAAY,CAAC,EAAE,QAAQ,EAA2B;QACzD,MAAM,KAAK,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;QAClC,OAAO,aAAa,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,EAAE,QAAQ,CAAC,CAAC;IAC9D,CAAC;IAED,SAAS,OAAO;QACd,MAAM,GAAG,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;QAChC,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;QACjE,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAED,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC;AACnC,CAAC"}
@@ -0,0 +1,4 @@
1
+ export * from './types';
2
+ export { createFirebaseAuthContext, type FirebaseAuthContext } from './context';
3
+ export { useFirebaseAuthJs } from './useFirebaseAuth';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"AAMA,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,yBAAyB,EAAE,KAAK,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAChF,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,4 @@
1
+ export * from './types';
2
+ export { createFirebaseAuthContext } from './context';
3
+ export { useFirebaseAuthJs } from './useFirebaseAuth';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"AAMA,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,yBAAyB,EAA4B,MAAM,WAAW,CAAC;AAChF,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,4 @@
1
+ export * from './types';
2
+ export { createFirebaseAuthContext, type FirebaseAuthContext } from './context';
3
+ export { useFirebaseAuthNative } from './useFirebaseAuth.rn';
4
+ //# sourceMappingURL=index.rn.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.rn.d.ts","sourceRoot":"","sources":["../../src/auth/index.rn.ts"],"names":[],"mappings":"AAMA,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,yBAAyB,EAAE,KAAK,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAChF,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC"}
@@ -0,0 +1,4 @@
1
+ export * from './types';
2
+ export { createFirebaseAuthContext } from './context';
3
+ export { useFirebaseAuthNative } from './useFirebaseAuth.rn';
4
+ //# sourceMappingURL=index.rn.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.rn.js","sourceRoot":"","sources":["../../src/auth/index.rn.ts"],"names":[],"mappings":"AAMA,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,yBAAyB,EAA4B,MAAM,WAAW,CAAC;AAChF,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC"}
@@ -0,0 +1,91 @@
1
+ import type { OAuthClientConfig, WebAuthBridge } from '../oauth/webAuthFlow';
2
+ export interface AuthUser {
3
+ uid: string;
4
+ email: string | null;
5
+ displayName: string | null;
6
+ photoURL: string | null;
7
+ isAnonymous: boolean;
8
+ }
9
+ export interface AuthContextValue {
10
+ user: AuthUser | null;
11
+ isLoading: boolean;
12
+ isReady: boolean;
13
+ token: string | null;
14
+ signInWithGoogle: () => Promise<void>;
15
+ signInWithApple: () => Promise<void>;
16
+ signInAnonymously: () => Promise<void>;
17
+ signInWithEmail: (email: string, password: string) => Promise<void>;
18
+ signUpWithEmail: (email: string, password: string) => Promise<void>;
19
+ signOut: () => Promise<void>;
20
+ sendPasswordResetEmail: (email: string) => Promise<void>;
21
+ getToken: () => Promise<string | null>;
22
+ refreshToken: () => Promise<string | null>;
23
+ }
24
+ export interface AuthProvidersConfig {
25
+ google?: boolean;
26
+ apple?: boolean;
27
+ anonymous?: boolean;
28
+ emailPassword?: boolean;
29
+ }
30
+ export interface GoogleSigninLike {
31
+ configure(options: Record<string, unknown>): void;
32
+ hasPlayServices(options?: Record<string, unknown>): Promise<boolean>;
33
+ signIn(): Promise<{
34
+ type?: string;
35
+ data?: {
36
+ idToken?: string | null;
37
+ } | null;
38
+ }>;
39
+ }
40
+ export interface AppleAuthLike {
41
+ performRequest(options: unknown): Promise<{
42
+ identityToken: string | null;
43
+ nonce: string;
44
+ }>;
45
+ Operation: {
46
+ LOGIN: unknown;
47
+ };
48
+ Scope: {
49
+ EMAIL: unknown;
50
+ FULL_NAME: unknown;
51
+ };
52
+ }
53
+ export interface AppleAuthAndroidLike {
54
+ isSupported: boolean;
55
+ configure(options: any): void;
56
+ signIn(): Promise<{
57
+ id_token?: string;
58
+ nonce?: string;
59
+ }>;
60
+ ResponseType: {
61
+ ALL: unknown;
62
+ };
63
+ Scope: {
64
+ ALL: unknown;
65
+ };
66
+ }
67
+ export interface FirebaseAuthConfig {
68
+ firebaseConfig?: Record<string, unknown>;
69
+ asyncStorage?: unknown;
70
+ googleOAuth?: OAuthClientConfig;
71
+ webAuth?: WebAuthBridge;
72
+ googleNative?: {
73
+ webClientId?: string;
74
+ iosClientId?: string;
75
+ };
76
+ getGoogleSignin?: () => Promise<GoogleSigninLike>;
77
+ getAppleAuth?: () => Promise<AppleAuthLike>;
78
+ getAppleAuthAndroid?: () => Promise<AppleAuthAndroidLike>;
79
+ appleAndroid?: {
80
+ serviceId: string;
81
+ redirectUri: string;
82
+ };
83
+ providers?: AuthProvidersConfig;
84
+ autoSignInAnonymously?: boolean;
85
+ onUserChanged?: (user: AuthUser | null) => void;
86
+ onInit?: () => void;
87
+ onIdentityChange?: (prevUid: string | null, nextUid: string | null) => void;
88
+ refreshIntervalMs?: number | null;
89
+ }
90
+ export declare const DEFAULT_REFRESH_INTERVAL_MS: number;
91
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/auth/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export const DEFAULT_REFRESH_INTERVAL_MS = 50 * 60 * 1000;
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/auth/types.ts"],"names":[],"mappings":"AAqHA,MAAM,CAAC,MAAM,2BAA2B,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { type AuthContextValue, type FirebaseAuthConfig } from './types';
2
+ export declare function useFirebaseAuthJs(config: FirebaseAuthConfig): AuthContextValue;
3
+ //# sourceMappingURL=useFirebaseAuth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useFirebaseAuth.d.ts","sourceRoot":"","sources":["../../src/auth/useFirebaseAuth.ts"],"names":[],"mappings":"AA2BA,OAAO,EACL,KAAK,gBAAgB,EAGrB,KAAK,kBAAkB,EACxB,MAAM,SAAS,CAAC;AAkCjB,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,kBAAkB,GACzB,gBAAgB,CAwPlB"}
@@ -0,0 +1,264 @@
1
+ import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
2
+ import { getApps, initializeApp } from 'firebase/app';
3
+ import { createUserWithEmailAndPassword, sendPasswordResetEmail as firebaseSendPasswordResetEmail, signInAnonymously as firebaseSignInAnonymously, signOut as firebaseSignOut, getAuth, getReactNativePersistence, initializeAuth, onAuthStateChanged, signInWithCredential, signInWithEmailAndPassword, } from 'firebase/auth';
4
+ import { signInWithGoogleOAuthDesktop } from '../oauth/google';
5
+ import { buildAppleCredential } from '../oauth/credentials';
6
+ import { DEFAULT_REFRESH_INTERVAL_MS, } from './types';
7
+ let app = null;
8
+ let firebaseAuth = null;
9
+ function resolveAuth(config) {
10
+ const firebaseConfig = config.firebaseConfig;
11
+ if (!firebaseConfig || !firebaseConfig.apiKey)
12
+ return null;
13
+ if (!firebaseAuth) {
14
+ app = getApps()[0] ?? initializeApp(firebaseConfig);
15
+ firebaseAuth = config.asyncStorage
16
+ ? initializeAuth(app, {
17
+ persistence: getReactNativePersistence(config.asyncStorage),
18
+ })
19
+ : getAuth(app);
20
+ }
21
+ return firebaseAuth;
22
+ }
23
+ function toAuthUser(firebaseUser) {
24
+ if (!firebaseUser)
25
+ return null;
26
+ return {
27
+ uid: firebaseUser.uid,
28
+ email: firebaseUser.email,
29
+ displayName: firebaseUser.displayName,
30
+ photoURL: firebaseUser.photoURL,
31
+ isAnonymous: firebaseUser.isAnonymous,
32
+ };
33
+ }
34
+ export function useFirebaseAuthJs(config) {
35
+ const configRef = useRef(config);
36
+ configRef.current = config;
37
+ const [user, setUser] = useState(null);
38
+ const [token, setToken] = useState(null);
39
+ const [isLoading, setIsLoading] = useState(true);
40
+ const [isReady, setIsReady] = useState(false);
41
+ const [rawUser, setRawUser] = useState(null);
42
+ const prevUidRef = useRef(null);
43
+ useEffect(() => {
44
+ const cfg = configRef.current;
45
+ const auth = resolveAuth(cfg);
46
+ cfg.onInit?.();
47
+ if (!auth) {
48
+ setIsLoading(false);
49
+ setIsReady(true);
50
+ return;
51
+ }
52
+ const unsubscribe = onAuthStateChanged(auth, async (firebaseUser) => {
53
+ if (!firebaseUser && configRef.current.autoSignInAnonymously) {
54
+ try {
55
+ await firebaseSignInAnonymously(auth);
56
+ }
57
+ catch (error) {
58
+ console.error('[Auth] Anonymous sign-in failed:', error);
59
+ setIsLoading(false);
60
+ setIsReady(true);
61
+ }
62
+ return;
63
+ }
64
+ const mapped = toAuthUser(firebaseUser);
65
+ const nextUid = mapped?.uid ?? null;
66
+ if (prevUidRef.current !== nextUid) {
67
+ configRef.current.onIdentityChange?.(prevUidRef.current, nextUid);
68
+ prevUidRef.current = nextUid;
69
+ }
70
+ setUser(mapped);
71
+ setRawUser(firebaseUser);
72
+ configRef.current.onUserChanged?.(mapped);
73
+ if (firebaseUser) {
74
+ try {
75
+ setToken(await firebaseUser.getIdToken());
76
+ }
77
+ catch (error) {
78
+ console.error('[Auth] Error getting ID token:', error);
79
+ setToken(null);
80
+ }
81
+ }
82
+ else {
83
+ setToken(null);
84
+ }
85
+ setIsLoading(false);
86
+ setIsReady(true);
87
+ });
88
+ return unsubscribe;
89
+ }, []);
90
+ useEffect(() => {
91
+ const intervalMs = configRef.current.refreshIntervalMs;
92
+ if (!rawUser || intervalMs === null)
93
+ return;
94
+ const refreshInterval = setInterval(async () => {
95
+ try {
96
+ setToken(await rawUser.getIdToken(true));
97
+ }
98
+ catch (error) {
99
+ console.error('[Auth] Error refreshing token:', error);
100
+ }
101
+ }, intervalMs ?? DEFAULT_REFRESH_INTERVAL_MS);
102
+ return () => clearInterval(refreshInterval);
103
+ }, [rawUser]);
104
+ const requireAuth = useCallback(() => {
105
+ const auth = resolveAuth(configRef.current);
106
+ if (!auth)
107
+ throw new Error('Firebase not configured');
108
+ return auth;
109
+ }, []);
110
+ const requireProvider = useCallback((name) => {
111
+ const providers = configRef.current.providers;
112
+ const enabledByDefault = name === 'google' || name === 'emailPassword';
113
+ const enabled = providers ? (providers[name] ?? false) : enabledByDefault;
114
+ if (!enabled)
115
+ throw new Error(`${name} sign-in is not enabled`);
116
+ }, []);
117
+ const signInWithGoogle = useCallback(async () => {
118
+ requireProvider('google');
119
+ const auth = requireAuth();
120
+ const cfg = configRef.current;
121
+ if (!cfg.googleOAuth || !cfg.webAuth) {
122
+ throw new Error('Google desktop sign-in requires googleOAuth + webAuth config');
123
+ }
124
+ setIsLoading(true);
125
+ try {
126
+ const credential = await signInWithGoogleOAuthDesktop(cfg.googleOAuth, cfg.webAuth);
127
+ if (credential)
128
+ await signInWithCredential(auth, credential);
129
+ }
130
+ finally {
131
+ setIsLoading(false);
132
+ }
133
+ }, [requireAuth, requireProvider]);
134
+ const signInWithApple = useCallback(async () => {
135
+ requireProvider('apple');
136
+ const auth = requireAuth();
137
+ const cfg = configRef.current;
138
+ if (!cfg.getAppleAuth)
139
+ throw new Error('Apple sign-in requires getAppleAuth config');
140
+ setIsLoading(true);
141
+ try {
142
+ const appleAuth = await cfg.getAppleAuth();
143
+ const response = await appleAuth.performRequest({
144
+ requestedOperation: appleAuth.Operation.LOGIN,
145
+ requestedScopes: [appleAuth.Scope.EMAIL, appleAuth.Scope.FULL_NAME],
146
+ });
147
+ if (!response.identityToken)
148
+ throw new Error('No identity token from Apple');
149
+ const credential = buildAppleCredential({
150
+ idToken: response.identityToken,
151
+ rawNonce: response.nonce,
152
+ });
153
+ await signInWithCredential(auth, credential);
154
+ }
155
+ finally {
156
+ setIsLoading(false);
157
+ }
158
+ }, [requireAuth, requireProvider]);
159
+ const signInAnonymously = useCallback(async () => {
160
+ requireProvider('anonymous');
161
+ const auth = requireAuth();
162
+ setIsLoading(true);
163
+ try {
164
+ await firebaseSignInAnonymously(auth);
165
+ }
166
+ finally {
167
+ setIsLoading(false);
168
+ }
169
+ }, [requireAuth, requireProvider]);
170
+ const signInWithEmail = useCallback(async (email, password) => {
171
+ requireProvider('emailPassword');
172
+ const auth = requireAuth();
173
+ setIsLoading(true);
174
+ try {
175
+ await signInWithEmailAndPassword(auth, email, password);
176
+ }
177
+ finally {
178
+ setIsLoading(false);
179
+ }
180
+ }, [requireAuth, requireProvider]);
181
+ const signUpWithEmail = useCallback(async (email, password) => {
182
+ requireProvider('emailPassword');
183
+ const auth = requireAuth();
184
+ setIsLoading(true);
185
+ try {
186
+ await createUserWithEmailAndPassword(auth, email, password);
187
+ }
188
+ finally {
189
+ setIsLoading(false);
190
+ }
191
+ }, [requireAuth, requireProvider]);
192
+ const signOut = useCallback(async () => {
193
+ const auth = resolveAuth(configRef.current);
194
+ if (!auth)
195
+ return;
196
+ setIsLoading(true);
197
+ try {
198
+ await firebaseSignOut(auth);
199
+ }
200
+ finally {
201
+ setIsLoading(false);
202
+ }
203
+ }, []);
204
+ const sendPasswordResetEmail = useCallback(async (email) => {
205
+ const auth = resolveAuth(configRef.current);
206
+ if (!auth)
207
+ throw new Error('Firebase not configured');
208
+ await firebaseSendPasswordResetEmail(auth, email);
209
+ }, []);
210
+ const getToken = useCallback(async () => {
211
+ if (!rawUser)
212
+ return null;
213
+ try {
214
+ return await rawUser.getIdToken();
215
+ }
216
+ catch (error) {
217
+ console.error('[Auth] Error getting token:', error);
218
+ return null;
219
+ }
220
+ }, [rawUser]);
221
+ const refreshToken = useCallback(async () => {
222
+ if (!rawUser)
223
+ return null;
224
+ try {
225
+ const newToken = await rawUser.getIdToken(true);
226
+ setToken(newToken);
227
+ return newToken;
228
+ }
229
+ catch (error) {
230
+ console.error('[Auth] Error refreshing token:', error);
231
+ return null;
232
+ }
233
+ }, [rawUser]);
234
+ return useMemo(() => ({
235
+ user,
236
+ isLoading,
237
+ isReady,
238
+ token,
239
+ signInWithGoogle,
240
+ signInWithApple,
241
+ signInAnonymously,
242
+ signInWithEmail,
243
+ signUpWithEmail,
244
+ signOut,
245
+ sendPasswordResetEmail,
246
+ getToken,
247
+ refreshToken,
248
+ }), [
249
+ user,
250
+ isLoading,
251
+ isReady,
252
+ token,
253
+ signInWithGoogle,
254
+ signInWithApple,
255
+ signInAnonymously,
256
+ signInWithEmail,
257
+ signUpWithEmail,
258
+ signOut,
259
+ sendPasswordResetEmail,
260
+ getToken,
261
+ refreshToken,
262
+ ]);
263
+ }
264
+ //# sourceMappingURL=useFirebaseAuth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useFirebaseAuth.js","sourceRoot":"","sources":["../../src/auth/useFirebaseAuth.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC1E,OAAO,EAAoB,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AACxE,OAAO,EAEL,8BAA8B,EAC9B,sBAAsB,IAAI,8BAA8B,EACxD,iBAAiB,IAAI,yBAAyB,EAC9C,OAAO,IAAI,eAAe,EAC1B,OAAO,EAEP,yBAAyB,EACzB,cAAc,EACd,kBAAkB,EAClB,oBAAoB,EACpB,0BAA0B,GAE3B,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,4BAA4B,EAAE,MAAM,iBAAiB,CAAC;AAC/D,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAGL,2BAA2B,GAE5B,MAAM,SAAS,CAAC;AAEjB,IAAI,GAAG,GAAuB,IAAI,CAAC;AACnC,IAAI,YAAY,GAAgB,IAAI,CAAC;AAErC,SAAS,WAAW,CAAC,MAA0B;IAC7C,MAAM,cAAc,GAAG,MAAM,CAAC,cAAc,CAAC;IAC7C,IAAI,CAAC,cAAc,IAAI,CAAC,cAAc,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IAC3D,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,GAAG,GAAG,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,aAAa,CAAC,cAAc,CAAC,CAAC;QACpD,YAAY,GAAG,MAAM,CAAC,YAAY;YAChC,CAAC,CAAC,cAAc,CAAC,GAAG,EAAE;gBAClB,WAAW,EAAE,yBAAyB,CAAC,MAAM,CAAC,YAAY,CAAC;aAC5D,CAAC;YACJ,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACnB,CAAC;IACD,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,SAAS,UAAU,CAAC,YAAyB;IAC3C,IAAI,CAAC,YAAY;QAAE,OAAO,IAAI,CAAC;IAC/B,OAAO;QACL,GAAG,EAAE,YAAY,CAAC,GAAG;QACrB,KAAK,EAAE,YAAY,CAAC,KAAK;QACzB,WAAW,EAAE,YAAY,CAAC,WAAW;QACrC,QAAQ,EAAE,YAAY,CAAC,QAAQ;QAC/B,WAAW,EAAE,YAAY,CAAC,WAAW;KACtC,CAAC;AACJ,CAAC;AAMD,MAAM,UAAU,iBAAiB,CAC/B,MAA0B;IAE1B,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;IACjC,SAAS,CAAC,OAAO,GAAG,MAAM,CAAC;IAE3B,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAkB,IAAI,CAAC,CAAC;IACxD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IACxD,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IACjD,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC9C,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAc,IAAI,CAAC,CAAC;IAC1D,MAAM,UAAU,GAAG,MAAM,CAAgB,IAAI,CAAC,CAAC;IAE/C,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,GAAG,GAAG,SAAS,CAAC,OAAO,CAAC;QAC9B,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;QAC9B,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC;QACf,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,UAAU,CAAC,IAAI,CAAC,CAAC;YACjB,OAAO;QACT,CAAC;QAED,MAAM,WAAW,GAAG,kBAAkB,CAAC,IAAI,EAAE,KAAK,EAAC,YAAY,EAAC,EAAE;YAChE,IAAI,CAAC,YAAY,IAAI,SAAS,CAAC,OAAO,CAAC,qBAAqB,EAAE,CAAC;gBAC7D,IAAI,CAAC;oBACH,MAAM,yBAAyB,CAAC,IAAI,CAAC,CAAC;gBACxC,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,OAAO,CAAC,KAAK,CAAC,kCAAkC,EAAE,KAAK,CAAC,CAAC;oBACzD,YAAY,CAAC,KAAK,CAAC,CAAC;oBACpB,UAAU,CAAC,IAAI,CAAC,CAAC;gBACnB,CAAC;gBACD,OAAO;YACT,CAAC;YAED,MAAM,MAAM,GAAG,UAAU,CAAC,YAAY,CAAC,CAAC;YACxC,MAAM,OAAO,GAAG,MAAM,EAAE,GAAG,IAAI,IAAI,CAAC;YACpC,IAAI,UAAU,CAAC,OAAO,KAAK,OAAO,EAAE,CAAC;gBACnC,SAAS,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;gBAClE,UAAU,CAAC,OAAO,GAAG,OAAO,CAAC;YAC/B,CAAC;YAED,OAAO,CAAC,MAAM,CAAC,CAAC;YAChB,UAAU,CAAC,YAAY,CAAC,CAAC;YACzB,SAAS,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC,MAAM,CAAC,CAAC;YAE1C,IAAI,YAAY,EAAE,CAAC;gBACjB,IAAI,CAAC;oBACH,QAAQ,CAAC,MAAM,YAAY,CAAC,UAAU,EAAE,CAAC,CAAC;gBAC5C,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,OAAO,CAAC,KAAK,CAAC,gCAAgC,EAAE,KAAK,CAAC,CAAC;oBACvD,QAAQ,CAAC,IAAI,CAAC,CAAC;gBACjB,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,QAAQ,CAAC,IAAI,CAAC,CAAC;YACjB,CAAC;YAED,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,UAAU,CAAC,IAAI,CAAC,CAAC;QACnB,CAAC,CAAC,CAAC;QAEH,OAAO,WAAW,CAAC;IACrB,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,SAAS,CAAC,GAAG,EAAE;QACb,MAAM,UAAU,GAAG,SAAS,CAAC,OAAO,CAAC,iBAAiB,CAAC;QACvD,IAAI,CAAC,OAAO,IAAI,UAAU,KAAK,IAAI;YAAE,OAAO;QAC5C,MAAM,eAAe,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;YAC7C,IAAI,CAAC;gBACH,QAAQ,CAAC,MAAM,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;YAC3C,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,gCAAgC,EAAE,KAAK,CAAC,CAAC;YACzD,CAAC;QACH,CAAC,EAAE,UAAU,IAAI,2BAA2B,CAAC,CAAC;QAC9C,OAAO,GAAG,EAAE,CAAC,aAAa,CAAC,eAAe,CAAC,CAAC;IAC9C,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAEd,MAAM,WAAW,GAAG,WAAW,CAAC,GAAS,EAAE;QACzC,MAAM,IAAI,GAAG,WAAW,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAC5C,IAAI,CAAC,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;QACtD,OAAO,IAAI,CAAC;IACd,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,eAAe,GAAG,WAAW,CACjC,CAAC,IAAwD,EAAE,EAAE;QAC3D,MAAM,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC;QAE9C,MAAM,gBAAgB,GAAG,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,eAAe,CAAC;QACvE,MAAM,OAAO,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC;QAC1E,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,yBAAyB,CAAC,CAAC;IAClE,CAAC,EACD,EAAE,CACH,CAAC;IAEF,MAAM,gBAAgB,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QAC9C,eAAe,CAAC,QAAQ,CAAC,CAAC;QAC1B,MAAM,IAAI,GAAG,WAAW,EAAE,CAAC;QAC3B,MAAM,GAAG,GAAG,SAAS,CAAC,OAAO,CAAC;QAC9B,IAAI,CAAC,GAAG,CAAC,WAAW,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;YACrC,MAAM,IAAI,KAAK,CACb,8DAA8D,CAC/D,CAAC;QACJ,CAAC;QACD,YAAY,CAAC,IAAI,CAAC,CAAC;QACnB,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,MAAM,4BAA4B,CACnD,GAAG,CAAC,WAAW,EACf,GAAG,CAAC,OAAO,CACZ,CAAC;YACF,IAAI,UAAU;gBAAE,MAAM,oBAAoB,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;QAC/D,CAAC;gBAAS,CAAC;YACT,YAAY,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC;IACH,CAAC,EAAE,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC,CAAC;IAEnC,MAAM,eAAe,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QAC7C,eAAe,CAAC,OAAO,CAAC,CAAC;QACzB,MAAM,IAAI,GAAG,WAAW,EAAE,CAAC;QAC3B,MAAM,GAAG,GAAG,SAAS,CAAC,OAAO,CAAC;QAC9B,IAAI,CAAC,GAAG,CAAC,YAAY;YACnB,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;QAChE,YAAY,CAAC,IAAI,CAAC,CAAC;QACnB,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,MAAM,GAAG,CAAC,YAAY,EAAE,CAAC;YAC3C,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,cAAc,CAAC;gBAC9C,kBAAkB,EAAE,SAAS,CAAC,SAAS,CAAC,KAAK;gBAC7C,eAAe,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,EAAE,SAAS,CAAC,KAAK,CAAC,SAAS,CAAC;aACpE,CAAC,CAAC;YACH,IAAI,CAAC,QAAQ,CAAC,aAAa;gBACzB,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;YAClD,MAAM,UAAU,GAAG,oBAAoB,CAAC;gBACtC,OAAO,EAAE,QAAQ,CAAC,aAAa;gBAC/B,QAAQ,EAAE,QAAQ,CAAC,KAAK;aACzB,CAAC,CAAC;YACH,MAAM,oBAAoB,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;QAC/C,CAAC;gBAAS,CAAC;YACT,YAAY,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC;IACH,CAAC,EAAE,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC,CAAC;IAEnC,MAAM,iBAAiB,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QAC/C,eAAe,CAAC,WAAW,CAAC,CAAC;QAC7B,MAAM,IAAI,GAAG,WAAW,EAAE,CAAC;QAC3B,YAAY,CAAC,IAAI,CAAC,CAAC;QACnB,IAAI,CAAC;YACH,MAAM,yBAAyB,CAAC,IAAI,CAAC,CAAC;QACxC,CAAC;gBAAS,CAAC;YACT,YAAY,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC;IACH,CAAC,EAAE,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC,CAAC;IAEnC,MAAM,eAAe,GAAG,WAAW,CACjC,KAAK,EAAE,KAAa,EAAE,QAAgB,EAAE,EAAE;QACxC,eAAe,CAAC,eAAe,CAAC,CAAC;QACjC,MAAM,IAAI,GAAG,WAAW,EAAE,CAAC;QAC3B,YAAY,CAAC,IAAI,CAAC,CAAC;QACnB,IAAI,CAAC;YACH,MAAM,0BAA0B,CAAC,IAAI,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;QAC1D,CAAC;gBAAS,CAAC;YACT,YAAY,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC;IACH,CAAC,EACD,CAAC,WAAW,EAAE,eAAe,CAAC,CAC/B,CAAC;IAEF,MAAM,eAAe,GAAG,WAAW,CACjC,KAAK,EAAE,KAAa,EAAE,QAAgB,EAAE,EAAE;QACxC,eAAe,CAAC,eAAe,CAAC,CAAC;QACjC,MAAM,IAAI,GAAG,WAAW,EAAE,CAAC;QAC3B,YAAY,CAAC,IAAI,CAAC,CAAC;QACnB,IAAI,CAAC;YACH,MAAM,8BAA8B,CAAC,IAAI,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;QAC9D,CAAC;gBAAS,CAAC;YACT,YAAY,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC;IACH,CAAC,EACD,CAAC,WAAW,EAAE,eAAe,CAAC,CAC/B,CAAC;IAEF,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QACrC,MAAM,IAAI,GAAG,WAAW,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAC5C,IAAI,CAAC,IAAI;YAAE,OAAO;QAClB,YAAY,CAAC,IAAI,CAAC,CAAC;QACnB,IAAI,CAAC;YACH,MAAM,eAAe,CAAC,IAAI,CAAC,CAAC;QAC9B,CAAC;gBAAS,CAAC;YACT,YAAY,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC;IACH,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,sBAAsB,GAAG,WAAW,CAAC,KAAK,EAAE,KAAa,EAAE,EAAE;QACjE,MAAM,IAAI,GAAG,WAAW,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAC5C,IAAI,CAAC,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;QACtD,MAAM,8BAA8B,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACpD,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,QAAQ,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QACtC,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC;QAC1B,IAAI,CAAC;YACH,OAAO,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC;QACpC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAE,KAAK,CAAC,CAAC;YACpD,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAEd,MAAM,YAAY,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;QAC1C,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC;QAC1B,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YAChD,QAAQ,CAAC,QAAQ,CAAC,CAAC;YACnB,OAAO,QAAQ,CAAC;QAClB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,gCAAgC,EAAE,KAAK,CAAC,CAAC;YACvD,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAEd,OAAO,OAAO,CACZ,GAAG,EAAE,CAAC,CAAC;QACL,IAAI;QACJ,SAAS;QACT,OAAO;QACP,KAAK;QACL,gBAAgB;QAChB,eAAe;QACf,iBAAiB;QACjB,eAAe;QACf,eAAe;QACf,OAAO;QACP,sBAAsB;QACtB,QAAQ;QACR,YAAY;KACb,CAAC,EACF;QACE,IAAI;QACJ,SAAS;QACT,OAAO;QACP,KAAK;QACL,gBAAgB;QAChB,eAAe;QACf,iBAAiB;QACjB,eAAe;QACf,eAAe;QACf,OAAO;QACP,sBAAsB;QACtB,QAAQ;QACR,YAAY;KACb,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { type AuthContextValue, type FirebaseAuthConfig } from './types';
2
+ export declare function useFirebaseAuthNative(config: FirebaseAuthConfig): AuthContextValue;
3
+ //# sourceMappingURL=useFirebaseAuth.rn.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useFirebaseAuth.rn.d.ts","sourceRoot":"","sources":["../../src/auth/useFirebaseAuth.rn.ts"],"names":[],"mappings":"AAQA,OAAO,EACL,KAAK,gBAAgB,EAGrB,KAAK,kBAAkB,EACxB,MAAM,SAAS,CAAC;AAqCjB,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,kBAAkB,GACzB,gBAAgB,CAmRlB"}
@@ -0,0 +1,268 @@
1
+ import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
2
+ import { DEFAULT_REFRESH_INTERVAL_MS, } from './types';
3
+ let rnAuthModule = null;
4
+ function getRnAuth() {
5
+ if (!rnAuthModule) {
6
+ rnAuthModule = require('@react-native-firebase/auth');
7
+ }
8
+ return rnAuthModule;
9
+ }
10
+ function toAuthUser(firebaseUser) {
11
+ if (!firebaseUser)
12
+ return null;
13
+ return {
14
+ uid: firebaseUser.uid,
15
+ email: firebaseUser.email,
16
+ displayName: firebaseUser.displayName,
17
+ photoURL: firebaseUser.photoURL,
18
+ isAnonymous: firebaseUser.isAnonymous,
19
+ };
20
+ }
21
+ export function useFirebaseAuthNative(config) {
22
+ const configRef = useRef(config);
23
+ configRef.current = config;
24
+ const [user, setUser] = useState(null);
25
+ const [token, setToken] = useState(null);
26
+ const [isLoading, setIsLoading] = useState(true);
27
+ const [isReady, setIsReady] = useState(false);
28
+ const [rawUser, setRawUser] = useState(null);
29
+ const prevUidRef = useRef(null);
30
+ useEffect(() => {
31
+ const { getAuth, onAuthStateChanged, signInAnonymously } = getRnAuth();
32
+ const auth = getAuth();
33
+ configRef.current.onInit?.();
34
+ const unsubscribe = onAuthStateChanged(auth, async (firebaseUser) => {
35
+ if (!firebaseUser && configRef.current.autoSignInAnonymously) {
36
+ try {
37
+ await signInAnonymously(auth);
38
+ }
39
+ catch (error) {
40
+ console.error('[Auth] Anonymous sign-in failed:', error);
41
+ setIsLoading(false);
42
+ setIsReady(true);
43
+ }
44
+ return;
45
+ }
46
+ const mapped = toAuthUser(firebaseUser);
47
+ const nextUid = mapped?.uid ?? null;
48
+ if (prevUidRef.current !== nextUid) {
49
+ configRef.current.onIdentityChange?.(prevUidRef.current, nextUid);
50
+ prevUidRef.current = nextUid;
51
+ }
52
+ setUser(mapped);
53
+ setRawUser(firebaseUser);
54
+ configRef.current.onUserChanged?.(mapped);
55
+ if (firebaseUser) {
56
+ try {
57
+ setToken(await firebaseUser.getIdToken());
58
+ }
59
+ catch (error) {
60
+ console.error('[Auth] Error getting ID token:', error);
61
+ setToken(null);
62
+ }
63
+ }
64
+ else {
65
+ setToken(null);
66
+ }
67
+ setIsLoading(false);
68
+ setIsReady(true);
69
+ });
70
+ return unsubscribe;
71
+ }, []);
72
+ useEffect(() => {
73
+ const intervalMs = configRef.current.refreshIntervalMs;
74
+ if (!rawUser || intervalMs === null)
75
+ return;
76
+ const refreshInterval = setInterval(async () => {
77
+ try {
78
+ setToken(await rawUser.getIdToken(true));
79
+ }
80
+ catch (error) {
81
+ console.error('[Auth] Error refreshing token:', error);
82
+ }
83
+ }, intervalMs ?? DEFAULT_REFRESH_INTERVAL_MS);
84
+ return () => clearInterval(refreshInterval);
85
+ }, [rawUser]);
86
+ const requireProvider = useCallback((name) => {
87
+ const providers = configRef.current.providers;
88
+ const enabledByDefault = name === 'google' || name === 'emailPassword';
89
+ const enabled = providers ? (providers[name] ?? false) : enabledByDefault;
90
+ if (!enabled)
91
+ throw new Error(`${name} sign-in is not enabled`);
92
+ }, []);
93
+ const signInWithGoogle = useCallback(async () => {
94
+ requireProvider('google');
95
+ const cfg = configRef.current;
96
+ if (!cfg.getGoogleSignin)
97
+ throw new Error('Google sign-in requires getGoogleSignin config');
98
+ setIsLoading(true);
99
+ try {
100
+ const GoogleSignin = await cfg.getGoogleSignin();
101
+ const googleConfig = {};
102
+ if (cfg.googleNative?.iosClientId) {
103
+ googleConfig.iosClientId = cfg.googleNative.iosClientId;
104
+ }
105
+ if (cfg.googleNative?.webClientId) {
106
+ googleConfig.webClientId = cfg.googleNative.webClientId;
107
+ }
108
+ GoogleSignin.configure(googleConfig);
109
+ await GoogleSignin.hasPlayServices();
110
+ const response = await GoogleSignin.signIn();
111
+ if (response.type === 'cancelled')
112
+ return;
113
+ const idToken = response.data?.idToken;
114
+ if (!idToken)
115
+ throw new Error('No ID token from Google');
116
+ const { getAuth, GoogleAuthProvider, signInWithCredential } = getRnAuth();
117
+ const credential = GoogleAuthProvider.credential(idToken);
118
+ await signInWithCredential(getAuth(), credential);
119
+ }
120
+ finally {
121
+ setIsLoading(false);
122
+ }
123
+ }, [requireProvider]);
124
+ const signInWithApple = useCallback(async () => {
125
+ requireProvider('apple');
126
+ const cfg = configRef.current;
127
+ setIsLoading(true);
128
+ try {
129
+ const { getAuth, AppleAuthProvider, OAuthProvider, signInWithCredential, } = getRnAuth();
130
+ if (cfg.getAppleAuthAndroid && cfg.appleAndroid) {
131
+ const appleAuthAndroid = await cfg.getAppleAuthAndroid();
132
+ if (!appleAuthAndroid.isSupported)
133
+ throw new Error('Apple sign-in is not supported on this device');
134
+ appleAuthAndroid.configure({
135
+ clientId: cfg.appleAndroid.serviceId,
136
+ redirectUri: cfg.appleAndroid.redirectUri,
137
+ responseType: appleAuthAndroid.ResponseType.ALL,
138
+ scope: appleAuthAndroid.Scope.ALL,
139
+ });
140
+ const response = await appleAuthAndroid.signIn();
141
+ if (!response.id_token)
142
+ throw new Error('No identity token from Apple');
143
+ const provider = new OAuthProvider('apple.com');
144
+ const credential = provider.credential({
145
+ idToken: response.id_token,
146
+ rawNonce: response.nonce,
147
+ });
148
+ await signInWithCredential(getAuth(), credential);
149
+ return;
150
+ }
151
+ if (!cfg.getAppleAuth)
152
+ throw new Error('Apple sign-in requires getAppleAuth (iOS) or getAppleAuthAndroid config');
153
+ const appleAuth = await cfg.getAppleAuth();
154
+ const response = await appleAuth.performRequest({
155
+ requestedOperation: appleAuth.Operation.LOGIN,
156
+ requestedScopes: [appleAuth.Scope.EMAIL, appleAuth.Scope.FULL_NAME],
157
+ });
158
+ if (!response.identityToken)
159
+ throw new Error('No identity token from Apple');
160
+ const credential = AppleAuthProvider.credential(response.identityToken, response.nonce);
161
+ await signInWithCredential(getAuth(), credential);
162
+ }
163
+ finally {
164
+ setIsLoading(false);
165
+ }
166
+ }, [requireProvider]);
167
+ const signInAnonymously = useCallback(async () => {
168
+ requireProvider('anonymous');
169
+ setIsLoading(true);
170
+ try {
171
+ const { getAuth, signInAnonymously: rnSignInAnonymously } = getRnAuth();
172
+ await rnSignInAnonymously(getAuth());
173
+ }
174
+ finally {
175
+ setIsLoading(false);
176
+ }
177
+ }, [requireProvider]);
178
+ const signInWithEmail = useCallback(async (email, password) => {
179
+ requireProvider('emailPassword');
180
+ setIsLoading(true);
181
+ try {
182
+ const { getAuth, signInWithEmailAndPassword } = getRnAuth();
183
+ await signInWithEmailAndPassword(getAuth(), email, password);
184
+ }
185
+ finally {
186
+ setIsLoading(false);
187
+ }
188
+ }, [requireProvider]);
189
+ const signUpWithEmail = useCallback(async (email, password) => {
190
+ requireProvider('emailPassword');
191
+ setIsLoading(true);
192
+ try {
193
+ const { getAuth, createUserWithEmailAndPassword } = getRnAuth();
194
+ await createUserWithEmailAndPassword(getAuth(), email, password);
195
+ }
196
+ finally {
197
+ setIsLoading(false);
198
+ }
199
+ }, [requireProvider]);
200
+ const signOut = useCallback(async () => {
201
+ setIsLoading(true);
202
+ try {
203
+ const { getAuth, signOut: rnSignOut } = getRnAuth();
204
+ await rnSignOut(getAuth());
205
+ }
206
+ finally {
207
+ setIsLoading(false);
208
+ }
209
+ }, []);
210
+ const sendPasswordResetEmail = useCallback(async (email) => {
211
+ const { getAuth, sendPasswordResetEmail: rnSendReset } = getRnAuth();
212
+ await rnSendReset(getAuth(), email);
213
+ }, []);
214
+ const getToken = useCallback(async () => {
215
+ if (!rawUser)
216
+ return null;
217
+ try {
218
+ return await rawUser.getIdToken();
219
+ }
220
+ catch (error) {
221
+ console.error('[Auth] Error getting token:', error);
222
+ return null;
223
+ }
224
+ }, [rawUser]);
225
+ const refreshToken = useCallback(async () => {
226
+ if (!rawUser)
227
+ return null;
228
+ try {
229
+ const newToken = await rawUser.getIdToken(true);
230
+ setToken(newToken);
231
+ return newToken;
232
+ }
233
+ catch (error) {
234
+ console.error('[Auth] Error refreshing token:', error);
235
+ return null;
236
+ }
237
+ }, [rawUser]);
238
+ return useMemo(() => ({
239
+ user,
240
+ isLoading,
241
+ isReady,
242
+ token,
243
+ signInWithGoogle,
244
+ signInWithApple,
245
+ signInAnonymously,
246
+ signInWithEmail,
247
+ signUpWithEmail,
248
+ signOut,
249
+ sendPasswordResetEmail,
250
+ getToken,
251
+ refreshToken,
252
+ }), [
253
+ user,
254
+ isLoading,
255
+ isReady,
256
+ token,
257
+ signInWithGoogle,
258
+ signInWithApple,
259
+ signInAnonymously,
260
+ signInWithEmail,
261
+ signUpWithEmail,
262
+ signOut,
263
+ sendPasswordResetEmail,
264
+ getToken,
265
+ refreshToken,
266
+ ]);
267
+ }
268
+ //# sourceMappingURL=useFirebaseAuth.rn.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useFirebaseAuth.rn.js","sourceRoot":"","sources":["../../src/auth/useFirebaseAuth.rn.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { type OAuthCredential } from 'firebase/auth';
2
+ export declare function buildGoogleCredential(idToken: string): OAuthCredential;
3
+ export declare function buildAppleCredential(args: {
4
+ idToken: string;
5
+ rawNonce?: string;
6
+ }): OAuthCredential;
7
+ export declare function buildOAuthCredential(providerId: string, tokens: {
8
+ idToken?: string;
9
+ accessToken?: string;
10
+ rawNonce?: string;
11
+ }): OAuthCredential;
12
+ //# sourceMappingURL=credentials.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../../src/oauth/credentials.ts"],"names":[],"mappings":"AAMA,OAAO,EAEL,KAAK,eAAe,EAErB,MAAM,eAAe,CAAC;AAGvB,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,eAAe,CAEtE;AAGD,wBAAgB,oBAAoB,CAAC,IAAI,EAAE;IACzC,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,GAAG,eAAe,CAOlB;AAOD,wBAAgB,oBAAoB,CAClC,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GACpE,eAAe,CAQjB"}
@@ -0,0 +1,25 @@
1
+ import { GoogleAuthProvider, OAuthProvider, } from 'firebase/auth';
2
+ export function buildGoogleCredential(idToken) {
3
+ return GoogleAuthProvider.credential(idToken);
4
+ }
5
+ export function buildAppleCredential(args) {
6
+ const provider = new OAuthProvider('apple.com');
7
+ const params = {
8
+ idToken: args.idToken,
9
+ };
10
+ if (args.rawNonce !== undefined)
11
+ params.rawNonce = args.rawNonce;
12
+ return provider.credential(params);
13
+ }
14
+ export function buildOAuthCredential(providerId, tokens) {
15
+ const provider = new OAuthProvider(providerId);
16
+ const params = {};
17
+ if (tokens.idToken !== undefined)
18
+ params.idToken = tokens.idToken;
19
+ if (tokens.accessToken !== undefined)
20
+ params.accessToken = tokens.accessToken;
21
+ if (tokens.rawNonce !== undefined)
22
+ params.rawNonce = tokens.rawNonce;
23
+ return provider.credential(params);
24
+ }
25
+ //# sourceMappingURL=credentials.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../src/oauth/credentials.ts"],"names":[],"mappings":"AAMA,OAAO,EACL,kBAAkB,EAElB,aAAa,GACd,MAAM,eAAe,CAAC;AAGvB,MAAM,UAAU,qBAAqB,CAAC,OAAe;IACnD,OAAO,kBAAkB,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;AAChD,CAAC;AAGD,MAAM,UAAU,oBAAoB,CAAC,IAGpC;IACC,MAAM,QAAQ,GAAG,IAAI,aAAa,CAAC,WAAW,CAAC,CAAC;IAChD,MAAM,MAAM,GAA2C;QACrD,OAAO,EAAE,IAAI,CAAC,OAAO;KACtB,CAAC;IACF,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS;QAAE,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;IACjE,OAAO,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;AACrC,CAAC;AAOD,MAAM,UAAU,oBAAoB,CAClC,UAAkB,EAClB,MAAqE;IAErE,MAAM,QAAQ,GAAG,IAAI,aAAa,CAAC,UAAU,CAAC,CAAC;IAC/C,MAAM,MAAM,GACV,EAAE,CAAC;IACL,IAAI,MAAM,CAAC,OAAO,KAAK,SAAS;QAAE,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;IAClE,IAAI,MAAM,CAAC,WAAW,KAAK,SAAS;QAAE,MAAM,CAAC,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;IAC9E,IAAI,MAAM,CAAC,QAAQ,KAAK,SAAS;QAAE,MAAM,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;IACrE,OAAO,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;AACrC,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { OAuthCredential } from 'firebase/auth';
2
+ import { type OAuthClientConfig, type WebAuthBridge } from './webAuthFlow';
3
+ export declare function signInWithGoogleOAuthDesktop(config: OAuthClientConfig, webAuth: WebAuthBridge): Promise<OAuthCredential | null>;
4
+ //# sourceMappingURL=google.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"google.d.ts","sourceRoot":"","sources":["../../src/oauth/google.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAGrD,OAAO,EACL,KAAK,iBAAiB,EAEtB,KAAK,aAAa,EACnB,MAAM,eAAe,CAAC;AAOvB,wBAAsB,4BAA4B,CAChD,MAAM,EAAE,iBAAiB,EACzB,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CASjC"}
@@ -0,0 +1,12 @@
1
+ import { GOOGLE_OAUTH_PROVIDER } from './providers';
2
+ import { buildGoogleCredential } from './credentials';
3
+ import { signInWithOAuthPkce, } from './webAuthFlow';
4
+ export async function signInWithGoogleOAuthDesktop(config, webAuth) {
5
+ const tokens = await signInWithOAuthPkce(GOOGLE_OAUTH_PROVIDER, config, webAuth);
6
+ if (!tokens)
7
+ return null;
8
+ if (!tokens.id_token)
9
+ throw new Error('No id_token in Google token response');
10
+ return buildGoogleCredential(tokens.id_token);
11
+ }
12
+ //# sourceMappingURL=google.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"google.js","sourceRoot":"","sources":["../../src/oauth/google.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAEL,mBAAmB,GAEpB,MAAM,eAAe,CAAC;AAOvB,MAAM,CAAC,KAAK,UAAU,4BAA4B,CAChD,MAAyB,EACzB,OAAsB;IAEtB,MAAM,MAAM,GAAG,MAAM,mBAAmB,CACtC,qBAAqB,EACrB,MAAM,EACN,OAAO,CACR,CAAC;IACF,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IACzB,IAAI,CAAC,MAAM,CAAC,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;IAC9E,OAAO,qBAAqB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;AAChD,CAAC"}
@@ -0,0 +1,6 @@
1
+ export * from './pkce';
2
+ export * from './providers';
3
+ export * from './webAuthFlow';
4
+ export * from './credentials';
5
+ export * from './google';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/oauth/index.ts"],"names":[],"mappings":"AAOA,cAAc,QAAQ,CAAC;AACvB,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,UAAU,CAAC"}
@@ -0,0 +1,6 @@
1
+ export * from './pkce';
2
+ export * from './providers';
3
+ export * from './webAuthFlow';
4
+ export * from './credentials';
5
+ export * from './google';
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/oauth/index.ts"],"names":[],"mappings":"AAOA,cAAc,QAAQ,CAAC;AACvB,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,UAAU,CAAC"}
@@ -0,0 +1,16 @@
1
+ export interface OAuthProviderDescriptor {
2
+ id: string;
3
+ authorizeEndpoint: string;
4
+ tokenEndpoint: string;
5
+ scope: string;
6
+ authParams?: Record<string, string>;
7
+ returnsIdToken: boolean;
8
+ }
9
+ export declare function buildFormBody(params: Record<string, string>): string;
10
+ export declare function parseCallbackParams(callbackUrl: string): Record<string, string>;
11
+ export declare function buildAuthorizeUrl(provider: OAuthProviderDescriptor, args: {
12
+ clientId: string;
13
+ redirectUri: string;
14
+ codeChallenge: string;
15
+ }): string;
16
+ //# sourceMappingURL=pkce.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pkce.d.ts","sourceRoot":"","sources":["../../src/oauth/pkce.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,uBAAuB;IAEtC,EAAE,EAAE,MAAM,CAAC;IAEX,iBAAiB,EAAE,MAAM,CAAC;IAE1B,aAAa,EAAE,MAAM,CAAC;IAEtB,KAAK,EAAE,MAAM,CAAC;IAEd,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAMpC,cAAc,EAAE,OAAO,CAAC;CACzB;AAGD,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,MAAM,CAIpE;AAGD,wBAAgB,mBAAmB,CACjC,WAAW,EAAE,MAAM,GAClB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAaxB;AAGD,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,uBAAuB,EACjC,IAAI,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE,GACrE,MAAM,CAUR"}
@@ -0,0 +1,33 @@
1
+ export function buildFormBody(params) {
2
+ return Object.entries(params)
3
+ .map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(v)}`)
4
+ .join('&');
5
+ }
6
+ export function parseCallbackParams(callbackUrl) {
7
+ const params = {};
8
+ const qIndex = callbackUrl.indexOf('?');
9
+ if (qIndex < 0)
10
+ return params;
11
+ const search = callbackUrl.slice(qIndex + 1);
12
+ for (const pair of search.split('&')) {
13
+ if (!pair)
14
+ continue;
15
+ const [key, ...rest] = pair.split('=');
16
+ if (key) {
17
+ params[decodeURIComponent(key)] = decodeURIComponent(rest.join('='));
18
+ }
19
+ }
20
+ return params;
21
+ }
22
+ export function buildAuthorizeUrl(provider, args) {
23
+ return `${provider.authorizeEndpoint}?${buildFormBody({
24
+ client_id: args.clientId,
25
+ redirect_uri: args.redirectUri,
26
+ response_type: 'code',
27
+ scope: provider.scope,
28
+ code_challenge: args.codeChallenge,
29
+ code_challenge_method: 'S256',
30
+ ...provider.authParams,
31
+ })}`;
32
+ }
33
+ //# sourceMappingURL=pkce.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pkce.js","sourceRoot":"","sources":["../../src/oauth/pkce.ts"],"names":[],"mappings":"AA4BA,MAAM,UAAU,aAAa,CAAC,MAA8B;IAC1D,OAAO,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;SAC1B,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,kBAAkB,CAAC,CAAC,CAAC,IAAI,kBAAkB,CAAC,CAAC,CAAC,EAAE,CAAC;SACpE,IAAI,CAAC,GAAG,CAAC,CAAC;AACf,CAAC;AAGD,MAAM,UAAU,mBAAmB,CACjC,WAAmB;IAEnB,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,MAAM,MAAM,GAAG,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACxC,IAAI,MAAM,GAAG,CAAC;QAAE,OAAO,MAAM,CAAC;IAC9B,MAAM,MAAM,GAAG,WAAW,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC7C,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;QACrC,IAAI,CAAC,IAAI;YAAE,SAAS;QACpB,MAAM,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACvC,IAAI,GAAG,EAAE,CAAC;YACR,MAAM,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,GAAG,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QACvE,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAGD,MAAM,UAAU,iBAAiB,CAC/B,QAAiC,EACjC,IAAsE;IAEtE,OAAO,GAAG,QAAQ,CAAC,iBAAiB,IAAI,aAAa,CAAC;QACpD,SAAS,EAAE,IAAI,CAAC,QAAQ;QACxB,YAAY,EAAE,IAAI,CAAC,WAAW;QAC9B,aAAa,EAAE,MAAM;QACrB,KAAK,EAAE,QAAQ,CAAC,KAAK;QACrB,cAAc,EAAE,IAAI,CAAC,aAAa;QAClC,qBAAqB,EAAE,MAAM;QAC7B,GAAG,QAAQ,CAAC,UAAU;KACvB,CAAC,EAAE,CAAC;AACP,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { OAuthProviderDescriptor } from './pkce';
2
+ export declare const GOOGLE_OAUTH_PROVIDER: OAuthProviderDescriptor;
3
+ export declare const GITHUB_OAUTH_PROVIDER: OAuthProviderDescriptor;
4
+ export declare const MICROSOFT_OAUTH_PROVIDER: OAuthProviderDescriptor;
5
+ //# sourceMappingURL=providers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"providers.d.ts","sourceRoot":"","sources":["../../src/oauth/providers.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,QAAQ,CAAC;AAGtD,eAAO,MAAM,qBAAqB,EAAE,uBAOnC,CAAC;AAGF,eAAO,MAAM,qBAAqB,EAAE,uBAMnC,CAAC;AAGF,eAAO,MAAM,wBAAwB,EAAE,uBAOtC,CAAC"}
@@ -0,0 +1,23 @@
1
+ export const GOOGLE_OAUTH_PROVIDER = {
2
+ id: 'google.com',
3
+ authorizeEndpoint: 'https://accounts.google.com/o/oauth2/v2/auth',
4
+ tokenEndpoint: 'https://oauth2.googleapis.com/token',
5
+ scope: 'openid email profile',
6
+ authParams: { prompt: 'select_account' },
7
+ returnsIdToken: true,
8
+ };
9
+ export const GITHUB_OAUTH_PROVIDER = {
10
+ id: 'github.com',
11
+ authorizeEndpoint: 'https://github.com/login/oauth/authorize',
12
+ tokenEndpoint: 'https://github.com/login/oauth/access_token',
13
+ scope: 'read:user user:email',
14
+ returnsIdToken: false,
15
+ };
16
+ export const MICROSOFT_OAUTH_PROVIDER = {
17
+ id: 'microsoft.com',
18
+ authorizeEndpoint: 'https://login.microsoftonline.com/common/oauth2/v2.0/authorize',
19
+ tokenEndpoint: 'https://login.microsoftonline.com/common/oauth2/v2.0/token',
20
+ scope: 'openid email profile',
21
+ returnsIdToken: true,
22
+ };
23
+ //# sourceMappingURL=providers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"providers.js","sourceRoot":"","sources":["../../src/oauth/providers.ts"],"names":[],"mappings":"AAcA,MAAM,CAAC,MAAM,qBAAqB,GAA4B;IAC5D,EAAE,EAAE,YAAY;IAChB,iBAAiB,EAAE,8CAA8C;IACjE,aAAa,EAAE,qCAAqC;IACpD,KAAK,EAAE,sBAAsB;IAC7B,UAAU,EAAE,EAAE,MAAM,EAAE,gBAAgB,EAAE;IACxC,cAAc,EAAE,IAAI;CACrB,CAAC;AAGF,MAAM,CAAC,MAAM,qBAAqB,GAA4B;IAC5D,EAAE,EAAE,YAAY;IAChB,iBAAiB,EAAE,0CAA0C;IAC7D,aAAa,EAAE,6CAA6C;IAC5D,KAAK,EAAE,sBAAsB;IAC7B,cAAc,EAAE,KAAK;CACtB,CAAC;AAGF,MAAM,CAAC,MAAM,wBAAwB,GAA4B;IAC/D,EAAE,EAAE,eAAe;IACnB,iBAAiB,EACf,gEAAgE;IAClE,aAAa,EAAE,4DAA4D;IAC3E,KAAK,EAAE,sBAAsB;IAC7B,cAAc,EAAE,IAAI;CACrB,CAAC"}
@@ -0,0 +1,21 @@
1
+ import type { OAuthProviderDescriptor } from './pkce';
2
+ export interface WebAuthBridge {
3
+ authenticate(url: string, callbackURLScheme: string): Promise<string | null>;
4
+ generateCodeVerifier(): Promise<string>;
5
+ sha256Base64Url(input: string): Promise<string>;
6
+ }
7
+ export interface OAuthClientConfig {
8
+ clientId: string;
9
+ reversedClientId?: string;
10
+ redirectUri?: string;
11
+ callbackScheme?: string;
12
+ }
13
+ export interface OAuthTokenResponse {
14
+ id_token?: string;
15
+ access_token: string;
16
+ refresh_token?: string;
17
+ expires_in: number;
18
+ token_type: string;
19
+ }
20
+ export declare function signInWithOAuthPkce(provider: OAuthProviderDescriptor, config: OAuthClientConfig, webAuth: WebAuthBridge): Promise<OAuthTokenResponse | null>;
21
+ //# sourceMappingURL=webAuthFlow.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webAuthFlow.d.ts","sourceRoot":"","sources":["../../src/oauth/webAuthFlow.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,QAAQ,CAAC;AAOtD,MAAM,WAAW,aAAa;IAC5B,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC7E,oBAAoB,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IACxC,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CACjD;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IAMjB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAoCD,wBAAsB,mBAAmB,CACvC,QAAQ,EAAE,uBAAuB,EACjC,MAAM,EAAE,iBAAiB,EACzB,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAuCpC"}
@@ -0,0 +1,56 @@
1
+ import { buildAuthorizeUrl, buildFormBody, parseCallbackParams } from './pkce';
2
+ async function exchangeCodeForTokens(provider, args) {
3
+ const response = await fetch(provider.tokenEndpoint, {
4
+ method: 'POST',
5
+ headers: {
6
+ 'Content-Type': 'application/x-www-form-urlencoded',
7
+ Accept: 'application/json',
8
+ },
9
+ body: buildFormBody({
10
+ client_id: args.clientId,
11
+ code: args.code,
12
+ code_verifier: args.codeVerifier,
13
+ grant_type: 'authorization_code',
14
+ redirect_uri: args.redirectUri,
15
+ }),
16
+ });
17
+ if (!response.ok) {
18
+ const errorBody = await response.text();
19
+ throw new Error(`Token exchange failed (${response.status}): ${errorBody}`);
20
+ }
21
+ return response.json();
22
+ }
23
+ export async function signInWithOAuthPkce(provider, config, webAuth) {
24
+ const scheme = config.callbackScheme ?? config.reversedClientId;
25
+ const redirectUri = config.redirectUri ??
26
+ (config.reversedClientId
27
+ ? `${config.reversedClientId}:/oauth2callback`
28
+ : undefined);
29
+ if (!config.clientId || !redirectUri || !scheme) {
30
+ throw new Error('OAuth client not configured (clientId + reversedClientId or redirectUri/callbackScheme required)');
31
+ }
32
+ const codeVerifier = await webAuth.generateCodeVerifier();
33
+ const codeChallenge = await webAuth.sha256Base64Url(codeVerifier);
34
+ const authUrl = buildAuthorizeUrl(provider, {
35
+ clientId: config.clientId,
36
+ redirectUri,
37
+ codeChallenge,
38
+ });
39
+ const callbackUrl = await webAuth.authenticate(authUrl, scheme);
40
+ if (!callbackUrl)
41
+ return null;
42
+ const params = parseCallbackParams(callbackUrl);
43
+ if (params.error) {
44
+ throw new Error(`OAuth error: ${params.error} - ${params.error_description ?? ''}`);
45
+ }
46
+ const code = params.code;
47
+ if (!code)
48
+ throw new Error('No authorization code in callback URL');
49
+ return exchangeCodeForTokens(provider, {
50
+ clientId: config.clientId,
51
+ code,
52
+ codeVerifier,
53
+ redirectUri,
54
+ });
55
+ }
56
+ //# sourceMappingURL=webAuthFlow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webAuthFlow.js","sourceRoot":"","sources":["../../src/oauth/webAuthFlow.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,QAAQ,CAAC;AAkC/E,KAAK,UAAU,qBAAqB,CAClC,QAAiC,EACjC,IAKC;IAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,aAAa,EAAE;QACnD,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,cAAc,EAAE,mCAAmC;YACnD,MAAM,EAAE,kBAAkB;SAC3B;QACD,IAAI,EAAE,aAAa,CAAC;YAClB,SAAS,EAAE,IAAI,CAAC,QAAQ;YACxB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,aAAa,EAAE,IAAI,CAAC,YAAY;YAChC,UAAU,EAAE,oBAAoB;YAChC,YAAY,EAAE,IAAI,CAAC,WAAW;SAC/B,CAAC;KACH,CAAC,CAAC;IACH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACxC,MAAM,IAAI,KAAK,CAAC,0BAA0B,QAAQ,CAAC,MAAM,MAAM,SAAS,EAAE,CAAC,CAAC;IAC9E,CAAC;IACD,OAAO,QAAQ,CAAC,IAAI,EAAiC,CAAC;AACxD,CAAC;AAMD,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,QAAiC,EACjC,MAAyB,EACzB,OAAsB;IAEtB,MAAM,MAAM,GAAG,MAAM,CAAC,cAAc,IAAI,MAAM,CAAC,gBAAgB,CAAC;IAChE,MAAM,WAAW,GACf,MAAM,CAAC,WAAW;QAClB,CAAC,MAAM,CAAC,gBAAgB;YACtB,CAAC,CAAC,GAAG,MAAM,CAAC,gBAAgB,kBAAkB;YAC9C,CAAC,CAAC,SAAS,CAAC,CAAC;IACjB,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,CAAC,WAAW,IAAI,CAAC,MAAM,EAAE,CAAC;QAChD,MAAM,IAAI,KAAK,CACb,kGAAkG,CACnG,CAAC;IACJ,CAAC;IAED,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC,oBAAoB,EAAE,CAAC;IAC1D,MAAM,aAAa,GAAG,MAAM,OAAO,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC;IAClE,MAAM,OAAO,GAAG,iBAAiB,CAAC,QAAQ,EAAE;QAC1C,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,WAAW;QACX,aAAa;KACd,CAAC,CAAC;IAEH,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAChE,IAAI,CAAC,WAAW;QAAE,OAAO,IAAI,CAAC;IAE9B,MAAM,MAAM,GAAG,mBAAmB,CAAC,WAAW,CAAC,CAAC;IAChD,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CACb,gBAAgB,MAAM,CAAC,KAAK,MAAM,MAAM,CAAC,iBAAiB,IAAI,EAAE,EAAE,CACnE,CAAC;IACJ,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;IACzB,IAAI,CAAC,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;IAEpE,OAAO,qBAAqB,CAAC,QAAQ,EAAE;QACrC,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,IAAI;QACJ,YAAY;QACZ,WAAW;KACZ,CAAC,CAAC;AACL,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sudobility/auth_lib",
3
- "version": "0.0.80",
3
+ "version": "0.0.82",
4
4
  "description": "Firebase authentication utilities with token refresh handling",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -14,6 +14,18 @@
14
14
  },
15
15
  "import": "./dist/index.js",
16
16
  "types": "./dist/index.d.ts"
17
+ },
18
+ "./oauth": {
19
+ "import": "./dist/oauth/index.js",
20
+ "types": "./dist/oauth/index.d.ts"
21
+ },
22
+ "./auth-js": {
23
+ "import": "./dist/auth/index.js",
24
+ "types": "./dist/auth/index.d.ts"
25
+ },
26
+ "./auth-native": {
27
+ "import": "./dist/auth/index.rn.js",
28
+ "types": "./dist/auth/index.rn.d.ts"
17
29
  }
18
30
  },
19
31
  "files": [