@massimo.mazzoleni/cognito-max 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.
Files changed (64) hide show
  1. package/README.md +2410 -0
  2. package/dist/chunk-AD7T42HJ.js +3 -0
  3. package/dist/chunk-AD7T42HJ.js.map +1 -0
  4. package/dist/chunk-DKPFVGTY.js +683 -0
  5. package/dist/chunk-DKPFVGTY.js.map +1 -0
  6. package/dist/chunk-N4OQLBV6.js +135 -0
  7. package/dist/chunk-N4OQLBV6.js.map +1 -0
  8. package/dist/client-63FraVdm.d.ts +69 -0
  9. package/dist/client-BAoL8h4E.d.cts +69 -0
  10. package/dist/core/index.cjs +696 -0
  11. package/dist/core/index.cjs.map +1 -0
  12. package/dist/core/index.d.cts +3 -0
  13. package/dist/core/index.d.ts +3 -0
  14. package/dist/core/index.js +4 -0
  15. package/dist/core/index.js.map +1 -0
  16. package/dist/errors-BkUDHleb.d.cts +22 -0
  17. package/dist/errors-BkUDHleb.d.ts +22 -0
  18. package/dist/index.cjs +696 -0
  19. package/dist/index.cjs.map +1 -0
  20. package/dist/index.d.cts +3 -0
  21. package/dist/index.d.ts +3 -0
  22. package/dist/index.js +4 -0
  23. package/dist/index.js.map +1 -0
  24. package/dist/react/index.cjs +844 -0
  25. package/dist/react/index.cjs.map +1 -0
  26. package/dist/react/index.d.cts +104 -0
  27. package/dist/react/index.d.ts +104 -0
  28. package/dist/react/index.js +64 -0
  29. package/dist/react/index.js.map +1 -0
  30. package/dist/types-bxA1vonL.d.cts +113 -0
  31. package/dist/types-bxA1vonL.d.ts +113 -0
  32. package/dist/ui/index.cjs +1183 -0
  33. package/dist/ui/index.cjs.map +1 -0
  34. package/dist/ui/index.d.cts +241 -0
  35. package/dist/ui/index.d.ts +241 -0
  36. package/dist/ui/index.js +1109 -0
  37. package/dist/ui/index.js.map +1 -0
  38. package/package.json +81 -0
  39. package/src/core/client.ts +604 -0
  40. package/src/core/errors.ts +91 -0
  41. package/src/core/event-bus.ts +41 -0
  42. package/src/core/index.ts +5 -0
  43. package/src/core/internal/converters.ts +32 -0
  44. package/src/core/storage.ts +79 -0
  45. package/src/core/types.ts +87 -0
  46. package/src/index.ts +1 -0
  47. package/src/react/components/ProtectedRoute.tsx +56 -0
  48. package/src/react/context.tsx +126 -0
  49. package/src/react/hooks/useAuth.ts +75 -0
  50. package/src/react/hooks/useMfa.ts +19 -0
  51. package/src/react/hooks/useSession.ts +16 -0
  52. package/src/react/hooks/useUser.ts +24 -0
  53. package/src/react/index.ts +10 -0
  54. package/src/ui/components/ChangePasswordForm.tsx +105 -0
  55. package/src/ui/components/ForgotPasswordForm.tsx +159 -0
  56. package/src/ui/components/MfaSetupWizard.tsx +136 -0
  57. package/src/ui/components/RegisterForm.tsx +159 -0
  58. package/src/ui/components/SignInForm.tsx +296 -0
  59. package/src/ui/hooks/useChangePasswordForm.ts +81 -0
  60. package/src/ui/hooks/useForgotPasswordForm.ts +109 -0
  61. package/src/ui/hooks/useMfaSetup.ts +93 -0
  62. package/src/ui/hooks/useRegisterForm.ts +120 -0
  63. package/src/ui/hooks/useSignInForm.ts +245 -0
  64. package/src/ui/index.ts +31 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/core/event-bus.ts","../../src/core/errors.ts","../../src/core/storage.ts","../../src/core/internal/converters.ts","../../src/core/client.ts","../../src/react/context.tsx","../../src/react/hooks/useAuth.ts","../../src/react/hooks/useSession.ts","../../src/react/hooks/useUser.ts","../../src/react/hooks/useMfa.ts","../../src/react/components/ProtectedRoute.tsx"],"names":["CognitoUserPool","AuthenticationDetails","CognitoUserAttribute","GetUserCommand","CognitoIdentityProviderClient","CognitoUser","CognitoRefreshToken","createContext","useContext","useState","useEffect","useMemo","jsx","Fragment"],"mappings":"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","file":"index.cjs","sourcesContent":["type Listener<T> = T extends void ? () => void : (payload: T) => void\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport class TypedEventEmitter<TEvents extends Record<keyof TEvents, any>> {\n private readonly _listeners = new Map<keyof TEvents, Set<(...args: any[]) => void>>()\n\n on<K extends keyof TEvents>(event: K, listener: Listener<TEvents[K]>): () => void {\n if (!this._listeners.has(event)) {\n this._listeners.set(event, new Set())\n }\n this._listeners.get(event)!.add(listener as (...args: any[]) => void)\n return () => this.off(event, listener)\n }\n\n off<K extends keyof TEvents>(event: K, listener: Listener<TEvents[K]>): void {\n this._listeners.get(event)?.delete(listener as (...args: any[]) => void)\n }\n\n once<K extends keyof TEvents>(event: K, listener: Listener<TEvents[K]>): () => void {\n const unsub = this.on(event, ((...args: any[]) => {\n unsub()\n ;(listener as any)(...args)\n }) as Listener<TEvents[K]>)\n return unsub\n }\n\n protected emit<K extends keyof TEvents>(\n event: K,\n ...args: TEvents[K] extends void ? [] : [TEvents[K]]\n ): void {\n this._listeners.get(event)?.forEach(l => l(...args))\n }\n\n removeAllListeners(event?: keyof TEvents): void {\n if (event !== undefined) {\n this._listeners.delete(event)\n } else {\n this._listeners.clear()\n }\n }\n}\n","export type AuthErrorCode =\n | 'NOT_AUTHORIZED'\n | 'USER_NOT_FOUND'\n | 'USER_NOT_CONFIRMED'\n | 'INVALID_PARAMETER'\n | 'INVALID_PASSWORD'\n | 'CODE_MISMATCH'\n | 'EXPIRED_CODE'\n | 'CODE_DELIVERY_FAILURE'\n | 'LIMIT_EXCEEDED'\n | 'TOO_MANY_REQUESTS'\n | 'TOO_MANY_FAILED_ATTEMPTS'\n | 'PASSWORD_RESET_REQUIRED'\n | 'MFA_METHOD_NOT_FOUND'\n | 'SOFTWARE_TOKEN_MFA_NOT_FOUND'\n | 'SESSION_EXPIRED'\n | 'NETWORK_ERROR'\n | 'UNKNOWN'\n\nexport class CognitoAuthError extends Error {\n override readonly name = 'CognitoAuthError'\n\n constructor(\n message: string,\n public readonly code: AuthErrorCode,\n public readonly originalError?: unknown,\n ) {\n super(message)\n Object.setPrototypeOf(this, new.target.prototype)\n }\n}\n\nexport class SessionExpiredError extends CognitoAuthError {\n constructor() {\n super('La sessione è scaduta, effettua nuovamente il login', 'SESSION_EXPIRED')\n Object.setPrototypeOf(this, new.target.prototype)\n }\n}\n\nexport class NotAuthorizedError extends CognitoAuthError {\n constructor(message = 'Credenziali non valide') {\n super(message, 'NOT_AUTHORIZED')\n Object.setPrototypeOf(this, new.target.prototype)\n }\n}\n\nexport class UserNotConfirmedError extends CognitoAuthError {\n constructor() {\n super('Account non confermato. Controlla la tua email.', 'USER_NOT_CONFIRMED')\n Object.setPrototypeOf(this, new.target.prototype)\n }\n}\n\nexport class InvalidCodeError extends CognitoAuthError {\n constructor(expired = false) {\n super(\n expired ? 'Il codice è scaduto' : 'Codice non valido',\n expired ? 'EXPIRED_CODE' : 'CODE_MISMATCH',\n )\n Object.setPrototypeOf(this, new.target.prototype)\n }\n}\n\n// Maps raw Cognito SDK error names to our typed errors\nexport function mapCognitoError(error: unknown): CognitoAuthError {\n if (error instanceof CognitoAuthError) return error\n\n const name: string = (error as any)?.name ?? (error as any)?.code ?? ''\n const message: string = (error as any)?.message ?? 'Si è verificato un errore di autenticazione'\n\n const codeMap: Record<string, AuthErrorCode> = {\n NotAuthorizedException: 'NOT_AUTHORIZED',\n UserNotFoundException: 'USER_NOT_FOUND',\n UserNotConfirmedException: 'USER_NOT_CONFIRMED',\n InvalidParameterException: 'INVALID_PARAMETER',\n InvalidPasswordException: 'INVALID_PASSWORD',\n CodeMismatchException: 'CODE_MISMATCH',\n ExpiredCodeException: 'EXPIRED_CODE',\n CodeDeliveryFailureException: 'CODE_DELIVERY_FAILURE',\n LimitExceededException: 'LIMIT_EXCEEDED',\n TooManyRequestsException: 'TOO_MANY_REQUESTS',\n TooManyFailedAttemptsException: 'TOO_MANY_FAILED_ATTEMPTS',\n PasswordResetRequiredException: 'PASSWORD_RESET_REQUIRED',\n MFAMethodNotFoundException: 'MFA_METHOD_NOT_FOUND',\n SoftwareTokenMFANotFoundException: 'SOFTWARE_TOKEN_MFA_NOT_FOUND',\n NetworkError: 'NETWORK_ERROR',\n FetchError: 'NETWORK_ERROR',\n }\n\n return new CognitoAuthError(message, codeMap[name] ?? 'UNKNOWN', error)\n}\n","export interface StorageAdapter {\n getItem(key: string): string | null\n setItem(key: string, value: string): void\n removeItem(key: string): void\n clear?(): void\n}\n\nexport class LocalStorageAdapter implements StorageAdapter {\n getItem(key: string): string | null {\n return localStorage.getItem(key)\n }\n setItem(key: string, value: string): void {\n localStorage.setItem(key, value)\n }\n removeItem(key: string): void {\n localStorage.removeItem(key)\n }\n clear(): void {\n localStorage.clear()\n }\n}\n\nexport class SessionStorageAdapter implements StorageAdapter {\n getItem(key: string): string | null {\n return sessionStorage.getItem(key)\n }\n setItem(key: string, value: string): void {\n sessionStorage.setItem(key, value)\n }\n removeItem(key: string): void {\n sessionStorage.removeItem(key)\n }\n clear(): void {\n sessionStorage.clear()\n }\n}\n\n// Safe for SSR / Node.js environments\nexport class InMemoryStorageAdapter implements StorageAdapter {\n private readonly store = new Map<string, string>()\n\n getItem(key: string): string | null {\n return this.store.get(key) ?? null\n }\n setItem(key: string, value: string): void {\n this.store.set(key, value)\n }\n removeItem(key: string): void {\n this.store.delete(key)\n }\n clear(): void {\n this.store.clear()\n }\n}\n\n// Uses localStorage when available, falls back to in-memory (e.g. SSR)\nexport class AutoStorageAdapter implements StorageAdapter {\n private readonly delegate: StorageAdapter\n\n constructor() {\n this.delegate =\n typeof window !== 'undefined' && window.localStorage\n ? new LocalStorageAdapter()\n : new InMemoryStorageAdapter()\n }\n\n getItem(key: string): string | null {\n return this.delegate.getItem(key)\n }\n setItem(key: string, value: string): void {\n this.delegate.setItem(key, value)\n }\n removeItem(key: string): void {\n this.delegate.removeItem(key)\n }\n clear(): void {\n this.delegate.clear?.()\n }\n}\n","import type { CognitoUserSession } from 'amazon-cognito-identity-js'\nimport type { AuthSession, AuthUser } from '../types'\n\nexport function buildAuthSession(session: CognitoUserSession): AuthSession {\n const expiresAt = new Date(session.getAccessToken().getExpiration() * 1000)\n return {\n accessToken: session.getAccessToken().getJwtToken(),\n idToken: session.getIdToken().getJwtToken(),\n refreshToken: session.getRefreshToken().getToken(),\n expiresAt,\n isValid: () => session.isValid(),\n }\n}\n\nexport function buildAuthUser(session: CognitoUserSession, fallbackUsername: string): AuthUser {\n // Estraiamo tutte le info dall'ID token senza roundtrip API\n const payload = session.getIdToken().decodePayload() as Record<string, unknown>\n\n const str = (v: unknown): string => (v != null ? String(v) : '')\n const bool = (v: unknown): boolean => v === true || v === 'true'\n\n return {\n sub: str(payload['sub']),\n username: str(payload['cognito:username'] ?? fallbackUsername),\n email: str(payload['email']),\n emailVerified: bool(payload['email_verified']),\n groups: Array.isArray(payload['cognito:groups'])\n ? (payload['cognito:groups'] as string[])\n : [],\n attributes: Object.fromEntries(Object.entries(payload).map(([k, v]) => [k, str(v)])),\n }\n}\n","import {\n AuthenticationDetails,\n CognitoRefreshToken,\n CognitoUser,\n CognitoUserAttribute,\n CognitoUserPool,\n CognitoUserSession,\n} from 'amazon-cognito-identity-js'\nimport {\n CognitoIdentityProviderClient,\n GetUserCommand,\n} from '@aws-sdk/client-cognito-identity-provider'\n\nimport { TypedEventEmitter } from './event-bus'\nimport { mapCognitoError, CognitoAuthError, SessionExpiredError } from './errors'\nimport { AutoStorageAdapter } from './storage'\nimport { buildAuthSession, buildAuthUser } from './internal/converters'\nimport type {\n AuthConfig,\n AuthEvents,\n AuthSession,\n AuthState,\n AuthUser,\n MfaPreference,\n MfaSetupResult,\n MfaType,\n ResolvedAuthConfig,\n SignInResult,\n} from './types'\n\nfunction validateConfig(config: AuthConfig): void {\n const missing = (['userPoolId', 'clientId', 'region'] as const).filter(k => !config[k])\n if (missing.length) {\n throw new CognitoAuthError(\n `AuthConfig incompleto — campi obbligatori mancanti: ${missing.join(', ')}`,\n 'INVALID_PARAMETER',\n )\n }\n if (!/^[a-z]{2}-[a-z]+-\\d$/.test(config.region)) {\n throw new CognitoAuthError(\n `AuthConfig.region non valido: \"${config.region}\" (es. eu-west-1)`,\n 'INVALID_PARAMETER',\n )\n }\n}\n\n\nexport class CognitoAuthClient extends TypedEventEmitter<AuthEvents> {\n protected readonly config: ResolvedAuthConfig\n private _state: AuthState = 'idle'\n private readonly _pool: CognitoUserPool\n private _idpClient: CognitoIdentityProviderClient | null = null\n // Mappa challengeSession-id → CognitoUser in-flight (MFA / new-password challenge)\n private readonly _pendingChallenges = new Map<string, CognitoUser>()\n private _refreshTimer: ReturnType<typeof setTimeout> | null = null\n\n constructor(config: AuthConfig) {\n super()\n validateConfig(config)\n this.config = {\n autoRefresh: true,\n refreshMarginSeconds: 300,\n totpIssuer: config.clientId,\n storage: new AutoStorageAdapter(),\n ...config,\n }\n this._pool = new CognitoUserPool({\n UserPoolId: this.config.userPoolId,\n ClientId: this.config.clientId,\n // amazon-cognito-identity-js ICognitoStorage coincide con il nostro StorageAdapter\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n Storage: this.config.storage as any,\n })\n }\n\n // ─── State ─────────────────────────────────────────────────────────────────\n\n get state(): AuthState {\n return this._state\n }\n\n protected setState(next: AuthState): void {\n if (this._state === next) return\n this._state = next\n this.emit('stateChanged', next)\n }\n\n // ─── Sign-in ───────────────────────────────────────────────────────────────\n\n async signIn(email: string, password: string): Promise<SignInResult> {\n this.setState('loading')\n const cognitoUser = this._makeCognitoUser(email)\n const authDetails = new AuthenticationDetails({ Username: email, Password: password })\n\n return new Promise<SignInResult>((resolve, reject) => {\n cognitoUser.authenticateUser(authDetails, {\n onSuccess: (session) => {\n resolve(this._onAuthSuccess(cognitoUser, session))\n },\n onFailure: (err) => {\n this.setState('unauthenticated')\n reject(mapCognitoError(err))\n },\n mfaRequired: () => {\n this.setState('mfa_required')\n const challengeSession = this._storeChallengeUser(cognitoUser)\n const result: SignInResult = { status: 'MFA_REQUIRED', mfaType: 'SMS', challengeSession }\n this.emit('mfaRequired', { mfaType: 'SMS', challengeSession })\n resolve(result)\n },\n totpRequired: () => {\n this.setState('mfa_required')\n const challengeSession = this._storeChallengeUser(cognitoUser)\n const result: SignInResult = { status: 'MFA_REQUIRED', mfaType: 'TOTP', challengeSession }\n this.emit('mfaRequired', { mfaType: 'TOTP', challengeSession })\n resolve(result)\n },\n newPasswordRequired: (_userAttributes, requiredAttributes) => {\n this.setState('new_password_required')\n const challengeSession = this._storeChallengeUser(cognitoUser)\n const required: string[] = Array.isArray(requiredAttributes) ? requiredAttributes : []\n this.emit('newPasswordRequired', { requiredAttributes: required, challengeSession })\n resolve({ status: 'NEW_PASSWORD_REQUIRED', requiredAttributes: required, challengeSession })\n },\n // Cognito richiede il setup TOTP prima di completare il login\n mfaSetup: () => {\n this.setState('mfa_required')\n const challengeSession = this._storeChallengeUser(cognitoUser)\n resolve({ status: 'MFA_SETUP_REQUIRED', challengeSession })\n },\n })\n })\n }\n\n async respondToMfaChallenge(\n challengeSession: string,\n code: string,\n mfaType: MfaType,\n ): Promise<SignInResult> {\n const cognitoUser = this._takeChallengeUser(challengeSession)\n const sdkType = mfaType === 'TOTP' ? 'SOFTWARE_TOKEN_MFA' : 'SMS_MFA'\n\n return new Promise<SignInResult>((resolve, reject) => {\n cognitoUser.sendMFACode(\n code,\n {\n onSuccess: (session) => resolve(this._onAuthSuccess(cognitoUser, session)),\n onFailure: (err) => {\n this.setState('unauthenticated')\n reject(mapCognitoError(err))\n },\n },\n sdkType,\n )\n })\n }\n\n async respondToNewPasswordChallenge(\n challengeSession: string,\n newPassword: string,\n userAttributes?: Record<string, string>,\n ): Promise<SignInResult> {\n const cognitoUser = this._takeChallengeUser(challengeSession)\n\n return new Promise<SignInResult>((resolve, reject) => {\n cognitoUser.completeNewPasswordChallenge(\n newPassword,\n userAttributes ?? {}, // es. { name, family_name, given_name }\n {\n onSuccess: (session) => resolve(this._onAuthSuccess(cognitoUser, session)),\n onFailure: (err) => {\n this.setState('unauthenticated')\n reject(mapCognitoError(err))\n },\n // Cognito può richiedere MFA anche dopo il cambio password forzato\n mfaRequired: () => {\n this.setState('mfa_required')\n const newSession = this._storeChallengeUser(cognitoUser)\n this.emit('mfaRequired', { mfaType: 'SMS', challengeSession: newSession })\n resolve({ status: 'MFA_REQUIRED', mfaType: 'SMS', challengeSession: newSession })\n },\n totpRequired: () => {\n this.setState('mfa_required')\n const newSession = this._storeChallengeUser(cognitoUser)\n this.emit('mfaRequired', { mfaType: 'TOTP', challengeSession: newSession })\n resolve({ status: 'MFA_REQUIRED', mfaType: 'TOTP', challengeSession: newSession })\n },\n },\n )\n })\n }\n\n async signOut(global = false): Promise<void> {\n this._clearRefreshTimer()\n this._pendingChallenges.clear()\n\n const cognitoUser = this._pool.getCurrentUser()\n if (!cognitoUser) {\n this.setState('unauthenticated')\n this.emit('signedOut')\n return\n }\n\n if (global) {\n await new Promise<void>((resolve, reject) => {\n cognitoUser.globalSignOut({\n onSuccess: () => {\n this.setState('unauthenticated')\n this.emit('signedOut')\n resolve()\n },\n onFailure: (err) => reject(mapCognitoError(err)),\n })\n })\n } else {\n cognitoUser.signOut()\n this.setState('unauthenticated')\n this.emit('signedOut')\n }\n }\n\n // ─── Registration ──────────────────────────────────────────────────────────\n\n async signUp(\n email: string,\n password: string,\n attributes: Record<string, string> = {},\n ): Promise<void> {\n const userAttributes = Object.entries({ email, ...attributes }).map(\n ([Name, Value]) => new CognitoUserAttribute({ Name, Value }),\n )\n\n await new Promise<void>((resolve, reject) => {\n this._pool.signUp(email, password, userAttributes, [], (err) => {\n if (err) return reject(mapCognitoError(err))\n resolve()\n })\n })\n }\n\n async confirmSignUp(email: string, code: string): Promise<void> {\n const cognitoUser = this._makeCognitoUser(email)\n await new Promise<void>((resolve, reject) => {\n cognitoUser.confirmRegistration(code, true, (err) => {\n if (err) return reject(mapCognitoError(err))\n resolve()\n })\n })\n }\n\n async resendConfirmationCode(email: string): Promise<void> {\n const cognitoUser = this._makeCognitoUser(email)\n await new Promise<void>((resolve, reject) => {\n cognitoUser.resendConfirmationCode((err) => {\n if (err) return reject(mapCognitoError(err))\n resolve()\n })\n })\n }\n\n // ─── Password ──────────────────────────────────────────────────────────────\n\n async forgotPassword(email: string): Promise<void> {\n const cognitoUser = this._makeCognitoUser(email)\n await new Promise<void>((resolve, reject) => {\n cognitoUser.forgotPassword({\n // inputVerificationCode → il codice è stato inviato all'email/telefono\n inputVerificationCode: () => resolve(),\n onSuccess: () => resolve(),\n onFailure: (err) => reject(mapCognitoError(err)),\n })\n })\n }\n\n async confirmForgotPassword(\n email: string,\n code: string,\n newPassword: string,\n ): Promise<void> {\n const cognitoUser = this._makeCognitoUser(email)\n await new Promise<void>((resolve, reject) => {\n cognitoUser.confirmPassword(code, newPassword, {\n onSuccess: () => resolve(),\n onFailure: (err) => reject(mapCognitoError(err)),\n })\n })\n }\n\n async changePassword(currentPassword: string, newPassword: string): Promise<void> {\n const cognitoUser = await this._getAuthenticatedUser()\n await new Promise<void>((resolve, reject) => {\n cognitoUser.changePassword(currentPassword, newPassword, (err) => {\n if (err) return reject(mapCognitoError(err))\n resolve()\n })\n })\n }\n\n // ─── Session & User ────────────────────────────────────────────────────────\n\n async getSession(): Promise<AuthSession> {\n const cognitoUser = this._pool.getCurrentUser()\n if (!cognitoUser) throw new SessionExpiredError()\n\n const raw = await this._getRawSession(cognitoUser)\n this._scheduleRefresh(cognitoUser, raw)\n return buildAuthSession(raw)\n }\n\n async getCurrentUser(): Promise<AuthUser | null> {\n const cognitoUser = this._pool.getCurrentUser()\n if (!cognitoUser) return null\n\n try {\n const session = await this._getRawSession(cognitoUser)\n this.setState('authenticated')\n return buildAuthUser(session, cognitoUser.getUsername())\n } catch {\n return null\n }\n }\n\n async getUserAttributes(): Promise<Record<string, string>> {\n const cognitoUser = await this._getAuthenticatedUser()\n return new Promise((resolve, reject) => {\n cognitoUser.getUserAttributes((err, result) => {\n if (err) return reject(mapCognitoError(err))\n resolve(Object.fromEntries((result ?? []).map(a => [a.getName(), a.getValue()])))\n })\n })\n }\n\n async updateUserAttributes(attributes: Record<string, string>): Promise<void> {\n const cognitoUser = await this._getAuthenticatedUser()\n const attrs = Object.entries(attributes).map(\n ([Name, Value]) => new CognitoUserAttribute({ Name, Value }),\n )\n await new Promise<void>((resolve, reject) => {\n cognitoUser.updateAttributes(attrs, (err) => {\n if (err) return reject(mapCognitoError(err))\n resolve()\n })\n })\n }\n\n async verifyUserAttribute(\n attribute: 'email' | 'phone_number',\n code: string,\n ): Promise<void> {\n const cognitoUser = await this._getAuthenticatedUser()\n await new Promise<void>((resolve, reject) => {\n cognitoUser.verifyAttribute(attribute, code, {\n onSuccess: () => resolve(),\n onFailure: (err) => reject(mapCognitoError(err)),\n })\n })\n }\n\n async sendAttributeVerificationCode(attribute: 'email' | 'phone_number'): Promise<void> {\n const cognitoUser = await this._getAuthenticatedUser()\n await new Promise<void>((resolve, reject) => {\n cognitoUser.getAttributeVerificationCode(attribute, {\n onSuccess: () => resolve(),\n onFailure: (err) => reject(mapCognitoError(err)),\n inputVerificationCode: () => resolve(),\n })\n })\n }\n\n async deleteUser(): Promise<void> {\n const cognitoUser = await this._getAuthenticatedUser()\n this._clearRefreshTimer()\n await new Promise<void>((resolve, reject) => {\n cognitoUser.deleteUser((err) => {\n if (err) return reject(mapCognitoError(err))\n this.setState('unauthenticated')\n this.emit('signedOut')\n resolve()\n })\n })\n }\n\n // ─── MFA ───────────────────────────────────────────────────────────────────\n\n async setupTotp(): Promise<MfaSetupResult> {\n const cognitoUser = await this._getAuthenticatedUser()\n return new Promise<MfaSetupResult>((resolve, reject) => {\n cognitoUser.associateSoftwareToken({\n associateSecretCode: (secretCode: string) => {\n const issuer = encodeURIComponent(this.config.totpIssuer)\n const account = encodeURIComponent(cognitoUser.getUsername())\n const qrCodeUri =\n `otpauth://totp/${issuer}:${account}` +\n `?secret=${secretCode}&issuer=${issuer}`\n resolve({ secretCode, qrCodeUri })\n },\n onFailure: (err: Error) => reject(mapCognitoError(err)),\n })\n })\n }\n\n async verifyTotpSetup(code: string): Promise<void> {\n const cognitoUser = await this._getAuthenticatedUser()\n return new Promise<void>((resolve, reject) => {\n cognitoUser.verifySoftwareToken(code, this.config.totpIssuer, {\n onSuccess: () => resolve(),\n onFailure: (err: Error) => reject(mapCognitoError(err)),\n })\n })\n }\n\n async getMfaPreference(): Promise<MfaPreference> {\n const session = await this.getSession()\n try {\n const response = await this._getIdpClient().send(\n new GetUserCommand({ AccessToken: session.accessToken }),\n )\n const enabled: string[] = response.UserMFASettingList ?? []\n const preferred: string | null = response.PreferredMfaSetting ?? null\n const toSdkType = (s: string | null): MfaType | null =>\n s === 'SOFTWARE_TOKEN_MFA' ? 'TOTP' : s === 'SMS_MFA' ? 'SMS' : null\n return {\n enabled: enabled.length > 0,\n preferred: toSdkType(preferred),\n totp: enabled.includes('SOFTWARE_TOKEN_MFA'),\n sms: enabled.includes('SMS_MFA'),\n }\n } catch (err) {\n throw mapCognitoError(err)\n }\n }\n\n async setMfaPreference(type: MfaType): Promise<void> {\n const cognitoUser = await this._getAuthenticatedUser()\n const smsMfa = { Enabled: type === 'SMS', PreferredMfa: type === 'SMS' }\n const totpMfa = { Enabled: type === 'TOTP', PreferredMfa: type === 'TOTP' }\n return new Promise<void>((resolve, reject) => {\n cognitoUser.setUserMfaPreference(smsMfa, totpMfa, (err: Error | undefined) => {\n if (err) return reject(mapCognitoError(err))\n resolve()\n })\n })\n }\n\n async disableMfa(): Promise<void> {\n const cognitoUser = await this._getAuthenticatedUser()\n const off = { Enabled: false, PreferredMfa: false }\n return new Promise<void>((resolve, reject) => {\n cognitoUser.setUserMfaPreference(off, off, (err: Error | undefined) => {\n if (err) return reject(mapCognitoError(err))\n resolve()\n })\n })\n }\n\n // ─── TOTP setup durante il challenge login ─────────────────────────────────\n\n /**\n * Ottiene il secretCode/QR URI per il setup TOTP durante il flusso di login\n * (quando signIn restituisce MFA_SETUP_REQUIRED). Non richiede una sessione\n * autenticata: usa il CognitoUser in attesa nel challenge.\n */\n async setupTotpChallenge(challengeSession: string): Promise<MfaSetupResult> {\n const cognitoUser = this._peekChallengeUser(challengeSession)\n return new Promise<MfaSetupResult>((resolve, reject) => {\n cognitoUser.associateSoftwareToken({\n associateSecretCode: (secretCode: string) => {\n const issuer = encodeURIComponent(this.config.totpIssuer)\n const account = encodeURIComponent(cognitoUser.getUsername())\n const qrCodeUri =\n `otpauth://totp/${issuer}:${account}` +\n `?secret=${secretCode}&issuer=${issuer}`\n resolve({ secretCode, qrCodeUri })\n },\n onFailure: (err: Error) => reject(mapCognitoError(err)),\n })\n })\n }\n\n /**\n * Verifica il codice TOTP e completa il login. Dopo questa chiamata la\n * sessione è autenticata e il challenge viene rimosso dalla mappa.\n */\n async verifyTotpChallenge(challengeSession: string, code: string): Promise<SignInResult> {\n const cognitoUser = this._takeChallengeUser(challengeSession)\n return new Promise<SignInResult>((resolve, reject) => {\n cognitoUser.verifySoftwareToken(code, this.config.totpIssuer, {\n onSuccess: (session: CognitoUserSession) => resolve(this._onAuthSuccess(cognitoUser, session)),\n onFailure: (err: Error) => reject(mapCognitoError(err)),\n })\n })\n }\n\n // ─── Private helpers ───────────────────────────────────────────────────────\n\n private _getIdpClient(): CognitoIdentityProviderClient {\n if (!this._idpClient) {\n this._idpClient = new CognitoIdentityProviderClient({ region: this.config.region })\n }\n return this._idpClient\n }\n\n private _makeCognitoUser(username: string): CognitoUser {\n return new CognitoUser({\n Username: username,\n Pool: this._pool,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n Storage: this.config.storage as any,\n })\n }\n\n private _storeChallengeUser(cognitoUser: CognitoUser): string {\n const id = crypto.randomUUID()\n this._pendingChallenges.set(id, cognitoUser)\n return id\n }\n\n private _takeChallengeUser(challengeSession: string): CognitoUser {\n const user = this._pendingChallenges.get(challengeSession)\n if (!user) {\n throw new CognitoAuthError(\n 'Challenge session non valida o scaduta',\n 'UNKNOWN',\n )\n }\n this._pendingChallenges.delete(challengeSession)\n return user\n }\n\n /** Legge il CognitoUser senza rimuoverlo dalla mappa (per setupTotpChallenge). */\n private _peekChallengeUser(challengeSession: string): CognitoUser {\n const user = this._pendingChallenges.get(challengeSession)\n if (!user) {\n throw new CognitoAuthError(\n 'Challenge session non valida o scaduta',\n 'UNKNOWN',\n )\n }\n return user\n }\n\n private _onAuthSuccess(cognitoUser: CognitoUser, session: CognitoUserSession): SignInResult {\n const authSession = buildAuthSession(session)\n const authUser = buildAuthUser(session, cognitoUser.getUsername())\n this.setState('authenticated')\n this.emit('signedIn', authUser)\n this._scheduleRefresh(cognitoUser, session)\n return { status: 'SUCCESS', user: authUser, session: authSession }\n }\n\n private _getRawSession(cognitoUser: CognitoUser): Promise<CognitoUserSession> {\n return new Promise((resolve, reject) => {\n cognitoUser.getSession((err: Error | null, session: CognitoUserSession | null) => {\n if (err || !session) {\n return reject(err ? mapCognitoError(err) : new SessionExpiredError())\n }\n if (!session.isValid()) {\n return reject(new SessionExpiredError())\n }\n resolve(session)\n })\n })\n }\n\n private async _getAuthenticatedUser(): Promise<CognitoUser> {\n const cognitoUser = this._pool.getCurrentUser()\n if (!cognitoUser) throw new SessionExpiredError()\n // getSession gestisce internamente il refresh se il token è scaduto\n await this._getRawSession(cognitoUser)\n return cognitoUser\n }\n\n private _scheduleRefresh(cognitoUser: CognitoUser, session: CognitoUserSession): void {\n if (!this.config.autoRefresh) return\n this._clearRefreshTimer()\n\n const expiresAt = session.getAccessToken().getExpiration() * 1000\n const refreshIn = expiresAt - Date.now() - this.config.refreshMarginSeconds * 1000\n\n if (refreshIn <= 0) return\n\n this._refreshTimer = setTimeout(() => {\n const refreshToken = new CognitoRefreshToken({\n RefreshToken: session.getRefreshToken().getToken(),\n })\n cognitoUser.refreshSession(refreshToken, (err, newSession: CognitoUserSession) => {\n if (err) {\n this.emit('sessionExpired')\n this.setState('unauthenticated')\n return\n }\n this.emit('tokenRefreshed', buildAuthSession(newSession))\n this._scheduleRefresh(cognitoUser, newSession)\n })\n }, refreshIn)\n }\n\n private _clearRefreshTimer(): void {\n if (this._refreshTimer !== null) {\n clearTimeout(this._refreshTimer)\n this._refreshTimer = null\n }\n }\n}\n","import {\n createContext,\n useContext,\n useEffect,\n useMemo,\n useState,\n type ReactNode,\n} from 'react'\n\nimport { CognitoAuthClient } from '../core/client'\nimport type { AuthConfig, AuthSession, AuthState, AuthUser } from '../core/types'\n\n// ─── Context shape ─────────────────────────────────────────────────────────────\n\nexport interface AuthContextValue {\n client: CognitoAuthClient\n state: AuthState\n user: AuthUser | null\n session: AuthSession | null\n isLoading: boolean\n isAuthenticated: boolean\n}\n\nconst AuthContext = createContext<AuthContextValue | null>(null)\n\n// ─── Internal hook ──────────────────────────────────────────────────────────────\n\nexport function useAuthContext(): AuthContextValue {\n const ctx = useContext(AuthContext)\n if (!ctx) {\n throw new Error('useAuthContext must be used inside <AuthProvider>')\n }\n return ctx\n}\n\n// ─── Provider ──────────────────────────────────────────────────────────────────\n\nexport interface AuthProviderProps {\n config: AuthConfig\n children: ReactNode\n}\n\nexport function AuthProvider({ config, children }: AuthProviderProps) {\n // Client è stabile per tutta la vita del provider — il config viene ignorato dopo il mount\n const [client] = useState(() => new CognitoAuthClient(config))\n\n const [authState, setAuthState] = useState<AuthState>('idle')\n const [user, setUser] = useState<AuthUser | null>(null)\n const [session, setSession] = useState<AuthSession | null>(null)\n\n useEffect(() => {\n let active = true\n\n // Ripristina la sessione dallo storage (localStorage / adapter configurato)\n client\n .getCurrentUser()\n .then(async (currentUser) => {\n if (!active) return\n if (currentUser) {\n const s = await client.getSession().catch(() => null)\n if (active) {\n setUser(currentUser)\n setSession(s)\n }\n } else {\n if (active) setAuthState('unauthenticated')\n }\n })\n .catch(() => {\n if (active) setAuthState('unauthenticated')\n })\n\n const unsubs = [\n client.on('stateChanged', (s: AuthState) => {\n if (active) setAuthState(s)\n // Pulisce user/session per tutti gli stati non autenticati\n if (s === 'unauthenticated') {\n setUser(null)\n setSession(null)\n }\n }),\n client.on('signedIn', (u) => {\n if (!active) return\n setUser(u)\n client\n .getSession()\n .then((s) => { if (active) setSession(s) })\n .catch(() => {})\n }),\n client.on('signedOut', () => {\n if (active) {\n setUser(null)\n setSession(null)\n }\n }),\n client.on('tokenRefreshed', (s) => {\n if (active) setSession(s)\n }),\n client.on('sessionExpired', () => {\n if (active) {\n setUser(null)\n setSession(null)\n }\n }),\n ]\n\n return () => {\n active = false\n unsubs.forEach((unsub) => unsub())\n }\n }, [client])\n\n const value = useMemo<AuthContextValue>(\n () => ({\n client,\n state: authState,\n user,\n session,\n isLoading: authState === 'idle' || authState === 'loading',\n isAuthenticated: authState === 'authenticated',\n }),\n [client, authState, user, session],\n )\n\n return <AuthContext.Provider value={value}>{children}</AuthContext.Provider>\n}\n","import { useMemo } from 'react'\nimport { useAuthContext } from '../context'\nimport type { MfaType, SignInResult } from '../../core/types'\n\nexport function useAuth() {\n const { client, state, user, isLoading, isAuthenticated } = useAuthContext()\n\n // useMemo garantisce riferimenti stabili tra i re-render (client non cambia mai)\n const actions = useMemo(\n () => ({\n signIn: (email: string, password: string): Promise<SignInResult> =>\n client.signIn(email, password),\n\n signOut: (global?: boolean): Promise<void> =>\n client.signOut(global),\n\n signUp: (\n email: string,\n password: string,\n attributes?: Record<string, string>,\n ): Promise<void> => client.signUp(email, password, attributes),\n\n confirmSignUp: (email: string, code: string): Promise<void> =>\n client.confirmSignUp(email, code),\n\n resendConfirmationCode: (email: string): Promise<void> =>\n client.resendConfirmationCode(email),\n\n forgotPassword: (email: string): Promise<void> =>\n client.forgotPassword(email),\n\n confirmForgotPassword: (\n email: string,\n code: string,\n newPassword: string,\n ): Promise<void> => client.confirmForgotPassword(email, code, newPassword),\n\n changePassword: (current: string, next: string): Promise<void> =>\n client.changePassword(current, next),\n\n respondToMfaChallenge: (\n challengeSession: string,\n code: string,\n mfaType: MfaType,\n ): Promise<SignInResult> =>\n client.respondToMfaChallenge(challengeSession, code, mfaType),\n\n respondToNewPasswordChallenge: (\n challengeSession: string,\n newPassword: string,\n userAttributes?: Record<string, string>,\n ): Promise<SignInResult> =>\n client.respondToNewPasswordChallenge(challengeSession, newPassword, userAttributes),\n\n setupTotpChallenge: (challengeSession: string) =>\n client.setupTotpChallenge(challengeSession),\n\n verifyTotpChallenge: (challengeSession: string, code: string): Promise<SignInResult> =>\n client.verifyTotpChallenge(challengeSession, code),\n }),\n [client],\n )\n\n return {\n // Stato\n user,\n state,\n isLoading,\n isAuthenticated,\n // Azioni\n ...actions,\n // Client raw per casi avanzati\n client,\n }\n}\n","import { useAuthContext } from '../context'\n\nexport function useSession() {\n const { session, state, client } = useAuthContext()\n\n return {\n accessToken: session?.accessToken ?? null,\n idToken: session?.idToken ?? null,\n refreshToken: session?.refreshToken ?? null,\n expiresAt: session?.expiresAt ?? null,\n isExpired: session ? !session.isValid() : true,\n isAuthenticated: state === 'authenticated',\n /** Forza il rinnovo del token e aggiorna il context */\n refresh: () => client.getSession(),\n }\n}\n","import { useAuthContext } from '../context'\n\nexport function useUser() {\n const { user, client } = useAuthContext()\n\n return {\n user,\n attributes: user?.attributes ?? {},\n groups: user?.groups ?? [],\n /** Aggiorna uno o più attributi utente in Cognito */\n update: (attributes: Record<string, string>) =>\n client.updateUserAttributes(attributes),\n /** Verifica email o phone_number con il codice ricevuto */\n verifyAttribute: (attribute: 'email' | 'phone_number', code: string) =>\n client.verifyUserAttribute(attribute, code),\n /** Invia un nuovo codice di verifica per email o phone_number */\n sendVerificationCode: (attribute: 'email' | 'phone_number') =>\n client.sendAttributeVerificationCode(attribute),\n /** Recupera gli attributi aggiornati direttamente da Cognito */\n refreshAttributes: () => client.getUserAttributes(),\n /** Elimina definitivamente l'account dell'utente corrente */\n deleteAccount: () => client.deleteUser(),\n }\n}\n","import { useAuthContext } from '../context'\nimport type { MfaType } from '../../core/types'\n\nexport function useMfa() {\n const { client } = useAuthContext()\n\n return {\n /** Avvia il setup TOTP — restituisce secretCode e qrCodeUri per l'app authenticator */\n setup: () => client.setupTotp(),\n /** Conferma il codice TOTP generato dall'app per completare il setup */\n verifySetup: (code: string) => client.verifyTotpSetup(code),\n /** Legge le preferenze MFA correnti (TOTP abilitato, SMS abilitato, preferito) */\n getPreference: () => client.getMfaPreference(),\n /** Imposta il tipo MFA preferito ('TOTP' | 'SMS') */\n setPreference: (type: MfaType) => client.setMfaPreference(type),\n /** Disabilita completamente il secondo fattore */\n disable: () => client.disableMfa(),\n }\n}\n","import type { ReactNode } from 'react'\nimport { useAuthContext } from '../context'\n\nexport interface ProtectedRouteProps {\n children: ReactNode\n /** Mostrato mentre lo stato auth è in inizializzazione (idle/loading). Default: null */\n loading?: ReactNode\n /**\n * Mostrato quando l'utente non è autenticato o non ha i permessi richiesti.\n * Con react-router-dom: <Navigate to=\"/login\" replace />\n */\n fallback?: ReactNode\n /** L'utente deve appartenere ad almeno uno di questi gruppi Cognito */\n requiredGroups?: string[]\n}\n\nexport function ProtectedRoute({\n children,\n loading = null,\n fallback = null,\n requiredGroups,\n}: ProtectedRouteProps) {\n const { state, user, isLoading, isAuthenticated } = useAuthContext()\n\n if (isLoading) return <>{loading}</>\n\n if (!isAuthenticated) return <>{fallback}</>\n\n if (requiredGroups?.length) {\n const userGroups = user?.groups ?? []\n const hasAccess = requiredGroups.some((g) => userGroups.includes(g))\n if (!hasAccess) return <>{fallback}</>\n }\n\n // Unused var from destructuring: kept for clarity\n void state\n\n return <>{children}</>\n}\n\n// ─── Hook imperativo per logica di redirect inline ──────────────────────────────\n\nexport interface UseRequireAuthOptions {\n requiredGroups?: string[]\n}\n\nexport function useRequireAuth(options?: UseRequireAuthOptions) {\n const { state, user, isLoading, isAuthenticated } = useAuthContext()\n\n const isAllowed =\n isAuthenticated &&\n (!options?.requiredGroups?.length ||\n options.requiredGroups.some((g) => (user?.groups ?? []).includes(g)))\n\n return { isAllowed, isLoading, state, user }\n}\n"]}
@@ -0,0 +1,104 @@
1
+ import * as react from 'react';
2
+ import { ReactNode } from 'react';
3
+ import { C as CognitoAuthClient } from '../client-BAoL8h4E.cjs';
4
+ import { c as AuthState, d as AuthUser, b as AuthSession, A as AuthConfig, h as SignInResult, g as MfaType, f as MfaSetupResult, M as MfaPreference } from '../types-bxA1vonL.cjs';
5
+
6
+ interface AuthContextValue {
7
+ client: CognitoAuthClient;
8
+ state: AuthState;
9
+ user: AuthUser | null;
10
+ session: AuthSession | null;
11
+ isLoading: boolean;
12
+ isAuthenticated: boolean;
13
+ }
14
+ declare function useAuthContext(): AuthContextValue;
15
+ interface AuthProviderProps {
16
+ config: AuthConfig;
17
+ children: ReactNode;
18
+ }
19
+ declare function AuthProvider({ config, children }: AuthProviderProps): react.JSX.Element;
20
+
21
+ declare function useAuth(): {
22
+ client: CognitoAuthClient;
23
+ signIn: (email: string, password: string) => Promise<SignInResult>;
24
+ signOut: (global?: boolean) => Promise<void>;
25
+ signUp: (email: string, password: string, attributes?: Record<string, string>) => Promise<void>;
26
+ confirmSignUp: (email: string, code: string) => Promise<void>;
27
+ resendConfirmationCode: (email: string) => Promise<void>;
28
+ forgotPassword: (email: string) => Promise<void>;
29
+ confirmForgotPassword: (email: string, code: string, newPassword: string) => Promise<void>;
30
+ changePassword: (current: string, next: string) => Promise<void>;
31
+ respondToMfaChallenge: (challengeSession: string, code: string, mfaType: MfaType) => Promise<SignInResult>;
32
+ respondToNewPasswordChallenge: (challengeSession: string, newPassword: string, userAttributes?: Record<string, string>) => Promise<SignInResult>;
33
+ setupTotpChallenge: (challengeSession: string) => Promise<MfaSetupResult>;
34
+ verifyTotpChallenge: (challengeSession: string, code: string) => Promise<SignInResult>;
35
+ user: AuthUser | null;
36
+ state: AuthState;
37
+ isLoading: boolean;
38
+ isAuthenticated: boolean;
39
+ };
40
+
41
+ declare function useSession(): {
42
+ accessToken: string | null;
43
+ idToken: string | null;
44
+ refreshToken: string | null;
45
+ expiresAt: Date | null;
46
+ isExpired: boolean;
47
+ isAuthenticated: boolean;
48
+ /** Forza il rinnovo del token e aggiorna il context */
49
+ refresh: () => Promise<AuthSession>;
50
+ };
51
+
52
+ declare function useUser(): {
53
+ user: AuthUser | null;
54
+ attributes: Record<string, string>;
55
+ groups: string[];
56
+ /** Aggiorna uno o più attributi utente in Cognito */
57
+ update: (attributes: Record<string, string>) => Promise<void>;
58
+ /** Verifica email o phone_number con il codice ricevuto */
59
+ verifyAttribute: (attribute: "email" | "phone_number", code: string) => Promise<void>;
60
+ /** Invia un nuovo codice di verifica per email o phone_number */
61
+ sendVerificationCode: (attribute: "email" | "phone_number") => Promise<void>;
62
+ /** Recupera gli attributi aggiornati direttamente da Cognito */
63
+ refreshAttributes: () => Promise<Record<string, string>>;
64
+ /** Elimina definitivamente l'account dell'utente corrente */
65
+ deleteAccount: () => Promise<void>;
66
+ };
67
+
68
+ declare function useMfa(): {
69
+ /** Avvia il setup TOTP — restituisce secretCode e qrCodeUri per l'app authenticator */
70
+ setup: () => Promise<MfaSetupResult>;
71
+ /** Conferma il codice TOTP generato dall'app per completare il setup */
72
+ verifySetup: (code: string) => Promise<void>;
73
+ /** Legge le preferenze MFA correnti (TOTP abilitato, SMS abilitato, preferito) */
74
+ getPreference: () => Promise<MfaPreference>;
75
+ /** Imposta il tipo MFA preferito ('TOTP' | 'SMS') */
76
+ setPreference: (type: MfaType) => Promise<void>;
77
+ /** Disabilita completamente il secondo fattore */
78
+ disable: () => Promise<void>;
79
+ };
80
+
81
+ interface ProtectedRouteProps {
82
+ children: ReactNode;
83
+ /** Mostrato mentre lo stato auth è in inizializzazione (idle/loading). Default: null */
84
+ loading?: ReactNode;
85
+ /**
86
+ * Mostrato quando l'utente non è autenticato o non ha i permessi richiesti.
87
+ * Con react-router-dom: <Navigate to="/login" replace />
88
+ */
89
+ fallback?: ReactNode;
90
+ /** L'utente deve appartenere ad almeno uno di questi gruppi Cognito */
91
+ requiredGroups?: string[];
92
+ }
93
+ declare function ProtectedRoute({ children, loading, fallback, requiredGroups, }: ProtectedRouteProps): react.JSX.Element;
94
+ interface UseRequireAuthOptions {
95
+ requiredGroups?: string[];
96
+ }
97
+ declare function useRequireAuth(options?: UseRequireAuthOptions): {
98
+ isAllowed: boolean;
99
+ isLoading: boolean;
100
+ state: AuthState;
101
+ user: AuthUser | null;
102
+ };
103
+
104
+ export { type AuthContextValue, AuthProvider, type AuthProviderProps, ProtectedRoute, type ProtectedRouteProps, type UseRequireAuthOptions, useAuth, useAuthContext, useMfa, useRequireAuth, useSession, useUser };
@@ -0,0 +1,104 @@
1
+ import * as react from 'react';
2
+ import { ReactNode } from 'react';
3
+ import { C as CognitoAuthClient } from '../client-63FraVdm.js';
4
+ import { c as AuthState, d as AuthUser, b as AuthSession, A as AuthConfig, h as SignInResult, g as MfaType, f as MfaSetupResult, M as MfaPreference } from '../types-bxA1vonL.js';
5
+
6
+ interface AuthContextValue {
7
+ client: CognitoAuthClient;
8
+ state: AuthState;
9
+ user: AuthUser | null;
10
+ session: AuthSession | null;
11
+ isLoading: boolean;
12
+ isAuthenticated: boolean;
13
+ }
14
+ declare function useAuthContext(): AuthContextValue;
15
+ interface AuthProviderProps {
16
+ config: AuthConfig;
17
+ children: ReactNode;
18
+ }
19
+ declare function AuthProvider({ config, children }: AuthProviderProps): react.JSX.Element;
20
+
21
+ declare function useAuth(): {
22
+ client: CognitoAuthClient;
23
+ signIn: (email: string, password: string) => Promise<SignInResult>;
24
+ signOut: (global?: boolean) => Promise<void>;
25
+ signUp: (email: string, password: string, attributes?: Record<string, string>) => Promise<void>;
26
+ confirmSignUp: (email: string, code: string) => Promise<void>;
27
+ resendConfirmationCode: (email: string) => Promise<void>;
28
+ forgotPassword: (email: string) => Promise<void>;
29
+ confirmForgotPassword: (email: string, code: string, newPassword: string) => Promise<void>;
30
+ changePassword: (current: string, next: string) => Promise<void>;
31
+ respondToMfaChallenge: (challengeSession: string, code: string, mfaType: MfaType) => Promise<SignInResult>;
32
+ respondToNewPasswordChallenge: (challengeSession: string, newPassword: string, userAttributes?: Record<string, string>) => Promise<SignInResult>;
33
+ setupTotpChallenge: (challengeSession: string) => Promise<MfaSetupResult>;
34
+ verifyTotpChallenge: (challengeSession: string, code: string) => Promise<SignInResult>;
35
+ user: AuthUser | null;
36
+ state: AuthState;
37
+ isLoading: boolean;
38
+ isAuthenticated: boolean;
39
+ };
40
+
41
+ declare function useSession(): {
42
+ accessToken: string | null;
43
+ idToken: string | null;
44
+ refreshToken: string | null;
45
+ expiresAt: Date | null;
46
+ isExpired: boolean;
47
+ isAuthenticated: boolean;
48
+ /** Forza il rinnovo del token e aggiorna il context */
49
+ refresh: () => Promise<AuthSession>;
50
+ };
51
+
52
+ declare function useUser(): {
53
+ user: AuthUser | null;
54
+ attributes: Record<string, string>;
55
+ groups: string[];
56
+ /** Aggiorna uno o più attributi utente in Cognito */
57
+ update: (attributes: Record<string, string>) => Promise<void>;
58
+ /** Verifica email o phone_number con il codice ricevuto */
59
+ verifyAttribute: (attribute: "email" | "phone_number", code: string) => Promise<void>;
60
+ /** Invia un nuovo codice di verifica per email o phone_number */
61
+ sendVerificationCode: (attribute: "email" | "phone_number") => Promise<void>;
62
+ /** Recupera gli attributi aggiornati direttamente da Cognito */
63
+ refreshAttributes: () => Promise<Record<string, string>>;
64
+ /** Elimina definitivamente l'account dell'utente corrente */
65
+ deleteAccount: () => Promise<void>;
66
+ };
67
+
68
+ declare function useMfa(): {
69
+ /** Avvia il setup TOTP — restituisce secretCode e qrCodeUri per l'app authenticator */
70
+ setup: () => Promise<MfaSetupResult>;
71
+ /** Conferma il codice TOTP generato dall'app per completare il setup */
72
+ verifySetup: (code: string) => Promise<void>;
73
+ /** Legge le preferenze MFA correnti (TOTP abilitato, SMS abilitato, preferito) */
74
+ getPreference: () => Promise<MfaPreference>;
75
+ /** Imposta il tipo MFA preferito ('TOTP' | 'SMS') */
76
+ setPreference: (type: MfaType) => Promise<void>;
77
+ /** Disabilita completamente il secondo fattore */
78
+ disable: () => Promise<void>;
79
+ };
80
+
81
+ interface ProtectedRouteProps {
82
+ children: ReactNode;
83
+ /** Mostrato mentre lo stato auth è in inizializzazione (idle/loading). Default: null */
84
+ loading?: ReactNode;
85
+ /**
86
+ * Mostrato quando l'utente non è autenticato o non ha i permessi richiesti.
87
+ * Con react-router-dom: <Navigate to="/login" replace />
88
+ */
89
+ fallback?: ReactNode;
90
+ /** L'utente deve appartenere ad almeno uno di questi gruppi Cognito */
91
+ requiredGroups?: string[];
92
+ }
93
+ declare function ProtectedRoute({ children, loading, fallback, requiredGroups, }: ProtectedRouteProps): react.JSX.Element;
94
+ interface UseRequireAuthOptions {
95
+ requiredGroups?: string[];
96
+ }
97
+ declare function useRequireAuth(options?: UseRequireAuthOptions): {
98
+ isAllowed: boolean;
99
+ isLoading: boolean;
100
+ state: AuthState;
101
+ user: AuthUser | null;
102
+ };
103
+
104
+ export { type AuthContextValue, AuthProvider, type AuthProviderProps, ProtectedRoute, type ProtectedRouteProps, type UseRequireAuthOptions, useAuth, useAuthContext, useMfa, useRequireAuth, useSession, useUser };
@@ -0,0 +1,64 @@
1
+ import { useAuthContext } from '../chunk-N4OQLBV6.js';
2
+ export { AuthProvider, useAuth, useAuthContext, useMfa } from '../chunk-N4OQLBV6.js';
3
+ import '../chunk-DKPFVGTY.js';
4
+ import { jsx, Fragment } from 'react/jsx-runtime';
5
+
6
+ // src/react/hooks/useSession.ts
7
+ function useSession() {
8
+ const { session, state, client } = useAuthContext();
9
+ return {
10
+ accessToken: session?.accessToken ?? null,
11
+ idToken: session?.idToken ?? null,
12
+ refreshToken: session?.refreshToken ?? null,
13
+ expiresAt: session?.expiresAt ?? null,
14
+ isExpired: session ? !session.isValid() : true,
15
+ isAuthenticated: state === "authenticated",
16
+ /** Forza il rinnovo del token e aggiorna il context */
17
+ refresh: () => client.getSession()
18
+ };
19
+ }
20
+
21
+ // src/react/hooks/useUser.ts
22
+ function useUser() {
23
+ const { user, client } = useAuthContext();
24
+ return {
25
+ user,
26
+ attributes: user?.attributes ?? {},
27
+ groups: user?.groups ?? [],
28
+ /** Aggiorna uno o più attributi utente in Cognito */
29
+ update: (attributes) => client.updateUserAttributes(attributes),
30
+ /** Verifica email o phone_number con il codice ricevuto */
31
+ verifyAttribute: (attribute, code) => client.verifyUserAttribute(attribute, code),
32
+ /** Invia un nuovo codice di verifica per email o phone_number */
33
+ sendVerificationCode: (attribute) => client.sendAttributeVerificationCode(attribute),
34
+ /** Recupera gli attributi aggiornati direttamente da Cognito */
35
+ refreshAttributes: () => client.getUserAttributes(),
36
+ /** Elimina definitivamente l'account dell'utente corrente */
37
+ deleteAccount: () => client.deleteUser()
38
+ };
39
+ }
40
+ function ProtectedRoute({
41
+ children,
42
+ loading = null,
43
+ fallback = null,
44
+ requiredGroups
45
+ }) {
46
+ const { state, user, isLoading, isAuthenticated } = useAuthContext();
47
+ if (isLoading) return /* @__PURE__ */ jsx(Fragment, { children: loading });
48
+ if (!isAuthenticated) return /* @__PURE__ */ jsx(Fragment, { children: fallback });
49
+ if (requiredGroups?.length) {
50
+ const userGroups = user?.groups ?? [];
51
+ const hasAccess = requiredGroups.some((g) => userGroups.includes(g));
52
+ if (!hasAccess) return /* @__PURE__ */ jsx(Fragment, { children: fallback });
53
+ }
54
+ return /* @__PURE__ */ jsx(Fragment, { children });
55
+ }
56
+ function useRequireAuth(options) {
57
+ const { state, user, isLoading, isAuthenticated } = useAuthContext();
58
+ const isAllowed = isAuthenticated && (!options?.requiredGroups?.length || options.requiredGroups.some((g) => (user?.groups ?? []).includes(g)));
59
+ return { isAllowed, isLoading, state, user };
60
+ }
61
+
62
+ export { ProtectedRoute, useRequireAuth, useSession, useUser };
63
+ //# sourceMappingURL=index.js.map
64
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/react/hooks/useSession.ts","../../src/react/hooks/useUser.ts","../../src/react/components/ProtectedRoute.tsx"],"names":[],"mappings":";;;;;;AAEO,SAAS,UAAA,GAAa;AAC3B,EAAA,MAAM,EAAE,OAAA,EAAS,KAAA,EAAO,MAAA,KAAW,cAAA,EAAe;AAElD,EAAA,OAAO;AAAA,IACL,WAAA,EAAa,SAAS,WAAA,IAAe,IAAA;AAAA,IACrC,OAAA,EAAS,SAAS,OAAA,IAAW,IAAA;AAAA,IAC7B,YAAA,EAAc,SAAS,YAAA,IAAgB,IAAA;AAAA,IACvC,SAAA,EAAW,SAAS,SAAA,IAAa,IAAA;AAAA,IACjC,SAAA,EAAW,OAAA,GAAU,CAAC,OAAA,CAAQ,SAAQ,GAAI,IAAA;AAAA,IAC1C,iBAAiB,KAAA,KAAU,eAAA;AAAA;AAAA,IAE3B,OAAA,EAAS,MAAM,MAAA,CAAO,UAAA;AAAW,GACnC;AACF;;;ACbO,SAAS,OAAA,GAAU;AACxB,EAAA,MAAM,EAAE,IAAA,EAAM,MAAA,EAAO,GAAI,cAAA,EAAe;AAExC,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,UAAA,EAAY,IAAA,EAAM,UAAA,IAAc,EAAC;AAAA,IACjC,MAAA,EAAQ,IAAA,EAAM,MAAA,IAAU,EAAC;AAAA;AAAA,IAEzB,MAAA,EAAQ,CAAC,UAAA,KACP,MAAA,CAAO,qBAAqB,UAAU,CAAA;AAAA;AAAA,IAExC,iBAAiB,CAAC,SAAA,EAAqC,SACrD,MAAA,CAAO,mBAAA,CAAoB,WAAW,IAAI,CAAA;AAAA;AAAA,IAE5C,oBAAA,EAAsB,CAAC,SAAA,KACrB,MAAA,CAAO,8BAA8B,SAAS,CAAA;AAAA;AAAA,IAEhD,iBAAA,EAAmB,MAAM,MAAA,CAAO,iBAAA,EAAkB;AAAA;AAAA,IAElD,aAAA,EAAe,MAAM,MAAA,CAAO,UAAA;AAAW,GACzC;AACF;ACPO,SAAS,cAAA,CAAe;AAAA,EAC7B,QAAA;AAAA,EACA,OAAA,GAAU,IAAA;AAAA,EACV,QAAA,GAAW,IAAA;AAAA,EACX;AACF,CAAA,EAAwB;AACtB,EAAA,MAAM,EAAE,KAAA,EAAO,IAAA,EAAM,SAAA,EAAW,eAAA,KAAoB,cAAA,EAAe;AAEnE,EAAA,IAAI,SAAA,EAAW,uBAAO,GAAA,CAAA,QAAA,EAAA,EAAG,QAAA,EAAA,OAAA,EAAQ,CAAA;AAEjC,EAAA,IAAI,CAAC,eAAA,EAAiB,uBAAO,GAAA,CAAA,QAAA,EAAA,EAAG,QAAA,EAAA,QAAA,EAAS,CAAA;AAEzC,EAAA,IAAI,gBAAgB,MAAA,EAAQ;AAC1B,IAAA,MAAM,UAAA,GAAa,IAAA,EAAM,MAAA,IAAU,EAAC;AACpC,IAAA,MAAM,SAAA,GAAY,eAAe,IAAA,CAAK,CAAC,MAAM,UAAA,CAAW,QAAA,CAAS,CAAC,CAAC,CAAA;AACnE,IAAA,IAAI,CAAC,SAAA,EAAW,uBAAO,GAAA,CAAA,QAAA,EAAA,EAAG,QAAA,EAAA,QAAA,EAAS,CAAA;AAAA,EACrC;AAKA,EAAA,uCAAU,QAAA,EAAS,CAAA;AACrB;AAQO,SAAS,eAAe,OAAA,EAAiC;AAC9D,EAAA,MAAM,EAAE,KAAA,EAAO,IAAA,EAAM,SAAA,EAAW,eAAA,KAAoB,cAAA,EAAe;AAEnE,EAAA,MAAM,YACJ,eAAA,KACC,CAAC,OAAA,EAAS,cAAA,EAAgB,UACzB,OAAA,CAAQ,cAAA,CAAe,IAAA,CAAK,CAAC,OAAO,IAAA,EAAM,MAAA,IAAU,EAAC,EAAG,QAAA,CAAS,CAAC,CAAC,CAAA,CAAA;AAEvE,EAAA,OAAO,EAAE,SAAA,EAAW,SAAA,EAAW,KAAA,EAAO,IAAA,EAAK;AAC7C","file":"index.js","sourcesContent":["import { useAuthContext } from '../context'\n\nexport function useSession() {\n const { session, state, client } = useAuthContext()\n\n return {\n accessToken: session?.accessToken ?? null,\n idToken: session?.idToken ?? null,\n refreshToken: session?.refreshToken ?? null,\n expiresAt: session?.expiresAt ?? null,\n isExpired: session ? !session.isValid() : true,\n isAuthenticated: state === 'authenticated',\n /** Forza il rinnovo del token e aggiorna il context */\n refresh: () => client.getSession(),\n }\n}\n","import { useAuthContext } from '../context'\n\nexport function useUser() {\n const { user, client } = useAuthContext()\n\n return {\n user,\n attributes: user?.attributes ?? {},\n groups: user?.groups ?? [],\n /** Aggiorna uno o più attributi utente in Cognito */\n update: (attributes: Record<string, string>) =>\n client.updateUserAttributes(attributes),\n /** Verifica email o phone_number con il codice ricevuto */\n verifyAttribute: (attribute: 'email' | 'phone_number', code: string) =>\n client.verifyUserAttribute(attribute, code),\n /** Invia un nuovo codice di verifica per email o phone_number */\n sendVerificationCode: (attribute: 'email' | 'phone_number') =>\n client.sendAttributeVerificationCode(attribute),\n /** Recupera gli attributi aggiornati direttamente da Cognito */\n refreshAttributes: () => client.getUserAttributes(),\n /** Elimina definitivamente l'account dell'utente corrente */\n deleteAccount: () => client.deleteUser(),\n }\n}\n","import type { ReactNode } from 'react'\nimport { useAuthContext } from '../context'\n\nexport interface ProtectedRouteProps {\n children: ReactNode\n /** Mostrato mentre lo stato auth è in inizializzazione (idle/loading). Default: null */\n loading?: ReactNode\n /**\n * Mostrato quando l'utente non è autenticato o non ha i permessi richiesti.\n * Con react-router-dom: <Navigate to=\"/login\" replace />\n */\n fallback?: ReactNode\n /** L'utente deve appartenere ad almeno uno di questi gruppi Cognito */\n requiredGroups?: string[]\n}\n\nexport function ProtectedRoute({\n children,\n loading = null,\n fallback = null,\n requiredGroups,\n}: ProtectedRouteProps) {\n const { state, user, isLoading, isAuthenticated } = useAuthContext()\n\n if (isLoading) return <>{loading}</>\n\n if (!isAuthenticated) return <>{fallback}</>\n\n if (requiredGroups?.length) {\n const userGroups = user?.groups ?? []\n const hasAccess = requiredGroups.some((g) => userGroups.includes(g))\n if (!hasAccess) return <>{fallback}</>\n }\n\n // Unused var from destructuring: kept for clarity\n void state\n\n return <>{children}</>\n}\n\n// ─── Hook imperativo per logica di redirect inline ──────────────────────────────\n\nexport interface UseRequireAuthOptions {\n requiredGroups?: string[]\n}\n\nexport function useRequireAuth(options?: UseRequireAuthOptions) {\n const { state, user, isLoading, isAuthenticated } = useAuthContext()\n\n const isAllowed =\n isAuthenticated &&\n (!options?.requiredGroups?.length ||\n options.requiredGroups.some((g) => (user?.groups ?? []).includes(g)))\n\n return { isAllowed, isLoading, state, user }\n}\n"]}
@@ -0,0 +1,113 @@
1
+ interface StorageAdapter {
2
+ getItem(key: string): string | null;
3
+ setItem(key: string, value: string): void;
4
+ removeItem(key: string): void;
5
+ clear?(): void;
6
+ }
7
+ declare class LocalStorageAdapter implements StorageAdapter {
8
+ getItem(key: string): string | null;
9
+ setItem(key: string, value: string): void;
10
+ removeItem(key: string): void;
11
+ clear(): void;
12
+ }
13
+ declare class SessionStorageAdapter implements StorageAdapter {
14
+ getItem(key: string): string | null;
15
+ setItem(key: string, value: string): void;
16
+ removeItem(key: string): void;
17
+ clear(): void;
18
+ }
19
+ declare class InMemoryStorageAdapter implements StorageAdapter {
20
+ private readonly store;
21
+ getItem(key: string): string | null;
22
+ setItem(key: string, value: string): void;
23
+ removeItem(key: string): void;
24
+ clear(): void;
25
+ }
26
+ declare class AutoStorageAdapter implements StorageAdapter {
27
+ private readonly delegate;
28
+ constructor();
29
+ getItem(key: string): string | null;
30
+ setItem(key: string, value: string): void;
31
+ removeItem(key: string): void;
32
+ clear(): void;
33
+ }
34
+
35
+ type AuthState = 'idle' | 'loading' | 'authenticated' | 'unauthenticated' | 'mfa_required' | 'new_password_required' | 'confirm_signup';
36
+ type MfaType = 'TOTP' | 'SMS' | 'NOMFA';
37
+ interface MfaSetupResult {
38
+ secretCode: string;
39
+ /** otpauth://totp/<issuer>:<email>?secret=<secret>&issuer=<issuer> */
40
+ qrCodeUri: string;
41
+ }
42
+ interface MfaPreference {
43
+ enabled: boolean;
44
+ preferred: MfaType | null;
45
+ totp: boolean;
46
+ sms: boolean;
47
+ }
48
+ interface AuthUser {
49
+ sub: string;
50
+ username: string;
51
+ email: string;
52
+ emailVerified: boolean;
53
+ groups: string[];
54
+ attributes: Record<string, string>;
55
+ }
56
+ interface AuthSession {
57
+ accessToken: string;
58
+ idToken: string;
59
+ refreshToken: string;
60
+ expiresAt: Date;
61
+ isValid(): boolean;
62
+ }
63
+ type SignInResult = {
64
+ status: 'SUCCESS';
65
+ user: AuthUser;
66
+ session: AuthSession;
67
+ } | {
68
+ status: 'MFA_REQUIRED';
69
+ mfaType: MfaType;
70
+ challengeSession: string;
71
+ } | {
72
+ status: 'NEW_PASSWORD_REQUIRED';
73
+ requiredAttributes: string[];
74
+ challengeSession: string;
75
+ } | {
76
+ status: 'MFA_SETUP_REQUIRED';
77
+ challengeSession: string;
78
+ } | {
79
+ status: 'CONFIRM_SIGNUP';
80
+ };
81
+
82
+ interface AuthConfig {
83
+ userPoolId: string;
84
+ clientId: string;
85
+ region: string;
86
+ storage?: StorageAdapter;
87
+ /** Rinnova il token automaticamente prima della scadenza. Default: true */
88
+ autoRefresh?: boolean;
89
+ /** Secondi prima della scadenza in cui scatta il refresh. Default: 300 */
90
+ refreshMarginSeconds?: number;
91
+ /** Label mostrata nell'app authenticator (es. "MioApp"). Default: clientId */
92
+ totpIssuer?: string;
93
+ }
94
+ interface ResolvedAuthConfig extends Required<AuthConfig> {
95
+ }
96
+ interface AuthEvents {
97
+ signedIn: AuthUser;
98
+ signedOut: void;
99
+ tokenRefreshed: AuthSession;
100
+ sessionExpired: void;
101
+ mfaRequired: {
102
+ mfaType: MfaType;
103
+ challengeSession: string;
104
+ };
105
+ newPasswordRequired: {
106
+ requiredAttributes: string[];
107
+ challengeSession: string;
108
+ };
109
+ userUpdated: AuthUser;
110
+ stateChanged: AuthState;
111
+ }
112
+
113
+ export { type AuthConfig as A, InMemoryStorageAdapter as I, LocalStorageAdapter as L, type MfaPreference as M, type ResolvedAuthConfig as R, SessionStorageAdapter as S, type AuthEvents as a, type AuthSession as b, type AuthState as c, type AuthUser as d, AutoStorageAdapter as e, type MfaSetupResult as f, type MfaType as g, type SignInResult as h, type StorageAdapter as i };