├── .gitignore ├── MANIFEST.in ├── README.md ├── license.txt ├── package.json ├── requirements.txt ├── sentry ├── __init__.py ├── boot.py ├── config │ ├── __init__.py │ ├── desktop.py │ └── docs.py ├── hooks.py ├── modules.txt ├── patches.txt ├── public │ ├── build.json │ └── js │ │ ├── sentry-web.js │ │ └── sentry.js ├── sentry │ ├── __init__.py │ └── doctype │ │ ├── __init__.py │ │ └── sentry_settings │ │ ├── __init__.py │ │ ├── sentry_settings.js │ │ ├── sentry_settings.json │ │ ├── sentry_settings.py │ │ ├── test_sentry_settings.js │ │ └── test_sentry_settings.py ├── templates │ ├── __init__.py │ └── pages │ │ └── __init__.py └── utils.py ├── setup.py └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | *.pyc 3 | *.egg-info 4 | *.swp 5 | tags 6 | node_modules 7 | sentry/docs/current -------------------------------------------------------------------------------- /MANIFEST.in: -------------------------------------------------------------------------------- 1 | include MANIFEST.in 2 | include requirements.txt 3 | include *.json 4 | include *.md 5 | include *.py 6 | include *.txt 7 | recursive-include sentry *.css 8 | recursive-include sentry *.csv 9 | recursive-include sentry *.html 10 | recursive-include sentry *.ico 11 | recursive-include sentry *.js 12 | recursive-include sentry *.json 13 | recursive-include sentry *.md 14 | recursive-include sentry *.png 15 | recursive-include sentry *.py 16 | recursive-include sentry *.svg 17 | recursive-include sentry *.txt 18 | recursive-exclude sentry *.pyc -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## Sentry 2 | 3 | Logs errors to Sentry 4 | 5 | #### License 6 | 7 | MIT -------------------------------------------------------------------------------- /license.txt: -------------------------------------------------------------------------------- 1 | License: MIT -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "sentry", 3 | "repository": { 4 | "type": "git", 5 | "url": "git+https://github.com/DigiThinkIT/frappe-sentry.git" 6 | }, 7 | "author": "Bloomstack Inc.", 8 | "license": "MIT", 9 | "bugs": { 10 | "url": "https://github.com/DigiThinkIT/frappe-sentry/issues" 11 | }, 12 | "dependencies": { 13 | "@sentry/browser": "^6.5.1" 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | frappe 2 | sentry-sdk -------------------------------------------------------------------------------- /sentry/__init__.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from __future__ import unicode_literals 3 | 4 | __version__ = '0.0.1' 5 | 6 | -------------------------------------------------------------------------------- /sentry/boot.py: -------------------------------------------------------------------------------- 1 | import frappe 2 | 3 | 4 | def boot_session(bootinfo): 5 | bootinfo.sentry_dsn = frappe.db.get_single_value("Sentry Settings", "sentry_dsn") 6 | -------------------------------------------------------------------------------- /sentry/config/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Bloomstack/frappe-sentry/feca5d54ede46ce59776414be9f1206ad79da18b/sentry/config/__init__.py -------------------------------------------------------------------------------- /sentry/config/desktop.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from __future__ import unicode_literals 3 | from frappe import _ 4 | 5 | def get_data(): 6 | return [ 7 | { 8 | "module_name": "Sentry", 9 | "color": "grey", 10 | "icon": "octicon octicon-file-directory", 11 | "type": "module", 12 | "label": _("Sentry") 13 | } 14 | ] 15 | -------------------------------------------------------------------------------- /sentry/config/docs.py: -------------------------------------------------------------------------------- 1 | """ 2 | Configuration for docs 3 | """ 4 | 5 | # source_link = "https://github.com/[org_name]/sentry" 6 | # docs_base_url = "https://[org_name].github.io/sentry" 7 | # headline = "App that does everything" 8 | # sub_heading = "Yes, you got that right the first time, everything" 9 | 10 | def get_context(context): 11 | context.brand_html = "Sentry" 12 | -------------------------------------------------------------------------------- /sentry/hooks.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from __future__ import unicode_literals 3 | from . import __version__ as app_version 4 | 5 | app_name = "sentry" 6 | app_title = "Sentry" 7 | app_publisher = "DigiThinkIT, Inc" 8 | app_description = "Logs errors to Sentry" 9 | app_icon = "octicon octicon-file-directory" 10 | app_color = "grey" 11 | app_email = "valmik@digithinkit.com" 12 | app_license = "MIT" 13 | 14 | # Includes in 15 | # ------------------ 16 | 17 | # include js, css files in header of desk.html 18 | # app_include_css = "/assets/sentry/css/sentry.css" 19 | app_include_js = "/assets/js/sentry.min.js" 20 | 21 | # include js, css files in header of web template 22 | # web_include_css = "/assets/sentry/css/sentry.css" 23 | web_include_js = "/assets/js/sentry-web.min.js" 24 | 25 | exception_handlers = ["sentry.utils.handle"] 26 | # custom handler to report exceptions without necessarily breaking system flow 27 | error_capture_log = ["sentry.utils.handle"] 28 | 29 | boot_session = "sentry.boot.boot_session" 30 | 31 | # include js in page 32 | # page_js = {"page" : "public/js/file.js"} 33 | 34 | # include js in doctype views 35 | # doctype_js = {"doctype" : "public/js/doctype.js"} 36 | # doctype_list_js = {"doctype" : "public/js/doctype_list.js"} 37 | # doctype_tree_js = {"doctype" : "public/js/doctype_tree.js"} 38 | # doctype_calendar_js = {"doctype" : "public/js/doctype_calendar.js"} 39 | 40 | # Home Pages 41 | # ---------- 42 | 43 | # application home page (will override Website Settings) 44 | # home_page = "login" 45 | 46 | # website user home page (by Role) 47 | # role_home_page = { 48 | # "Role": "home_page" 49 | # } 50 | 51 | # Website user home page (by function) 52 | # get_website_user_home_page = "sentry.utils.get_home_page" 53 | 54 | # Generators 55 | # ---------- 56 | 57 | # automatically create page for each record of this doctype 58 | # website_generators = ["Web Page"] 59 | 60 | # Installation 61 | # ------------ 62 | 63 | # before_install = "sentry.install.before_install" 64 | # after_install = "sentry.install.after_install" 65 | 66 | # Desk Notifications 67 | # ------------------ 68 | # See frappe.core.notifications.get_notification_config 69 | 70 | # notification_config = "sentry.notifications.get_notification_config" 71 | 72 | # Permissions 73 | # ----------- 74 | # Permissions evaluated in scripted ways 75 | 76 | # permission_query_conditions = { 77 | # "Event": "frappe.desk.doctype.event.event.get_permission_query_conditions", 78 | # } 79 | # 80 | # has_permission = { 81 | # "Event": "frappe.desk.doctype.event.event.has_permission", 82 | # } 83 | 84 | # Document Events 85 | # --------------- 86 | # Hook on document methods and events 87 | 88 | # doc_events = { 89 | # "*": { 90 | # "on_update": "method", 91 | # "on_cancel": "method", 92 | # "on_trash": "method" 93 | # } 94 | # } 95 | 96 | # Scheduled Tasks 97 | # --------------- 98 | 99 | # scheduler_events = { 100 | # "all": [ 101 | # "sentry.tasks.all" 102 | # ], 103 | # "daily": [ 104 | # "sentry.tasks.daily" 105 | # ], 106 | # "hourly": [ 107 | # "sentry.tasks.hourly" 108 | # ], 109 | # "weekly": [ 110 | # "sentry.tasks.weekly" 111 | # ] 112 | # "monthly": [ 113 | # "sentry.tasks.monthly" 114 | # ] 115 | # } 116 | 117 | # Testing 118 | # ------- 119 | 120 | # before_tests = "sentry.install.before_tests" 121 | 122 | # Overriding Whitelisted Methods 123 | # ------------------------------ 124 | # 125 | # override_whitelisted_methods = { 126 | # "frappe.desk.doctype.event.event.get_events": "sentry.event.get_events" 127 | # } 128 | -------------------------------------------------------------------------------- /sentry/modules.txt: -------------------------------------------------------------------------------- 1 | Sentry -------------------------------------------------------------------------------- /sentry/patches.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Bloomstack/frappe-sentry/feca5d54ede46ce59776414be9f1206ad79da18b/sentry/patches.txt -------------------------------------------------------------------------------- /sentry/public/build.json: -------------------------------------------------------------------------------- 1 | { 2 | "js/sentry.min.js": [ 3 | "public/js/sentry.js" 4 | ], 5 | "js/sentry-web.min.js": [ 6 | "public/js/sentry-web.js" 7 | ] 8 | } -------------------------------------------------------------------------------- /sentry/public/js/sentry-web.js: -------------------------------------------------------------------------------- 1 | import { init, configureScope } from '@sentry/browser'; 2 | 3 | frappe.ready(function () { 4 | if (!window.sentry_dsn) { 5 | frappe.call({ 6 | method: "sentry.utils.get_sentry_dsn", 7 | callback: function (r) { 8 | if (r.message) { 9 | window.localStorage.sentry_dsn = r.message; 10 | } 11 | } 12 | }); 13 | } 14 | 15 | if (window.localStorage.sentry_dsn) { 16 | init({ dsn: window.localStorage.sentry_dsn }); 17 | 18 | if (frappe.sid != "Guest") { 19 | configureScope(function (scope) { 20 | scope.setUser({ email: frappe.user_id }); 21 | }); 22 | } 23 | } 24 | }) -------------------------------------------------------------------------------- /sentry/public/js/sentry.js: -------------------------------------------------------------------------------- 1 | import { init, configureScope } from '@sentry/browser'; 2 | 3 | if (frappe.boot.sentry_dsn && !frappe.boot.developer_mode) { 4 | init({ dsn: frappe.boot.sentry_dsn }); 5 | configureScope(function (scope) { 6 | scope.setUser({ email: frappe.boot.user.email }); 7 | }); 8 | } -------------------------------------------------------------------------------- /sentry/sentry/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Bloomstack/frappe-sentry/feca5d54ede46ce59776414be9f1206ad79da18b/sentry/sentry/__init__.py -------------------------------------------------------------------------------- /sentry/sentry/doctype/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Bloomstack/frappe-sentry/feca5d54ede46ce59776414be9f1206ad79da18b/sentry/sentry/doctype/__init__.py -------------------------------------------------------------------------------- /sentry/sentry/doctype/sentry_settings/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Bloomstack/frappe-sentry/feca5d54ede46ce59776414be9f1206ad79da18b/sentry/sentry/doctype/sentry_settings/__init__.py -------------------------------------------------------------------------------- /sentry/sentry/doctype/sentry_settings/sentry_settings.js: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2018, DigiThinkIT, Inc and contributors 2 | // For license information, please see license.txt 3 | 4 | frappe.ui.form.on('Sentry Settings', { 5 | refresh: function(frm) { 6 | } 7 | }); 8 | -------------------------------------------------------------------------------- /sentry/sentry/doctype/sentry_settings/sentry_settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "allow_copy": 0, 3 | "allow_guest_to_view": 0, 4 | "allow_import": 0, 5 | "allow_rename": 0, 6 | "beta": 0, 7 | "creation": "2018-08-07 05:32:18.000213", 8 | "custom": 0, 9 | "docstatus": 0, 10 | "doctype": "DocType", 11 | "document_type": "", 12 | "editable_grid": 1, 13 | "engine": "InnoDB", 14 | "fields": [ 15 | { 16 | "allow_bulk_edit": 0, 17 | "allow_on_submit": 0, 18 | "bold": 0, 19 | "collapsible": 0, 20 | "columns": 0, 21 | "fieldname": "sentry_dsn", 22 | "fieldtype": "Data", 23 | "hidden": 0, 24 | "ignore_user_permissions": 0, 25 | "ignore_xss_filter": 0, 26 | "in_filter": 0, 27 | "in_global_search": 0, 28 | "in_list_view": 0, 29 | "in_standard_filter": 0, 30 | "label": "Sentry DSN", 31 | "length": 0, 32 | "no_copy": 0, 33 | "permlevel": 0, 34 | "precision": "", 35 | "print_hide": 0, 36 | "print_hide_if_no_value": 0, 37 | "read_only": 0, 38 | "remember_last_selected_value": 0, 39 | "report_hide": 0, 40 | "reqd": 0, 41 | "search_index": 0, 42 | "set_only_once": 0, 43 | "unique": 0 44 | } 45 | ], 46 | "has_web_view": 0, 47 | "hide_heading": 0, 48 | "hide_toolbar": 0, 49 | "idx": 0, 50 | "image_view": 0, 51 | "in_create": 0, 52 | "is_submittable": 0, 53 | "issingle": 1, 54 | "istable": 0, 55 | "max_attachments": 0, 56 | "modified": "2018-08-07 05:33:18.000213", 57 | "modified_by": "Administrator", 58 | "module": "Sentry", 59 | "name": "Sentry Settings", 60 | "name_case": "", 61 | "owner": "Administrator", 62 | "permissions": [ 63 | { 64 | "amend": 0, 65 | "apply_user_permissions": 0, 66 | "cancel": 0, 67 | "create": 1, 68 | "delete": 1, 69 | "email": 1, 70 | "export": 1, 71 | "if_owner": 0, 72 | "import": 0, 73 | "permlevel": 0, 74 | "print": 1, 75 | "read": 1, 76 | "report": 1, 77 | "role": "System Manager", 78 | "set_user_permissions": 0, 79 | "share": 1, 80 | "submit": 0, 81 | "write": 1 82 | } 83 | ], 84 | "quick_entry": 1, 85 | "read_only": 0, 86 | "read_only_onload": 0, 87 | "show_name_in_global_search": 0, 88 | "sort_field": "modified", 89 | "sort_order": "DESC", 90 | "track_changes": 1, 91 | "track_seen": 0 92 | } -------------------------------------------------------------------------------- /sentry/sentry/doctype/sentry_settings/sentry_settings.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Copyright (c) 2018, DigiThinkIT, Inc and contributors 3 | # For license information, please see license.txt 4 | 5 | from __future__ import unicode_literals 6 | import frappe 7 | from frappe.model.document import Document 8 | 9 | class SentrySettings(Document): 10 | pass 11 | -------------------------------------------------------------------------------- /sentry/sentry/doctype/sentry_settings/test_sentry_settings.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable */ 2 | // rename this file from _test_[name] to test_[name] to activate 3 | // and remove above this line 4 | 5 | QUnit.test("test: Sentry Settings", function (assert) { 6 | let done = assert.async(); 7 | 8 | // number of asserts 9 | assert.expect(1); 10 | 11 | frappe.run_serially([ 12 | // insert a new Sentry Settings 13 | () => frappe.tests.make('Sentry Settings', [ 14 | // values to be set 15 | {key: 'value'} 16 | ]), 17 | () => { 18 | assert.equal(cur_frm.doc.key, 'value'); 19 | }, 20 | () => done() 21 | ]); 22 | 23 | }); 24 | -------------------------------------------------------------------------------- /sentry/sentry/doctype/sentry_settings/test_sentry_settings.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # Copyright (c) 2018, DigiThinkIT, Inc and Contributors 3 | # See license.txt 4 | from __future__ import unicode_literals 5 | 6 | import frappe 7 | import unittest 8 | 9 | class TestSentrySettings(unittest.TestCase): 10 | pass 11 | -------------------------------------------------------------------------------- /sentry/templates/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Bloomstack/frappe-sentry/feca5d54ede46ce59776414be9f1206ad79da18b/sentry/templates/__init__.py -------------------------------------------------------------------------------- /sentry/templates/pages/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Bloomstack/frappe-sentry/feca5d54ede46ce59776414be9f1206ad79da18b/sentry/templates/pages/__init__.py -------------------------------------------------------------------------------- /sentry/utils.py: -------------------------------------------------------------------------------- 1 | import gzip 2 | import io 3 | import json 4 | from datetime import datetime, timedelta 5 | 6 | import requests 7 | import sentry_sdk 8 | from sentry_sdk import Transport, capture_exception, configure_scope 9 | from sentry_sdk.integrations.redis import RedisIntegration 10 | from sentry_sdk.integrations.rq import RqIntegration 11 | from sentry_sdk.utils import capture_internal_exceptions, logger 12 | 13 | import frappe 14 | 15 | 16 | class HttpTransport(Transport): 17 | """Custom HTTP transport for Frappe-Sentry integration.""" 18 | 19 | def __init__(self, options): 20 | from sentry_sdk.consts import VERSION 21 | 22 | Transport.__init__(self, options) 23 | assert self.parsed_dsn is not None 24 | self._auth = self.parsed_dsn.to_auth("sentry.python/%s" % VERSION) 25 | self._disabled_until = None 26 | self.options = options 27 | 28 | from sentry_sdk import Hub 29 | 30 | self.hub_cls = Hub 31 | 32 | def _send_event(self, event): 33 | if self._disabled_until is not None: 34 | if datetime.utcnow() < self._disabled_until: 35 | return 36 | self._disabled_until = None 37 | 38 | body = io.BytesIO() 39 | with gzip.GzipFile(fileobj=body, mode="w") as f: 40 | f.write(json.dumps(event, allow_nan=False).encode("utf-8")) 41 | 42 | assert self.parsed_dsn is not None 43 | logger.debug( 44 | "Sending event, type:%s level:%s event_id:%s project:%s host:%s" 45 | % ( 46 | event.get("type") or "null", 47 | event.get("level") or "null", 48 | event.get("event_id") or "null", 49 | self.parsed_dsn.project_id, 50 | self.parsed_dsn.host, 51 | ) 52 | ) 53 | response = requests.post( 54 | str(self._auth.store_api_url), 55 | data=body.getvalue(), 56 | headers={ 57 | "User-Agent": str(self._auth.client), 58 | "X-Sentry-Auth": str(self._auth.to_header()), 59 | "Content-Type": "application/json", 60 | "Content-Encoding": "gzip", 61 | }, 62 | ) 63 | 64 | try: 65 | if response.status_code == 429: 66 | self._disabled_until = datetime.utcnow() + timedelta(seconds=60) 67 | return 68 | elif response.status_code >= 300 or response.status_code < 200: 69 | logger.error( 70 | "Unexpected status code: %s (body: %s)", 71 | response.status_code, 72 | response.text, 73 | ) 74 | finally: 75 | response.close() 76 | 77 | self._disabled_until = None 78 | 79 | def capture_event(self, event): 80 | hub = self.hub_cls.current 81 | 82 | with hub: 83 | with capture_internal_exceptions(): 84 | self._send_event(event) 85 | 86 | 87 | def handle(): 88 | sentry_dsn = get_sentry_dsn() 89 | if not sentry_dsn: 90 | return 91 | 92 | sentry_sdk.init( 93 | dsn=sentry_dsn, 94 | transport=HttpTransport, 95 | integrations=[RedisIntegration(), RqIntegration()] 96 | ) 97 | 98 | enabled = True 99 | if frappe.conf.get("developer_mode"): 100 | # You can set this in site_config.json 101 | # ... enable_sentry_developer_mode: 1 ... 102 | enabled = frappe.conf.get("enable_sentry_developer_mode", False) 103 | 104 | if enabled: 105 | with configure_scope() as scope: 106 | scope.user = {"email": frappe.session.user} 107 | scope.set_context("site", { 108 | 'site': frappe.local.site 109 | }) 110 | 111 | capture_exception() 112 | 113 | 114 | @frappe.whitelist(allow_guest=True) 115 | def get_sentry_dsn(): 116 | sentry_dsn = frappe.conf.get("sentry_dsn") 117 | if not sentry_dsn: 118 | sentry_dsn = frappe.db.get_single_value("Sentry Settings", "sentry_dsn") 119 | return sentry_dsn 120 | -------------------------------------------------------------------------------- /setup.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | from setuptools import setup, find_packages 3 | import re, ast 4 | 5 | with open('requirements.txt') as f: 6 | install_requires = f.read().strip().split('\n') 7 | 8 | # get version from __version__ variable in sentry/__init__.py 9 | _version_re = re.compile(r'__version__\s+=\s+(.*)') 10 | 11 | with open('sentry/__init__.py', 'rb') as f: 12 | version = str(ast.literal_eval(_version_re.search( 13 | f.read().decode('utf-8')).group(1))) 14 | 15 | setup( 16 | name='sentry', 17 | version=version, 18 | description='Logs errors to Sentry', 19 | author='DigiThinkIT, Inc', 20 | author_email='valmik@digithinkit.com', 21 | packages=find_packages(), 22 | zip_safe=False, 23 | include_package_data=True, 24 | install_requires=install_requires 25 | ) 26 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@sentry/browser@^6.5.1": 6 | version "6.5.1" 7 | resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-6.5.1.tgz#9a6ed5607b3b0f4e83f38720e3e202906f8c5bdb" 8 | integrity sha512-iVLCdEFwsoWAzE/hNknexPQjjDpMQV7mmaq9Z1P63bD6MfhwVTx4hG4pHn8HEvC38VvCVf1wv0v/LxtoODAYXg== 9 | dependencies: 10 | "@sentry/core" "6.5.1" 11 | "@sentry/types" "6.5.1" 12 | "@sentry/utils" "6.5.1" 13 | tslib "^1.9.3" 14 | 15 | "@sentry/core@6.5.1": 16 | version "6.5.1" 17 | resolved "https://registry.yarnpkg.com/@sentry/core/-/core-6.5.1.tgz#c8b6c3ed86ed07b193c95d599c1b9a4a161e500e" 18 | integrity sha512-Mh3sl/iUOT1myHmM6RlDy2ARzkUClx/g4DAt1rJ/IpQBOlDYQraplXSIW80i/hzRgQDfwhwgf4wUa5DicKBjKw== 19 | dependencies: 20 | "@sentry/hub" "6.5.1" 21 | "@sentry/minimal" "6.5.1" 22 | "@sentry/types" "6.5.1" 23 | "@sentry/utils" "6.5.1" 24 | tslib "^1.9.3" 25 | 26 | "@sentry/hub@6.5.1": 27 | version "6.5.1" 28 | resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-6.5.1.tgz#135ef09d07d32e87a53f664c0ae8fcc4f5963519" 29 | integrity sha512-lBRMBVMYP8B4PfRiM70murbtJAXiIAao/asDEMIRNGMP6pI2ArqXfJCBYDkStukhikYD0Kqb4trXq+JYF07Hbg== 30 | dependencies: 31 | "@sentry/types" "6.5.1" 32 | "@sentry/utils" "6.5.1" 33 | tslib "^1.9.3" 34 | 35 | "@sentry/minimal@6.5.1": 36 | version "6.5.1" 37 | resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-6.5.1.tgz#b8c1b382c2ea788eec3d32d203e5081b00eb6838" 38 | integrity sha512-q9Do/oreu1RP695CXCLowVDuQyk7ilE6FGdz2QLpTXAfx8247qOwk6+zy9Kea/Djk93+BoSDVQUSneNiVwl0nQ== 39 | dependencies: 40 | "@sentry/hub" "6.5.1" 41 | "@sentry/types" "6.5.1" 42 | tslib "^1.9.3" 43 | 44 | "@sentry/types@6.5.1": 45 | version "6.5.1" 46 | resolved "https://registry.yarnpkg.com/@sentry/types/-/types-6.5.1.tgz#0a34ecfd1ae9275a416a105640eb4bed45a46a1d" 47 | integrity sha512-b/7a6CMoytaeFPx4IBjfxPw3nPvsQh7ui1C8Vw0LxNNDgBwVhPLzUOWeLWbo5YZCVbGEMIWwtCUQYWxneceZSA== 48 | 49 | "@sentry/utils@6.5.1": 50 | version "6.5.1" 51 | resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-6.5.1.tgz#046baf7d1a6564d6d555437ad3674dba9bc0806a" 52 | integrity sha512-Wv86JYGQH+ZJ5XGFQX7h6ijl32667ikenoL9EyXMn8UoOYX/MLwZoQZin1P60wmKkYR9ifTNVmpaI9OoTaH+UQ== 53 | dependencies: 54 | "@sentry/types" "6.5.1" 55 | tslib "^1.9.3" 56 | 57 | tslib@^1.9.3: 58 | version "1.13.0" 59 | resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.13.0.tgz#c881e13cc7015894ed914862d276436fa9a47043" 60 | integrity sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q== 61 | --------------------------------------------------------------------------------