@authsome/ui-core 0.1.8 → 1.0.0

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.
package/README.md DELETED
@@ -1,166 +0,0 @@
1
- # @authsome/ui-core
2
-
3
- Framework-agnostic authentication core for AuthSome UI.
4
-
5
- > **Note:** Version 0.1.1+ includes fixes for workspace dependency resolution in published packages.
6
-
7
- ## Installation
8
-
9
- ```bash
10
- pnpm add @authsome/ui-core
11
- ```
12
-
13
- ## Features
14
-
15
- - **Provider Adapters**: Built-in support for AuthSome, Clerk, Supabase, and custom backends
16
- - **Observable State**: Framework-agnostic state management
17
- - **Complete Auth Flows**: Email/password, OAuth, magic links, 2FA, passkeys, phone auth
18
- - **Type Safe**: Full TypeScript support
19
- - **Zero Dependencies**: Minimal footprint
20
-
21
- ## Usage
22
-
23
- ### Basic Setup with AuthSome
24
-
25
- ```typescript
26
- import { AuthClient, AuthSomeAdapter } from '@authsome/ui-core';
27
-
28
- // Create adapter
29
- const adapter = new AuthSomeAdapter();
30
- await adapter.initialize({
31
- apiUrl: 'https://your-api.com/auth',
32
- });
33
-
34
- // Create client
35
- const authClient = new AuthClient({
36
- provider: adapter,
37
- autoRefresh: true,
38
- });
39
-
40
- // Initialize
41
- await authClient.initialize();
42
-
43
- // Subscribe to auth state
44
- const unsubscribe = authClient.subscribe((state) => {
45
- console.log('Auth state:', state);
46
- });
47
-
48
- // Sign in
49
- await authClient.signIn({
50
- email: 'user@example.com',
51
- password: 'password',
52
- });
53
- ```
54
-
55
- ### Using with Clerk
56
-
57
- ```typescript
58
- import { AuthClient, ClerkAdapter } from '@authsome/ui-core';
59
-
60
- const adapter = new ClerkAdapter();
61
- await adapter.initialize({
62
- publishableKey: 'pk_test_...',
63
- });
64
-
65
- const authClient = new AuthClient({ provider: adapter });
66
- ```
67
-
68
- ### Using with Supabase
69
-
70
- ```typescript
71
- import { AuthClient, SupabaseAdapter } from '@authsome/ui-core';
72
-
73
- const adapter = new SupabaseAdapter();
74
- await adapter.initialize({
75
- url: 'https://your-project.supabase.co',
76
- anonKey: 'your-anon-key',
77
- });
78
-
79
- const authClient = new AuthClient({ provider: adapter });
80
- ```
81
-
82
- ### Custom Backend
83
-
84
- ```typescript
85
- import { AuthClient, GenericAdapter } from '@authsome/ui-core';
86
-
87
- const adapter = new GenericAdapter();
88
- await adapter.initialize({
89
- baseUrl: 'https://your-api.com',
90
- endpoints: {
91
- signIn: '/auth/login',
92
- signUp: '/auth/register',
93
- signOut: '/auth/logout',
94
- getCurrentUser: '/auth/me',
95
- // ... other endpoints
96
- },
97
- transforms: {
98
- transformAuthResponse: (res) => ({
99
- user: res.user,
100
- session: res.session,
101
- }),
102
- },
103
- });
104
-
105
- const authClient = new AuthClient({ provider: adapter });
106
- ```
107
-
108
- ## API Reference
109
-
110
- ### AuthClient
111
-
112
- The main authentication client.
113
-
114
- ```typescript
115
- const client = new AuthClient({
116
- provider: adapter,
117
- autoRefresh: true, // Auto-refresh sessions
118
- refreshInterval: 300000, // 5 minutes
119
- });
120
- ```
121
-
122
- ### Methods
123
-
124
- - `initialize()`: Initialize the client and restore session
125
- - `signIn(request)`: Sign in with credentials
126
- - `signUp(request)`: Register a new user
127
- - `signOut()`: Sign out current user
128
- - `updateUser(request)`: Update user profile
129
- - `changePassword(request)`: Change user password
130
- - `requestPasswordReset(request)`: Request password reset email
131
- - `confirmPasswordReset(request)`: Confirm password reset with token
132
- - `getOAuthUrl(request)`: Get OAuth authorization URL
133
- - `handleOAuthCallback(request)`: Handle OAuth callback
134
- - `sendMagicLink(request)`: Send magic link email
135
- - `verifyMagicLink(request)`: Verify magic link token
136
- - `sendPhoneCode(request)`: Send phone verification code
137
- - `verifyPhoneCode(request)`: Verify phone code
138
- - `setupTwoFactor(request)`: Setup 2FA
139
- - `verifyTwoFactor(request)`: Verify 2FA code
140
- - `disableTwoFactor()`: Disable 2FA
141
- - `getTwoFactorStatus()`: Get enabled 2FA methods
142
- - `registerPasskey(request)`: Register a passkey
143
- - `authenticatePasskey(request)`: Authenticate with passkey
144
- - `listPasskeys()`: List user's passkeys
145
- - `deletePasskey(id)`: Delete a passkey
146
- - `refreshSession()`: Manually refresh session
147
- - `subscribe(listener)`: Subscribe to auth state changes
148
- - `destroy()`: Cleanup resources
149
-
150
- ### Auth State
151
-
152
- ```typescript
153
- interface AuthContext {
154
- state: AuthState; // AUTHENTICATED | UNAUTHENTICATED | LOADING | ERROR
155
- user: User | null;
156
- session: Session | null;
157
- error: AuthError | null;
158
- isAuthenticated: boolean;
159
- isLoading: boolean;
160
- }
161
- ```
162
-
163
- ## License
164
-
165
- MIT
166
-
@@ -1,65 +0,0 @@
1
- import { c as AuthProvider, G as ProviderConfig, S as SignInRequest, E as AuthResponse, d as SignUpRequest, t as User, u as Session, w as SessionData, U as UpdateUserRequest, P as PasswordChangeRequest, e as PasswordResetRequest, f as PasswordResetConfirmRequest, O as OAuthSignInRequest, g as OAuthCallbackRequest, h as OAuthProvider, M as MagicLinkRequest, i as MagicLinkVerifyRequest, j as PhoneAuthRequest, k as PhoneVerifyRequest, T as TwoFactorSetupRequest, l as TwoFactorSetupResponse, m as TwoFactorVerifyRequest, n as TwoFactorMethod, o as PasskeyRegisterRequest, p as PasskeyCredential, q as PasskeyAuthRequest, R as RequestContext, C as CookieData, a as AuthError } from '../provider-S9ZY5hsp.mjs';
2
-
3
- /**
4
- * Base auth provider implementation
5
- */
6
-
7
- /**
8
- * Base provider class with common functionality
9
- */
10
- declare abstract class BaseAuthProvider implements AuthProvider {
11
- abstract readonly name: string;
12
- protected config: ProviderConfig;
13
- protected initialized: boolean;
14
- /**
15
- * Initialize the provider
16
- */
17
- initialize(config: ProviderConfig): Promise<void>;
18
- /**
19
- * Ensure provider is initialized
20
- */
21
- protected ensureInitialized(): void;
22
- /**
23
- * Make HTTP request
24
- */
25
- protected request<T>(url: string, options?: RequestInit): Promise<T>;
26
- abstract signIn(request: SignInRequest): Promise<AuthResponse>;
27
- abstract signUp(request: SignUpRequest): Promise<AuthResponse>;
28
- abstract signOut(): Promise<void>;
29
- abstract getCurrentUser(): Promise<User | null>;
30
- abstract getCurrentSession(): Promise<Session | null>;
31
- abstract getCurrentSessionData(): Promise<SessionData | null>;
32
- abstract refreshSession(): Promise<Session>;
33
- abstract updateUser(request: UpdateUserRequest): Promise<User>;
34
- abstract changePassword(request: PasswordChangeRequest): Promise<void>;
35
- abstract requestPasswordReset(request: PasswordResetRequest): Promise<void>;
36
- abstract confirmPasswordReset(request: PasswordResetConfirmRequest): Promise<void>;
37
- abstract oauthSignIn(request: OAuthSignInRequest): Promise<string>;
38
- abstract oauthCallback(request: OAuthCallbackRequest): Promise<AuthResponse>;
39
- abstract getOAuthProviders(): Promise<OAuthProvider[]>;
40
- abstract sendMagicLink(request: MagicLinkRequest): Promise<void>;
41
- abstract verifyMagicLink(request: MagicLinkVerifyRequest): Promise<AuthResponse>;
42
- abstract sendPhoneCode(request: PhoneAuthRequest): Promise<void>;
43
- abstract verifyPhoneCode(request: PhoneVerifyRequest): Promise<AuthResponse>;
44
- abstract setupTwoFactor(request: TwoFactorSetupRequest): Promise<TwoFactorSetupResponse>;
45
- abstract verifyTwoFactor(request: TwoFactorVerifyRequest): Promise<AuthResponse>;
46
- abstract disableTwoFactor(): Promise<void>;
47
- abstract getTwoFactorStatus(): Promise<TwoFactorMethod[]>;
48
- abstract registerPasskey(request: PasskeyRegisterRequest): Promise<PasskeyCredential>;
49
- abstract authenticatePasskey(request: PasskeyAuthRequest): Promise<AuthResponse>;
50
- abstract listPasskeys(): Promise<PasskeyCredential[]>;
51
- abstract deletePasskey(credentialId: string): Promise<void>;
52
- /**
53
- * Optional edge runtime context methods
54
- * Default implementations do nothing - subclasses can override
55
- */
56
- setContext?(context: RequestContext): void;
57
- getCookies?(): CookieData[];
58
- clearContext?(): void;
59
- /**
60
- * Normalize error to AuthError
61
- */
62
- normalizeError(error: unknown): AuthError;
63
- }
64
-
65
- export { BaseAuthProvider };
@@ -1,65 +0,0 @@
1
- import { c as AuthProvider, G as ProviderConfig, S as SignInRequest, E as AuthResponse, d as SignUpRequest, t as User, u as Session, w as SessionData, U as UpdateUserRequest, P as PasswordChangeRequest, e as PasswordResetRequest, f as PasswordResetConfirmRequest, O as OAuthSignInRequest, g as OAuthCallbackRequest, h as OAuthProvider, M as MagicLinkRequest, i as MagicLinkVerifyRequest, j as PhoneAuthRequest, k as PhoneVerifyRequest, T as TwoFactorSetupRequest, l as TwoFactorSetupResponse, m as TwoFactorVerifyRequest, n as TwoFactorMethod, o as PasskeyRegisterRequest, p as PasskeyCredential, q as PasskeyAuthRequest, R as RequestContext, C as CookieData, a as AuthError } from '../provider-S9ZY5hsp.js';
2
-
3
- /**
4
- * Base auth provider implementation
5
- */
6
-
7
- /**
8
- * Base provider class with common functionality
9
- */
10
- declare abstract class BaseAuthProvider implements AuthProvider {
11
- abstract readonly name: string;
12
- protected config: ProviderConfig;
13
- protected initialized: boolean;
14
- /**
15
- * Initialize the provider
16
- */
17
- initialize(config: ProviderConfig): Promise<void>;
18
- /**
19
- * Ensure provider is initialized
20
- */
21
- protected ensureInitialized(): void;
22
- /**
23
- * Make HTTP request
24
- */
25
- protected request<T>(url: string, options?: RequestInit): Promise<T>;
26
- abstract signIn(request: SignInRequest): Promise<AuthResponse>;
27
- abstract signUp(request: SignUpRequest): Promise<AuthResponse>;
28
- abstract signOut(): Promise<void>;
29
- abstract getCurrentUser(): Promise<User | null>;
30
- abstract getCurrentSession(): Promise<Session | null>;
31
- abstract getCurrentSessionData(): Promise<SessionData | null>;
32
- abstract refreshSession(): Promise<Session>;
33
- abstract updateUser(request: UpdateUserRequest): Promise<User>;
34
- abstract changePassword(request: PasswordChangeRequest): Promise<void>;
35
- abstract requestPasswordReset(request: PasswordResetRequest): Promise<void>;
36
- abstract confirmPasswordReset(request: PasswordResetConfirmRequest): Promise<void>;
37
- abstract oauthSignIn(request: OAuthSignInRequest): Promise<string>;
38
- abstract oauthCallback(request: OAuthCallbackRequest): Promise<AuthResponse>;
39
- abstract getOAuthProviders(): Promise<OAuthProvider[]>;
40
- abstract sendMagicLink(request: MagicLinkRequest): Promise<void>;
41
- abstract verifyMagicLink(request: MagicLinkVerifyRequest): Promise<AuthResponse>;
42
- abstract sendPhoneCode(request: PhoneAuthRequest): Promise<void>;
43
- abstract verifyPhoneCode(request: PhoneVerifyRequest): Promise<AuthResponse>;
44
- abstract setupTwoFactor(request: TwoFactorSetupRequest): Promise<TwoFactorSetupResponse>;
45
- abstract verifyTwoFactor(request: TwoFactorVerifyRequest): Promise<AuthResponse>;
46
- abstract disableTwoFactor(): Promise<void>;
47
- abstract getTwoFactorStatus(): Promise<TwoFactorMethod[]>;
48
- abstract registerPasskey(request: PasskeyRegisterRequest): Promise<PasskeyCredential>;
49
- abstract authenticatePasskey(request: PasskeyAuthRequest): Promise<AuthResponse>;
50
- abstract listPasskeys(): Promise<PasskeyCredential[]>;
51
- abstract deletePasskey(credentialId: string): Promise<void>;
52
- /**
53
- * Optional edge runtime context methods
54
- * Default implementations do nothing - subclasses can override
55
- */
56
- setContext?(context: RequestContext): void;
57
- getCookies?(): CookieData[];
58
- clearContext?(): void;
59
- /**
60
- * Normalize error to AuthError
61
- */
62
- normalizeError(error: unknown): AuthError;
63
- }
64
-
65
- export { BaseAuthProvider };
@@ -1,94 +0,0 @@
1
- 'use strict';
2
-
3
- // src/types/auth.ts
4
- var AuthError = class _AuthError extends Error {
5
- constructor(message, type = "unknown_error" /* UNKNOWN_ERROR */, options) {
6
- super(message);
7
- this.name = "AuthError";
8
- this.type = type;
9
- this.details = options?.details;
10
- this.code = options?.code;
11
- this.originalError = options?.originalError;
12
- if (Error.captureStackTrace) {
13
- Error.captureStackTrace(this, _AuthError);
14
- }
15
- }
16
- };
17
-
18
- // src/utils/errors.ts
19
- function isAuthError(error) {
20
- return error instanceof AuthError;
21
- }
22
- function toAuthError(error) {
23
- if (isAuthError(error)) {
24
- return error;
25
- }
26
- if (error instanceof Error) {
27
- return new AuthError(error.message, "unknown_error" /* UNKNOWN_ERROR */, {
28
- details: {
29
- originalError: error.name,
30
- stack: error.stack
31
- }
32
- });
33
- }
34
- if (typeof error === "string") {
35
- return new AuthError(error, "unknown_error" /* UNKNOWN_ERROR */);
36
- }
37
- return new AuthError(
38
- "An unknown error occurred",
39
- "unknown_error" /* UNKNOWN_ERROR */,
40
- { details: { error } }
41
- );
42
- }
43
-
44
- // src/adapters/base-provider.ts
45
- var BaseAuthProvider = class {
46
- constructor() {
47
- this.config = {};
48
- this.initialized = false;
49
- }
50
- /**
51
- * Initialize the provider
52
- */
53
- async initialize(config) {
54
- this.config = config;
55
- this.initialized = true;
56
- }
57
- /**
58
- * Ensure provider is initialized
59
- */
60
- ensureInitialized() {
61
- if (!this.initialized) {
62
- throw new Error(`Provider ${this.name} is not initialized`);
63
- }
64
- }
65
- /**
66
- * Make HTTP request
67
- */
68
- async request(url, options = {}) {
69
- const response = await fetch(url, {
70
- ...options,
71
- headers: {
72
- "Content-Type": "application/json",
73
- ...options.headers
74
- }
75
- });
76
- if (!response.ok) {
77
- const error = await response.json().catch(() => ({
78
- message: response.statusText
79
- }));
80
- throw error;
81
- }
82
- return response.json();
83
- }
84
- /**
85
- * Normalize error to AuthError
86
- */
87
- normalizeError(error) {
88
- return toAuthError(error);
89
- }
90
- };
91
-
92
- exports.BaseAuthProvider = BaseAuthProvider;
93
- //# sourceMappingURL=index.js.map
94
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/types/auth.ts","../../src/utils/errors.ts","../../src/adapters/base-provider.ts"],"names":[],"mappings":";;;AAmFO,IAAM,SAAA,GAAN,MAAM,UAAA,SAAkB,KAAA,CAAM;AAAA,EAMnC,WAAA,CACE,OAAA,EACA,IAAA,GAAsB,eAAA,sBACtB,OAAA,EAKA;AACA,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,WAAA;AACZ,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,UAAU,OAAA,EAAS,OAAA;AACxB,IAAA,IAAA,CAAK,OAAO,OAAA,EAAS,IAAA;AACrB,IAAA,IAAA,CAAK,gBAAgB,OAAA,EAAS,aAAA;AAG9B,IAAA,IAAI,MAAM,iBAAA,EAAmB;AAC3B,MAAA,KAAA,CAAM,iBAAA,CAAkB,MAAM,UAAS,CAAA;AAAA,IACzC;AAAA,EACF;AACF,CAAA;;;ACvFO,SAAS,YAAY,KAAA,EAAoC;AAC9D,EAAA,OAAO,KAAA,YAAiB,SAAA;AAC1B;AAKO,SAAS,YAAY,KAAA,EAA2B;AACrD,EAAA,IAAI,WAAA,CAAY,KAAK,CAAA,EAAG;AACtB,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,IAAI,iBAAiB,KAAA,EAAO;AAC1B,IAAA,OAAO,IAAI,SAAA,CAAU,KAAA,CAAM,OAAA,EAAA,eAAA,sBAAsC;AAAA,MAC/D,OAAA,EAAS;AAAA,QACP,eAAe,KAAA,CAAM,IAAA;AAAA,QACrB,OAAO,KAAA,CAAM;AAAA;AACf,KACD,CAAA;AAAA,EACH;AAEA,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,OAAO,IAAI,UAAU,KAAA,EAAA,eAAA,qBAAkC;AAAA,EACzD;AAEA,EAAA,OAAO,IAAI,SAAA;AAAA,IACT,2BAAA;AAAA,IAAA,eAAA;AAAA,IAEA,EAAE,OAAA,EAAS,EAAE,KAAA,EAAM;AAAE,GACvB;AACF;;;ACbO,IAAe,mBAAf,MAAwD;AAAA,EAAxD,WAAA,GAAA;AAEL,IAAA,IAAA,CAAU,SAAyB,EAAC;AACpC,IAAA,IAAA,CAAU,WAAA,GAAc,KAAA;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA,EAKxB,MAAM,WAAW,MAAA,EAAuC;AACtD,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA,EAKU,iBAAA,GAA0B;AAClC,IAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AACrB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,SAAA,EAAY,IAAA,CAAK,IAAI,CAAA,mBAAA,CAAqB,CAAA;AAAA,IAC5D;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAgB,OAAA,CACd,GAAA,EACA,OAAA,GAAuB,EAAC,EACZ;AACZ,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,EAAK;AAAA,MAChC,GAAG,OAAA;AAAA,MACH,OAAA,EAAS;AAAA,QACP,cAAA,EAAgB,kBAAA;AAAA,QAChB,GAAG,OAAA,CAAQ;AAAA;AACb,KACD,CAAA;AAED,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,QAAQ,MAAM,QAAA,CAAS,IAAA,EAAK,CAAE,MAAM,OAAO;AAAA,QAC/C,SAAS,QAAA,CAAS;AAAA,OACpB,CAAE,CAAA;AACF,MAAA,MAAM,KAAA;AAAA,IACR;AAEA,IAAA,OAAO,SAAS,IAAA,EAAK;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAyCA,eAAe,KAAA,EAA2B;AACxC,IAAA,OAAO,YAAY,KAAK,CAAA;AAAA,EAC1B;AACF","file":"index.js","sourcesContent":["/**\n * Core authentication types and interfaces\n */\n\n/**\n * Authentication state enum\n */\nexport enum AuthState {\n AUTHENTICATED = 'authenticated',\n UNAUTHENTICATED = 'unauthenticated',\n LOADING = 'loading',\n ERROR = 'error',\n}\n\n/**\n * User profile interface\n */\nexport interface User {\n id: string;\n email?: string;\n username?: string;\n phone?: string;\n emailVerified?: boolean;\n phoneVerified?: boolean;\n name?: string;\n firstName?: string;\n lastName?: string;\n avatar?: string;\n metadata?: Record<string, unknown>;\n createdAt?: Date;\n updatedAt?: Date;\n \n // Organization fields\n organizationId?: string;\n organizationRole?: string;\n organizationMemberships?: OrganizationMembership[];\n}\n\n/**\n * Session interface\n */\nexport interface Session {\n id: string;\n userId: string;\n token: string;\n expiresAt?: Date;\n createdAt?: Date;\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Session data with user and session combined\n * Used for efficient retrieval of both user and session in one call\n */\nexport interface SessionData {\n user: User;\n session: Session;\n expiresAt: number;\n}\n\n/**\n * Auth error types\n */\nexport enum AuthErrorType {\n INVALID_CREDENTIALS = 'invalid_credentials',\n USER_NOT_FOUND = 'user_not_found',\n USER_ALREADY_EXISTS = 'user_already_exists',\n INVALID_TOKEN = 'invalid_token',\n TOKEN_EXPIRED = 'token_expired',\n NETWORK_ERROR = 'network_error',\n VALIDATION_ERROR = 'validation_error',\n MFA_REQUIRED = 'mfa_required',\n EMAIL_NOT_VERIFIED = 'email_not_verified',\n PHONE_NOT_VERIFIED = 'phone_not_verified',\n RATE_LIMIT_EXCEEDED = 'rate_limit_exceeded',\n UNKNOWN_ERROR = 'unknown_error',\n}\n\n/**\n * Auth error class\n * \n * Extends Error to provide proper error handling with auth-specific context\n */\nexport class AuthError extends Error {\n public readonly type: AuthErrorType;\n public readonly details?: Record<string, unknown>;\n public readonly code?: string | number;\n public readonly originalError?: unknown;\n\n constructor(\n message: string,\n type: AuthErrorType = AuthErrorType.UNKNOWN_ERROR,\n options?: {\n details?: Record<string, unknown>;\n code?: string | number;\n originalError?: unknown;\n }\n ) {\n super(message);\n this.name = 'AuthError';\n this.type = type;\n this.details = options?.details;\n this.code = options?.code;\n this.originalError = options?.originalError;\n\n // Maintains proper stack trace for where our error was thrown (only available on V8)\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, AuthError);\n }\n }\n}\n\n/**\n * Auth context state\n */\nexport interface AuthContext {\n state: AuthState;\n user: User | null;\n session: Session | null;\n error: AuthError | null;\n isAuthenticated: boolean;\n isLoading: boolean;\n}\n\n/**\n * OAuth provider types\n */\nexport enum OAuthProvider {\n GOOGLE = 'google',\n GITHUB = 'github',\n FACEBOOK = 'facebook',\n TWITTER = 'twitter',\n MICROSOFT = 'microsoft',\n APPLE = 'apple',\n LINKEDIN = 'linkedin',\n DISCORD = 'discord',\n}\n\n/**\n * OAuth configuration\n */\nexport interface OAuthConfig {\n provider: OAuthProvider;\n clientId: string;\n redirectUri: string;\n scope?: string[];\n state?: string;\n}\n\n/**\n * 2FA method types\n */\nexport enum TwoFactorMethod {\n TOTP = 'totp',\n SMS = 'sms',\n EMAIL = 'email',\n BACKUP_CODE = 'backup_code',\n}\n\n/**\n * 2FA configuration\n */\nexport interface TwoFactorConfig {\n method: TwoFactorMethod;\n enabled: boolean;\n verified?: boolean;\n}\n\n/**\n * Passkey/WebAuthn types\n */\nexport interface PasskeyCredential {\n id: string;\n name?: string;\n createdAt?: Date;\n lastUsedAt?: Date;\n}\n\n/**\n * Validation error\n */\nexport interface ValidationError {\n field: string;\n message: string;\n code?: string;\n}\n\n/**\n * Organization interface\n */\nexport interface Organization {\n id: string;\n name: string;\n slug: string;\n logoUrl?: string;\n createdAt?: Date;\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Organization membership interface\n */\nexport interface OrganizationMembership {\n organization: Organization;\n role: 'owner' | 'admin' | 'member';\n permissions?: string[];\n}\n\n","/**\n * Error handling utilities\n */\n\nimport { AuthError, AuthErrorType } from '../types';\n\n/**\n * Create an auth error\n * \n * @deprecated Use `new AuthError()` directly instead\n */\nexport function createAuthError(\n type: AuthErrorType,\n message: string,\n details?: Record<string, unknown>,\n code?: string | number\n): AuthError {\n return new AuthError(message, type, { details, code });\n}\n\n/**\n * Check if an error is an auth error\n */\nexport function isAuthError(error: unknown): error is AuthError {\n return error instanceof AuthError;\n}\n\n/**\n * Convert unknown error to auth error\n */\nexport function toAuthError(error: unknown): AuthError {\n if (isAuthError(error)) {\n return error;\n }\n\n if (error instanceof Error) {\n return new AuthError(error.message, AuthErrorType.UNKNOWN_ERROR, {\n details: {\n originalError: error.name,\n stack: error.stack,\n },\n });\n }\n\n if (typeof error === 'string') {\n return new AuthError(error, AuthErrorType.UNKNOWN_ERROR);\n }\n\n return new AuthError(\n 'An unknown error occurred',\n AuthErrorType.UNKNOWN_ERROR,\n { details: { error } }\n );\n}\n\n/**\n * Check if error is a network error\n */\nexport function isNetworkError(error: unknown): boolean {\n if (error instanceof Error) {\n return (\n error.name === 'NetworkError' ||\n error.message.includes('network') ||\n error.message.includes('fetch')\n );\n }\n return false;\n}\n\n/**\n * Check if error indicates authentication is required\n */\nexport function isUnauthenticatedError(error: unknown): boolean {\n if (isAuthError(error)) {\n return (\n error.type === AuthErrorType.INVALID_TOKEN ||\n error.type === AuthErrorType.TOKEN_EXPIRED\n );\n }\n return false;\n}\n\n/**\n * Check if error requires MFA\n */\nexport function isMFARequiredError(error: unknown): boolean {\n if (isAuthError(error)) {\n return error.type === AuthErrorType.MFA_REQUIRED;\n }\n return false;\n}\n","/**\n * Base auth provider implementation\n */\n\nimport type {\n AuthProvider,\n AuthResponse,\n SignInRequest,\n SignUpRequest,\n UpdateUserRequest,\n PasswordChangeRequest,\n PasswordResetRequest,\n PasswordResetConfirmRequest,\n OAuthSignInRequest,\n OAuthCallbackRequest,\n MagicLinkRequest,\n MagicLinkVerifyRequest,\n PhoneAuthRequest,\n PhoneVerifyRequest,\n TwoFactorSetupRequest,\n TwoFactorSetupResponse,\n TwoFactorVerifyRequest,\n PasskeyRegisterRequest,\n PasskeyAuthRequest,\n User,\n Session,\n SessionData,\n OAuthProvider,\n TwoFactorMethod,\n PasskeyCredential,\n AuthError,\n ProviderConfig,\n RequestContext,\n CookieData,\n} from '../types';\nimport { toAuthError } from '../utils';\n\n/**\n * Base provider class with common functionality\n */\nexport abstract class BaseAuthProvider implements AuthProvider {\n abstract readonly name: string;\n protected config: ProviderConfig = {};\n protected initialized = false;\n\n /**\n * Initialize the provider\n */\n async initialize(config: ProviderConfig): Promise<void> {\n this.config = config;\n this.initialized = true;\n }\n\n /**\n * Ensure provider is initialized\n */\n protected ensureInitialized(): void {\n if (!this.initialized) {\n throw new Error(`Provider ${this.name} is not initialized`);\n }\n }\n\n /**\n * Make HTTP request\n */\n protected async request<T>(\n url: string,\n options: RequestInit = {}\n ): Promise<T> {\n const response = await fetch(url, {\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers,\n },\n });\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({\n message: response.statusText,\n }));\n throw error;\n }\n\n return response.json();\n }\n\n // Abstract methods that must be implemented by subclasses\n abstract signIn(request: SignInRequest): Promise<AuthResponse>;\n abstract signUp(request: SignUpRequest): Promise<AuthResponse>;\n abstract signOut(): Promise<void>;\n abstract getCurrentUser(): Promise<User | null>;\n abstract getCurrentSession(): Promise<Session | null>;\n abstract getCurrentSessionData(): Promise<SessionData | null>;\n abstract refreshSession(): Promise<Session>;\n abstract updateUser(request: UpdateUserRequest): Promise<User>;\n abstract changePassword(request: PasswordChangeRequest): Promise<void>;\n abstract requestPasswordReset(request: PasswordResetRequest): Promise<void>;\n abstract confirmPasswordReset(request: PasswordResetConfirmRequest): Promise<void>;\n abstract oauthSignIn(request: OAuthSignInRequest): Promise<string>;\n abstract oauthCallback(request: OAuthCallbackRequest): Promise<AuthResponse>;\n abstract getOAuthProviders(): Promise<OAuthProvider[]>;\n abstract sendMagicLink(request: MagicLinkRequest): Promise<void>;\n abstract verifyMagicLink(request: MagicLinkVerifyRequest): Promise<AuthResponse>;\n abstract sendPhoneCode(request: PhoneAuthRequest): Promise<void>;\n abstract verifyPhoneCode(request: PhoneVerifyRequest): Promise<AuthResponse>;\n abstract setupTwoFactor(request: TwoFactorSetupRequest): Promise<TwoFactorSetupResponse>;\n abstract verifyTwoFactor(request: TwoFactorVerifyRequest): Promise<AuthResponse>;\n abstract disableTwoFactor(): Promise<void>;\n abstract getTwoFactorStatus(): Promise<TwoFactorMethod[]>;\n abstract registerPasskey(request: PasskeyRegisterRequest): Promise<PasskeyCredential>;\n abstract authenticatePasskey(request: PasskeyAuthRequest): Promise<AuthResponse>;\n abstract listPasskeys(): Promise<PasskeyCredential[]>;\n abstract deletePasskey(credentialId: string): Promise<void>;\n\n /**\n * Optional edge runtime context methods\n * Default implementations do nothing - subclasses can override\n */\n setContext?(context: RequestContext): void;\n getCookies?(): CookieData[];\n clearContext?(): void;\n\n /**\n * Normalize error to AuthError\n */\n normalizeError(error: unknown): AuthError {\n return toAuthError(error);\n }\n}\n\n"]}
@@ -1,92 +0,0 @@
1
- // src/types/auth.ts
2
- var AuthError = class _AuthError extends Error {
3
- constructor(message, type = "unknown_error" /* UNKNOWN_ERROR */, options) {
4
- super(message);
5
- this.name = "AuthError";
6
- this.type = type;
7
- this.details = options?.details;
8
- this.code = options?.code;
9
- this.originalError = options?.originalError;
10
- if (Error.captureStackTrace) {
11
- Error.captureStackTrace(this, _AuthError);
12
- }
13
- }
14
- };
15
-
16
- // src/utils/errors.ts
17
- function isAuthError(error) {
18
- return error instanceof AuthError;
19
- }
20
- function toAuthError(error) {
21
- if (isAuthError(error)) {
22
- return error;
23
- }
24
- if (error instanceof Error) {
25
- return new AuthError(error.message, "unknown_error" /* UNKNOWN_ERROR */, {
26
- details: {
27
- originalError: error.name,
28
- stack: error.stack
29
- }
30
- });
31
- }
32
- if (typeof error === "string") {
33
- return new AuthError(error, "unknown_error" /* UNKNOWN_ERROR */);
34
- }
35
- return new AuthError(
36
- "An unknown error occurred",
37
- "unknown_error" /* UNKNOWN_ERROR */,
38
- { details: { error } }
39
- );
40
- }
41
-
42
- // src/adapters/base-provider.ts
43
- var BaseAuthProvider = class {
44
- constructor() {
45
- this.config = {};
46
- this.initialized = false;
47
- }
48
- /**
49
- * Initialize the provider
50
- */
51
- async initialize(config) {
52
- this.config = config;
53
- this.initialized = true;
54
- }
55
- /**
56
- * Ensure provider is initialized
57
- */
58
- ensureInitialized() {
59
- if (!this.initialized) {
60
- throw new Error(`Provider ${this.name} is not initialized`);
61
- }
62
- }
63
- /**
64
- * Make HTTP request
65
- */
66
- async request(url, options = {}) {
67
- const response = await fetch(url, {
68
- ...options,
69
- headers: {
70
- "Content-Type": "application/json",
71
- ...options.headers
72
- }
73
- });
74
- if (!response.ok) {
75
- const error = await response.json().catch(() => ({
76
- message: response.statusText
77
- }));
78
- throw error;
79
- }
80
- return response.json();
81
- }
82
- /**
83
- * Normalize error to AuthError
84
- */
85
- normalizeError(error) {
86
- return toAuthError(error);
87
- }
88
- };
89
-
90
- export { BaseAuthProvider };
91
- //# sourceMappingURL=index.mjs.map
92
- //# sourceMappingURL=index.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/types/auth.ts","../../src/utils/errors.ts","../../src/adapters/base-provider.ts"],"names":[],"mappings":";AAmFO,IAAM,SAAA,GAAN,MAAM,UAAA,SAAkB,KAAA,CAAM;AAAA,EAMnC,WAAA,CACE,OAAA,EACA,IAAA,GAAsB,eAAA,sBACtB,OAAA,EAKA;AACA,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,WAAA;AACZ,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,IAAA,CAAK,UAAU,OAAA,EAAS,OAAA;AACxB,IAAA,IAAA,CAAK,OAAO,OAAA,EAAS,IAAA;AACrB,IAAA,IAAA,CAAK,gBAAgB,OAAA,EAAS,aAAA;AAG9B,IAAA,IAAI,MAAM,iBAAA,EAAmB;AAC3B,MAAA,KAAA,CAAM,iBAAA,CAAkB,MAAM,UAAS,CAAA;AAAA,IACzC;AAAA,EACF;AACF,CAAA;;;ACvFO,SAAS,YAAY,KAAA,EAAoC;AAC9D,EAAA,OAAO,KAAA,YAAiB,SAAA;AAC1B;AAKO,SAAS,YAAY,KAAA,EAA2B;AACrD,EAAA,IAAI,WAAA,CAAY,KAAK,CAAA,EAAG;AACtB,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,IAAI,iBAAiB,KAAA,EAAO;AAC1B,IAAA,OAAO,IAAI,SAAA,CAAU,KAAA,CAAM,OAAA,EAAA,eAAA,sBAAsC;AAAA,MAC/D,OAAA,EAAS;AAAA,QACP,eAAe,KAAA,CAAM,IAAA;AAAA,QACrB,OAAO,KAAA,CAAM;AAAA;AACf,KACD,CAAA;AAAA,EACH;AAEA,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,OAAO,IAAI,UAAU,KAAA,EAAA,eAAA,qBAAkC;AAAA,EACzD;AAEA,EAAA,OAAO,IAAI,SAAA;AAAA,IACT,2BAAA;AAAA,IAAA,eAAA;AAAA,IAEA,EAAE,OAAA,EAAS,EAAE,KAAA,EAAM;AAAE,GACvB;AACF;;;ACbO,IAAe,mBAAf,MAAwD;AAAA,EAAxD,WAAA,GAAA;AAEL,IAAA,IAAA,CAAU,SAAyB,EAAC;AACpC,IAAA,IAAA,CAAU,WAAA,GAAc,KAAA;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA,EAKxB,MAAM,WAAW,MAAA,EAAuC;AACtD,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,WAAA,GAAc,IAAA;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA,EAKU,iBAAA,GAA0B;AAClC,IAAA,IAAI,CAAC,KAAK,WAAA,EAAa;AACrB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,SAAA,EAAY,IAAA,CAAK,IAAI,CAAA,mBAAA,CAAqB,CAAA;AAAA,IAC5D;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAgB,OAAA,CACd,GAAA,EACA,OAAA,GAAuB,EAAC,EACZ;AACZ,IAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,EAAK;AAAA,MAChC,GAAG,OAAA;AAAA,MACH,OAAA,EAAS;AAAA,QACP,cAAA,EAAgB,kBAAA;AAAA,QAChB,GAAG,OAAA,CAAQ;AAAA;AACb,KACD,CAAA;AAED,IAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,MAAA,MAAM,QAAQ,MAAM,QAAA,CAAS,IAAA,EAAK,CAAE,MAAM,OAAO;AAAA,QAC/C,SAAS,QAAA,CAAS;AAAA,OACpB,CAAE,CAAA;AACF,MAAA,MAAM,KAAA;AAAA,IACR;AAEA,IAAA,OAAO,SAAS,IAAA,EAAK;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAyCA,eAAe,KAAA,EAA2B;AACxC,IAAA,OAAO,YAAY,KAAK,CAAA;AAAA,EAC1B;AACF","file":"index.mjs","sourcesContent":["/**\n * Core authentication types and interfaces\n */\n\n/**\n * Authentication state enum\n */\nexport enum AuthState {\n AUTHENTICATED = 'authenticated',\n UNAUTHENTICATED = 'unauthenticated',\n LOADING = 'loading',\n ERROR = 'error',\n}\n\n/**\n * User profile interface\n */\nexport interface User {\n id: string;\n email?: string;\n username?: string;\n phone?: string;\n emailVerified?: boolean;\n phoneVerified?: boolean;\n name?: string;\n firstName?: string;\n lastName?: string;\n avatar?: string;\n metadata?: Record<string, unknown>;\n createdAt?: Date;\n updatedAt?: Date;\n \n // Organization fields\n organizationId?: string;\n organizationRole?: string;\n organizationMemberships?: OrganizationMembership[];\n}\n\n/**\n * Session interface\n */\nexport interface Session {\n id: string;\n userId: string;\n token: string;\n expiresAt?: Date;\n createdAt?: Date;\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Session data with user and session combined\n * Used for efficient retrieval of both user and session in one call\n */\nexport interface SessionData {\n user: User;\n session: Session;\n expiresAt: number;\n}\n\n/**\n * Auth error types\n */\nexport enum AuthErrorType {\n INVALID_CREDENTIALS = 'invalid_credentials',\n USER_NOT_FOUND = 'user_not_found',\n USER_ALREADY_EXISTS = 'user_already_exists',\n INVALID_TOKEN = 'invalid_token',\n TOKEN_EXPIRED = 'token_expired',\n NETWORK_ERROR = 'network_error',\n VALIDATION_ERROR = 'validation_error',\n MFA_REQUIRED = 'mfa_required',\n EMAIL_NOT_VERIFIED = 'email_not_verified',\n PHONE_NOT_VERIFIED = 'phone_not_verified',\n RATE_LIMIT_EXCEEDED = 'rate_limit_exceeded',\n UNKNOWN_ERROR = 'unknown_error',\n}\n\n/**\n * Auth error class\n * \n * Extends Error to provide proper error handling with auth-specific context\n */\nexport class AuthError extends Error {\n public readonly type: AuthErrorType;\n public readonly details?: Record<string, unknown>;\n public readonly code?: string | number;\n public readonly originalError?: unknown;\n\n constructor(\n message: string,\n type: AuthErrorType = AuthErrorType.UNKNOWN_ERROR,\n options?: {\n details?: Record<string, unknown>;\n code?: string | number;\n originalError?: unknown;\n }\n ) {\n super(message);\n this.name = 'AuthError';\n this.type = type;\n this.details = options?.details;\n this.code = options?.code;\n this.originalError = options?.originalError;\n\n // Maintains proper stack trace for where our error was thrown (only available on V8)\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, AuthError);\n }\n }\n}\n\n/**\n * Auth context state\n */\nexport interface AuthContext {\n state: AuthState;\n user: User | null;\n session: Session | null;\n error: AuthError | null;\n isAuthenticated: boolean;\n isLoading: boolean;\n}\n\n/**\n * OAuth provider types\n */\nexport enum OAuthProvider {\n GOOGLE = 'google',\n GITHUB = 'github',\n FACEBOOK = 'facebook',\n TWITTER = 'twitter',\n MICROSOFT = 'microsoft',\n APPLE = 'apple',\n LINKEDIN = 'linkedin',\n DISCORD = 'discord',\n}\n\n/**\n * OAuth configuration\n */\nexport interface OAuthConfig {\n provider: OAuthProvider;\n clientId: string;\n redirectUri: string;\n scope?: string[];\n state?: string;\n}\n\n/**\n * 2FA method types\n */\nexport enum TwoFactorMethod {\n TOTP = 'totp',\n SMS = 'sms',\n EMAIL = 'email',\n BACKUP_CODE = 'backup_code',\n}\n\n/**\n * 2FA configuration\n */\nexport interface TwoFactorConfig {\n method: TwoFactorMethod;\n enabled: boolean;\n verified?: boolean;\n}\n\n/**\n * Passkey/WebAuthn types\n */\nexport interface PasskeyCredential {\n id: string;\n name?: string;\n createdAt?: Date;\n lastUsedAt?: Date;\n}\n\n/**\n * Validation error\n */\nexport interface ValidationError {\n field: string;\n message: string;\n code?: string;\n}\n\n/**\n * Organization interface\n */\nexport interface Organization {\n id: string;\n name: string;\n slug: string;\n logoUrl?: string;\n createdAt?: Date;\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Organization membership interface\n */\nexport interface OrganizationMembership {\n organization: Organization;\n role: 'owner' | 'admin' | 'member';\n permissions?: string[];\n}\n\n","/**\n * Error handling utilities\n */\n\nimport { AuthError, AuthErrorType } from '../types';\n\n/**\n * Create an auth error\n * \n * @deprecated Use `new AuthError()` directly instead\n */\nexport function createAuthError(\n type: AuthErrorType,\n message: string,\n details?: Record<string, unknown>,\n code?: string | number\n): AuthError {\n return new AuthError(message, type, { details, code });\n}\n\n/**\n * Check if an error is an auth error\n */\nexport function isAuthError(error: unknown): error is AuthError {\n return error instanceof AuthError;\n}\n\n/**\n * Convert unknown error to auth error\n */\nexport function toAuthError(error: unknown): AuthError {\n if (isAuthError(error)) {\n return error;\n }\n\n if (error instanceof Error) {\n return new AuthError(error.message, AuthErrorType.UNKNOWN_ERROR, {\n details: {\n originalError: error.name,\n stack: error.stack,\n },\n });\n }\n\n if (typeof error === 'string') {\n return new AuthError(error, AuthErrorType.UNKNOWN_ERROR);\n }\n\n return new AuthError(\n 'An unknown error occurred',\n AuthErrorType.UNKNOWN_ERROR,\n { details: { error } }\n );\n}\n\n/**\n * Check if error is a network error\n */\nexport function isNetworkError(error: unknown): boolean {\n if (error instanceof Error) {\n return (\n error.name === 'NetworkError' ||\n error.message.includes('network') ||\n error.message.includes('fetch')\n );\n }\n return false;\n}\n\n/**\n * Check if error indicates authentication is required\n */\nexport function isUnauthenticatedError(error: unknown): boolean {\n if (isAuthError(error)) {\n return (\n error.type === AuthErrorType.INVALID_TOKEN ||\n error.type === AuthErrorType.TOKEN_EXPIRED\n );\n }\n return false;\n}\n\n/**\n * Check if error requires MFA\n */\nexport function isMFARequiredError(error: unknown): boolean {\n if (isAuthError(error)) {\n return error.type === AuthErrorType.MFA_REQUIRED;\n }\n return false;\n}\n","/**\n * Base auth provider implementation\n */\n\nimport type {\n AuthProvider,\n AuthResponse,\n SignInRequest,\n SignUpRequest,\n UpdateUserRequest,\n PasswordChangeRequest,\n PasswordResetRequest,\n PasswordResetConfirmRequest,\n OAuthSignInRequest,\n OAuthCallbackRequest,\n MagicLinkRequest,\n MagicLinkVerifyRequest,\n PhoneAuthRequest,\n PhoneVerifyRequest,\n TwoFactorSetupRequest,\n TwoFactorSetupResponse,\n TwoFactorVerifyRequest,\n PasskeyRegisterRequest,\n PasskeyAuthRequest,\n User,\n Session,\n SessionData,\n OAuthProvider,\n TwoFactorMethod,\n PasskeyCredential,\n AuthError,\n ProviderConfig,\n RequestContext,\n CookieData,\n} from '../types';\nimport { toAuthError } from '../utils';\n\n/**\n * Base provider class with common functionality\n */\nexport abstract class BaseAuthProvider implements AuthProvider {\n abstract readonly name: string;\n protected config: ProviderConfig = {};\n protected initialized = false;\n\n /**\n * Initialize the provider\n */\n async initialize(config: ProviderConfig): Promise<void> {\n this.config = config;\n this.initialized = true;\n }\n\n /**\n * Ensure provider is initialized\n */\n protected ensureInitialized(): void {\n if (!this.initialized) {\n throw new Error(`Provider ${this.name} is not initialized`);\n }\n }\n\n /**\n * Make HTTP request\n */\n protected async request<T>(\n url: string,\n options: RequestInit = {}\n ): Promise<T> {\n const response = await fetch(url, {\n ...options,\n headers: {\n 'Content-Type': 'application/json',\n ...options.headers,\n },\n });\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({\n message: response.statusText,\n }));\n throw error;\n }\n\n return response.json();\n }\n\n // Abstract methods that must be implemented by subclasses\n abstract signIn(request: SignInRequest): Promise<AuthResponse>;\n abstract signUp(request: SignUpRequest): Promise<AuthResponse>;\n abstract signOut(): Promise<void>;\n abstract getCurrentUser(): Promise<User | null>;\n abstract getCurrentSession(): Promise<Session | null>;\n abstract getCurrentSessionData(): Promise<SessionData | null>;\n abstract refreshSession(): Promise<Session>;\n abstract updateUser(request: UpdateUserRequest): Promise<User>;\n abstract changePassword(request: PasswordChangeRequest): Promise<void>;\n abstract requestPasswordReset(request: PasswordResetRequest): Promise<void>;\n abstract confirmPasswordReset(request: PasswordResetConfirmRequest): Promise<void>;\n abstract oauthSignIn(request: OAuthSignInRequest): Promise<string>;\n abstract oauthCallback(request: OAuthCallbackRequest): Promise<AuthResponse>;\n abstract getOAuthProviders(): Promise<OAuthProvider[]>;\n abstract sendMagicLink(request: MagicLinkRequest): Promise<void>;\n abstract verifyMagicLink(request: MagicLinkVerifyRequest): Promise<AuthResponse>;\n abstract sendPhoneCode(request: PhoneAuthRequest): Promise<void>;\n abstract verifyPhoneCode(request: PhoneVerifyRequest): Promise<AuthResponse>;\n abstract setupTwoFactor(request: TwoFactorSetupRequest): Promise<TwoFactorSetupResponse>;\n abstract verifyTwoFactor(request: TwoFactorVerifyRequest): Promise<AuthResponse>;\n abstract disableTwoFactor(): Promise<void>;\n abstract getTwoFactorStatus(): Promise<TwoFactorMethod[]>;\n abstract registerPasskey(request: PasskeyRegisterRequest): Promise<PasskeyCredential>;\n abstract authenticatePasskey(request: PasskeyAuthRequest): Promise<AuthResponse>;\n abstract listPasskeys(): Promise<PasskeyCredential[]>;\n abstract deletePasskey(credentialId: string): Promise<void>;\n\n /**\n * Optional edge runtime context methods\n * Default implementations do nothing - subclasses can override\n */\n setContext?(context: RequestContext): void;\n getCookies?(): CookieData[];\n clearContext?(): void;\n\n /**\n * Normalize error to AuthError\n */\n normalizeError(error: unknown): AuthError {\n return toAuthError(error);\n }\n}\n\n"]}