Changelog
All notable changes to capacitor-auth-manager are documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
[3.1.1] — 2026-10-29
Fixed
- Android sign-in failures now reach logcat on release builds. The native logger was off unless logging
was enabled, and the JS layer never forwards
enableLoggingto native, so a failed Google sign-in left nothing in logcat. Warnings and errors are now always written (tagCapacitorAuthManager); debug and info stay opt-in. They carry codes, the package name and the signing SHA-1 — never an email address or token.
[3.1.0] — 2026-10-29
Fixed
- Android Google sign-in failed on Play-installed builds with no account picker. 3.0.0 ran Credential
Manager alone, which refused the request before showing any UI, while the same OAuth clients and SHA-1s
worked through GoogleSignIn in the apps' previous releases. The default
androidFlow: 'auto'now runs GoogleSignIn first — the exact path@codetrix-studio/capacitor-google-authused, with the result delivered through Capacitor's@ActivityCallback— and falls back to Credential Manager on any failure except a cancel. - Android errors no longer hide Google's own cause. Every rejection carries Google's exception class and
message (
[28444] …, status codes); configuration errors add the installed package and signing SHA-1. - R8 keep rules now reach consuming apps. They lived in
proguard-rules.pro, which only applies to the library's own unminified build; they are now inconsumer-rules.pro.
Added
androidFlowvalues'legacy'(GoogleSignIn only) and'credential-manager'(the 3.0.0 behaviour).
Changed
- Android depends on
com.google.android.gms:play-services-auth21.6.0, pinned because 22.0.0 removed GoogleSignIn.googleidstays on 1.1.1 (seedocs/PACKAGES.md).
[3.0.0] — 2026-10-09
Breaking changes
- Node installation/tooling floor is now 24; iOS requires 15 and GoogleSignIn 10.x. Angular adapters support 22.x; older unverified ranges are removed.
- Web auto sign-in may return a popup access token instead of an ID token. Firebase handoff must use
GoogleAuthProvider.credential(idToken ?? null, accessToken ?? null). - Default native storage no longer duplicates bearer credentials on disk. The Android legacy credential store and iOS credential copies are removed on upgrade; reauthentication may be required.
Added
auth.prepare(provider)initializes the SDK before a click without opening a sign-in prompt.- A packaged AI integration guide for React/Firebase, native setup, exact imports, error handling, and session ownership.
- Google-flow, storage, provider initialization, and sign-out race regression tests; tarball smoke loads every public JavaScript entry in both formats.
Fixed
- Missing requested nonce, expiry, subject, and Workspace-domain claims are rejected in the web ID-token path.
- Duplicate Google calls fail explicitly; provider initialization is coalesced and invalidated safely on disposal.
- A late session restore cannot authenticate after sign-out; disabled providers are excluded from the supported-provider list.
- One-Tap and popup waits are bounded; sign-out/disposal settles outstanding requests and late callbacks are ignored. Userinfo requests have a network deadline.
- Google web provider construction accepts the documented options shape.
- The packed Android manifest declares only INTERNET; consumer R8 rules preserve reflected plugin entry points.
- Native Swift/Java sources are included in the packed artifact. CommonJS root/framework adapters share one auth singleton, and providers/web exports its Google class.
- iOS credential copies no longer enter UserDefaults. Android removes deprecated security-crypto and keeps credentials in memory.
Changed
- Direct dependencies updated to current stable versions, retaining the documented TypeScript 6 ecosystem pin.
- Android uses Credential Manager 1.6.0 and googleid 1.1.1; GoogleSignIn is 10.x.
- Yarn owns local build/test scripts. Trapeze tooling is retained for native configuration.
[2.5.0] — unpublished source changes, 2026-09-08
Google sign-in hardened on every layer. Closes all five entries that 2.4.3 documented in
docs/REPORTED-ISSUES.md, fixes the runtime defects found while reviewing the native bridge, and gives the
native layers a real error-code channel. The Android plugin and the example app are compiled and run on an
emulator (Gradle 8.14.3 / AGP 8.13 / JDK 21 / compileSdk 36, emulator API 37) before release; the iOS
change below is the one part that no machine here can compile, and it ships unverified until the next iOS
device test.
Fixed
- ISSUE-001 — bare Node ESM could not import the package. Every relative specifier in
src/now carries its.jsextension (155 specifiers across 41 files), sodist/esmresolves under Node's ESM resolver as well as under bundlers. Guarded by the new tarball smoke test. - ISSUE-002 — importing the package threw
window is not defined. Theauthsingleton is created lazily on first use (aProxykeepsimport { auth }unchanged), andWebStoragefalls back to in-memory storage whenwindowis absent or the browser refuses storage access (private mode)."sideEffects": falseis now true. - ISSUE-003 —
@capacitor/corewas declared optional but required. It is a required peer now. - ISSUE-004 —
capacitor-biometric-authenticationwas installed for every consumer. Removed fromoptionalDependencies; it returns as an optional peer when the biometric provider is re-enabled. - ISSUE-005 —
engines.nodewas untested and disagreed with.nvmrc. The floor is now>=24.0.0(owner decision: current and latest Node only, no legacy targets) and CI builds, lints and runs the tarball smoke test on Node 24 and 26. Node is a build/install requirement only — the package runs in a browser or a webview. - Web One-Tap dismissed by the user hung
signIn()forever. A dismissed prompt now rejects withUSER_CANCELLED; a suppressed prompt rejects withPOPUP_BLOCKED(or falls back, see Added). - Native
getCurrentUser()returned{}and the app treated it as a signed-in user. The bridge now normalizes any result without a stringuidtonull, so a cold start with no session is "signed out" instead of authenticated-with-an-empty-user. - Android
getCurrentUser()resolved the same plugin call twice when no provider was active. It answers exactly once and remembers which provider owns the restored session. - Android manifest declared
READ_SMS,RECEIVE_SMSandUSE_BIOMETRICfor providers that are disabled. OnlyINTERNETremains; the SMS permissions are Play-restricted and were a store-rejection risk for every consumer. - Per-call sign-in options (
nonce,loginHint, the new flow selectors) now reach the native side; they were previously dropped because the manager flattens them before calling the provider. auth.getIdToken()failed on iOS and Android withOPERATION_NOT_ALLOWEDeven though both native layers implement it, because the native bridge never exposed the method the manager looks for. It is implemented now, and the Android plugin method also accepts the flat{ provider, forceRefresh }shape the bridge sends (it previously read a nestedoptionsobject only).- Native errors reached JavaScript without a code. Android rejected with a bare message and iOS rejected
with
localizedDescription, soAuthError.fromErrorhad to guess the code by substring-matching the message: anything that did not contain "cancelled", "network" or "timeout" surfaced asauth/internal-error. Both platforms now send a realAuthErrorCode— a cancelled sheet isauth/user-cancelled, an interrupted request isauth/network-error, a missingserverClientIdisauth/missing-configuration, and so on. (Android verified on an emulator; iOS unverified, see above.) - Android fell back to plaintext
SharedPreferenceswhen the keystore refused a master key, writing ID tokens to disk in the clear with no signal. It now keeps the session in memory for the life of the process and logs the degradation;AuthStorage.isEncrypted()reports which mode is active. npm run configureemitted aGoogleSignInOptionsmanifest entry from the deprecatedcom.google.android.gms.auth.api.signinflow this plugin stopped using in 2.4.2. Pasting it did nothing; the wizard now says Google needs no manifest entry.
Added
GoogleAuthOptions.webFlow('auto' | 'one-tap' | 'popup', default'auto'): One-Tap first, then a Google Identity Services OAuth2 popup fallback whenever the browser does not display One-Tap (cooldown, FedCM opt-out, third-party-cookie settings). The popup returnsaccessTokenplus the Google profile; Firebase acceptsGoogleAuthProvider.credential(idToken ?? null, accessToken).GoogleAuthOptions.androidFlow('auto' | 'bottom-sheet' | 'button', default'auto'): the Credential Manager bottom sheet first, then the explicit Sign in with Google button flow (GetSignInWithGoogleOption) when no authorized account is offered — that flow can add an account.- Both selectors are also accepted per call:
auth.signIn({ provider, options: { webFlow: 'popup' } }). getAuth()export alongsideauthfor callers who prefer an explicit accessor.- Web
getIdToken()andrevokeAccess()implementations (revoke uses the OAuth2 token when present). - Tarball smoke test (
yarn smoke:tarball,node:test): packs the package, installs the tarball into a scratch directory and imports it under bare Node (ESM and CJS). Wired intoprepublishOnly.
Changed
@capacitor/corepeer: optional → required.- Android:
androidx.credentials1.3.0 → 1.5.0,security-crypto1.1.0-alpha06 → 1.1.0 (stable), AGP/compileSdk/minSdk fallbacks aligned with Capacitor 8 (8.13.0 / 36 / 24),lintOptions→lint, the unused directplay-services-authdependency removed (still provided transitively), Facebook/MSAL ProGuard rules dropped. packageManager: yarn@4.17.1declared so corepack picks the right Yarn.- Google provider manifest no longer names a non-existent
@google/gsinpm package. - README:
renderButtonis documented as what it is — a method onGoogleAuthProviderWeb, reached by importingcapacitor-auth-manager/providers/web— rather than implied to be on theauthsingleton, where readers could not find it.
Not changed on purpose
- iOS
GoogleSignIn ~> 7.1stays. A major SDK bump without a compile check is not acceptable; it moves in a release that is verified on a Mac.
[2.4.4] - 2026-07-25
Fixed
- The README stated the previous version. The at-a-glance
Versionrow is a static duplicate ofpackage.json.version, so it drifted the moment the version was bumped — it shipped stale in eight of the fleet's packages at once. The row, and any native version string, now move with the release.
[2.4.3] — 2026-07-25
Documentation and metadata only — no runtime changes. Brings the package to the house README standard and, importantly, documents two High-severity defects that have been shipping since before this release. They are stated plainly in the README's Limitations section rather than left for a consumer to discover at runtime:
- The published ESM build does not resolve under bare Node.
moduleResolution: "bundler"emits 133 extensionless relative specifiers across 33 files. Bundlers resolve them; Node's ESM resolver does not, so SSR, Node-resolution test runners andnode --importall fail. - Importing the package throws
window is not defined. A module-scope singleton insrc/core/auth-manager.tsconstructs aWebStoragethat readswindow.localStorageunguarded. This also makessideEffects: falseuntrue.
Neither is fixed here — both need a code change and a version bump beyond a documentation patch. Every
conventional gate passes while they ship: typecheck, lint, build, the exports-map walk and even an
esbuild bundle are all green. Only installing the tarball and importing it under bare Node catches them.
Tracked in docs/REPORTED-ISSUES.md as ISSUE-001 and ISSUE-002.
Changed
- README rewritten to the canonical package pattern;
Readme.mdrenamed toREADME.md. homepagemoved off the npmjs.com page onto the documentation site.fundingadded;keywordsreduced from 24 to 9 honest terms.filesallowlist corrected to include thebinscript explicitly; inert.npmignoreremoved.
[2.4.2] — 2026-06-30
Native now actually compiles — Google-only native (verified). 2.4.1 shipped native sources that
had never been built in a real app; an end-to-end integration compile (a throwaway Capacitor app, real
Android gradle assembleDebug + iOS pod lib lint) surfaced and fixed the breakage. Use 2.4.2, not
2.4.1 (which is deprecated).
Changed
- Native is Google-only. Removed the Facebook (
FBSDKLoginKit/facebook-login) and Microsoft (MSAL) native dependencies so the plugin no longer drags heavy auth SDKs into every consumer app. The disabled providers' native code moved toandroid/disabled-native-providers/andios/disabled-native-providers/(kept for re-enablement; not compiled, not shipped).ProviderFactory(Android) andcreateProvider(iOS) are trimmed to Google; the JS layer already reportsPROVIDER_NOT_ENABLEDfor the rest. - iOS podspec slimmed to
Capacitor+GoogleSignIn ~> 7.1; removed the danglingSWIFT_OBJC_BRIDGING_HEADER(the file never existed; GoogleSignIn 7 is pure Swift).
Fixed (native compile errors that blocked every consumer build)
- Android:
com.facebook.android:facebook-login:17.0.3was unresolvable → build failed before any Java compiled.GoogleAuthProvidercaughtGoogleIdTokenParsingException, a checked exceptionGoogleIdTokenCredential.createFromdoesn't declare in googleid 1.1.1.getIdTokencalled the throwingJSObject.getBoolean(...)unguarded → unreportedJSONException. Verified withgradle :…:assembleDebug. - iOS:
CapacitorAuthManagerpassedAuthPersistence/AuthProviderenums where the storage API expectsString(.rawValue).Plugin.removeAllListeners(_:)nowoverride publics Capacitor 8's built-in and delegates tosuper. Verified withpod lib lint.
Both platforms now build in a clean Capacitor 8 app. Still verify Google sign-in on a real device before the fleet rollout (a successful compile is not a runtime test).
[2.4.1] — 2026-06-30
Google-first production refocus. This release turns the package into a working, Firebase-agnostic
Google authentication plugin across web, iOS and Android — a drop-in alternative to
@codetrix-studio/capacitor-google-auth. The remaining providers are being re-enabled one at a time
as each is hardened and verified on device; until then they report a clear PROVIDER_NOT_ENABLED error.
Versioning note: by maintainer choice this is a patch. Future providers land as minor bumps, fixes as patches, and a
3.0.0only once all providers are working again. If your app used a non-Google provider on2.4.0, stay on2.4.0until that provider is re-enabled.
Native build caveat: the iOS (Swift) and Android (Java) sources in this release were written to the official SDK contracts but are not compiled in CI. Validate
2.4.1in one app (web + one Android device + one iOS device) before rolling it out to a fleet.
Added
- Native dispatch.
auth.signIn(AuthProvider.GOOGLE)(and the React/Vue/AngularuseAuth().signIn) now route to the native Google SDK on iOS/Android and to Google Identity Services on web — the same call on every platform. Previously the modern API always ran the web flow, even inside a device webview. GoogleNativeProvider— a platform-bridge provider that delegates to theCapacitorAuthManagerCapacitor plugin (native Google SDK) and returns{ idToken, accessToken?, serverAuthCode?, user }.- Android Google rebuilt on Credential Manager (
androidx.credentials+GoogleIdTokenCredential), replacing the deprecated, brokenGoogleSignInactivity-result path (which never resolved). - Web Google rebuilt on the GIS id-token flow (
google.accounts.id) — no client secret, no backend; returns a GoogleidTokenyou can feed tosignInWithCredential(GoogleAuthProvider.credential(idToken)). AuthCredential.serverAuthCode,GoogleAuthOptions.iosClientId/filterByAuthorizedAccounts/autoSelectEnabled/nonce, andAuthErrorCode.PROVIDER_NOT_ENABLED.
Changed
- Only Google is enabled. The other 14 providers are un-registered and excluded from the published
build; their web implementations remain in the repo for re-enablement.
signIn()for any of them throwsAuthErrorCode.PROVIDER_NOT_ENABLEDwith a clear message. - No secrets persisted by default. The manager no longer writes
idToken/accessToken/refreshToken/serverAuthCodeto the default (unencrypted) storage — only a non-secret session snapshot. Short-lived tokens are re-derived via the provider's silent restore. Inject a secure storage adapter if you want token persistence. - Packaging:
prepacknow buildsdist/(sonpm packproduces an importable tarball, not justnpm publish);prepublishOnlyruns build + lint; addedengines.node >=18;@angular/corepeer range widened to include^22;CHANGELOG.mdnow ships; added./package.jsonexport; LICENSE copyright updated to 2024–2026.
Fixed
- iOS Google:
emailVerifiedwas wrongly derived from the profile image; replaced the deprecatedUIApplication.shared.windowspresenter lookup. - Web Google: removed the insecure client-side OAuth code→token exchange that required a
client_secretin the browser.
[2.4.0] — 2026-05-27
No runtime behavior change. Type-safety and tooling cleanup. Public types were tightened (see below), so TypeScript consumers may surface new, helpful type errors — hence a minor (not patch) bump. No public method was removed or renamed.
Changed (type safety)
- Eliminated all 37 remaining
no-explicit-anyoccurrences — the linter now reports 0 errors and 0 warnings. StorageInterfaceis now generic:get<T = unknown>(key): Promise<T | null>andset<T = unknown>(key, value: T)(wasPromise<any>/value: any). Existing custom-storage implementations remain compatible; direct callers now getunknownby default and should pass a type argument (storage.get<AuthUser>(key)) or narrow.- Angular adapter method parameters now use real types instead of
any:configure(config: AuthManagerConfig),initialize(config?),signIn(options?),signOut(options?: SignOutOptions), andAuthModuleConfig.providers: Record<string, ProviderOptions>. catch (error: any)blocks across the credential/biometric/registry providers now use a sharedgetErrorMessage(error: unknown)helper (src/utils/error-message.ts).provider-registryloader types andplatformchecks narrowed fromanyto precise types;phone-passwordbackend payload andbiometriccredential params are now typed.- Genuinely dynamic boundaries (optional-peer-dependency dynamic imports of
@capacitor/preferencesandcapacitor-biometric-authentication) retain a single documented// eslint-disable-next-lineinstead of an undocumentedany.
Changed (tooling)
- Completed the ESLint 9→10 migration started in 2.2.0: renamed
eslint.config.js→eslint.config.mjsand migrated the deprecated.eslintignoreinto the flat config'signores.npm run lintoutput is now free of deprecation notices.
[2.3.0] — 2026-05-26
No breaking changes. Backward-compatible minor release. This is an internal refactor only — no public method signature, runtime behavior, or provider list changed. There are still 15 web providers.
Internal
- Completed audit finding F-39: the 7 web providers that previously implemented
AuthProviderInterfacedirectly (magic-link,sms,email-code,email-password,username-password,phone-password,biometric) now extend the sharedBaseAuthProvider— the same base used by the OAuth and Firebase providers. All 15 web providers now share one construction, event, state, and capability-detection path, removing the duplicated lifecycle/state machinery the audit flagged. - Provider constructors accept either the injected
BaseProviderConfig(factory/registry path) or the provider's own bare config object (direct construction), via a sharedresolveProviderConfighelper. Existingnew XProvider(config)usage fromcapacitor-auth-manager/providers/webkeeps working unchanged. - Per-provider
linkAccount/unlinkAccountno-op throwers were removed in favor ofBaseAuthProvider'sOPERATION_NOT_ALLOWEDdefaults (completing F-44). Provider-specific capability behavior is preserved (biometricunlinkAccountand magic-link/sms/email-coderevokeAccessstill clear their stored/pending state). - Base capability-default error messages reworded to a consistent "… is not supported by provider …".
no-explicit-anylint warnings reduced from 45 to 37.
Verification
npm run buildclean ·npm run test:run→ 79 pass ·npm run lint→ 0 errors (37 warnings).
[2.2.0] — 2026-05-26
No breaking changes. This is a backward-compatible minor release — no public method signature was removed or changed in a breaking way. It repairs broken runtime paths, hardens security, completes the stub providers, and updates dependencies. There are 15 web providers: apple, biometric, email-code, email-password, facebook, firebase, github, google, linkedin, magic-link, microsoft, phone-password, slack, sms, username-password.
Dependencies
- Updated all dependencies to current stable. Dev/build majors applied:
@types/node25,eslint10,typescript6,@capacitor/*8, plus rollup, vitest, prettier, happy-dom, and others. - Widened peer ranges so existing consumers are not broken:
@capacitor/core:^7.4.2 || ^8.0.0(optional — only for the native plugin /CapacitorPreferencesStorage).@angular/core: extended through^21.0.0.react16.8–19,vue^3remain supported.
@capacitor/preferencesis an optional peer, required only forCapacitorPreferencesStorage.- iOS podspec deployment target raised from 13.0 to 14.0.
Security
- PKCE (S256) added to the authorization-code OAuth flow (manual flows — Slack, LinkedIn) per RFC 7636: a
code_verifieris generated and persisted withstate/nonce, andcode_challenge+code_challenge_method=S256are sent on the authorization request. Default-on for those flows; respectspkceEnabled. (Google uses Google Identity Services and Apple uses its SDK — both manage PKCE themselves.) - OIDC nonce + ID-token
expvalidation. The returned ID token'snonceis compared to the stored value (auth/invalid-nonceon mismatch) and theexpclaim is checked. ID-token signatures are not verified client-side — consumers must re-validate ID tokens against the provider's JWKS server-side before trusting claims. - Pluggable secure storage.
configure()accepts astorageoption (anyStorageInterface). New exportedCapacitorPreferencesStoragebacks storage with@capacitor/preferences(native key-value) so native tokens stay out of the webview'slocalStorage. The default web storage remainslocalStorage, which is readable by any XSS/third-party script — documented honestly; inject secure storage on native. Capacitor Preferences is not hardware-encrypted; use a Keychain/Keystore-backed adapter for secrecy at rest. - Biometric web fallback now uses real AES-GCM with a non-extractable IndexedDB key, replacing base64 encoding (existing base64 values remain decodable for compatibility).
client_secretdeprecated for browser use. Browser-facingclientSecret/appSecretfields are no longer read in browser token/refresh/revoke calls (a secret in the JS bundle is recoverable) and emit a one-time warning when supplied in a web context. Fields kept for backward compatibility.AuthError.detailsis sanitized — token/password keys are redacted and only JSON-safe primitives are retained.- CSPRNG (
crypto.randomUUID/crypto.getRandomValues) used for UID fallbacks; developer-supplied credential endpoints warn if non-HTTPS.
Fixes
- Primary
authAPI was broken at runtime for OAuth and credential providers — the provider registry constructedBaseAuthProvidersubclasses with raw options instead of aBaseProviderConfig, so storage/logger/options wereundefined. The registry now builds a proper config and injects shared storage + logger. This repaired path is what the React/Vue/Angular adapters use. - Credential threading —
auth.signIn({ provider, credentials })now reaches credential providers correctly (credentials spread to where each provider reads them). - Provider name resolution — underscore enum values (
username_password,email_code,phone_password,email_magic_link) now resolve to the correct registry loaders; added missing loaders foremail-codeandphone-password. - Session restore now runs after
configure()supplies providers, so a persisted session is rehydrated on reload (previously the auto-init-in-constructor left it dead). - GitHub sign-in completes via a developer-supplied
tokenExchangeProxy(aliastokenEndpoint); the per-initmessagelistener and popup interval no longer leak. Without a proxy, sign-in throwsauth/missing-config. - Slack and LinkedIn fetch real user profiles (Slack
openid.connect.userInfo, LinkedIn/v2/userinfo) instead of returning hardcoded placeholder identities. - Firebase sign-in method is derived from standard options/credentials, with a new
defaultMethodfallback (previously branched on an undocumented field the manager never sent). - Microsoft per-sign-in
scopes/loginHint/promptare mapped explicitly into the MSAL request. - Passwordless pending state (SMS / email-code / magic-link) is persisted (non-secret metadata only) so verification survives reload/redirect.
- Auto-refresh timer no longer overflows the 32-bit
setTimeoutceiling for far-future expiry; an untargetedsignOutclears all refresh timers;refreshTokentoken access is null-guarded. web.tsgetIdTokenno longer double-parses already-parsed storage;getCurrentUserisolates per-provider failures and sets the current provider; ApplerefreshTokenreturnsauth/operation-not-allowed; SMS/email-coderefreshTokenreturnauth/operation-not-allowed.- In-memory
persistence: 'memory'now correctly maps to in-memory storage (previously fell through tolocalStorage).
Features
- Account-management methods on the
authsingleton (and surfaced through the React/Vue/Angular adapters):linkAccount,unlinkAccount,revokeAccess,getIdToken,updateProfile,deleteAccount. Each delegates to the active provider and throwsauth/operation-not-allowedif unsupported. - New
isProviderConfigured(name)andgetConfiguredProviders()accessors on the singleton (also used by the adapters instead of reaching into private state). - New config field
GitHubAuthOptions.tokenExchangeProxy(aliastokenEndpoint) andFirebaseAuthOptions.defaultMethod. - New exports:
WebStorage,CapacitorPreferencesStorage,StorageInterface, and the shareddefaultLogger(plusLogger,LogLevel,LoggerConfig).
Internal
- Centralized logging. All package logging routes through a
Logger; zero directconsole.*calls remain outside the logger module. Default levelwarn; adjustable viaVITE_LOG_LEVEL/LOG_LEVEL(build-time) ordefaultLogger.setLevel()(runtime). The logger deliberately does not patch the host's globalconsoleor read the host'slocalStorage(documented deviations appropriate for a published library). - All standalone providers throw
AuthErrorCodeenum members instead of bare string codes; added additive enum members (e.g.CREDENTIALS_REQUIRED,INVALID_CODE,CODE_EXPIRED,INVALID_TOKEN,STORAGE_ERROR,PROVIDER_UNSUPPORTED_OPERATION). - Typing: replaced
anyin exported public types with concrete types. One acknowledged widening to a precise type —AuthManagerConfig.providersis nowRecord<string, ProviderOptions>instead ofany. Reduced SDK-boundaryany(minimal interface shapes for Firebase/MSAL/Facebook/GitHub) and internal mapper typing (lintno-explicit-anywarnings 138 → 45). - Extracted provider manifest data into
provider-manifests.ts(registry file 752 → 281 lines). - tsconfig
moduleResolutionnode10→bundler,moduleES2020→ESNext, addedrootDir; ESLint consolidated onto unifiedtypescript-eslint(dropped the banned@eslint/js).
Verification
npm run buildsucceeds;npm run test:run— 79 tests pass;npm run lint— 0 errors.
Earlier releases
0.0.1, 0.0.2, 1.0.0, 1.1.0 and 2.1.0 were published before this changelog was started, and no
per-version record of them was kept. They are listed here so the gap is visible rather than silent; the
published artefacts remain on
npm. Treat 2.2.0 as the first
release with a documented history.