ga-lite
Version:
Small, cacheable subset of Google Analytics JS client
497 lines (413 loc) • 12.2 kB
JavaScript
/******/ var __webpack_modules__ = ({
/***/ 653:
/***/ (() => {
Array.from = Array.from || ((...args) => Array.prototype.slice.call(...args))
/***/ })
/******/ });
/************************************************************************/
/******/ // The module cache
/******/ var __webpack_module_cache__ = {};
/******/
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/ // Check if module is in cache
/******/ var cachedModule = __webpack_module_cache__[moduleId];
/******/ if (cachedModule !== undefined) {
/******/ return cachedModule.exports;
/******/ }
/******/ // Create a new module (and put it into the cache)
/******/ var module = __webpack_module_cache__[moduleId] = {
/******/ // no module.id needed
/******/ // no module.loaded needed
/******/ exports: {}
/******/ };
/******/
/******/ // Execute the module function
/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__);
/******/
/******/ // Return the exports of the module
/******/ return module.exports;
/******/ }
/******/
/************************************************************************/
/******/ /* webpack/runtime/define property getters */
/******/ (() => {
/******/ // define getter functions for harmony exports
/******/ __webpack_require__.d = (exports, definition) => {
/******/ for(var key in definition) {
/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
/******/ }
/******/ }
/******/ };
/******/ })();
/******/
/******/ /* webpack/runtime/hasOwnProperty shorthand */
/******/ (() => {
/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))
/******/ })();
/******/
/************************************************************************/
var __webpack_exports__ = {};
// This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk.
(() => {
// EXPORTS
__webpack_require__.d(__webpack_exports__, {
"Z": () => (/* binding */ galite)
});
;// CONCATENATED MODULE: ./src/do-not-track-enabled.js
function doNotTrackEnabled() {
if (typeof navigator === 'undefined' || typeof window === 'undefined') {
return false
}
const dntNumber = parseInt(
navigator.msDoNotTrack || // Internet Explorer 9 and 10 vendor prefix
window.doNotTrack || // IE 11 uses window.doNotTrack
navigator.doNotTrack, // W3C
10
)
return dntNumber === 1
}
;// CONCATENATED MODULE: ./src/tracker-store.js
const store = {}
function addTracker(trackerName, tracker) {
store[trackerName] = tracker
}
function getTracker(trackerName) {
return store[trackerName]
}
function removeTracker(trackerName) {
delete store[trackerName]
}
function getAllTrackers() {
return Object.keys(store).map((key) => store[key])
}
function clearStore() {
return Object.keys(store).forEach(removeTracker)
}
;// CONCATENATED MODULE: ./src/send-to.js
function sendTo(url) {
if (typeof navigator !== 'undefined' && navigator.sendBeacon) {
try {
const didSucceed = navigator.sendBeacon(url)
if (didSucceed) {
return
}
} catch (e) {
// ignore
}
}
try {
const req = new window.XMLHttpRequest()
req.open('GET', url, false)
req.send()
} catch (e) {
// IE9 throws an error with cross-site XMLHttpRequest so
// we fall back to simple image request
const i = new window.Image()
i.src = url
}
}
;// CONCATENATED MODULE: ./src/get-user-id.js
const USER_ID_KEY = 'uid'
function getUserId(
storage = window ? window.localStorage : null
) {
if (storage && storage.getItem(USER_ID_KEY)) {
return storage.getItem(USER_ID_KEY)
}
const userId = Math.random() + '.' + Math.random()
if (storage) {
storage.setItem(USER_ID_KEY, userId)
}
return userId
}
;// CONCATENATED MODULE: ./src/get-optional-url-param.js
function getOptionalStr(key, values = []) {
if (!key || values.indexOf(undefined) > -1) return ''
return '&' + key + '=' + values.map(encodeURIComponent).join('')
}
;// CONCATENATED MODULE: ./src/get-base-url.js
function getBaseUrl(trackingId, userId) {
return (
'https://www.google-analytics.com/collect' +
'?v=1' +
'&de=UTF-8' +
getOptionalStr('ul', [navigator.language.toLowerCase()]) +
getOptionalStr('dl', [document.location.href]) +
getOptionalStr('dt', [document.title]) +
getOptionalStr('sd', [window.screen.colorDepth, '-bit']) +
getOptionalStr('sr', [
window.screen.availWidth,
'x',
window.screen.availHeight
]) +
getOptionalStr('vp', [window.innerWidth, 'x', window.innerHeight]) +
getOptionalStr('dr', [document.referrer])
)
}
;// CONCATENATED MODULE: ./src/object-to-query-string.js
function objectToQueryString(object = {}) {
return Object.keys(object)
.map((key) =>
[key, object[key]]
.map(booleansToNumbers)
.map(encodeURIComponent)
.join('=')
)
.join('&')
}
function booleansToNumbers(value) {
return typeof value === 'boolean' ? +value : value
}
;// CONCATENATED MODULE: ./src/fields-to-params.js
function fieldsToParams(fieldsObject) {
const params = {}
for (const fieldName in fieldsObject) {
const paramValue = fieldsObject[fieldName]
if (paramValue == null || paramValue === '') {
continue
}
if (fieldName in FIELDS_TO_PARAMS_MAP) {
const paramName = FIELDS_TO_PARAMS_MAP[fieldName]
params[paramName] = paramValue
}
// handle dimension1, metric2, etc.
const matchedCustomValue = CUSTOM_VALUES_RE.exec(fieldName)
if (matchedCustomValue) {
const [, type, digits] = matchedCustomValue
const paramName = CUSTOM_VALUES_TO_PARAMS_MAP[type] + digits
params[paramName] = paramValue
}
}
return params
}
const FIELDS_TO_PARAMS_MAP = {
anonymizeIp: 'aip',
dataSource: 'ds',
queueTime: 'qt',
userId: 'uid',
sessionControl: 'sc',
referrer: 'dr',
campaignName: 'cn',
campaignSource: 'cs',
campaignMedium: 'cm',
campaignKeyword: 'ck',
campaignContent: 'cc',
campaignId: 'ci',
screenResolution: 'sr',
viewportSize: 'vp',
encoding: 'de',
screenColors: 'sd',
language: 'ul',
javaEnabled: 'je',
flashVersion: 'fl',
hitType: 't',
nonInteraction: 'ni',
location: 'dl',
hostname: 'dh',
page: 'dp',
title: 'dt',
screenName: 'cd',
linkid: 'linkid',
appName: 'an',
appId: 'aid',
appVersion: 'av',
appInstallerId: 'aiid',
eventCategory: 'ec',
eventAction: 'ea',
eventLabel: 'el',
eventValue: 'ev',
currencyCode: 'cu',
socialNetwork: 'sn',
socialAction: 'sa',
socialTarget: 'st',
timingCategory: 'utc',
timingVar: 'utv',
timingValue: 'utt',
timingLabel: 'utl',
exDescription: 'exd',
exFatal: 'exf',
expId: 'xid',
expVar: 'xvar'
}
const CUSTOM_VALUES_RE = /(dimension|metric)(\d+)/
const CUSTOM_VALUES_TO_PARAMS_MAP = {
dimension: 'cd',
metric: 'cm'
}
;// CONCATENATED MODULE: ./src/build-event-url.js
function buildEventUrl(
trackingId,
timestamp,
userId,
params = {},
anonymizeIp = false
) {
const paramsQueryString = objectToQueryString(fieldsToParams(params))
return (
getBaseUrl() +
(paramsQueryString ? '&' + paramsQueryString : '') +
(anonymizeIp ? '&aip=1' : '') +
'&cid=' +
userId +
'&tid=' +
trackingId +
'&z=' +
timestamp
)
}
;// CONCATENATED MODULE: ./src/user-opted-out.js
function userOptedOut(trackerName) {
// https://developers.google.com/analytics/devguides/collection/analyticsjs/user-opt-out#opt-out_of_tracking_for_your_site
return window[`ga-disable-${trackerName}`] === true
}
;// CONCATENATED MODULE: ./src/tracker.js
const DEFAULT_TRACKER_NAME = 't0'
class Tracker {
constructor(trackingId) {
this.fields = {
trackingId
}
this.userId = getUserId()
this._sendTo = sendTo
this._getTime = getTime
}
send(hitType, ...fieldsObject) {
if (userOptedOut(this.fields.trackingId)) {
return
}
const params = {
hitType,
...argumentsToFields(hitType, fieldsObject),
...this.fields
}
const url = buildEventUrl(
this.fields.trackingId,
this._getTime(),
this.userId,
params
)
this._sendTo(url)
}
get(fieldName) {
return this.fields[fieldName]
}
set(fieldNameOrObject, fieldValue) {
if (fieldNameOrObject.constructor === Object) {
for (const fieldName in fieldNameOrObject) {
this.fields[fieldName] = fieldNameOrObject[fieldName]
}
} else {
this.fields[fieldNameOrObject] = fieldValue
}
}
}
function getTime() {
return new Date().getTime()
}
function argumentsToFields(hitType, args = []) {
const lastArgIsFieldsObject =
args.length >= 1 && args[args.length - 1].constructor === Object
const fieldsObject = lastArgIsFieldsObject ? args[args.length - 1] : {}
args = lastArgIsFieldsObject ? args.slice(0, -1) : args
switch (hitType) {
case 'pageview': {
const [page] = args
return { page, ...fieldsObject }
}
case 'event': {
const [eventCategory, eventAction, eventLabel, eventValue] = args
return {
eventCategory,
eventAction,
eventLabel,
eventValue,
...fieldsObject
}
}
case 'social': {
const [socialNetwork, socialAction, socialTarget] = args
return { socialNetwork, socialAction, socialTarget, ...fieldsObject }
}
case 'timing': {
const [timingCategory, timingVar, timingValue, timingLabel] = args
return {
timingCategory,
timingVar,
timingValue,
timingLabel,
...fieldsObject
}
}
default:
return fieldsObject
}
}
;// CONCATENATED MODULE: ./src/commands/create.js
function create(
trackingId,
cookieDomain,
name = DEFAULT_TRACKER_NAME,
fieldsObject = undefined
) {
const tracker = new Tracker(trackingId)
addTracker(name, tracker)
return tracker
}
;// CONCATENATED MODULE: ./src/commands/get-by-name.js
function getByName(name) {
return getTracker(name)
}
;// CONCATENATED MODULE: ./src/ga-lite-commands.js
const galiteCommands = {
create: create,
getByName: getByName
}
/* harmony default export */ const ga_lite_commands = (galiteCommands);
;// CONCATENATED MODULE: ./src/get-tasks-in-command-queue.js
function getTasksInCommandQueue() {
if (typeof window === 'undefined') {
return []
}
return (window.galite && window.galite.q) || []
}
// EXTERNAL MODULE: ./src/simple-polyfill-array-from.js
var simple_polyfill_array_from = __webpack_require__(653);
;// CONCATENATED MODULE: ./src/ga-lite.js
function galite(command, ...values) {
// Check for doNotTrack variable. If it's present, the user has decided to
// opt-out of the tracking, so we kill this tracking script
if (doNotTrackEnabled()) {
return
}
const [trackerName, trackerCommand] = splitTrackerCommand(command)
const commandFoundInGlobalCommands = !!ga_lite_commands[command]
const commandFoundInTrackerMethods =
!!Tracker.prototype[trackerCommand] && trackerCommand !== 'constructor'
if (commandFoundInGlobalCommands) {
ga_lite_commands[command](...values)
} else if (commandFoundInTrackerMethods) {
const tracker = getTracker(trackerName)
if (tracker) tracker[trackerCommand](...values)
} else if (typeof command === 'function') {
const tracker = getTracker(trackerName)
command(tracker)
} else {
throw new Error(`Command ${command} is not available in ga-lite`)
}
}
function splitTrackerCommand(command) {
if (typeof command === 'string' && command.indexOf('.') > -1) {
return command.split('.')
} else {
return [DEFAULT_TRACKER_NAME, command]
}
}
Object.keys(ga_lite_commands).forEach((key) => {
galite[key] = ga_lite_commands[key]
})
getTasksInCommandQueue().forEach((args) => galite(...args))
})();
var __webpack_exports__default = __webpack_exports__.Z;
export { __webpack_exports__default as default };