Android auth failures reached Swift as a bare `ErrorException`. Its
`localizedDescription` is the generic bridge text ("The operation could not
be completed. (SwiftJNI.ThrowableError error 1.)"), so a caller could not
tell "wrong password" from "email already in use" — and any message it
derived from the error was wrong. On iOS the same failures carry
`FIRAuthErrorDomain` plus a `FIRAuthErrorCode`, which is what cross-platform
callers key off.
`mapAuthNSError` now resolves `FirebaseAuthException.getErrorCode()` to the
matching `FIRAuthErrorCode` raw value and keeps the Android message in
`NSLocalizedDescriptionKey`, with a fallback on the exception class for
unknown codes. `FirebaseNetworkException` (not a FirebaseAuthException, no
error code) maps to `.networkError`. `AuthErrorCode` grows from one case to
the resolvable set.
The mapping was previously only applied on the completion-handler paths; the
`async throws` ones threw straight through. signIn(withEmail:),
createUser(withEmail:), sendPasswordReset(withEmail:),
User.sendEmailVerification(), User.reauthenticate(with:) and User.delete()
now go through it too.
Mirrors `asNSError(functionsException:)` in SkipFirebaseFunctions (skiptools#95) and
`asNSError(firestoreException:)` in SkipFirebaseFirestore.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MxxbQFDQyDkNvFMZaV5Aij