UNPKG

@angular/fire

Version:

The official library for Firebase and Angular

177 lines 17.8 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { __awaiter } from "tslib"; import { Inject, Injectable, InjectionToken, NgZone, Optional, PLATFORM_ID } from '@angular/core'; import { EMPTY, of } from 'rxjs'; import { isPlatformBrowser } from '@angular/common'; import { map, tap, shareReplay, switchMap, observeOn } from 'rxjs/operators'; import { ɵAngularFireSchedulers, ɵlazySDKProxy, FIREBASE_OPTIONS, FIREBASE_APP_NAME, ɵfirebaseAppFactory } from '@angular/fire'; import * as i0 from "@angular/core"; import * as i1 from "@angular/fire"; /** * @record */ export function Config() { } /** @type {?} */ export const COLLECTION_ENABLED = new InjectionToken('angularfire2.analytics.analyticsCollectionEnabled'); /** @type {?} */ export const APP_VERSION = new InjectionToken('angularfire2.analytics.appVersion'); /** @type {?} */ export const APP_NAME = new InjectionToken('angularfire2.analytics.appName'); /** @type {?} */ export const DEBUG_MODE = new InjectionToken('angularfire2.analytics.debugMode'); /** @type {?} */ export const CONFIG = new InjectionToken('angularfire2.analytics.config'); /** @type {?} */ const APP_NAME_KEY = 'app_name'; /** @type {?} */ const APP_VERSION_KEY = 'app_version'; /** @type {?} */ const DEBUG_MODE_KEY = 'debug_mode'; /** @type {?} */ const ANALYTICS_ID_FIELD = 'measurementId'; /** @type {?} */ const GTAG_CONFIG_COMMAND = 'config'; /** @type {?} */ const GTAG_FUNCTION_NAME = 'gtag'; /** @type {?} */ const DATA_LAYER_NAME = 'dataLayer'; // WARNING: interface has both a type and a value, skipping emit /** @type {?} */ let gtag; /** @type {?} */ let analyticsInitialized; /** @type {?} */ const analyticsInstanceCache = {}; export class AngularFireAnalytics { /** * @param {?} options * @param {?} nameOrConfig * @param {?} analyticsCollectionEnabled * @param {?} providedAppVersion * @param {?} providedAppName * @param {?} debugModeEnabled * @param {?} providedConfig * @param {?} platformId * @param {?} zone */ constructor(options, nameOrConfig, analyticsCollectionEnabled, providedAppVersion, providedAppName, debugModeEnabled, providedConfig, // tslint:disable-next-line:ban-types platformId, zone) { this.options = options; if (!analyticsInitialized) { if (isPlatformBrowser(platformId)) { gtag = window[GTAG_FUNCTION_NAME] || ((/** * @param {...?} args * @return {?} */ (...args) => { window[DATA_LAYER_NAME].push(args); })); window[DATA_LAYER_NAME] = window[DATA_LAYER_NAME] || []; analyticsInitialized = zone.runOutsideAngular((/** * @return {?} */ () => new Promise((/** * @param {?} resolve * @return {?} */ resolve => { window[GTAG_FUNCTION_NAME] = (/** * @param {...?} args * @return {?} */ (...args) => { if (args[0] === 'js') { resolve(); } gtag(...args); }); })))); } else { gtag = (/** * @return {?} */ () => { }); analyticsInitialized = Promise.resolve(); } } /** @type {?} */ let analytics = analyticsInstanceCache[options[ANALYTICS_ID_FIELD]]; if (!analytics) { analytics = of(undefined).pipe(observeOn(new ɵAngularFireSchedulers(zone).outsideAngular), switchMap((/** * @return {?} */ () => isPlatformBrowser(platformId) ? import('firebase/analytics') : EMPTY)), map((/** * @return {?} */ () => ɵfirebaseAppFactory(options, zone, nameOrConfig))), map((/** * @param {?} app * @return {?} */ app => app.analytics())), tap((/** * @param {?} analytics * @return {?} */ analytics => { if (analyticsCollectionEnabled === false) { analytics.setAnalyticsCollectionEnabled(false); } })), shareReplay({ bufferSize: 1, refCount: false })); analyticsInstanceCache[options[ANALYTICS_ID_FIELD]] = analytics; } if (providedConfig) { this.updateConfig(providedConfig); } if (providedAppName) { this.updateConfig({ [APP_NAME_KEY]: providedAppName }); } if (providedAppVersion) { this.updateConfig({ [APP_VERSION_KEY]: providedAppVersion }); } if (debugModeEnabled) { this.updateConfig({ [DEBUG_MODE_KEY]: 1 }); } return ɵlazySDKProxy(this, analytics, zone); } /** * @param {?} config * @return {?} */ updateConfig(config) { return __awaiter(this, void 0, void 0, function* () { yield analyticsInitialized; gtag(GTAG_CONFIG_COMMAND, this.options[ANALYTICS_ID_FIELD], Object.assign(Object.assign({}, config), { update: true })); }); } } AngularFireAnalytics.decorators = [ { type: Injectable, args: [{ providedIn: 'any' },] } ]; /** @nocollapse */ AngularFireAnalytics.ctorParameters = () => [ { type: undefined, decorators: [{ type: Inject, args: [FIREBASE_OPTIONS,] }] }, { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [FIREBASE_APP_NAME,] }] }, { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [COLLECTION_ENABLED,] }] }, { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [APP_VERSION,] }] }, { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [APP_NAME,] }] }, { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [DEBUG_MODE,] }] }, { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [CONFIG,] }] }, { type: Object, decorators: [{ type: Inject, args: [PLATFORM_ID,] }] }, { type: NgZone } ]; /** @nocollapse */ AngularFireAnalytics.ɵprov = i0.ɵɵdefineInjectable({ factory: function AngularFireAnalytics_Factory() { return new AngularFireAnalytics(i0.ɵɵinject(i1.FIREBASE_OPTIONS), i0.ɵɵinject(i1.FIREBASE_APP_NAME, 8), i0.ɵɵinject(COLLECTION_ENABLED, 8), i0.ɵɵinject(APP_VERSION, 8), i0.ɵɵinject(APP_NAME, 8), i0.ɵɵinject(DEBUG_MODE, 8), i0.ɵɵinject(CONFIG, 8), i0.ɵɵinject(i0.PLATFORM_ID), i0.ɵɵinject(i0.NgZone)); }, token: AngularFireAnalytics, providedIn: "any" }); if (false) { /** * @type {?} * @private */ AngularFireAnalytics.prototype.options; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5hbHl0aWNzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2FuYWx5dGljcy9hbmFseXRpY3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxjQUFjLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbEcsT0FBTyxFQUFFLEtBQUssRUFBYyxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDN0MsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDcEQsT0FBTyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3RSxPQUFPLEVBR0wsc0JBQXNCLEVBQ3RCLGFBQWEsRUFDYixnQkFBZ0IsRUFDaEIsaUJBQWlCLEVBQ2pCLG1CQUFtQixFQUVwQixNQUFNLGVBQWUsQ0FBQzs7Ozs7O0FBR3ZCLDRCQUVDOztBQUVELE1BQU0sT0FBTyxrQkFBa0IsR0FBRyxJQUFJLGNBQWMsQ0FBVSxtREFBbUQsQ0FBQzs7QUFDbEgsTUFBTSxPQUFPLFdBQVcsR0FBRyxJQUFJLGNBQWMsQ0FBUyxtQ0FBbUMsQ0FBQzs7QUFDMUYsTUFBTSxPQUFPLFFBQVEsR0FBRyxJQUFJLGNBQWMsQ0FBUyxnQ0FBZ0MsQ0FBQzs7QUFDcEYsTUFBTSxPQUFPLFVBQVUsR0FBRyxJQUFJLGNBQWMsQ0FBVSxrQ0FBa0MsQ0FBQzs7QUFDekYsTUFBTSxPQUFPLE1BQU0sR0FBRyxJQUFJLGNBQWMsQ0FBUywrQkFBK0IsQ0FBQzs7TUFFM0UsWUFBWSxHQUFHLFVBQVU7O01BQ3pCLGVBQWUsR0FBRyxhQUFhOztNQUMvQixjQUFjLEdBQUcsWUFBWTs7TUFDN0Isa0JBQWtCLEdBQUcsZUFBZTs7TUFDcEMsbUJBQW1CLEdBQUcsUUFBUTs7TUFD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SW5qZWN0aW9uVG9rZW4sIE5nWm9uZSwgT3B0aW9uYWwsIFBMQVRGT1JNX0lEIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBFTVBUWSwgT2JzZXJ2YWJsZSwgb2YgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGlzUGxhdGZvcm1Ccm93c2VyIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IG1hcCwgdGFwLCBzaGFyZVJlcGxheSwgc3dpdGNoTWFwLCBvYnNlcnZlT24gfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge1xuICBGaXJlYmFzZUFwcENvbmZpZyxcbiAgRmlyZWJhc2VPcHRpb25zLFxuICDJtUFuZ3VsYXJGaXJlU2NoZWR1bGVycyxcbiAgybVsYXp5U0RLUHJveHksXG4gIEZJUkVCQVNFX09QVElPTlMsXG4gIEZJUkVCQVNFX0FQUF9OQU1FLFxuICDJtWZpcmViYXNlQXBwRmFjdG9yeSxcbiAgybVQcm9taXNlUHJveHlcbn0gZnJvbSAnQGFuZ3VsYXIvZmlyZSc7XG5pbXBvcnQgeyBhbmFseXRpY3MgfSBmcm9tICdmaXJlYmFzZS9hcHAnO1xuXG5leHBvcnQgaW50ZXJmYWNlIENvbmZpZyB7XG4gIFtrZXk6IHN0cmluZ106IGFueTtcbn1cblxuZXhwb3J0IGNvbnN0IENPTExFQ1RJT05fRU5BQkxFRCA9IG5ldyBJbmplY3Rpb25Ub2tlbjxib29sZWFuPignYW5ndWxhcmZpcmUyLmFuYWx5dGljcy5hbmFseXRpY3NDb2xsZWN0aW9uRW5hYmxlZCcpO1xuZXhwb3J0IGNvbnN0IEFQUF9WRVJTSU9OID0gbmV3IEluamVjdGlvblRva2VuPHN0cmluZz4oJ2FuZ3VsYXJmaXJlMi5hbmFseXRpY3MuYXBwVmVyc2lvbicpO1xuZXhwb3J0IGNvbnN0IEFQUF9OQU1FID0gbmV3IEluamVjdGlvblRva2VuPHN0cmluZz4oJ2FuZ3VsYXJmaXJlMi5hbmFseXRpY3MuYXBwTmFtZScpO1xuZXhwb3J0IGNvbnN0IERFQlVHX01PREUgPSBuZXcgSW5qZWN0aW9uVG9rZW48Ym9vbGVhbj4oJ2FuZ3VsYXJmaXJlMi5hbmFseXRpY3MuZGVidWdNb2RlJyk7XG5leHBvcnQgY29uc3QgQ09ORklHID0gbmV3IEluamVjdGlvblRva2VuPENvbmZpZz4oJ2FuZ3VsYXJmaXJlMi5hbmFseXRpY3MuY29uZmlnJyk7XG5cbmNvbnN0IEFQUF9OQU1FX0tFWSA9ICdhcHBfbmFtZSc7XG5jb25zdCBBUFBfVkVSU0lPTl9LRVkgPSAnYXBwX3ZlcnNpb24nO1xuY29uc3QgREVCVUdfTU9ERV9LRVkgPSAnZGVidWdfbW9kZSc7XG5jb25zdCBBTkFMWVRJQ1NfSURfRklFTEQgPSAnbWVhc3VyZW1lbnRJZCc7XG5jb25zdCBHVEFHX0NPTkZJR19DT01NQU5EID0gJ2NvbmZpZyc7XG5jb25zdCBHVEFHX0ZVTkNUSU9OX05BTUUgPSAnZ3RhZyc7XG5jb25zdCBEQVRBX0xBWUVSX05BTUUgPSAnZGF0YUxheWVyJztcblxuZXhwb3J0IGludGVyZmFjZSBBbmd1bGFyRmlyZUFuYWx5dGljcyBleHRlbmRzIMm1UHJvbWlzZVByb3h5PGFuYWx5dGljcy5BbmFseXRpY3M+IHtcbn1cblxubGV0IGd0YWc6ICguLi5hcmdzOiBhbnlbXSkgPT4gdm9pZDtcbmxldCBhbmFseXRpY3NJbml0aWFsaXplZDogUHJvbWlzZTx2b2lkPjtcbmNvbnN0IGFuYWx5dGljc0luc3RhbmNlQ2FjaGU6IHsgW2tleTogc3RyaW5nXTogT2JzZXJ2YWJsZTxhbmFseXRpY3MuQW5hbHl0aWNzPiB9ID0ge307XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ2FueSdcbn0pXG5leHBvcnQgY2xhc3MgQW5ndWxhckZpcmVBbmFseXRpY3Mge1xuXG4gIGFzeW5jIHVwZGF0ZUNvbmZpZyhjb25maWc6IENvbmZpZykge1xuICAgIGF3YWl0IGFuYWx5dGljc0luaXRpYWxpemVkO1xuICAgIGd0YWcoR1RBR19DT05GSUdfQ09NTUFORCwgdGhpcy5vcHRpb25zW0FOQUxZVElDU19JRF9GSUVMRF0sIHsgLi4uY29uZmlnLCB1cGRhdGU6IHRydWUgfSk7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBASW5qZWN0KEZJUkVCQVNFX09QVElPTlMpIHByaXZhdGUgb3B0aW9uczogRmlyZWJhc2VPcHRpb25zLFxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoRklSRUJBU0VfQVBQX05BTUUpIG5hbWVPckNvbmZpZzogc3RyaW5nIHwgRmlyZWJhc2VBcHBDb25maWcgfCBudWxsIHwgdW5kZWZpbmVkLFxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoQ09MTEVDVElPTl9FTkFCTEVEKSBhbmFseXRpY3NDb2xsZWN0aW9uRW5hYmxlZDogYm9vbGVhbiB8IG51bGwsXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChBUFBfVkVSU0lPTikgcHJvdmlkZWRBcHBWZXJzaW9uOiBzdHJpbmcgfCBudWxsLFxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoQVBQX05BTUUpIHByb3ZpZGVkQXBwTmFtZTogc3RyaW5nIHwgbnVsbCxcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KERFQlVHX01PREUpIGRlYnVnTW9kZUVuYWJsZWQ6IGJvb2xlYW4gfCBudWxsLFxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoQ09ORklHKSBwcm92aWRlZENvbmZpZzogQ29uZmlnIHwgbnVsbCxcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6YmFuLXR5cGVzXG4gICAgQEluamVjdChQTEFURk9STV9JRCkgcGxhdGZvcm1JZDogT2JqZWN0LFxuICAgIHpvbmU6IE5nWm9uZVxuICApIHtcblxuICAgIGlmICghYW5hbHl0aWNzSW5pdGlhbGl6ZWQpIHtcbiAgICAgIGlmIChpc1BsYXRmb3JtQnJvd3NlcihwbGF0Zm9ybUlkKSkge1xuICAgICAgICBndGFnID0gd2luZG93W0dUQUdfRlVOQ1RJT05fTkFNRV0gfHwgKCguLi5hcmdzOiBhbnlbXSkgPT4ge1xuICAgICAgICAgIHdpbmRvd1tEQVRBX0xBWUVSX05BTUVdLnB1c2goYXJncyk7XG4gICAgICAgIH0pO1xuICAgICAgICB3aW5kb3dbREFUQV9MQVlFUl9OQU1FXSA9IHdpbmRvd1tEQVRBX0xBWUVSX05BTUVdIHx8IFtdO1xuICAgICAgICBhbmFseXRpY3NJbml0aWFsaXplZCA9IHpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT5cbiAgICAgICAgICBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgICAgICAgIHdpbmRvd1tHVEFHX0ZVTkNUSU9OX05BTUVdID0gKC4uLmFyZ3M6IGFueVtdKSA9PiB7XG4gICAgICAgICAgICAgIGlmIChhcmdzWzBdID09PSAnanMnKSB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGd0YWcoLi4uYXJncyk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBndGFnID0gKCkgPT4ge1xuICAgICAgICB9O1xuICAgICAgICBhbmFseXRpY3NJbml0aWFsaXplZCA9IFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBhbmFseXRpY3MgPSBhbmFseXRpY3NJbnN0YW5jZUNhY2hlW29wdGlvbnNbQU5BTFlUSUNTX0lEX0ZJRUxEXV07XG4gICAgaWYgKCFhbmFseXRpY3MpIHtcbiAgICAgIGFuYWx5dGljcyA9IG9mKHVuZGVmaW5lZCkucGlwZShcbiAgICAgICAgb2JzZXJ2ZU9uKG5ldyDJtUFuZ3VsYXJGaXJlU2NoZWR1bGVycyh6b25lKS5vdXRzaWRlQW5ndWxhciksXG4gICAgICAgIHN3aXRjaE1hcCgoKSA9PiBpc1BsYXRmb3JtQnJvd3NlcihwbGF0Zm9ybUlkKSA/IGltcG9ydCgnZmlyZWJhc2UvYW5hbHl0aWNzJykgOiBFTVBUWSksXG4gICAgICAgIG1hcCgoKSA9PiDJtWZpcmViYXNlQXBwRmFjdG9yeShvcHRpb25zLCB6b25lLCBuYW1lT3JDb25maWcpKSxcbiAgICAgICAgbWFwKGFwcCA9PiBhcHAuYW5hbHl0aWNzKCkpLFxuICAgICAgICB0YXAoYW5hbHl0aWNzID0+IHtcbiAgICAgICAgICBpZiAoYW5hbHl0aWNzQ29sbGVjdGlvbkVuYWJsZWQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICBhbmFseXRpY3Muc2V0QW5hbHl0aWNzQ29sbGVjdGlvbkVuYWJsZWQoZmFsc2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSksXG4gICAgICAgIHNoYXJlUmVwbGF5KHsgYnVmZmVyU2l6ZTogMSwgcmVmQ291bnQ6IGZhbHNlIH0pXG4gICAgICApO1xuICAgICAgYW5hbHl0aWNzSW5zdGFuY2VDYWNoZVtvcHRpb25zW0FOQUxZVElDU19JRF9GSUVMRF1dID0gYW5hbHl0aWNzO1xuICAgIH1cblxuICAgIGlmIChwcm92aWRlZENvbmZpZykge1xuICAgICAgdGhpcy51cGRhdGVDb25maWcocHJvdmlkZWRDb25maWcpO1xuICAgIH1cbiAgICBpZiAocHJvdmlkZWRBcHBOYW1lKSB7XG4gICAgICB0aGlzLnVwZGF0ZUNvbmZpZyh7IFtBUFBfTkFNRV9LRVldOiBwcm92aWRlZEFwcE5hbWUgfSk7XG4gICAgfVxuICAgIGlmIChwcm92aWRlZEFwcFZlcnNpb24pIHtcbiAgICAgIHRoaXMudXBkYXRlQ29uZmlnKHsgW0FQUF9WRVJTSU9OX0tFWV06IHByb3ZpZGVkQXBwVmVyc2lvbiB9KTtcbiAgICB9XG4gICAgaWYgKGRlYnVnTW9kZUVuYWJsZWQpIHtcbiAgICAgIHRoaXMudXBkYXRlQ29uZmlnKHsgW0RFQlVHX01PREVfS0VZXTogMSB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gybVsYXp5U0RLUHJveHkodGhpcywgYW5hbHl0aWNzLCB6b25lKTtcblxuICB9XG5cbn1cbiJdfQ==