{"version":3,"sources":["webpack:///./app/javascript/shared/helpers/supportedBrowsers.js","webpack:///./app/javascript/packs/sentry.ts","webpack:///./app/javascript/shared/helpers/sentry.ts"],"names":["maskName","fullName","split","map","word","substring","repeat","Math","max","length","join","isApp","event","app_name","tags","app","errorMatches","hint","field","re","err","originalException","test","nameMatches","messageMatches","stackMatches","sentrySettings","Sentry","window","IH","sentry","react_dsn","dsn","release","denyUrls","replaysSessionSampleRate","replays_session_sample_rate","replaysOnErrorSampleRate","replays_on_error_sample_rate","integrations","maskAllText","beforeSend","mechanism","invalidState","typeSDP","connectionError","transportError","tokenExpired","tokenInvalid","message","name","category","level","navigator","onLine","data","userAgent","rejectMatches","type","exception","values","stacktrace","frames","filename","e","maybeModule","module","fingerprint","user","username","setUser","console","info","args","addBreadcrumb","captureException","error","captureMessage","showReportDialog","withScope","scope","setExtras","debug","setFingerprint","getReplay","start"],"mappings":"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","file":"js/sentry-0d270f291b1a2d59f26f.chunk.js","sourcesContent":["// NOTE: This is a generated file; please check in any diffs!\nexport default /Edge?\\/(12[2-9]|1[3-9]\\d|[2-9]\\d{2}|\\d{4,})\\.\\d+(\\.\\d+|)|Firefox\\/(12[3-9]|1[3-9]\\d|[2-9]\\d{2}|\\d{4,})\\.\\d+(\\.\\d+|)|Chrom(ium|e)\\/(109|1[1-9]\\d|[2-9]\\d{2}|\\d{4,})\\.\\d+(\\.\\d+|)|(Maci|X1{2}).+ Version\\/(17\\.([3-9]|\\d{2,})|(1[89]|[2-9]\\d|\\d{3,})\\.\\d+)([,.]\\d+|)( \\(\\w+\\)|)( Mobile\\/\\w+|) Safari\\/|(CPU[ +]OS|iPhone[ +]OS|CPU[ +]iPhone|CPU IPhone OS|CPU iPad OS)[ +]+(16[._]([6-9]|\\d{2,})|(1[7-9]|[2-9]\\d|\\d{3,})[._]\\d+)([._]\\d+|)|Mobile Safari.+OPR\\/([89]\\d|\\d{3,})\\.\\d+\\.\\d+|Android.+Chrom(ium|e)\\/(12[3-9]|1[3-9]\\d|[2-9]\\d{2}|\\d{4,})\\.\\d+(\\.\\d+|)|SamsungBrowser\\/(2[3-9]|[3-9]\\d|\\d{3,})\\.\\d+/;\n","import Sentry from 'shared/helpers/sentry';\n\nexport default Sentry;\n","// eslint-disable-next-line @typescript-eslint/no-restricted-imports\nimport * as SentryBrowser from '@sentry/browser';\n\nimport type { ErrorEvent, EventHint } from '@sentry/types';\n\nimport supportedBrowsers from 'shared/helpers/supportedBrowsers';\n\nexport function maskName(fullName: string) {\n return fullName\n ?.split(' ')\n ?.map(\n (word) => word.substring(0, 2) + '*'.repeat(Math.max(0, word.length - 2))\n )\n ?.join(' ');\n}\n\nfunction sentryStub() {\n /* eslint-disable no-console */\n return {\n // We explicitly want to use the console in development\n // eslint-disable-next-line no-console\n setUser: (...args) => console.info('Sentry.setUser', ...args),\n addBreadcrumb: (...args) => console.info('Sentry.addBreadcrumb', ...args),\n captureException: (...args) =>\n console.error('Sentry.captureException', ...args),\n captureMessage: (...args) =>\n console.error('Sentry.captureMessage', ...args),\n showReportDialog: (...args) =>\n console.error('Sentry.showReportDialog', ...args),\n withScope(scope) {\n scope({\n setExtras: (...args) =>\n console.debug('Sentry.withScope.setExtras', ...args),\n setFingerprint: (...args) =>\n console.debug('Sentry.withScope.Fingerprint', ...args),\n });\n },\n getReplay: () => ({\n start: () => console.info('Sentry.getReplay().start'),\n }),\n } as unknown as typeof SentryBrowser; // Intentionally leave client partially unimplemented\n /* eslint-enable no-console */\n}\n\nfunction isApp(event: ErrorEvent, app_name: string) {\n return event?.tags?.app === app_name;\n}\nfunction errorMatches(\n event: ErrorEvent,\n hint: EventHint,\n field: string,\n re: RegExp\n) {\n if (!hint) return false;\n const err = hint.originalException || event;\n return err && err[field] && re.test(err[field]);\n}\nfunction nameMatches(event: ErrorEvent, hint: EventHint, re: RegExp) {\n return errorMatches(event, hint, 'name', re);\n}\nfunction messageMatches(event: ErrorEvent, hint: EventHint, re: RegExp) {\n return errorMatches(event, hint, 'message', re);\n}\nfunction stackMatches(event: ErrorEvent, hint: EventHint, re: RegExp) {\n return errorMatches(event, hint, 'stack', re);\n}\nfunction rejectMatches(hint: EventHint, re: RegExp) {\n return re.test(hint?.originalException as string);\n}\n\nfunction initializeSentry(sentrySettings: Window['IH']['sentry']) {\n SentryBrowser.init({\n dsn: sentrySettings.react_dsn,\n release: sentrySettings.release,\n denyUrls: [/js-agent.newrelic.com/],\n replaysSessionSampleRate: sentrySettings.replays_session_sample_rate,\n replaysOnErrorSampleRate: sentrySettings.replays_on_error_sample_rate,\n integrations: [\n SentryBrowser.replayIntegration({\n maskAllText: false,\n }),\n ],\n beforeSend(event, hint) {\n const originalException = hint?.originalException as {\n name: string;\n message: string;\n } | null;\n\n // https://incrediblehealth.atlassian.net/browse/WEB-5604\n if (\n messageMatches(event, hint, /Could not load \"util\"/) &&\n event.tags.mechanism === 'onunhandledrejection'\n ) {\n return null;\n }\n // https://incrediblehealth.atlassian.net/browse/WEB-808\n if (\n isApp(event, 'registration') &&\n messageMatches(event, hint, /undefined is not a function/)\n ) {\n return null;\n }\n // https://incrediblehealth.atlassian.net/browse/WEB-2401\n if (\n isApp(event, 'registration') &&\n messageMatches(event, hint, /UET is not defined/)\n ) {\n return null;\n }\n if (\n isApp(event, 'registration') &&\n messageMatches(event, hint, /Can't find variable: UET/)\n ) {\n return null;\n }\n // https://incrediblehealth.atlassian.net/browse/WEB-3027\n if (\n isApp(event, 'phone_call') &&\n stackMatches(event, hint, /onreadystatechange/) &&\n stackMatches(event, hint, /twilio/)\n ) {\n return null;\n }\n // https://incrediblehealth.atlassian.net/browse/WEB-3960\n if (isApp(event, 'manage') || isApp(event, 'phone_call')) {\n const invalidState =\n nameMatches(event, hint, /InvalidStateError/) &&\n messageMatches(event, hint, /Attempt to register/);\n const typeSDP =\n nameMatches(event, hint, /TypeError/) &&\n messageMatches(event, hint, /getSDP/);\n const connectionError =\n nameMatches(event, hint, /ConnectionError/) &&\n messageMatches(\n event,\n hint,\n /A connection error occurred during the call/\n );\n const transportError =\n nameMatches(event, hint, /TransportError/) &&\n messageMatches(event, hint, /No transport available to send/);\n const tokenExpired =\n nameMatches(event, hint, /AccessTokenExpired/) &&\n messageMatches(event, hint, /20104/);\n const tokenInvalid =\n nameMatches(event, hint, /AccessTokenInvalid/) &&\n messageMatches(event, hint, /20101/);\n\n if (\n invalidState ||\n typeSDP ||\n connectionError ||\n transportError ||\n tokenExpired ||\n tokenInvalid\n ) {\n let message = 'Twilio error (unknown)';\n if (originalException) {\n message = `Twilio error: ${originalException.name} - ${originalException.message}`;\n }\n SentryBrowser.addBreadcrumb({\n category: 'twilio',\n message,\n level: 'error',\n });\n return null;\n }\n }\n // https://incrediblehealth.atlassian.net/browse/WEB-3026\n if (\n messageMatches(event, hint, /Illegal invocation/) &&\n stackMatches(event, hint, /beacon/)\n ) {\n return null;\n }\n // https://incrediblehealth.atlassian.net/browse/WEB-3568\n if (messageMatches(event, hint, /ResizeObserver loop limit exceeded/)) {\n return null;\n }\n // https://incrediblehealth.atlassian.net/browse/WEB-4333\n if (\n messageMatches(\n event,\n hint,\n /ResizeObserver loop completed with undelivered/\n )\n ) {\n return null;\n }\n // https://incrediblehealth.atlassian.net/browse/WEB-4527\n if (stackMatches(event, hint, /doubleclick\\.net/)) {\n return null;\n }\n // https://incrediblehealth.atlassian.net/browse/WEB-4527\n const navigator = window?.navigator;\n if (\n navigator?.onLine === false &&\n (messageMatches(event, hint, /^Failed to fetch$/) ||\n messageMatches(\n event,\n hint,\n /^NetworkError when attempting to fetch resource.$/\n ) ||\n messageMatches(event, hint, /^cancelled$/))\n ) {\n const message = originalException\n ? `Network error: ${originalException.name} - ${originalException.message}`\n : 'Network error (unknown)';\n\n SentryBrowser.addBreadcrumb({\n category: 'network',\n message,\n level: 'error',\n data: {\n originalException,\n },\n });\n return null;\n }\n // User is using an unsupported browser\n if (\n navigator?.userAgent &&\n supportedBrowsers.test(navigator.userAgent) === false\n ) {\n return null;\n }\n\n // https://forum.sentry.io/t/unhandledrejection-non-error-promise-rejection-captured-with-value/14062\n if (\n rejectMatches(hint, /Object Not Found Matching Id:/) &&\n hint?.mechanism?.type === 'onunhandledrejection'\n ) {\n return null;\n }\n\n // https://github.com/getsentry/sentry-javascript/issues/3147\n try {\n if (\n event.exception.values[0].stacktrace.frames[0].filename ===\n ``\n ) {\n return null;\n }\n } catch (e) {} // eslint-disable-line no-empty\n\n // https://incrediblehealth.atlassian.net/browse/WEB-6189\n if (\n !isApp(event, 'registration') &&\n nameMatches(event, hint, /TypeError/) &&\n messageMatches(event, hint, /Failed to fetch/)\n ) {\n // Attempting to capture module to separate tracking from other requests\n let maybeModule: string;\n try {\n maybeModule = event.exception.values[0].stacktrace.frames[0].module;\n } catch (e) {} // eslint-disable-line no-empty\n\n // This is the documented method for de-duping Sentry issues\n // https://docs.sentry.io/platforms/javascript/configuration/filtering/#group-errors-with-greater-granularity\n // eslint-disable-next-line no-param-reassign\n event.fingerprint = ['failed-to-fetch-grouping', maybeModule];\n }\n\n return event;\n },\n });\n SentryBrowser.setTag('app', sentrySettings.app);\n SentryBrowser.setUser({\n ...sentrySettings.user,\n username: maskName(sentrySettings.user.username),\n });\n\n return SentryBrowser;\n}\n\nconst Sentry = window?.IH?.sentry?.react_dsn\n ? initializeSentry(window.IH.sentry)\n : sentryStub();\n\nexport default Sentry;\n"],"sourceRoot":""}