@firebase/auth 1.13.1 → 1.13.2-eap-crashlytics.558ee841d

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 (62) hide show
  1. package/dist/browser-cjs/{index-58b444b9.js → index-223cb6d8.js} +55 -15
  2. package/dist/browser-cjs/index-223cb6d8.js.map +1 -0
  3. package/dist/browser-cjs/index.js +1 -1
  4. package/dist/browser-cjs/internal.js +1 -1
  5. package/dist/browser-cjs/src/platform_browser/recaptcha/recaptcha_enterprise_verifier.d.ts +18 -0
  6. package/dist/browser-cjs/test/helpers/mock_loadjs.d.ts +17 -0
  7. package/dist/cordova/index.js +2 -2
  8. package/dist/cordova/internal.js +2 -2
  9. package/dist/cordova/{popup_redirect-e90e6597.js → popup_redirect-8f954bab.js} +56 -16
  10. package/dist/cordova/popup_redirect-8f954bab.js.map +1 -0
  11. package/dist/cordova/src/platform_browser/recaptcha/recaptcha_enterprise_verifier.d.ts +18 -0
  12. package/dist/cordova/test/helpers/mock_loadjs.d.ts +17 -0
  13. package/dist/esm/{index-907e9a1a.js → index-42b2f63a.js} +56 -16
  14. package/dist/esm/index-42b2f63a.js.map +1 -0
  15. package/dist/esm/index.js +1 -1
  16. package/dist/esm/internal.js +2 -2
  17. package/dist/esm/src/platform_browser/recaptcha/recaptcha_enterprise_verifier.d.ts +18 -0
  18. package/dist/esm/test/helpers/mock_loadjs.d.ts +17 -0
  19. package/dist/index.webworker.js +55 -15
  20. package/dist/index.webworker.js.map +1 -1
  21. package/dist/node/index.js +1 -1
  22. package/dist/node/internal.js +1 -1
  23. package/dist/node/src/platform_browser/recaptcha/recaptcha_enterprise_verifier.d.ts +18 -0
  24. package/dist/node/test/helpers/mock_loadjs.d.ts +17 -0
  25. package/dist/node/{totp-ec1dc837.js → totp-1de3d98e.js} +39 -5
  26. package/dist/node/totp-1de3d98e.js.map +1 -0
  27. package/dist/node-esm/index.js +1 -1
  28. package/dist/node-esm/internal.js +2 -2
  29. package/dist/node-esm/src/platform_browser/recaptcha/recaptcha_enterprise_verifier.d.ts +18 -0
  30. package/dist/node-esm/test/helpers/mock_loadjs.d.ts +17 -0
  31. package/dist/node-esm/{totp-97daafa8.js → totp-16b08ec9.js} +40 -6
  32. package/dist/node-esm/totp-16b08ec9.js.map +1 -0
  33. package/dist/rn/{index-ec5272bc.js → index-3c01bc90.js} +39 -5
  34. package/dist/rn/index-3c01bc90.js.map +1 -0
  35. package/dist/rn/index.js +1 -1
  36. package/dist/rn/internal.js +18 -12
  37. package/dist/rn/internal.js.map +1 -1
  38. package/dist/rn/src/platform_browser/recaptcha/recaptcha_enterprise_verifier.d.ts +18 -0
  39. package/dist/rn/test/helpers/mock_loadjs.d.ts +17 -0
  40. package/dist/src/platform_browser/recaptcha/recaptcha_enterprise_verifier.d.ts +18 -0
  41. package/dist/test/helpers/mock_loadjs.d.ts +17 -0
  42. package/dist/web-extension-cjs/index.js +1 -1
  43. package/dist/web-extension-cjs/internal.js +1 -1
  44. package/dist/web-extension-cjs/{register-410eef86.js → register-6a93d6fa.js} +55 -15
  45. package/dist/web-extension-cjs/register-6a93d6fa.js.map +1 -0
  46. package/dist/web-extension-cjs/src/platform_browser/recaptcha/recaptcha_enterprise_verifier.d.ts +18 -0
  47. package/dist/web-extension-cjs/test/helpers/mock_loadjs.d.ts +17 -0
  48. package/dist/web-extension-esm/index.js +2 -2
  49. package/dist/web-extension-esm/internal.js +2 -2
  50. package/dist/web-extension-esm/{register-4207f7c7.js → register-6e13f5d2.js} +56 -16
  51. package/dist/web-extension-esm/register-6e13f5d2.js.map +1 -0
  52. package/dist/web-extension-esm/src/platform_browser/recaptcha/recaptcha_enterprise_verifier.d.ts +18 -0
  53. package/dist/web-extension-esm/test/helpers/mock_loadjs.d.ts +17 -0
  54. package/package.json +6 -6
  55. package/dist/browser-cjs/index-58b444b9.js.map +0 -1
  56. package/dist/cordova/popup_redirect-e90e6597.js.map +0 -1
  57. package/dist/esm/index-907e9a1a.js.map +0 -1
  58. package/dist/node/totp-ec1dc837.js.map +0 -1
  59. package/dist/node-esm/totp-97daafa8.js.map +0 -1
  60. package/dist/rn/index-ec5272bc.js.map +0 -1
  61. package/dist/web-extension-cjs/register-410eef86.js.map +0 -1
  62. package/dist/web-extension-esm/register-4207f7c7.js.map +0 -1
@@ -19,12 +19,30 @@ import { Auth } from '../../model/public_types';
19
19
  import { AuthInternal } from '../../model/auth';
20
20
  export declare const RECAPTCHA_ENTERPRISE_VERIFIER_TYPE = "recaptcha-enterprise";
21
21
  export declare const FAKE_TOKEN = "NO_RECAPTCHA";
22
+ export declare const RECAPTCHA_ENTERPRISE_ONLOAD_CALLBACK_NAME = "onFirebaseAuthREInstanceReady";
23
+ declare global {
24
+ interface Window {
25
+ [RECAPTCHA_ENTERPRISE_ONLOAD_CALLBACK_NAME]: () => void;
26
+ }
27
+ }
22
28
  export declare class RecaptchaEnterpriseVerifier {
23
29
  /**
24
30
  * Identifies the type of application verifier (e.g. "recaptcha-enterprise").
25
31
  */
26
32
  readonly type = "recaptcha-enterprise";
27
33
  private readonly auth;
34
+ /**
35
+ * Deferred that resolves when script tag has been injected onto the page
36
+ * and the script is ready (grecaptcha.ready() and script.onload are not
37
+ * reliable indicators, so this resolves when the global
38
+ * `window[RECAPTCHA_ENTERPRISE_ONLOAD_CALLBACK_NAME]()` callback provided to the recaptcha url param "onload"
39
+ * is triggered).
40
+ * As a static variable this is applied to all instances of the class.
41
+ * This will cause an error if users try to create multiple RecaptchaVerifiers
42
+ * with different Recaptcha Enterprise sitekeys, which should be an
43
+ * unuspported use case.
44
+ */
45
+ private static scriptInjectionDeferred;
28
46
  /**
29
47
  *
30
48
  * @param authExtern - The corresponding Firebase {@link Auth} instance.
@@ -0,0 +1,17 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Google LLC
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+ export declare const mockLoadJS: () => Promise<Event>;
@@ -1,5 +1,5 @@
1
1
  import { SDK_VERSION, _isFirebaseServerApp, _getProvider, _registerComponent, registerVersion, getApp } from '@firebase/app';
2
- import { ErrorFactory, isBrowserExtension, isMobileCordova, isReactNative, FirebaseError, querystring, isCloudflareWorker, isCloudWorkstation, getModularInstance, base64Decode, getUA, isIE, createSubscribe, deepEqual, pingServer, querystringDecode, extractQuerystring, isEmpty, getExperimentalSetting, getDefaultEmulatorHost } from '@firebase/util';
2
+ import { ErrorFactory, isBrowserExtension, isMobileCordova, isReactNative, FirebaseError, querystring, isCloudflareWorker, isCloudWorkstation, getModularInstance, base64Decode, getUA, isIE, createSubscribe, Deferred, deepEqual, pingServer, querystringDecode, extractQuerystring, isEmpty, getExperimentalSetting, getDefaultEmulatorHost } from '@firebase/util';
3
3
  import { Logger, LogLevel } from '@firebase/logger';
4
4
  import { Component } from '@firebase/component';
5
5
 
@@ -3429,6 +3429,7 @@ function generateRandomAlphaNumericString(len) {
3429
3429
  /* eslint-disable @typescript-eslint/no-require-imports */
3430
3430
  const RECAPTCHA_ENTERPRISE_VERIFIER_TYPE = 'recaptcha-enterprise';
3431
3431
  const FAKE_TOKEN = 'NO_RECAPTCHA';
3432
+ const RECAPTCHA_ENTERPRISE_ONLOAD_CALLBACK_NAME = 'onFirebaseAuthREInstanceReady';
3432
3433
  class RecaptchaEnterpriseVerifier {
3433
3434
  /**
3434
3435
  *
@@ -3508,8 +3509,13 @@ class RecaptchaEnterpriseVerifier {
3508
3509
  }
3509
3510
  return new Promise((resolve, reject) => {
3510
3511
  retrieveSiteKey(this.auth)
3511
- .then(siteKey => {
3512
- if (!forceRefresh && isEnterprise(window.grecaptcha)) {
3512
+ .then(async (siteKey) => {
3513
+ if (!forceRefresh &&
3514
+ isEnterprise(window.grecaptcha) &&
3515
+ // If download has already been initiated, do not trigger another
3516
+ // download, await the promise here.
3517
+ RecaptchaEnterpriseVerifier.scriptInjectionDeferred) {
3518
+ await RecaptchaEnterpriseVerifier.scriptInjectionDeferred.promise;
3513
3519
  retrieveRecaptchaToken(siteKey, resolve, reject);
3514
3520
  }
3515
3521
  else {
@@ -3519,9 +3525,25 @@ class RecaptchaEnterpriseVerifier {
3519
3525
  }
3520
3526
  let url = _recaptchaEnterpriseScriptUrl();
3521
3527
  if (url.length !== 0) {
3522
- url += siteKey;
3528
+ url +=
3529
+ siteKey +
3530
+ `&onload=${RECAPTCHA_ENTERPRISE_ONLOAD_CALLBACK_NAME}`;
3523
3531
  }
3532
+ // Existence of deferred indicates download has been initiated.
3533
+ RecaptchaEnterpriseVerifier.scriptInjectionDeferred =
3534
+ new Deferred();
3535
+ /**
3536
+ * Script attached to global window object that will be called
3537
+ * when the ReCAPTCHA Enterprise instance is ready.
3538
+ * grecaptcha.ready() is not reliable when there are multiple
3539
+ * scripts on the page, and script.onload only indicates the
3540
+ * script has downloaded, not that it has initialized.
3541
+ */
3542
+ window[RECAPTCHA_ENTERPRISE_ONLOAD_CALLBACK_NAME] = () => {
3543
+ RecaptchaEnterpriseVerifier.scriptInjectionDeferred?.resolve();
3544
+ };
3524
3545
  _loadJS(url)
3546
+ .then(() => RecaptchaEnterpriseVerifier.scriptInjectionDeferred?.promise)
3525
3547
  .then(() => {
3526
3548
  retrieveRecaptchaToken(siteKey, resolve, reject);
3527
3549
  })
@@ -3536,6 +3558,18 @@ class RecaptchaEnterpriseVerifier {
3536
3558
  });
3537
3559
  }
3538
3560
  }
3561
+ /**
3562
+ * Deferred that resolves when script tag has been injected onto the page
3563
+ * and the script is ready (grecaptcha.ready() and script.onload are not
3564
+ * reliable indicators, so this resolves when the global
3565
+ * `window[RECAPTCHA_ENTERPRISE_ONLOAD_CALLBACK_NAME]()` callback provided to the recaptcha url param "onload"
3566
+ * is triggered).
3567
+ * As a static variable this is applied to all instances of the class.
3568
+ * This will cause an error if users try to create multiple RecaptchaVerifiers
3569
+ * with different Recaptcha Enterprise sitekeys, which should be an
3570
+ * unuspported use case.
3571
+ */
3572
+ RecaptchaEnterpriseVerifier.scriptInjectionDeferred = null;
3539
3573
  async function injectRecaptchaFields(auth, request, action, isCaptchaResp = false, isFakeToken = false) {
3540
3574
  const verifier = new RecaptchaEnterpriseVerifier(auth);
3541
3575
  let captchaResponse;
@@ -8191,6 +8225,7 @@ const _TRANSACTION_RETRY_COUNT = 3;
8191
8225
  class IndexedDBLocalPersistence {
8192
8226
  constructor() {
8193
8227
  this.type = "LOCAL" /* PersistenceType.LOCAL */;
8228
+ this.dbPromise = null;
8194
8229
  this._shouldAllowMigration = true;
8195
8230
  this.listeners = {};
8196
8231
  this.localCache = {};
@@ -8207,11 +8242,14 @@ class IndexedDBLocalPersistence {
8207
8242
  this.initializeServiceWorkerMessaging().then(() => { }, () => { });
8208
8243
  }
8209
8244
  async _openDb() {
8210
- if (this.db) {
8211
- return this.db;
8245
+ if (this.dbPromise) {
8246
+ return this.dbPromise;
8212
8247
  }
8213
- this.db = await _openDatabase();
8214
- return this.db;
8248
+ this.dbPromise = _openDatabase();
8249
+ this.dbPromise.catch(() => {
8250
+ this.dbPromise = null;
8251
+ });
8252
+ return this.dbPromise;
8215
8253
  }
8216
8254
  async _withRetries(op) {
8217
8255
  let numAttempts = 0;
@@ -8224,9 +8262,10 @@ class IndexedDBLocalPersistence {
8224
8262
  if (numAttempts++ > _TRANSACTION_RETRY_COUNT) {
8225
8263
  throw e;
8226
8264
  }
8227
- if (this.db) {
8228
- this.db.close();
8229
- this.db = undefined;
8265
+ if (this.dbPromise) {
8266
+ const db = await this.dbPromise;
8267
+ db.close();
8268
+ this.dbPromise = null;
8230
8269
  }
8231
8270
  // TODO: consider adding exponential backoff
8232
8271
  }
@@ -8311,9 +8350,10 @@ class IndexedDBLocalPersistence {
8311
8350
  if (!indexedDB) {
8312
8351
  return false;
8313
8352
  }
8314
- const db = await _openDatabase();
8315
- await _putObject(db, STORAGE_AVAILABLE_KEY, '1');
8316
- await _deleteObject(db, STORAGE_AVAILABLE_KEY);
8353
+ await this._withRetries(async (db) => {
8354
+ await _putObject(db, STORAGE_AVAILABLE_KEY, '1');
8355
+ await _deleteObject(db, STORAGE_AVAILABLE_KEY);
8356
+ });
8317
8357
  return true;
8318
8358
  }
8319
8359
  catch { }
@@ -10899,7 +10939,7 @@ function _isEmptyString(input) {
10899
10939
  }
10900
10940
 
10901
10941
  var name = "@firebase/auth";
10902
- var version = "1.13.1";
10942
+ var version = "1.13.2-eap-crashlytics.558ee841d";
10903
10943
 
10904
10944
  /**
10905
10945
  * @license
@@ -11152,4 +11192,4 @@ _setExternalJSProvider({
11152
11192
  registerAuth("Browser" /* ClientPlatform.BROWSER */);
11153
11193
 
11154
11194
  export { SAMLAuthProvider as $, ActionCodeOperation as A, useDeviceLanguage as B, updateCurrentUser as C, signOut as D, revokeAccessToken as E, FactorId as F, deleteUser as G, debugErrorMap as H, prodErrorMap as I, AUTH_ERROR_CODES_MAP_DO_NOT_USE_INTERNALLY as J, initializeAuth as K, connectAuthEmulator as L, AuthCredential as M, EmailAuthCredential as N, OperationType as O, PhoneAuthProvider as P, OAuthCredential as Q, RecaptchaVerifier as R, SignInMethod as S, TotpMultiFactorGenerator as T, PhoneAuthCredential as U, inMemoryPersistence as V, EmailAuthProvider as W, FacebookAuthProvider as X, GoogleAuthProvider as Y, GithubAuthProvider as Z, OAuthProvider as _, browserCookiePersistence as a, TwitterAuthProvider as a0, signInAnonymously as a1, signInWithCredential as a2, linkWithCredential as a3, reauthenticateWithCredential as a4, signInWithCustomToken as a5, sendPasswordResetEmail as a6, confirmPasswordReset as a7, applyActionCode as a8, checkActionCode as a9, _getProjectConfig as aA, _isIOS7Or8 as aB, _createError as aC, _assert as aD, AuthEventManager as aE, _getInstance as aF, _persistenceKeyName as aG, _getRedirectResult as aH, _overrideRedirectResult as aI, _clearRedirectOutcomes as aJ, _castAuth as aK, UserImpl as aL, AuthImpl as aM, _getClientVersion as aN, _generateEventId as aO, AuthPopup as aP, FetchProvider as aQ, SAMLAuthCredential as aR, verifyPasswordResetCode as aa, createUserWithEmailAndPassword as ab, signInWithEmailAndPassword as ac, sendSignInLinkToEmail as ad, isSignInWithEmailLink as ae, signInWithEmailLink as af, fetchSignInMethodsForEmail as ag, sendEmailVerification as ah, verifyBeforeUpdateEmail as ai, ActionCodeURL as aj, parseActionCodeURL as ak, updateProfile as al, updateEmail as am, updatePassword as an, getIdToken as ao, getIdTokenResult as ap, unlink as aq, getAdditionalUserInfo as ar, reload as as, getMultiFactorResolver as at, multiFactor as au, debugAssert as av, _isIOS as aw, _isAndroid as ax, _fail as ay, _getRedirectUrl as az, browserLocalPersistence as b, browserSessionPersistence as c, signInWithPopup as d, linkWithPopup as e, reauthenticateWithPopup as f, signInWithRedirect as g, linkWithRedirect as h, indexedDBLocalPersistence as i, reauthenticateWithRedirect as j, getRedirectResult as k, linkWithPhoneNumber as l, browserPopupRedirectResolver as m, PhoneMultiFactorGenerator as n, TotpSecret as o, getAuth as p, ProviderId as q, reauthenticateWithPhoneNumber as r, signInWithPhoneNumber as s, setPersistence as t, updatePhoneNumber as u, initializeRecaptchaConfig as v, validatePassword as w, onIdTokenChanged as x, beforeAuthStateChanged as y, onAuthStateChanged as z };
11155
- //# sourceMappingURL=index-907e9a1a.js.map
11195
+ //# sourceMappingURL=index-42b2f63a.js.map