{"version":3,"file":"js/73170-bccb3122821d511d0791.js","mappings":"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","sources":["webpack://StravaModern/./app/javascript/utils/devUtils.js","webpack://StravaModern/./app/javascript/utils/sentry.helper.js","webpack://StravaModern/./app/javascript/utils/sentry.js"],"sourcesContent":["/**\n * dev utils to make local development easier (dynamically-imported mock data,\n * dev-only console logs, etc.)\n */\n\nexport const isDev = () => {\n return process.env.NODE_ENV === 'development';\n};\n\nexport const isTest = () => process.env.NODE_ENV === 'test';\n\nexport const devLog = (string) => {\n if (isDev() || window?.StravaDevTools?.enabled) {\n // eslint-disable-next-line no-console\n console.log(string);\n }\n};\n\nexport const timeout = (ms) => {\n return new Promise((resolve) => setTimeout(resolve, ms));\n};\n\nexport default { isDev, devLog, timeout };\n","import * as Sentry from '@sentry/react';\n\nconst CHROME_BROWSER_EXTENSION = '-extension://';\nconst SAFARI_BROWSER_EXTENSION = '@webkit-masked-url';\nconst ANONYMOUS = '';\nconst DOWNLOADED_FILES = ['/Users/', '/users/']; // eg. https://sentry.io/share/issue/391b31fba7714147a99a3697db116840/\n\n// see https://github.com/thomaschampagne/elevate/blob/fc5772a12327c0d5015fb0fec64aba1cec6756c7/webextension/scripts/processors/activities-synchronize.ts\nconst ELEVATE_APP_CONSOLE_LOGS = [\n 'Fast sync mode enabled',\n 'A previous sync exists on',\n 'local and remote activities count matches',\n 'Mismatch found between local and remote activities. Syncing first page only.',\n 'Activities fetched in group',\n ', raw activities length: ',\n 'PagesRidden] Resolving with ',\n 'clearSyncCache requested',\n 'Group handled count: ',\n 'Updating synced activities to extension local storage.',\n 'Activities fetched in group'\n];\n\nexport const includes = (substringList, string) =>\n !!substringList.find((substring) => {\n return string?.includes(substring);\n });\n\nexport const hasExtensionReferenceInHintErrorStack = (hint) =>\n hint?.originalException?.stack?.includes(CHROME_BROWSER_EXTENSION) ||\n hint?.originalException?.stack?.includes(SAFARI_BROWSER_EXTENSION);\n\nexport const hasExtensionReferenceInBreadCrumbs = (event) =>\n !!event?.breadcrumbs?.find((entry) => {\n return (\n entry.data?.url?.includes(CHROME_BROWSER_EXTENSION) ||\n entry.data?.url?.includes(SAFARI_BROWSER_EXTENSION) ||\n includes(ELEVATE_APP_CONSOLE_LOGS, entry.message)\n );\n });\n\nexport const hasExtensionReferenceInEventErrorStack = (event) => {\n return !!event?.exception?.values?.find((entry) => {\n return !!entry.stacktrace?.frames?.find(\n (frame) =>\n frame?.filename?.includes(CHROME_BROWSER_EXTENSION) ||\n frame?.abs_path?.includes(CHROME_BROWSER_EXTENSION) ||\n frame?.filename?.includes(SAFARI_BROWSER_EXTENSION) ||\n frame?.abs_path?.includes(SAFARI_BROWSER_EXTENSION) ||\n frame?.filename?.includes(ANONYMOUS) ||\n frame?.abs_path?.includes(ANONYMOUS) ||\n includes(DOWNLOADED_FILES, frame?.filename) ||\n includes(DOWNLOADED_FILES, frame?.abs_path)\n );\n });\n};\n\n/**\n * There is a bug in Safari, that causes `AbortError` when fetch is\n * aborted, and you are in the middle of reading the response. In Chrome\n * and other browsers, it is handled gracefully, where in Safari, it\n * produces additional error, that is jumping outside of the original\n * Promise chain and bubbles up to the `unhandledRejection` handler, that\n * we then captures as error.\n */\nexport const isXhrFalsePositive = (hint) => {\n // eslint-disable-next-line no-underscore-dangle\n return hint?.originalException?.request?.__sentry_xhr__?.status_code === 0;\n};\n\n// ignore chunkloaderrors originating from MFE\n// these typically show up when an MFE is federated\nexport const isMfeChunkLoadError = (hint) => {\n return (\n hint?.originalException?.name === 'ChunkLoadError' &&\n hint?.originalException?.request.includes('web-assets.strava.com')\n );\n};\n\nexport const groupErrors = (event) => {\n if (event?.request?.url) {\n /**\n * Groups events matching /activity/? eg.\n * /activities/1\n * /activities/1?param=true\n */\n const regex = new RegExp(/\\/activities\\/\\d+/g);\n const url = new URL(event.request.url);\n const { origin, pathname, search } = url;\n if (regex.test(pathname)) {\n // eslint-disable-next-line no-param-reassign\n event.request.url = `${origin}/activities/id`;\n\n const activityId = pathname.substring(pathname.lastIndexOf('/') + 1);\n\n Sentry.setTag('strava.url.activityId', activityId);\n if (search) {\n Sentry.setTag('strava.url.search', search);\n }\n }\n }\n};\n\nexport const transactionName = () => {\n const { pathname } = window.location;\n\n if (pathname.includes('/activities/') && pathname.includes('/embed/')) {\n return '/activities//embed/';\n }\n if (pathname.includes('/clubs/') && pathname.includes('/latest-rides/')) {\n return '/clubs//latest-rides/';\n }\n if (pathname.includes('/athletes/') && pathname.includes('/latest-rides/')) {\n return '/athletes//latest-rides/';\n }\n if (pathname.includes('/compare/') && pathname.includes('/segments/')) {\n return '/segments//compare/';\n }\n\n if (pathname.includes('/challenges/')) {\n return '/challenges/';\n }\n if (pathname.includes('/clubs/')) {\n return '/clubs/';\n }\n if (pathname.includes('/beacon/')) {\n return '/beacon/';\n }\n\n if (pathname.includes('/pros/')) {\n return '/pros/';\n }\n if (pathname.includes('/location/')) {\n return '/location/';\n }\n\n // temporarily fixes <> grouping as recommended by sentry engineers\n // this unblocks analytics performance monitoring until sentry fixes an issue\n // with transaction grouping on their end. \n // ref - https://develop.sentry.dev/transaction-clustering/\n if (pathname === '/') {\n return '/';\n }\n if (pathname === '/login') {\n return '/login';\n }\n if (pathname === '/register' || pathname === '/register/free') {\n return '/register';\n }\n if (pathname === '/dashboard') {\n return '/dashboard';\n }\n if (pathname.includes('/onboarding/continue') ){\n return '/onboarding/continue';\n }\n\n return pathname.replace(/\\/\\d+/g, '/');\n};\n\nexport default {\n hasExtensionReferenceInHintErrorStack,\n hasExtensionReferenceInBreadCrumbs,\n hasExtensionReferenceInEventErrorStack,\n includes,\n isXhrFalsePositive,\n isMfeChunkLoadError,\n groupErrors,\n transactionName\n};\n","import * as Sentry from '@sentry/react';\n// eslint-disable-next-line import/no-extraneous-dependencies\nimport { createBrowserHistory } from 'history';\nimport { matchPath } from 'react-router-dom';\nimport { matchMaxMedia } from '@strava/ui/MediaQuery';\nimport { devLog, isDev } from './devUtils';\nimport {\n hasExtensionReferenceInBreadCrumbs,\n hasExtensionReferenceInHintErrorStack,\n hasExtensionReferenceInEventErrorStack,\n isXhrFalsePositive,\n isMfeChunkLoadError,\n groupErrors,\n transactionName\n} from './sentry.helper';\n\nconst displayType = () => {\n if (matchMaxMedia?.screenSm()) {\n return 'phone';\n }\n if (matchMaxMedia?.screenMd()) {\n return 'tablet';\n }\n return 'desktop';\n};\n\n// List of react-router routes to be singled out for performance tracking\n// Make sure the order of the routes is correct. The longest url under the same parent should be placed first and in decreasing order.\n// eg. athlete/id/post should be added before athlete/id\nconst REACT_ROUTER_ROUTES = [\n { path: '/onboarding/continue' },\n { path: '/onboarding/google_registered' },\n { path: '/onboarding/suggested-friends' },\n { path: '/onboarding/facebook-friends' },\n { path: '/onboarding/welcome-to-strava' },\n { path: '/onboarding/subscription-trial' },\n { path: '/onboarding/direct-promotion' }\n];\n\nconst history = createBrowserHistory();\n\nif (!window.StravaSentryDsn) {\n window.StravaSentryDsn = {};\n}\nif (!window.StravaSentryDsn.deferred) {\n window.StravaSentryDsn.deferred = {};\n const promise = new Promise(\n function _(resolve, reject) {\n this.doResolve = resolve;\n this.doReject = reject;\n }.bind(window.StravaSentryDsn.deferred)\n );\n window.StravaSentryDsn.deferred.then = promise.then.bind(promise);\n}\n\nconst {\n enabled,\n environment,\n release,\n userId,\n dsn,\n debug,\n pageProperties,\n mobileOS,\n isMobile\n} = window.StravaSentry || {};\n\ndevLog(\n `Logged-out page experiment ::: ${JSON.stringify(\n pageProperties?.experiment_info || {}\n )}`\n);\n\nwindow.StravaSentryDsn.deferred.doResolve(dsn);\n\nwindow.StravaSentryDsn.deferred.then((_dsn) => {\n // configure sentry_frontend.yml to enable sentry on local\n if (enabled) {\n Sentry.init({\n dsn: _dsn,\n maxBreadcrumbs: 50,\n replaysSessionSampleRate: 0,\n // If the entire session is not sampled, use the below sample rate to sample\n // sessions when an error occurs.\n replaysOnErrorSampleRate: 0.1,\n integrations: [\n new Sentry.BrowserTracing({\n tracingOrigins: [\n 'https://www.staging.strava.com',\n 'https://www.strava.com',\n 'localhost',\n /^\\//\n ],\n beforeNavigate: (context) => {\n return {\n ...context,\n name: transactionName()\n };\n }\n }),\n new Sentry.Replay()\n ],\n denyUrls: [\n // Chrome extensions\n /extensions\\//i,\n /^chrome:\\/\\//i\n ],\n tracesSampleRate: 0.1,\n debug,\n attachStacktrace: true,\n release,\n initialScope: {\n user: { id: userId }\n },\n environment,\n beforeSend: (event, hint) => {\n if (\n isMfeChunkLoadError(hint) ||\n isXhrFalsePositive(hint) || // safari abort - status 0\n hasExtensionReferenceInHintErrorStack(hint) ||\n hasExtensionReferenceInBreadCrumbs(event) ||\n hasExtensionReferenceInEventErrorStack(event) ||\n hint?.originalException === 'Timeout' // google-recaptcha flakiness\n ) {\n return null;\n }\n groupErrors(event);\n return event;\n },\n routingInstrumentation: Sentry.reactRouterV5Instrumentation(\n history,\n REACT_ROUTER_ROUTES,\n matchPath\n ),\n /**\n * There is a bug in Safari, that causes `AbortError` when fetch is\n * aborted, and you are in the middle of reading the response. In Chrome\n * and other browsers, it is handled gracefully, where in Safari, it\n * produces additional error, that is jumping outside of the original\n * Promise chain and bubbles up to the `unhandledRejection` handler, that\n * we then captures as error.\n *\n * Ref: https://bugs.webkit.org/show_bug.cgi?id=215771\n */\n ignoreErrors: ['AbortError: Fetch is aborted']\n });\n\n Sentry.setTag('strava_device.mobile_os', mobileOS);\n Sentry.setTag('strava_device.is_mobile', isMobile);\n Sentry.setTag('strava_device.display_type', displayType());\n\n if (pageProperties) {\n const experiment = pageProperties?.experiment_info || {};\n const {\n experiment_cohort: cohort,\n experiment_name: name,\n experiment_forced: forced\n } = experiment;\n if (cohort && name) {\n Sentry.setTag('experiment.name', name);\n Sentry.setTag('experiment.cohort', cohort);\n Sentry.setTag('experiment.forced', forced);\n }\n }\n }\n});\n\n/** @type {import(\"@sentry/browser\").withScope} */\nexport const withScope = (...args) => Sentry.withScope(...args);\n\n/** @type {import(\"@sentry/browser\").setTag} */\nexport const setTag = (...args) =>\n isDev()\n ? devLog(`Sentry.setTag ::: ${JSON.stringify(args)}`)\n : Sentry.setTag(...args);\n\n/** @type {import(\"@sentry/browser\").setTags} */\nexport const setTags = (...args) =>\n isDev()\n ? devLog(`Sentry.setTags ::: ${JSON.stringify(args)}`)\n : Sentry.setTags(...args);\n\n/** @type {import(\"@sentry/browser\").setContext} */\nexport const setContext = (...args) =>\n isDev()\n ? devLog(`Sentry.setContext ::: ${JSON.stringify(args)}`)\n : Sentry.setContext(...args);\n\n/** @type {import(\"@sentry/browser\").captureException} */\nexport const logError = (error, captureContext) => {\n if (isDev()) {\n // eslint-disable-next-line no-console\n console.error('Sentry.logError :::', error, captureContext);\n } else {\n Sentry.captureException(error, captureContext);\n }\n};\n\n/** @type {import(\"@sentry/browser\").captureMessage} */\nexport const logMessage = (message, captureContext) => {\n if (isDev()) {\n // eslint-disable-next-line no-console\n console.error('Sentry.logMessage :::', message, captureContext);\n } else {\n Sentry.captureMessage(message, captureContext);\n }\n};\n\nexport default { logError, logMessage, withScope, setTag, setTags, setContext };\n"],"names":["cov_2hk5vq8hbz","isDev","process","devLog","string","window","StravaDevTools","enabled","console","log","cov_1kwfgcjvy1","CHROME_BROWSER_EXTENSION","SAFARI_BROWSER_EXTENSION","ANONYMOUS","DOWNLOADED_FILES","ELEVATE_APP_CONSOLE_LOGS","includes","substringList","find","substring","hasExtensionReferenceInHintErrorStack","hint","originalException","stack","hasExtensionReferenceInBreadCrumbs","event","breadcrumbs","entry","data","url","message","hasExtensionReferenceInEventErrorStack","exception","values","stacktrace","frames","frame","f","filename","abs_path","isXhrFalsePositive","request","__sentry_xhr__","status_code","isMfeChunkLoadError","name","groupErrors","regex","RegExp","URL","origin","pathname","search","test","activityId","lastIndexOf","Sentry","transactionName","location","replace","cov_1vzt73kbt3","REACT_ROUTER_ROUTES","path","history","createBrowserHistory","StravaSentryDsn","deferred","promise","Promise","resolve","reject","this","doResolve","doReject","bind","then","StravaSentry","environment","release","userId","dsn","debug","pageProperties","mobileOS","isMobile","JSON","stringify","experiment_info","_dsn","maxBreadcrumbs","replaysSessionSampleRate","replaysOnErrorSampleRate","integrations","tracingOrigins","beforeNavigate","context","denyUrls","tracesSampleRate","attachStacktrace","initialScope","user","id","beforeSend","routingInstrumentation","matchPath","ignoreErrors","matchMaxMedia","experiment","cohort","experiment_cohort","experiment_name","forced","experiment_forced","withScope","arguments","setTag","args","_key","setTags","_key2","setContext","_key3","logError","error","captureContext","logMessage"],"sourceRoot":""}