UNPKG

ngx-google-analytics

Version:

A simple ng-9 wrapper to load Google Analytics dependency by angular way

54 lines 9.28 kB
import { APP_BOOTSTRAP_LISTENER } from '@angular/core'; import { Router, NavigationEnd } from '@angular/router'; import { GoogleAnalyticsService } from '../services/google-analytics.service'; import { NGX_GOOGLE_ANALYTICS_ROUTING_SETTINGS_TOKEN } from '../tokens/ngx-google-analytics-router-settings-token'; import { filter, skip } from 'rxjs/operators'; /** * Provide a DI Configuration to attach GA Trigger to Router Events at Angular Startup Cycle. */ export const NGX_GOOGLE_ANALYTICS_ROUTER_INITIALIZER_PROVIDER = { provide: APP_BOOTSTRAP_LISTENER, multi: true, useFactory: GoogleAnalyticsRouterInitializer, deps: [ NGX_GOOGLE_ANALYTICS_ROUTING_SETTINGS_TOKEN, GoogleAnalyticsService ] }; /** * Attach a listener to `NavigationEnd` Router event. So, every time Router finish the page resolution it should call `NavigationEnd` event. * We assume that NavigationEnd is the final page resolution and call GA `page_view` command. * * To avoid double binds, we also destroy the subscription when de Bootstrap Component is destroied. But, we don't know for sure * that this strategy does not cause double bind on multiple bootstrap components. * * We are using de component's injector reference to resolve Router, sou I hope there is no problem w/ double bing. * * If you have this problem, I encourage not Use NgxGoogleAnalyticsRouterModule and atach the listener on AppComponent initialization. */ export function GoogleAnalyticsRouterInitializer(settings, gaService) { return async (c) => { const router = c.injector.get(Router); const { include = [], exclude = [] } = settings ?? {}; const includeRules = normalizePathRules(include); const excludeRules = normalizePathRules(exclude); const subs = router .events .pipe(filter((event) => event instanceof NavigationEnd), skip(1), // Prevend double views on the first tigger (because GA Already send one ping on setup) filter(event => includeRules.length > 0 ? includeRules.some(rule => rule.test(event.urlAfterRedirects)) : true), filter(event => excludeRules.length > 0 ? !excludeRules.some(rule => rule.test(event.urlAfterRedirects)) : true)) .subscribe(event => gaService.pageView(event.urlAfterRedirects, undefined)); // Cleanup c.onDestroy(() => subs.unsubscribe()); }; } /** Converts all path rules from string to Regex instances */ function normalizePathRules(rules) { return rules.map(rule => (rule instanceof RegExp) ? rule : new RegExp(`^${rule.replace('*', '.*')}$`, 'i')); } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ29vZ2xlLWFuYWx5dGljcy1yb3V0ZXIuaW5pdGlhbGl6ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtZ29vZ2xlLWFuYWx5dGljcy9zcmMvbGliL2luaXRpYWxpemVycy9nb29nbGUtYW5hbHl0aWNzLXJvdXRlci5pbml0aWFsaXplci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQVksc0JBQXNCLEVBQWdCLE1BQU0sZUFBZSxDQUFDO0FBQy9FLE9BQU8sRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFeEQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDOUUsT0FBTyxFQUFFLDJDQUEyQyxFQUFFLE1BQU0sc0RBQXNELENBQUM7QUFDbkgsT0FBTyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUU5Qzs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLGdEQUFnRCxHQUFhO0lBQ3hFLE9BQU8sRUFBRSxzQkFBc0I7SUFDL0IsS0FBSyxFQUFFLElBQUk7SUFDWCxVQUFVLEVBQUUsZ0NBQWdDO0lBQzVDLElBQUksRUFBRTtRQUNKLDJDQUEyQztRQUMzQyxzQkFBc0I7S0FDdkI7Q0FDRixDQUFDO0FBRUY7Ozs7Ozs7Ozs7R0FVRztBQUNILE1BQU0sVUFBVSxnQ0FBZ0MsQ0FDOUMsUUFBeUMsRUFDekMsU0FBaUM7SUFFakMsT0FBTyxLQUFLLEVBQUUsQ0FBb0IsRUFBRSxFQUFFO1FBQ3BDLE1BQU0sTUFBTSxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3RDLE1BQU0sRUFBRSxPQUFPLEdBQUcsRUFBRSxFQUFFLE9BQU8sR0FBRyxFQUFFLEVBQUUsR0FBRyxRQUFRLElBQUksRUFBRSxDQUFDO1FBQ3RELE1BQU0sWUFBWSxHQUFHLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2pELE1BQU0sWUFBWSxHQUFHLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2pELE1BQU0sSUFBSSxHQUFHLE1BQU07YUFDaEIsTUFBTTthQUNOLElBQUksQ0FDSCxNQUFNLENBQUMsQ0FBQyxLQUFVLEVBQUUsRUFBRSxDQUFDLEtBQUssWUFBWSxhQUFhLENBQUMsRUFDdEQsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLHVGQUF1RjtRQUNoRyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUM7WUFDckMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1lBQy9ELENBQUMsQ0FBQyxJQUFJLENBQUMsRUFDVCxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUM7WUFDckMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGlCQUFpQixDQUFDLENBQUM7WUFDaEUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUNWO2FBQ0EsU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsaUJBQWlCLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQztRQUM5RSxVQUFVO1FBQ1YsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztJQUN4QyxDQUFDLENBQUM7QUFDSixDQUFDO0FBRUQsNkRBQTZEO0FBQzdELFNBQVMsa0JBQWtCLENBQUMsS0FBNkI7SUFDdkQsT0FBTyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLFlBQVksTUFBTSxDQUFDO1FBQy9DLENBQUMsQ0FBQyxJQUFJO1FBQ04sQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ3ZELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBQcm92aWRlciwgQVBQX0JPT1RTVFJBUF9MSVNURU5FUiwgQ29tcG9uZW50UmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBSb3V0ZXIsIE5hdmlnYXRpb25FbmQgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgSUdvb2dsZUFuYWx5dGljc1JvdXRpbmdTZXR0aW5ncyB9IGZyb20gJy4uL2ludGVyZmFjZXMvaS1nb29nbGUtYW5hbHl0aWNzLXJvdXRpbmctc2V0dGluZ3MnO1xuaW1wb3J0IHsgR29vZ2xlQW5hbHl0aWNzU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2dvb2dsZS1hbmFseXRpY3Muc2VydmljZSc7XG5pbXBvcnQgeyBOR1hfR09PR0xFX0FOQUxZVElDU19ST1VUSU5HX1NFVFRJTkdTX1RPS0VOIH0gZnJvbSAnLi4vdG9rZW5zL25neC1nb29nbGUtYW5hbHl0aWNzLXJvdXRlci1zZXR0aW5ncy10b2tlbic7XG5pbXBvcnQgeyBmaWx0ZXIsIHNraXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbi8qKlxuICogUHJvdmlkZSBhIERJIENvbmZpZ3VyYXRpb24gdG8gYXR0YWNoIEdBIFRyaWdnZXIgdG8gUm91dGVyIEV2ZW50cyBhdCBBbmd1bGFyIFN0YXJ0dXAgQ3ljbGUuXG4gKi9cbmV4cG9ydCBjb25zdCBOR1hfR09PR0xFX0FOQUxZVElDU19ST1VURVJfSU5JVElBTElaRVJfUFJPVklERVI6IFByb3ZpZGVyID0ge1xuICBwcm92aWRlOiBBUFBfQk9PVFNUUkFQX0xJU1RFTkVSLFxuICBtdWx0aTogdHJ1ZSxcbiAgdXNlRmFjdG9yeTogR29vZ2xlQW5hbHl0aWNzUm91dGVySW5pdGlhbGl6ZXIsXG4gIGRlcHM6IFtcbiAgICBOR1hfR09PR0xFX0FOQUxZVElDU19ST1VUSU5HX1NFVFRJTkdTX1RPS0VOLFxuICAgIEdvb2dsZUFuYWx5dGljc1NlcnZpY2VcbiAgXVxufTtcblxuLyoqXG4gKiBBdHRhY2ggYSBsaXN0ZW5lciB0byBgTmF2aWdhdGlvbkVuZGAgUm91dGVyIGV2ZW50LiBTbywgZXZlcnkgdGltZSBSb3V0ZXIgZmluaXNoIHRoZSBwYWdlIHJlc29sdXRpb24gaXQgc2hvdWxkIGNhbGwgYE5hdmlnYXRpb25FbmRgIGV2ZW50LlxuICogV2UgYXNzdW1lIHRoYXQgTmF2aWdhdGlvbkVuZCBpcyB0aGUgZmluYWwgcGFnZSByZXNvbHV0aW9uIGFuZCBjYWxsIEdBIGBwYWdlX3ZpZXdgIGNvbW1hbmQuXG4gKlxuICogVG8gYXZvaWQgZG91YmxlIGJpbmRzLCB3ZSBhbHNvIGRlc3Ryb3kgdGhlIHN1YnNjcmlwdGlvbiB3aGVuIGRlIEJvb3RzdHJhcCBDb21wb25lbnQgaXMgZGVzdHJvaWVkLiBCdXQsIHdlIGRvbid0IGtub3cgZm9yIHN1cmVcbiAqIHRoYXQgdGhpcyBzdHJhdGVneSBkb2VzIG5vdCBjYXVzZSBkb3VibGUgYmluZCBvbiBtdWx0aXBsZSBib290c3RyYXAgY29tcG9uZW50cy5cbiAqXG4gKiBXZSBhcmUgdXNpbmcgZGUgY29tcG9uZW50J3MgaW5qZWN0b3IgcmVmZXJlbmNlIHRvIHJlc29sdmUgUm91dGVyLCBzb3UgSSBob3BlIHRoZXJlIGlzIG5vIHByb2JsZW0gdy8gZG91YmxlIGJpbmcuXG4gKlxuICogSWYgeW91IGhhdmUgdGhpcyBwcm9ibGVtLCBJIGVuY291cmFnZSBub3QgVXNlIE5neEdvb2dsZUFuYWx5dGljc1JvdXRlck1vZHVsZSBhbmQgYXRhY2ggdGhlIGxpc3RlbmVyIG9uIEFwcENvbXBvbmVudCBpbml0aWFsaXphdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIEdvb2dsZUFuYWx5dGljc1JvdXRlckluaXRpYWxpemVyKFxuICBzZXR0aW5nczogSUdvb2dsZUFuYWx5dGljc1JvdXRpbmdTZXR0aW5ncyxcbiAgZ2FTZXJ2aWNlOiBHb29nbGVBbmFseXRpY3NTZXJ2aWNlXG4pIHtcbiAgcmV0dXJuIGFzeW5jIChjOiBDb21wb25lbnRSZWY8YW55PikgPT4ge1xuICAgIGNvbnN0IHJvdXRlciA9IGMuaW5qZWN0b3IuZ2V0KFJvdXRlcik7XG4gICAgY29uc3QgeyBpbmNsdWRlID0gW10sIGV4Y2x1ZGUgPSBbXSB9ID0gc2V0dGluZ3MgPz8ge307XG4gICAgY29uc3QgaW5jbHVkZVJ1bGVzID0gbm9ybWFsaXplUGF0aFJ1bGVzKGluY2x1ZGUpO1xuICAgIGNvbnN0IGV4Y2x1ZGVSdWxlcyA9IG5vcm1hbGl6ZVBhdGhSdWxlcyhleGNsdWRlKTtcbiAgICBjb25zdCBzdWJzID0gcm91dGVyXG4gICAgICAuZXZlbnRzXG4gICAgICAucGlwZShcbiAgICAgICAgZmlsdGVyKChldmVudDogYW55KSA9PiBldmVudCBpbnN0YW5jZW9mIE5hdmlnYXRpb25FbmQpLFxuICAgICAgICBza2lwKDEpLCAvLyBQcmV2ZW5kIGRvdWJsZSB2aWV3cyBvbiB0aGUgZmlyc3QgdGlnZ2VyIChiZWNhdXNlIEdBIEFscmVhZHkgc2VuZCBvbmUgcGluZyBvbiBzZXR1cClcbiAgICAgICAgZmlsdGVyKGV2ZW50ID0+IGluY2x1ZGVSdWxlcy5sZW5ndGggPiAwXG4gICAgICAgICAgPyBpbmNsdWRlUnVsZXMuc29tZShydWxlID0+IHJ1bGUudGVzdChldmVudC51cmxBZnRlclJlZGlyZWN0cykpXG4gICAgICAgICAgOiB0cnVlKSxcbiAgICAgICAgZmlsdGVyKGV2ZW50ID0+IGV4Y2x1ZGVSdWxlcy5sZW5ndGggPiAwXG4gICAgICAgICAgPyAhZXhjbHVkZVJ1bGVzLnNvbWUocnVsZSA9PiBydWxlLnRlc3QoZXZlbnQudXJsQWZ0ZXJSZWRpcmVjdHMpKVxuICAgICAgICAgIDogdHJ1ZSlcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoZXZlbnQgPT4gZ2FTZXJ2aWNlLnBhZ2VWaWV3KGV2ZW50LnVybEFmdGVyUmVkaXJlY3RzLCB1bmRlZmluZWQpKTtcbiAgICAvLyBDbGVhbnVwXG4gICAgYy5vbkRlc3Ryb3koKCkgPT4gc3Vicy51bnN1YnNjcmliZSgpKTtcbiAgfTtcbn1cblxuLyoqIENvbnZlcnRzIGFsbCBwYXRoIHJ1bGVzIGZyb20gc3RyaW5nIHRvIFJlZ2V4IGluc3RhbmNlcyAqL1xuZnVuY3Rpb24gbm9ybWFsaXplUGF0aFJ1bGVzKHJ1bGVzOiBBcnJheTxzdHJpbmcgfCBSZWdFeHA+KTogQXJyYXk8UmVnRXhwPiB7XG4gIHJldHVybiBydWxlcy5tYXAocnVsZSA9PiAocnVsZSBpbnN0YW5jZW9mIFJlZ0V4cClcbiAgICA/IHJ1bGVcbiAgICA6IG5ldyBSZWdFeHAoYF4ke3J1bGUucmVwbGFjZSgnKicsICcuKicpfSRgLCAnaScpKTtcbn1cbiJdfQ==