analytics-plugin-hubspot
Version:
HubSpot plugin for 'analytics' module
206 lines (165 loc) • 6.45 kB
JavaScript
var analyticsHubspot = (function () {
'use strict';
function _slicedToArray(arr, i) {
return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest();
}
function _arrayWithHoles(arr) {
if (Array.isArray(arr)) return arr;
}
function _iterableToArrayLimit(arr, i) {
var _arr = [];
var _n = true;
var _d = false;
var _e = undefined;
try {
for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {
_arr.push(_s.value);
if (i && _arr.length === i) break;
}
} catch (err) {
_d = true;
_e = err;
} finally {
try {
if (!_n && _i["return"] != null) _i["return"]();
} finally {
if (_d) throw _e;
}
}
return _arr;
}
function _nonIterableRest() {
throw new TypeError("Invalid attempt to destructure non-iterable instance");
}
/* global _hsq */
/**
* HubSpot Analytics plugin
* @link https://getanalytics.io/plugins/hubspot/
* @link https://developers.hubspot.com/docs/methods/tracking_code_api/tracking_code_overview
* @param {object} pluginConfig - Plugin settings
* @param {string} pluginConfig.portalId - The HubSpot Portal (or Hub) Id of your HubSpot account
* @return {object} Analytics plugin
* @example
*
* hubSpotPlugin({
* portalId: '234576'
* })
*/
function hubSpotPlugin() {
var pluginConfig = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
// Because hubspot automatically fired a page view onLoad. We need to ignore the first .page() call
var initialPageViewFired = false; // Allow for userland overides of base methods
return {
NAMESPACE: 'hubspot',
config: pluginConfig,
initialize: function initialize(_ref) {
var config = _ref.config;
var portalId = config.portalId;
if (!portalId) {
throw new Error('No hubspot portalId defined');
} // NoOp if hubspot already loaded by external source
if (scriptAlreadyLoaded()) return;
var protocol = document.location.protocol;
var https = protocol === 'https:' || protocol === 'chrome-extension:';
var bustCache = Math.floor(new Date().getTime() / 3600000);
var prefix = https ? 'https:' : 'http:';
var src = "".concat(prefix, "//js.hs-scripts.com/").concat(portalId, ".js?").concat(bustCache); // Create script & append to DOM
var script = document.createElement('script');
script.id = 'hs-script-loader';
script.type = 'text/javascript';
script.async = true; // script.defer = defer
script.src = src; // On next tick, inject the script
setTimeout(function () {
var firstScript = document.getElementsByTagName('script')[0];
firstScript.parentNode.insertBefore(script, firstScript);
}, 0);
},
// https://developers.hubspot.com/docs/methods/tracking_code_api/identify_visitor
identify: function identify(_ref2) {
var payload = _ref2.payload,
config = _ref2.config;
var userId = payload.userId,
traits = payload.traits;
if (typeof _hsq === 'undefined') return false;
if (!traits.email) return false;
/* send hubspot identify call */
var properties = formatTraits(traits, userId, defaultFormatter);
_hsq.push(['identify', properties]);
},
/* https://developers.hubspot.com/docs/methods/tracking_code_api/track_page_view */
page: function page(_ref3) {
var payload = _ref3.payload,
options = _ref3.options,
instance = _ref3.instance;
if (typeof _hsq === 'undefined') return false;
/* ignore the first .page() call b/c hubspot tracking script already fired it */
if (!initialPageViewFired) {
initialPageViewFired = true;
return;
} // Set page path
_hsq.push(['setPath', payload.properties.path]);
_hsq.push(['trackPageView']);
},
/* https://developers.hubspot.com/docs/methods/tracking_code_api/javascript_events_api */
track: function track(_ref4) {
var payload = _ref4.payload,
options = _ref4.options,
config = _ref4.config;
if (typeof _hsq === 'undefined') return false;
var formattedProperties = Object.assign({}, payload.properties, {
id: payload.event
});
_hsq.push(['trackEvent', formattedProperties]);
},
loaded: function loaded() {
return !!(window._hsq && window._hsq.push !== Array.prototype.push);
}
};
} // Todo expose as option if needed
function defaultFormatter(key, value) {
// Remove line breaks, tabs, spaces, .
var validKey = replaceInvalid(key); // snake_case values
var formattedKey = snakeCase(validKey); // special case for firstName & lastName
if (formattedKey === 'first_name' || formattedKey === 'last_name') {
return [formattedKey.replace(/_/, ''), value];
}
return [formattedKey, value];
}
function formatTraits(traits, userId, formatter) {
var updatedTraits = Object.keys(traits).reduce(function (acc, traitName) {
// Automatically turn traitName into trait_name
var _formatter = formatter(traitName, traits[traitName]),
_formatter2 = _slicedToArray(_formatter, 2),
key = _formatter2[0],
value = _formatter2[1];
acc[key] = value;
return acc;
}, {});
if (userId && !updatedTraits.id) {
updatedTraits.id = userId;
}
return updatedTraits;
}
function replaceInvalid(str) {
return str.split(' ').join('_') // spaces
.split('.').join('_') // Periods
.split('\n').join('_') // new lines
.split('\v').join('_') // Vertical tabs
.split('\t').join('_') // Regular tabs
.split('\f').join('_') // form feeds
.split('\r').join('_');
}
function snakeCase(str) {
return str.split(/(?=[A-Z])/).join('_').toLowerCase();
}
function scriptAlreadyLoaded() {
var scripts = document.getElementsByTagName('script');
return !!Object.keys(scripts).filter(function (key) {
var src = scripts[key].src;
return src.match(/js\.hs-scripts\.com/);
}).length;
}
/* This module will shake out unused code and work in browser and node 🎉 */
var index = hubSpotPlugin;
return index;
}());