From 0d3a56c14659b0a0517c055983bfb9d30f67f08c Mon Sep 17 00:00:00 2001 From: Francesco Novy Date: Fri, 7 Apr 2023 15:33:53 +0200 Subject: [PATCH 1/2] fix(loader): Ensure we add integrations --- .../templates/sentry/js-sdk-loader.js.tmpl | 34 ++++++++++-------- .../sentry/js-sdk-loader.min.js.tmpl | 2 +- src/sentry/templates/sentry/js-sdk-loader.ts | 36 +++++++++++-------- 3 files changed, 42 insertions(+), 30 deletions(-) diff --git a/src/sentry/templates/sentry/js-sdk-loader.js.tmpl b/src/sentry/templates/sentry/js-sdk-loader.js.tmpl index ccb673522d91cc..c9de6cc1257c9c 100644 --- a/src/sentry/templates/sentry/js-sdk-loader.js.tmpl +++ b/src/sentry/templates/sentry/js-sdk-loader.js.tmpl @@ -60,30 +60,20 @@ } // Add loader as SDK source _window.SENTRY_SDK_SOURCE = 'loader'; - var SDK = _window[_namespace]; - var oldInit_1 = SDK.init; - // Add necessary integrations based on config - var integrations = []; - if (_config.tracesSampleRate) { - integrations.push(new SDK.BrowserTracing()); - } - if (_config.replaysSessionSampleRate || _config.replaysOnErrorSampleRate) { - integrations.push(new SDK.Replay()); - } - if (integrations.length) { - _config.integrations = integrations; - } + var SDK_1 = _window[_namespace]; + var oldInit_1 = SDK_1.init; // Configure it using provided DSN and config object - SDK.init = function (options) { + SDK_1.init = function (options) { var target = _config; for (var key in options) { if (Object.prototype.hasOwnProperty.call(options, key)) { target[key] = options[key]; } } + setupDefaultIntegrations(target, SDK_1); oldInit_1(target); }; - sdkLoaded(callbacks, SDK); + sdkLoaded(callbacks, SDK_1); } catch (o_O) { console.error(o_O); @@ -91,6 +81,20 @@ }); _currentScriptTag.parentNode.insertBefore(_newScriptTag, _currentScriptTag); } + // We want to ensure to only add default integrations if they haven't been added by the user. + function setupDefaultIntegrations(config, SDK) { + var integrations = config.integrations || []; + var integrationNames = integrations.map(function (integration) { return integration.name; }); + // Add necessary integrations based on config + if (config.tracesSampleRate && integrationNames.indexOf('BrowserTracing') === -1) { + integrations.push(new SDK.BrowserTracing()); + } + if ((config.replaysSessionSampleRate || config.replaysOnErrorSampleRate) && + integrationNames.indexOf('Replay') === -1) { + integrations.push(new SDK.Replay()); + } + config.integrations = integrations; + } function sdkIsLoaded() { var __sentry = _window.__SENTRY__; // If there is a global __SENTRY__ that means that in any of the callbacks init() was already invoked diff --git a/src/sentry/templates/sentry/js-sdk-loader.min.js.tmpl b/src/sentry/templates/sentry/js-sdk-loader.min.js.tmpl index cdc71cf880f4bb..58295893b71042 100644 --- a/src/sentry/templates/sentry/js-sdk-loader.min.js.tmpl +++ b/src/sentry/templates/sentry/js-sdk-loader.min.js.tmpl @@ -1 +1 @@ -{% load sentry_helpers %}!function(n,e,t,r,o,a,i,c,_,p){for(var s=p,forceLoad=!1,f=0;f-1){s&&"no"===document.scripts[f].getAttribute("data-lazy")&&(s=!1);break}var u=!1,l=[],d=function(n){("e"in n||"p"in n||n.f&&n.f.indexOf("capture")>-1||n.f&&n.f.indexOf("showReportDialog")>-1)&&s&&E(l),d.data.push(n)};function E(i){if(!u){u=!0;var p=e.scripts[0],s=e.createElement(t);s.src=c,s.crossOrigin="anonymous",s.addEventListener("load",(function(){try{n[r]&&n[r].__SENTRY_LOADER__&&(n[r]=R),n[o]&&n[o].__SENTRY_LOADER__&&(n[o]=h),n.SENTRY_SDK_SOURCE="loader";var e=n[a],t=e.init,c=[];_.tracesSampleRate&&c.push(new e.BrowserTracing),(_.replaysSessionSampleRate||_.replaysOnErrorSampleRate)&&c.push(new e.Replay),c.length&&(_.integrations=c),e.init=function(n){var e=_;for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r]);t(e)},function(e,t){try{for(var a=0;a-1){p&&"no"===document.scripts[s].getAttribute("data-lazy")&&(p=!1);break}var u=!1,l=[],d=function(n){("e"in n||"p"in n||n.f&&n.f.indexOf("capture")>-1||n.f&&n.f.indexOf("showReportDialog")>-1)&&p&&R(l),d.data.push(n)};function R(o){if(!u){u=!0;var f=e.scripts[0],p=e.createElement(t);p.src=c,p.crossOrigin="anonymous",p.addEventListener("load",(function(){try{n[r]&&n[r].__SENTRY_LOADER__&&(n[r]=E),n[a]&&n[a].__SENTRY_LOADER__&&(n[a]=O),n.SENTRY_SDK_SOURCE="loader";var e=n[i],t=e.init;e.init=function(n){var r=_;for(var a in n)Object.prototype.hasOwnProperty.call(n,a)&&(r[a]=n[a]);!function(n,e){var t=n.integrations||[],r=t.map((function(n){return n.name}));n.tracesSampleRate&&-1===r.indexOf("BrowserTracing")&&t.push(new e.BrowserTracing);(n.replaysSessionSampleRate||n.replaysOnErrorSampleRate)&&-1===r.indexOf("Replay")&&t.push(new e.Replay);n.integrations=t}(r,e),t(r)},function(e,t){try{for(var i=0;i integration.name); + + // Add necessary integrations based on config + if (config.tracesSampleRate && integrationNames.indexOf('BrowserTracing') === -1) { + integrations.push(new SDK.BrowserTracing()); + } + + if ( + (config.replaysSessionSampleRate || config.replaysOnErrorSampleRate) && + integrationNames.indexOf('Replay') === -1 + ) { + integrations.push(new SDK.Replay()); + } + + config.integrations = integrations; + } + function sdkIsLoaded() { const __sentry = _window.__SENTRY__; // If there is a global __SENTRY__ that means that in any of the callbacks init() was already invoked From 6b226e787056db6c0a5d2878b3546f831d41c704 Mon Sep 17 00:00:00 2001 From: Francesco Novy Date: Tue, 11 Apr 2023 09:00:22 +0200 Subject: [PATCH 2/2] handle non-array-integrations --- src/sentry/templates/sentry/js-sdk-loader.js.tmpl | 4 ++++ src/sentry/templates/sentry/js-sdk-loader.min.js.tmpl | 2 +- src/sentry/templates/sentry/js-sdk-loader.ts | 6 ++++++ 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/sentry/templates/sentry/js-sdk-loader.js.tmpl b/src/sentry/templates/sentry/js-sdk-loader.js.tmpl index c9de6cc1257c9c..b2f026ac37aedb 100644 --- a/src/sentry/templates/sentry/js-sdk-loader.js.tmpl +++ b/src/sentry/templates/sentry/js-sdk-loader.js.tmpl @@ -84,6 +84,10 @@ // We want to ensure to only add default integrations if they haven't been added by the user. function setupDefaultIntegrations(config, SDK) { var integrations = config.integrations || []; + // integrations can be a function, in which case we will not add any defaults + if (!Array.isArray(integrations)) { + return; + } var integrationNames = integrations.map(function (integration) { return integration.name; }); // Add necessary integrations based on config if (config.tracesSampleRate && integrationNames.indexOf('BrowserTracing') === -1) { diff --git a/src/sentry/templates/sentry/js-sdk-loader.min.js.tmpl b/src/sentry/templates/sentry/js-sdk-loader.min.js.tmpl index 58295893b71042..79fb80c704b0bc 100644 --- a/src/sentry/templates/sentry/js-sdk-loader.min.js.tmpl +++ b/src/sentry/templates/sentry/js-sdk-loader.min.js.tmpl @@ -1 +1 @@ -{% load sentry_helpers %}!function(n,e,t,r,a,i,o,c,_,f){for(var p=f,forceLoad=!1,s=0;s-1){p&&"no"===document.scripts[s].getAttribute("data-lazy")&&(p=!1);break}var u=!1,l=[],d=function(n){("e"in n||"p"in n||n.f&&n.f.indexOf("capture")>-1||n.f&&n.f.indexOf("showReportDialog")>-1)&&p&&R(l),d.data.push(n)};function R(o){if(!u){u=!0;var f=e.scripts[0],p=e.createElement(t);p.src=c,p.crossOrigin="anonymous",p.addEventListener("load",(function(){try{n[r]&&n[r].__SENTRY_LOADER__&&(n[r]=E),n[a]&&n[a].__SENTRY_LOADER__&&(n[a]=O),n.SENTRY_SDK_SOURCE="loader";var e=n[i],t=e.init;e.init=function(n){var r=_;for(var a in n)Object.prototype.hasOwnProperty.call(n,a)&&(r[a]=n[a]);!function(n,e){var t=n.integrations||[],r=t.map((function(n){return n.name}));n.tracesSampleRate&&-1===r.indexOf("BrowserTracing")&&t.push(new e.BrowserTracing);(n.replaysSessionSampleRate||n.replaysOnErrorSampleRate)&&-1===r.indexOf("Replay")&&t.push(new e.Replay);n.integrations=t}(r,e),t(r)},function(e,t){try{for(var i=0;i-1){p&&"no"===document.scripts[s].getAttribute("data-lazy")&&(p=!1);break}var u=!1,l=[],d=function(n){("e"in n||"p"in n||n.f&&n.f.indexOf("capture")>-1||n.f&&n.f.indexOf("showReportDialog")>-1)&&p&&R(l),d.data.push(n)};function R(o){if(!u){u=!0;var f=e.scripts[0],p=e.createElement(r);p.src=c,p.crossOrigin="anonymous",p.addEventListener("load",(function(){try{n[t]&&n[t].__SENTRY_LOADER__&&(n[t]=E),n[a]&&n[a].__SENTRY_LOADER__&&(n[a]=v),n.SENTRY_SDK_SOURCE="loader";var e=n[i],r=e.init;e.init=function(n){var t=_;for(var a in n)Object.prototype.hasOwnProperty.call(n,a)&&(t[a]=n[a]);!function(n,e){var r=n.integrations||[];if(!Array.isArray(r))return;var t=r.map((function(n){return n.name}));n.tracesSampleRate&&-1===t.indexOf("BrowserTracing")&&r.push(new e.BrowserTracing);(n.replaysSessionSampleRate||n.replaysOnErrorSampleRate)&&-1===t.indexOf("Replay")&&r.push(new e.Replay);n.integrations=r}(t,e),r(t)},function(e,r){try{for(var i=0;i integration.name); // Add necessary integrations based on config