UNPKG

@hakimio/ngx-google-analytics

Version:

A simple Google Analytics wrapper for Angular apps

66 lines 9.81 kB
import { DOCUMENT } from '@angular/common'; import { APP_INITIALIZER, isDevMode } from '@angular/core'; import { NGX_GOOGLE_ANALYTICS_SETTINGS_TOKEN } from '../tokens/ngx-google-analytics-settings-token'; import { NGX_GTAG_FN } from '../tokens/ngx-gtag-token'; /** * Provide a DI Configuration to attach GA Initialization at Angular Startup Cycle. */ export const NGX_GOOGLE_ANALYTICS_INITIALIZER_PROVIDER = { provide: APP_INITIALIZER, multi: true, useFactory: GoogleAnalyticsInitializer, deps: [ NGX_GOOGLE_ANALYTICS_SETTINGS_TOKEN, NGX_GTAG_FN, DOCUMENT ] }; /** * Create a script element on DOM and link it to Google Analytics tracking code URI. * After that, execute exactly same init process as tracking snippet code. */ export function GoogleAnalyticsInitializer(settings, gtag, document) { return async () => { if (!settings.ga4TagId) { if (!isDevMode()) { console.error('Empty tracking code for Google Analytics. Make sure to provide one when initializing NgxGoogleAnalyticsModule.'); } return; } if (!gtag) { if (!isDevMode()) { console.error('Couldn\'t create or read gtag() fn. Make sure this module is running on a Browser w/ access to Window interface.'); } return; } if (!document) { if (!isDevMode()) { console.error('Couldn\'t to access Document interface. Make sure this module is running on a Browser w/ access to Document interface.'); } } // Set default ga.js uri settings.uri = settings.uri || `https://www.googletagmanager.com/gtag/js?id=${settings.ga4TagId}`; // these commands should run first! settings.initCommands = settings?.initCommands ?? []; // assert config command if (!settings.initCommands.find(x => x.command === 'config')) { settings.initCommands.unshift({ command: 'config', values: [settings.ga4TagId] }); } // assert js command if (!settings.initCommands.find(x => x.command === 'js')) { settings.initCommands.unshift({ command: 'js', values: [new Date()] }); } for (const command of settings.initCommands) { gtag(command.command, ...command.values); } const s = document.createElement('script'); s.async = true; s.src = settings.uri; if (settings.nonce) { s.setAttribute('nonce', settings.nonce); } const head = document.getElementsByTagName('head')[0]; head.appendChild(s); }; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ29vZ2xlLWFuYWx5dGljcy5pbml0aWFsaXplci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1nb29nbGUtYW5hbHl0aWNzL3NyYy9saWIvaW5pdGlhbGl6ZXJzL2dvb2dsZS1hbmFseXRpY3MuaW5pdGlhbGl6ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQ3pDLE9BQU8sRUFBQyxlQUFlLEVBQUUsU0FBUyxFQUFXLE1BQU0sZUFBZSxDQUFDO0FBRW5FLE9BQU8sRUFBQyxtQ0FBbUMsRUFBQyxNQUFNLCtDQUErQyxDQUFDO0FBQ2xHLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSwwQkFBMEIsQ0FBQztBQUdyRDs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLHlDQUF5QyxHQUFhO0lBQy9ELE9BQU8sRUFBRSxlQUFlO0lBQ3hCLEtBQUssRUFBRSxJQUFJO0lBQ1gsVUFBVSxFQUFFLDBCQUEwQjtJQUN0QyxJQUFJLEVBQUU7UUFDRixtQ0FBbUM7UUFDbkMsV0FBVztRQUNYLFFBQVE7S0FDWDtDQUNKLENBQUM7QUFFRjs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsMEJBQTBCLENBQ3RDLFFBQWtDLEVBQ2xDLElBQVksRUFDWixRQUFrQjtJQUVsQixPQUFPLEtBQUssSUFBSSxFQUFFO1FBQ2QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUU7WUFDcEIsSUFBSSxDQUFDLFNBQVMsRUFBRSxFQUFFO2dCQUNkLE9BQU8sQ0FBQyxLQUFLLENBQUMsZ0hBQWdILENBQUMsQ0FBQzthQUNuSTtZQUVELE9BQU87U0FDVjtRQUVELElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDUCxJQUFJLENBQUMsU0FBUyxFQUFFLEVBQUU7Z0JBQ2QsT0FBTyxDQUFDLEtBQUssQ0FBQyxrSEFBa0gsQ0FBQyxDQUFDO2FBQ3JJO1lBRUQsT0FBTztTQUNWO1FBRUQsSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNYLElBQUksQ0FBQyxTQUFTLEVBQUUsRUFBRTtnQkFDZCxPQUFPLENBQUMsS0FBSyxDQUFDLHdIQUF3SCxDQUFDLENBQUM7YUFDM0k7U0FDSjtRQUVELHdCQUF3QjtRQUN4QixRQUFRLENBQUMsR0FBRyxHQUFHLFFBQVEsQ0FBQyxHQUFHLElBQUksK0NBQStDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUVsRyxtQ0FBbUM7UUFDbkMsUUFBUSxDQUFDLFlBQVksR0FBRyxRQUFRLEVBQUUsWUFBWSxJQUFJLEVBQUUsQ0FBQztRQUVyRCx3QkFBd0I7UUFDeEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sS0FBSyxRQUFRLENBQUMsRUFBRTtZQUMxRCxRQUFRLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxFQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxFQUFDLENBQUMsQ0FBQztTQUNuRjtRQUVELG9CQUFvQjtRQUNwQixJQUFJLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxLQUFLLElBQUksQ0FBQyxFQUFFO1lBQ3RELFFBQVEsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLEVBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLEVBQUMsQ0FBQyxDQUFDO1NBQ3hFO1FBRUQsS0FBSyxNQUFNLE9BQU8sSUFBSSxRQUFRLENBQUMsWUFBWSxFQUFFO1lBQ3pDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQzVDO1FBRUQsTUFBTSxDQUFDLEdBQXNCLFFBQVEsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDOUQsQ0FBQyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7UUFDZixDQUFDLENBQUMsR0FBRyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUM7UUFFckIsSUFBSSxRQUFRLENBQUMsS0FBSyxFQUFFO1lBQ2hCLENBQUMsQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUMzQztRQUVELE1BQU0sSUFBSSxHQUFvQixRQUFRLENBQUMsb0JBQW9CLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdkUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN4QixDQUFDLENBQUM7QUFDTixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtET0NVTUVOVH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHtBUFBfSU5JVElBTElaRVIsIGlzRGV2TW9kZSwgUHJvdmlkZXJ9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge0lHb29nbGVBbmFseXRpY3NTZXR0aW5nc30gZnJvbSAnLi4vaW50ZXJmYWNlcy9pLWdvb2dsZS1hbmFseXRpY3Mtc2V0dGluZ3MnO1xyXG5pbXBvcnQge05HWF9HT09HTEVfQU5BTFlUSUNTX1NFVFRJTkdTX1RPS0VOfSBmcm9tICcuLi90b2tlbnMvbmd4LWdvb2dsZS1hbmFseXRpY3Mtc2V0dGluZ3MtdG9rZW4nO1xyXG5pbXBvcnQge05HWF9HVEFHX0ZOfSBmcm9tICcuLi90b2tlbnMvbmd4LWd0YWctdG9rZW4nO1xyXG5pbXBvcnQge0d0YWdGbn0gZnJvbSAnLi4vdHlwZXMvZ3RhZy50eXBlJztcclxuXHJcbi8qKlxyXG4gKiBQcm92aWRlIGEgREkgQ29uZmlndXJhdGlvbiB0byBhdHRhY2ggR0EgSW5pdGlhbGl6YXRpb24gYXQgQW5ndWxhciBTdGFydHVwIEN5Y2xlLlxyXG4gKi9cclxuZXhwb3J0IGNvbnN0IE5HWF9HT09HTEVfQU5BTFlUSUNTX0lOSVRJQUxJWkVSX1BST1ZJREVSOiBQcm92aWRlciA9IHtcclxuICAgIHByb3ZpZGU6IEFQUF9JTklUSUFMSVpFUixcclxuICAgIG11bHRpOiB0cnVlLFxyXG4gICAgdXNlRmFjdG9yeTogR29vZ2xlQW5hbHl0aWNzSW5pdGlhbGl6ZXIsXHJcbiAgICBkZXBzOiBbXHJcbiAgICAgICAgTkdYX0dPT0dMRV9BTkFMWVRJQ1NfU0VUVElOR1NfVE9LRU4sXHJcbiAgICAgICAgTkdYX0dUQUdfRk4sXHJcbiAgICAgICAgRE9DVU1FTlRcclxuICAgIF1cclxufTtcclxuXHJcbi8qKlxyXG4gKiBDcmVhdGUgYSBzY3JpcHQgZWxlbWVudCBvbiBET00gYW5kIGxpbmsgaXQgdG8gR29vZ2xlIEFuYWx5dGljcyB0cmFja2luZyBjb2RlIFVSSS5cclxuICogQWZ0ZXIgdGhhdCwgZXhlY3V0ZSBleGFjdGx5IHNhbWUgaW5pdCBwcm9jZXNzIGFzIHRyYWNraW5nIHNuaXBwZXQgY29kZS5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBHb29nbGVBbmFseXRpY3NJbml0aWFsaXplcihcclxuICAgIHNldHRpbmdzOiBJR29vZ2xlQW5hbHl0aWNzU2V0dGluZ3MsXHJcbiAgICBndGFnOiBHdGFnRm4sXHJcbiAgICBkb2N1bWVudDogRG9jdW1lbnRcclxuKSB7XHJcbiAgICByZXR1cm4gYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgIGlmICghc2V0dGluZ3MuZ2E0VGFnSWQpIHtcclxuICAgICAgICAgICAgaWYgKCFpc0Rldk1vZGUoKSkge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignRW1wdHkgdHJhY2tpbmcgY29kZSBmb3IgR29vZ2xlIEFuYWx5dGljcy4gTWFrZSBzdXJlIHRvIHByb3ZpZGUgb25lIHdoZW4gaW5pdGlhbGl6aW5nIE5neEdvb2dsZUFuYWx5dGljc01vZHVsZS4nKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFndGFnKSB7XHJcbiAgICAgICAgICAgIGlmICghaXNEZXZNb2RlKCkpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0NvdWxkblxcJ3QgY3JlYXRlIG9yIHJlYWQgZ3RhZygpIGZuLiBNYWtlIHN1cmUgdGhpcyBtb2R1bGUgaXMgcnVubmluZyBvbiBhIEJyb3dzZXIgdy8gYWNjZXNzIHRvIFdpbmRvdyBpbnRlcmZhY2UuJyk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghZG9jdW1lbnQpIHtcclxuICAgICAgICAgICAgaWYgKCFpc0Rldk1vZGUoKSkge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignQ291bGRuXFwndCB0byBhY2Nlc3MgRG9jdW1lbnQgaW50ZXJmYWNlLiBNYWtlIHN1cmUgdGhpcyBtb2R1bGUgaXMgcnVubmluZyBvbiBhIEJyb3dzZXIgdy8gYWNjZXNzIHRvIERvY3VtZW50IGludGVyZmFjZS4nKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gU2V0IGRlZmF1bHQgZ2EuanMgdXJpXHJcbiAgICAgICAgc2V0dGluZ3MudXJpID0gc2V0dGluZ3MudXJpIHx8IGBodHRwczovL3d3dy5nb29nbGV0YWdtYW5hZ2VyLmNvbS9ndGFnL2pzP2lkPSR7c2V0dGluZ3MuZ2E0VGFnSWR9YDtcclxuXHJcbiAgICAgICAgLy8gdGhlc2UgY29tbWFuZHMgc2hvdWxkIHJ1biBmaXJzdCFcclxuICAgICAgICBzZXR0aW5ncy5pbml0Q29tbWFuZHMgPSBzZXR0aW5ncz8uaW5pdENvbW1hbmRzID8/IFtdO1xyXG5cclxuICAgICAgICAvLyBhc3NlcnQgY29uZmlnIGNvbW1hbmRcclxuICAgICAgICBpZiAoIXNldHRpbmdzLmluaXRDb21tYW5kcy5maW5kKHggPT4geC5jb21tYW5kID09PSAnY29uZmlnJykpIHtcclxuICAgICAgICAgICAgc2V0dGluZ3MuaW5pdENvbW1hbmRzLnVuc2hpZnQoe2NvbW1hbmQ6ICdjb25maWcnLCB2YWx1ZXM6IFtzZXR0aW5ncy5nYTRUYWdJZF19KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIGFzc2VydCBqcyBjb21tYW5kXHJcbiAgICAgICAgaWYgKCFzZXR0aW5ncy5pbml0Q29tbWFuZHMuZmluZCh4ID0+IHguY29tbWFuZCA9PT0gJ2pzJykpIHtcclxuICAgICAgICAgICAgc2V0dGluZ3MuaW5pdENvbW1hbmRzLnVuc2hpZnQoe2NvbW1hbmQ6ICdqcycsIHZhbHVlczogW25ldyBEYXRlKCldfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmb3IgKGNvbnN0IGNvbW1hbmQgb2Ygc2V0dGluZ3MuaW5pdENvbW1hbmRzKSB7XHJcbiAgICAgICAgICAgIGd0YWcoY29tbWFuZC5jb21tYW5kLCAuLi5jb21tYW5kLnZhbHVlcyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBzOiBIVE1MU2NyaXB0RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpO1xyXG4gICAgICAgIHMuYXN5bmMgPSB0cnVlO1xyXG4gICAgICAgIHMuc3JjID0gc2V0dGluZ3MudXJpO1xyXG5cclxuICAgICAgICBpZiAoc2V0dGluZ3Mubm9uY2UpIHtcclxuICAgICAgICAgICAgcy5zZXRBdHRyaWJ1dGUoJ25vbmNlJywgc2V0dGluZ3Mubm9uY2UpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgaGVhZDogSFRNTEhlYWRFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2hlYWQnKVswXTtcclxuICAgICAgICBoZWFkLmFwcGVuZENoaWxkKHMpO1xyXG4gICAgfTtcclxufVxyXG4iXX0=