1import { 2 Auth, 3 Component, 4 ErrorFactory, 5 FirebaseApp, 6 FirebaseApps, 7 FirebaseError, 8 Logger, 9 VERSION, 10 _getProvider, 11 _registerComponent, 12 areCookiesEnabled, 13 authState, 14 calculateBackoffMillis, 15 deepEqual, 16 getApp, 17 getModularInstance, 18 isBrowserExtension, 19 isIndexedDBAvailable, 20 openDB, 21 registerVersion, 22 validateIndexedDBOpenable, 23 ɵAngularFireSchedulers, 24 ɵgetAllInstancesOf, 25 ɵgetDefaultInstanceOf, 26 ɵzoneWrap 27} from "./chunk-7WCEHMIK.js"; 28import { 29 ActivationEnd, 30 ComponentFactoryResolver$1, 31 Injectable, 32 InjectionToken, 33 Injector, 34 NgModule, 35 NgZone, 36 Optional, 37 PLATFORM_ID, 38 Router, 39 Title, 40 __async, 41 __spreadProps, 42 __spreadValues, 43 concatMap, 44 distinct, 45 distinctUntilChanged, 46 filter, 47 from, 48 groupBy, 49 isPlatformBrowser, 50 makeEnvironmentProviders, 51 map, 52 mergeMap, 53 of, 54 pairwise, 55 setClassMetadata, 56 startWith, 57 switchMap, 58 timer, 59 ɵEmptyOutletComponent, 60 ɵɵdefineInjectable, 61 ɵɵdefineInjector, 62 ɵɵdefineNgModule, 63 ɵɵinject 64} from "./chunk-J7O7R22V.js"; 65
vendor: 20,129 bytes, lines 66-682
66// node_modules/@firebase/installations/dist/esm/index.esm2017.js 67var name = "@firebase/installations"; 68var version = "0.6.18"; 69var PENDING_TIMEOUT_MS = 1e4; 70var PACKAGE_VERSION = `w:${version}`; 71var INTERNAL_AUTH_VERSION = "FIS_v2"; 72var INSTALLATIONS_API_URL = "https://firebaseinstallations.googleapis.com/v1"; 73var TOKEN_EXPIRATION_BUFFER = 60 * 60 * 1e3; 74var SERVICE = "installations"; 75var SERVICE_NAME = "Installations"; 76var ERROR_DESCRIPTION_MAP = { 77 [ 78 "missing-app-config-values" 79 /* ErrorCode.MISSING_APP_CONFIG_VALUES */ 80 ]: 'Missing App configuration value: "{$valueName}"', 81 [ 82 "not-registered" 83 /* ErrorCode.NOT_REGISTERED */ 84 ]: "Firebase Installation is not registered.", 85 [ 86 "installation-not-found" 87 /* ErrorCode.INSTALLATION_NOT_FOUND */ 88 ]: "Firebase Installation not found.", 89 [ 90 "request-failed" 91 /* ErrorCode.REQUEST_FAILED */ 92 ]: '{$requestName} request failed with error "{$serverCode} {$serverStatus}: {$serverMessage}"', 93 [ 94 "app-offline" 95 /* ErrorCode.APP_OFFLINE */ 96 ]: "Could not process request. Application offline.", 97 [ 98 "delete-pending-registration" 99 /* ErrorCode.DELETE_PENDING_REGISTRATION */ 100 ]: "Can't delete installation while there is a pending registration request." 101}; 102var ERROR_FACTORY = new ErrorFactory(SERVICE, SERVICE_NAME, ERROR_DESCRIPTION_MAP); 103function isServerError(error) { 104 return error instanceof FirebaseError && error.code.includes( 105 "request-failed" 106 /* ErrorCode.REQUEST_FAILED */ 107 ); 108} 109function getInstallationsEndpoint({ projectId }) { 110 return `${INSTALLATIONS_API_URL}/projects/${projectId}/installations`; 111} 112function extractAuthTokenInfoFromResponse(response) { 113 return { 114 token: response.token, 115 requestStatus: 2, 116 expiresIn: getExpiresInFromResponseExpiresIn(response.expiresIn), 117 creationTime: Date.now() 118 }; 119} 120function getErrorFromResponse(requestName, response) { 121 return __async(this, null, function* () { 122 const responseJson = yield response.json(); 123 const errorData = responseJson.error; 124 return ERROR_FACTORY.create("request-failed", { 125 requestName, 126 serverCode: errorData.code, 127 serverMessage: errorData.message, 128 serverStatus: errorData.status 129 }); 130 }); 131} 132function getHeaders({ apiKey }) { 133 return new Headers({ 134 "Content-Type": "application/json", 135 Accept: "application/json", 136 "x-goog-api-key": apiKey 137 }); 138} 139function getHeadersWithAuth(appConfig, { refreshToken }) { 140 const headers = getHeaders(appConfig); 141 headers.append("Authorization", getAuthorizationHeader(refreshToken)); 142 return headers; 143} 144function retryIfServerError(fn) { 145 return __async(this, null, function* () { 146 const result = yield fn(); 147 if (result.status >= 500 && result.status < 600) { 148 return fn(); 149 } 150 return result; 151 }); 152} 153function getExpiresInFromResponseExpiresIn(responseExpiresIn) { 154 return Number(responseExpiresIn.replace("s", "000")); 155} 156function getAuthorizationHeader(refreshToken) { 157 return `${INTERNAL_AUTH_VERSION} ${refreshToken}`; 158} 159function createInstallationRequest(_0, _1) { 160 return __async(this, arguments, function* ({ appConfig, heartbeatServiceProvider }, { fid }) { 161 const endpoint = getInstallationsEndpoint(appConfig); 162 const headers = getHeaders(appConfig); 163 const heartbeatService = heartbeatServiceProvider.getImmediate({ 164 optional: true 165 }); 166 if (heartbeatService) { 167 const heartbeatsHeader = yield heartbeatService.getHeartbeatsHeader(); 168 if (heartbeatsHeader) { 169 headers.append("x-firebase-client", heartbeatsHeader); 170 } 171 } 172 const body = { 173 fid, 174 authVersion: INTERNAL_AUTH_VERSION, 175 appId: appConfig.appId, 176 sdkVersion: PACKAGE_VERSION 177 }; 178 const request = { 179 method: "POST", 180 headers, 181 body: JSON.stringify(body) 182 }; 183 const response = yield retryIfServerError(() => fetch(endpoint, request)); 184 if (response.ok) { 185 const responseValue = yield response.json(); 186 const registeredInstallationEntry = { 187 fid: responseValue.fid || fid, 188 registrationStatus: 2, 189 refreshToken: responseValue.refreshToken, 190 authToken: extractAuthTokenInfoFromResponse(responseValue.authToken) 191 }; 192 return registeredInstallationEntry; 193 } else { 194 throw yield getErrorFromResponse("Create Installation", response); 195 } 196 }); 197} 198function sleep(ms) { 199 return new Promise((resolve) => { 200 setTimeout(resolve, ms); 201 }); 202} 203function bufferToBase64UrlSafe(array) { 204 const b64 = btoa(String.fromCharCode(...array)); 205 return b64.replace(/\+/g, "-").replace(/\//g, "_"); 206} 207var VALID_FID_PATTERN = /^[cdef][\w-]{21}$/; 208var INVALID_FID = ""; 209function generateFid() { 210 try { 211 const fidByteArray = new Uint8Array(17); 212 const crypto = self.crypto || self.msCrypto; 213 crypto.getRandomValues(fidByteArray); 214 fidByteArray[0] = 112 + fidByteArray[0] % 16; 215 const fid = encode(fidByteArray); 216 return VALID_FID_PATTERN.test(fid) ? fid : INVALID_FID; 217 } catch (_a) { 218 return INVALID_FID; 219 } 220} 221function encode(fidByteArray) { 222 const b64String = bufferToBase64UrlSafe(fidByteArray); 223 return b64String.substr(0, 22); 224} 225function getKey(appConfig) { 226 return `${appConfig.appName}!${appConfig.appId}`; 227} 228var fidChangeCallbacks = /* @__PURE__ */ new Map(); 229function fidChanged(appConfig, fid) { 230 const key = getKey(appConfig); 231 callFidChangeCallbacks(key, fid); 232 broadcastFidChange(key, fid); 233} 234function callFidChangeCallbacks(key, fid) { 235 const callbacks = fidChangeCallbacks.get(key); 236 if (!callbacks) { 237 return; 238 } 239 for (const callback of callbacks) { 240 callback(fid); 241 } 242} 243function broadcastFidChange(key, fid) { 244 const channel = getBroadcastChannel(); 245 if (channel) { 246 channel.postMessage({ key, fid }); 247 } 248 closeBroadcastChannel(); 249} 250var broadcastChannel = null; 251function getBroadcastChannel() { 252 if (!broadcastChannel && "BroadcastChannel" in self) { 253 broadcastChannel = new BroadcastChannel("[Firebase] FID Change"); 254 broadcastChannel.onmessage = (e) => { 255 callFidChangeCallbacks(e.data.key, e.data.fid); 256 }; 257 } 258 return broadcastChannel; 259} 260function closeBroadcastChannel() { 261 if (fidChangeCallbacks.size === 0 && broadcastChannel) { 262 broadcastChannel.close(); 263 broadcastChannel = null; 264 } 265} 266var DATABASE_NAME = "firebase-installations-database"; 267var DATABASE_VERSION = 1; 268var OBJECT_STORE_NAME = "firebase-installations-store"; 269var dbPromise = null; 270function getDbPromise() { 271 if (!dbPromise) { 272 dbPromise = openDB(DATABASE_NAME, DATABASE_VERSION, { 273 upgrade: (db, oldVersion) => { 274 switch (oldVersion) { 275 case 0: 276 db.createObjectStore(OBJECT_STORE_NAME); 277 } 278 } 279 }); 280 } 281 return dbPromise; 282} 283function set(appConfig, value) { 284 return __async(this, null, function* () { 285 const key = getKey(appConfig); 286 const db = yield getDbPromise(); 287 const tx = db.transaction(OBJECT_STORE_NAME, "readwrite"); 288 const objectStore = tx.objectStore(OBJECT_STORE_NAME); 289 const oldValue = yield objectStore.get(key); 290 yield objectStore.put(value, key); 291 yield tx.done; 292 if (!oldValue || oldValue.fid !== value.fid) { 293 fidChanged(appConfig, value.fid); 294 } 295 return value; 296 }); 297} 298function remove(appConfig) { 299 return __async(this, null, function* () { 300 const key = getKey(appConfig); 301 const db = yield getDbPromise(); 302 const tx = db.transaction(OBJECT_STORE_NAME, "readwrite"); 303 yield tx.objectStore(OBJECT_STORE_NAME).delete(key); 304 yield tx.done; 305 }); 306} 307function update(appConfig, updateFn) { 308 return __async(this, null, function* () { 309 const key = getKey(appConfig); 310 const db = yield getDbPromise(); 311 const tx = db.transaction(OBJECT_STORE_NAME, "readwrite"); 312 const store = tx.objectStore(OBJECT_STORE_NAME); 313 const oldValue = yield store.get(key); 314 const newValue = updateFn(oldValue); 315 if (newValue === void 0) { 316 yield store.delete(key); 317 } else { 318 yield store.put(newValue, key); 319 } 320 yield tx.done; 321 if (newValue && (!oldValue || oldValue.fid !== newValue.fid)) { 322 fidChanged(appConfig, newValue.fid); 323 } 324 return newValue; 325 }); 326} 327function getInstallationEntry(installations) { 328 return __async(this, null, function* () { 329 let registrationPromise; 330 const installationEntry = yield update(installations.appConfig, (oldEntry) => { 331 const installationEntry2 = updateOrCreateInstallationEntry(oldEntry); 332 const entryWithPromise = triggerRegistrationIfNecessary(installations, installationEntry2); 333 registrationPromise = entryWithPromise.registrationPromise; 334 return entryWithPromise.installationEntry; 335 }); 336 if (installationEntry.fid === INVALID_FID) { 337 return { installationEntry: yield registrationPromise }; 338 } 339 return { 340 installationEntry, 341 registrationPromise 342 }; 343 }); 344} 345function updateOrCreateInstallationEntry(oldEntry) { 346 const entry = oldEntry || { 347 fid: generateFid(), 348 registrationStatus: 0 349 /* RequestStatus.NOT_STARTED */ 350 }; 351 return clearTimedOutRequest(entry); 352} 353function triggerRegistrationIfNecessary(installations, installationEntry) { 354 if (installationEntry.registrationStatus === 0) { 355 if (!navigator.onLine) { 356 const registrationPromiseWithError = Promise.reject(ERROR_FACTORY.create( 357 "app-offline" 358 /* ErrorCode.APP_OFFLINE */ 359 )); 360 return { 361 installationEntry, 362 registrationPromise: registrationPromiseWithError 363 }; 364 } 365 const inProgressEntry = { 366 fid: installationEntry.fid, 367 registrationStatus: 1, 368 registrationTime: Date.now() 369 }; 370 const registrationPromise = registerInstallation(installations, inProgressEntry); 371 return { installationEntry: inProgressEntry, registrationPromise }; 372 } else if (installationEntry.registrationStatus === 1) { 373 return { 374 installationEntry, 375 registrationPromise: waitUntilFidRegistration(installations) 376 }; 377 } else { 378 return { installationEntry }; 379 } 380} 381function registerInstallation(installations, installationEntry) { 382 return __async(this, null, function* () { 383 try { 384 const registeredInstallationEntry = yield createInstallationRequest(installations, installationEntry); 385 return set(installations.appConfig, registeredInstallationEntry); 386 } catch (e) { 387 if (isServerError(e) && e.customData.serverCode === 409) { 388 yield remove(installations.appConfig); 389 } else { 390 yield set(installations.appConfig, { 391 fid: installationEntry.fid, 392 registrationStatus: 0 393 /* RequestStatus.NOT_STARTED */ 394 }); 395 } 396 throw e; 397 } 398 }); 399} 400function waitUntilFidRegistration(installations) { 401 return __async(this, null, function* () { 402 let entry = yield updateInstallationRequest(installations.appConfig); 403 while (entry.registrationStatus === 1) { 404 yield sleep(100); 405 entry = yield updateInstallationRequest(installations.appConfig); 406 } 407 if (entry.registrationStatus === 0) { 408 const { installationEntry, registrationPromise } = yield getInstallationEntry(installations); 409 if (registrationPromise) { 410 return registrationPromise; 411 } else { 412 return installationEntry; 413 } 414 } 415 return entry; 416 }); 417} 418function updateInstallationRequest(appConfig) { 419 return update(appConfig, (oldEntry) => { 420 if (!oldEntry) { 421 throw ERROR_FACTORY.create( 422 "installation-not-found" 423 /* ErrorCode.INSTALLATION_NOT_FOUND */ 424 ); 425 } 426 return clearTimedOutRequest(oldEntry); 427 }); 428} 429function clearTimedOutRequest(entry) { 430 if (hasInstallationRequestTimedOut(entry)) { 431 return { 432 fid: entry.fid, 433 registrationStatus: 0 434 /* RequestStatus.NOT_STARTED */ 435 }; 436 } 437 return entry; 438} 439function hasInstallationRequestTimedOut(installationEntry) { 440 return installationEntry.registrationStatus === 1 && installationEntry.registrationTime + PENDING_TIMEOUT_MS < Date.now(); 441} 442function generateAuthTokenRequest(_0, _1) { 443 return __async(this, arguments, function* ({ appConfig, heartbeatServiceProvider }, installationEntry) { 444 const endpoint = getGenerateAuthTokenEndpoint(appConfig, installationEntry); 445 const headers = getHeadersWithAuth(appConfig, installationEntry); 446 const heartbeatService = heartbeatServiceProvider.getImmediate({ 447 optional: true 448 }); 449 if (heartbeatService) { 450 const heartbeatsHeader = yield heartbeatService.getHeartbeatsHeader(); 451 if (heartbeatsHeader) { 452 headers.append("x-firebase-client", heartbeatsHeader); 453 } 454 } 455 const body = { 456 installation: { 457 sdkVersion: PACKAGE_VERSION, 458 appId: appConfig.appId 459 } 460 }; 461 const request = { 462 method: "POST", 463 headers, 464 body: JSON.stringify(body) 465 }; 466 const response = yield retryIfServerError(() => fetch(endpoint, request)); 467 if (response.ok) { 468 const responseValue = yield response.json(); 469 const completedAuthToken = extractAuthTokenInfoFromResponse(responseValue); 470 return completedAuthToken; 471 } else { 472 throw yield getErrorFromResponse("Generate Auth Token", response); 473 } 474 }); 475} 476function getGenerateAuthTokenEndpoint(appConfig, { fid }) { 477 return `${getInstallationsEndpoint(appConfig)}/${fid}/authTokens:generate`; 478} 479function refreshAuthToken(installations, forceRefresh = false) { 480 return __async(this, null, function* () { 481 let tokenPromise; 482 const entry = yield update(installations.appConfig, (oldEntry) => { 483 if (!isEntryRegistered(oldEntry)) { 484 throw ERROR_FACTORY.create( 485 "not-registered" 486 /* ErrorCode.NOT_REGISTERED */ 487 ); 488 } 489 const oldAuthToken = oldEntry.authToken; 490 if (!forceRefresh && isAuthTokenValid(oldAuthToken)) { 491 return oldEntry; 492 } else if (oldAuthToken.requestStatus === 1) { 493 tokenPromise = waitUntilAuthTokenRequest(installations, forceRefresh); 494 return oldEntry; 495 } else { 496 if (!navigator.onLine) { 497 throw ERROR_FACTORY.create( 498 "app-offline" 499 /* ErrorCode.APP_OFFLINE */ 500 ); 501 } 502 const inProgressEntry = makeAuthTokenRequestInProgressEntry(oldEntry); 503 tokenPromise = fetchAuthTokenFromServer(installations, inProgressEntry); 504 return inProgressEntry; 505 } 506 }); 507 const authToken = tokenPromise ? yield tokenPromise : entry.authToken; 508 return authToken; 509 }); 510} 511function waitUntilAuthTokenRequest(installations, forceRefresh) { 512 return __async(this, null, function* () { 513 let entry = yield updateAuthTokenRequest(installations.appConfig); 514 while (entry.authToken.requestStatus === 1) { 515 yield sleep(100); 516 entry = yield updateAuthTokenRequest(installations.appConfig); 517 } 518 const authToken = entry.authToken; 519 if (authToken.requestStatus === 0) { 520 return refreshAuthToken(installations, forceRefresh); 521 } else { 522 return authToken; 523 } 524 }); 525} 526function updateAuthTokenRequest(appConfig) { 527 return update(appConfig, (oldEntry) => { 528 if (!isEntryRegistered(oldEntry)) { 529 throw ERROR_FACTORY.create( 530 "not-registered" 531 /* ErrorCode.NOT_REGISTERED */ 532 ); 533 } 534 const oldAuthToken = oldEntry.authToken; 535 if (hasAuthTokenRequestTimedOut(oldAuthToken)) { 536 return Object.assign(Object.assign({}, oldEntry), { authToken: { 537 requestStatus: 0 538 /* RequestStatus.NOT_STARTED */ 539 } }); 540 } 541 return oldEntry; 542 }); 543} 544function fetchAuthTokenFromServer(installations, installationEntry) { 545 return __async(this, null, function* () { 546 try { 547 const authToken = yield generateAuthTokenRequest(installations, installationEntry); 548 const updatedInstallationEntry = Object.assign(Object.assign({}, installationEntry), { authToken }); 549 yield set(installations.appConfig, updatedInstallationEntry); 550 return authToken; 551 } catch (e) { 552 if (isServerError(e) && (e.customData.serverCode === 401 || e.customData.serverCode === 404)) { 553 yield remove(installations.appConfig); 554 } else { 555 const updatedInstallationEntry = Object.assign(Object.assign({}, installationEntry), { authToken: { 556 requestStatus: 0 557 /* RequestStatus.NOT_STARTED */ 558 } }); 559 yield set(installations.appConfig, updatedInstallationEntry); 560 } 561 throw e; 562 } 563 }); 564} 565function isEntryRegistered(installationEntry) { 566 return installationEntry !== void 0 && installationEntry.registrationStatus === 2; 567} 568function isAuthTokenValid(authToken) { 569 return authToken.requestStatus === 2 && !isAuthTokenExpired(authToken); 570} 571function isAuthTokenExpired(authToken) { 572 const now = Date.now(); 573 return now < authToken.creationTime || authToken.creationTime + authToken.expiresIn < now + TOKEN_EXPIRATION_BUFFER; 574} 575function makeAuthTokenRequestInProgressEntry(oldEntry) { 576 const inProgressAuthToken = { 577 requestStatus: 1, 578 requestTime: Date.now() 579 }; 580 return Object.assign(Object.assign({}, oldEntry), { authToken: inProgressAuthToken }); 581} 582function hasAuthTokenRequestTimedOut(authToken) { 583 return authToken.requestStatus === 1 && authToken.requestTime + PENDING_TIMEOUT_MS < Date.now(); 584} 585function getId(installations) { 586 return __async(this, null, function* () { 587 const installationsImpl = installations; 588 const { installationEntry, registrationPromise } = yield getInstallationEntry(installationsImpl); 589 if (registrationPromise) { 590 registrationPromise.catch(console.error); 591 } else { 592 refreshAuthToken(installationsImpl).catch(console.error); 593 } 594 return installationEntry.fid; 595 }); 596} 597function getToken(installations, forceRefresh = false) { 598 return __async(this, null, function* () { 599 const installationsImpl = installations; 600 yield completeInstallationRegistration(installationsImpl); 601 const authToken = yield refreshAuthToken(installationsImpl, forceRefresh); 602 return authToken.token; 603 }); 604} 605function completeInstallationRegistration(installations) { 606 return __async(this, null, function* () { 607 const { registrationPromise } = yield getInstallationEntry(installations); 608 if (registrationPromise) { 609 yield registrationPromise; 610 } 611 }); 612} 613function extractAppConfig(app) { 614 if (!app || !app.options) { 615 throw getMissingValueError("App Configuration"); 616 } 617 if (!app.name) { 618 throw getMissingValueError("App Name"); 619 } 620 const configKeys = [ 621 "projectId", 622 "apiKey", 623 "appId" 624 ]; 625 for (const keyName of configKeys) { 626 if (!app.options[keyName]) { 627 throw getMissingValueError(keyName); 628 } 629 } 630 return { 631 appName: app.name, 632 projectId: app.options.projectId, 633 apiKey: app.options.apiKey, 634 appId: app.options.appId 635 }; 636} 637function getMissingValueError(valueName) { 638 return ERROR_FACTORY.create("missing-app-config-values", { 639 valueName 640 }); 641} 642var INSTALLATIONS_NAME = "installations"; 643var INSTALLATIONS_NAME_INTERNAL = "installations-internal"; 644var publicFactory = (container) => { 645 const app = container.getProvider("app").getImmediate(); 646 const appConfig = extractAppConfig(app); 647 const heartbeatServiceProvider = _getProvider(app, "heartbeat"); 648 const installationsImpl = { 649 app, 650 appConfig, 651 heartbeatServiceProvider, 652 _delete: () => Promise.resolve() 653 }; 654 return installationsImpl; 655}; 656var internalFactory = (container) => { 657 const app = container.getProvider("app").getImmediate(); 658 const installations = _getProvider(app, INSTALLATIONS_NAME).getImmediate(); 659 const installationsInternal = { 660 getId: () => getId(installations), 661 getToken: (forceRefresh) => getToken(installations, forceRefresh) 662 }; 663 return installationsInternal; 664}; 665function registerInstallations() { 666 _registerComponent(new Component( 667 INSTALLATIONS_NAME, 668 publicFactory, 669 "PUBLIC" 670 /* ComponentType.PUBLIC */ 671 )); 672 _registerComponent(new Component( 673 INSTALLATIONS_NAME_INTERNAL, 674 internalFactory, 675 "PRIVATE" 676 /* ComponentType.PRIVATE */ 677 )); 678} 679registerInstallations(); 680registerVersion(name, version); 681registerVersion(name, version, "esm2017"); 682
vendor: 27,027 bytes, lines 683-1386
683// node_modules/@firebase/analytics/dist/esm/index.esm2017.js 684var ANALYTICS_TYPE = "analytics"; 685var GA_FID_KEY = "firebase_id"; 686var ORIGIN_KEY = "origin"; 687var FETCH_TIMEOUT_MILLIS = 60 * 1e3; 688var DYNAMIC_CONFIG_URL = "https://firebase.googleapis.com/v1alpha/projects/-/apps/{app-id}/webConfig"; 689var GTAG_URL = "https://www.googletagmanager.com/gtag/js"; 690var logger = new Logger("@firebase/analytics"); 691var ERRORS = { 692 [ 693 "already-exists" 694 /* AnalyticsError.ALREADY_EXISTS */ 695 ]: "A Firebase Analytics instance with the appId {$id} already exists. Only one Firebase Analytics instance can be created for each appId.", 696 [ 697 "already-initialized" 698 /* AnalyticsError.ALREADY_INITIALIZED */ 699 ]: "initializeAnalytics() cannot be called again with different options than those it was initially called with. It can be called again with the same options to return the existing instance, or getAnalytics() can be used to get a reference to the already-initialized instance.", 700 [ 701 "already-initialized-settings" 702 /* AnalyticsError.ALREADY_INITIALIZED_SETTINGS */ 703 ]: "Firebase Analytics has already been initialized.settings() must be called before initializing any Analytics instanceor it will have no effect.", 704 [ 705 "interop-component-reg-failed" 706 /* AnalyticsError.INTEROP_COMPONENT_REG_FAILED */ 707 ]: "Firebase Analytics Interop Component failed to instantiate: {$reason}", 708 [ 709 "invalid-analytics-context" 710 /* AnalyticsError.INVALID_ANALYTICS_CONTEXT */ 711 ]: "Firebase Analytics is not supported in this environment. Wrap initialization of analytics in analytics.isSupported() to prevent initialization in unsupported environments. Details: {$errorInfo}", 712 [ 713 "indexeddb-unavailable" 714 /* AnalyticsError.INDEXEDDB_UNAVAILABLE */ 715 ]: "IndexedDB unavailable or restricted in this environment. Wrap initialization of analytics in analytics.isSupported() to prevent initialization in unsupported environments. Details: {$errorInfo}", 716 [ 717 "fetch-throttle" 718 /* AnalyticsError.FETCH_THROTTLE */ 719 ]: "The config fetch request timed out while in an exponential backoff state. Unix timestamp in milliseconds when fetch request throttling ends: {$throttleEndTimeMillis}.", 720 [ 721 "config-fetch-failed" 722 /* AnalyticsError.CONFIG_FETCH_FAILED */ 723 ]: "Dynamic config fetch failed: [{$httpStatus}] {$responseMessage}", 724 [ 725 "no-api-key" 726 /* AnalyticsError.NO_API_KEY */ 727 ]: 'The "apiKey" field is empty in the local Firebase config. Firebase Analytics requires this field tocontain a valid API key.', 728 [ 729 "no-app-id" 730 /* AnalyticsError.NO_APP_ID */ 731 ]: 'The "appId" field is empty in the local Firebase config. Firebase Analytics requires this field tocontain a valid app ID.', 732 [ 733 "no-client-id" 734 /* AnalyticsError.NO_CLIENT_ID */ 735 ]: 'The "client_id" field is empty.', 736 [ 737 "invalid-gtag-resource" 738 /* AnalyticsError.INVALID_GTAG_RESOURCE */ 739 ]: "Trusted Types detected an invalid gtag resource: {$gtagURL}." 740}; 741var ERROR_FACTORY2 = new ErrorFactory("analytics", "Analytics", ERRORS); 742function createGtagTrustedTypesScriptURL(url) { 743 if (!url.startsWith(GTAG_URL)) { 744 const err = ERROR_FACTORY2.create("invalid-gtag-resource", { 745 gtagURL: url 746 }); 747 logger.warn(err.message); 748 return ""; 749 } 750 return url; 751} 752function promiseAllSettled(promises) { 753 return Promise.all(promises.map((promise) => promise.catch((e) => e))); 754} 755function createTrustedTypesPolicy(policyName, policyOptions) { 756 let trustedTypesPolicy; 757 if (window.trustedTypes) { 758 trustedTypesPolicy = window.trustedTypes.createPolicy(policyName, policyOptions); 759 } 760 return trustedTypesPolicy; 761} 762function insertScriptTag(dataLayerName2, measurementId) { 763 const trustedTypesPolicy = createTrustedTypesPolicy("firebase-js-sdk-policy", { 764 createScriptURL: createGtagTrustedTypesScriptURL 765 }); 766 const script = document.createElement("script"); 767 const gtagScriptURL = `${GTAG_URL}?l=${dataLayerName2}&id=${measurementId}`; 768 script.src = trustedTypesPolicy ? trustedTypesPolicy === null || trustedTypesPolicy === void 0 ? void 0 : trustedTypesPolicy.createScriptURL(gtagScriptURL) : gtagScriptURL; 769 script.async = true; 770 document.head.appendChild(script); 771} 772function getOrCreateDataLayer(dataLayerName2) { 773 let dataLayer = []; 774 if (Array.isArray(window[dataLayerName2])) { 775 dataLayer = window[dataLayerName2]; 776 } else { 777 window[dataLayerName2] = dataLayer; 778 } 779 return dataLayer; 780} 781function gtagOnConfig(gtagCore, initializationPromisesMap2, dynamicConfigPromisesList2, measurementIdToAppId2, measurementId, gtagParams) { 782 return __async(this, null, function* () { 783 const correspondingAppId = measurementIdToAppId2[measurementId]; 784 try { 785 if (correspondingAppId) { 786 yield initializationPromisesMap2[correspondingAppId]; 787 } else { 788 const dynamicConfigResults = yield promiseAllSettled(dynamicConfigPromisesList2); 789 const foundConfig = dynamicConfigResults.find((config) => config.measurementId === measurementId); 790 if (foundConfig) { 791 yield initializationPromisesMap2[foundConfig.appId]; 792 } 793 } 794 } catch (e) { 795 logger.error(e); 796 } 797 gtagCore("config", measurementId, gtagParams); 798 }); 799} 800function gtagOnEvent(gtagCore, initializationPromisesMap2, dynamicConfigPromisesList2, measurementId, gtagParams) { 801 return __async(this, null, function* () { 802 try { 803 let initializationPromisesToWaitFor = []; 804 if (gtagParams && gtagParams["send_to"]) { 805 let gaSendToList = gtagParams["send_to"]; 806 if (!Array.isArray(gaSendToList)) { 807 gaSendToList = [gaSendToList]; 808 } 809 const dynamicConfigResults = yield promiseAllSettled(dynamicConfigPromisesList2); 810 for (const sendToId of gaSendToList) { 811 const foundConfig = dynamicConfigResults.find((config) => config.measurementId === sendToId); 812 const initializationPromise = foundConfig && initializationPromisesMap2[foundConfig.appId]; 813 if (initializationPromise) { 814 initializationPromisesToWaitFor.push(initializationPromise); 815 } else { 816 initializationPromisesToWaitFor = []; 817 break; 818 } 819 } 820 } 821 if (initializationPromisesToWaitFor.length === 0) { 822 initializationPromisesToWaitFor = Object.values(initializationPromisesMap2); 823 } 824 yield Promise.all(initializationPromisesToWaitFor); 825 gtagCore("event", measurementId, gtagParams || {}); 826 } catch (e) { 827 logger.error(e); 828 } 829 }); 830} 831function wrapGtag(gtagCore, initializationPromisesMap2, dynamicConfigPromisesList2, measurementIdToAppId2) { 832 function gtagWrapper(command, ...args) { 833 return __async(this, null, function* () { 834 try { 835 if (command === "event") { 836 const [measurementId, gtagParams] = args; 837 yield gtagOnEvent(gtagCore, initializationPromisesMap2, dynamicConfigPromisesList2, measurementId, gtagParams); 838 } else if (command === "config") { 839 const [measurementId, gtagParams] = args; 840 yield gtagOnConfig(gtagCore, initializationPromisesMap2, dynamicConfigPromisesList2, measurementIdToAppId2, measurementId, gtagParams); 841 } else if (command === "consent") { 842 const [consentAction, gtagParams] = args; 843 gtagCore("consent", consentAction, gtagParams); 844 } else if (command === "get") { 845 const [measurementId, fieldName, callback] = args; 846 gtagCore("get", measurementId, fieldName, callback); 847 } else if (command === "set") { 848 const [customParams] = args; 849 gtagCore("set", customParams); 850 } else { 851 gtagCore(command, ...args); 852 } 853 } catch (e) { 854 logger.error(e); 855 } 856 }); 857 } 858 return gtagWrapper; 859} 860function wrapOrCreateGtag(initializationPromisesMap2, dynamicConfigPromisesList2, measurementIdToAppId2, dataLayerName2, gtagFunctionName) { 861 let gtagCore = function(..._args) { 862 window[dataLayerName2].push(arguments); 863 }; 864 if (window[gtagFunctionName] && typeof window[gtagFunctionName] === "function") { 865 gtagCore = window[gtagFunctionName]; 866 } 867 window[gtagFunctionName] = wrapGtag(gtagCore, initializationPromisesMap2, dynamicConfigPromisesList2, measurementIdToAppId2); 868 return { 869 gtagCore, 870 wrappedGtag: window[gtagFunctionName] 871 }; 872} 873function findGtagScriptOnPage(dataLayerName2) { 874 const scriptTags = window.document.getElementsByTagName("script"); 875 for (const tag of Object.values(scriptTags)) { 876 if (tag.src && tag.src.includes(GTAG_URL) && tag.src.includes(dataLayerName2)) { 877 return tag; 878 } 879 } 880 return null; 881} 882var LONG_RETRY_FACTOR = 30; 883var BASE_INTERVAL_MILLIS = 1e3; 884var RetryData = class { 885 constructor(throttleMetadata = {}, intervalMillis = BASE_INTERVAL_MILLIS) { 886 this.throttleMetadata = throttleMetadata; 887 this.intervalMillis = intervalMillis; 888 } 889 getThrottleMetadata(appId) { 890 return this.throttleMetadata[appId]; 891 } 892 setThrottleMetadata(appId, metadata) { 893 this.throttleMetadata[appId] = metadata; 894 } 895 deleteThrottleMetadata(appId) { 896 delete this.throttleMetadata[appId]; 897 } 898}; 899var defaultRetryData = new RetryData(); 900function getHeaders2(apiKey) { 901 return new Headers({ 902 Accept: "application/json", 903 "x-goog-api-key": apiKey 904 }); 905} 906function fetchDynamicConfig(appFields) { 907 return __async(this, null, function* () { 908 var _a; 909 const { appId, apiKey } = appFields; 910 const request = { 911 method: "GET", 912 headers: getHeaders2(apiKey) 913 }; 914 const appUrl = DYNAMIC_CONFIG_URL.replace("{app-id}", appId); 915 const response = yield fetch(appUrl, request); 916 if (response.status !== 200 && response.status !== 304) { 917 let errorMessage = ""; 918 try { 919 const jsonResponse = yield response.json(); 920 if ((_a = jsonResponse.error) === null || _a === void 0 ? void 0 : _a.message) { 921 errorMessage = jsonResponse.error.message; 922 } 923 } catch (_ignored) { 924 } 925 throw ERROR_FACTORY2.create("config-fetch-failed", { 926 httpStatus: response.status, 927 responseMessage: errorMessage 928 }); 929 } 930 return response.json(); 931 }); 932} 933function fetchDynamicConfigWithRetry(_0) { 934 return __async(this, arguments, function* (app, retryData = defaultRetryData, timeoutMillis) { 935 const { appId, apiKey, measurementId } = app.options; 936 if (!appId) { 937 throw ERROR_FACTORY2.create( 938 "no-app-id" 939 /* AnalyticsError.NO_APP_ID */ 940 ); 941 } 942 if (!apiKey) { 943 if (measurementId) { 944 return { 945 measurementId, 946 appId 947 }; 948 } 949 throw ERROR_FACTORY2.create( 950 "no-api-key" 951 /* AnalyticsError.NO_API_KEY */ 952 ); 953 } 954 const throttleMetadata = retryData.getThrottleMetadata(appId) || { 955 backoffCount: 0, 956 throttleEndTimeMillis: Date.now() 957 }; 958 const signal = new AnalyticsAbortSignal(); 959 setTimeout(() => __async(null, null, function* () { 960 signal.abort(); 961 }), timeoutMillis !== void 0 ? timeoutMillis : FETCH_TIMEOUT_MILLIS); 962 return attemptFetchDynamicConfigWithRetry({ appId, apiKey, measurementId }, throttleMetadata, signal, retryData); 963 }); 964} 965function attemptFetchDynamicConfigWithRetry(_0, _1, _2) { 966 return __async(this, arguments, function* (appFields, { throttleEndTimeMillis, backoffCount }, signal, retryData = defaultRetryData) { 967 var _a; 968 const { appId, measurementId } = appFields; 969 try { 970 yield setAbortableTimeout(signal, throttleEndTimeMillis); 971 } catch (e) { 972 if (measurementId) { 973 logger.warn(`Timed out fetching this Firebase app's measurement ID from the server. Falling back to the measurement ID ${measurementId} provided in the "measurementId" field in the local Firebase config. [${e === null || e === void 0 ? void 0 : e.message}]`); 974 return { appId, measurementId }; 975 } 976 throw e; 977 } 978 try { 979 const response = yield fetchDynamicConfig(appFields); 980 retryData.deleteThrottleMetadata(appId); 981 return response; 982 } catch (e) { 983 const error = e; 984 if (!isRetriableError(error)) { 985 retryData.deleteThrottleMetadata(appId); 986 if (measurementId) { 987 logger.warn(`Failed to fetch this Firebase app's measurement ID from the server. Falling back to the measurement ID ${measurementId} provided in the "measurementId" field in the local Firebase config. [${error === null || error === void 0 ? void 0 : error.message}]`); 988 return { appId, measurementId }; 989 } else { 990 throw e; 991 } 992 } 993 const backoffMillis = Number((_a = error === null || error === void 0 ? void 0 : error.customData) === null || _a === void 0 ? void 0 : _a.httpStatus) === 503 ? calculateBackoffMillis(backoffCount, retryData.intervalMillis, LONG_RETRY_FACTOR) : calculateBackoffMillis(backoffCount, retryData.intervalMillis); 994 const throttleMetadata = { 995 throttleEndTimeMillis: Date.now() + backoffMillis, 996 backoffCount: backoffCount + 1 997 }; 998 retryData.setThrottleMetadata(appId, throttleMetadata); 999 logger.debug(`Calling attemptFetch again in ${backoffMillis} millis`); 1000 return attemptFetchDynamicConfigWithRetry(appFields, throttleMetadata, signal, retryData); 1001 } 1002 }); 1003} 1004function setAbortableTimeout(signal, throttleEndTimeMillis) { 1005 return new Promise((resolve, reject) => { 1006 const backoffMillis = Math.max(throttleEndTimeMillis - Date.now(), 0); 1007 const timeout = setTimeout(resolve, backoffMillis); 1008 signal.addEventListener(() => { 1009 clearTimeout(timeout); 1010 reject(ERROR_FACTORY2.create("fetch-throttle", { 1011 throttleEndTimeMillis 1012 })); 1013 }); 1014 }); 1015} 1016function isRetriableError(e) { 1017 if (!(e instanceof FirebaseError) || !e.customData) { 1018 return false; 1019 } 1020 const httpStatus = Number(e.customData["httpStatus"]); 1021 return httpStatus === 429 || httpStatus === 500 || httpStatus === 503 || httpStatus === 504; 1022} 1023var AnalyticsAbortSignal = class { 1024 constructor() { 1025 this.listeners = []; 1026 } 1027 addEventListener(listener) { 1028 this.listeners.push(listener); 1029 } 1030 abort() { 1031 this.listeners.forEach((listener) => listener()); 1032 } 1033}; 1034var defaultEventParametersForInit; 1035function logEvent$1(gtagFunction, initializationPromise, eventName, eventParams, options) { 1036 return __async(this, null, function* () { 1037 if (options && options.global) { 1038 gtagFunction("event", eventName, eventParams); 1039 return; 1040 } else { 1041 const measurementId = yield initializationPromise; 1042 const params = Object.assign(Object.assign({}, eventParams), { "send_to": measurementId }); 1043 gtagFunction("event", eventName, params); 1044 } 1045 }); 1046} 1047function setCurrentScreen$1(gtagFunction, initializationPromise, screenName, options) { 1048 return __async(this, null, function* () { 1049 if (options && options.global) { 1050 gtagFunction("set", { "screen_name": screenName }); 1051 return Promise.resolve(); 1052 } else { 1053 const measurementId = yield initializationPromise; 1054 gtagFunction("config", measurementId, { 1055 update: true, 1056 "screen_name": screenName 1057 }); 1058 } 1059 }); 1060} 1061function setUserId$1(gtagFunction, initializationPromise, id, options) { 1062 return __async(this, null, function* () { 1063 if (options && options.global) { 1064 gtagFunction("set", { "user_id": id }); 1065 return Promise.resolve(); 1066 } else { 1067 const measurementId = yield initializationPromise; 1068 gtagFunction("config", measurementId, { 1069 update: true, 1070 "user_id": id 1071 }); 1072 } 1073 }); 1074} 1075function setUserProperties$1(gtagFunction, initializationPromise, properties, options) { 1076 return __async(this, null, function* () { 1077 if (options && options.global) { 1078 const flatProperties = {}; 1079 for (const key of Object.keys(properties)) { 1080 flatProperties[`user_properties.${key}`] = properties[key]; 1081 } 1082 gtagFunction("set", flatProperties); 1083 return Promise.resolve(); 1084 } else { 1085 const measurementId = yield initializationPromise; 1086 gtagFunction("config", measurementId, { 1087 update: true, 1088 "user_properties": properties 1089 }); 1090 } 1091 }); 1092} 1093function internalGetGoogleAnalyticsClientId(gtagFunction, initializationPromise) { 1094 return __async(this, null, function* () { 1095 const measurementId = yield initializationPromise; 1096 return new Promise((resolve, reject) => { 1097 gtagFunction("get", measurementId, "client_id", (clientId) => { 1098 if (!clientId) { 1099 reject(ERROR_FACTORY2.create( 1100 "no-client-id" 1101 /* AnalyticsError.NO_CLIENT_ID */ 1102 )); 1103 } 1104 resolve(clientId); 1105 }); 1106 }); 1107 }); 1108} 1109function setAnalyticsCollectionEnabled$1(initializationPromise, enabled) { 1110 return __async(this, null, function* () { 1111 const measurementId = yield initializationPromise; 1112 window[`ga-disable-${measurementId}`] = !enabled; 1113 }); 1114} 1115var defaultConsentSettingsForInit; 1116function _setConsentDefaultForInit(consentSettings) { 1117 defaultConsentSettingsForInit = consentSettings; 1118} 1119function _setDefaultEventParametersForInit(customParams) { 1120 defaultEventParametersForInit = customParams; 1121} 1122function validateIndexedDB() { 1123 return __async(this, null, function* () { 1124 if (!isIndexedDBAvailable()) { 1125 logger.warn(ERROR_FACTORY2.create("indexeddb-unavailable", { 1126 errorInfo: "IndexedDB is not available in this environment." 1127 }).message); 1128 return false; 1129 } else { 1130 try { 1131 yield validateIndexedDBOpenable(); 1132 } catch (e) { 1133 logger.warn(ERROR_FACTORY2.create("indexeddb-unavailable", { 1134 errorInfo: e === null || e === void 0 ? void 0 : e.toString() 1135 }).message); 1136 return false; 1137 } 1138 } 1139 return true; 1140 }); 1141} 1142function _initializeAnalytics(app, dynamicConfigPromisesList2, measurementIdToAppId2, installations, gtagCore, dataLayerName2, options) { 1143 return __async(this, null, function* () { 1144 var _a; 1145 const dynamicConfigPromise = fetchDynamicConfigWithRetry(app); 1146 dynamicConfigPromise.then((config) => { 1147 measurementIdToAppId2[config.measurementId] = config.appId; 1148 if (app.options.measurementId && config.measurementId !== app.options.measurementId) { 1149 logger.warn(`The measurement ID in the local Firebase config (${app.options.measurementId}) does not match the measurement ID fetched from the server (${config.measurementId}). To ensure analytics events are always sent to the correct Analytics property, update the measurement ID field in the local config or remove it from the local config.`); 1150 } 1151 }).catch((e) => logger.error(e)); 1152 dynamicConfigPromisesList2.push(dynamicConfigPromise); 1153 const fidPromise = validateIndexedDB().then((envIsValid) => { 1154 if (envIsValid) { 1155 return installations.getId(); 1156 } else { 1157 return void 0; 1158 } 1159 }); 1160 const [dynamicConfig, fid] = yield Promise.all([ 1161 dynamicConfigPromise, 1162 fidPromise 1163 ]); 1164 if (!findGtagScriptOnPage(dataLayerName2)) { 1165 insertScriptTag(dataLayerName2, dynamicConfig.measurementId); 1166 } 1167 if (defaultConsentSettingsForInit) { 1168 gtagCore("consent", "default", defaultConsentSettingsForInit); 1169 _setConsentDefaultForInit(void 0); 1170 } 1171 gtagCore("js", /* @__PURE__ */ new Date()); 1172 const configProperties = (_a = options === null || options === void 0 ? void 0 : options.config) !== null && _a !== void 0 ? _a : {}; 1173 configProperties[ORIGIN_KEY] = "firebase"; 1174 configProperties.update = true; 1175 if (fid != null) { 1176 configProperties[GA_FID_KEY] = fid; 1177 } 1178 gtagCore("config", dynamicConfig.measurementId, configProperties); 1179 if (defaultEventParametersForInit) { 1180 gtagCore("set", defaultEventParametersForInit); 1181 _setDefaultEventParametersForInit(void 0); 1182 } 1183 return dynamicConfig.measurementId; 1184 }); 1185} 1186var AnalyticsService = class { 1187 constructor(app) { 1188 this.app = app; 1189 } 1190 _delete() { 1191 delete initializationPromisesMap[this.app.options.appId]; 1192 return Promise.resolve(); 1193 } 1194}; 1195var initializationPromisesMap = {}; 1196var dynamicConfigPromisesList = []; 1197var measurementIdToAppId = {}; 1198var dataLayerName = "dataLayer"; 1199var gtagName = "gtag"; 1200var gtagCoreFunction; 1201var wrappedGtagFunction; 1202var globalInitDone = false; 1203function settings(options) { 1204 if (globalInitDone) { 1205 throw ERROR_FACTORY2.create( 1206 "already-initialized" 1207 /* AnalyticsError.ALREADY_INITIALIZED */ 1208 ); 1209 } 1210 if (options.dataLayerName) { 1211 dataLayerName = options.dataLayerName; 1212 } 1213 if (options.gtagName) { 1214 gtagName = options.gtagName; 1215 } 1216} 1217function warnOnBrowserContextMismatch() { 1218 const mismatchedEnvMessages = []; 1219 if (isBrowserExtension()) { 1220 mismatchedEnvMessages.push("This is a browser extension environment."); 1221 } 1222 if (!areCookiesEnabled()) { 1223 mismatchedEnvMessages.push("Cookies are not available."); 1224 } 1225 if (mismatchedEnvMessages.length > 0) { 1226 const details = mismatchedEnvMessages.map((message, index) => `(${index + 1}) ${message}`).join(" "); 1227 const err = ERROR_FACTORY2.create("invalid-analytics-context", { 1228 errorInfo: details 1229 }); 1230 logger.warn(err.message); 1231 } 1232} 1233function factory(app, installations, options) { 1234 warnOnBrowserContextMismatch(); 1235 const appId = app.options.appId; 1236 if (!appId) { 1237 throw ERROR_FACTORY2.create( 1238 "no-app-id" 1239 /* AnalyticsError.NO_APP_ID */ 1240 ); 1241 } 1242 if (!app.options.apiKey) { 1243 if (app.options.measurementId) { 1244 logger.warn(`The "apiKey" field is empty in the local Firebase config. This is needed to fetch the latest measurement ID for this Firebase app. Falling back to the measurement ID ${app.options.measurementId} provided in the "measurementId" field in the local Firebase config.`); 1245 } else { 1246 throw ERROR_FACTORY2.create( 1247 "no-api-key" 1248 /* AnalyticsError.NO_API_KEY */ 1249 ); 1250 } 1251 } 1252 if (initializationPromisesMap[appId] != null) { 1253 throw ERROR_FACTORY2.create("already-exists", { 1254 id: appId 1255 }); 1256 } 1257 if (!globalInitDone) { 1258 getOrCreateDataLayer(dataLayerName); 1259 const { wrappedGtag, gtagCore } = wrapOrCreateGtag(initializationPromisesMap, dynamicConfigPromisesList, measurementIdToAppId, dataLayerName, gtagName); 1260 wrappedGtagFunction = wrappedGtag; 1261 gtagCoreFunction = gtagCore; 1262 globalInitDone = true; 1263 } 1264 initializationPromisesMap[appId] = _initializeAnalytics(app, dynamicConfigPromisesList, measurementIdToAppId, installations, gtagCoreFunction, dataLayerName, options); 1265 const analyticsInstance = new AnalyticsService(app); 1266 return analyticsInstance; 1267} 1268function getAnalytics(app = getApp()) { 1269 app = getModularInstance(app); 1270 const analyticsProvider = _getProvider(app, ANALYTICS_TYPE); 1271 if (analyticsProvider.isInitialized()) { 1272 return analyticsProvider.getImmediate(); 1273 } 1274 return initializeAnalytics(app); 1275} 1276function initializeAnalytics(app, options = {}) { 1277 const analyticsProvider = _getProvider(app, ANALYTICS_TYPE); 1278 if (analyticsProvider.isInitialized()) { 1279 const existingInstance = analyticsProvider.getImmediate(); 1280 if (deepEqual(options, analyticsProvider.getOptions())) { 1281 return existingInstance; 1282 } else { 1283 throw ERROR_FACTORY2.create( 1284 "already-initialized" 1285 /* AnalyticsError.ALREADY_INITIALIZED */ 1286 ); 1287 } 1288 } 1289 const analyticsInstance = analyticsProvider.initialize({ options }); 1290 return analyticsInstance; 1291} 1292function isSupported() { 1293 return __async(this, null, function* () { 1294 if (isBrowserExtension()) { 1295 return false; 1296 } 1297 if (!areCookiesEnabled()) { 1298 return false; 1299 } 1300 if (!isIndexedDBAvailable()) { 1301 return false; 1302 } 1303 try { 1304 const isDBOpenable = yield validateIndexedDBOpenable(); 1305 return isDBOpenable; 1306 } catch (error) { 1307 return false; 1308 } 1309 }); 1310} 1311function setCurrentScreen(analyticsInstance, screenName, options) { 1312 analyticsInstance = getModularInstance(analyticsInstance); 1313 setCurrentScreen$1(wrappedGtagFunction, initializationPromisesMap[analyticsInstance.app.options.appId], screenName, options).catch((e) => logger.error(e)); 1314} 1315function getGoogleAnalyticsClientId(analyticsInstance) { 1316 return __async(this, null, function* () { 1317 analyticsInstance = getModularInstance(analyticsInstance); 1318 return internalGetGoogleAnalyticsClientId(wrappedGtagFunction, initializationPromisesMap[analyticsInstance.app.options.appId]); 1319 }); 1320} 1321function setUserId(analyticsInstance, id, options) { 1322 analyticsInstance = getModularInstance(analyticsInstance); 1323 setUserId$1(wrappedGtagFunction, initializationPromisesMap[analyticsInstance.app.options.appId], id, options).catch((e) => logger.error(e)); 1324} 1325function setUserProperties(analyticsInstance, properties, options) { 1326 analyticsInstance = getModularInstance(analyticsInstance); 1327 setUserProperties$1(wrappedGtagFunction, initializationPromisesMap[analyticsInstance.app.options.appId], properties, options).catch((e) => logger.error(e)); 1328} 1329function setAnalyticsCollectionEnabled(analyticsInstance, enabled) { 1330 analyticsInstance = getModularInstance(analyticsInstance); 1331 setAnalyticsCollectionEnabled$1(initializationPromisesMap[analyticsInstance.app.options.appId], enabled).catch((e) => logger.error(e)); 1332} 1333function setDefaultEventParameters(customParams) { 1334 if (wrappedGtagFunction) { 1335 wrappedGtagFunction("set", customParams); 1336 } else { 1337 _setDefaultEventParametersForInit(customParams); 1338 } 1339} 1340function logEvent(analyticsInstance, eventName, eventParams, options) { 1341 analyticsInstance = getModularInstance(analyticsInstance); 1342 logEvent$1(wrappedGtagFunction, initializationPromisesMap[analyticsInstance.app.options.appId], eventName, eventParams, options).catch((e) => logger.error(e)); 1343} 1344function setConsent(consentSettings) { 1345 if (wrappedGtagFunction) { 1346 wrappedGtagFunction("consent", "update", consentSettings); 1347 } else { 1348 _setConsentDefaultForInit(consentSettings); 1349 } 1350} 1351var name2 = "@firebase/analytics"; 1352var version2 = "0.10.17"; 1353function registerAnalytics() { 1354 _registerComponent(new Component( 1355 ANALYTICS_TYPE, 1356 (container, { options: analyticsOptions }) => { 1357 const app = container.getProvider("app").getImmediate(); 1358 const installations = container.getProvider("installations-internal").getImmediate(); 1359 return factory(app, installations, analyticsOptions); 1360 }, 1361 "PUBLIC" 1362 /* ComponentType.PUBLIC */ 1363 )); 1364 _registerComponent(new Component( 1365 "analytics-internal", 1366 internalFactory2, 1367 "PRIVATE" 1368 /* ComponentType.PRIVATE */ 1369 )); 1370 registerVersion(name2, version2); 1371 registerVersion(name2, version2, "esm2017"); 1372 function internalFactory2(container) { 1373 try { 1374 const analytics = container.getProvider(ANALYTICS_TYPE).getImmediate(); 1375 return { 1376 logEvent: (eventName, eventParams, options) => logEvent(analytics, eventName, eventParams, options) 1377 }; 1378 } catch (e) { 1379 throw ERROR_FACTORY2.create("interop-component-reg-failed", { 1380 reason: e 1381 }); 1382 } 1383 } 1384} 1385registerAnalytics(); 1386
vendor: 14,023 bytes, lines 1387-1751
1387// node_modules/@angular/fire/fesm2022/angular-fire-analytics.mjs 1388var Analytics = class { 1389 constructor(analytics) { 1390 return analytics; 1391 } 1392}; 1393var ANALYTICS_PROVIDER_NAME = "analytics"; 1394var AnalyticsInstances = class { 1395 constructor() { 1396 return \u0275getAllInstancesOf(ANALYTICS_PROVIDER_NAME); 1397 } 1398}; 1399var analyticInstance$ = timer(0, 300).pipe(concatMap(() => from(\u0275getAllInstancesOf(ANALYTICS_PROVIDER_NAME))), distinct()); 1400var getAnalytics2 = \u0275zoneWrap(getAnalytics, true); 1401var getGoogleAnalyticsClientId2 = \u0275zoneWrap(getGoogleAnalyticsClientId, true); 1402var initializeAnalytics2 = \u0275zoneWrap(initializeAnalytics, true); 1403var isSupported2 = \u0275zoneWrap(isSupported, false); 1404var logEvent2 = \u0275zoneWrap(logEvent, false, 2); 1405var setAnalyticsCollectionEnabled2 = \u0275zoneWrap(setAnalyticsCollectionEnabled, true, 2); 1406var setConsent2 = \u0275zoneWrap(setConsent, true, 2); 1407var setCurrentScreen2 = \u0275zoneWrap(setCurrentScreen, true, 2); 1408var setDefaultEventParameters2 = \u0275zoneWrap(setDefaultEventParameters, true, 2); 1409var setUserId2 = \u0275zoneWrap(setUserId, true, 2); 1410var setUserProperties2 = \u0275zoneWrap(setUserProperties, true, 2); 1411var settings2 = \u0275zoneWrap(settings, true); 1412var UserTrackingService = class _UserTrackingService { 1413 initialized; 1414 disposables = []; 1415 constructor(auth, zone, injector) { 1416 registerVersion("angularfire", VERSION.full, "user-tracking"); 1417 let resolveInitialized; 1418 this.initialized = zone.runOutsideAngular(() => new Promise((resolve) => { 1419 resolveInitialized = resolve; 1420 })); 1421 isSupported2().then(() => { 1422 const analytics = injector.get(Analytics); 1423 if (analytics) { 1424 this.disposables = [ 1425 // TODO add credential tracking back in 1426 authState(auth).subscribe((user) => { 1427 setUserId2(analytics, user?.uid); 1428 resolveInitialized(); 1429 }) 1430 ]; 1431 } else { 1432 resolveInitialized(); 1433 } 1434 }); 1435 } 1436 ngOnDestroy() { 1437 this.disposables.forEach((it) => it.unsubscribe()); 1438 } 1439 static \u0275fac = function UserTrackingService_Factory(__ngFactoryType__) { 1440 return new (__ngFactoryType__ || _UserTrackingService)(\u0275\u0275inject(Auth), \u0275\u0275inject(NgZone), \u0275\u0275inject(Injector)); 1441 }; 1442 static \u0275prov = /* @__PURE__ */ \u0275\u0275defineInjectable({ 1443 token: _UserTrackingService, 1444 factory: _UserTrackingService.\u0275fac 1445 }); 1446}; 1447(() => { 1448 (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(UserTrackingService, [{ 1449 type: Injectable 1450 }], () => [{ 1451 type: Auth 1452 }, { 1453 type: NgZone 1454 }, { 1455 type: Injector 1456 }], null); 1457})(); 1458var FIREBASE_EVENT_ORIGIN_KEY = "firebase_event_origin"; 1459var FIREBASE_PREVIOUS_SCREEN_CLASS_KEY = "firebase_previous_class"; 1460var FIREBASE_PREVIOUS_SCREEN_INSTANCE_ID_KEY = "firebase_previous_id"; 1461var FIREBASE_PREVIOUS_SCREEN_NAME_KEY = "firebase_previous_screen"; 1462var FIREBASE_SCREEN_CLASS_KEY = "firebase_screen_class"; 1463var FIREBASE_SCREEN_INSTANCE_ID_KEY = "firebase_screen_id"; 1464var FIREBASE_SCREEN_NAME_KEY = "firebase_screen"; 1465var OUTLET_KEY = "outlet"; 1466var PAGE_PATH_KEY = "page_path"; 1467var PAGE_TITLE_KEY = "page_title"; 1468var SCREEN_CLASS_KEY = "screen_class"; 1469var SCREEN_NAME_KEY = "screen_name"; 1470var SCREEN_VIEW_EVENT = "screen_view"; 1471var EVENT_ORIGIN_AUTO = "auto"; 1472var SCREEN_INSTANCE_DELIMITER = "#"; 1473var nextScreenInstanceID = Math.floor(Math.random() * (2 ** 32 - 1)) - 2 ** 31; 1474var knownScreenInstanceIDs = {}; 1475var getScreenInstanceID = (params) => { 1476 const screenInstanceKey = [params[SCREEN_CLASS_KEY], params[OUTLET_KEY]].join(SCREEN_INSTANCE_DELIMITER); 1477 if (knownScreenInstanceIDs.hasOwnProperty(screenInstanceKey)) { 1478 return knownScreenInstanceIDs[screenInstanceKey]; 1479 } else { 1480 const ret = nextScreenInstanceID++; 1481 knownScreenInstanceIDs[screenInstanceKey] = ret; 1482 return ret; 1483 } 1484}; 1485var \u0275screenViewEvent = (router, title, componentFactoryResolver) => { 1486 const activationEndEvents = router.events.pipe(filter((e) => e instanceof ActivationEnd)); 1487 return activationEndEvents.pipe(switchMap((activationEnd) => { 1488 const urlTree = router.parseUrl(router.url.replace(/(?:\().+(?:\))/g, (a) => a.replace("://", ":///"))); 1489 const pagePath = urlTree.root.children[activationEnd.snapshot.outlet]?.toString() || ""; 1490 const actualSnapshot = router.routerState.root.children.map((it) => it).find((it) => it.outlet === activationEnd.snapshot.outlet); 1491 if (!actualSnapshot) { 1492 return of(null); 1493 } 1494 let actualDeep = actualSnapshot; 1495 while (actualDeep.firstChild) { 1496 actualDeep = actualDeep.firstChild; 1497 } 1498 const screenName = actualDeep.pathFromRoot.map((s) => s.routeConfig?.path).filter((it) => it).join("/") || "/"; 1499 const params = { 1500 [SCREEN_NAME_KEY]: screenName, 1501 [PAGE_PATH_KEY]: `/${pagePath}`, 1502 [FIREBASE_EVENT_ORIGIN_KEY]: EVENT_ORIGIN_AUTO, 1503 [FIREBASE_SCREEN_NAME_KEY]: screenName, 1504 [OUTLET_KEY]: activationEnd.snapshot.outlet 1505 }; 1506 if (title) { 1507 params[PAGE_TITLE_KEY] = title.getTitle(); 1508 } 1509 let component = actualSnapshot.component; 1510 if (component) { 1511 if (component === \u0275EmptyOutletComponent) { 1512 let deepSnapshot = activationEnd.snapshot; 1513 while (deepSnapshot.firstChild) { 1514 deepSnapshot = deepSnapshot.firstChild; 1515 } 1516 component = deepSnapshot.component; 1517 } 1518 } else { 1519 component = activationEnd.snapshot.component; 1520 } 1521 if (typeof component === "string") { 1522 return of(__spreadProps(__spreadValues({}, params), { 1523 [SCREEN_CLASS_KEY]: component 1524 })); 1525 } else if (component) { 1526 const componentFactory = componentFactoryResolver.resolveComponentFactory(component); 1527 return of(__spreadProps(__spreadValues({}, params), { 1528 [SCREEN_CLASS_KEY]: componentFactory.selector 1529 })); 1530 } 1531 return of(null); 1532 }), filter((it) => !!it), map((params) => __spreadValues({ 1533 [FIREBASE_SCREEN_CLASS_KEY]: params[SCREEN_CLASS_KEY], 1534 [FIREBASE_SCREEN_INSTANCE_ID_KEY]: getScreenInstanceID(params) 1535 }, params)), groupBy((it) => it[OUTLET_KEY]), mergeMap((it) => it.pipe(distinctUntilChanged((a, b) => JSON.stringify(a) === JSON.stringify(b)), startWith(void 0), pairwise(), map(([prior, current]) => prior ? __spreadValues({ 1536 [FIREBASE_PREVIOUS_SCREEN_CLASS_KEY]: prior[SCREEN_CLASS_KEY], 1537 [FIREBASE_PREVIOUS_SCREEN_NAME_KEY]: prior[SCREEN_NAME_KEY], 1538 [FIREBASE_PREVIOUS_SCREEN_INSTANCE_ID_KEY]: prior[FIREBASE_SCREEN_INSTANCE_ID_KEY] 1539 }, current) : current)))); 1540}; 1541var ScreenTrackingService = class _ScreenTrackingService { 1542 disposable; 1543 constructor(router, title, componentFactoryResolver, zone, userTrackingService, injector) { 1544 registerVersion("angularfire", VERSION.full, "screen-tracking"); 1545 isSupported2().then(() => { 1546 const analytics = injector.get(Analytics); 1547 if (!router || !analytics) { 1548 return; 1549 } 1550 zone.runOutsideAngular(() => { 1551 this.disposable = \u0275screenViewEvent(router, title, componentFactoryResolver).pipe(switchMap((params) => __async(this, null, function* () { 1552 if (userTrackingService) { 1553 yield userTrackingService.initialized; 1554 } 1555 return logEvent2(analytics, SCREEN_VIEW_EVENT, params); 1556 }))).subscribe(); 1557 }); 1558 }); 1559 } 1560 ngOnDestroy() { 1561 if (this.disposable) { 1562 this.disposable.unsubscribe(); 1563 } 1564 } 1565 static \u0275fac = function ScreenTrackingService_Factory(__ngFactoryType__) { 1566 return new (__ngFactoryType__ || _ScreenTrackingService)(\u0275\u0275inject(Router, 8), \u0275\u0275inject(Title, 8), \u0275\u0275inject(ComponentFactoryResolver$1), \u0275\u0275inject(NgZone), \u0275\u0275inject(UserTrackingService, 8), \u0275\u0275inject(Injector)); 1567 }; 1568 static \u0275prov = /* @__PURE__ */ \u0275\u0275defineInjectable({ 1569 token: _ScreenTrackingService, 1570 factory: _ScreenTrackingService.\u0275fac 1571 }); 1572}; 1573(() => { 1574 (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(ScreenTrackingService, [{ 1575 type: Injectable 1576 }], () => [{ 1577 type: Router, 1578 decorators: [{ 1579 type: Optional 1580 }] 1581 }, { 1582 type: Title, 1583 decorators: [{ 1584 type: Optional 1585 }] 1586 }, { 1587 type: ComponentFactoryResolver$1 1588 }, { 1589 type: NgZone 1590 }, { 1591 type: UserTrackingService, 1592 decorators: [{ 1593 type: Optional 1594 }] 1595 }, { 1596 type: Injector 1597 }], null); 1598})(); 1599var PROVIDED_ANALYTICS_INSTANCES = new InjectionToken("angularfire2.analytics-instances"); 1600function defaultAnalyticsInstanceFactory(provided, defaultApp, platformId) { 1601 if (!isPlatformBrowser(platformId)) { 1602 return null; 1603 } 1604 const defaultAnalytics = \u0275getDefaultInstanceOf(ANALYTICS_PROVIDER_NAME, provided, defaultApp); 1605 return defaultAnalytics && new Analytics(defaultAnalytics); 1606} 1607function analyticsInstanceFactory(fn) { 1608 return (zone, injector, platformId) => { 1609 if (!isPlatformBrowser(platformId)) { 1610 return null; 1611 } 1612 const analytics = zone.runOutsideAngular(() => fn(injector)); 1613 return new Analytics(analytics); 1614 }; 1615} 1616var ANALYTICS_INSTANCES_PROVIDER = { 1617 provide: AnalyticsInstances, 1618 deps: [[new Optional(), PROVIDED_ANALYTICS_INSTANCES]] 1619}; 1620var DEFAULT_ANALYTICS_INSTANCE_PROVIDER = { 1621 provide: Analytics, 1622 useFactory: defaultAnalyticsInstanceFactory, 1623 deps: [[new Optional(), PROVIDED_ANALYTICS_INSTANCES], FirebaseApp, PLATFORM_ID] 1624}; 1625var AnalyticsModule = class _AnalyticsModule { 1626 constructor(_screenTrackingService, _userTrackingService) { 1627 registerVersion("angularfire", VERSION.full, "analytics"); 1628 } 1629 static \u0275fac = function AnalyticsModule_Factory(__ngFactoryType__) { 1630 return new (__ngFactoryType__ || _AnalyticsModule)(\u0275\u0275inject(ScreenTrackingService, 8), \u0275\u0275inject(UserTrackingService, 8)); 1631 }; 1632 static \u0275mod = /* @__PURE__ */ \u0275\u0275defineNgModule({ 1633 type: _AnalyticsModule 1634 }); 1635 static \u0275inj = /* @__PURE__ */ \u0275\u0275defineInjector({ 1636 providers: [DEFAULT_ANALYTICS_INSTANCE_PROVIDER, ANALYTICS_INSTANCES_PROVIDER] 1637 }); 1638}; 1639(() => { 1640 (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(AnalyticsModule, [{ 1641 type: NgModule, 1642 args: [{ 1643 providers: [DEFAULT_ANALYTICS_INSTANCE_PROVIDER, ANALYTICS_INSTANCES_PROVIDER] 1644 }] 1645 }], () => [{ 1646 type: ScreenTrackingService, 1647 decorators: [{ 1648 type: Optional 1649 }] 1650 }, { 1651 type: UserTrackingService, 1652 decorators: [{ 1653 type: Optional 1654 }] 1655 }], null); 1656})(); 1657function provideAnalytics(fn, ...deps) { 1658 registerVersion("angularfire", VERSION.full, "analytics"); 1659 return makeEnvironmentProviders([DEFAULT_ANALYTICS_INSTANCE_PROVIDER, ANALYTICS_INSTANCES_PROVIDER, { 1660 provide: PROVIDED_ANALYTICS_INSTANCES, 1661 useFactory: analyticsInstanceFactory(fn), 1662 multi: true, 1663 deps: [NgZone, Injector, PLATFORM_ID, \u0275AngularFireSchedulers, FirebaseApps, ...deps] 1664 }]); 1665} 1666 1667export { 1668 Analytics, 1669 getAnalytics2 as getAnalytics, 1670 logEvent2 as logEvent, 1671 UserTrackingService, 1672 ScreenTrackingService, 1673 provideAnalytics 1674}; 1675/*! Bundled license information: 1676 1677@firebase/installations/dist/esm/index.esm2017.js: 1678@firebase/installations/dist/esm/index.esm2017.js: 1679@firebase/installations/dist/esm/index.esm2017.js: 1680@firebase/installations/dist/esm/index.esm2017.js: 1681 (** 1682 * @license 1683 * Copyright 2019 Google LLC 1684 * 1685 * Licensed under the Apache License, Version 2.0 (the "License"); 1686 * you may not use this file except in compliance with the License. 1687 * You may obtain a copy of the License at 1688 * 1689 * http://www.apache.org/licenses/LICENSE-2.0 1690 * 1691 * Unless required by applicable law or agreed to in writing, software 1692 * distributed under the License is distributed on an "AS IS" BASIS, 1693 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1694 * See the License for the specific language governing permissions and 1695 * limitations under the License. 1696 *) 1697 1698@firebase/installations/dist/esm/index.esm2017.js: 1699 (** 1700 * @license 1701 * Copyright 2020 Google LLC 1702 * 1703 * Licensed under the Apache License, Version 2.0 (the "License"); 1704 * you may not use this file except in compliance with the License. 1705 * You may obtain a copy of the License at 1706 * 1707 * http://www.apache.org/licenses/LICENSE-2.0 1708 * 1709 * Unless required by applicable law or agreed to in writing, software 1710 * distributed under the License is distributed on an "AS IS" BASIS, 1711 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1712 * See the License for the specific language governing permissions and 1713 * limitations under the License. 1714 *) 1715 1716@firebase/installations/dist/esm/index.esm2017.js: 1717@firebase/analytics/dist/esm/index.esm2017.js: 1718 (** 1719 * @license 1720 * Copyright 2019 Google LLC 1721 * 1722 * Licensed under the Apache License, Version 2.0 (the "License"); 1723 * you may not use this file except in compliance with the License. 1724 * You may obtain a copy of the License at 1725 * 1726 * http://www.apache.org/licenses/LICENSE-2.0 1727 * 1728 * Unless required by applicable law or agreed to in writing, software 1729 * distributed under the License is distributed on an "AS IS" BASIS, 1730 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1731 * See the License for the specific language governing permissions and 1732 * limitations under the License. 1733 *) 1734 (** 1735 * @license 1736 * Copyright 2020 Google LLC 1737 * 1738 * Licensed under the Apache License, Version 2.0 (the "License"); 1739 * you may not use this file except in compliance with the License. 1740 * You may obtain a copy of the License at 1741 * 1742 * http://www.apache.org/licenses/LICENSE-2.0 1743 * 1744 * Unless required by applicable law or agreed to in writing, software 1745 * distributed under the License is distributed on an "AS IS" BASIS, 1746 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1747 * See the License for the specific language governing permissions and 1748 * limitations under the License. 1749 *) 1750*/ 1751//# sourceMappingURL=chunk-67BET6PV.js.map
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.