gatsby-plugin-segment-js
Version:
Easily add Segment JS snippet to your website
93 lines (75 loc) • 7.69 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.onRenderBody = onRenderBody;
var _react = require("react");
var _react2 = _interopRequireDefault(_react);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function onRenderBody(_ref, pluginOptions) {
var setHeadComponents = _ref.setHeadComponents;
var prodKey = pluginOptions.prodKey,
devKey = pluginOptions.devKey,
_pluginOptions$host = pluginOptions.host,
host = _pluginOptions$host === undefined ? "https://cdn.segment.io" : _pluginOptions$host,
_pluginOptions$trackP = pluginOptions.trackPage,
trackPage = _pluginOptions$trackP === undefined ? true : _pluginOptions$trackP,
_pluginOptions$trackP2 = pluginOptions.trackPageImmediately,
trackPageImmediately = _pluginOptions$trackP2 === undefined ? true : _pluginOptions$trackP2,
_pluginOptions$trackP3 = pluginOptions.trackPageOnlyIfReady,
trackPageOnlyIfReady = _pluginOptions$trackP3 === undefined ? false : _pluginOptions$trackP3,
includeTitleInTrackPage = pluginOptions.includeTitleInTrackPage,
_pluginOptions$manual = pluginOptions.manualLoad,
manualLoad = _pluginOptions$manual === undefined ? false : _pluginOptions$manual,
_pluginOptions$delayL = pluginOptions.delayLoad,
delayLoad = _pluginOptions$delayL === undefined ? false : _pluginOptions$delayL,
_pluginOptions$delayL2 = pluginOptions.delayLoadDelay,
delayLoadDelay = _pluginOptions$delayL2 === undefined ? 1000 : _pluginOptions$delayL2,
_pluginOptions$delayL3 = pluginOptions.delayLoadUntilActivity,
delayLoadUntilActivity = _pluginOptions$delayL3 === undefined ? false : _pluginOptions$delayL3,
_pluginOptions$delayL4 = pluginOptions.delayLoadUntilActivityAdditionalDelay,
delayLoadUntilActivityAdditionalDelay = _pluginOptions$delayL4 === undefined ? 0 : _pluginOptions$delayL4,
customSnippet = pluginOptions.customSnippet;
var _pluginOptions$trackP4 = pluginOptions.trackPageWithTitle,
trackPageWithTitle = _pluginOptions$trackP4 === undefined ? false : _pluginOptions$trackP4;
if (typeof includeTitleInTrackPage === 'boolean') {
console.warn('WARNING: option for gatsby-plugin-segment "includeTitleInTrackPage" is deprecated. Please use "trackPageWithTitle" instead.');
trackPageWithTitle = includeTitleInTrackPage;
}
if (!prodKey || prodKey.length < 10) console.error("segment prodKey must be at least 10 char in length");
if (devKey && devKey.length < 10) console.error("if present, devKey must be at least 10 char in length");
var writeKey = process.env.NODE_ENV === "production" ? prodKey : devKey;
var loadImmediately = !(delayLoad || delayLoadUntilActivity || manualLoad);
var reallyTrackPageImmediately = trackPageImmediately && trackPage;
var idempotentPageviewCode = "(function () {\n let lastPageviewPath;\n window.gatsbyPluginSegmentPageviewCaller = function () {\n if (!window.analytics) {\n return\n }" + (trackPageOnlyIfReady ? "\n if (!gatsbyPluginSegmentReady) {\n return\n }" : '') + "\n\n let thisPageviewPath = window.location.pathname;\n if (thisPageviewPath === lastPageviewPath) {\n return\n }\n lastPageviewPath = thisPageviewPath;\n window.analytics.page(" + (trackPageWithTitle ? 'document.title' : '') + ");\n };\n })();";
var delayedLoadingCode = "(function () {\n let segmentLoaded = false;\n let segmentLoading = false;\n const callbacks = [];\n function safeExecCallback (cb) {\n if (typeof cb === \"function\") {\n cb();\n }\n }\n\n window.gatsbyPluginSegmentLoader = function (cb) {\n if (segmentLoaded) {\n safeExecCallback(cb);\n return;\n }\n\n callbacks.push(cb);\n if (segmentLoading) {\n return;\n }\n\n segmentLoading = true;\n\n function loader() {\n if (typeof window.analytics.load !== \"function\") {\n console.error(\"Gatsby Plugin Segment: analytics.load is not a function. Has it already been called?\");\n return\n }\n gatsbySegmentLoad('" + writeKey + "');\n segmentLoading = false;\n segmentLoaded = true;\n let cb;\n while ((cb = callbacks.pop()) != null) {\n safeExecCallback(cb);\n }" + (reallyTrackPageImmediately ? "\n window.gatsbyPluginSegmentPageviewCaller();" : '') + "\n };\n\n if (\"requestIdleCallback\" in window) {\n requestIdleCallback(loader);\n } else {\n loader();\n }\n };";
if (delayLoadUntilActivity) {
delayedLoadingCode += "\n window.addEventListener(\n \"scroll\",\n function () {\n setTimeout(\n function () {\n window.gatsbyPluginSegmentLoader && window.gatsbyPluginSegmentLoader();\n },\n " + Math.max(0, delayLoadUntilActivityAdditionalDelay || 0) + ",\n )\n },\n { once: true },\n );";
}
if (delayLoad) {
delayedLoadingCode += "\n setTimeout(\n function () {\n window.gatsbyPluginSegmentLoader && window.gatsbyPluginSegmentLoader();\n },\n " + (delayLoadDelay || 1000) + ",\n );";
}
delayedLoadingCode += "\n })();";
var snippet = void 0;
if (customSnippet) {
snippet = eval('`' + customSnippet + '`');
snippet += "\n window.analytics.ready(function () {\n gatsbyPluginSegmentReady = true;\n })\n ";
} else {
snippet = "(function(){var analytics=window.analytics=window.analytics||[];if(!analytics.initialize)if(analytics.invoked)window.console&&console.error&&console.error(\"Segment snippet included twice.\");else{analytics.invoked=!0;analytics.methods=[\"trackSubmit\",\"trackClick\",\"trackLink\",\"trackForm\",\"pageview\",\"identify\",\"reset\",\"group\",\"track\",\"ready\",\"alias\",\"debug\",\"page\",\"once\",\"off\",\"on\",\"addSourceMiddleware\",\"addIntegrationMiddleware\",\"setAnonymousId\",\"addDestinationMiddleware\"];analytics.factory=function(e){return function(){var t=Array.prototype.slice.call(arguments);t.unshift(e);analytics.push(t);return analytics}};for(var e=0;e<analytics.methods.length;e++){var key=analytics.methods[e];analytics[key]=analytics.factory(key)}analytics.load=function(key,e){var t=document.createElement(\"script\");t.type=\"text/javascript\";t.async=!0;t.src=\"" + host + "/analytics.js/v1/\" + key + \"/analytics.min.js\";var n=document.getElementsByTagName(\"script\")[0];n.parentNode.insertBefore(t,n);analytics._loadOptions=e};analytics._writeKey=\"" + writeKey + "\";analytics.SNIPPET_VERSION=\"4.15.3\";";
if (loadImmediately) {
snippet += "\n gatsbySegmentLoad('" + writeKey + "');";
if (reallyTrackPageImmediately) {
snippet += "\n window.gatsbyPluginSegmentPageviewCaller();";
}
}
snippet += "\n }})();";
}
var gatsbySegmentLoadStuff = "let gatsbyPluginSegmentReady = " + (trackPageOnlyIfReady ? 'false' : 'true') + ";\n function gatsbySegmentLoad (writeKey) {\n if (window.analytics && window.analytics.load) {\n window.analytics.load(writeKey);\n }\n gatsbyPluginSegmentReady = true;\n };\n ";
var pluginCode = "\n(function () {\n " + gatsbySegmentLoadStuff + "\n " + idempotentPageviewCode + "\n " + ((delayLoad || delayLoadUntilActivity) && !manualLoad ? delayedLoadingCode : "") + "\n " + snippet + "\n})();";
if (writeKey) {
setHeadComponents([_react2.default.createElement("script", {
key: "plugin-segment",
dangerouslySetInnerHTML: { __html: pluginCode }
})]);
}
}