UNPKG

25.4 kBSource Map (JSON)View Raw
1{"version":3,"file":"angular-fire-analytics.js","sources":["../../../src/analytics/base.ts","../../../src/analytics/analytics.ts","../../../src/analytics/user-tracking.service.ts","../../../src/analytics/screen-tracking.service.ts","../../../src/analytics/analytics.module.ts","../../../src/analytics/angular-fire-analytics.ts"],"sourcesContent":["export const proxyPolyfillCompat = {\n app: null,\n logEvent: null,\n setCurrentScreen: null,\n setUserId: null,\n setUserProperties: null,\n setAnalyticsCollectionEnabled: null,\n};\n","import { Inject, Injectable, InjectionToken, NgZone, Optional, PLATFORM_ID } from '@angular/core';\nimport { EMPTY, of } from 'rxjs';\nimport { isPlatformBrowser } from '@angular/common';\nimport { map, shareReplay, switchMap, observeOn } from 'rxjs/operators';\nimport {\n ɵAngularFireSchedulers,\n ɵlazySDKProxy,\n ɵPromiseProxy,\n ɵapplyMixins,\n FirebaseApp\n} from '@angular/fire';\nimport firebase from 'firebase/app';\nimport { proxyPolyfillCompat } from './base';\nimport { ɵfetchInstance } from '@angular/fire';\n\nexport interface Config {\n [key: string]: any;\n}\n\nexport const COLLECTION_ENABLED = new InjectionToken<boolean>('angularfire2.analytics.analyticsCollectionEnabled');\nexport const APP_VERSION = new InjectionToken<string>('angularfire2.analytics.appVersion');\nexport const APP_NAME = new InjectionToken<string>('angularfire2.analytics.appName');\nexport const DEBUG_MODE = new InjectionToken<boolean>('angularfire2.analytics.debugMode');\nexport const CONFIG = new InjectionToken<Config>('angularfire2.analytics.config');\n\nconst APP_NAME_KEY = 'app_name';\nconst APP_VERSION_KEY = 'app_version';\nconst DEBUG_MODE_KEY = 'debug_mode';\nconst GTAG_CONFIG_COMMAND = 'config';\nconst GTAG_FUNCTION_NAME = 'gtag'; // TODO rename these\nconst DATA_LAYER_NAME = 'dataLayer';\nconst SEND_TO_KEY = 'send_to';\n\nexport interface AngularFireAnalytics extends ɵPromiseProxy<firebase.analytics.Analytics> {\n}\n\n@Injectable({\n providedIn: 'any'\n})\nexport class AngularFireAnalytics {\n\n private measurementId: string;\n private analyticsInitialized: Promise<void> = new Promise(() => {});\n\n async updateConfig(config: Config) {\n await this.analyticsInitialized;\n window[GTAG_FUNCTION_NAME](GTAG_CONFIG_COMMAND, this.measurementId, { ...config, update: true });\n }\n\n constructor(\n app: FirebaseApp,\n @Optional() @Inject(COLLECTION_ENABLED) analyticsCollectionEnabled: boolean | null,\n @Optional() @Inject(APP_VERSION) providedAppVersion: string | null,\n @Optional() @Inject(APP_NAME) providedAppName: string | null,\n @Optional() @Inject(DEBUG_MODE) debugModeEnabled: boolean | null,\n @Optional() @Inject(CONFIG) providedConfig: Config | null,\n // tslint:disable-next-line:ban-types\n @Inject(PLATFORM_ID) platformId: Object,\n zone: NgZone\n ) {\n\n if (isPlatformBrowser(platformId)) {\n\n window[DATA_LAYER_NAME] = window[DATA_LAYER_NAME] || [];\n\n // It turns out we can't rely on the measurementId in the Firebase config JSON\n // this identifier is not stable. firebase/analytics does a call to get a fresh value\n // falling back on the one in the config. Rather than do that ourselves we should listen\n // on our gtag function for a analytics config command\n // e.g, ['config', measurementId, { origin: 'firebase', firebase_id }]\n const parseMeasurementId = (...args: any[]) => {\n if (args[0] === 'config' && args[2].origin === 'firebase') {\n this.measurementId = args[1];\n return true;\n } else {\n return false;\n }\n };\n\n const patchGtag = (fn?: (...args: any[]) => void) => {\n window[GTAG_FUNCTION_NAME] = (...args: any[]) => {\n if (fn) {\n fn(...args);\n }\n // Inject app_name and app_version into events\n // TODO(jamesdaniels): I'm doing this as documented but it's still not\n // showing up in the console. Investigate. Guessing it's just part of the\n // whole GA4 transition mess.\n if (args[0] === 'event' && args[2][SEND_TO_KEY] === this.measurementId) {\n if (providedAppName) {\n args[2][APP_NAME_KEY] = providedAppName;\n }\n if (providedAppVersion) {\n args[2][APP_VERSION_KEY] = providedAppVersion;\n }\n }\n if (debugModeEnabled && typeof console !== 'undefined') {\n // tslint:disable-next-line:no-console\n console.info(...args);\n }\n /**\n * According to the gtag documentation, this function that defines a custom data layer cannot be\n * an arrow function because 'arguments' is not an array. It is actually an object that behaves\n * like an array and contains more information then just indexes. Transforming this into arrow function\n * caused issue #2505 where analytics no longer sent any data.\n */\n // tslint:disable-next-line: only-arrow-functions\n (function(..._args: any[]) {\n window[DATA_LAYER_NAME].push(arguments);\n })(...args);\n };\n };\n\n // Unclear if we still need to but I was running into config/events I passed\n // to gtag before ['js' timestamp] weren't getting parsed, so let's make a promise\n // that resolves when firebase/analytics has configured gtag.js that we wait on\n // before sending anything\n const firebaseAnalyticsAlreadyInitialized = window[DATA_LAYER_NAME].some(parseMeasurementId);\n if (firebaseAnalyticsAlreadyInitialized) {\n this.analyticsInitialized = Promise.resolve();\n patchGtag();\n } else {\n this.analyticsInitialized = new Promise(resolve => {\n patchGtag((...args) => {\n if (parseMeasurementId(...args)) {\n resolve();\n }\n });\n });\n }\n\n if (providedConfig) {\n this.updateConfig(providedConfig);\n }\n if (debugModeEnabled) {\n this.updateConfig({ [DEBUG_MODE_KEY]: 1 });\n }\n\n } else {\n\n this.analyticsInitialized = Promise.resolve();\n\n }\n\n const analytics = of(undefined).pipe(\n observeOn(new ɵAngularFireSchedulers(zone).outsideAngular),\n switchMap(() => isPlatformBrowser(platformId) ? zone.runOutsideAngular(() => import('firebase/analytics')) : EMPTY),\n // SEMVER can switch to isSupported() when we only target v8\n // switchMap(() => firebase.analytics.isSupported().then(it => it, () => false)),\n // TODO server-side investigate use of the Universal Analytics API\n // switchMap(supported => supported ? of(undefined) : EMPTY),\n map(() => {\n return ɵfetchInstance(`analytics`, 'AngularFireAnalytics', app, () => {\n const analytics = app.analytics();\n if (analyticsCollectionEnabled === false) {\n analytics.setAnalyticsCollectionEnabled(false);\n }\n return analytics;\n }, [app, analyticsCollectionEnabled, providedConfig, debugModeEnabled]);\n }),\n shareReplay({ bufferSize: 1, refCount: false })\n );\n\n return ɵlazySDKProxy(this, analytics, zone);\n\n }\n\n}\n\nɵapplyMixins(AngularFireAnalytics, [proxyPolyfillCompat]);\n","import { isPlatformServer } from '@angular/common';\nimport { Inject, Injectable, NgZone, OnDestroy, PLATFORM_ID } from '@angular/core';\nimport { AngularFireAnalytics } from './analytics';\nimport { AngularFireAuth } from '@angular/fire/auth';\nimport { Subscription } from 'rxjs';\n\n@Injectable()\nexport class UserTrackingService implements OnDestroy {\n\n initialized: Promise<void>;\n private disposables: Array<Subscription> = [];\n\n // TODO a user properties injector\n constructor(\n analytics: AngularFireAnalytics,\n // tslint:disable-next-line:ban-types\n @Inject(PLATFORM_ID) platformId: Object,\n auth: AngularFireAuth,\n zone: NgZone,\n ) {\n\n if (!isPlatformServer(platformId)) {\n let resolveInitialized;\n this.initialized = zone.runOutsideAngular(() => new Promise(resolve => resolveInitialized = resolve));\n this.disposables = [\n auth.authState.subscribe(user => {\n analytics.setUserId(user?.uid);\n resolveInitialized();\n }),\n auth.credential.subscribe(credential => {\n if (credential) {\n const method = credential.user.isAnonymous ? 'anonymous' : credential.additionalUserInfo.providerId;\n if (credential.additionalUserInfo.isNewUser) {\n analytics.logEvent('sign_up', { method });\n }\n analytics.logEvent('login', { method });\n }\n })\n ];\n } else {\n this.initialized = Promise.resolve();\n }\n\n }\n\n ngOnDestroy() {\n this.disposables.forEach(it => it.unsubscribe());\n }\n}\n","import {\n ComponentFactoryResolver,\n Inject,\n Injectable,\n NgZone,\n OnDestroy,\n Optional,\n PLATFORM_ID\n} from '@angular/core';\nimport { of, Subscription } from 'rxjs';\nimport { distinctUntilChanged, filter, groupBy, map, mergeMap, pairwise, startWith, switchMap } from 'rxjs/operators';\nimport { ActivationEnd, Router, ɵEmptyOutletComponent } from '@angular/router';\nimport { AngularFireAnalytics } from './analytics';\nimport { Title } from '@angular/platform-browser';\nimport { isPlatformBrowser } from '@angular/common';\nimport { UserTrackingService } from './user-tracking.service';\n\nconst FIREBASE_EVENT_ORIGIN_KEY = 'firebase_event_origin';\nconst FIREBASE_PREVIOUS_SCREEN_CLASS_KEY = 'firebase_previous_class';\nconst FIREBASE_PREVIOUS_SCREEN_INSTANCE_ID_KEY = 'firebase_previous_id';\nconst FIREBASE_PREVIOUS_SCREEN_NAME_KEY = 'firebase_previous_screen';\nconst FIREBASE_SCREEN_CLASS_KEY = 'firebase_screen_class';\nconst FIREBASE_SCREEN_INSTANCE_ID_KEY = 'firebase_screen_id';\nconst FIREBASE_SCREEN_NAME_KEY = 'firebase_screen';\nconst OUTLET_KEY = 'outlet';\nconst PAGE_PATH_KEY = 'page_path';\nconst PAGE_TITLE_KEY = 'page_title';\nconst SCREEN_CLASS_KEY = 'screen_class';\nconst SCREEN_NAME_KEY = 'screen_name';\nconst SCREEN_VIEW_EVENT = 'screen_view';\nconst EVENT_ORIGIN_AUTO = 'auto';\nconst SCREEN_INSTANCE_DELIMITER = '#';\n\n// this is an INT64 in iOS/Android but use INT32 cause javascript\nlet nextScreenInstanceID = Math.floor(Math.random() * (2 ** 32 - 1)) - 2 ** 31;\n\nconst knownScreenInstanceIDs: { [key: string]: number } = {};\n\nconst getScreenInstanceID = (params: { [key: string]: any }) => {\n // unique the screen class against the outlet name\n const screenInstanceKey = [\n params[SCREEN_CLASS_KEY],\n params[OUTLET_KEY]\n ].join(SCREEN_INSTANCE_DELIMITER);\n if (knownScreenInstanceIDs.hasOwnProperty(screenInstanceKey)) {\n return knownScreenInstanceIDs[screenInstanceKey];\n } else {\n const ret = nextScreenInstanceID++;\n knownScreenInstanceIDs[screenInstanceKey] = ret;\n return ret;\n }\n};\n\n@Injectable()\nexport class ScreenTrackingService implements OnDestroy {\n\n private disposable: Subscription | undefined;\n\n constructor(\n analytics: AngularFireAnalytics,\n @Optional() router: Router,\n @Optional() title: Title,\n componentFactoryResolver: ComponentFactoryResolver,\n // tslint:disable-next-line:ban-types\n @Inject(PLATFORM_ID) platformId: Object,\n zone: NgZone,\n @Optional() userTrackingService: UserTrackingService,\n ) {\n if (!router || !isPlatformBrowser(platformId)) {\n return this;\n }\n zone.runOutsideAngular(() => {\n const activationEndEvents = router.events.pipe(filter<ActivationEnd>(e => e instanceof ActivationEnd));\n this.disposable = activationEndEvents.pipe(\n switchMap(activationEnd => {\n // router parseUrl is having trouble with outlets when they're empty\n // e.g, /asdf/1(bob://sally:asdf), so put another slash in when empty\n const urlTree = router.parseUrl(router.url.replace(/(?:\\().+(?:\\))/g, a => a.replace('://', ':///')));\n const pagePath = urlTree.root.children[activationEnd.snapshot.outlet]?.toString() || '';\n const actualSnapshot = router.routerState.root.children.map(it => it).find(it => it.outlet === activationEnd.snapshot.outlet);\n\n if (!actualSnapshot) {\n return of(null);\n }\n\n let actualDeep = actualSnapshot;\n while (actualDeep.firstChild) {\n actualDeep = actualDeep.firstChild;\n }\n const screenName = actualDeep.pathFromRoot.map(s => s.routeConfig?.path).filter(it => it).join('/') || '/';\n\n const params = {\n [SCREEN_NAME_KEY]: screenName,\n [PAGE_PATH_KEY]: `/${pagePath}`,\n [FIREBASE_EVENT_ORIGIN_KEY]: EVENT_ORIGIN_AUTO,\n [FIREBASE_SCREEN_NAME_KEY]: screenName,\n [OUTLET_KEY]: activationEnd.snapshot.outlet\n };\n if (title) {\n params[PAGE_TITLE_KEY] = title.getTitle();\n }\n\n let component = actualSnapshot.component;\n if (component) {\n if (component === ɵEmptyOutletComponent) {\n let deepSnapshot = activationEnd.snapshot;\n // TODO when might there be mutple children, different outlets? explore\n while (deepSnapshot.firstChild) {\n deepSnapshot = deepSnapshot.firstChild;\n }\n component = deepSnapshot.component;\n }\n } else {\n component = activationEnd.snapshot.component;\n }\n\n if (typeof component === 'string') {\n return of({ ...params, [SCREEN_CLASS_KEY]: component });\n } else if (component) {\n const componentFactory = componentFactoryResolver.resolveComponentFactory(component);\n return of({ ...params, [SCREEN_CLASS_KEY]: componentFactory.selector });\n } else {\n // lazy loads cause extra activations, ignore\n return of(null);\n }\n }),\n filter(it => it),\n map(params => ({\n [FIREBASE_SCREEN_CLASS_KEY]: params[SCREEN_CLASS_KEY],\n [FIREBASE_SCREEN_INSTANCE_ID_KEY]: getScreenInstanceID(params),\n ...params\n })),\n groupBy(it => it[OUTLET_KEY]),\n mergeMap(it => it.pipe(\n distinctUntilChanged((a, b) => JSON.stringify(a) === JSON.stringify(b)),\n startWith(undefined),\n pairwise(),\n map(([prior, current]) =>\n prior ? {\n [FIREBASE_PREVIOUS_SCREEN_CLASS_KEY]: prior[SCREEN_CLASS_KEY],\n [FIREBASE_PREVIOUS_SCREEN_NAME_KEY]: prior[SCREEN_NAME_KEY],\n [FIREBASE_PREVIOUS_SCREEN_INSTANCE_ID_KEY]: prior[FIREBASE_SCREEN_INSTANCE_ID_KEY],\n ...current\n } : current\n ),\n switchMap(async params => {\n if (userTrackingService) {\n await userTrackingService.initialized;\n }\n return await analytics.logEvent(SCREEN_VIEW_EVENT, params);\n })\n ))\n ).subscribe();\n });\n }\n\n ngOnDestroy() {\n if (this.disposable) {\n this.disposable.unsubscribe();\n }\n }\n\n}\n","import { NgModule, Optional } from '@angular/core';\nimport { ScreenTrackingService } from './screen-tracking.service';\nimport { AngularFireAnalytics } from './analytics';\nimport { UserTrackingService } from './user-tracking.service';\n\n@NgModule({\n providers: [ AngularFireAnalytics ]\n})\nexport class AngularFireAnalyticsModule {\n constructor(\n analytics: AngularFireAnalytics,\n @Optional() screenTracking: ScreenTrackingService,\n @Optional() userTracking: UserTrackingService\n ) {\n // calling anything on analytics will eagerly load the SDK\n // tslint:disable-next-line:no-unused-expression\n analytics.app.then(() => {});\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
\No newline at end of file