UNPKG

analytics-plugin-hubspot

Version:

HubSpot plugin for 'analytics' module

201 lines (162 loc) 6.07 kB
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; export default index;