@angular/fire
Version:
The official library for Firebase and Angular
177 lines • 17.8 kB
JavaScript
/**
* @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==