@authsome/ui-core 0.1.3 → 0.1.4
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/dist/adapters/index.d.mts +9 -1
- package/dist/adapters/index.d.ts +9 -1
- package/dist/adapters/index.js.map +1 -1
- package/dist/adapters/index.mjs.map +1 -1
- package/dist/index.d.mts +39 -3
- package/dist/index.d.ts +39 -3
- package/dist/index.js +105 -0
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +101 -1
- package/dist/index.mjs.map +1 -1
- package/dist/{provider-C8km9A8U.d.mts → provider-KGfwPsXv.d.mts} +58 -1
- package/dist/{provider-C8km9A8U.d.ts → provider-KGfwPsXv.d.ts} +58 -1
- package/dist/types/index.d.mts +1 -1
- package/dist/types/index.d.ts +1 -1
- package/dist/types/index.js.map +1 -1
- package/dist/types/index.mjs.map +1 -1
- package/package.json +11 -12
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { c as AuthProvider,
|
|
1
|
+
import { c as AuthProvider, E as ProviderConfig, S as SignInRequest, D 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-KGfwPsXv.mjs';
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* Base auth provider implementation
|
|
@@ -28,6 +28,7 @@ declare abstract class BaseAuthProvider implements AuthProvider {
|
|
|
28
28
|
abstract signOut(): Promise<void>;
|
|
29
29
|
abstract getCurrentUser(): Promise<User | null>;
|
|
30
30
|
abstract getCurrentSession(): Promise<Session | null>;
|
|
31
|
+
abstract getCurrentSessionData(): Promise<SessionData | null>;
|
|
31
32
|
abstract refreshSession(): Promise<Session>;
|
|
32
33
|
abstract updateUser(request: UpdateUserRequest): Promise<User>;
|
|
33
34
|
abstract changePassword(request: PasswordChangeRequest): Promise<void>;
|
|
@@ -48,6 +49,13 @@ declare abstract class BaseAuthProvider implements AuthProvider {
|
|
|
48
49
|
abstract authenticatePasskey(request: PasskeyAuthRequest): Promise<AuthResponse>;
|
|
49
50
|
abstract listPasskeys(): Promise<PasskeyCredential[]>;
|
|
50
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;
|
|
51
59
|
/**
|
|
52
60
|
* Normalize error to AuthError
|
|
53
61
|
*/
|
package/dist/adapters/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { c as AuthProvider,
|
|
1
|
+
import { c as AuthProvider, E as ProviderConfig, S as SignInRequest, D 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-KGfwPsXv.js';
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* Base auth provider implementation
|
|
@@ -28,6 +28,7 @@ declare abstract class BaseAuthProvider implements AuthProvider {
|
|
|
28
28
|
abstract signOut(): Promise<void>;
|
|
29
29
|
abstract getCurrentUser(): Promise<User | null>;
|
|
30
30
|
abstract getCurrentSession(): Promise<Session | null>;
|
|
31
|
+
abstract getCurrentSessionData(): Promise<SessionData | null>;
|
|
31
32
|
abstract refreshSession(): Promise<Session>;
|
|
32
33
|
abstract updateUser(request: UpdateUserRequest): Promise<User>;
|
|
33
34
|
abstract changePassword(request: PasswordChangeRequest): Promise<void>;
|
|
@@ -48,6 +49,13 @@ declare abstract class BaseAuthProvider implements AuthProvider {
|
|
|
48
49
|
abstract authenticatePasskey(request: PasskeyAuthRequest): Promise<AuthResponse>;
|
|
49
50
|
abstract listPasskeys(): Promise<PasskeyCredential[]>;
|
|
50
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;
|
|
51
59
|
/**
|
|
52
60
|
* Normalize error to AuthError
|
|
53
61
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/types/auth.ts","../../src/utils/errors.ts","../../src/adapters/base-provider.ts"],"names":[],"mappings":";;;AAyEO,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;;;AC7EO,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;;;AChBO,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,EAgCA,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 * 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 OAuthProvider,\n TwoFactorMethod,\n PasskeyCredential,\n AuthError,\n ProviderConfig,\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 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 * Normalize error to AuthError\n */\n normalizeError(error: unknown): AuthError {\n return toAuthError(error);\n }\n}\n\n"]}
|
|
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 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/types/auth.ts","../../src/utils/errors.ts","../../src/adapters/base-provider.ts"],"names":[],"mappings":";AAyEO,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;;;AC7EO,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;;;AChBO,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,EAgCA,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 * 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 OAuthProvider,\n TwoFactorMethod,\n PasskeyCredential,\n AuthError,\n ProviderConfig,\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 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 * Normalize error to AuthError\n */\n normalizeError(error: unknown): AuthError {\n return toAuthError(error);\n }\n}\n\n"]}
|
|
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"]}
|
package/dist/index.d.mts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { A as AuthErrorType, a as AuthError, V as ValidationError, b as AuthContext, c as AuthProvider, S as SignInRequest, d as SignUpRequest, 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 Organization, s as OrganizationMembership, t as User, u as Session } from './provider-
|
|
2
|
-
export {
|
|
1
|
+
import { A as AuthErrorType, a as AuthError, V as ValidationError, C as CookieData, b as AuthContext, c as AuthProvider, S as SignInRequest, d as SignUpRequest, 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 Organization, s as OrganizationMembership, t as User, u as Session } from './provider-KGfwPsXv.mjs';
|
|
2
|
+
export { D as AuthResponse, v as AuthState, z as FieldDefinition, F as FieldValidation, x as OAuthConfig, E as ProviderConfig, R as RequestContext, w as SessionData, B as SignupFieldsResponse, y as TwoFactorConfig } from './provider-KGfwPsXv.mjs';
|
|
3
3
|
import { Storage, Observable, Unsubscribe } from './types/index.mjs';
|
|
4
4
|
export { Listener, LocalStorageAdapter, MemoryStorageAdapter, SessionStorageAdapter } from './types/index.mjs';
|
|
5
5
|
export { BaseAuthProvider } from './adapters/index.mjs';
|
|
@@ -262,6 +262,42 @@ declare class TokenManager {
|
|
|
262
262
|
private decodeToken;
|
|
263
263
|
}
|
|
264
264
|
|
|
265
|
+
/**
|
|
266
|
+
* Cookie utility functions
|
|
267
|
+
* Framework-agnostic helpers for cookie parsing and serialization
|
|
268
|
+
*/
|
|
269
|
+
|
|
270
|
+
/**
|
|
271
|
+
* Parse Set-Cookie header value into CookieData
|
|
272
|
+
* @param setCookieHeader - The Set-Cookie header value
|
|
273
|
+
* @returns Parsed cookie data
|
|
274
|
+
*/
|
|
275
|
+
declare function parseCookie(setCookieHeader: string): CookieData | null;
|
|
276
|
+
/**
|
|
277
|
+
* Extract multiple cookies from Set-Cookie headers
|
|
278
|
+
* @param setCookieHeaders - Array of Set-Cookie header values or single string
|
|
279
|
+
* @returns Array of parsed cookies
|
|
280
|
+
*/
|
|
281
|
+
declare function extractCookiesFromHeaders(setCookieHeaders: string | string[]): CookieData[];
|
|
282
|
+
/**
|
|
283
|
+
* Serialize a CookieData object into a Set-Cookie header value
|
|
284
|
+
* @param cookie - The cookie data to serialize
|
|
285
|
+
* @returns Set-Cookie header value
|
|
286
|
+
*/
|
|
287
|
+
declare function serializeCookie(cookie: CookieData): string;
|
|
288
|
+
/**
|
|
289
|
+
* Parse Cookie header value into key-value pairs
|
|
290
|
+
* @param cookieHeader - The Cookie header value
|
|
291
|
+
* @returns Object with cookie name-value pairs
|
|
292
|
+
*/
|
|
293
|
+
declare function parseCookieOptions(cookieHeader: string): Record<string, string>;
|
|
294
|
+
/**
|
|
295
|
+
* Convert cookie object to Cookie header string
|
|
296
|
+
* @param cookies - Object with cookie name-value pairs
|
|
297
|
+
* @returns Cookie header value
|
|
298
|
+
*/
|
|
299
|
+
declare function serializeCookies(cookies: Record<string, string>): string;
|
|
300
|
+
|
|
265
301
|
/**
|
|
266
302
|
* Locale utility functions
|
|
267
303
|
*/
|
|
@@ -727,4 +763,4 @@ declare const predefinedFlows: {
|
|
|
727
763
|
password_reset_flow: FlowConfig;
|
|
728
764
|
};
|
|
729
765
|
|
|
730
|
-
export { AuthClient, type AuthClientConfig, AuthContext, AuthError, AuthErrorType, type AuthLocale, AuthProvider, type DeepPartial, FlowAction, type FlowConfig, FlowConfigType, FlowEngine, type FlowEvent, type FlowState, FlowStep, type FlowTransition, MagicLinkRequest, MagicLinkVerifyRequest, OAuthCallbackRequest, OAuthProvider, OAuthSignInRequest, Observable, Organization, OrganizationMembership, PasskeyAuthRequest, PasskeyCredential, PasskeyRegisterRequest, PasswordChangeRequest, PasswordResetConfirmRequest, PasswordResetRequest, PhoneAuthRequest, PhoneVerifyRequest, Session, SignInRequest, SignUpRequest, Storage, TokenManager, TwoFactorMethod, TwoFactorSetupRequest, TwoFactorSetupResponse, TwoFactorVerifyRequest, Unsubscribe, UpdateUserRequest, User, ValidationError, completeSignUpFlow, createAuthError, createLocale, defaultLocale, getFlowConfig, interpolate, isAuthError, isMFARequiredError, isNetworkError, isUnauthenticatedError, magicLinkFlow, oauthSignInFlow, passwordResetFlow, phoneAuthFlow, predefinedFlows, signInWithMFAFlow, simpleSignInFlow, toAuthError, validate2FACode, validateEmail, validatePassword, validatePhone, validateRequired, validateUsername };
|
|
766
|
+
export { AuthClient, type AuthClientConfig, AuthContext, AuthError, AuthErrorType, type AuthLocale, AuthProvider, CookieData, type DeepPartial, FlowAction, type FlowConfig, FlowConfigType, FlowEngine, type FlowEvent, type FlowState, FlowStep, type FlowTransition, MagicLinkRequest, MagicLinkVerifyRequest, OAuthCallbackRequest, OAuthProvider, OAuthSignInRequest, Observable, Organization, OrganizationMembership, PasskeyAuthRequest, PasskeyCredential, PasskeyRegisterRequest, PasswordChangeRequest, PasswordResetConfirmRequest, PasswordResetRequest, PhoneAuthRequest, PhoneVerifyRequest, Session, SignInRequest, SignUpRequest, Storage, TokenManager, TwoFactorMethod, TwoFactorSetupRequest, TwoFactorSetupResponse, TwoFactorVerifyRequest, Unsubscribe, UpdateUserRequest, User, ValidationError, completeSignUpFlow, createAuthError, createLocale, defaultLocale, extractCookiesFromHeaders, getFlowConfig, interpolate, isAuthError, isMFARequiredError, isNetworkError, isUnauthenticatedError, magicLinkFlow, oauthSignInFlow, parseCookie, parseCookieOptions, passwordResetFlow, phoneAuthFlow, predefinedFlows, serializeCookie, serializeCookies, signInWithMFAFlow, simpleSignInFlow, toAuthError, validate2FACode, validateEmail, validatePassword, validatePhone, validateRequired, validateUsername };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { A as AuthErrorType, a as AuthError, V as ValidationError, b as AuthContext, c as AuthProvider, S as SignInRequest, d as SignUpRequest, 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 Organization, s as OrganizationMembership, t as User, u as Session } from './provider-
|
|
2
|
-
export {
|
|
1
|
+
import { A as AuthErrorType, a as AuthError, V as ValidationError, C as CookieData, b as AuthContext, c as AuthProvider, S as SignInRequest, d as SignUpRequest, 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 Organization, s as OrganizationMembership, t as User, u as Session } from './provider-KGfwPsXv.js';
|
|
2
|
+
export { D as AuthResponse, v as AuthState, z as FieldDefinition, F as FieldValidation, x as OAuthConfig, E as ProviderConfig, R as RequestContext, w as SessionData, B as SignupFieldsResponse, y as TwoFactorConfig } from './provider-KGfwPsXv.js';
|
|
3
3
|
import { Storage, Observable, Unsubscribe } from './types/index.js';
|
|
4
4
|
export { Listener, LocalStorageAdapter, MemoryStorageAdapter, SessionStorageAdapter } from './types/index.js';
|
|
5
5
|
export { BaseAuthProvider } from './adapters/index.js';
|
|
@@ -262,6 +262,42 @@ declare class TokenManager {
|
|
|
262
262
|
private decodeToken;
|
|
263
263
|
}
|
|
264
264
|
|
|
265
|
+
/**
|
|
266
|
+
* Cookie utility functions
|
|
267
|
+
* Framework-agnostic helpers for cookie parsing and serialization
|
|
268
|
+
*/
|
|
269
|
+
|
|
270
|
+
/**
|
|
271
|
+
* Parse Set-Cookie header value into CookieData
|
|
272
|
+
* @param setCookieHeader - The Set-Cookie header value
|
|
273
|
+
* @returns Parsed cookie data
|
|
274
|
+
*/
|
|
275
|
+
declare function parseCookie(setCookieHeader: string): CookieData | null;
|
|
276
|
+
/**
|
|
277
|
+
* Extract multiple cookies from Set-Cookie headers
|
|
278
|
+
* @param setCookieHeaders - Array of Set-Cookie header values or single string
|
|
279
|
+
* @returns Array of parsed cookies
|
|
280
|
+
*/
|
|
281
|
+
declare function extractCookiesFromHeaders(setCookieHeaders: string | string[]): CookieData[];
|
|
282
|
+
/**
|
|
283
|
+
* Serialize a CookieData object into a Set-Cookie header value
|
|
284
|
+
* @param cookie - The cookie data to serialize
|
|
285
|
+
* @returns Set-Cookie header value
|
|
286
|
+
*/
|
|
287
|
+
declare function serializeCookie(cookie: CookieData): string;
|
|
288
|
+
/**
|
|
289
|
+
* Parse Cookie header value into key-value pairs
|
|
290
|
+
* @param cookieHeader - The Cookie header value
|
|
291
|
+
* @returns Object with cookie name-value pairs
|
|
292
|
+
*/
|
|
293
|
+
declare function parseCookieOptions(cookieHeader: string): Record<string, string>;
|
|
294
|
+
/**
|
|
295
|
+
* Convert cookie object to Cookie header string
|
|
296
|
+
* @param cookies - Object with cookie name-value pairs
|
|
297
|
+
* @returns Cookie header value
|
|
298
|
+
*/
|
|
299
|
+
declare function serializeCookies(cookies: Record<string, string>): string;
|
|
300
|
+
|
|
265
301
|
/**
|
|
266
302
|
* Locale utility functions
|
|
267
303
|
*/
|
|
@@ -727,4 +763,4 @@ declare const predefinedFlows: {
|
|
|
727
763
|
password_reset_flow: FlowConfig;
|
|
728
764
|
};
|
|
729
765
|
|
|
730
|
-
export { AuthClient, type AuthClientConfig, AuthContext, AuthError, AuthErrorType, type AuthLocale, AuthProvider, type DeepPartial, FlowAction, type FlowConfig, FlowConfigType, FlowEngine, type FlowEvent, type FlowState, FlowStep, type FlowTransition, MagicLinkRequest, MagicLinkVerifyRequest, OAuthCallbackRequest, OAuthProvider, OAuthSignInRequest, Observable, Organization, OrganizationMembership, PasskeyAuthRequest, PasskeyCredential, PasskeyRegisterRequest, PasswordChangeRequest, PasswordResetConfirmRequest, PasswordResetRequest, PhoneAuthRequest, PhoneVerifyRequest, Session, SignInRequest, SignUpRequest, Storage, TokenManager, TwoFactorMethod, TwoFactorSetupRequest, TwoFactorSetupResponse, TwoFactorVerifyRequest, Unsubscribe, UpdateUserRequest, User, ValidationError, completeSignUpFlow, createAuthError, createLocale, defaultLocale, getFlowConfig, interpolate, isAuthError, isMFARequiredError, isNetworkError, isUnauthenticatedError, magicLinkFlow, oauthSignInFlow, passwordResetFlow, phoneAuthFlow, predefinedFlows, signInWithMFAFlow, simpleSignInFlow, toAuthError, validate2FACode, validateEmail, validatePassword, validatePhone, validateRequired, validateUsername };
|
|
766
|
+
export { AuthClient, type AuthClientConfig, AuthContext, AuthError, AuthErrorType, type AuthLocale, AuthProvider, CookieData, type DeepPartial, FlowAction, type FlowConfig, FlowConfigType, FlowEngine, type FlowEvent, type FlowState, FlowStep, type FlowTransition, MagicLinkRequest, MagicLinkVerifyRequest, OAuthCallbackRequest, OAuthProvider, OAuthSignInRequest, Observable, Organization, OrganizationMembership, PasskeyAuthRequest, PasskeyCredential, PasskeyRegisterRequest, PasswordChangeRequest, PasswordResetConfirmRequest, PasswordResetRequest, PhoneAuthRequest, PhoneVerifyRequest, Session, SignInRequest, SignUpRequest, Storage, TokenManager, TwoFactorMethod, TwoFactorSetupRequest, TwoFactorSetupResponse, TwoFactorVerifyRequest, Unsubscribe, UpdateUserRequest, User, ValidationError, completeSignUpFlow, createAuthError, createLocale, defaultLocale, extractCookiesFromHeaders, getFlowConfig, interpolate, isAuthError, isMFARequiredError, isNetworkError, isUnauthenticatedError, magicLinkFlow, oauthSignInFlow, parseCookie, parseCookieOptions, passwordResetFlow, phoneAuthFlow, predefinedFlows, serializeCookie, serializeCookies, signInWithMFAFlow, simpleSignInFlow, toAuthError, validate2FACode, validateEmail, validatePassword, validatePhone, validateRequired, validateUsername };
|
package/dist/index.js
CHANGED
|
@@ -554,6 +554,106 @@ var TokenManager = class {
|
|
|
554
554
|
}
|
|
555
555
|
};
|
|
556
556
|
|
|
557
|
+
// src/utils/cookies.ts
|
|
558
|
+
function parseCookie(setCookieHeader) {
|
|
559
|
+
if (!setCookieHeader) return null;
|
|
560
|
+
const parts = setCookieHeader.split(";").map((p) => p.trim());
|
|
561
|
+
if (parts.length === 0) return null;
|
|
562
|
+
const [nameValue] = parts;
|
|
563
|
+
const [name, value] = nameValue.split("=");
|
|
564
|
+
if (!name || value === void 0) return null;
|
|
565
|
+
const cookieData = { name, value };
|
|
566
|
+
const options = {};
|
|
567
|
+
for (let i = 1; i < parts.length; i++) {
|
|
568
|
+
const part = parts[i];
|
|
569
|
+
const lowerPart = part.toLowerCase();
|
|
570
|
+
if (lowerPart === "httponly") {
|
|
571
|
+
options.httpOnly = true;
|
|
572
|
+
} else if (lowerPart === "secure") {
|
|
573
|
+
options.secure = true;
|
|
574
|
+
} else if (lowerPart.startsWith("path=")) {
|
|
575
|
+
options.path = part.substring(5);
|
|
576
|
+
} else if (lowerPart.startsWith("domain=")) {
|
|
577
|
+
options.domain = part.substring(7);
|
|
578
|
+
} else if (lowerPart.startsWith("max-age=")) {
|
|
579
|
+
const maxAge = parseInt(part.substring(8), 10);
|
|
580
|
+
if (!isNaN(maxAge)) {
|
|
581
|
+
options.maxAge = maxAge;
|
|
582
|
+
}
|
|
583
|
+
} else if (lowerPart.startsWith("expires=")) {
|
|
584
|
+
const expiresStr = part.substring(8);
|
|
585
|
+
const expiresDate = new Date(expiresStr);
|
|
586
|
+
if (!isNaN(expiresDate.getTime())) {
|
|
587
|
+
options.expires = expiresDate;
|
|
588
|
+
}
|
|
589
|
+
} else if (lowerPart.startsWith("samesite=")) {
|
|
590
|
+
const sameSiteValue = lowerPart.substring(9);
|
|
591
|
+
if (sameSiteValue === "strict" || sameSiteValue === "lax" || sameSiteValue === "none") {
|
|
592
|
+
options.sameSite = sameSiteValue;
|
|
593
|
+
}
|
|
594
|
+
}
|
|
595
|
+
}
|
|
596
|
+
if (Object.keys(options).length > 0) {
|
|
597
|
+
cookieData.options = options;
|
|
598
|
+
}
|
|
599
|
+
return cookieData;
|
|
600
|
+
}
|
|
601
|
+
function extractCookiesFromHeaders(setCookieHeaders) {
|
|
602
|
+
const headers = Array.isArray(setCookieHeaders) ? setCookieHeaders : [setCookieHeaders];
|
|
603
|
+
const cookies = [];
|
|
604
|
+
for (const header of headers) {
|
|
605
|
+
const cookie = parseCookie(header);
|
|
606
|
+
if (cookie) {
|
|
607
|
+
cookies.push(cookie);
|
|
608
|
+
}
|
|
609
|
+
}
|
|
610
|
+
return cookies;
|
|
611
|
+
}
|
|
612
|
+
function serializeCookie(cookie) {
|
|
613
|
+
const parts = [`${cookie.name}=${cookie.value}`];
|
|
614
|
+
if (cookie.options) {
|
|
615
|
+
const opts = cookie.options;
|
|
616
|
+
if (opts.path) {
|
|
617
|
+
parts.push(`Path=${opts.path}`);
|
|
618
|
+
}
|
|
619
|
+
if (opts.domain) {
|
|
620
|
+
parts.push(`Domain=${opts.domain}`);
|
|
621
|
+
}
|
|
622
|
+
if (opts.expires) {
|
|
623
|
+
parts.push(`Expires=${opts.expires.toUTCString()}`);
|
|
624
|
+
}
|
|
625
|
+
if (opts.maxAge !== void 0) {
|
|
626
|
+
parts.push(`Max-Age=${opts.maxAge}`);
|
|
627
|
+
}
|
|
628
|
+
if (opts.httpOnly) {
|
|
629
|
+
parts.push("HttpOnly");
|
|
630
|
+
}
|
|
631
|
+
if (opts.secure) {
|
|
632
|
+
parts.push("Secure");
|
|
633
|
+
}
|
|
634
|
+
if (opts.sameSite) {
|
|
635
|
+
const sameSite = opts.sameSite.charAt(0).toUpperCase() + opts.sameSite.slice(1);
|
|
636
|
+
parts.push(`SameSite=${sameSite}`);
|
|
637
|
+
}
|
|
638
|
+
}
|
|
639
|
+
return parts.join("; ");
|
|
640
|
+
}
|
|
641
|
+
function parseCookieOptions(cookieHeader) {
|
|
642
|
+
const cookies = {};
|
|
643
|
+
if (!cookieHeader) return cookies;
|
|
644
|
+
const pairs = cookieHeader.split(";").map((p) => p.trim());
|
|
645
|
+
for (const pair of pairs) {
|
|
646
|
+
const [name, value] = pair.split("=");
|
|
647
|
+
if (name && value !== void 0) {
|
|
648
|
+
cookies[name.trim()] = value.trim();
|
|
649
|
+
}
|
|
650
|
+
}
|
|
651
|
+
return cookies;
|
|
652
|
+
}
|
|
653
|
+
function serializeCookies(cookies) {
|
|
654
|
+
return Object.entries(cookies).map(([key, value]) => `${key}=${value}`).join("; ");
|
|
655
|
+
}
|
|
656
|
+
|
|
557
657
|
// src/adapters/base-provider.ts
|
|
558
658
|
var BaseAuthProvider = class {
|
|
559
659
|
constructor() {
|
|
@@ -1606,6 +1706,7 @@ exports.completeSignUpFlow = completeSignUpFlow;
|
|
|
1606
1706
|
exports.createAuthError = createAuthError;
|
|
1607
1707
|
exports.createLocale = createLocale;
|
|
1608
1708
|
exports.defaultLocale = defaultLocale;
|
|
1709
|
+
exports.extractCookiesFromHeaders = extractCookiesFromHeaders;
|
|
1609
1710
|
exports.getFlowConfig = getFlowConfig;
|
|
1610
1711
|
exports.interpolate = interpolate;
|
|
1611
1712
|
exports.isAuthError = isAuthError;
|
|
@@ -1614,9 +1715,13 @@ exports.isNetworkError = isNetworkError;
|
|
|
1614
1715
|
exports.isUnauthenticatedError = isUnauthenticatedError;
|
|
1615
1716
|
exports.magicLinkFlow = magicLinkFlow;
|
|
1616
1717
|
exports.oauthSignInFlow = oauthSignInFlow;
|
|
1718
|
+
exports.parseCookie = parseCookie;
|
|
1719
|
+
exports.parseCookieOptions = parseCookieOptions;
|
|
1617
1720
|
exports.passwordResetFlow = passwordResetFlow;
|
|
1618
1721
|
exports.phoneAuthFlow = phoneAuthFlow;
|
|
1619
1722
|
exports.predefinedFlows = predefinedFlows;
|
|
1723
|
+
exports.serializeCookie = serializeCookie;
|
|
1724
|
+
exports.serializeCookies = serializeCookies;
|
|
1620
1725
|
exports.signInWithMFAFlow = signInWithMFAFlow;
|
|
1621
1726
|
exports.simpleSignInFlow = simpleSignInFlow;
|
|
1622
1727
|
exports.toAuthError = toAuthError;
|