New Case Study:See how Anthropic automated 95% of dependency reviews with Socket.Learn More
Socket
Sign inDemoInstall
Socket

@analytics/google-analytics

Package Overview
Dependencies
Maintainers
1
Versions
18
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@analytics/google-analytics - npm Package Compare versions

Comparing version 0.5.3 to 1.0.1

15

CHANGELOG.md

@@ -6,2 +6,17 @@ # Change Log

## [1.0.1](https://github.com/DavidWells/analytics/compare/@analytics/google-analytics@0.5.3...@analytics/google-analytics@1.0.1) (2022-07-21)
**Note:** Version bump only for package @analytics/google-analytics
## [1.0.0] (2022-06-15)
BREAKING CHANGE. The package has swapped from using google analytics v.3 to the newer product of google analytics v4.
To continue using google analytics v3, use the `@analytics/google-analytics-v3` package. All future updates here will be for the completely different product from google called "google analytics v4".
## [0.5.3](https://github.com/DavidWells/analytics/compare/@analytics/google-analytics@0.5.2...@analytics/google-analytics@0.5.3) (2021-05-30)

@@ -8,0 +23,0 @@

630

dist/@analytics/google-analytics.js
var analyticsGa = (function (exports) {
'use strict';
// googleAnalytics events from a node server environment.
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
function _defineProperty(obj, key, value) {
if (key in obj) {
Object.defineProperty(obj, key, {
value: value,
enumerable: true,
configurable: true,
writable: true
});
} else {
obj[key] = value;
}
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
return obj;
}
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
function _objectSpread(target) {
for (var i = 1; i < arguments.length; i++) {
var source = arguments[i] != null ? arguments[i] : {};
var ownKeys = Object.keys(source);
/* global, window */
var loadedInstances = {};
/* Location of gtag script */
if (typeof Object.getOwnPropertySymbols === 'function') {
ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) {
return Object.getOwnPropertyDescriptor(source, sym).enumerable;
}));
}
var gtagScriptSource = 'https://www.googletagmanager.com/gtag/js'; // See https://developers.google.com/analytics/devguides/collection/ga4/reference/config
ownKeys.forEach(function (key) {
_defineProperty(target, key, source[key]);
});
}
var defaultGtagConf = {
// https://support.google.com/analytics/answer/7201382?hl=en#zippy=%2Cglobal-site-tag-websites
debug_mode: false,
return target;
}
/**
* Disable automatic sending of page views, instead let analytics.page() do this
* https://developers.google.com/analytics/devguides/collection/gtagjs
*/
send_page_view: false,
// https://developers.google.com/analytics/devguides/collection/gtagjs/ip-anonymization
anonymize_ip: false,
/* global ga */
var defaultConfig = {
/* See description below */
trackingId: null,
/**
* Disable All Advertising
* https://developers.google.com/analytics/devguides/collection/ga4/display-features#disable_all_advertising_features
*/
allow_google_signals: true,
/* See description below */
debug: false,
/**
* Disable Advertising Personalization
* https://developers.google.com/analytics/devguides/collection/ga4/display-features#disable_advertising_personalization
*/
allow_ad_personalization_signals: true,
/* See description below */
anonymizeIp: false,
/**
* https://developers.google.com/analytics/devguides/collection/gtagjs/cookies-user-id#configure_cookie_field_settings
*/
// cookie_domain: 'auto',
// cookie_expires
// cookie_prefix
// cookie_update
// cookie_flags
/* See description below */
customDimensions: {},
/* See description below */
resetCustomDimensionsOnPage: [],
/* See description below */
setCustomDimensionsToPage: true
/* Custom metrics https://bit.ly/3c5de88 */
// TODO customMetrics: { key: 'metric1' }
/* Content groupings https://bit.ly/39Zt3Me */
// TODO contentGroupings: { key: 'contentGroup1' }
/**
* Cookie Flags
* https://developers.google.com/analytics/devguides/collection/ga4/cookies-user-id#cookie_flags
*/
cookie_flags: ''
};
var loadedInstances = {};
var defaultConfig = {
gtagName: 'gtag',
dataLayerName: 'ga4DataLayer',
measurementIds: [],
gtagConfig: defaultGtagConf
};
/**

@@ -73,12 +67,13 @@ * Google analytics plugin

* @param {object} pluginConfig - Plugin settings
* @param {string} pluginConfig.trackingId - Google Analytics site tracking Id
* @param {string|array} pluginConfig.measurementIds - Google Analytics MEASUREMENT IDs
* @param {boolean} [pluginConfig.debug] - Enable Google Analytics debug mode
* @param {boolean} [pluginConfig.anonymizeIp] - Enable [Anonymizing IP addresses](https://bit.ly/3c660Rd) sent to Google Analytics. [See details below](#anonymize-visitor-ips)
* @param {object} [pluginConfig.customDimensions] - Map [Custom dimensions](https://bit.ly/3c5de88) to send extra information to Google Analytics. [See details below](#using-ga-custom-dimensions)
* @param {object} [pluginConfig.resetCustomDimensionsOnPage] - Reset custom dimensions by key on analytics.page() calls. Useful for single page apps.
* @param {boolean} [pluginConfig.setCustomDimensionsToPage] - Mapped dimensions will be set to the page & sent as properties of all subsequent events on that page. If false, analytics will only pass custom dimensions as part of individual events
* @param {string} [pluginConfig.instanceName] - Custom tracker name for google analytics. Use this if you need multiple googleAnalytics scripts loaded
* @param {string} [pluginConfig.dataLayerName=ga4DataLayer] - The optional name for dataLayer object. Defaults to ga4DataLayer.
* @param {string} [pluginConfig.gtagName=gtag] - The optional name for dataLayer object. Defaults to ga4DataLayer.
* @param {boolean} [pluginConfig.gtagConfig.anonymize_ip] - Enable [Anonymizing IP addresses](https://bit.ly/3c660Rd) sent to Google Analytics. [See details below](#anonymize-visitor-ips)
* @param {object} [pluginConfig.gtagConfig.cookie_domain] - Additional cookie properties for configuring the [ga cookie](https://developers.google.com/analytics/devguides/collection/analyticsjs/cookies-user-id#configuring_cookie_field_settings)
* @param {object} [pluginConfig.gtagConfig.cookie_expires] - Additional cookie properties for configuring the [ga cookie](https://developers.google.com/analytics/devguides/collection/analyticsjs/cookies-user-id#configuring_cookie_field_settings)
* @param {object} [pluginConfig.gtagConfig.cookie_prefix] - Additional cookie properties for configuring the [ga cookie](https://developers.google.com/analytics/devguides/collection/analyticsjs/cookies-user-id#configuring_cookie_field_settings)
* @param {object} [pluginConfig.gtagConfig.cookie_update] - Additional cookie properties for configuring the [ga cookie](https://developers.google.com/analytics/devguides/collection/analyticsjs/cookies-user-id#configuring_cookie_field_settings)
* @param {object} [pluginConfig.gtagConfig.cookie_flags] - Additional cookie properties for configuring the [ga cookie](https://developers.google.com/analytics/devguides/collection/analyticsjs/cookies-user-id#configuring_cookie_field_settings)
* @param {string} [pluginConfig.customScriptSrc] - Custom URL for google analytics script, if proxying calls
* @param {object} [pluginConfig.cookieConfig] - Additional cookie properties for configuring the [ga cookie](https://developers.google.com/analytics/devguides/collection/analyticsjs/cookies-user-id#configuring_cookie_field_settings)
* @param {object} [pluginConfig.tasks] - [Set custom google analytic tasks](https://developers.google.com/analytics/devguides/collection/analyticsjs/tasks)
* @return {*}

@@ -88,269 +83,233 @@ * @example

* googleAnalytics({
* trackingId: 'UA-1234567'
* measurementIds: ['UA-1234567']
* })
*/
function googleAnalytics$1() {
function googleAnalytics() {
var pluginConfig = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
var pageCalledOnce = false; // Allow for multiple google analytics instances
var pageCallCount = 0;
var measurementIds = getIds(pluginConfig.measurementIds);
var _getInstanceDetails = getInstanceDetails(pluginConfig),
instanceName = _getInstanceDetails.instanceName,
instancePrefix = _getInstanceDetails.instancePrefix;
var initConfig = _objectSpread(_objectSpread({}, defaultConfig), pluginConfig);
return {
name: 'google-analytics',
config: _objectSpread({}, defaultConfig, pluginConfig),
// Load google analytics
initialize: function initialize(pluginApi) {
var config = pluginApi.config,
instance = pluginApi.instance;
if (!config.trackingId) throw new Error('No GA trackingId defined');
var customDimensions = config.customDimensions,
customScriptSrc = config.customScriptSrc; // var to hoist
config: initConfig,
// Load gtag.js and define gtag
initialize: function initialize(_ref) {
var config = _ref.config,
instance = _ref.instance;
var dataLayerName = config.dataLayerName,
customScriptSrc = config.customScriptSrc,
gtagName = config.gtagName,
gtagConfig = config.gtagConfig,
debug = config.debug;
/* Inject google gtag.js script if not found */
var scriptSrc = customScriptSrc || 'https://www.google-analytics.com/analytics.js'; // Load google analytics script to page
if (!scriptLoaded(customScriptSrc || gtagScriptSource)) {
var customLayerName = dataLayerName ? "&l=".concat(dataLayerName) : '';
var script = document.createElement('script');
script.async = true;
script.src = customScriptSrc || "".concat(gtagScriptSource, "?id=").concat(measurementIds[0]).concat(customLayerName);
document.body.appendChild(script);
}
/* Set gtag and datalayer */
if (gaNotLoaded(scriptSrc)) {
/* eslint-disable */
(function (i, s, o, g, r, a, m) {
i['GoogleAnalyticsObject'] = r;
i[r] = i[r] || function () {
(i[r].q = i[r].q || []).push(arguments);
}, i[r].l = 1 * new Date();
a = s.createElement(o), m = s.getElementsByTagName(o)[0];
a.async = 1;
a.src = g;
m.parentNode.insertBefore(a, m);
})(window, document, 'script', scriptSrc, 'ga');
/* eslint-enable */
} // Initialize tracker instance on page
if (!window[dataLayerName]) {
window[dataLayerName] = window[dataLayerName] || [];
window[gtagName] = function () {
window[dataLayerName].push(arguments);
};
if (!loadedInstances[instanceName]) {
var gaConfig = _objectSpread({
cookieDomain: config.domain || 'auto',
siteSpeedSampleRate: config.siteSpeedSampleRate || 1,
sampleRate: config.sampleRate || 100,
allowLinker: true
}, config.cookieConfig);
window[gtagName]('js', new Date());
} // Initialize tracker instances on page
if (instanceName) {
gaConfig.name = instanceName;
}
ga('create', config.trackingId, gaConfig);
var gtagConf = _objectSpread(_objectSpread(_objectSpread({}, defaultGtagConf), gtagConfig ? gtagConfig : {}), debug ? {
debug_mode: true
} : {});
/* set custom dimensions from user traits */
if (config.debug) {
// Disable sends to GA http://bit.ly/2Ro0vTR
ga("".concat(instancePrefix, "set"), 'sendHitTask', null);
window.ga_debug = {
trace: true
};
}
if (config.anonymizeIp) {
ga("".concat(instancePrefix, "set"), 'anonymizeIp', true);
}
var user = instance.user() || {};
var traits = user.traits || {};
if (config.tasks) {
var taskList = ['customTask', 'previewTask', 'checkProtocolTask', 'validationTask', 'checkStorageTask', 'historyImportTask', 'samplerTask', 'buildHitTask', 'sendHitTask', 'timingTask', 'displayFeaturesTask'];
taskList.forEach(function (taskName) {
if (config.tasks.hasOwnProperty(taskName)) {
var task = config.tasks[taskName];
if (Object.keys(traits).length) {
window[gtagName]('set', 'user_properties', traits);
}
/* Initialize all measurementIds */
if (typeof task === 'function') {
ga(config.tasks[taskName]);
} else if (task === null) {
ga("".concat(instancePrefix, "set"), taskName, task);
}
}
});
for (var i = 0; i < measurementIds.length; i++) {
if (!loadedInstances[measurementIds[i]]) {
window[gtagName]('config', measurementIds[i], gtagConf);
loadedInstances[measurementIds[i]] = true;
}
/* set custom dimensions from user traits */
}
},
// Set parameter scope at user level with 'set' method
identify: function identify(_ref2) {
var payload = _ref2.payload,
config = _ref2.config;
var gtagName = config.gtagName;
if (!window[gtagName] || !measurementIds.length) return;
if (payload.userId) {
// https://developers.google.com/analytics/devguides/collection/ga4/user-id?platform=websites#send_user_ids
window[gtagName]('set', {
user_id: payload.userId
}); // console.log('Set userid', payload.userId)
} // TODO verify this
// https://developers.google.com/analytics/devguides/collection/ga4/user-properties?technology=websites
var user = instance.user() || {};
var traits = user.traits || {};
if (Object.keys(traits).length && customDimensions && Object.keys(customDimensions).length) {
var dimensions = formatObjectIntoDimensions$1(traits, config);
ga("".concat(instancePrefix, "set"), dimensions);
}
loadedInstances[instanceName] = true;
if (Object.keys(payload.traits).length) {
/* gtag('set', 'user_properties', {
favorite_composer: 'Mahler',
favorite_instrument: 'double bass',
season_ticketholder: 'true'
}) */
window[gtagName]('set', 'user_properties', payload.traits); // console.log('Set userprops', payload.traits)
}
},
// Google Analytics page view
page: function page(_ref) {
var payload = _ref.payload,
config = _ref.config,
instance = _ref.instance;
// Set parameter scope at page level with 'config' method
page: function page(_ref3) {
var payload = _ref3.payload,
config = _ref3.config,
instance = _ref3.instance;
var gtagName = config.gtagName,
gtagConfig = config.gtagConfig;
if (!window[gtagName] || !measurementIds.length) return;
var properties = payload.properties;
var resetCustomDimensionsOnPage = config.resetCustomDimensionsOnPage,
customDimensions = config.customDimensions;
var campaign = instance.getState('context.campaign');
if (gaNotLoaded()) return;
/* If dimensions are specifiied to reset, clear them before page view */
var send_to = properties.send_to;
var campaign = instance.getState('context.campaign'); // console.log('ga page properties', properties)
if (resetCustomDimensionsOnPage && resetCustomDimensionsOnPage.length) {
var resetDimensions = resetCustomDimensionsOnPage.reduce(function (acc, key) {
if (customDimensions[key]) {
acc[customDimensions[key]] = null; // { dimension1: null } etc
}
/* Create pageview-related properties */
return acc;
}, {});
if (Object.keys(resetDimensions).length) {
// Reset custom dimensions
ga("".concat(instancePrefix, "set"), resetDimensions);
}
}
var path = properties.path || document.location.pathname;
var pageView = {
page: path,
title: properties.title,
location: properties.url
page_title: properties.title,
page_location: properties.url,
page_path: properties.path || document.location.pathname,
page_hash: properties.hash,
page_search: properties.page_search,
page_referrer: properties.referrer
};
var pageData = {
page: path,
title: properties.title // allow referrer override if referrer was manually set
var campaignData = addCampaignData(campaign);
};
var finalPayload = _objectSpread(_objectSpread(_objectSpread({}, send_to ? {
send_to: send_to
} : {}), pageView), campaignData);
/* If send_page_view true, ignore first analytics.page call */
if (properties.referrer !== document.referrer) {
pageData.referrer = properties.referrer;
}
var campaignData = addCampaignData(campaign);
var dimensions = setCustomDimensions(properties, config, instancePrefix);
/* Dimensions will only be included in the event if config.setCustomDimensionsToPage is false */
if (gtagConfig && gtagConfig.send_page_view && pageCallCount === 0) {
pageCallCount++; // console.log('ignore first pageCallCount', pageCallCount)
var finalPayload = _objectSpread({}, pageView, campaignData, dimensions);
return;
} // console.log('Send page_view payload', finalPayload)
ga("".concat(instancePrefix, "set"), pageData); // Remove location for SPA tracking after initial page view
if (pageCalledOnce) {
delete finalPayload.location;
}
/* send page view to GA */
window[gtagName]('event', 'page_view', finalPayload); // Set after initial page view
ga("".concat(instancePrefix, "send"), 'pageview', finalPayload); // Set after initial page view
pageCalledOnce = true;
pageCallCount++;
},
/**
* Google Analytics track event
* @example
*
* analytics.track('playedVideo', {
* category: 'Videos',
* label: 'Fall Campaign',
* value: 42
* })
*/
track: function track(_ref2) {
var payload = _ref2.payload,
config = _ref2.config,
instance = _ref2.instance;
// Set parameter scope at event level with 'event' method
track: function track(_ref4) {
var payload = _ref4.payload,
config = _ref4.config,
instance = _ref4.instance;
var properties = payload.properties,
event = payload.event;
var label = properties.label,
value = properties.value,
category = properties.category,
nonInteraction = properties.nonInteraction;
var campaign = instance.getState('context.campaign'); // TODO inline this trackEvent
var campaign = instance.getState('context.campaign');
var gtagName = config.gtagName;
if (!window[gtagName] || !measurementIds.length) return;
/* Attach campaign data */
trackEvent$1({
hitType: 'event',
event: event,
label: label,
category: category || 'All',
value: value,
nonInteraction: nonInteraction,
campaign: campaign
}, config, payload);
var campaignData = addCampaignData(campaign); // Limits https://support.google.com/analytics/answer/9267744
var finalPayload = _objectSpread(_objectSpread({}, properties), campaignData);
/*
console.log('finalPayload', finalPayload)
console.log('event', event)
*/
/* Send data to Google Analytics
Signature gtag('event', '<event_name>', {
<event_params>key: value,
})
*/
window[gtagName]('event', event, finalPayload);
},
identify: function identify(_ref3) {
var payload = _ref3.payload,
config = _ref3.config;
identifyVisitor$1(payload.userId, payload.traits, config);
/* Verify gtag loaded and ready to use */
loaded: function loaded(_ref5) {
var config = _ref5.config;
var dataLayerName = config.dataLayerName,
customScriptSrc = config.customScriptSrc;
var hasDataLayer = dataLayerName && window[dataLayerName] && Array.prototype.push === window[dataLayerName].push;
return scriptLoaded(customScriptSrc || gtagScriptSource) && hasDataLayer;
},
loaded: function loaded() {
return !!window.gaplugins;
}
};
}
function gaNotLoaded(scriptSrc) {
if (scriptSrc) {
return !scriptLoaded(scriptSrc);
}
/* Custom methods */
methods: {
addTag: function addTag(tagId) {
var settings = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
return typeof ga === 'undefined';
}
// https://developers.google.com/tag-platform/devguides/install-gtagjs#add_products_to_your_tag
if (window[initConfig.gtagName]) {
window[initConfig.gtagName]('config', tagId, settings); // Add tag id
function getInstanceDetails(pluginConfig) {
var instanceName = pluginConfig.instanceName;
return {
instancePrefix: instanceName ? "".concat(instanceName, ".") : '',
instanceName: instanceName
};
}
/**
* Send event tracking to Google Analytics
* @param {object} eventData - GA event payload
* @param {string} [eventData.hitType = 'event'] - hitType https://bit.ly/2Jab9L1 one of 'pageview', 'screenview', 'event', 'transaction', 'item', 'social', 'exception', 'timing'
* @param {string} [eventData.event] - event Action https://bit.ly/2CUzeoz
* @param {string} [eventData.label] - event Label http://bit.ly/2oo8eb3
* @param {string} [eventData.category] - event Category http://bit.ly/2EAy9UP
* @param {string} [eventData.nonInteraction = false] - nonInteraction https://bit.ly/2CUzeoz
* @return {object} sent data
*/
if (measurementIds && !measurementIds.includes(tagId)) {
measurementIds = measurementIds.concat(tagId);
}
}
},
/* Disable gtag for user */
disable: function disable(ids) {
var gaIds = ids ? getIds(ids) : measurementIds;
function trackEvent$1(eventData) {
var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
var payload = arguments.length > 2 ? arguments[2] : undefined;
if (gaNotLoaded()) return;
for (var i = 0; i < measurementIds.length; i++) {
var gaId = measurementIds[i];
var _getInstanceDetails2 = getInstanceDetails(opts),
instancePrefix = _getInstanceDetails2.instancePrefix;
if (gaIds.includes(gaId)) {
// https://developers.google.com/analytics/devguides/collection/gtagjs/user-opt-out
window["ga-disable-".concat(gaId)] = true;
}
}
},
var data = {
// hitType https://bit.ly/2Jab9L1 one of 'pageview', 'screenview', 'event', 'transaction', 'item', 'social', 'exception', 'timing'
hitType: eventData.hitType || 'event',
// eventAction https://bit.ly/2CUzeoz
eventAction: eventData.event,
// eventLabel http://bit.ly/2oo8eb3
eventLabel: eventData.label,
// eventCategory http://bit.ly/2EAy9UP
eventCategory: eventData.category || 'All',
// nonInteraction https://bit.ly/2CUzeoz
nonInteraction: eventData.nonInteraction !== undefined ? !!eventData.nonInteraction : false
};
/* Enable gtag for user */
enable: function enable(ids) {
var gaIds = ids ? getIds(ids) : measurementIds;
if (eventData.value) {
// how much is this action worth?
data.eventValue = format(eventData.value);
}
/* Attach campaign data */
for (var i = 0; i < measurementIds.length; i++) {
var gaId = measurementIds[i];
if (gaIds.includes(gaId)) {
// https://developers.google.com/analytics/devguides/collection/gtagjs/user-opt-out
window["ga-disable-".concat(gaId)] = false;
}
}
}
}
};
}
var campaignData = addCampaignData(eventData);
/* Set Dimensions or return them for payload is config.setCustomDimensionsToPage is false */
function getIds(measurementIds) {
if (!measurementIds) throw new Error('No GA Measurement ID defined');
var dimensions = setCustomDimensions(payload.properties, opts, instancePrefix);
if (Array.isArray(measurementIds)) {
return measurementIds;
}
var finalPayload = _objectSpread({}, data, campaignData, dimensions);
/* Send data to Google Analytics */
if (typeof measurementIds === 'string') {
return [measurementIds];
}
ga("".concat(instancePrefix, "send"), 'event', finalPayload);
return finalPayload;
throw new Error('GA Measurement ID must be string or array of strings');
}

@@ -367,6 +326,8 @@ /**

function addCampaignData() {
var campaignData = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
var campaign = {};
var name = campaignData.name,
var id = campaignData.id,
name = campaignData.name,
source = campaignData.source,

@@ -376,2 +337,3 @@ medium = campaignData.medium,

keyword = campaignData.keyword;
if (id) campaign.campaignId = id;
if (name) campaign.campaignName = name;

@@ -384,129 +346,25 @@ if (source) campaign.campaignSource = source;

}
/* Todo add includeSearch options ¯\_(ツ)_/¯
function getPagePath(props, opts = {}) {
if (!props) return
if (opts.includeSearch && props.search) {
return `${props.path}${props.search}`
}
return props.path
}
*/
// properties, data=opts
function formatObjectIntoDimensions$1(properties) {
var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
var customDimensions = opts.customDimensions; // TODO map opts.customMetrics; Object.keys(customMetrics) { key: 'metric1' }
// TODO map opts.contentGroupings; Object.keys(contentGroupings) { key: 'contentGroup1' }
/* Map values from payload to any defined custom dimensions */
return Object.keys(customDimensions).reduce(function (acc, key) {
var dimensionKey = customDimensions[key];
var value = get$1(properties, key) || properties[key];
if (typeof value === 'boolean') {
value = value.toString();
}
if (value || value === 0) {
acc[dimensionKey] = value;
return acc;
}
return acc;
}, {});
}
function get$1(obj, key, def, p, undef) {
key = key.split ? key.split('.') : key;
for (p = 0; p < key.length; p++) {
obj = obj ? obj[key[p]] : undef;
}
return obj === undef ? def : obj;
}
function setCustomDimensions() {
var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
var opts = arguments.length > 1 ? arguments[1] : undefined;
var instancePrefix = arguments.length > 2 ? arguments[2] : undefined;
var customDimensions = formatObjectIntoDimensions$1(props, opts);
if (!Object.keys(customDimensions).length) {
return {};
} // If setCustomDimensionsToPage false, don't save custom dimensions from event to page
if (!opts.setCustomDimensionsToPage) {
return customDimensions;
} // Set custom dimensions
ga("".concat(instancePrefix, "set"), customDimensions);
return {};
}
/**
* Identify a visitor by Id
* @param {string} id - unique visitor ID
*/
function identifyVisitor$1(id) {
var traits = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
var conf = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
if (gaNotLoaded()) return;
var _getInstanceDetails3 = getInstanceDetails(conf),
instancePrefix = _getInstanceDetails3.instancePrefix;
if (id) ga("".concat(instancePrefix, "set"), 'userId', id);
if (Object.keys(traits).length) {
var custom = formatObjectIntoDimensions$1(traits, conf);
ga("".concat(instancePrefix, "set"), custom);
}
}
function scriptLoaded(scriptSrc) {
var scripts = document.querySelectorAll('script[src]');
return !!Object.keys(scripts).filter(function (key) {
return (scripts[key].src || '') === scriptSrc;
}).length;
var regex = new RegExp("^".concat(scriptSrc));
return Boolean(Object.values(scripts).filter(function (value) {
return regex.test(value.src);
}).length);
}
function format(value) {
if (!value || value < 0) return 0;
return Math.round(value);
}
var browser = /*#__PURE__*/Object.freeze({
default: googleAnalytics$1,
trackEvent: trackEvent$1,
identifyVisitor: identifyVisitor$1
});
/* This module will shake out unused code + work in browser and node 🎉 */
var index = googleAnalytics$1;
var index = googleAnalytics ;
/* init for CDN usage. globalName.init() */
var init = googleAnalytics$1;
/* Standalone API */
var init = googleAnalytics ;
var initialize$1 = undefined;
var page = undefined;
var track = trackEvent$1;
var identify = identifyVisitor$1;
exports.default = index;
exports["default"] = index;
exports.init = init;
exports.identify = identify;
exports.track = track;
exports.page = page;
exports.initialize = initialize$1;
Object.defineProperty(exports, '__esModule', { value: true });
return exports;
}({}));
})({});

@@ -1,1 +0,1 @@

var analyticsGa=function(e){"use strict";function t(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function n(e){for(var n=1;n<arguments.length;n++){var a=null!=arguments[n]?arguments[n]:{},i=Object.keys(a);"function"==typeof Object.getOwnPropertySymbols&&(i=i.concat(Object.getOwnPropertySymbols(a).filter(function(e){return Object.getOwnPropertyDescriptor(a,e).enumerable}))),i.forEach(function(n){t(e,n,a[n])})}return e}var a={trackingId:null,debug:!1,anonymizeIp:!1,customDimensions:{},resetCustomDimensionsOnPage:[],setCustomDimensionsToPage:!0},i={};function o(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=!1,o=c(e),d=o.instanceName,m=o.instancePrefix;return{name:"google-analytics",config:n({},a,e),initialize:function(e){var t=e.config,a=e.instance;if(!t.trackingId)throw new Error("No GA trackingId defined");var o,c,s,l,g,f,v,p=t.customDimensions,y=t.customScriptSrc||"https://www.google-analytics.com/analytics.js";if(r(y)&&(o=window,c=document,s="script",l=y,g="ga",o.GoogleAnalyticsObject=g,o.ga=o.ga||function(){(o.ga.q=o.ga.q||[]).push(arguments)},o.ga.l=1*new Date,f=c.createElement(s),v=c.getElementsByTagName(s)[0],f.async=1,f.src=l,v.parentNode.insertBefore(f,v)),!i[d]){var k=n({cookieDomain:t.domain||"auto",siteSpeedSampleRate:t.siteSpeedSampleRate||1,sampleRate:t.sampleRate||100,allowLinker:!0},t.cookieConfig);if(d&&(k.name=d),ga("create",t.trackingId,k),t.debug&&(ga("".concat(m,"set"),"sendHitTask",null),window.ga_debug={trace:!0}),t.anonymizeIp&&ga("".concat(m,"set"),"anonymizeIp",!0),t.tasks){["customTask","previewTask","checkProtocolTask","validationTask","checkStorageTask","historyImportTask","samplerTask","buildHitTask","sendHitTask","timingTask","displayFeaturesTask"].forEach(function(e){if(t.tasks.hasOwnProperty(e)){var n=t.tasks[e];"function"==typeof n?ga(t.tasks[e]):null===n&&ga("".concat(m,"set"),e,n)}})}var h=(a.user()||{}).traits||{};if(Object.keys(h).length&&p&&Object.keys(p).length){var b=u(h,t);ga("".concat(m,"set"),b)}i[d]=!0}},page:function(e){var a=e.payload,i=e.config,o=e.instance,c=a.properties,s=i.resetCustomDimensionsOnPage,u=i.customDimensions,f=o.getState("context.campaign");if(!r()){if(s&&s.length){var d=s.reduce(function(e,t){return u[t]&&(e[u[t]]=null),e},{});Object.keys(d).length&&ga("".concat(m,"set"),d)}var v=c.path||document.location.pathname,p={page:v,title:c.title,location:c.url},y={page:v,title:c.title};c.referrer!==document.referrer&&(y.referrer=c.referrer);var k=n({},p,l(f),g(c,i,m));ga("".concat(m,"set"),y),t&&delete k.location,ga("".concat(m,"send"),"pageview",k),t=!0}},track:function(e){var t=e.payload,n=e.config,a=e.instance,i=t.properties,o=t.event,r=i.label,c=i.value;s({hitType:"event",event:o,label:r,category:i.category||"All",value:c,nonInteraction:i.nonInteraction,campaign:a.getState("context.campaign")},n,t)},identify:function(e){var t=e.payload,n=e.config;f(t.userId,t.traits,n)},loaded:function(){return!!window.gaplugins}}}function r(e){return e?!function(e){var t=document.querySelectorAll("script[src]");return!!Object.keys(t).filter(function(n){return(t[n].src||"")===e}).length}(e):"undefined"==typeof ga}function c(e){var t=e.instanceName;return{instancePrefix:t?"".concat(t,"."):"",instanceName:t}}function s(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},a=arguments.length>2?arguments[2]:void 0;if(!r()){var i,o=c(t).instancePrefix,s={hitType:e.hitType||"event",eventAction:e.event,eventLabel:e.label,eventCategory:e.category||"All",nonInteraction:void 0!==e.nonInteraction&&!!e.nonInteraction};e.value&&(s.eventValue=!(i=e.value)||i<0?0:Math.round(i));var u=n({},s,l(e),g(a.properties,t,o));return ga("".concat(o,"send"),"event",u),u}}function l(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t={},n=e.name,a=e.source,i=e.medium,o=e.content,r=e.keyword;return n&&(t.campaignName=n),a&&(t.campaignSource=a),i&&(t.campaignMedium=i),o&&(t.campaignContent=o),r&&(t.campaignKeyword=r),t}function u(e){var t=(arguments.length>1&&void 0!==arguments[1]?arguments[1]:{}).customDimensions;return Object.keys(t).reduce(function(n,a){var i=t[a],o=function(e,t,n,a,i){for(t=t.split?t.split("."):t,a=0;a<t.length;a++)e=e?e[t[a]]:i;return e===i?n:e}(e,a)||e[a];return"boolean"==typeof o&&(o=o.toString()),o||0===o?(n[i]=o,n):n},{})}function g(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=arguments.length>1?arguments[1]:void 0,n=arguments.length>2?arguments[2]:void 0,a=u(e,t);return Object.keys(a).length?t.setCustomDimensionsToPage?(ga("".concat(n,"set"),a),{}):a:{}}function f(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};if(!r()){var a=c(n).instancePrefix;if(e&&ga("".concat(a,"set"),"userId",e),Object.keys(t).length){var i=u(t,n);ga("".concat(a,"set"),i)}}}var d=o,m=o,v=s,p=f;return e.default=d,e.init=m,e.identify=p,e.track=v,e.page=void 0,e.initialize=void 0,e}({});
var analyticsGa=function(e){"use strict";function t(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);t&&(a=a.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,a)}return n}function n(e){for(var n=1;n<arguments.length;n++){var r=null!=arguments[n]?arguments[n]:{};n%2?t(Object(r),!0).forEach((function(t){a(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):t(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var r={},o="https://www.googletagmanager.com/gtag/js",i={debug_mode:!1,send_page_view:!1,anonymize_ip:!1,allow_google_signals:!0,allow_ad_personalization_signals:!0,cookie_flags:""},c={gtagName:"gtag",dataLayerName:"ga4DataLayer",measurementIds:[],gtagConfig:i};function g(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=0,a=s(e.measurementIds),g=n(n({},c),e);return{name:"google-analytics",config:g,initialize:function(e){var t=e.config,c=e.instance,g=t.dataLayerName,s=t.customScriptSrc,d=t.gtagName,l=t.gtagConfig,p=t.debug;if(!u(s||o)){var w=g?"&l=".concat(g):"",f=document.createElement("script");f.async=!0,f.src=s||"".concat(o,"?id=").concat(a[0]).concat(w),document.body.appendChild(f)}window[g]||(window[g]=window[g]||[],window[d]=function(){window[g].push(arguments)},window[d]("js",new Date));var m=n(n(n({},i),l||{}),p?{debug_mode:!0}:{}),v=(c.user()||{}).traits||{};Object.keys(v).length&&window[d]("set","user_properties",v);for(var y=0;y<a.length;y++)r[a[y]]||(window[d]("config",a[y],m),r[a[y]]=!0)},identify:function(e){var t=e.payload,n=e.config.gtagName;window[n]&&a.length&&(t.userId&&window[n]("set",{user_id:t.userId}),Object.keys(t.traits).length&&window[n]("set","user_properties",t.traits))},page:function(e){var r=e.payload,o=e.config,i=e.instance,c=o.gtagName,g=o.gtagConfig;if(window[c]&&a.length){var s=r.properties,u=s.send_to,l=i.getState("context.campaign"),p={page_title:s.title,page_location:s.url,page_path:s.path||document.location.pathname,page_hash:s.hash,page_search:s.page_search,page_referrer:s.referrer},w=d(l),f=n(n(n({},u?{send_to:u}:{}),p),w);g&&g.send_page_view&&0===t||window[c]("event","page_view",f),t++}},track:function(e){var t=e.payload,r=e.config,o=e.instance,i=t.properties,c=t.event,g=o.getState("context.campaign"),s=r.gtagName;if(window[s]&&a.length){var u=d(g),l=n(n({},i),u);window[s]("event",c,l)}},loaded:function(e){var t=e.config,n=t.dataLayerName,a=t.customScriptSrc,r=n&&window[n]&&Array.prototype.push===window[n].push;return u(a||o)&&r},methods:{addTag:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};window[g.gtagName]&&(window[g.gtagName]("config",e,t),a&&!a.includes(e)&&(a=a.concat(e)))},disable:function(e){for(var t=e?s(e):a,n=0;n<a.length;n++){var r=a[n];t.includes(r)&&(window["ga-disable-".concat(r)]=!0)}},enable:function(e){for(var t=e?s(e):a,n=0;n<a.length;n++){var r=a[n];t.includes(r)&&(window["ga-disable-".concat(r)]=!1)}}}}}function s(e){if(!e)throw new Error("No GA Measurement ID defined");if(Array.isArray(e))return e;if("string"==typeof e)return[e];throw new Error("GA Measurement ID must be string or array of strings")}function d(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t={},n=e.id,a=e.name,r=e.source,o=e.medium,i=e.content,c=e.keyword;return n&&(t.campaignId=n),a&&(t.campaignName=a),r&&(t.campaignSource=r),o&&(t.campaignMedium=o),i&&(t.campaignContent=i),c&&(t.campaignKeyword=c),t}function u(e){var t=document.querySelectorAll("script[src]"),n=new RegExp("^".concat(e));return Boolean(Object.values(t).filter((function(e){return n.test(e.src)})).length)}var l=g,p=g;return e.default=l,e.init=p,Object.defineProperty(e,"__esModule",{value:!0}),e}({});

@@ -5,65 +5,59 @@ 'use strict';

// googleAnalytics events from a node server environment.
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
function _defineProperty(obj, key, value) {
if (key in obj) {
Object.defineProperty(obj, key, {
value: value,
enumerable: true,
configurable: true,
writable: true
});
} else {
obj[key] = value;
}
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
return obj;
}
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
function _objectSpread(target) {
for (var i = 1; i < arguments.length; i++) {
var source = arguments[i] != null ? arguments[i] : {};
var ownKeys = Object.keys(source);
/* global, window */
var loadedInstances = {};
/* Location of gtag script */
if (typeof Object.getOwnPropertySymbols === 'function') {
ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) {
return Object.getOwnPropertyDescriptor(source, sym).enumerable;
}));
}
var gtagScriptSource = 'https://www.googletagmanager.com/gtag/js'; // See https://developers.google.com/analytics/devguides/collection/ga4/reference/config
ownKeys.forEach(function (key) {
_defineProperty(target, key, source[key]);
});
}
var defaultGtagConf = {
// https://support.google.com/analytics/answer/7201382?hl=en#zippy=%2Cglobal-site-tag-websites
debug_mode: false,
return target;
}
/**
* Disable automatic sending of page views, instead let analytics.page() do this
* https://developers.google.com/analytics/devguides/collection/gtagjs
*/
send_page_view: false,
// https://developers.google.com/analytics/devguides/collection/gtagjs/ip-anonymization
anonymize_ip: false,
/* global ga */
var defaultConfig = {
/* See description below */
trackingId: null,
/**
* Disable All Advertising
* https://developers.google.com/analytics/devguides/collection/ga4/display-features#disable_all_advertising_features
*/
allow_google_signals: true,
/* See description below */
debug: false,
/**
* Disable Advertising Personalization
* https://developers.google.com/analytics/devguides/collection/ga4/display-features#disable_advertising_personalization
*/
allow_ad_personalization_signals: true,
/* See description below */
anonymizeIp: false,
/**
* https://developers.google.com/analytics/devguides/collection/gtagjs/cookies-user-id#configure_cookie_field_settings
*/
// cookie_domain: 'auto',
// cookie_expires
// cookie_prefix
// cookie_update
// cookie_flags
/* See description below */
customDimensions: {},
/* See description below */
resetCustomDimensionsOnPage: [],
/* See description below */
setCustomDimensionsToPage: true
/* Custom metrics https://bit.ly/3c5de88 */
// TODO customMetrics: { key: 'metric1' }
/* Content groupings https://bit.ly/39Zt3Me */
// TODO contentGroupings: { key: 'contentGroup1' }
/**
* Cookie Flags
* https://developers.google.com/analytics/devguides/collection/ga4/cookies-user-id#cookie_flags
*/
cookie_flags: ''
};
var loadedInstances = {};
var defaultConfig = {
gtagName: 'gtag',
dataLayerName: 'ga4DataLayer',
measurementIds: [],
gtagConfig: defaultGtagConf
};
/**

@@ -75,12 +69,13 @@ * Google analytics plugin

* @param {object} pluginConfig - Plugin settings
* @param {string} pluginConfig.trackingId - Google Analytics site tracking Id
* @param {string|array} pluginConfig.measurementIds - Google Analytics MEASUREMENT IDs
* @param {boolean} [pluginConfig.debug] - Enable Google Analytics debug mode
* @param {boolean} [pluginConfig.anonymizeIp] - Enable [Anonymizing IP addresses](https://bit.ly/3c660Rd) sent to Google Analytics. [See details below](#anonymize-visitor-ips)
* @param {object} [pluginConfig.customDimensions] - Map [Custom dimensions](https://bit.ly/3c5de88) to send extra information to Google Analytics. [See details below](#using-ga-custom-dimensions)
* @param {object} [pluginConfig.resetCustomDimensionsOnPage] - Reset custom dimensions by key on analytics.page() calls. Useful for single page apps.
* @param {boolean} [pluginConfig.setCustomDimensionsToPage] - Mapped dimensions will be set to the page & sent as properties of all subsequent events on that page. If false, analytics will only pass custom dimensions as part of individual events
* @param {string} [pluginConfig.instanceName] - Custom tracker name for google analytics. Use this if you need multiple googleAnalytics scripts loaded
* @param {string} [pluginConfig.dataLayerName=ga4DataLayer] - The optional name for dataLayer object. Defaults to ga4DataLayer.
* @param {string} [pluginConfig.gtagName=gtag] - The optional name for dataLayer object. Defaults to ga4DataLayer.
* @param {boolean} [pluginConfig.gtagConfig.anonymize_ip] - Enable [Anonymizing IP addresses](https://bit.ly/3c660Rd) sent to Google Analytics. [See details below](#anonymize-visitor-ips)
* @param {object} [pluginConfig.gtagConfig.cookie_domain] - Additional cookie properties for configuring the [ga cookie](https://developers.google.com/analytics/devguides/collection/analyticsjs/cookies-user-id#configuring_cookie_field_settings)
* @param {object} [pluginConfig.gtagConfig.cookie_expires] - Additional cookie properties for configuring the [ga cookie](https://developers.google.com/analytics/devguides/collection/analyticsjs/cookies-user-id#configuring_cookie_field_settings)
* @param {object} [pluginConfig.gtagConfig.cookie_prefix] - Additional cookie properties for configuring the [ga cookie](https://developers.google.com/analytics/devguides/collection/analyticsjs/cookies-user-id#configuring_cookie_field_settings)
* @param {object} [pluginConfig.gtagConfig.cookie_update] - Additional cookie properties for configuring the [ga cookie](https://developers.google.com/analytics/devguides/collection/analyticsjs/cookies-user-id#configuring_cookie_field_settings)
* @param {object} [pluginConfig.gtagConfig.cookie_flags] - Additional cookie properties for configuring the [ga cookie](https://developers.google.com/analytics/devguides/collection/analyticsjs/cookies-user-id#configuring_cookie_field_settings)
* @param {string} [pluginConfig.customScriptSrc] - Custom URL for google analytics script, if proxying calls
* @param {object} [pluginConfig.cookieConfig] - Additional cookie properties for configuring the [ga cookie](https://developers.google.com/analytics/devguides/collection/analyticsjs/cookies-user-id#configuring_cookie_field_settings)
* @param {object} [pluginConfig.tasks] - [Set custom google analytic tasks](https://developers.google.com/analytics/devguides/collection/analyticsjs/tasks)
* @return {*}

@@ -90,269 +85,233 @@ * @example

* googleAnalytics({
* trackingId: 'UA-1234567'
* measurementIds: ['UA-1234567']
* })
*/
function googleAnalytics$1() {
function googleAnalytics() {
var pluginConfig = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
var pageCalledOnce = false; // Allow for multiple google analytics instances
var pageCallCount = 0;
var measurementIds = getIds(pluginConfig.measurementIds);
var _getInstanceDetails = getInstanceDetails(pluginConfig),
instanceName = _getInstanceDetails.instanceName,
instancePrefix = _getInstanceDetails.instancePrefix;
var initConfig = _objectSpread(_objectSpread({}, defaultConfig), pluginConfig);
return {
name: 'google-analytics',
config: _objectSpread({}, defaultConfig, pluginConfig),
// Load google analytics
initialize: function initialize(pluginApi) {
var config = pluginApi.config,
instance = pluginApi.instance;
if (!config.trackingId) throw new Error('No GA trackingId defined');
var customDimensions = config.customDimensions,
customScriptSrc = config.customScriptSrc; // var to hoist
config: initConfig,
// Load gtag.js and define gtag
initialize: function initialize(_ref) {
var config = _ref.config,
instance = _ref.instance;
var dataLayerName = config.dataLayerName,
customScriptSrc = config.customScriptSrc,
gtagName = config.gtagName,
gtagConfig = config.gtagConfig,
debug = config.debug;
/* Inject google gtag.js script if not found */
var scriptSrc = customScriptSrc || 'https://www.google-analytics.com/analytics.js'; // Load google analytics script to page
if (!scriptLoaded(customScriptSrc || gtagScriptSource)) {
var customLayerName = dataLayerName ? "&l=".concat(dataLayerName) : '';
var script = document.createElement('script');
script.async = true;
script.src = customScriptSrc || "".concat(gtagScriptSource, "?id=").concat(measurementIds[0]).concat(customLayerName);
document.body.appendChild(script);
}
/* Set gtag and datalayer */
if (gaNotLoaded(scriptSrc)) {
/* eslint-disable */
(function (i, s, o, g, r, a, m) {
i['GoogleAnalyticsObject'] = r;
i[r] = i[r] || function () {
(i[r].q = i[r].q || []).push(arguments);
}, i[r].l = 1 * new Date();
a = s.createElement(o), m = s.getElementsByTagName(o)[0];
a.async = 1;
a.src = g;
m.parentNode.insertBefore(a, m);
})(window, document, 'script', scriptSrc, 'ga');
/* eslint-enable */
} // Initialize tracker instance on page
if (!window[dataLayerName]) {
window[dataLayerName] = window[dataLayerName] || [];
window[gtagName] = function () {
window[dataLayerName].push(arguments);
};
if (!loadedInstances[instanceName]) {
var gaConfig = _objectSpread({
cookieDomain: config.domain || 'auto',
siteSpeedSampleRate: config.siteSpeedSampleRate || 1,
sampleRate: config.sampleRate || 100,
allowLinker: true
}, config.cookieConfig);
window[gtagName]('js', new Date());
} // Initialize tracker instances on page
if (instanceName) {
gaConfig.name = instanceName;
}
ga('create', config.trackingId, gaConfig);
var gtagConf = _objectSpread(_objectSpread(_objectSpread({}, defaultGtagConf), gtagConfig ? gtagConfig : {}), debug ? {
debug_mode: true
} : {});
/* set custom dimensions from user traits */
if (config.debug) {
// Disable sends to GA http://bit.ly/2Ro0vTR
ga("".concat(instancePrefix, "set"), 'sendHitTask', null);
window.ga_debug = {
trace: true
};
}
if (config.anonymizeIp) {
ga("".concat(instancePrefix, "set"), 'anonymizeIp', true);
}
var user = instance.user() || {};
var traits = user.traits || {};
if (config.tasks) {
var taskList = ['customTask', 'previewTask', 'checkProtocolTask', 'validationTask', 'checkStorageTask', 'historyImportTask', 'samplerTask', 'buildHitTask', 'sendHitTask', 'timingTask', 'displayFeaturesTask'];
taskList.forEach(function (taskName) {
if (config.tasks.hasOwnProperty(taskName)) {
var task = config.tasks[taskName];
if (Object.keys(traits).length) {
window[gtagName]('set', 'user_properties', traits);
}
/* Initialize all measurementIds */
if (typeof task === 'function') {
ga(config.tasks[taskName]);
} else if (task === null) {
ga("".concat(instancePrefix, "set"), taskName, task);
}
}
});
for (var i = 0; i < measurementIds.length; i++) {
if (!loadedInstances[measurementIds[i]]) {
window[gtagName]('config', measurementIds[i], gtagConf);
loadedInstances[measurementIds[i]] = true;
}
/* set custom dimensions from user traits */
}
},
// Set parameter scope at user level with 'set' method
identify: function identify(_ref2) {
var payload = _ref2.payload,
config = _ref2.config;
var gtagName = config.gtagName;
if (!window[gtagName] || !measurementIds.length) return;
if (payload.userId) {
// https://developers.google.com/analytics/devguides/collection/ga4/user-id?platform=websites#send_user_ids
window[gtagName]('set', {
user_id: payload.userId
}); // console.log('Set userid', payload.userId)
} // TODO verify this
// https://developers.google.com/analytics/devguides/collection/ga4/user-properties?technology=websites
var user = instance.user() || {};
var traits = user.traits || {};
if (Object.keys(traits).length && customDimensions && Object.keys(customDimensions).length) {
var dimensions = formatObjectIntoDimensions$1(traits, config);
ga("".concat(instancePrefix, "set"), dimensions);
}
loadedInstances[instanceName] = true;
if (Object.keys(payload.traits).length) {
/* gtag('set', 'user_properties', {
favorite_composer: 'Mahler',
favorite_instrument: 'double bass',
season_ticketholder: 'true'
}) */
window[gtagName]('set', 'user_properties', payload.traits); // console.log('Set userprops', payload.traits)
}
},
// Google Analytics page view
page: function page(_ref) {
var payload = _ref.payload,
config = _ref.config,
instance = _ref.instance;
// Set parameter scope at page level with 'config' method
page: function page(_ref3) {
var payload = _ref3.payload,
config = _ref3.config,
instance = _ref3.instance;
var gtagName = config.gtagName,
gtagConfig = config.gtagConfig;
if (!window[gtagName] || !measurementIds.length) return;
var properties = payload.properties;
var resetCustomDimensionsOnPage = config.resetCustomDimensionsOnPage,
customDimensions = config.customDimensions;
var campaign = instance.getState('context.campaign');
if (gaNotLoaded()) return;
/* If dimensions are specifiied to reset, clear them before page view */
var send_to = properties.send_to;
var campaign = instance.getState('context.campaign'); // console.log('ga page properties', properties)
if (resetCustomDimensionsOnPage && resetCustomDimensionsOnPage.length) {
var resetDimensions = resetCustomDimensionsOnPage.reduce(function (acc, key) {
if (customDimensions[key]) {
acc[customDimensions[key]] = null; // { dimension1: null } etc
}
/* Create pageview-related properties */
return acc;
}, {});
if (Object.keys(resetDimensions).length) {
// Reset custom dimensions
ga("".concat(instancePrefix, "set"), resetDimensions);
}
}
var path = properties.path || document.location.pathname;
var pageView = {
page: path,
title: properties.title,
location: properties.url
page_title: properties.title,
page_location: properties.url,
page_path: properties.path || document.location.pathname,
page_hash: properties.hash,
page_search: properties.page_search,
page_referrer: properties.referrer
};
var pageData = {
page: path,
title: properties.title // allow referrer override if referrer was manually set
var campaignData = addCampaignData(campaign);
};
var finalPayload = _objectSpread(_objectSpread(_objectSpread({}, send_to ? {
send_to: send_to
} : {}), pageView), campaignData);
/* If send_page_view true, ignore first analytics.page call */
if (properties.referrer !== document.referrer) {
pageData.referrer = properties.referrer;
}
var campaignData = addCampaignData(campaign);
var dimensions = setCustomDimensions(properties, config, instancePrefix);
/* Dimensions will only be included in the event if config.setCustomDimensionsToPage is false */
if (gtagConfig && gtagConfig.send_page_view && pageCallCount === 0) {
pageCallCount++; // console.log('ignore first pageCallCount', pageCallCount)
var finalPayload = _objectSpread({}, pageView, campaignData, dimensions);
return;
} // console.log('Send page_view payload', finalPayload)
ga("".concat(instancePrefix, "set"), pageData); // Remove location for SPA tracking after initial page view
if (pageCalledOnce) {
delete finalPayload.location;
}
/* send page view to GA */
window[gtagName]('event', 'page_view', finalPayload); // Set after initial page view
ga("".concat(instancePrefix, "send"), 'pageview', finalPayload); // Set after initial page view
pageCalledOnce = true;
pageCallCount++;
},
/**
* Google Analytics track event
* @example
*
* analytics.track('playedVideo', {
* category: 'Videos',
* label: 'Fall Campaign',
* value: 42
* })
*/
track: function track(_ref2) {
var payload = _ref2.payload,
config = _ref2.config,
instance = _ref2.instance;
// Set parameter scope at event level with 'event' method
track: function track(_ref4) {
var payload = _ref4.payload,
config = _ref4.config,
instance = _ref4.instance;
var properties = payload.properties,
event = payload.event;
var label = properties.label,
value = properties.value,
category = properties.category,
nonInteraction = properties.nonInteraction;
var campaign = instance.getState('context.campaign'); // TODO inline this trackEvent
var campaign = instance.getState('context.campaign');
var gtagName = config.gtagName;
if (!window[gtagName] || !measurementIds.length) return;
/* Attach campaign data */
trackEvent$1({
hitType: 'event',
event: event,
label: label,
category: category || 'All',
value: value,
nonInteraction: nonInteraction,
campaign: campaign
}, config, payload);
var campaignData = addCampaignData(campaign); // Limits https://support.google.com/analytics/answer/9267744
var finalPayload = _objectSpread(_objectSpread({}, properties), campaignData);
/*
console.log('finalPayload', finalPayload)
console.log('event', event)
*/
/* Send data to Google Analytics
Signature gtag('event', '<event_name>', {
<event_params>key: value,
})
*/
window[gtagName]('event', event, finalPayload);
},
identify: function identify(_ref3) {
var payload = _ref3.payload,
config = _ref3.config;
identifyVisitor$1(payload.userId, payload.traits, config);
/* Verify gtag loaded and ready to use */
loaded: function loaded(_ref5) {
var config = _ref5.config;
var dataLayerName = config.dataLayerName,
customScriptSrc = config.customScriptSrc;
var hasDataLayer = dataLayerName && window[dataLayerName] && Array.prototype.push === window[dataLayerName].push;
return scriptLoaded(customScriptSrc || gtagScriptSource) && hasDataLayer;
},
loaded: function loaded() {
return !!window.gaplugins;
}
};
}
function gaNotLoaded(scriptSrc) {
if (scriptSrc) {
return !scriptLoaded(scriptSrc);
}
/* Custom methods */
methods: {
addTag: function addTag(tagId) {
var settings = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
return typeof ga === 'undefined';
}
// https://developers.google.com/tag-platform/devguides/install-gtagjs#add_products_to_your_tag
if (window[initConfig.gtagName]) {
window[initConfig.gtagName]('config', tagId, settings); // Add tag id
function getInstanceDetails(pluginConfig) {
var instanceName = pluginConfig.instanceName;
return {
instancePrefix: instanceName ? "".concat(instanceName, ".") : '',
instanceName: instanceName
};
}
/**
* Send event tracking to Google Analytics
* @param {object} eventData - GA event payload
* @param {string} [eventData.hitType = 'event'] - hitType https://bit.ly/2Jab9L1 one of 'pageview', 'screenview', 'event', 'transaction', 'item', 'social', 'exception', 'timing'
* @param {string} [eventData.event] - event Action https://bit.ly/2CUzeoz
* @param {string} [eventData.label] - event Label http://bit.ly/2oo8eb3
* @param {string} [eventData.category] - event Category http://bit.ly/2EAy9UP
* @param {string} [eventData.nonInteraction = false] - nonInteraction https://bit.ly/2CUzeoz
* @return {object} sent data
*/
if (measurementIds && !measurementIds.includes(tagId)) {
measurementIds = measurementIds.concat(tagId);
}
}
},
/* Disable gtag for user */
disable: function disable(ids) {
var gaIds = ids ? getIds(ids) : measurementIds;
function trackEvent$1(eventData) {
var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
var payload = arguments.length > 2 ? arguments[2] : undefined;
if (gaNotLoaded()) return;
for (var i = 0; i < measurementIds.length; i++) {
var gaId = measurementIds[i];
var _getInstanceDetails2 = getInstanceDetails(opts),
instancePrefix = _getInstanceDetails2.instancePrefix;
if (gaIds.includes(gaId)) {
// https://developers.google.com/analytics/devguides/collection/gtagjs/user-opt-out
window["ga-disable-".concat(gaId)] = true;
}
}
},
var data = {
// hitType https://bit.ly/2Jab9L1 one of 'pageview', 'screenview', 'event', 'transaction', 'item', 'social', 'exception', 'timing'
hitType: eventData.hitType || 'event',
// eventAction https://bit.ly/2CUzeoz
eventAction: eventData.event,
// eventLabel http://bit.ly/2oo8eb3
eventLabel: eventData.label,
// eventCategory http://bit.ly/2EAy9UP
eventCategory: eventData.category || 'All',
// nonInteraction https://bit.ly/2CUzeoz
nonInteraction: eventData.nonInteraction !== undefined ? !!eventData.nonInteraction : false
};
/* Enable gtag for user */
enable: function enable(ids) {
var gaIds = ids ? getIds(ids) : measurementIds;
if (eventData.value) {
// how much is this action worth?
data.eventValue = format(eventData.value);
}
/* Attach campaign data */
for (var i = 0; i < measurementIds.length; i++) {
var gaId = measurementIds[i];
if (gaIds.includes(gaId)) {
// https://developers.google.com/analytics/devguides/collection/gtagjs/user-opt-out
window["ga-disable-".concat(gaId)] = false;
}
}
}
}
};
}
var campaignData = addCampaignData(eventData);
/* Set Dimensions or return them for payload is config.setCustomDimensionsToPage is false */
function getIds(measurementIds) {
if (!measurementIds) throw new Error('No GA Measurement ID defined');
var dimensions = setCustomDimensions(payload.properties, opts, instancePrefix);
if (Array.isArray(measurementIds)) {
return measurementIds;
}
var finalPayload = _objectSpread({}, data, campaignData, dimensions);
/* Send data to Google Analytics */
if (typeof measurementIds === 'string') {
return [measurementIds];
}
ga("".concat(instancePrefix, "send"), 'event', finalPayload);
return finalPayload;
throw new Error('GA Measurement ID must be string or array of strings');
}

@@ -369,6 +328,8 @@ /**

function addCampaignData() {
var campaignData = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
var campaign = {};
var name = campaignData.name,
var id = campaignData.id,
name = campaignData.name,
source = campaignData.source,

@@ -378,2 +339,3 @@ medium = campaignData.medium,

keyword = campaignData.keyword;
if (id) campaign.campaignId = id;
if (name) campaign.campaignName = name;

@@ -386,125 +348,19 @@ if (source) campaign.campaignSource = source;

}
/* Todo add includeSearch options ¯\_(ツ)_/¯
function getPagePath(props, opts = {}) {
if (!props) return
if (opts.includeSearch && props.search) {
return `${props.path}${props.search}`
}
return props.path
}
*/
// properties, data=opts
function formatObjectIntoDimensions$1(properties) {
var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
var customDimensions = opts.customDimensions; // TODO map opts.customMetrics; Object.keys(customMetrics) { key: 'metric1' }
// TODO map opts.contentGroupings; Object.keys(contentGroupings) { key: 'contentGroup1' }
/* Map values from payload to any defined custom dimensions */
return Object.keys(customDimensions).reduce(function (acc, key) {
var dimensionKey = customDimensions[key];
var value = get$1(properties, key) || properties[key];
if (typeof value === 'boolean') {
value = value.toString();
}
if (value || value === 0) {
acc[dimensionKey] = value;
return acc;
}
return acc;
}, {});
}
function get$1(obj, key, def, p, undef) {
key = key.split ? key.split('.') : key;
for (p = 0; p < key.length; p++) {
obj = obj ? obj[key[p]] : undef;
}
return obj === undef ? def : obj;
}
function setCustomDimensions() {
var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
var opts = arguments.length > 1 ? arguments[1] : undefined;
var instancePrefix = arguments.length > 2 ? arguments[2] : undefined;
var customDimensions = formatObjectIntoDimensions$1(props, opts);
if (!Object.keys(customDimensions).length) {
return {};
} // If setCustomDimensionsToPage false, don't save custom dimensions from event to page
if (!opts.setCustomDimensionsToPage) {
return customDimensions;
} // Set custom dimensions
ga("".concat(instancePrefix, "set"), customDimensions);
return {};
}
/**
* Identify a visitor by Id
* @param {string} id - unique visitor ID
*/
function identifyVisitor$1(id) {
var traits = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
var conf = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
if (gaNotLoaded()) return;
var _getInstanceDetails3 = getInstanceDetails(conf),
instancePrefix = _getInstanceDetails3.instancePrefix;
if (id) ga("".concat(instancePrefix, "set"), 'userId', id);
if (Object.keys(traits).length) {
var custom = formatObjectIntoDimensions$1(traits, conf);
ga("".concat(instancePrefix, "set"), custom);
}
}
function scriptLoaded(scriptSrc) {
var scripts = document.querySelectorAll('script[src]');
return !!Object.keys(scripts).filter(function (key) {
return (scripts[key].src || '') === scriptSrc;
}).length;
var regex = new RegExp("^".concat(scriptSrc));
return Boolean(Object.values(scripts).filter(function (value) {
return regex.test(value.src);
}).length);
}
function format(value) {
if (!value || value < 0) return 0;
return Math.round(value);
}
var browser = /*#__PURE__*/Object.freeze({
default: googleAnalytics$1,
trackEvent: trackEvent$1,
identifyVisitor: identifyVisitor$1
});
/* This module will shake out unused code + work in browser and node 🎉 */
var index = googleAnalytics$1;
var index = googleAnalytics ;
/* init for CDN usage. globalName.init() */
var init = googleAnalytics$1;
/* Standalone API */
var init = googleAnalytics ;
var initialize$1 = undefined;
var page = undefined;
var track = trackEvent$1;
var identify = identifyVisitor$1;
exports.default = index;
exports["default"] = index;
exports.init = init;
exports.identify = identify;
exports.track = track;
exports.page = page;
exports.initialize = initialize$1;

@@ -1,64 +0,58 @@

// googleAnalytics events from a node server environment.
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
function _defineProperty(obj, key, value) {
if (key in obj) {
Object.defineProperty(obj, key, {
value: value,
enumerable: true,
configurable: true,
writable: true
});
} else {
obj[key] = value;
}
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
return obj;
}
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
function _objectSpread(target) {
for (var i = 1; i < arguments.length; i++) {
var source = arguments[i] != null ? arguments[i] : {};
var ownKeys = Object.keys(source);
/* global, window */
var loadedInstances = {};
/* Location of gtag script */
if (typeof Object.getOwnPropertySymbols === 'function') {
ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) {
return Object.getOwnPropertyDescriptor(source, sym).enumerable;
}));
}
var gtagScriptSource = 'https://www.googletagmanager.com/gtag/js'; // See https://developers.google.com/analytics/devguides/collection/ga4/reference/config
ownKeys.forEach(function (key) {
_defineProperty(target, key, source[key]);
});
}
var defaultGtagConf = {
// https://support.google.com/analytics/answer/7201382?hl=en#zippy=%2Cglobal-site-tag-websites
debug_mode: false,
return target;
}
/**
* Disable automatic sending of page views, instead let analytics.page() do this
* https://developers.google.com/analytics/devguides/collection/gtagjs
*/
send_page_view: false,
// https://developers.google.com/analytics/devguides/collection/gtagjs/ip-anonymization
anonymize_ip: false,
/* global ga */
var defaultConfig = {
/* See description below */
trackingId: null,
/**
* Disable All Advertising
* https://developers.google.com/analytics/devguides/collection/ga4/display-features#disable_all_advertising_features
*/
allow_google_signals: true,
/* See description below */
debug: false,
/**
* Disable Advertising Personalization
* https://developers.google.com/analytics/devguides/collection/ga4/display-features#disable_advertising_personalization
*/
allow_ad_personalization_signals: true,
/* See description below */
anonymizeIp: false,
/**
* https://developers.google.com/analytics/devguides/collection/gtagjs/cookies-user-id#configure_cookie_field_settings
*/
// cookie_domain: 'auto',
// cookie_expires
// cookie_prefix
// cookie_update
// cookie_flags
/* See description below */
customDimensions: {},
/* See description below */
resetCustomDimensionsOnPage: [],
/* See description below */
setCustomDimensionsToPage: true
/* Custom metrics https://bit.ly/3c5de88 */
// TODO customMetrics: { key: 'metric1' }
/* Content groupings https://bit.ly/39Zt3Me */
// TODO contentGroupings: { key: 'contentGroup1' }
/**
* Cookie Flags
* https://developers.google.com/analytics/devguides/collection/ga4/cookies-user-id#cookie_flags
*/
cookie_flags: ''
};
var loadedInstances = {};
var defaultConfig = {
gtagName: 'gtag',
dataLayerName: 'ga4DataLayer',
measurementIds: [],
gtagConfig: defaultGtagConf
};
/**

@@ -70,12 +64,13 @@ * Google analytics plugin

* @param {object} pluginConfig - Plugin settings
* @param {string} pluginConfig.trackingId - Google Analytics site tracking Id
* @param {string|array} pluginConfig.measurementIds - Google Analytics MEASUREMENT IDs
* @param {boolean} [pluginConfig.debug] - Enable Google Analytics debug mode
* @param {boolean} [pluginConfig.anonymizeIp] - Enable [Anonymizing IP addresses](https://bit.ly/3c660Rd) sent to Google Analytics. [See details below](#anonymize-visitor-ips)
* @param {object} [pluginConfig.customDimensions] - Map [Custom dimensions](https://bit.ly/3c5de88) to send extra information to Google Analytics. [See details below](#using-ga-custom-dimensions)
* @param {object} [pluginConfig.resetCustomDimensionsOnPage] - Reset custom dimensions by key on analytics.page() calls. Useful for single page apps.
* @param {boolean} [pluginConfig.setCustomDimensionsToPage] - Mapped dimensions will be set to the page & sent as properties of all subsequent events on that page. If false, analytics will only pass custom dimensions as part of individual events
* @param {string} [pluginConfig.instanceName] - Custom tracker name for google analytics. Use this if you need multiple googleAnalytics scripts loaded
* @param {string} [pluginConfig.dataLayerName=ga4DataLayer] - The optional name for dataLayer object. Defaults to ga4DataLayer.
* @param {string} [pluginConfig.gtagName=gtag] - The optional name for dataLayer object. Defaults to ga4DataLayer.
* @param {boolean} [pluginConfig.gtagConfig.anonymize_ip] - Enable [Anonymizing IP addresses](https://bit.ly/3c660Rd) sent to Google Analytics. [See details below](#anonymize-visitor-ips)
* @param {object} [pluginConfig.gtagConfig.cookie_domain] - Additional cookie properties for configuring the [ga cookie](https://developers.google.com/analytics/devguides/collection/analyticsjs/cookies-user-id#configuring_cookie_field_settings)
* @param {object} [pluginConfig.gtagConfig.cookie_expires] - Additional cookie properties for configuring the [ga cookie](https://developers.google.com/analytics/devguides/collection/analyticsjs/cookies-user-id#configuring_cookie_field_settings)
* @param {object} [pluginConfig.gtagConfig.cookie_prefix] - Additional cookie properties for configuring the [ga cookie](https://developers.google.com/analytics/devguides/collection/analyticsjs/cookies-user-id#configuring_cookie_field_settings)
* @param {object} [pluginConfig.gtagConfig.cookie_update] - Additional cookie properties for configuring the [ga cookie](https://developers.google.com/analytics/devguides/collection/analyticsjs/cookies-user-id#configuring_cookie_field_settings)
* @param {object} [pluginConfig.gtagConfig.cookie_flags] - Additional cookie properties for configuring the [ga cookie](https://developers.google.com/analytics/devguides/collection/analyticsjs/cookies-user-id#configuring_cookie_field_settings)
* @param {string} [pluginConfig.customScriptSrc] - Custom URL for google analytics script, if proxying calls
* @param {object} [pluginConfig.cookieConfig] - Additional cookie properties for configuring the [ga cookie](https://developers.google.com/analytics/devguides/collection/analyticsjs/cookies-user-id#configuring_cookie_field_settings)
* @param {object} [pluginConfig.tasks] - [Set custom google analytic tasks](https://developers.google.com/analytics/devguides/collection/analyticsjs/tasks)
* @return {*}

@@ -85,269 +80,233 @@ * @example

* googleAnalytics({
* trackingId: 'UA-1234567'
* measurementIds: ['UA-1234567']
* })
*/
function googleAnalytics$1() {
function googleAnalytics() {
var pluginConfig = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
var pageCalledOnce = false; // Allow for multiple google analytics instances
var pageCallCount = 0;
var measurementIds = getIds(pluginConfig.measurementIds);
var _getInstanceDetails = getInstanceDetails(pluginConfig),
instanceName = _getInstanceDetails.instanceName,
instancePrefix = _getInstanceDetails.instancePrefix;
var initConfig = _objectSpread(_objectSpread({}, defaultConfig), pluginConfig);
return {
name: 'google-analytics',
config: _objectSpread({}, defaultConfig, pluginConfig),
// Load google analytics
initialize: function initialize(pluginApi) {
var config = pluginApi.config,
instance = pluginApi.instance;
if (!config.trackingId) throw new Error('No GA trackingId defined');
var customDimensions = config.customDimensions,
customScriptSrc = config.customScriptSrc; // var to hoist
config: initConfig,
// Load gtag.js and define gtag
initialize: function initialize(_ref) {
var config = _ref.config,
instance = _ref.instance;
var dataLayerName = config.dataLayerName,
customScriptSrc = config.customScriptSrc,
gtagName = config.gtagName,
gtagConfig = config.gtagConfig,
debug = config.debug;
/* Inject google gtag.js script if not found */
var scriptSrc = customScriptSrc || 'https://www.google-analytics.com/analytics.js'; // Load google analytics script to page
if (!scriptLoaded(customScriptSrc || gtagScriptSource)) {
var customLayerName = dataLayerName ? "&l=".concat(dataLayerName) : '';
var script = document.createElement('script');
script.async = true;
script.src = customScriptSrc || "".concat(gtagScriptSource, "?id=").concat(measurementIds[0]).concat(customLayerName);
document.body.appendChild(script);
}
/* Set gtag and datalayer */
if (gaNotLoaded(scriptSrc)) {
/* eslint-disable */
(function (i, s, o, g, r, a, m) {
i['GoogleAnalyticsObject'] = r;
i[r] = i[r] || function () {
(i[r].q = i[r].q || []).push(arguments);
}, i[r].l = 1 * new Date();
a = s.createElement(o), m = s.getElementsByTagName(o)[0];
a.async = 1;
a.src = g;
m.parentNode.insertBefore(a, m);
})(window, document, 'script', scriptSrc, 'ga');
/* eslint-enable */
} // Initialize tracker instance on page
if (!window[dataLayerName]) {
window[dataLayerName] = window[dataLayerName] || [];
window[gtagName] = function () {
window[dataLayerName].push(arguments);
};
if (!loadedInstances[instanceName]) {
var gaConfig = _objectSpread({
cookieDomain: config.domain || 'auto',
siteSpeedSampleRate: config.siteSpeedSampleRate || 1,
sampleRate: config.sampleRate || 100,
allowLinker: true
}, config.cookieConfig);
window[gtagName]('js', new Date());
} // Initialize tracker instances on page
if (instanceName) {
gaConfig.name = instanceName;
}
ga('create', config.trackingId, gaConfig);
var gtagConf = _objectSpread(_objectSpread(_objectSpread({}, defaultGtagConf), gtagConfig ? gtagConfig : {}), debug ? {
debug_mode: true
} : {});
/* set custom dimensions from user traits */
if (config.debug) {
// Disable sends to GA http://bit.ly/2Ro0vTR
ga("".concat(instancePrefix, "set"), 'sendHitTask', null);
window.ga_debug = {
trace: true
};
}
if (config.anonymizeIp) {
ga("".concat(instancePrefix, "set"), 'anonymizeIp', true);
}
var user = instance.user() || {};
var traits = user.traits || {};
if (config.tasks) {
var taskList = ['customTask', 'previewTask', 'checkProtocolTask', 'validationTask', 'checkStorageTask', 'historyImportTask', 'samplerTask', 'buildHitTask', 'sendHitTask', 'timingTask', 'displayFeaturesTask'];
taskList.forEach(function (taskName) {
if (config.tasks.hasOwnProperty(taskName)) {
var task = config.tasks[taskName];
if (Object.keys(traits).length) {
window[gtagName]('set', 'user_properties', traits);
}
/* Initialize all measurementIds */
if (typeof task === 'function') {
ga(config.tasks[taskName]);
} else if (task === null) {
ga("".concat(instancePrefix, "set"), taskName, task);
}
}
});
for (var i = 0; i < measurementIds.length; i++) {
if (!loadedInstances[measurementIds[i]]) {
window[gtagName]('config', measurementIds[i], gtagConf);
loadedInstances[measurementIds[i]] = true;
}
/* set custom dimensions from user traits */
}
},
// Set parameter scope at user level with 'set' method
identify: function identify(_ref2) {
var payload = _ref2.payload,
config = _ref2.config;
var gtagName = config.gtagName;
if (!window[gtagName] || !measurementIds.length) return;
if (payload.userId) {
// https://developers.google.com/analytics/devguides/collection/ga4/user-id?platform=websites#send_user_ids
window[gtagName]('set', {
user_id: payload.userId
}); // console.log('Set userid', payload.userId)
} // TODO verify this
// https://developers.google.com/analytics/devguides/collection/ga4/user-properties?technology=websites
var user = instance.user() || {};
var traits = user.traits || {};
if (Object.keys(traits).length && customDimensions && Object.keys(customDimensions).length) {
var dimensions = formatObjectIntoDimensions$1(traits, config);
ga("".concat(instancePrefix, "set"), dimensions);
}
loadedInstances[instanceName] = true;
if (Object.keys(payload.traits).length) {
/* gtag('set', 'user_properties', {
favorite_composer: 'Mahler',
favorite_instrument: 'double bass',
season_ticketholder: 'true'
}) */
window[gtagName]('set', 'user_properties', payload.traits); // console.log('Set userprops', payload.traits)
}
},
// Google Analytics page view
page: function page(_ref) {
var payload = _ref.payload,
config = _ref.config,
instance = _ref.instance;
// Set parameter scope at page level with 'config' method
page: function page(_ref3) {
var payload = _ref3.payload,
config = _ref3.config,
instance = _ref3.instance;
var gtagName = config.gtagName,
gtagConfig = config.gtagConfig;
if (!window[gtagName] || !measurementIds.length) return;
var properties = payload.properties;
var resetCustomDimensionsOnPage = config.resetCustomDimensionsOnPage,
customDimensions = config.customDimensions;
var campaign = instance.getState('context.campaign');
if (gaNotLoaded()) return;
/* If dimensions are specifiied to reset, clear them before page view */
var send_to = properties.send_to;
var campaign = instance.getState('context.campaign'); // console.log('ga page properties', properties)
if (resetCustomDimensionsOnPage && resetCustomDimensionsOnPage.length) {
var resetDimensions = resetCustomDimensionsOnPage.reduce(function (acc, key) {
if (customDimensions[key]) {
acc[customDimensions[key]] = null; // { dimension1: null } etc
}
/* Create pageview-related properties */
return acc;
}, {});
if (Object.keys(resetDimensions).length) {
// Reset custom dimensions
ga("".concat(instancePrefix, "set"), resetDimensions);
}
}
var path = properties.path || document.location.pathname;
var pageView = {
page: path,
title: properties.title,
location: properties.url
page_title: properties.title,
page_location: properties.url,
page_path: properties.path || document.location.pathname,
page_hash: properties.hash,
page_search: properties.page_search,
page_referrer: properties.referrer
};
var pageData = {
page: path,
title: properties.title // allow referrer override if referrer was manually set
var campaignData = addCampaignData(campaign);
};
var finalPayload = _objectSpread(_objectSpread(_objectSpread({}, send_to ? {
send_to: send_to
} : {}), pageView), campaignData);
/* If send_page_view true, ignore first analytics.page call */
if (properties.referrer !== document.referrer) {
pageData.referrer = properties.referrer;
}
var campaignData = addCampaignData(campaign);
var dimensions = setCustomDimensions(properties, config, instancePrefix);
/* Dimensions will only be included in the event if config.setCustomDimensionsToPage is false */
if (gtagConfig && gtagConfig.send_page_view && pageCallCount === 0) {
pageCallCount++; // console.log('ignore first pageCallCount', pageCallCount)
var finalPayload = _objectSpread({}, pageView, campaignData, dimensions);
return;
} // console.log('Send page_view payload', finalPayload)
ga("".concat(instancePrefix, "set"), pageData); // Remove location for SPA tracking after initial page view
if (pageCalledOnce) {
delete finalPayload.location;
}
/* send page view to GA */
window[gtagName]('event', 'page_view', finalPayload); // Set after initial page view
ga("".concat(instancePrefix, "send"), 'pageview', finalPayload); // Set after initial page view
pageCalledOnce = true;
pageCallCount++;
},
/**
* Google Analytics track event
* @example
*
* analytics.track('playedVideo', {
* category: 'Videos',
* label: 'Fall Campaign',
* value: 42
* })
*/
track: function track(_ref2) {
var payload = _ref2.payload,
config = _ref2.config,
instance = _ref2.instance;
// Set parameter scope at event level with 'event' method
track: function track(_ref4) {
var payload = _ref4.payload,
config = _ref4.config,
instance = _ref4.instance;
var properties = payload.properties,
event = payload.event;
var label = properties.label,
value = properties.value,
category = properties.category,
nonInteraction = properties.nonInteraction;
var campaign = instance.getState('context.campaign'); // TODO inline this trackEvent
var campaign = instance.getState('context.campaign');
var gtagName = config.gtagName;
if (!window[gtagName] || !measurementIds.length) return;
/* Attach campaign data */
trackEvent$1({
hitType: 'event',
event: event,
label: label,
category: category || 'All',
value: value,
nonInteraction: nonInteraction,
campaign: campaign
}, config, payload);
var campaignData = addCampaignData(campaign); // Limits https://support.google.com/analytics/answer/9267744
var finalPayload = _objectSpread(_objectSpread({}, properties), campaignData);
/*
console.log('finalPayload', finalPayload)
console.log('event', event)
*/
/* Send data to Google Analytics
Signature gtag('event', '<event_name>', {
<event_params>key: value,
})
*/
window[gtagName]('event', event, finalPayload);
},
identify: function identify(_ref3) {
var payload = _ref3.payload,
config = _ref3.config;
identifyVisitor$1(payload.userId, payload.traits, config);
/* Verify gtag loaded and ready to use */
loaded: function loaded(_ref5) {
var config = _ref5.config;
var dataLayerName = config.dataLayerName,
customScriptSrc = config.customScriptSrc;
var hasDataLayer = dataLayerName && window[dataLayerName] && Array.prototype.push === window[dataLayerName].push;
return scriptLoaded(customScriptSrc || gtagScriptSource) && hasDataLayer;
},
loaded: function loaded() {
return !!window.gaplugins;
}
};
}
function gaNotLoaded(scriptSrc) {
if (scriptSrc) {
return !scriptLoaded(scriptSrc);
}
/* Custom methods */
methods: {
addTag: function addTag(tagId) {
var settings = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
return typeof ga === 'undefined';
}
// https://developers.google.com/tag-platform/devguides/install-gtagjs#add_products_to_your_tag
if (window[initConfig.gtagName]) {
window[initConfig.gtagName]('config', tagId, settings); // Add tag id
function getInstanceDetails(pluginConfig) {
var instanceName = pluginConfig.instanceName;
return {
instancePrefix: instanceName ? "".concat(instanceName, ".") : '',
instanceName: instanceName
};
}
/**
* Send event tracking to Google Analytics
* @param {object} eventData - GA event payload
* @param {string} [eventData.hitType = 'event'] - hitType https://bit.ly/2Jab9L1 one of 'pageview', 'screenview', 'event', 'transaction', 'item', 'social', 'exception', 'timing'
* @param {string} [eventData.event] - event Action https://bit.ly/2CUzeoz
* @param {string} [eventData.label] - event Label http://bit.ly/2oo8eb3
* @param {string} [eventData.category] - event Category http://bit.ly/2EAy9UP
* @param {string} [eventData.nonInteraction = false] - nonInteraction https://bit.ly/2CUzeoz
* @return {object} sent data
*/
if (measurementIds && !measurementIds.includes(tagId)) {
measurementIds = measurementIds.concat(tagId);
}
}
},
/* Disable gtag for user */
disable: function disable(ids) {
var gaIds = ids ? getIds(ids) : measurementIds;
function trackEvent$1(eventData) {
var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
var payload = arguments.length > 2 ? arguments[2] : undefined;
if (gaNotLoaded()) return;
for (var i = 0; i < measurementIds.length; i++) {
var gaId = measurementIds[i];
var _getInstanceDetails2 = getInstanceDetails(opts),
instancePrefix = _getInstanceDetails2.instancePrefix;
if (gaIds.includes(gaId)) {
// https://developers.google.com/analytics/devguides/collection/gtagjs/user-opt-out
window["ga-disable-".concat(gaId)] = true;
}
}
},
var data = {
// hitType https://bit.ly/2Jab9L1 one of 'pageview', 'screenview', 'event', 'transaction', 'item', 'social', 'exception', 'timing'
hitType: eventData.hitType || 'event',
// eventAction https://bit.ly/2CUzeoz
eventAction: eventData.event,
// eventLabel http://bit.ly/2oo8eb3
eventLabel: eventData.label,
// eventCategory http://bit.ly/2EAy9UP
eventCategory: eventData.category || 'All',
// nonInteraction https://bit.ly/2CUzeoz
nonInteraction: eventData.nonInteraction !== undefined ? !!eventData.nonInteraction : false
};
/* Enable gtag for user */
enable: function enable(ids) {
var gaIds = ids ? getIds(ids) : measurementIds;
if (eventData.value) {
// how much is this action worth?
data.eventValue = format(eventData.value);
}
/* Attach campaign data */
for (var i = 0; i < measurementIds.length; i++) {
var gaId = measurementIds[i];
if (gaIds.includes(gaId)) {
// https://developers.google.com/analytics/devguides/collection/gtagjs/user-opt-out
window["ga-disable-".concat(gaId)] = false;
}
}
}
}
};
}
var campaignData = addCampaignData(eventData);
/* Set Dimensions or return them for payload is config.setCustomDimensionsToPage is false */
function getIds(measurementIds) {
if (!measurementIds) throw new Error('No GA Measurement ID defined');
var dimensions = setCustomDimensions(payload.properties, opts, instancePrefix);
if (Array.isArray(measurementIds)) {
return measurementIds;
}
var finalPayload = _objectSpread({}, data, campaignData, dimensions);
/* Send data to Google Analytics */
if (typeof measurementIds === 'string') {
return [measurementIds];
}
ga("".concat(instancePrefix, "send"), 'event', finalPayload);
return finalPayload;
throw new Error('GA Measurement ID must be string or array of strings');
}

@@ -364,6 +323,8 @@ /**

function addCampaignData() {
var campaignData = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
var campaign = {};
var name = campaignData.name,
var id = campaignData.id,
name = campaignData.name,
source = campaignData.source,

@@ -373,2 +334,3 @@ medium = campaignData.medium,

keyword = campaignData.keyword;
if (id) campaign.campaignId = id;
if (name) campaign.campaignName = name;

@@ -381,121 +343,18 @@ if (source) campaign.campaignSource = source;

}
/* Todo add includeSearch options ¯\_(ツ)_/¯
function getPagePath(props, opts = {}) {
if (!props) return
if (opts.includeSearch && props.search) {
return `${props.path}${props.search}`
}
return props.path
}
*/
// properties, data=opts
function formatObjectIntoDimensions$1(properties) {
var opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
var customDimensions = opts.customDimensions; // TODO map opts.customMetrics; Object.keys(customMetrics) { key: 'metric1' }
// TODO map opts.contentGroupings; Object.keys(contentGroupings) { key: 'contentGroup1' }
/* Map values from payload to any defined custom dimensions */
return Object.keys(customDimensions).reduce(function (acc, key) {
var dimensionKey = customDimensions[key];
var value = get$1(properties, key) || properties[key];
if (typeof value === 'boolean') {
value = value.toString();
}
if (value || value === 0) {
acc[dimensionKey] = value;
return acc;
}
return acc;
}, {});
}
function get$1(obj, key, def, p, undef) {
key = key.split ? key.split('.') : key;
for (p = 0; p < key.length; p++) {
obj = obj ? obj[key[p]] : undef;
}
return obj === undef ? def : obj;
}
function setCustomDimensions() {
var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
var opts = arguments.length > 1 ? arguments[1] : undefined;
var instancePrefix = arguments.length > 2 ? arguments[2] : undefined;
var customDimensions = formatObjectIntoDimensions$1(props, opts);
if (!Object.keys(customDimensions).length) {
return {};
} // If setCustomDimensionsToPage false, don't save custom dimensions from event to page
if (!opts.setCustomDimensionsToPage) {
return customDimensions;
} // Set custom dimensions
ga("".concat(instancePrefix, "set"), customDimensions);
return {};
}
/**
* Identify a visitor by Id
* @param {string} id - unique visitor ID
*/
function identifyVisitor$1(id) {
var traits = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
var conf = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
if (gaNotLoaded()) return;
var _getInstanceDetails3 = getInstanceDetails(conf),
instancePrefix = _getInstanceDetails3.instancePrefix;
if (id) ga("".concat(instancePrefix, "set"), 'userId', id);
if (Object.keys(traits).length) {
var custom = formatObjectIntoDimensions$1(traits, conf);
ga("".concat(instancePrefix, "set"), custom);
}
}
function scriptLoaded(scriptSrc) {
var scripts = document.querySelectorAll('script[src]');
return !!Object.keys(scripts).filter(function (key) {
return (scripts[key].src || '') === scriptSrc;
}).length;
var regex = new RegExp("^".concat(scriptSrc));
return Boolean(Object.values(scripts).filter(function (value) {
return regex.test(value.src);
}).length);
}
function format(value) {
if (!value || value < 0) return 0;
return Math.round(value);
}
var browser = /*#__PURE__*/Object.freeze({
default: googleAnalytics$1,
trackEvent: trackEvent$1,
identifyVisitor: identifyVisitor$1
});
/* This module will shake out unused code + work in browser and node 🎉 */
var index = googleAnalytics$1;
var index = googleAnalytics ;
/* init for CDN usage. globalName.init() */
var init = googleAnalytics$1;
/* Standalone API */
var init = googleAnalytics ;
var initialize$1 = undefined;
var page = undefined;
var track = trackEvent$1;
var identify = identifyVisitor$1;
export default index;
export { init, identify, track, page, initialize$1 as initialize };
export { index as default, init };

@@ -5,184 +5,20 @@ 'use strict';

// googleAnalytics events from a node server environment.
// This allows us to convert the analytics custom dimension syntax
// into the one we need for universal-analytics.
// analytics uses {customDimension[N]: <value>}
// while universal-analytics uses {cd[N]: <value>}
var univeralAnalyticsRosettaStone = {
dimension1: "cd1",
dimension2: "cd2",
dimension3: "cd3",
dimension4: "cd4",
dimension5: "cd5",
dimension6: "cd6",
dimension7: "cd7",
dimension8: "cd8",
dimension9: "cd9",
dimension10: "cd10",
dimension11: "cd11",
dimension12: "cd12",
dimension13: "cd13",
dimension14: "cd14",
dimension15: "cd15",
dimension16: "cd16",
dimension17: "cd17",
dimension18: "cd18",
dimension19: "cd19",
dimension20: "cd20"
};
var universalAnalytics;
{
universalAnalytics = require('universal-analytics');
}
/**
* Serverside Google Analytics plugin
* @param {object} pluginConfig - Plugin settings
* @param {string} pluginConfig.trackingId - Google Analytics site tracking Id
* @return {*}
* @example
*
* googleAnalytics({
* trackingId: '123-xyz'
* })
*/
function googleAnalytics() {
var pluginConfig = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
var client = initialize(pluginConfig);
var customDimensions = pluginConfig.customDimensions || {};
function gaNode(pluginConfig) {
return {
name: 'google-analytics',
config: pluginConfig,
// page view
page: function page(_ref) {
var payload = _ref.payload,
config = _ref.config;
var properties = payload.properties;
var path = properties.path,
href = properties.href,
title = properties.title;
pageView({
path: path,
href: href,
title: title
}, client);
},
// track event
track: function track(_ref2) {
var payload = _ref2.payload,
config = _ref2.config;
var event = payload.event,
properties = payload.properties;
var category = properties.category || 'All';
var label = properties.label || 'NA';
var value = properties.value;
trackEvent({
category: category,
event: event,
label: label,
value: value,
properties: properties
}, client, customDimensions);
},
initialize: function initialize(_ref) {// console.log('has no server implementation yet')
/* identify user */
identify: function identify(_ref3) {
var payload = _ref3.payload;
return identifyVisitor(payload.userId, client);
_ref.config;
}
};
}
function initialize(config) {
if (!config.trackingId) throw new Error('No google analytics trackingId defined');
return universalAnalytics(config.trackingId);
}
function pageView(_ref4, client) {
var path = _ref4.path,
href = _ref4.href,
title = _ref4.title;
if (!path || !href || !title) {
throw new Error('Missing path, href or title in page call for GA');
}
client.pageview(path, href, title).send();
}
function trackEvent(_ref5, client, customDimensions) {
var category = _ref5.category,
event = _ref5.event,
label = _ref5.label,
value = _ref5.value,
properties = _ref5.properties;
// Prepare Custom Dimensions to be Reported.
var dimensions = formatObjectIntoDimensions(properties, customDimensions); // Send Event.
client.event(category, event, label, value, dimensions).send();
}
/**
* Identify a visitor by Id
* @param {string} id - unique visitor ID
* @param {object} client - initialized GA client
*/
function identifyVisitor(id, client) {
client.set('uid', id);
} // Prep Custom Dimensions to be Reported.
function formatObjectIntoDimensions(properties, opts) {
var customDimensions = opts; // TODO map opts.customMetrics; Object.keys(customMetrics) { key: 'metric1' }
// TODO map opts.contentGroupings; Object.keys(contentGroupings) { key: 'contentGroup1' }
/* Map values from payload to any defined custom dimensions */
return Object.keys(customDimensions).reduce(function (acc, key) {
var dimensionKey = customDimensions[key];
var value = get(properties, key) || properties[key];
if (typeof value === 'boolean') {
value = value.toString();
}
if (value || value === 0) {
if (univeralAnalyticsRosettaStone[dimensionKey]) {
acc[univeralAnalyticsRosettaStone[dimensionKey]] = value;
return acc;
} else {
throw new Error('Invalid custom dimension. Should be "dimension[n]" where [n] is an integer inclusively between 1-20.');
}
}
return acc;
}, {});
}
function get(obj, key, def, p, undef) {
key = key.split ? key.split('.') : key;
for (p = 0; p < key.length; p++) {
obj = obj ? obj[key[p]] : undef;
}
return obj === undef ? def : obj;
}
/* This module will shake out unused code + work in browser and node 🎉 */
var index = googleAnalytics;
var index = gaNode;
/* init for CDN usage. globalName.init() */
var init = googleAnalytics;
/* Standalone API */
var init = gaNode;
var initialize$1 = initialize;
var page = pageView;
var track = trackEvent;
var identify = identifyVisitor;
exports.default = index;
exports["default"] = index;
exports.init = init;
exports.identify = identify;
exports.track = track;
exports.page = page;
exports.initialize = initialize$1;

@@ -1,179 +0,18 @@

// googleAnalytics events from a node server environment.
// This allows us to convert the analytics custom dimension syntax
// into the one we need for universal-analytics.
// analytics uses {customDimension[N]: <value>}
// while universal-analytics uses {cd[N]: <value>}
var univeralAnalyticsRosettaStone = {
dimension1: "cd1",
dimension2: "cd2",
dimension3: "cd3",
dimension4: "cd4",
dimension5: "cd5",
dimension6: "cd6",
dimension7: "cd7",
dimension8: "cd8",
dimension9: "cd9",
dimension10: "cd10",
dimension11: "cd11",
dimension12: "cd12",
dimension13: "cd13",
dimension14: "cd14",
dimension15: "cd15",
dimension16: "cd16",
dimension17: "cd17",
dimension18: "cd18",
dimension19: "cd19",
dimension20: "cd20"
};
var universalAnalytics;
{
universalAnalytics = require('universal-analytics');
}
/**
* Serverside Google Analytics plugin
* @param {object} pluginConfig - Plugin settings
* @param {string} pluginConfig.trackingId - Google Analytics site tracking Id
* @return {*}
* @example
*
* googleAnalytics({
* trackingId: '123-xyz'
* })
*/
function googleAnalytics() {
var pluginConfig = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
var client = initialize(pluginConfig);
var customDimensions = pluginConfig.customDimensions || {};
function gaNode(pluginConfig) {
return {
name: 'google-analytics',
config: pluginConfig,
// page view
page: function page(_ref) {
var payload = _ref.payload,
config = _ref.config;
var properties = payload.properties;
var path = properties.path,
href = properties.href,
title = properties.title;
pageView({
path: path,
href: href,
title: title
}, client);
},
// track event
track: function track(_ref2) {
var payload = _ref2.payload,
config = _ref2.config;
var event = payload.event,
properties = payload.properties;
var category = properties.category || 'All';
var label = properties.label || 'NA';
var value = properties.value;
trackEvent({
category: category,
event: event,
label: label,
value: value,
properties: properties
}, client, customDimensions);
},
initialize: function initialize(_ref) {// console.log('has no server implementation yet')
/* identify user */
identify: function identify(_ref3) {
var payload = _ref3.payload;
return identifyVisitor(payload.userId, client);
_ref.config;
}
};
}
function initialize(config) {
if (!config.trackingId) throw new Error('No google analytics trackingId defined');
return universalAnalytics(config.trackingId);
}
function pageView(_ref4, client) {
var path = _ref4.path,
href = _ref4.href,
title = _ref4.title;
if (!path || !href || !title) {
throw new Error('Missing path, href or title in page call for GA');
}
client.pageview(path, href, title).send();
}
function trackEvent(_ref5, client, customDimensions) {
var category = _ref5.category,
event = _ref5.event,
label = _ref5.label,
value = _ref5.value,
properties = _ref5.properties;
// Prepare Custom Dimensions to be Reported.
var dimensions = formatObjectIntoDimensions(properties, customDimensions); // Send Event.
client.event(category, event, label, value, dimensions).send();
}
/**
* Identify a visitor by Id
* @param {string} id - unique visitor ID
* @param {object} client - initialized GA client
*/
function identifyVisitor(id, client) {
client.set('uid', id);
} // Prep Custom Dimensions to be Reported.
function formatObjectIntoDimensions(properties, opts) {
var customDimensions = opts; // TODO map opts.customMetrics; Object.keys(customMetrics) { key: 'metric1' }
// TODO map opts.contentGroupings; Object.keys(contentGroupings) { key: 'contentGroup1' }
/* Map values from payload to any defined custom dimensions */
return Object.keys(customDimensions).reduce(function (acc, key) {
var dimensionKey = customDimensions[key];
var value = get(properties, key) || properties[key];
if (typeof value === 'boolean') {
value = value.toString();
}
if (value || value === 0) {
if (univeralAnalyticsRosettaStone[dimensionKey]) {
acc[univeralAnalyticsRosettaStone[dimensionKey]] = value;
return acc;
} else {
throw new Error('Invalid custom dimension. Should be "dimension[n]" where [n] is an integer inclusively between 1-20.');
}
}
return acc;
}, {});
}
function get(obj, key, def, p, undef) {
key = key.split ? key.split('.') : key;
for (p = 0; p < key.length; p++) {
obj = obj ? obj[key[p]] : undef;
}
return obj === undef ? def : obj;
}
/* This module will shake out unused code + work in browser and node 🎉 */
var index = googleAnalytics;
var index = gaNode;
/* init for CDN usage. globalName.init() */
var init = googleAnalytics;
/* Standalone API */
var init = gaNode;
var initialize$1 = initialize;
var page = pageView;
var track = trackEvent;
var identify = identifyVisitor;
export default index;
export { init, identify, track, page, initialize$1 as initialize };
export { index as default, init };
{
"name": "@analytics/google-analytics",
"version": "0.5.3",
"description": "Google analytics plugin for 'analytics' module",
"version": "1.0.1",
"description": "Google analytics v4 plugin for 'analytics' module",
"projectMeta": {

@@ -12,4 +12,3 @@ "provider": {

"platforms": {
"browser": "./src/browser.js",
"node": "./src/node.js"
"browser": "./src/browser.js"
}

@@ -25,3 +24,3 @@ },

],
"author": "David Wells",
"author": "Bing Wang, David Wells",
"license": "MIT",

@@ -59,6 +58,3 @@ "scripts": {

},
"dependencies": {
"universal-analytics": "^0.4.20"
},
"gitHead": "62e8c7695c0209bc45b0a69fd8b100e34e9bfc8b"
"gitHead": "10f3cd37e9c0868729c7c3d344b8985d17657069"
}

@@ -9,6 +9,4 @@ <!--

This library exports the `google-analytics` plugin for the [`analytics`](https://www.npmjs.com/package/analytics) package & standalone methods for any project to use to make it easier to interact with [Google Analytics](https://analytics.google.com/analytics/web/).
This analytics plugin will load google analytics v.4 into your application.
This analytics plugin will load google analytics into your application.
For more information [see the docs](https://getanalytics.io/plugins/google-analytics/).

@@ -24,17 +22,7 @@

- [Browser usage](#browser-usage)
* [Browser API](#browser-api)
* [Configuration options for browser](#configuration-options-for-browser)
- [Server-side usage](#server-side-usage)
* [Server-side API](#server-side-api)
* [Configuration options for server-side](#configuration-options-for-server-side)
- [Browser API](#browser-api)
- [Configuration options for browser](#configuration-options-for-browser)
- [Additional examples](#additional-examples)
- [Anonymize Visitor IPs](#anonymize-visitor-ips)
- [Customizing event payloads](#customizing-event-payloads)
- [Using GA Custom Dimensions](#using-ga-custom-dimensions)
* [Set the "customDimensions" option](#set-the-customdimensions-option)
- [Using multiple instances](#using-multiple-instances)
- [Custom Proxy Endpoint](#custom-proxy-endpoint)
- [Electron Apps & Browser Extensions](#electron-apps--browser-extensions)
- [Custom GA Tasks](#custom-ga-tasks)
- [Cookie Config](#cookie-config)
- [Fix "double page views"](#fix-double-page-views)
- [Legacy Google analytics v3](#legacy-google-analytics-v3)

@@ -55,3 +43,3 @@ </details>

The `@analytics/google-analytics` package works in [the browser](#browser-usage) and [server-side in Node.js](#server-side-usage). To use, install the package, include in your project and initialize the plugin with [analytics](https://www.npmjs.com/package/analytics).
The `@analytics/google-analytics` package works in [the browser](#browser-usage). To use, install the package, include in your project and initialize the plugin with [analytics](https://www.npmjs.com/package/analytics).

@@ -68,3 +56,3 @@ Below is an example of how to use the browser plugin.

googleAnalytics({
trackingId: 'UA-1234567'
measurementIds: ['UA-1234567']
})

@@ -78,6 +66,5 @@ ]

/* Track a custom event */
analytics.track('playedVideo', {
category: 'Videos',
label: 'Fall Campaign',
value: 42
analytics.track('cartCheckout', {
item: 'pink socks',
price: 20
})

@@ -93,3 +80,3 @@

After initializing `analytics` with the `googleAnalytics` plugin, data will be sent into Google Analytics whenever [analytics.page](https://getanalytics.io/api/#analyticspage), [analytics.track](https://getanalytics.io/api/#analyticstrack), or [analytics.identify](https://getanalytics.io/api/#analyticsidentify) are called.
After initializing `analytics` with the `googleAnalytics` plugin, data will be sent into Google Analytics whenever [analytics.identify](https://getanalytics.io/api/#analyticsidentify), [analytics.page](https://getanalytics.io/api/#analyticspage), or [analytics.track](https://getanalytics.io/api/#analyticstrack) are called.

@@ -100,3 +87,3 @@ See [additional implementation examples](#additional-examples) for more details on using in your project.

The `@analytics/google-analytics` package works in [the browser](#browser-usage) and [server-side in Node.js](#server-side-usage)
The `@analytics/google-analytics` package works in [the browser](#browser-usage)

@@ -107,5 +94,5 @@ ## Browser usage

- **[analytics.identify](https://getanalytics.io/api/#analyticsidentify)** - Identify visitors and send details to Google Analytics
- **[analytics.page](https://getanalytics.io/api/#analyticspage)** - Sends page views into Google Analytics
- **[analytics.track](https://getanalytics.io/api/#analyticstrack)** - Track custom events and send to Google Analytics
- **[analytics.identify](https://getanalytics.io/api/#analyticsidentify)** - Identify visitors and send details to Google Analytics

@@ -122,3 +109,3 @@ ### Browser API

googleAnalytics({
trackingId: 'UA-1234567'
measurementIds: ['UA-1234567']
})

@@ -134,45 +121,15 @@ ]

|:---------------------------|:-----------|
| `trackingId` <br/>**required** - string| Google Analytics site tracking Id |
| `measurementIds` <br/>**required** - string| Google Analytics MEASUREMENT IDs |
| `debug` <br/>_optional_ - boolean| Enable Google Analytics debug mode |
| `anonymizeIp` <br/>_optional_ - boolean| Enable [Anonymizing IP addresses](https://bit.ly/3c660Rd) sent to Google Analytics. [See details below](#anonymize-visitor-ips) |
| `customDimensions` <br/>_optional_ - object| Map [Custom dimensions](https://bit.ly/3c5de88) to send extra information to Google Analytics. [See details below](#using-ga-custom-dimensions) |
| `resetCustomDimensionsOnPage` <br/>_optional_ - object| Reset custom dimensions by key on analytics.page() calls. Useful for single page apps. |
| `setCustomDimensionsToPage` <br/>_optional_ - boolean| Mapped dimensions will be set to the page & sent as properties of all subsequent events on that page. If false, analytics will only pass custom dimensions as part of individual events |
| `instanceName` <br/>_optional_ - string| Custom tracker name for google analytics. Use this if you need multiple googleAnalytics scripts loaded |
| `dataLayerName` <br/>_optional_ - string| The optional name for dataLayer object. Defaults to ga4DataLayer. |
| `gtagName` <br/>_optional_ - string| The optional name for dataLayer object. Defaults to ga4DataLayer. |
| `gtagConfig.anonymize_ip` <br/>_optional_ - boolean| Enable [Anonymizing IP addresses](https://bit.ly/3c660Rd) sent to Google Analytics. [See details below](#anonymize-visitor-ips) |
| `gtagConfig.cookie_domain` <br/>_optional_ - object| Additional cookie properties for configuring the [ga cookie](https://developers.google.com/analytics/devguides/collection/analyticsjs/cookies-user-id#configuring_cookie_field_settings) |
| `gtagConfig.cookie_expires` <br/>_optional_ - object| Additional cookie properties for configuring the [ga cookie](https://developers.google.com/analytics/devguides/collection/analyticsjs/cookies-user-id#configuring_cookie_field_settings) |
| `gtagConfig.cookie_prefix` <br/>_optional_ - object| Additional cookie properties for configuring the [ga cookie](https://developers.google.com/analytics/devguides/collection/analyticsjs/cookies-user-id#configuring_cookie_field_settings) |
| `gtagConfig.cookie_update` <br/>_optional_ - object| Additional cookie properties for configuring the [ga cookie](https://developers.google.com/analytics/devguides/collection/analyticsjs/cookies-user-id#configuring_cookie_field_settings) |
| `gtagConfig.cookie_flags` <br/>_optional_ - object| Additional cookie properties for configuring the [ga cookie](https://developers.google.com/analytics/devguides/collection/analyticsjs/cookies-user-id#configuring_cookie_field_settings) |
| `customScriptSrc` <br/>_optional_ - string| Custom URL for google analytics script, if proxying calls |
| `cookieConfig` <br/>_optional_ - object| Additional cookie properties for configuring the [ga cookie](https://developers.google.com/analytics/devguides/collection/analyticsjs/cookies-user-id#configuring_cookie_field_settings) |
| `tasks` <br/>_optional_ - object| [Set custom google analytic tasks](https://developers.google.com/analytics/devguides/collection/analyticsjs/tasks) |
## Server-side usage
The Google Analytics server-side node.js plugin works with these analytic api methods:
- **[analytics.page](https://getanalytics.io/api/#analyticspage)** - Sends page views into Google Analytics
- **[analytics.track](https://getanalytics.io/api/#analyticstrack)** - Track custom events and send to Google Analytics
- **[analytics.identify](https://getanalytics.io/api/#analyticsidentify)** - Identify visitors and send details to Google Analytics
### Server-side API
```js
import Analytics from 'analytics'
import googleAnalytics from '@analytics/google-analytics'
const analytics = Analytics({
app: 'awesome-app',
plugins: [
googleAnalytics({
trackingId: '123-xyz'
})
]
})
```
### Configuration options for server-side
| Option | description |
|:---------------------------|:-----------|
| `trackingId` <br/>**required** - string| Google Analytics site tracking Id |
## Additional examples

@@ -183,75 +140,2 @@

<details>
<summary>Server-side ES6</summary>
```js
import Analytics from 'analytics'
import googleAnalytics from '@analytics/google-analytics'
const analytics = Analytics({
app: 'awesome-app',
plugins: [
googleAnalytics({
trackingId: '123-xyz'
})
// ...other plugins
]
})
/* Track a page view */
analytics.page()
/* Track a custom event */
analytics.track('cartCheckout', {
item: 'pink socks',
price: 20
})
/* Identify a visitor */
analytics.identify('user-id-xyz', {
firstName: 'bill',
lastName: 'murray'
})
```
</details>
<details>
<summary>Server-side Node.js with common JS</summary>
If using node, you will want to import the `.default`
```js
const analyticsLib = require('analytics').default
const googleAnalytics = require('@analytics/google-analytics').default
const analytics = analyticsLib({
app: 'my-app-name',
plugins: [
googleAnalytics({
trackingId: '123-xyz'
})
]
})
/* Track a page view */
analytics.page()
/* Track a custom event */
analytics.track('cartCheckout', {
item: 'pink socks',
price: 20
})
/* Identify a visitor */
analytics.identify('user-id-xyz', {
firstName: 'bill',
lastName: 'murray'
})
```
</details>
<details>
<summary>Using in HTML</summary>

@@ -274,3 +158,3 @@

analyticsGa.init({
trackingId: 'UA-1234567'
measurementIds: ['UA-1234567']
})

@@ -284,6 +168,5 @@ ]

/* Track a custom event */
analytics.track('playedVideo', {
category: 'Videos',
label: 'Fall Campaign',
value: 42
analytics.track('cartCheckout', {
item: 'pink socks',
price: 20
})

@@ -331,3 +214,3 @@

analyticsGa({
trackingId: 'UA-1234567'
measurementIds: ['UA-1234567']
})

@@ -342,6 +225,5 @@ // ... add any other third party analytics plugins

/* Track a custom event */
analytics.track('playedVideo', {
category: 'Videos',
label: 'Fall Campaign',
value: 42
analytics.track('cartCheckout', {
item: 'pink socks',
price: 20
})

@@ -368,302 +250,10 @@

## Fix "double page views"
## Anonymize Visitor IPs
Google analytics 4 sometimes automatically sends a page view for single page applications. To disable this you will need to go into the settings of your stream and click into "enhanced measurement" section and uncheck the "Page changes based on browser history events" setting. This will make sure only `analytics.page()` calls will send page views to Google analytics v4.
Google analytics allows you to [anonymize visitor IP addresses](https://developers.google.com/analytics/devguides/collection/analyticsjs/ip-anonymization).
<img width="701" alt="disable-auto-spa-pageviews" src="https://user-images.githubusercontent.com/532272/180305960-b6172469-f3ee-4d48-85fd-3c4d0a07e777.png">
To anonymize the IP addresses of your visitors set the `anonymizeIp` configuration option.
## Legacy Google analytics v3
```js
import Analytics from 'analytics'
import googleAnalytics from '@analytics/google-analytics'
/* initialize analytics */
const analytics = Analytics({
app: 'awesome-app',
plugins: [
googleAnalytics({
trackingId: 'UA-1223141231',
/* Anonymize the IP addresses */
anonymizeIp: true
}),
]
})
```
## Customizing event payloads
To send tracking custom events to Google Analytics with `eventLabel`, `eventCategory`, and `eventValue` [fields](https://developers.google.com/analytics/devguides/collection/analyticsjs/events#event_fields), add the `label`, `category`, and `value` keys to the event properties.
```js
analytics.track('play', {
category: 'Videos',
label: 'Fall Campaign',
value: 42
})
```
## Using GA Custom Dimensions
To use [Google Analytics custom dimensions](https://developers.google.com/analytics/devguides/collection/analyticsjs/custom-dims-mets), use the `customDimensions` configuration option and map the values to the custom dimension slots.
### Set the "customDimensions" option
When initializing `analytics`, make sure you set `customDimensions` and map your values.
```js
import Analytics from 'analytics'
import googleAnalytics from '@analytics/google-analytics'
/* initialize analytics */
const analytics = Analytics({
app: 'awesome-app',
plugins: [
googleAnalytics({
trackingId: 'UA-1223141231',
/* Map your Google Analytics custom dimensions here */
customDimensions: {
baz: 'dimension1',
foo: 'dimension2',
flam: 'dimension3',
},
}),
]
})
```
The above config will map **baz** to `dimension1`, **foo** to `dimension2`, and **flam** to `dimension3`
When `track`, `page`, or `identify` calls are made, the mapped values will automatically set to Google Analytics custom dimensions.
```js
/* Tracking example */
analytics.track('buttonClicked', {
baz: 'hello', // baz is mapped to GA custom dimension "dimension1"
foo: 'cool' // foo is mapped to GA custom dimension "dimension2"
})
```
Under the hood, analytics automatically sets the custom dimensions in Google Analytics like so:
```js
window.ga('set', {dimension1: 'hello', dimension2: 'cool'})
```
This also works with page & identify calls.
```js
/* Identify example */
analytics.identify('user123', {
flam: 'wow' // flam is mapped to GA custom dimension "dimension3"
})
// This is mapped to window.ga('set', { dimension3: 'wow' })
```
## Using multiple instances
While not advised, it's possible to use [multiple Google Analytics instances](https://developers.google.com/analytics/devguides/collection/analyticsjs/creating-trackers#working_with_multiple_trackers) on a single site.
To use more than one google analytics instance in an app use the `instanceName` config field and make sure to override the default plugin `name`.
Here is an example of using 2 Google Analytics instances in an app.
```js
import Analytics from 'analytics'
import googleAnalytics from '@analytics/google-analytics'
// Normal google analytics instance
const instanceOne = googleAnalytics({
trackingId: '123-xyz',
})
// Second google analytics instance with override for 'name' field of the plugin
const instanceTwo = {
// initialize the 2nd instance with 'instanceName' field set
...googleAnalytics({
trackingId: '567-abc',
instanceName: 'two'
}),
// change 'name' plugin to avoid namespace collisions
...{
name: 'google-analytics-two'
}
}
/* Object.assign example
const instanceTwo = Object.assign({}, googleAnalytics({
trackingId: '567-abc',
instanceName: 'two'
}), {
name: 'google-analytics-two'
}
}) */
const analytics = Analytics({
app: 'awesome-app',
plugins: [
// Instance 1 of Google Analytics
instanceOne,
// Instance 2 of Google Analytics
instanceTwo
]
})
```
Using the above configuration all tracking, page views, and identify calls will flow into both Google Analytics accounts.
## Custom Proxy Endpoint
In specific [scenarios](https://www.freecodecamp.org/news/save-your-analytics-from-content-blockers-7ee08c6ec7ee/), you might want to load your own version of google analytics to send requests to a proxy.
To do this, you can add the `customScriptSrc` option pointing to your custom Google Analytics script.
```js
import Analytics from 'analytics'
import googleAnalytics from '@analytics/google-analytics'
const analytics = Analytics({
app: 'awesome-app',
plugins: [
googleAnalytics({
trackingId: '123-xyz',
customScriptSrc: 'https://my-url.com/to-custom-ga.js'
})
]
})
```
If using a proxied endpoint, it is recommended to combine this technique with the [do-not-track](https://getanalytics.io/plugins/do-not-track/) plugin to ensure website visitors privacy.
## Electron Apps & Browser Extensions
Electron apps bundle and serve their code from the `file://` extension. Likewise, browser extensions serve files from `chrome-extension://`. This causes issues like [this](https://github.com/DavidWells/analytics/issues/77) & [this](https://github.com/DavidWells/analytics/issues/72#issuecomment-681320271) with Google Analytics.
To fix chrome extensions, use the `tasks` configuration and set `checkProtocolTask` to `null`.
To fix electron apps, use the `tasks` configuration option described below and set `checkProtocolTask`, `checkStorageTask`, & `historyImportTask` to `null`.
Here is an example:
```js
import Analytics from 'analytics'
import googleAnalytics from '@analytics/google-analytics'
/* initialize analytics and load plugins */
const analytics = Analytics({
app: 'my-app',
plugins: [
googleAnalytics({
trackingId: '123-xyz',
// Override or disable GA Tasks https://bit.ly/31Xetmg
tasks: {
// Set checkProtocolTask, checkStorageTask, & historyImportTask for electron apps
checkProtocolTask: null,
checkStorageTask: null,
historyImportTask: null,
}
}),
]
})
```
## Custom GA Tasks
In specific scenarios, you might need to disable or alter the [default Google Analytic Tasks](https://bit.ly/31Xetmg).
For example, you might want to cancel a request or enrich it. You can do this via [analytics plugins](https://getanalytics.io/plugins/writing-plugins/) or use the `tasks` config option on GA plugin for access to the `tracker` instance for GA only.
The tasks that can be hooked into are listed below & in the [GA task docs](https://bit.ly/31Xetmg)
- `customTask` By default, this task does nothing. Override it to provide custom behavior.
- `previewTask` Aborts the request if the page is only being rendered to generate a 'Top Sites' thumbnail for Safari.
- `checkProtocolTask` Aborts the request if the page protocol is not http or https.
- `validationTask` Aborts the request if required fields are missing or invalid.
- `checkStorageTask` Aborts the request if the tracker is configured to use cookies but the user's browser has cookies disabled.
- `historyImportTask` Imports info from ga.js/urchin.js cookies to preserve history when a site migrates to Universal Analytics.
- `samplerTask` Samples out visitors based on the sampleRate setting for this tracker.
- `buildHitTask` Builds a measurement protocol request string and stores it in the hitPayload field.
- `sendHitTask` Transmits the measurement protocol request stored in the hitPayload field to Google Analytics servers.
- `timingTask` Automatically generates a site speed timing hit based on the siteSpeedSampleRate setting for this tracker.
- `displayFeaturesTask` Sends an additional hit if display features is enabled & a previous hit has not been sent within the timeout period set by the advertising features cookie (_gat).
```js
import Analytics from 'analytics'
import googleAnalytics from '@analytics/google-analytics'
/* initialize analytics and load plugins */
const analytics = Analytics({
app: 'cool-app',
plugins: [
googleAnalytics({
trackingId: '123-xyz',
// Override or disable GA Tasks https://bit.ly/31Xetmg
tasks: {
// https://developers.google.com/analytics/devguides/collection/analyticsjs/tasks#adding_to_a_task
sendHitTask: function (tracker) {
// Save original Task
var originalTask = tracker.get('sendHitTask')
// Modifies sendHitTask to send a copy of the request to a local server after
tracker.set('sendHitTask', function (model) {
// 1. Send the normal request to www.google-analytics.com/collect.
originalTask(model);
// 2. Send to local server
var xhr = new XMLHttpRequest();
xhr.open('POST', '/localhits', true);
xhr.send(model.get('hitPayload'));
})
},
// https://developers.google.com/analytics/devguides/collection/analyticsjs/tasks#aborting_task_processing
buildHitTask: (tracker) => {
// Save original Task
const originalBuildHitTask = tracker.get('buildHitTask')
// Set custom buildHitTask with abort
tracker.set('buildHitTask', function (model) {
if (document.cookie.match(/testing=true/)) {
throw new Error('Aborted tracking for test user.')
}
originalBuildHitTask(model);
})
},
}
}),
]
})
```
## Cookie Config
Some situations require changing the [cookie properties](https://developers.google.com/analytics/devguides/collection/analyticsjs/cookies-user-id#configuring_cookie_field_settings) of the Google Analytics cookie itself.
The GA Cookie fields that are available are:
| Field Name | Value Type | Default value | Description |
|:---------------------------|:-----------|:------------------|:---------------------|
| `cookieName`| text| _ga | Name of the cookie used to store analytics data |
| `cookieDomain`| text| The result of the following JavaScript expression: *document.location.hostname* | Specifies the domain used to store the analytics cookie. Setting this to 'none' sets the cookie without specifying a domain. |
| `cookieExpires`| integer| *63072000* (two years, in seconds) | Specifies the cookie expiration, in seconds. |
| `cookieUpdate`| boolean| true | When cookieUpdate is set to true (the default value), analytics.js will update cookies on each page load. This will update the cookie expiration to be set relative to the most recent visit to the site. |
| `cookieFlags`| text | | Specifies additional flags to append to the cookie. Flags must be separated by semicolons. |
You can add these properties in the `cookieConfig` on the plugin config.
```js
import Analytics from 'analytics'
import googleAnalytics from '@analytics/google-analytics'
const analytics = Analytics({
app: 'awesome-app',
plugins: [
googleAnalytics({
trackingId: 'UA-1234567',
cookieConfig: {
cookieName: 'gaCookie',
cookieDomain: 'blog.example.co.uk',
cookieExpires: 60 * 60 * 24 * 28, // Time in seconds.
cookieUpdate: 'false',
cookieFlags: 'SameSite=None; Secure',
}
})
]
})
```
For the older version of google analytics please see the `@analytics/google-analytics-v3` package at https://www.npmjs.com/package/@analytics/google-analytics-v3
SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc