Socket
Socket
Sign inDemoInstall

angular-google-analytics

Package Overview
Dependencies
Maintainers
2
Versions
15
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

angular-google-analytics - npm Package Compare versions

Comparing version 1.1.3 to 1.1.4

test/unit/debug-mode.js

9

bower.json

@@ -21,8 +21,3 @@ {

"homepage": "https://github.com/revolunet/angular-google-analytics",
"license": [
{
"type": "MIT",
"url": "http://revolunet.mit-license.org"
}
],
"license": "MIT",
"repository": {

@@ -32,3 +27,3 @@ "type": "git",

},
"main": "./dist/angular-google-analytics.js",
"main": "./dist/angular-google-analytics.min.js",
"dependencies": {

@@ -35,0 +30,0 @@ "angular": ">=1"

/**
* Angular Google Analytics - Easy tracking for your AngularJS application
* @version v1.1.3 - 2015-10-26
* @version v1.1.4 - 2015-12-11
* @link http://github.com/revolunet/angular-google-analytics

@@ -9,4 +9,14 @@ * @author Julien Bouquillon <julien@revolunet.com> (https://github.com/revolunet)

*/
(function (window, document, angular, undefined) {
/* globals define */
(function (root, factory) {
'use strict';
if (typeof define === 'function' && define.amd) {
define(['angular'], factory);
} else if (typeof module === 'object' && module.exports) {
module.exports = factory(require('angular'));
} else {
factory(root.angular);
}
}(this, function (angular, undefined) {
'use strict';
angular.module('angular-google-analytics', [])

@@ -21,2 +31,3 @@ .provider('Analytics', function () {

currency = 'USD',
debugMode = false,
delayScriptTag = false,

@@ -36,2 +47,3 @@ displayFeatures = false,

testMode = false,
traceDebuggingMode = false,
trackPrefix = '',

@@ -63,4 +75,4 @@ trackRoutes = true,

this.trackPages = function (doTrack) {
trackRoutes = doTrack;
this.trackPages = function (val) {
trackRoutes = !!val;
return this;

@@ -176,2 +188,8 @@ };

this.enterDebugMode = function (enableTraceDebugging) {
debugMode = true;
traceDebuggingMode = !!enableTraceDebugging;
return this;
};
/**

@@ -385,2 +403,3 @@ * Public Service

var document = $document[0];
var scriptSource;

@@ -396,3 +415,2 @@ if (displayFeatures === true) {

(function () {
var document = $document[0];
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;

@@ -422,4 +440,5 @@ ga.src = scriptSource;

var document = $document[0];
var protocol = hybridMobileSupport === true ? 'https:' : '';
var scriptSource = protocol + '//www.google-analytics.com/analytics.js';
var scriptSource = protocol + '//www.google-analytics.com/' + (debugMode ? 'analytics_debug.js' : 'analytics.js');
if (testMode !== true) {

@@ -440,2 +459,6 @@ // If not in test mode inject the Google Analytics tag

if (traceDebuggingMode) {
$window.ga_debug = { trace: true };
}
accounts.forEach(function (trackerObj) {

@@ -514,3 +537,3 @@ trackerObj.crossDomainLinker = isPropertyDefined('crossDomainLinker', trackerObj) ? trackerObj.crossDomainLinker : crossDomainLinker;

if (trackRoutes && !ignoreFirstPageLoad) {
_ga(generateCommandName('send', trackerObj), 'pageview', getUrl());
_ga(generateCommandName('send', trackerObj), 'pageview', trackPrefix + getUrl());
}

@@ -920,7 +943,8 @@ });

* @param action
* @param list
* @private
*/
this._trackCart = function (action) {
this._trackCart = function (action, listName) {
if (['add', 'remove'].indexOf(action) !== -1) {
this._setAction(action);
this._setAction(action, { list: listName });
this._trackEvent('UX', 'click', action + (action === 'add' ? ' to cart' : ' from cart'));

@@ -1029,2 +1053,3 @@ }

currency: currency,
debugMode: debugMode,
delayScriptTag: delayScriptTag,

@@ -1043,2 +1068,3 @@ displayFeatures: displayFeatures,

testMode: testMode,
traceDebuggingMode: traceDebuggingMode,
trackPrefix: trackPrefix,

@@ -1115,3 +1141,3 @@ trackRoutes: trackRoutes,

},
trackCart: function (action) {
trackCart: function (action, list) {
that._trackCart.apply(that, arguments);

@@ -1162,2 +1188,3 @@ },

}]);
})(window, document, window.angular);
return angular.module('angular-google-analytics');
}));
/**
* Angular Google Analytics - Easy tracking for your AngularJS application
* @version v1.1.3 - 2015-10-26
* @version v1.1.4 - 2015-12-11
* @link http://github.com/revolunet/angular-google-analytics

@@ -9,2 +9,2 @@ * @author Julien Bouquillon <julien@revolunet.com> (https://github.com/revolunet)

*/
!function(a,b,c,d){"use strict";c.module("angular-google-analytics",[]).provider("Analytics",function(){var e,f,g,h,i,j=!0,k="auto",l=!1,m=!1,n="USD",o=!1,p=!1,q=!1,r=!1,s=!1,t=!1,u=!1,v=!1,w=!1,x="$routeChangeSuccess",y=!1,z="",A=!0,B=!1;this.log=[],this.offlineQueue=[],this.setAccount=function(a){return e=c.isUndefined(a)||a===!1?d:c.isArray(a)?a:c.isObject(a)?[a]:[{tracker:a,trackEvent:!0}],this},this.trackPages=function(a){return A=a,this},this.trackPrefix=function(a){return z=a,this},this.setDomainName=function(a){return g=a,this},this.useDisplayFeatures=function(a){return p=!!a,this},this.useAnalytics=function(a){return j=!!a,this},this.useEnhancedLinkAttribution=function(a){return s=!!a,this},this.useCrossDomainLinker=function(a){return m=!!a,this},this.setCrossLinkDomains=function(a){return f=a,this},this.setPageEvent=function(a){return x=a,this},this.setCookieConfig=function(a){return k=a,this},this.useECommerce=function(a,b){return q=!!a,r=!!b,this},this.setCurrency=function(a){return n=a,this},this.setRemoveRegExp=function(a){return a instanceof RegExp&&(i=a),this},this.setExperimentId=function(a){return h=a,this},this.ignoreFirstPageLoad=function(a){return t=!!a,this},this.trackUrlParams=function(a){return B=!!a,this},this.setHybridMobileSupport=function(a){return v=!!a,this},this.startOffline=function(a){return w=!!a,w===!0&&this.delayScriptTag(!0),this},this.delayScriptTag=function(a){return o=!!a,this},this.logAllCalls=function(a){return u=!!a,this},this.enterTestMode=function(){return y=!0,this},this.$get=["$document","$location","$log","$rootScope","$window",function(C,D,E,F,G){var H=this,I=function(a,b){return c.isString(b)?b+"."+a:J("name",b)?b.name+"."+a:a},J=function(a,b){return c.isObject(b)&&c.isDefined(b[a])},K=function(a,b,c){return J(a,b)&&b[a]===c},L=function(){var a=B?D.url():D.path();return i?a.replace(i,""):a},M=function(){var a={utm_source:"campaignSource",utm_medium:"campaignMedium",utm_term:"campaignTerm",utm_content:"campaignContent",utm_campaign:"campaignName"},b={};return c.forEach(D.search(),function(d,e){var f=a[e];c.isDefined(f)&&(b[f]=d)}),b},N=function(a,b,c,d,e,f,g,h,i){var j={};return a&&(j.id=a),b&&(j.affiliation=b),c&&(j.revenue=c),d&&(j.tax=d),e&&(j.shipping=e),f&&(j.coupon=f),g&&(j.list=g),h&&(j.step=h),i&&(j.option=i),j},O=function(a){!j&&G._gaq&&"function"==typeof a&&a()},P=function(){var a=Array.prototype.slice.call(arguments);return w===!0?void H.offlineQueue.push([P,a]):(G._gaq||(G._gaq=[]),u===!0&&H._log.apply(H,a),void G._gaq.push(a))},Q=function(a){j&&G.ga&&"function"==typeof a&&a()},R=function(){var a=Array.prototype.slice.call(arguments);return w===!0?void H.offlineQueue.push([R,a]):"function"!=typeof G.ga?void H._log("warn","ga function not set on window"):(u===!0&&H._log.apply(H,a),void G.ga.apply(null,a))},S=function(a){var b=Array.prototype.slice.call(arguments,1),c=b[0],d=[];return"function"==typeof a?e.forEach(function(b){a(b)&&d.push(b)}):d=e,0===d.length?void R.apply(H,b):void d.forEach(function(a){(!J("select",a)||"function"!=typeof a.select||a.select(b))&&(b[0]=I(c,a),R.apply(H,b))})};return this._log=function(){var a=Array.prototype.slice.call(arguments);if(a.length>0){if(a.length>1)switch(a[0]){case"debug":case"error":case"info":case"log":case"warn":E[a[0]](a.slice(1))}H.log.push(a)}},this._createScriptTag=function(){if(!e||e.length<1)return void H._log("warn","No account id set to create script tag");if(e.length>1&&(H._log("warn","Multiple trackers are not supported with ga.js. Using first tracker only"),e=e.slice(0,1)),l===!0)return void H._log("warn","ga.js or analytics.js script tag already created");P("_setAccount",e[0].tracker),g&&P("_setDomainName",g),s&&P("_require","inpage_linkid","//www.google-analytics.com/plugins/ga/inpage_linkid.js"),A&&!t&&(i?P("_trackPageview",L()):P("_trackPageview"));var a;return a=p===!0?("https:"===b.location.protocol?"https://":"http://")+"stats.g.doubleclick.net/dc.js":("https:"===b.location.protocol?"https://ssl":"http://www")+".google-analytics.com/ga.js",y!==!0?!function(){var b=C[0],c=b.createElement("script");c.type="text/javascript",c.async=!0,c.src=a;var d=b.getElementsByTagName("script")[0];d.parentNode.insertBefore(c,d)}():H._log("inject",a),l=!0,!0},this._createAnalyticsScriptTag=function(){if(!e)return void H._log("warn","No account id set to create analytics script tag");if(l===!0)return void H._log("warn","ga.js or analytics.js script tag already created");var d=v===!0?"https:":"",g=d+"//www.google-analytics.com/analytics.js";if(y!==!0?!function(a,b,c,d,e,f,g){a.GoogleAnalyticsObject=e,a[e]=a[e]||function(){(a[e].q=a[e].q||[]).push(arguments)},a[e].l=1*new Date,f=b.createElement(c),g=b.getElementsByTagName(c)[0],f.async=1,f.src=d,g.parentNode.insertBefore(f,g)}(a,b,"script",g,"ga"):("function"!=typeof G.ga&&(G.ga=function(){}),H._log("inject",g)),e.forEach(function(a){a.crossDomainLinker=J("crossDomainLinker",a)?a.crossDomainLinker:m,a.crossLinkDomains=J("crossLinkDomains",a)?a.crossLinkDomains:f,a.displayFeatures=J("displayFeatures",a)?a.displayFeatures:p,a.enhancedLinkAttribution=J("enhancedLinkAttribution",a)?a.enhancedLinkAttribution:s,a.set=J("set",a)?a.set:{},a.trackEcommerce=J("trackEcommerce",a)?a.trackEcommerce:q,a.trackEvent=J("trackEvent",a)?a.trackEvent:!1;var b={};J("fields",a)?b=a.fields:J("cookieConfig",a)?c.isString(a.cookieConfig)?b.cookieDomain=a.cookieConfig:b=a.cookieConfig:c.isString(k)?b.cookieDomain=k:k&&(b=k),a.crossDomainLinker===!0&&(b.allowLinker=!0),J("name",a)&&(b.name=a.name),a.fields=b,R("create",a.tracker,a.fields),v===!0&&R(I("set",a),"checkProtocolTask",null);for(var d in a.set)a.set.hasOwnProperty(d)&&R(I("set",a),d,a.set[d]);a.crossDomainLinker===!0&&(R(I("require",a),"linker"),c.isDefined(a.crossLinkDomains)&&R(I("linker:autoLink",a),a.crossLinkDomains)),a.displayFeatures&&R(I("require",a),"displayfeatures"),a.trackEcommerce&&(r?(R(I("require",a),"ec"),R(I("set",a),"&cu",n)):R(I("require",a),"ecommerce")),a.enhancedLinkAttribution&&R(I("require",a),"linkid"),A&&!t&&R(I("send",a),"pageview",L())}),h){var i=b.createElement("script"),j=b.getElementsByTagName("script")[0];i.src=d+"//www.google-analytics.com/cx/api.js?experiment="+h,j.parentNode.insertBefore(i,j)}return l=!0,!0},this._ecommerceEnabled=function(a,b){var c=q&&!r;return a===!0&&c===!1&&(q&&r?H._log("warn",b+" is not available when Enhanced Ecommerce is enabled with analytics.js"):H._log("warn","Ecommerce must be enabled to use "+b+" with analytics.js")),c},this._enhancedEcommerceEnabled=function(a,b){var c=q&&r;return a===!0&&c===!1&&H._log("warn","Enhanced Ecommerce must be enabled to use "+b+" with analytics.js"),c},this._trackPage=function(a,b,e){a=a?a:L(),b=b?b:C[0].title,O(function(){P("_set","title",b),P("_trackPageview",z+a)}),Q(function(){var f={page:z+a,title:b};c.extend(f,M()),c.isObject(e)&&c.extend(f,e),S(d,"send","pageview",f)})},this._trackEvent=function(a,b,d,e,f,g){O(function(){P("_trackEvent",a,b,d,e,!!f)}),Q(function(){var h={},i=function(a){return K("trackEvent",a,!0)};c.isDefined(f)&&(h.nonInteraction=!!f),c.isObject(g)&&c.extend(h,g),S(i,"send","event",a,b,d,e,h)})},this._addTrans=function(a,b,c,d,e,f,g,h,i){O(function(){P("_addTrans",a,b,c,d,e,f,g,h)}),Q(function(){if(H._ecommerceEnabled(!0,"addTrans")){var f=function(a){return K("trackEcommerce",a,!0)};S(f,"ecommerce:addTransaction",{id:a,affiliation:b,revenue:c,tax:d,shipping:e,currency:i||"USD"})}})},this._addItem=function(a,b,c,d,e,f){O(function(){P("_addItem",a,b,c,d,e,f)}),Q(function(){if(H._ecommerceEnabled(!0,"addItem")){var g=function(a){return K("trackEcommerce",a,!0)};S(g,"ecommerce:addItem",{id:a,name:c,sku:b,category:d,price:e,quantity:f})}})},this._trackTrans=function(){O(function(){P("_trackTrans")}),Q(function(){if(H._ecommerceEnabled(!0,"trackTrans")){var a=function(a){return K("trackEcommerce",a,!0)};S(a,"ecommerce:send")}})},this._clearTrans=function(){Q(function(){if(H._ecommerceEnabled(!0,"clearTrans")){var a=function(a){return K("trackEcommerce",a,!0)};S(a,"ecommerce:clear")}})},this._addProduct=function(a,b,d,e,f,g,h,i,j,k){O(function(){P("_addProduct",a,b,d,e,f,g,h,i,j)}),Q(function(){if(H._enhancedEcommerceEnabled(!0,"addProduct")){var l=function(a){return K("trackEcommerce",a,!0)},m={id:a,name:b,category:d,brand:e,variant:f,price:g,quantity:h,coupon:i,position:j};c.isObject(k)&&c.extend(m,k),S(l,"ec:addProduct",m)}})},this._addImpression=function(a,b,c,d,e,f,g,h){O(function(){P("_addImpression",a,b,c,d,e,f,g,h)}),Q(function(){if(H._enhancedEcommerceEnabled(!0,"addImpression")){var i=function(a){return K("trackEcommerce",a,!0)};S(i,"ec:addImpression",{id:a,name:b,category:e,brand:d,variant:f,list:c,position:g,price:h})}})},this._addPromo=function(a,b,c,d){O(function(){P("_addPromo",a,b,c,d)}),Q(function(){if(H._enhancedEcommerceEnabled(!0,"addPromo")){var e=function(a){return K("trackEcommerce",a,!0)};S(e,"ec:addPromo",{id:a,name:b,creative:c,position:d})}})},this._setAction=function(a,b){O(function(){P("_setAction",a,b)}),Q(function(){if(H._enhancedEcommerceEnabled(!0,"setAction")){var c=function(a){return K("trackEcommerce",a,!0)};S(c,"ec:setAction",a,b)}})},this._trackTransaction=function(a,b,c,d,e,f,g,h,i){this._setAction("purchase",N(a,b,c,d,e,f,g,h,i))},this._trackRefund=function(a){this._setAction("refund",N(a))},this._trackCheckOut=function(a,b){this._setAction("checkout",N(null,null,null,null,null,null,null,a,b))},this._trackDetail=function(){this._setAction("detail"),this._pageView()},this._trackCart=function(a){-1!==["add","remove"].indexOf(a)&&(this._setAction(a),this._trackEvent("UX","click",a+("add"===a?" to cart":" from cart")))},this._promoClick=function(a){this._setAction("promo_click"),this._trackEvent("Internal Promotions","click",a)},this._productClick=function(a){this._setAction("click",N(null,null,null,null,null,null,a,null,null)),this._trackEvent("UX","click",a)},this._pageView=function(a){Q(function(){R(I("send",a),"pageview")})},this._send=function(){var a=Array.prototype.slice.call(arguments);a.unshift("send"),Q(function(){R.apply(H,a)})},this._set=function(a,b,c){Q(function(){R(I("set",c),a,b)})},this._trackTimings=function(a,b,c,d){this._send("timing",a,b,c,d)},o||(j?this._createAnalyticsScriptTag():this._createScriptTag()),A&&F.$on(x,function(){H._trackPage()}),{log:H.log,offlineQueue:H.offlineQueue,configuration:{accounts:e,universalAnalytics:j,crossDomainLinker:m,crossLinkDomains:f,currency:n,delayScriptTag:o,displayFeatures:p,domainName:g,ecommerce:H._ecommerceEnabled(),enhancedEcommerce:H._enhancedEcommerceEnabled(),enhancedLinkAttribution:s,experimentId:h,hybridMobileSupport:v,ignoreFirstPageLoad:t,logAllCalls:u,pageEvent:x,removeRegExp:i,testMode:y,trackPrefix:z,trackRoutes:A,trackUrlParams:B},getUrl:L,setCookieConfig:H._setCookieConfig,getCookieConfig:function(){return k},createAnalyticsScriptTag:function(a){return a&&(k=a),H._createAnalyticsScriptTag()},createScriptTag:function(){return H._createScriptTag()},offline:function(a){if(a===!0&&w===!1&&(w=!0),a===!1&&w===!0)for(w=!1;H.offlineQueue.length>0;){var b=H.offlineQueue.shift();b[0].apply(H,b[1])}return w},trackPage:function(a,b,c){H._trackPage.apply(H,arguments)},trackEvent:function(a,b,c,d,e,f){H._trackEvent.apply(H,arguments)},addTrans:function(a,b,c,d,e,f,g,h,i){H._addTrans.apply(H,arguments)},addItem:function(a,b,c,d,e,f){H._addItem.apply(H,arguments)},trackTrans:function(){H._trackTrans.apply(H,arguments)},clearTrans:function(){H._clearTrans.apply(H,arguments)},addProduct:function(a,b,c,d,e,f,g,h,i,j){H._addProduct.apply(H,arguments)},addPromo:function(a,b,c,d){H._addPromo.apply(H,arguments)},addImpression:function(a,b,c,d,e,f,g,h){H._addImpression.apply(H,arguments)},productClick:function(a){H._productClick.apply(H,arguments)},promoClick:function(a){H._promoClick.apply(H,arguments)},trackDetail:function(){H._trackDetail.apply(H,arguments)},trackCart:function(a){H._trackCart.apply(H,arguments)},trackCheckout:function(a,b){H._trackCheckOut.apply(H,arguments)},trackTimings:function(a,b,c,d){H._trackTimings.apply(H,arguments)},trackTransaction:function(a,b,c,d,e,f,g,h,i){H._trackTransaction.apply(H,arguments)},setAction:function(a,b){H._setAction.apply(H,arguments)},pageView:function(){H._pageView.apply(H,arguments)},send:function(a){H._send.apply(H,arguments)},set:function(a,b,c){H._set.apply(H,arguments)}}}]}).directive("gaTrackEvent",["Analytics","$parse",function(a,b){return{restrict:"A",link:function(c,d,e){var f=b(e.gaTrackEvent);d.bind("click",function(){(!e.gaTrackEventIf||c.$eval(e.gaTrackEventIf))&&f.length>1&&a.trackEvent.apply(a,f(c))})}}}])}(window,document,window.angular);
!function(a,b){"use strict";"function"==typeof define&&define.amd?define(["angular"],b):"object"==typeof module&&module.exports?module.exports=b(require("angular")):b(a.angular)}(this,function(a,b){"use strict";return a.module("angular-google-analytics",[]).provider("Analytics",function(){var c,d,e,f,g,h=!0,i="auto",j=!1,k=!1,l="USD",m=!1,n=!1,o=!1,p=!1,q=!1,r=!1,s=!1,t=!1,u=!1,v=!1,w="$routeChangeSuccess",x=!1,y=!1,z="",A=!0,B=!1;this.log=[],this.offlineQueue=[],this.setAccount=function(d){return c=a.isUndefined(d)||d===!1?b:a.isArray(d)?d:a.isObject(d)?[d]:[{tracker:d,trackEvent:!0}],this},this.trackPages=function(a){return A=!!a,this},this.trackPrefix=function(a){return z=a,this},this.setDomainName=function(a){return e=a,this},this.useDisplayFeatures=function(a){return o=!!a,this},this.useAnalytics=function(a){return h=!!a,this},this.useEnhancedLinkAttribution=function(a){return r=!!a,this},this.useCrossDomainLinker=function(a){return k=!!a,this},this.setCrossLinkDomains=function(a){return d=a,this},this.setPageEvent=function(a){return w=a,this},this.setCookieConfig=function(a){return i=a,this},this.useECommerce=function(a,b){return p=!!a,q=!!b,this},this.setCurrency=function(a){return l=a,this},this.setRemoveRegExp=function(a){return a instanceof RegExp&&(g=a),this},this.setExperimentId=function(a){return f=a,this},this.ignoreFirstPageLoad=function(a){return s=!!a,this},this.trackUrlParams=function(a){return B=!!a,this},this.setHybridMobileSupport=function(a){return u=!!a,this},this.startOffline=function(a){return v=!!a,v===!0&&this.delayScriptTag(!0),this},this.delayScriptTag=function(a){return n=!!a,this},this.logAllCalls=function(a){return t=!!a,this},this.enterTestMode=function(){return x=!0,this},this.enterDebugMode=function(a){return m=!0,y=!!a,this},this.$get=["$document","$location","$log","$rootScope","$window",function(C,D,E,F,G){var H=this,I=function(b,c){return a.isString(c)?c+"."+b:J("name",c)?c.name+"."+b:b},J=function(b,c){return a.isObject(c)&&a.isDefined(c[b])},K=function(a,b,c){return J(a,b)&&b[a]===c},L=function(){var a=B?D.url():D.path();return g?a.replace(g,""):a},M=function(){var b={utm_source:"campaignSource",utm_medium:"campaignMedium",utm_term:"campaignTerm",utm_content:"campaignContent",utm_campaign:"campaignName"},c={};return a.forEach(D.search(),function(d,e){var f=b[e];a.isDefined(f)&&(c[f]=d)}),c},N=function(a,b,c,d,e,f,g,h,i){var j={};return a&&(j.id=a),b&&(j.affiliation=b),c&&(j.revenue=c),d&&(j.tax=d),e&&(j.shipping=e),f&&(j.coupon=f),g&&(j.list=g),h&&(j.step=h),i&&(j.option=i),j},O=function(a){!h&&G._gaq&&"function"==typeof a&&a()},P=function(){var a=Array.prototype.slice.call(arguments);return v===!0?void H.offlineQueue.push([P,a]):(G._gaq||(G._gaq=[]),t===!0&&H._log.apply(H,a),void G._gaq.push(a))},Q=function(a){h&&G.ga&&"function"==typeof a&&a()},R=function(){var a=Array.prototype.slice.call(arguments);return v===!0?void H.offlineQueue.push([R,a]):"function"!=typeof G.ga?void H._log("warn","ga function not set on window"):(t===!0&&H._log.apply(H,a),void G.ga.apply(null,a))},S=function(a){var b=Array.prototype.slice.call(arguments,1),d=b[0],e=[];return"function"==typeof a?c.forEach(function(b){a(b)&&e.push(b)}):e=c,0===e.length?void R.apply(H,b):void e.forEach(function(a){(!J("select",a)||"function"!=typeof a.select||a.select(b))&&(b[0]=I(d,a),R.apply(H,b))})};return this._log=function(){var a=Array.prototype.slice.call(arguments);if(a.length>0){if(a.length>1)switch(a[0]){case"debug":case"error":case"info":case"log":case"warn":E[a[0]](a.slice(1))}H.log.push(a)}},this._createScriptTag=function(){if(!c||c.length<1)return void H._log("warn","No account id set to create script tag");if(c.length>1&&(H._log("warn","Multiple trackers are not supported with ga.js. Using first tracker only"),c=c.slice(0,1)),j===!0)return void H._log("warn","ga.js or analytics.js script tag already created");P("_setAccount",c[0].tracker),e&&P("_setDomainName",e),r&&P("_require","inpage_linkid","//www.google-analytics.com/plugins/ga/inpage_linkid.js"),A&&!s&&(g?P("_trackPageview",L()):P("_trackPageview"));var a,b=C[0];return a=o===!0?("https:"===b.location.protocol?"https://":"http://")+"stats.g.doubleclick.net/dc.js":("https:"===b.location.protocol?"https://ssl":"http://www")+".google-analytics.com/ga.js",x!==!0?!function(){var c=b.createElement("script");c.type="text/javascript",c.async=!0,c.src=a;var d=b.getElementsByTagName("script")[0];d.parentNode.insertBefore(c,d)}():H._log("inject",a),j=!0,!0},this._createAnalyticsScriptTag=function(){if(!c)return void H._log("warn","No account id set to create analytics script tag");if(j===!0)return void H._log("warn","ga.js or analytics.js script tag already created");var b=C[0],e=u===!0?"https:":"",g=e+"//www.google-analytics.com/"+(m?"analytics_debug.js":"analytics.js");if(x!==!0?!function(a,b,c,d,e,f,g){a.GoogleAnalyticsObject=e,a[e]=a[e]||function(){(a[e].q=a[e].q||[]).push(arguments)},a[e].l=1*new Date,f=b.createElement(c),g=b.getElementsByTagName(c)[0],f.async=1,f.src=d,g.parentNode.insertBefore(f,g)}(window,b,"script",g,"ga"):("function"!=typeof G.ga&&(G.ga=function(){}),H._log("inject",g)),y&&(G.ga_debug={trace:!0}),c.forEach(function(b){b.crossDomainLinker=J("crossDomainLinker",b)?b.crossDomainLinker:k,b.crossLinkDomains=J("crossLinkDomains",b)?b.crossLinkDomains:d,b.displayFeatures=J("displayFeatures",b)?b.displayFeatures:o,b.enhancedLinkAttribution=J("enhancedLinkAttribution",b)?b.enhancedLinkAttribution:r,b.set=J("set",b)?b.set:{},b.trackEcommerce=J("trackEcommerce",b)?b.trackEcommerce:p,b.trackEvent=J("trackEvent",b)?b.trackEvent:!1;var c={};J("fields",b)?c=b.fields:J("cookieConfig",b)?a.isString(b.cookieConfig)?c.cookieDomain=b.cookieConfig:c=b.cookieConfig:a.isString(i)?c.cookieDomain=i:i&&(c=i),b.crossDomainLinker===!0&&(c.allowLinker=!0),J("name",b)&&(c.name=b.name),b.fields=c,R("create",b.tracker,b.fields),u===!0&&R(I("set",b),"checkProtocolTask",null);for(var e in b.set)b.set.hasOwnProperty(e)&&R(I("set",b),e,b.set[e]);b.crossDomainLinker===!0&&(R(I("require",b),"linker"),a.isDefined(b.crossLinkDomains)&&R(I("linker:autoLink",b),b.crossLinkDomains)),b.displayFeatures&&R(I("require",b),"displayfeatures"),b.trackEcommerce&&(q?(R(I("require",b),"ec"),R(I("set",b),"&cu",l)):R(I("require",b),"ecommerce")),b.enhancedLinkAttribution&&R(I("require",b),"linkid"),A&&!s&&R(I("send",b),"pageview",z+L())}),f){var h=b.createElement("script"),n=b.getElementsByTagName("script")[0];h.src=e+"//www.google-analytics.com/cx/api.js?experiment="+f,n.parentNode.insertBefore(h,n)}return j=!0,!0},this._ecommerceEnabled=function(a,b){var c=p&&!q;return a===!0&&c===!1&&(p&&q?H._log("warn",b+" is not available when Enhanced Ecommerce is enabled with analytics.js"):H._log("warn","Ecommerce must be enabled to use "+b+" with analytics.js")),c},this._enhancedEcommerceEnabled=function(a,b){var c=p&&q;return a===!0&&c===!1&&H._log("warn","Enhanced Ecommerce must be enabled to use "+b+" with analytics.js"),c},this._trackPage=function(c,d,e){c=c?c:L(),d=d?d:C[0].title,O(function(){P("_set","title",d),P("_trackPageview",z+c)}),Q(function(){var f={page:z+c,title:d};a.extend(f,M()),a.isObject(e)&&a.extend(f,e),S(b,"send","pageview",f)})},this._trackEvent=function(b,c,d,e,f,g){O(function(){P("_trackEvent",b,c,d,e,!!f)}),Q(function(){var h={},i=function(a){return K("trackEvent",a,!0)};a.isDefined(f)&&(h.nonInteraction=!!f),a.isObject(g)&&a.extend(h,g),S(i,"send","event",b,c,d,e,h)})},this._addTrans=function(a,b,c,d,e,f,g,h,i){O(function(){P("_addTrans",a,b,c,d,e,f,g,h)}),Q(function(){if(H._ecommerceEnabled(!0,"addTrans")){var f=function(a){return K("trackEcommerce",a,!0)};S(f,"ecommerce:addTransaction",{id:a,affiliation:b,revenue:c,tax:d,shipping:e,currency:i||"USD"})}})},this._addItem=function(a,b,c,d,e,f){O(function(){P("_addItem",a,b,c,d,e,f)}),Q(function(){if(H._ecommerceEnabled(!0,"addItem")){var g=function(a){return K("trackEcommerce",a,!0)};S(g,"ecommerce:addItem",{id:a,name:c,sku:b,category:d,price:e,quantity:f})}})},this._trackTrans=function(){O(function(){P("_trackTrans")}),Q(function(){if(H._ecommerceEnabled(!0,"trackTrans")){var a=function(a){return K("trackEcommerce",a,!0)};S(a,"ecommerce:send")}})},this._clearTrans=function(){Q(function(){if(H._ecommerceEnabled(!0,"clearTrans")){var a=function(a){return K("trackEcommerce",a,!0)};S(a,"ecommerce:clear")}})},this._addProduct=function(b,c,d,e,f,g,h,i,j,k){O(function(){P("_addProduct",b,c,d,e,f,g,h,i,j)}),Q(function(){if(H._enhancedEcommerceEnabled(!0,"addProduct")){var l=function(a){return K("trackEcommerce",a,!0)},m={id:b,name:c,category:d,brand:e,variant:f,price:g,quantity:h,coupon:i,position:j};a.isObject(k)&&a.extend(m,k),S(l,"ec:addProduct",m)}})},this._addImpression=function(a,b,c,d,e,f,g,h){O(function(){P("_addImpression",a,b,c,d,e,f,g,h)}),Q(function(){if(H._enhancedEcommerceEnabled(!0,"addImpression")){var i=function(a){return K("trackEcommerce",a,!0)};S(i,"ec:addImpression",{id:a,name:b,category:e,brand:d,variant:f,list:c,position:g,price:h})}})},this._addPromo=function(a,b,c,d){O(function(){P("_addPromo",a,b,c,d)}),Q(function(){if(H._enhancedEcommerceEnabled(!0,"addPromo")){var e=function(a){return K("trackEcommerce",a,!0)};S(e,"ec:addPromo",{id:a,name:b,creative:c,position:d})}})},this._setAction=function(a,b){O(function(){P("_setAction",a,b)}),Q(function(){if(H._enhancedEcommerceEnabled(!0,"setAction")){var c=function(a){return K("trackEcommerce",a,!0)};S(c,"ec:setAction",a,b)}})},this._trackTransaction=function(a,b,c,d,e,f,g,h,i){this._setAction("purchase",N(a,b,c,d,e,f,g,h,i))},this._trackRefund=function(a){this._setAction("refund",N(a))},this._trackCheckOut=function(a,b){this._setAction("checkout",N(null,null,null,null,null,null,null,a,b))},this._trackDetail=function(){this._setAction("detail"),this._pageView()},this._trackCart=function(a,b){-1!==["add","remove"].indexOf(a)&&(this._setAction(a,{list:b}),this._trackEvent("UX","click",a+("add"===a?" to cart":" from cart")))},this._promoClick=function(a){this._setAction("promo_click"),this._trackEvent("Internal Promotions","click",a)},this._productClick=function(a){this._setAction("click",N(null,null,null,null,null,null,a,null,null)),this._trackEvent("UX","click",a)},this._pageView=function(a){Q(function(){R(I("send",a),"pageview")})},this._send=function(){var a=Array.prototype.slice.call(arguments);a.unshift("send"),Q(function(){R.apply(H,a)})},this._set=function(a,b,c){Q(function(){R(I("set",c),a,b)})},this._trackTimings=function(a,b,c,d){this._send("timing",a,b,c,d)},n||(h?this._createAnalyticsScriptTag():this._createScriptTag()),A&&F.$on(w,function(){H._trackPage()}),{log:H.log,offlineQueue:H.offlineQueue,configuration:{accounts:c,universalAnalytics:h,crossDomainLinker:k,crossLinkDomains:d,currency:l,debugMode:m,delayScriptTag:n,displayFeatures:o,domainName:e,ecommerce:H._ecommerceEnabled(),enhancedEcommerce:H._enhancedEcommerceEnabled(),enhancedLinkAttribution:r,experimentId:f,hybridMobileSupport:u,ignoreFirstPageLoad:s,logAllCalls:t,pageEvent:w,removeRegExp:g,testMode:x,traceDebuggingMode:y,trackPrefix:z,trackRoutes:A,trackUrlParams:B},getUrl:L,setCookieConfig:H._setCookieConfig,getCookieConfig:function(){return i},createAnalyticsScriptTag:function(a){return a&&(i=a),H._createAnalyticsScriptTag()},createScriptTag:function(){return H._createScriptTag()},offline:function(a){if(a===!0&&v===!1&&(v=!0),a===!1&&v===!0)for(v=!1;H.offlineQueue.length>0;){var b=H.offlineQueue.shift();b[0].apply(H,b[1])}return v},trackPage:function(a,b,c){H._trackPage.apply(H,arguments)},trackEvent:function(a,b,c,d,e,f){H._trackEvent.apply(H,arguments)},addTrans:function(a,b,c,d,e,f,g,h,i){H._addTrans.apply(H,arguments)},addItem:function(a,b,c,d,e,f){H._addItem.apply(H,arguments)},trackTrans:function(){H._trackTrans.apply(H,arguments)},clearTrans:function(){H._clearTrans.apply(H,arguments)},addProduct:function(a,b,c,d,e,f,g,h,i,j){H._addProduct.apply(H,arguments)},addPromo:function(a,b,c,d){H._addPromo.apply(H,arguments)},addImpression:function(a,b,c,d,e,f,g,h){H._addImpression.apply(H,arguments)},productClick:function(a){H._productClick.apply(H,arguments)},promoClick:function(a){H._promoClick.apply(H,arguments)},trackDetail:function(){H._trackDetail.apply(H,arguments)},trackCart:function(a,b){H._trackCart.apply(H,arguments)},trackCheckout:function(a,b){H._trackCheckOut.apply(H,arguments)},trackTimings:function(a,b,c,d){H._trackTimings.apply(H,arguments)},trackTransaction:function(a,b,c,d,e,f,g,h,i){H._trackTransaction.apply(H,arguments)},setAction:function(a,b){H._setAction.apply(H,arguments)},pageView:function(){H._pageView.apply(H,arguments)},send:function(a){H._send.apply(H,arguments)},set:function(a,b,c){H._set.apply(H,arguments)}}}]}).directive("gaTrackEvent",["Analytics","$parse",function(a,b){return{restrict:"A",link:function(c,d,e){var f=b(e.gaTrackEvent);d.bind("click",function(){(!e.gaTrackEventIf||c.$eval(e.gaTrackEventIf))&&f.length>1&&a.trackEvent.apply(a,f(c))})}}}]),a.module("angular-google-analytics")});

@@ -26,3 +26,3 @@ /* global require, module */

dist: {
src: ['src/*.js'],
src: ['index.js'],
dest: '<%= dirs.dest %>/<%= pkg.name %>.js'

@@ -40,17 +40,7 @@ }

},
changelog: {
options: {
dest: 'CHANGELOG.md',
versionFile: 'package.json'
}
},
stage: {
options: {
files: ['CHANGELOG.md']
}
},
stage: {},
release: {
options: {
commitMessage: '<%= version %>',
tagName: 'v<%= version %>',
tagName: '<%= version %>',
file: 'package.json',

@@ -64,3 +54,3 @@ push: false,

jshint: {
files: ['Gruntfile.js', 'src/*.js', 'test/unit/*.js'],
files: ['Gruntfile.js', 'index.js', 'test/*.js', 'test/unit/*.js'],
options: {

@@ -88,6 +78,2 @@ curly: true,

},
// watch: {
// files: '<config:jshint.files>',
// tasks: 'default'
// },
karma: {

@@ -120,8 +106,2 @@ test: {

// Load the plugin that provides the "watch" task.
//grunt.loadNpmTasks('grunt-contrib-watch');
grunt.loadNpmTasks('grunt-release');
grunt.loadNpmTasks('grunt-conventional-changelog');
grunt.registerTask('stage', 'git add files before running the release task', function () {

@@ -135,4 +115,2 @@ var files = this.options().files;

grunt.renameTask('release', 'originalRelease');
// Default task.

@@ -151,3 +129,3 @@ grunt.registerTask('default', ['test']);

// release task
// Release task.
grunt.registerTask('release', ['build']);

@@ -154,0 +132,0 @@

@@ -1,2 +0,1167 @@

require('./src/angular-google-analytics');
module.exports = 'angular-google-analytics';
/* globals define */
(function (root, factory) {
'use strict';
if (typeof define === 'function' && define.amd) {
define(['angular'], factory);
} else if (typeof module === 'object' && module.exports) {
module.exports = factory(require('angular'));
} else {
factory(root.angular);
}
}(this, function (angular, undefined) {
'use strict';
angular.module('angular-google-analytics', [])
.provider('Analytics', function () {
var accounts,
analyticsJS = true,
cookieConfig = 'auto', // DEPRECATED
created = false,
crossDomainLinker = false,
crossLinkDomains,
currency = 'USD',
debugMode = false,
delayScriptTag = false,
displayFeatures = false,
domainName,
ecommerce = false,
enhancedEcommerce = false,
enhancedLinkAttribution = false,
experimentId,
ignoreFirstPageLoad = false,
logAllCalls = false,
hybridMobileSupport = false,
offlineMode = false,
pageEvent = '$routeChangeSuccess',
removeRegExp,
testMode = false,
traceDebuggingMode = false,
trackPrefix = '',
trackRoutes = true,
trackUrlParams = false;
this.log = [];
this.offlineQueue = [];
/**
* Configuration Methods
**/
this.setAccount = function (tracker) {
if (angular.isUndefined(tracker) || tracker === false) {
accounts = undefined;
} else if (angular.isArray(tracker)) {
accounts = tracker;
} else if (angular.isObject(tracker)) {
accounts = [tracker];
} else {
// In order to preserve an existing behavior with how the _trackEvent function works,
// the trackEvent property must be set to true when there is only a single tracker.
accounts = [{ tracker: tracker, trackEvent: true }];
}
return this;
};
this.trackPages = function (val) {
trackRoutes = !!val;
return this;
};
this.trackPrefix = function (prefix) {
trackPrefix = prefix;
return this;
};
this.setDomainName = function (domain) {
domainName = domain;
return this;
};
this.useDisplayFeatures = function (val) {
displayFeatures = !!val;
return this;
};
this.useAnalytics = function (val) {
analyticsJS = !!val;
return this;
};
this.useEnhancedLinkAttribution = function (val) {
enhancedLinkAttribution = !!val;
return this;
};
this.useCrossDomainLinker = function (val) {
crossDomainLinker = !!val;
return this;
};
this.setCrossLinkDomains = function (domains) {
crossLinkDomains = domains;
return this;
};
this.setPageEvent = function (name) {
pageEvent = name;
return this;
};
/* DEPRECATED */
this.setCookieConfig = function (config) {
cookieConfig = config;
return this;
};
this.useECommerce = function (val, enhanced) {
ecommerce = !!val;
enhancedEcommerce = !!enhanced;
return this;
};
this.setCurrency = function (currencyCode) {
currency = currencyCode;
return this;
};
this.setRemoveRegExp = function (regex) {
if (regex instanceof RegExp) {
removeRegExp = regex;
}
return this;
};
this.setExperimentId = function (id) {
experimentId = id;
return this;
};
this.ignoreFirstPageLoad = function (val) {
ignoreFirstPageLoad = !!val;
return this;
};
this.trackUrlParams = function (val) {
trackUrlParams = !!val;
return this;
};
this.setHybridMobileSupport = function (val) {
hybridMobileSupport = !!val;
return this;
};
this.startOffline = function (val) {
offlineMode = !!val;
if (offlineMode === true) {
this.delayScriptTag(true);
}
return this;
};
this.delayScriptTag = function (val) {
delayScriptTag = !!val;
return this;
};
this.logAllCalls = function (val) {
logAllCalls = !!val;
return this;
};
this.enterTestMode = function () {
testMode = true;
return this;
};
this.enterDebugMode = function (enableTraceDebugging) {
debugMode = true;
traceDebuggingMode = !!enableTraceDebugging;
return this;
};
/**
* Public Service
*/
this.$get = ['$document', '$location', '$log', '$rootScope', '$window', function ($document, $location, $log, $rootScope, $window) {
var that = this;
/**
* Side-effect Free Helper Methods
**/
var generateCommandName = function (commandName, config) {
if (angular.isString(config)) {
return config + '.' + commandName;
}
return isPropertyDefined('name', config) ? (config.name + '.' + commandName) : commandName;
};
var isPropertyDefined = function (key, config) {
return angular.isObject(config) && angular.isDefined(config[key]);
};
var isPropertySetTo = function (key, config, value) {
return isPropertyDefined(key, config) && config[key] === value;
};
var getUrl = function () {
var url = trackUrlParams ? $location.url() : $location.path();
return removeRegExp ? url.replace(removeRegExp, '') : url;
};
var getUtmParams = function () {
var utmToCampaignVar = {
utm_source: 'campaignSource',
utm_medium: 'campaignMedium',
utm_term: 'campaignTerm',
utm_content: 'campaignContent',
utm_campaign: 'campaignName'
};
var object = {};
angular.forEach($location.search(), function (value, key) {
var campaignVar = utmToCampaignVar[key];
if (angular.isDefined(campaignVar)) {
object[campaignVar] = value;
}
});
return object;
};
/**
* get ActionFieldObject
* https://developers.google.com/analytics/devguides/collection/analyticsjs/enhanced-ecommerce#action-data
* @param id
* @param affliation
* @param revenue
* @param tax
* @param shipping
* @param coupon
* @param list
* @param step
* @param option
*/
var getActionFieldObject = function (id, affiliation, revenue, tax, shipping, coupon, list, step, option) {
var obj = {};
if (id) { obj.id = id; }
if (affiliation) { obj.affiliation = affiliation; }
if (revenue) { obj.revenue = revenue; }
if (tax) { obj.tax = tax; }
if (shipping) { obj.shipping = shipping; }
if (coupon) { obj.coupon = coupon; }
if (list) { obj.list = list; }
if (step) { obj.step = step; }
if (option) { obj.option = option; }
return obj;
};
/**
* Private Methods
*/
var _gaJs = function (fn) {
if (!analyticsJS && $window._gaq && typeof fn === 'function') {
fn();
}
};
var _gaq = function () {
var args = Array.prototype.slice.call(arguments);
if (offlineMode === true) {
that.offlineQueue.push([_gaq, args]);
return;
}
if (!$window._gaq) {
$window._gaq = [];
}
if (logAllCalls === true) {
that._log.apply(that, args);
}
$window._gaq.push(args);
};
var _analyticsJs = function (fn) {
if (analyticsJS && $window.ga && typeof fn === 'function') {
fn();
}
};
var _ga = function () {
var args = Array.prototype.slice.call(arguments);
if (offlineMode === true) {
that.offlineQueue.push([_ga, args]);
return;
}
if (typeof $window.ga !== 'function') {
that._log('warn', 'ga function not set on window');
return;
}
if (logAllCalls === true) {
that._log.apply(that, args);
}
$window.ga.apply(null, args);
};
var _gaMultipleTrackers = function (includeFn) {
// Drop the includeFn from the arguments and preserve the original command name
var args = Array.prototype.slice.call(arguments, 1),
commandName = args[0],
trackers = [];
if (typeof includeFn === 'function') {
accounts.forEach(function (account) {
if (includeFn(account)) {
trackers.push(account);
}
});
} else {
// No include function indicates that all accounts are to be used
trackers = accounts;
}
// To preserve backwards compatibility fallback to _ga method if no account
// matches the specified includeFn. This preserves existing behaviors by
// performing the single tracker operation.
if (trackers.length === 0) {
_ga.apply(that, args);
return;
}
trackers.forEach(function (tracker) {
// Check tracker 'select' function, if it exists, for whether the tracker should be used with the current command.
// If the 'select' function returns false then the tracker will not be used with the current command.
if (isPropertyDefined('select', tracker) && typeof tracker.select === 'function' && !tracker.select(args)) {
return;
}
args[0] = generateCommandName(commandName, tracker);
_ga.apply(that, args);
});
};
this._log = function () {
var args = Array.prototype.slice.call(arguments);
if (args.length > 0) {
if (args.length > 1) {
switch (args[0]) {
case 'debug':
case 'error':
case 'info':
case 'log':
case 'warn':
$log[args[0]](args.slice(1));
break;
}
}
that.log.push(args);
}
};
this._createScriptTag = function () {
if (!accounts || accounts.length < 1) {
that._log('warn', 'No account id set to create script tag');
return;
}
if (accounts.length > 1) {
that._log('warn', 'Multiple trackers are not supported with ga.js. Using first tracker only');
accounts = accounts.slice(0, 1);
}
if (created === true) {
that._log('warn', 'ga.js or analytics.js script tag already created');
return;
}
_gaq('_setAccount', accounts[0].tracker);
if(domainName) {
_gaq('_setDomainName', domainName);
}
if (enhancedLinkAttribution) {
_gaq('_require', 'inpage_linkid', '//www.google-analytics.com/plugins/ga/inpage_linkid.js');
}
if (trackRoutes && !ignoreFirstPageLoad) {
if (removeRegExp) {
_gaq('_trackPageview', getUrl());
} else {
_gaq('_trackPageview');
}
}
var document = $document[0];
var scriptSource;
if (displayFeatures === true) {
scriptSource = ('https:' === document.location.protocol ? 'https://' : 'http://') + 'stats.g.doubleclick.net/dc.js';
} else {
scriptSource = ('https:' === document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
}
if (testMode !== true) {
// If not in test mode inject the Google Analytics tag
(function () {
var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
ga.src = scriptSource;
var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
})();
} else {
// Log the source location for validation
that._log('inject', scriptSource);
}
created = true;
return true;
};
this._createAnalyticsScriptTag = function () {
if (!accounts) {
that._log('warn', 'No account id set to create analytics script tag');
return;
}
if (created === true) {
that._log('warn', 'ga.js or analytics.js script tag already created');
return;
}
var document = $document[0];
var protocol = hybridMobileSupport === true ? 'https:' : '';
var scriptSource = protocol + '//www.google-analytics.com/' + (debugMode ? 'analytics_debug.js' : 'analytics.js');
if (testMode !== true) {
// If not in test mode inject the Google Analytics tag
(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',scriptSource,'ga');
} else {
if (typeof $window.ga !== 'function') {
// In test mode create a ga function if none exists that is a noop sink.
$window.ga = function () {};
}
// Log script injection.
that._log('inject', scriptSource);
}
if (traceDebuggingMode) {
$window.ga_debug = { trace: true };
}
accounts.forEach(function (trackerObj) {
trackerObj.crossDomainLinker = isPropertyDefined('crossDomainLinker', trackerObj) ? trackerObj.crossDomainLinker : crossDomainLinker;
trackerObj.crossLinkDomains = isPropertyDefined('crossLinkDomains', trackerObj) ? trackerObj.crossLinkDomains : crossLinkDomains;
trackerObj.displayFeatures = isPropertyDefined('displayFeatures', trackerObj) ? trackerObj.displayFeatures : displayFeatures;
trackerObj.enhancedLinkAttribution = isPropertyDefined('enhancedLinkAttribution', trackerObj) ? trackerObj.enhancedLinkAttribution : enhancedLinkAttribution;
trackerObj.set = isPropertyDefined('set', trackerObj) ? trackerObj.set : {};
trackerObj.trackEcommerce = isPropertyDefined('trackEcommerce', trackerObj) ? trackerObj.trackEcommerce : ecommerce;
trackerObj.trackEvent = isPropertyDefined('trackEvent', trackerObj) ? trackerObj.trackEvent : false;
// Logic to choose the account fields to be used.
// cookieConfig is being deprecated for a tracker specific property: fields.
var fields = {};
if (isPropertyDefined('fields', trackerObj)) {
fields = trackerObj.fields;
} else if (isPropertyDefined('cookieConfig', trackerObj)) {
if (angular.isString(trackerObj.cookieConfig)) {
fields.cookieDomain = trackerObj.cookieConfig;
} else {
fields = trackerObj.cookieConfig;
}
} else if (angular.isString(cookieConfig)) {
fields.cookieDomain = cookieConfig;
} else if (cookieConfig) {
fields = cookieConfig;
}
if (trackerObj.crossDomainLinker === true) {
fields.allowLinker = true;
}
if (isPropertyDefined('name', trackerObj)) {
fields.name = trackerObj.name;
}
trackerObj.fields = fields;
_ga('create', trackerObj.tracker, trackerObj.fields);
// Hybrid mobile application support
// https://developers.google.com/analytics/devguides/collection/analyticsjs/tasks
if (hybridMobileSupport === true) {
_ga(generateCommandName('set', trackerObj), 'checkProtocolTask', null);
}
// Send all custom set commands from the trackerObj.set property
for (var key in trackerObj.set) {
if (trackerObj.set.hasOwnProperty(key)) {
_ga(generateCommandName('set', trackerObj), key, trackerObj.set[key]);
}
}
if (trackerObj.crossDomainLinker === true) {
_ga(generateCommandName('require', trackerObj), 'linker');
if (angular.isDefined(trackerObj.crossLinkDomains)) {
_ga(generateCommandName('linker:autoLink', trackerObj), trackerObj.crossLinkDomains);
}
}
if (trackerObj.displayFeatures) {
_ga(generateCommandName('require', trackerObj), 'displayfeatures');
}
if (trackerObj.trackEcommerce) {
if (!enhancedEcommerce) {
_ga(generateCommandName('require', trackerObj), 'ecommerce');
} else {
_ga(generateCommandName('require', trackerObj), 'ec');
_ga(generateCommandName('set', trackerObj), '&cu', currency);
}
}
if (trackerObj.enhancedLinkAttribution) {
_ga(generateCommandName('require', trackerObj), 'linkid');
}
if (trackRoutes && !ignoreFirstPageLoad) {
_ga(generateCommandName('send', trackerObj), 'pageview', trackPrefix + getUrl());
}
});
if (experimentId) {
var expScript = document.createElement('script'),
s = document.getElementsByTagName('script')[0];
expScript.src = protocol + '//www.google-analytics.com/cx/api.js?experiment=' + experimentId;
s.parentNode.insertBefore(expScript, s);
}
created = true;
return true;
};
this._ecommerceEnabled = function (warn, command) {
var result = ecommerce && !enhancedEcommerce;
if (warn === true && result === false) {
if (ecommerce && enhancedEcommerce) {
that._log('warn', command + ' is not available when Enhanced Ecommerce is enabled with analytics.js');
} else {
that._log('warn', 'Ecommerce must be enabled to use ' + command + ' with analytics.js');
}
}
return result;
};
this._enhancedEcommerceEnabled = function (warn, command) {
var result = ecommerce && enhancedEcommerce;
if (warn === true && result === false) {
that._log('warn', 'Enhanced Ecommerce must be enabled to use ' + command + ' with analytics.js');
}
return result;
};
/**
* Track page
https://developers.google.com/analytics/devguides/collection/gajs/
https://developers.google.com/analytics/devguides/collection/analyticsjs/pages
* @param url
* @param title
* @param custom
* @private
*/
this._trackPage = function (url, title, custom) {
url = url ? url : getUrl();
title = title ? title : $document[0].title;
_gaJs(function () {
// http://stackoverflow.com/questions/7322288/how-can-i-set-a-page-title-with-google-analytics
_gaq('_set', 'title', title);
_gaq('_trackPageview', (trackPrefix + url));
});
_analyticsJs(function () {
var opt_fieldObject = {
'page': trackPrefix + url,
'title': title
};
angular.extend(opt_fieldObject, getUtmParams());
if (angular.isObject(custom)) {
angular.extend(opt_fieldObject, custom);
}
_gaMultipleTrackers(undefined, 'send', 'pageview', opt_fieldObject);
});
};
/**
* Track event
https://developers.google.com/analytics/devguides/collection/gajs/eventTrackerGuide
https://developers.google.com/analytics/devguides/collection/analyticsjs/events
* @param category
* @param action
* @param label
* @param value
* @param noninteraction
* @param custom
* @private
*/
this._trackEvent = function (category, action, label, value, noninteraction, custom) {
_gaJs(function () {
_gaq('_trackEvent', category, action, label, value, !!noninteraction);
});
_analyticsJs(function () {
var opt_fieldObject = {};
var includeFn = function (trackerObj) {
return isPropertySetTo('trackEvent', trackerObj, true);
};
if (angular.isDefined(noninteraction)) {
opt_fieldObject.nonInteraction = !!noninteraction;
}
if (angular.isObject(custom)) {
angular.extend(opt_fieldObject, custom);
}
_gaMultipleTrackers(includeFn, 'send', 'event', category, action, label, value, opt_fieldObject);
});
};
/**
* Add transaction
* https://developers.google.com/analytics/devguides/collection/gajs/methods/gaJSApiEcommerce#_gat.GA_Tracker_._addTrans
* https://developers.google.com/analytics/devguides/collection/analyticsjs/ecommerce#addTrans
* @param transactionId
* @param affiliation
* @param total
* @param tax
* @param shipping
* @param city
* @param state
* @param country
* @private
*/
this._addTrans = function (transactionId, affiliation, total, tax, shipping, city, state, country, currency) {
_gaJs(function () {
_gaq('_addTrans', transactionId, affiliation, total, tax, shipping, city, state, country);
});
_analyticsJs(function () {
if (that._ecommerceEnabled(true, 'addTrans')) {
var includeFn = function (trackerObj) {
return isPropertySetTo('trackEcommerce', trackerObj, true);
};
_gaMultipleTrackers(
includeFn,
'ecommerce:addTransaction',
{
id: transactionId,
affiliation: affiliation,
revenue: total,
tax: tax,
shipping: shipping,
currency: currency || 'USD'
});
}
});
};
/**
* Add item to transaction
* https://developers.google.com/analytics/devguides/collection/gajs/methods/gaJSApiEcommerce#_gat.GA_Tracker_._addItem
* https://developers.google.com/analytics/devguides/collection/analyticsjs/ecommerce#addItem
* @param transactionId
* @param sku
* @param name
* @param category
* @param price
* @param quantity
* @private
*/
this._addItem = function (transactionId, sku, name, category, price, quantity) {
_gaJs(function () {
_gaq('_addItem', transactionId, sku, name, category, price, quantity);
});
_analyticsJs(function () {
if (that._ecommerceEnabled(true, 'addItem')) {
var includeFn = function (trackerObj) {
return isPropertySetTo('trackEcommerce', trackerObj, true);
};
_gaMultipleTrackers(
includeFn,
'ecommerce:addItem',
{
id: transactionId,
name: name,
sku: sku,
category: category,
price: price,
quantity: quantity
});
}
});
};
/**
* Track transaction
* https://developers.google.com/analytics/devguides/collection/gajs/methods/gaJSApiEcommerce#_gat.GA_Tracker_._trackTrans
* https://developers.google.com/analytics/devguides/collection/analyticsjs/ecommerce#sendingData
* @private
*/
this._trackTrans = function () {
_gaJs(function () {
_gaq('_trackTrans');
});
_analyticsJs(function () {
if (that._ecommerceEnabled(true, 'trackTrans')) {
var includeFn = function (trackerObj) {
return isPropertySetTo('trackEcommerce', trackerObj, true);
};
_gaMultipleTrackers(includeFn, 'ecommerce:send');
}
});
};
/**
* Clear transaction
* https://developers.google.com/analytics/devguides/collection/analyticsjs/ecommerce#clearingData
* @private
*/
this._clearTrans = function () {
_analyticsJs(function () {
if (that._ecommerceEnabled(true, 'clearTrans')) {
var includeFn = function (trackerObj) {
return isPropertySetTo('trackEcommerce', trackerObj, true);
};
_gaMultipleTrackers(includeFn, 'ecommerce:clear');
}
});
};
/**
* Enhanced Ecommerce
*/
/**
* Add Product
* https://developers.google.com/analytics/devguides/collection/analyticsjs/enhanced-ecommerce#product-data
* @param productId
* @param name
* @param category
* @param brand
* @param variant
* @param price
* @param quantity
* @param coupon
* @param position
* @param custom
* @private
*/
this._addProduct = function (productId, name, category, brand, variant, price, quantity, coupon, position, custom) {
_gaJs(function () {
_gaq('_addProduct', productId, name, category, brand, variant, price, quantity, coupon, position);
});
_analyticsJs(function () {
if (that._enhancedEcommerceEnabled(true, 'addProduct')) {
var includeFn = function (trackerObj) {
return isPropertySetTo('trackEcommerce', trackerObj, true);
};
var details = {
id: productId,
name: name,
category: category,
brand: brand,
variant: variant,
price: price,
quantity: quantity,
coupon: coupon,
position: position
};
if (angular.isObject(custom)) {
angular.extend(details, custom);
}
_gaMultipleTrackers(includeFn, 'ec:addProduct', details);
}
});
};
/**
* Add Impression
* https://developers.google.com/analytics/devguides/collection/analyticsjs/enhanced-ecommerce#impression-data
* @param id
* @param name
* @param list
* @param brand
* @param category
* @param variant
* @param position
* @param price
* @private
*/
this._addImpression = function (id, name, list, brand, category, variant, position, price){
_gaJs(function () {
_gaq('_addImpression', id, name, list, brand, category, variant, position, price);
});
_analyticsJs(function () {
if (that._enhancedEcommerceEnabled(true, 'addImpression')) {
var includeFn = function (trackerObj) {
return isPropertySetTo('trackEcommerce', trackerObj, true);
};
_gaMultipleTrackers(
includeFn,
'ec:addImpression',
{
id: id,
name: name,
category: category,
brand: brand,
variant: variant,
list: list,
position: position,
price: price
});
}
});
};
/**
* Add Promo
* https://developers.google.com/analytics/devguides/collection/analyticsjs/enhanced-ecommerce
* @param productId
* @param name
* @param creative
* @param position
* @private
*/
this._addPromo = function (productId, name, creative, position) {
_gaJs(function () {
_gaq('_addPromo', productId, name, creative, position);
});
_analyticsJs(function () {
if (that._enhancedEcommerceEnabled(true, 'addPromo')) {
var includeFn = function (trackerObj) {
return isPropertySetTo('trackEcommerce', trackerObj, true);
};
_gaMultipleTrackers(
includeFn,
'ec:addPromo',
{
id: productId,
name: name,
creative: creative,
position: position
});
}
});
};
/**
* Set Action
* https://developers.google.com/analytics/devguides/collection/analyticsjs/enhanced-ecommerce#measuring-actions
* https://developers.google.com/analytics/devguides/collection/analyticsjs/enhanced-ecommerce#action-types
* @param action
* @param obj
* @private
*/
this._setAction = function (action, obj){
_gaJs(function () {
_gaq('_setAction', action, obj);
});
_analyticsJs(function () {
if (that._enhancedEcommerceEnabled(true, 'setAction')) {
var includeFn = function (trackerObj) {
return isPropertySetTo('trackEcommerce', trackerObj, true);
};
_gaMultipleTrackers(includeFn, 'ec:setAction', action, obj);
}
});
};
/**
* Track Transaction
* https://developers.google.com/analytics/devguides/collection/analyticsjs/enhanced-ecommerce#measuring-transactions
* @param transactionId
* @param affiliation
* @param revenue
* @param tax
* @param shipping
* @param coupon
* @param list
* @param step
* @param option
* @private
*/
this._trackTransaction = function (transactionId, affiliation, revenue, tax, shipping, coupon, list, step, option) {
this._setAction('purchase', getActionFieldObject(transactionId, affiliation, revenue, tax, shipping, coupon, list, step, option));
};
/**
* Track Refund
* https://developers.google.com/analytics/devguides/collection/analyticsjs/enhanced-ecommerce#measuring-refunds
* @param transactionId
* @private
*/
this._trackRefund = function (transactionId) {
this._setAction('refund', getActionFieldObject(transactionId));
};
/**
* Track Checkout
* https://developers.google.com/analytics/devguides/collection/analyticsjs/enhanced-ecommerce#measuring-checkout
* @param step
* @param option
* @private
*/
this._trackCheckOut = function (step, option) {
this._setAction('checkout', getActionFieldObject(null, null, null, null, null, null, null, step, option));
};
/**
* Track detail
* @private
*/
this._trackDetail = function () {
this._setAction('detail');
this._pageView();
};
/**
* Track add/remove to cart
* https://developers.google.com/analytics/devguides/collection/analyticsjs/enhanced-ecommerce#add-remove-cart
* @param action
* @param list
* @private
*/
this._trackCart = function (action, listName) {
if (['add', 'remove'].indexOf(action) !== -1) {
this._setAction(action, { list: listName });
this._trackEvent('UX', 'click', action + (action === 'add' ? ' to cart' : ' from cart'));
}
};
/**
* Track promo click
* https://developers.google.com/analytics/devguides/collection/analyticsjs/enhanced-ecommerce#measuring-promo-clicks
* @param promotionName
* @private
*/
this._promoClick = function (promotionName) {
this._setAction('promo_click');
this._trackEvent('Internal Promotions', 'click', promotionName);
};
/**
* Track product click
* https://developers.google.com/analytics/devguides/collection/analyticsjs/enhanced-ecommerce#measuring-promo-clicks
* @param promotionName
* @private
*/
this._productClick = function (listName) {
this._setAction('click', getActionFieldObject(null, null, null, null, null, null, listName, null, null));
this._trackEvent('UX', 'click', listName);
};
/**
* Send page view
* @param trackerName
* @private
*/
this._pageView = function (trackerName) {
_analyticsJs(function () {
_ga(generateCommandName('send', trackerName), 'pageview');
});
};
/**
* Send custom events
* https://developers.google.com/analytics/devguides/collection/analyticsjs/user-timings#implementation
* https://developers.google.com/analytics/devguides/collection/analyticsjs/social-interactions#implementation
* @private
*/
this._send = function () {
var args = Array.prototype.slice.call(arguments);
args.unshift('send');
_analyticsJs(function () {
_ga.apply(that, args);
});
};
/**
* Set custom dimensions, metrics or experiment
* https://developers.google.com/analytics/devguides/collection/analyticsjs/custom-dims-mets
* https://developers.google.com/analytics/devguides/collection/analyticsjs/field-reference#customs
* @param name (Required)
* @param value (Required)
* @param trackerName (Not Required)
* @private
*/
this._set = function (name, value, trackerName) {
_analyticsJs(function () {
_ga(generateCommandName('set', trackerName), name, value);
});
};
/**
* Track user timings
* @param timingCategory (Required): A string for categorizing all user timing variables into logical groups(e.g jQuery).
* @param timingVar (Required): A string to identify the variable being recorded(e.g. JavaScript Load).
* @param timingValue (Required): The number of milliseconds in elapsed time to report to Google Analytics(e.g. 20).
* @param timingLabel (Not Required): A string that can be used to add flexibility in visualizing user timings in the reports(e.g. Google CDN).
* @private
*/
this._trackTimings = function (timingCategory, timingVar, timingValue, timingLabel) {
this._send('timing', timingCategory, timingVar, timingValue, timingLabel);
};
// creates the Google Analytics tracker
if (!delayScriptTag) {
if (analyticsJS) {
this._createAnalyticsScriptTag();
} else {
this._createScriptTag();
}
}
// activates page tracking
if (trackRoutes) {
$rootScope.$on(pageEvent, function () {
that._trackPage();
});
}
return {
log: that.log,
offlineQueue: that.offlineQueue,
configuration: {
accounts: accounts,
universalAnalytics: analyticsJS,
crossDomainLinker: crossDomainLinker,
crossLinkDomains: crossLinkDomains,
currency: currency,
debugMode: debugMode,
delayScriptTag: delayScriptTag,
displayFeatures: displayFeatures,
domainName: domainName,
ecommerce: that._ecommerceEnabled(),
enhancedEcommerce: that._enhancedEcommerceEnabled(),
enhancedLinkAttribution: enhancedLinkAttribution,
experimentId: experimentId,
hybridMobileSupport: hybridMobileSupport,
ignoreFirstPageLoad: ignoreFirstPageLoad,
logAllCalls: logAllCalls,
pageEvent: pageEvent,
removeRegExp: removeRegExp,
testMode: testMode,
traceDebuggingMode: traceDebuggingMode,
trackPrefix: trackPrefix,
trackRoutes: trackRoutes,
trackUrlParams: trackUrlParams
},
getUrl: getUrl,
/* DEPRECATED */
setCookieConfig: that._setCookieConfig,
/* DEPRECATED */
getCookieConfig: function () {
return cookieConfig;
},
createAnalyticsScriptTag: function (config) {
if (config) {
cookieConfig = config;
}
return that._createAnalyticsScriptTag();
},
createScriptTag: function () {
return that._createScriptTag();
},
offline: function (mode) {
if (mode === true && offlineMode === false) {
// Go to offline mode
offlineMode = true;
}
if (mode === false && offlineMode === true) {
// Go to online mode and process the offline queue
offlineMode = false;
while (that.offlineQueue.length > 0) {
var obj = that.offlineQueue.shift();
obj[0].apply(that, obj[1]);
}
}
return offlineMode;
},
trackPage: function (url, title, custom) {
that._trackPage.apply(that, arguments);
},
trackEvent: function (category, action, label, value, noninteraction, custom) {
that._trackEvent.apply(that, arguments);
},
addTrans: function (transactionId, affiliation, total, tax, shipping, city, state, country, currency) {
that._addTrans.apply(that, arguments);
},
addItem: function (transactionId, sku, name, category, price, quantity) {
that._addItem.apply(that, arguments);
},
trackTrans: function () {
that._trackTrans.apply(that, arguments);
},
clearTrans: function () {
that._clearTrans.apply(that, arguments);
},
addProduct: function (productId, name, category, brand, variant, price, quantity, coupon, position, custom) {
that._addProduct.apply(that, arguments);
},
addPromo: function (productId, name, creative, position) {
that._addPromo.apply(that, arguments);
},
addImpression: function (productId, name, list, brand, category, variant, position, price) {
that._addImpression.apply(that, arguments);
},
productClick: function (listName) {
that._productClick.apply(that, arguments);
},
promoClick : function (promotionName) {
that._promoClick.apply(that, arguments);
},
trackDetail: function () {
that._trackDetail.apply(that, arguments);
},
trackCart: function (action, list) {
that._trackCart.apply(that, arguments);
},
trackCheckout: function (step, option) {
that._trackCheckOut.apply(that, arguments);
},
trackTimings: function (timingCategory, timingVar, timingValue, timingLabel) {
that._trackTimings.apply(that, arguments);
},
trackTransaction: function (transactionId, affiliation, revenue, tax, shipping, coupon, list, step, option){
that._trackTransaction.apply(that, arguments);
},
setAction: function (action, obj) {
that._setAction.apply(that, arguments);
},
pageView: function () {
that._pageView.apply(that, arguments);
},
send: function (obj) {
that._send.apply(that, arguments);
},
set: function (name, value, trackerName) {
that._set.apply(that, arguments);
}
};
}];
})
.directive('gaTrackEvent', ['Analytics', '$parse', function (Analytics, $parse) {
return {
restrict: 'A',
link: function (scope, element, attrs) {
var options = $parse(attrs.gaTrackEvent);
element.bind('click', function () {
if(attrs.gaTrackEventIf){
if(!scope.$eval(attrs.gaTrackEventIf)){
return; // Cancel this event if we don't pass the ga-track-event-if condition
}
}
if (options.length > 1) {
Analytics.trackEvent.apply(Analytics, options(scope));
}
});
}
};
}]);
return angular.module('angular-google-analytics');
}));
{
"name": "angular-google-analytics",
"description": "Angular Google Analytics - Easy tracking for your AngularJS application",
"version": "1.1.3",
"version": "1.1.4",
"homepage": "http://github.com/revolunet/angular-google-analytics",

@@ -21,8 +21,3 @@ "author": "Julien Bouquillon <julien@revolunet.com> (https://github.com/revolunet)",

},
"licenses": [
{
"type": "MIT",
"url": "http://revolunet.mit-license.org"
}
],
"license": "MIT",
"dependencies": {},

@@ -37,5 +32,3 @@ "devDependencies": {

"grunt-contrib-jshint": "*",
"grunt-contrib-uglify": "*",
"grunt-release": "~0.3.3",
"grunt-conventional-changelog": "0.0.12"
"grunt-contrib-uglify": "*"
},

@@ -42,0 +35,0 @@ "scripts": {

@@ -5,2 +5,3 @@ # angular-google-analytics

![NPM Version](https://img.shields.io/npm/v/angular-google-analytics.svg)
![Master Build Status](https://codeship.com/projects/ba7a0af0-33fe-0133-927c-127922174191/status?branch=master)

@@ -251,3 +252,4 @@ This service lets you integrate google analytics tracker in your AngularJS applications easily.

// Universal analytics: Analytics.createAnalyticsScriptTag();
// Helpful when needing to do advanced configuration or user opt-out and wanting explicit control over when the Google Analytics script gets injected.
// Helpful when needing to do advanced configuration or user opt-out and wanting explicit control
// over when the Google Analytics script gets injected.
AnalyticsProvider.delayScriptTag(true);

@@ -275,7 +277,18 @@ ```

// and ensures there is a $window.ga() method available for calling by unit tests. This corrects transient
// errors that were seen during unit tests due to the operation of the Google Analtics scripts.
// errors that were seen during unit tests due to the operation of the Google Analytics scripts.
AnalyticsProvider.enterTestMode();
```
## Automatic Tracking
### Debug Mode
```js
// Calling this method will enable debugging mode for Universal Analytics. Supplying a truthy value for the
// optional parameter will further enable trace debugging for Universal Analytics. More information on this
// is available here: https://developers.google.com/analytics/devguides/collection/analyticsjs/debugging.
AnalyticsProvider.enterDebugMode(Boolean);
```
## Using the Analytics Service
**IMPORTANT!** Due to how Google Analytics works, it is important to remember that you must always call `Analytics.pageView();` when you want to push setting changes and function calls to Google Analytics.
### Automatic Page View Tracking
If you are relying on automatic page tracking, you need to inject Analytics at least once in your application.

@@ -287,3 +300,3 @@ ```js

## Making Calls
### Declaring a Controller
```js

@@ -309,2 +322,4 @@ // As an example, a simple controller to make calls from:

Analytics.configuration.currency;
Analytics.configuration.debugMode;
Analytics.configuration.delayScriptTag;

@@ -324,2 +339,3 @@ Analytics.configuration.displayFeatures;

Analytics.configuration.removeRegExp;
Analytics.configuration.traceDebuggingMode;
Analytics.configuration.trackPrefix;

@@ -473,3 +489,3 @@ Analytics.configuration.trackRoutes;

Analytics.addProduct(productId, name, category, brand, variant, price, quantity, coupon, position);
Analytics.trackCart('add');
Analytics.trackCart('add', listName); // listname is optional

@@ -479,3 +495,3 @@ // example:

Analytics.addProduct('sku-2', 'Test Product 2', 'Category-1', 'Brand 2', 'variant-3', '2499', '1', 'FLAT10', '1');
Analytics.trackCart('add');
Analytics.trackCart('add', 'Search Result');
```

@@ -486,3 +502,3 @@

Analytics.addProduct(productId, name, category, brand, variant, price, quantity, coupon, position);
Analytics.trackCart('remove');
Analytics.trackCart('remove', listName); // listname is optional

@@ -492,3 +508,3 @@ // example:

Analytics.addProduct('sku-2', 'Test Product 2', 'Category-1', 'Brand 2', 'variant-3', '2499', '1', 'FLAT10', '1');
Analytics.trackCart('remove');
Analytics.trackCart('remove', 'Search Result');
```

@@ -587,2 +603,3 @@

## Troubleshooting
### AdBlock EasyPrivacy

@@ -594,2 +611,7 @@

### Debugging Resources
Chrome Extension: [Google Analytics Debugger](https://chrome.google.com/webstore/detail/google-analytics-debugger/jnkmfdileelhofjcijamephohjechhna)
Firefox Add-on: [Google Analytics Debugger](https://addons.mozilla.org/en-US/firefox/addon/gadebugger/)
## Licence

@@ -596,0 +618,0 @@

@@ -12,3 +12,3 @@ // Karma v0.13 http://karma-runner.github.io/0.13/config/configuration-file.html

'bower_components/angular-mocks/angular-mocks.js',
'src/*.js',
'index.js',
'test/unit/*.js'

@@ -15,0 +15,0 @@ ],

@@ -117,2 +117,17 @@ /* global afterEach, before, beforeEach, describe, document, expect, inject, it, module, spyOn */

});
describe('with a prefix set', function(){
beforeEach(module(function (AnalyticsProvider){
AnalyticsProvider
.trackPrefix("test-prefix");
}));
it('should send the url, including the prefix', function(){
inject(function (Analytics) {
Analytics.log.length = 0; // clear log
Analytics.createAnalyticsScriptTag();
expect(Analytics.log[2]).toEqual(['send', 'pageview', 'test-prefix']);
});
});
});
});

@@ -550,2 +565,14 @@

it('should track add to cart event with product list', function () {
inject(function (Analytics) {
Analytics.log.length = 0; // clear log
Analytics.addProduct('sku-2', 'Test Product 2', 'Category-1', 'Brand 2', 'variant-3', '2499', '1', 'FLAT10', '1');
Analytics.trackCart('add', 'product-list');
expect(Analytics.log.length).toBe(3);
expect(Analytics.log[0][0]).toBe('ec:addProduct');
expect(Analytics.log[1]).toEqual([ 'ec:setAction', 'add', {list: 'product-list'} ]);
expect(Analytics.log[2]).toEqual([ 'send', 'event', 'UX', 'click', 'add to cart', undefined, {} ]);
});
});
it('should track remove from cart event', function () {

@@ -564,2 +591,14 @@ inject(function (Analytics) {

it('should track remove from cart event with product list', function () {
inject(function (Analytics) {
Analytics.log.length = 0; // clear log
Analytics.addProduct('sku-2', 'Test Product 2', 'Category-1', 'Brand 2', 'variant-3', '2499', '1', 'FLAT10', '1');
Analytics.trackCart('remove', 'product-list');
expect(Analytics.log.length).toBe(3);
expect(Analytics.log[0][0]).toBe('ec:addProduct');
expect(Analytics.log[1]).toEqual([ 'ec:setAction', 'remove', {list: 'product-list'} ]);
expect(Analytics.log[2]).toEqual([ 'send', 'event', 'UX', 'click', 'remove from cart', undefined, {} ]);
});
});
it('should track checkout', function () {

@@ -566,0 +605,0 @@ inject(function (Analytics) {

Sorry, the diff of this file is not supported yet

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