UNPKG

ga-lite

Version:

Small, cacheable subset of Google Analytics JS client

497 lines (413 loc) 12.2 kB
/******/ 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 };