@autonomous-ai/auth-sdk 1.0.7

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 (46) hide show
  1. package/README.md +300 -0
  2. package/dist/client.d.ts +60 -0
  3. package/dist/client.d.ts.map +1 -0
  4. package/dist/client.js +224 -0
  5. package/dist/client.js.map +1 -0
  6. package/dist/index.d.ts +5 -0
  7. package/dist/index.d.ts.map +1 -0
  8. package/dist/index.js +5 -0
  9. package/dist/index.js.map +1 -0
  10. package/dist/pkce.d.ts +34 -0
  11. package/dist/pkce.d.ts.map +1 -0
  12. package/dist/pkce.js +85 -0
  13. package/dist/pkce.js.map +1 -0
  14. package/dist/react/AuthProvider.d.ts +25 -0
  15. package/dist/react/AuthProvider.d.ts.map +1 -0
  16. package/dist/react/AuthProvider.js +111 -0
  17. package/dist/react/AuthProvider.js.map +1 -0
  18. package/dist/react/index.d.ts +6 -0
  19. package/dist/react/index.d.ts.map +1 -0
  20. package/dist/react/index.js +5 -0
  21. package/dist/react/index.js.map +1 -0
  22. package/dist/react/useAuth.d.ts +21 -0
  23. package/dist/react/useAuth.d.ts.map +1 -0
  24. package/dist/react/useAuth.js +23 -0
  25. package/dist/react/useAuth.js.map +1 -0
  26. package/dist/react/useCallback.d.ts +31 -0
  27. package/dist/react/useCallback.d.ts.map +1 -0
  28. package/dist/react/useCallback.js +78 -0
  29. package/dist/react/useCallback.js.map +1 -0
  30. package/dist/react/useUser.d.ts +22 -0
  31. package/dist/react/useUser.d.ts.map +1 -0
  32. package/dist/react/useUser.js +25 -0
  33. package/dist/react/useUser.js.map +1 -0
  34. package/dist/storage.d.ts +49 -0
  35. package/dist/storage.d.ts.map +1 -0
  36. package/dist/storage.js +139 -0
  37. package/dist/storage.js.map +1 -0
  38. package/dist/types.d.ts +157 -0
  39. package/dist/types.d.ts.map +1 -0
  40. package/dist/types.js +2 -0
  41. package/dist/types.js.map +1 -0
  42. package/dist/version.d.ts +5 -0
  43. package/dist/version.d.ts.map +1 -0
  44. package/dist/version.js +5 -0
  45. package/dist/version.js.map +1 -0
  46. package/package.json +62 -0
package/dist/pkce.js ADDED
@@ -0,0 +1,85 @@
1
+ /**
2
+ * PKCE (Proof Key for Code Exchange) utilities
3
+ * Implements RFC 7636 for OAuth2 authorization code flow security
4
+ */
5
+ const CODE_VERIFIER_KEY = 'auth_sdk_pkce_verifier';
6
+ const STATE_KEY = 'auth_sdk_oauth2_state';
7
+ const NEXT_URL_KEY = 'auth_sdk_next_url';
8
+ /**
9
+ * Generate a cryptographically random code verifier (43-128 chars)
10
+ */
11
+ export function generateCodeVerifier() {
12
+ const array = new Uint8Array(32);
13
+ crypto.getRandomValues(array);
14
+ return base64UrlEncode(array);
15
+ }
16
+ /**
17
+ * Generate code challenge from verifier using SHA-256 (S256 method)
18
+ */
19
+ export async function generateCodeChallenge(verifier) {
20
+ const encoder = new TextEncoder();
21
+ const data = encoder.encode(verifier);
22
+ const hash = await crypto.subtle.digest('SHA-256', data);
23
+ return base64UrlEncode(new Uint8Array(hash));
24
+ }
25
+ /**
26
+ * Generate random state for CSRF protection
27
+ */
28
+ export function generateState() {
29
+ const array = new Uint8Array(16);
30
+ crypto.getRandomValues(array);
31
+ return Array.from(array, (byte) => byte.toString(16).padStart(2, '0')).join('');
32
+ }
33
+ /**
34
+ * Base64 URL encode (RFC 4648 Section 5)
35
+ */
36
+ function base64UrlEncode(buffer) {
37
+ let binary = '';
38
+ for (let i = 0; i < buffer.byteLength; i++) {
39
+ binary += String.fromCharCode(buffer[i]);
40
+ }
41
+ return btoa(binary)
42
+ .replace(/\+/g, '-')
43
+ .replace(/\//g, '_')
44
+ .replace(/=+$/, '');
45
+ }
46
+ /**
47
+ * PKCE and state storage using sessionStorage
48
+ * (More secure than localStorage for PKCE verifier)
49
+ */
50
+ export const pkceStorage = {
51
+ setCodeVerifier(verifier) {
52
+ sessionStorage.setItem(CODE_VERIFIER_KEY, verifier);
53
+ },
54
+ getCodeVerifier() {
55
+ return sessionStorage.getItem(CODE_VERIFIER_KEY);
56
+ },
57
+ clearCodeVerifier() {
58
+ sessionStorage.removeItem(CODE_VERIFIER_KEY);
59
+ },
60
+ setState(state) {
61
+ sessionStorage.setItem(STATE_KEY, state);
62
+ },
63
+ getState() {
64
+ return sessionStorage.getItem(STATE_KEY);
65
+ },
66
+ clearState() {
67
+ sessionStorage.removeItem(STATE_KEY);
68
+ },
69
+ setNextUrl(url) {
70
+ sessionStorage.setItem(NEXT_URL_KEY, url);
71
+ },
72
+ getNextUrl() {
73
+ return sessionStorage.getItem(NEXT_URL_KEY);
74
+ },
75
+ clearNextUrl() {
76
+ sessionStorage.removeItem(NEXT_URL_KEY);
77
+ },
78
+ /** Clear all PKCE-related data */
79
+ clear() {
80
+ this.clearCodeVerifier();
81
+ this.clearState();
82
+ this.clearNextUrl();
83
+ },
84
+ };
85
+ //# sourceMappingURL=pkce.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pkce.js","sourceRoot":"","sources":["../src/pkce.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import React, { type ReactNode } from 'react';
2
+ import type { AuthConfig, AuthContextValue, User } from '../types';
3
+ declare const AuthContext: React.Context<AuthContextValue | null>;
4
+ export interface AuthProviderProps {
5
+ children: ReactNode;
6
+ config: AuthConfig;
7
+ /** Auto-refresh tokens before expiry (default: true) */
8
+ autoRefresh?: boolean;
9
+ /** Seconds before expiry to trigger refresh (default: 60) */
10
+ refreshBuffer?: number;
11
+ /** Callback when authentication state changes */
12
+ onAuthChange?: (isAuthenticated: boolean, user: User | null) => void;
13
+ }
14
+ export declare function AuthProvider({ children, config, autoRefresh, refreshBuffer, onAuthChange, }: AuthProviderProps): import("react/jsx-runtime").JSX.Element;
15
+ /**
16
+ * Hook to access auth context
17
+ * Must be used within AuthProvider
18
+ */
19
+ export declare function useAuthContext(): AuthContextValue;
20
+ /**
21
+ * Get the AuthClient instance from context
22
+ * For advanced use cases
23
+ */
24
+ export { AuthContext };
25
+ //# sourceMappingURL=AuthProvider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AuthProvider.d.ts","sourceRoot":"","sources":["../../src/react/AuthProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAOZ,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAEf,OAAO,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAoB,IAAI,EAAiB,MAAM,UAAU,CAAC;AAEpG,QAAA,MAAM,WAAW,wCAA+C,CAAC;AAEjE,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,SAAS,CAAC;IACpB,MAAM,EAAE,UAAU,CAAC;IACnB,wDAAwD;IACxD,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,6DAA6D;IAC7D,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iDAAiD;IACjD,YAAY,CAAC,EAAE,CAAC,eAAe,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI,KAAK,IAAI,CAAC;CACtE;AAED,wBAAgB,YAAY,CAAC,EAC3B,QAAQ,EACR,MAAM,EACN,WAAkB,EAClB,aAAkB,EAClB,YAAY,GACb,EAAE,iBAAiB,2CA+GnB;AAED;;;GAGG;AACH,wBAAgB,cAAc,IAAI,gBAAgB,CAMjD;AAED;;;GAGG;AACH,OAAO,EAAE,WAAW,EAAE,CAAC"}
@@ -0,0 +1,111 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { createContext, useContext, useState, useEffect, useCallback, useMemo, } from 'react';
3
+ import { AuthClient } from '../client';
4
+ const AuthContext = createContext(null);
5
+ export function AuthProvider({ children, config, autoRefresh = true, refreshBuffer = 60, onAuthChange, }) {
6
+ const [client] = useState(() => new AuthClient(config));
7
+ const [isAuthenticated, setIsAuthenticated] = useState(false);
8
+ const [isLoading, setIsLoading] = useState(true);
9
+ const [user, setUser] = useState(null);
10
+ const [error, setError] = useState(null);
11
+ // Initialize auth state
12
+ useEffect(() => {
13
+ const initAuth = () => {
14
+ const authenticated = client.isAuthenticated();
15
+ const currentUser = client.getUser();
16
+ setIsAuthenticated(authenticated);
17
+ setUser(currentUser);
18
+ setIsLoading(false);
19
+ onAuthChange?.(authenticated, currentUser);
20
+ };
21
+ initAuth();
22
+ }, [client, onAuthChange]);
23
+ // Auto-refresh token before expiry
24
+ useEffect(() => {
25
+ if (!autoRefresh || !isAuthenticated)
26
+ return;
27
+ const checkAndRefresh = async () => {
28
+ if (client.isTokenExpired(refreshBuffer)) {
29
+ try {
30
+ await client.refreshToken();
31
+ const newUser = client.getUser();
32
+ setUser(newUser);
33
+ setIsAuthenticated(true);
34
+ }
35
+ catch (err) {
36
+ setError(err instanceof Error ? err : new Error('Token refresh failed'));
37
+ setIsAuthenticated(false);
38
+ setUser(null);
39
+ onAuthChange?.(false, null);
40
+ }
41
+ }
42
+ };
43
+ // Check immediately
44
+ checkAndRefresh();
45
+ // Check periodically (every 30 seconds)
46
+ const interval = setInterval(checkAndRefresh, 30000);
47
+ return () => clearInterval(interval);
48
+ }, [client, isAuthenticated, autoRefresh, refreshBuffer, onAuthChange]);
49
+ const login = useCallback(async (options) => {
50
+ setIsLoading(true);
51
+ setError(null);
52
+ try {
53
+ await client.authorize(options);
54
+ }
55
+ catch (err) {
56
+ setError(err instanceof Error ? err : new Error('Login failed'));
57
+ setIsLoading(false);
58
+ }
59
+ }, [client]);
60
+ const logout = useCallback((redirectUri) => {
61
+ client.logout(redirectUri);
62
+ }, [client]);
63
+ const getAccessToken = useCallback(() => {
64
+ return client.getAccessToken();
65
+ }, [client]);
66
+ const refreshToken = useCallback(async () => {
67
+ const tokens = await client.refreshToken();
68
+ const newUser = client.getUser();
69
+ setUser(newUser);
70
+ setIsAuthenticated(true);
71
+ onAuthChange?.(true, newUser);
72
+ return tokens;
73
+ }, [client, onAuthChange]);
74
+ const refreshAuthState = useCallback(() => {
75
+ const authenticated = client.isAuthenticated();
76
+ const currentUser = client.getUser();
77
+ setIsAuthenticated(authenticated);
78
+ setUser(currentUser);
79
+ setIsLoading(false);
80
+ onAuthChange?.(authenticated, currentUser);
81
+ }, [client, onAuthChange]);
82
+ const value = useMemo(() => ({
83
+ isAuthenticated,
84
+ isLoading,
85
+ user,
86
+ error,
87
+ login,
88
+ logout,
89
+ getAccessToken,
90
+ refreshToken,
91
+ refreshAuthState,
92
+ }), [isAuthenticated, isLoading, user, error, login, logout, getAccessToken, refreshToken, refreshAuthState]);
93
+ return _jsx(AuthContext.Provider, { value: value, children: children });
94
+ }
95
+ /**
96
+ * Hook to access auth context
97
+ * Must be used within AuthProvider
98
+ */
99
+ export function useAuthContext() {
100
+ const context = useContext(AuthContext);
101
+ if (!context) {
102
+ throw new Error('useAuthContext must be used within an AuthProvider');
103
+ }
104
+ return context;
105
+ }
106
+ /**
107
+ * Get the AuthClient instance from context
108
+ * For advanced use cases
109
+ */
110
+ export { AuthContext };
111
+ //# sourceMappingURL=AuthProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AuthProvider.js","sourceRoot":"","sources":["../../src/react/AuthProvider.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export { AuthProvider, useAuthContext, AuthContext } from './AuthProvider';
2
+ export type { AuthProviderProps } from './AuthProvider';
3
+ export { useAuth } from './useAuth';
4
+ export { useUser } from './useUser';
5
+ export { useAuthCallback } from './useCallback';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC3E,YAAY,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,5 @@
1
+ export { AuthProvider, useAuthContext, AuthContext } from './AuthProvider';
2
+ export { useAuth } from './useAuth';
3
+ export { useUser } from './useUser';
4
+ export { useAuthCallback } from './useCallback';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE3E,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,21 @@
1
+ import type { AuthContextValue } from '../types';
2
+ /**
3
+ * Hook to access authentication state and actions
4
+ *
5
+ * @example
6
+ * ```tsx
7
+ * function LoginButton() {
8
+ * const { isAuthenticated, login, logout, isLoading } = useAuth();
9
+ *
10
+ * if (isLoading) return <div>Loading...</div>;
11
+ *
12
+ * if (isAuthenticated) {
13
+ * return <button onClick={() => logout()}>Logout</button>;
14
+ * }
15
+ *
16
+ * return <button onClick={() => login()}>Login</button>;
17
+ * }
18
+ * ```
19
+ */
20
+ export declare function useAuth(): AuthContextValue;
21
+ //# sourceMappingURL=useAuth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAuth.d.ts","sourceRoot":"","sources":["../../src/react/useAuth.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAEjD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,OAAO,IAAI,gBAAgB,CAE1C"}
@@ -0,0 +1,23 @@
1
+ import { useAuthContext } from './AuthProvider';
2
+ /**
3
+ * Hook to access authentication state and actions
4
+ *
5
+ * @example
6
+ * ```tsx
7
+ * function LoginButton() {
8
+ * const { isAuthenticated, login, logout, isLoading } = useAuth();
9
+ *
10
+ * if (isLoading) return <div>Loading...</div>;
11
+ *
12
+ * if (isAuthenticated) {
13
+ * return <button onClick={() => logout()}>Logout</button>;
14
+ * }
15
+ *
16
+ * return <button onClick={() => login()}>Login</button>;
17
+ * }
18
+ * ```
19
+ */
20
+ export function useAuth() {
21
+ return useAuthContext();
22
+ }
23
+ //# sourceMappingURL=useAuth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAuth.js","sourceRoot":"","sources":["../../src/react/useAuth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAGhD;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,OAAO;IACrB,OAAO,cAAc,EAAE,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,31 @@
1
+ import type { AuthConfig, CallbackResult } from '../types';
2
+ /**
3
+ * Hook to handle OAuth2 callback
4
+ * Use this on your callback page to exchange code for tokens
5
+ *
6
+ * @example
7
+ * ```tsx
8
+ * function CallbackPage() {
9
+ * const { isLoading, error, success } = useAuthCallback(authConfig);
10
+ *
11
+ * useEffect(() => {
12
+ * if (success) {
13
+ * navigate('/dashboard');
14
+ * }
15
+ * }, [success]);
16
+ *
17
+ * if (isLoading) return <div>Processing login...</div>;
18
+ * if (error) return <div>Error: {error}</div>;
19
+ *
20
+ * return null;
21
+ * }
22
+ * ```
23
+ */
24
+ export declare function useAuthCallback(config: AuthConfig): {
25
+ isLoading: boolean;
26
+ error: string | null;
27
+ success: boolean;
28
+ result: CallbackResult | null;
29
+ nextUrl: string | undefined;
30
+ };
31
+ //# sourceMappingURL=useCallback.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useCallback.d.ts","sourceRoot":"","sources":["../../src/react/useCallback.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAE3D;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,UAAU,GAAG;IACnD,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,cAAc,GAAG,IAAI,CAAC;IAC9B,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;CAC7B,CAyDA"}
@@ -0,0 +1,78 @@
1
+ import { useEffect, useRef, useState } from 'react';
2
+ import { AuthClient } from '../client';
3
+ /**
4
+ * Hook to handle OAuth2 callback
5
+ * Use this on your callback page to exchange code for tokens
6
+ *
7
+ * @example
8
+ * ```tsx
9
+ * function CallbackPage() {
10
+ * const { isLoading, error, success } = useAuthCallback(authConfig);
11
+ *
12
+ * useEffect(() => {
13
+ * if (success) {
14
+ * navigate('/dashboard');
15
+ * }
16
+ * }, [success]);
17
+ *
18
+ * if (isLoading) return <div>Processing login...</div>;
19
+ * if (error) return <div>Error: {error}</div>;
20
+ *
21
+ * return null;
22
+ * }
23
+ * ```
24
+ */
25
+ export function useAuthCallback(config) {
26
+ const [isLoading, setIsLoading] = useState(true);
27
+ const [error, setError] = useState(null);
28
+ const [success, setSuccess] = useState(false);
29
+ const [result, setResult] = useState(null);
30
+ const [nextUrl, setNextUrl] = useState(undefined);
31
+ const processedRef = useRef(false);
32
+ useEffect(() => {
33
+ // Guard against double-invocation (React StrictMode)
34
+ if (processedRef.current)
35
+ return;
36
+ processedRef.current = true;
37
+ const handleCallback = async () => {
38
+ const params = new URLSearchParams(window.location.search);
39
+ const code = params.get('code');
40
+ const state = params.get('state');
41
+ const errorParam = params.get('error');
42
+ const errorDescription = params.get('error_description');
43
+ // Handle OAuth2 error response
44
+ if (errorParam) {
45
+ setError(errorDescription || errorParam);
46
+ setIsLoading(false);
47
+ return;
48
+ }
49
+ // Validate required parameters
50
+ if (!code || !state) {
51
+ setError('Missing code or state parameter');
52
+ setIsLoading(false);
53
+ return;
54
+ }
55
+ try {
56
+ const client = new AuthClient(config);
57
+ const callbackResult = await client.handleCallback(code, state);
58
+ setResult(callbackResult);
59
+ if (callbackResult.success) {
60
+ setSuccess(true);
61
+ setNextUrl(callbackResult.nextUrl);
62
+ }
63
+ else {
64
+ setError(callbackResult.error || 'Callback failed');
65
+ }
66
+ }
67
+ catch (err) {
68
+ setError(err instanceof Error ? err.message : 'Unknown error');
69
+ }
70
+ finally {
71
+ setIsLoading(false);
72
+ }
73
+ };
74
+ handleCallback();
75
+ }, [config]);
76
+ return { isLoading, error, success, result, nextUrl };
77
+ }
78
+ //# sourceMappingURL=useCallback.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useCallback.js","sourceRoot":"","sources":["../../src/react/useCallback.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAGvC;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,UAAU,eAAe,CAAC,MAAkB;IAOhD,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IACjD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAgB,IAAI,CAAC,CAAC;IACxD,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC9C,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAwB,IAAI,CAAC,CAAC;IAClE,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAqB,SAAS,CAAC,CAAC;IACtE,MAAM,YAAY,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAEnC,SAAS,CAAC,GAAG,EAAE;QACb,qDAAqD;QACrD,IAAI,YAAY,CAAC,OAAO;YAAE,OAAO;QACjC,YAAY,CAAC,OAAO,GAAG,IAAI,CAAC;QAE5B,MAAM,cAAc,GAAG,KAAK,IAAI,EAAE;YAChC,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;YAC3D,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAChC,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAClC,MAAM,UAAU,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACvC,MAAM,gBAAgB,GAAG,MAAM,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;YAEzD,+BAA+B;YAC/B,IAAI,UAAU,EAAE,CAAC;gBACf,QAAQ,CAAC,gBAAgB,IAAI,UAAU,CAAC,CAAC;gBACzC,YAAY,CAAC,KAAK,CAAC,CAAC;gBACpB,OAAO;YACT,CAAC;YAED,+BAA+B;YAC/B,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;gBACpB,QAAQ,CAAC,iCAAiC,CAAC,CAAC;gBAC5C,YAAY,CAAC,KAAK,CAAC,CAAC;gBACpB,OAAO;YACT,CAAC;YAED,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC;gBACtC,MAAM,cAAc,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;gBAEhE,SAAS,CAAC,cAAc,CAAC,CAAC;gBAE1B,IAAI,cAAc,CAAC,OAAO,EAAE,CAAC;oBAC3B,UAAU,CAAC,IAAI,CAAC,CAAC;oBACjB,UAAU,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;gBACrC,CAAC;qBAAM,CAAC;oBACN,QAAQ,CAAC,cAAc,CAAC,KAAK,IAAI,iBAAiB,CAAC,CAAC;gBACtD,CAAC;YACH,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,QAAQ,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC;YACjE,CAAC;oBAAS,CAAC;gBACT,YAAY,CAAC,KAAK,CAAC,CAAC;YACtB,CAAC;QACH,CAAC,CAAC;QAEF,cAAc,EAAE,CAAC;IACnB,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAEb,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;AACxD,CAAC"}
@@ -0,0 +1,22 @@
1
+ import type { User } from '../types';
2
+ /**
3
+ * Hook to get current user information
4
+ *
5
+ * @example
6
+ * ```tsx
7
+ * function UserProfile() {
8
+ * const user = useUser();
9
+ *
10
+ * if (!user) return <div>Not logged in</div>;
11
+ *
12
+ * return (
13
+ * <div>
14
+ * <p>Email: {user.email}</p>
15
+ * <p>Name: {user.fullName}</p>
16
+ * </div>
17
+ * );
18
+ * }
19
+ * ```
20
+ */
21
+ export declare function useUser(): User | null;
22
+ //# sourceMappingURL=useUser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useUser.d.ts","sourceRoot":"","sources":["../../src/react/useUser.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAErC;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,OAAO,IAAI,IAAI,GAAG,IAAI,CAGrC"}
@@ -0,0 +1,25 @@
1
+ import { useAuthContext } from './AuthProvider';
2
+ /**
3
+ * Hook to get current user information
4
+ *
5
+ * @example
6
+ * ```tsx
7
+ * function UserProfile() {
8
+ * const user = useUser();
9
+ *
10
+ * if (!user) return <div>Not logged in</div>;
11
+ *
12
+ * return (
13
+ * <div>
14
+ * <p>Email: {user.email}</p>
15
+ * <p>Name: {user.fullName}</p>
16
+ * </div>
17
+ * );
18
+ * }
19
+ * ```
20
+ */
21
+ export function useUser() {
22
+ const { user } = useAuthContext();
23
+ return user;
24
+ }
25
+ //# sourceMappingURL=useUser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useUser.js","sourceRoot":"","sources":["../../src/react/useUser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAGhD;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,OAAO;IACrB,MAAM,EAAE,IAAI,EAAE,GAAG,cAAc,EAAE,CAAC;IAClC,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,49 @@
1
+ import type { JwtPayload, TokenResponse, TokenStorage, User } from './types';
2
+ /**
3
+ * Default localStorage-based token storage
4
+ */
5
+ export declare const defaultStorage: TokenStorage;
6
+ /**
7
+ * Token manager for storing and retrieving tokens
8
+ */
9
+ export declare class TokenManager {
10
+ private storage;
11
+ constructor(storage?: TokenStorage);
12
+ /**
13
+ * Save tokens from OAuth2 response
14
+ */
15
+ setTokens(response: TokenResponse): void;
16
+ /**
17
+ * Get access token
18
+ */
19
+ getAccessToken(): string | null;
20
+ /**
21
+ * Get refresh token
22
+ */
23
+ getRefreshToken(): string | null;
24
+ /**
25
+ * Get token expiry timestamp (in milliseconds)
26
+ */
27
+ getTokenExpiry(): number | null;
28
+ /**
29
+ * Check if access token is expired or about to expire (within 60 seconds)
30
+ */
31
+ isTokenExpired(bufferSeconds?: number): boolean;
32
+ /**
33
+ * Check if user is authenticated (has valid token)
34
+ */
35
+ isAuthenticated(): boolean;
36
+ /**
37
+ * Clear all tokens
38
+ */
39
+ clearTokens(): void;
40
+ /**
41
+ * Decode JWT payload (without verification)
42
+ */
43
+ decodeToken(token: string): JwtPayload | null;
44
+ /**
45
+ * Get user info from current access token
46
+ */
47
+ getUser(): User | null;
48
+ }
49
+ //# sourceMappingURL=storage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../src/storage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAM7E;;GAEG;AACH,eAAO,MAAM,cAAc,EAAE,YAI5B,CAAC;AAEF;;GAEG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,OAAO,CAAe;gBAElB,OAAO,GAAE,YAA6B;IAIlD;;OAEG;IACH,SAAS,CAAC,QAAQ,EAAE,aAAa,GAAG,IAAI;IAYxC;;OAEG;IACH,cAAc,IAAI,MAAM,GAAG,IAAI;IAI/B;;OAEG;IACH,eAAe,IAAI,MAAM,GAAG,IAAI;IAIhC;;OAEG;IACH,cAAc,IAAI,MAAM,GAAG,IAAI;IAc/B;;OAEG;IACH,cAAc,CAAC,aAAa,GAAE,MAAW,GAAG,OAAO;IAkBnD;;OAEG;IACH,eAAe,IAAI,OAAO;IAQ1B;;OAEG;IACH,WAAW,IAAI,IAAI;IAMnB;;OAEG;IACH,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI;IAa7C;;OAEG;IACH,OAAO,IAAI,IAAI,GAAG,IAAI;CAuBvB"}