ngx-google-analytics
Version:
A simple ng-9 wrapper to load Google Analytics dependency by angular way
54 lines • 9.28 kB
JavaScript
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==