UNPKG

gatsby-plugin-segment-js

Version:

Easily add Segment JS snippet to your website

93 lines (75 loc) 7.69 kB
"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 } })]); } }